tests_config.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. (function (root, factory) {
  2. 'use strict';
  3. if (typeof module === 'object' && module.exports) {
  4. // Node. Does not work with strict CommonJS, but only CommonJS-like
  5. // environments that support module.exports, like Node.
  6. factory(require('./x2js'), require('qunit-cli'));
  7. } else {
  8. // Browser globals (root is window)
  9. factory(root.X2JS, root.QUnit);
  10. }
  11. })(this, function (X2JS, QUnit) {
  12. 'use strict';
  13. // Test cases are full of magic numbers and that's fine.
  14. /* eslint-disable no-magic-numbers */
  15. QUnit.module('Configuration options');
  16. QUnit.test('Default attribute prefix', function (assert) {
  17. var xml = '<document><element attribute="value" /></document>';
  18. var x = new X2JS();
  19. var js = x.xml2js(xml);
  20. assert.ok(js.document);
  21. assert.ok(js.document.element);
  22. assert.ok(js.document.element._attribute);
  23. assert.strictEqual(js.document.element._attribute, 'value');
  24. });
  25. QUnit.test('Empty attribute prefix', function (assert) {
  26. var xml = '<document><element attribute="value" /></document>';
  27. var x = new X2JS({
  28. 'attributePrefix': ''
  29. });
  30. var js = x.xml2js(xml);
  31. assert.ok(js.document);
  32. assert.ok(js.document.element);
  33. assert.ok(js.document.element.attribute);
  34. assert.strictEqual(js.document.element.attribute, 'value');
  35. });
  36. QUnit.test('Custom nonempty attribute prefix', function (assert) {
  37. var xml = '<document><element attribute="value" /></document>';
  38. var x = new X2JS({
  39. 'attributePrefix': '$$'
  40. });
  41. var js = x.xml2js(xml);
  42. assert.ok(js.document);
  43. assert.ok(js.document.element);
  44. assert.ok(js.document.element.$$attribute);
  45. assert.strictEqual(js.document.element.$$attribute, 'value');
  46. });
  47. QUnit.test('Attribute converters run but only when appropriate', function (assert) {
  48. var xml = '<Root><element test1="FAIL" test2="success 2.1">first</element><element test1="FAIL 1.2" test2="success 2.2">second</element></Root>';
  49. var x = new X2JS({
  50. 'attributeConverters': [
  51. {
  52. 'test': function (name, value) {
  53. return name === 'test1';
  54. },
  55. 'convert': function (name, value) {
  56. return 'success 1.*';
  57. }
  58. }
  59. ]
  60. });
  61. var js = x.xml2js(xml);
  62. assert.ok(js.Root);
  63. assert.ok(js.Root.element);
  64. assert.ok(js.Root.element.length);
  65. assert.ok(js.Root.element[0]);
  66. assert.ok(js.Root.element[0]._test1);
  67. assert.ok(js.Root.element[0]._test2);
  68. assert.strictEqual(js.Root.element[0]._test1, 'success 1.*');
  69. assert.strictEqual(js.Root.element[0]._test2, 'success 2.1');
  70. assert.strictEqual(js.Root.element[1]._test1, 'success 1.*');
  71. assert.strictEqual(js.Root.element[1]._test2, 'success 2.2');
  72. });
  73. QUnit.test('Root element is dropped with ignoreRoot=true', function (assert) {
  74. var xml = '<document><element attribute="value" /></document>';
  75. var x = new X2JS({
  76. 'ignoreRoot': true
  77. });
  78. var js = x.xml2js(xml);
  79. assert.notOk(js.document);
  80. assert.ok(js.element);
  81. });
  82. QUnit.test('Array access-form override via path', function (assert) {
  83. var xml = '<document><element attribute="value" /></document>';
  84. var x = new X2JS({
  85. 'arrayAccessFormPaths': [
  86. 'document.element'
  87. ]
  88. });
  89. var js = x.xml2js(xml);
  90. assert.ok(js.document);
  91. assert.ok(js.document.element);
  92. assert.ok(js.document.element.length);
  93. assert.strictEqual(js.document.element.length, 1);
  94. assert.ok(js.document.element[0], 'value');
  95. });
  96. QUnit.test('Array access-form override via regex', function (assert) {
  97. var xml = '<document><element attribute="value" /></document>';
  98. var x = new X2JS({
  99. 'arrayAccessFormPaths': [
  100. /.*\.element$/
  101. ]
  102. });
  103. var js = x.xml2js(xml);
  104. assert.ok(js.document);
  105. assert.ok(js.document.element);
  106. assert.ok(js.document.element.length);
  107. assert.strictEqual(js.document.element.length, 1);
  108. assert.ok(js.document.element[0], 'value');
  109. });
  110. QUnit.test('Array access-form override via function', function (assert) {
  111. var xml = '<document><element attribute="value" /></document>';
  112. var x = new X2JS({
  113. 'arrayAccessFormPaths': [
  114. function (elementName, elementPath) {
  115. return elementName === 'element';
  116. }
  117. ]
  118. });
  119. var js = x.xml2js(xml);
  120. assert.ok(js.document);
  121. assert.ok(js.document.element);
  122. assert.ok(js.document.element.length);
  123. assert.strictEqual(js.document.element.length, 1);
  124. assert.ok(js.document.element[0], 'value');
  125. });
  126. QUnit.test('Datetime parsing via path', function (assert) {
  127. var xml = '<document><datetimeElement>2002-10-10T12:00:00+04:00</datetimeElement></document>';
  128. var x = new X2JS({
  129. 'datetimeAccessFormPaths': [
  130. 'document.datetimeElement'
  131. ]
  132. });
  133. var js = x.xml2js(xml);
  134. assert.ok(js.document);
  135. assert.ok(js.document.datetimeElement);
  136. assert.ok(js.document.datetimeElement instanceof Date);
  137. assert.strictEqual(js.document.datetimeElement.getFullYear(), 2002);
  138. });
  139. QUnit.test('Datetime parsing via regex', function (assert) {
  140. var xml = '<document><datetimeElement>2002-10-10T12:00:00+04:00</datetimeElement></document>';
  141. var x = new X2JS({
  142. 'datetimeAccessFormPaths': [
  143. /.*\.datetimeElement$/
  144. ]
  145. });
  146. var js = x.xml2js(xml);
  147. assert.ok(js.document);
  148. assert.ok(js.document.datetimeElement);
  149. assert.ok(js.document.datetimeElement instanceof Date);
  150. assert.strictEqual(js.document.datetimeElement.getFullYear(), 2002);
  151. });
  152. QUnit.test('Datetime parsing via function', function (assert) {
  153. var xml = '<document><datetimeElement>2002-10-10T12:00:00+04:00</datetimeElement></document>';
  154. var x = new X2JS({
  155. 'datetimeAccessFormPaths': [
  156. function (elementPath) {
  157. return elementPath === 'document.datetimeElement';
  158. }
  159. ]
  160. });
  161. var js = x.xml2js(xml);
  162. assert.ok(js.document);
  163. assert.ok(js.document.datetimeElement);
  164. assert.ok(js.document.datetimeElement instanceof Date);
  165. assert.strictEqual(js.document.datetimeElement.getFullYear(), 2002);
  166. });
  167. QUnit.test('Datetime parsing in different formats', function (assert) {
  168. var xml = '<document>' +
  169. '<datetimeElement>2002-10-10T12:00:00+04:00</datetimeElement>' +
  170. '<datetimeElement>2002-10-10T12:00:00Z</datetimeElement>' +
  171. '<datetimeElement>2002-10-10T12:00:00</datetimeElement>' +
  172. '<datetimeElement>2002-10-10T12:00:00Z</datetimeElement>' +
  173. '</document>';
  174. var x = new X2JS({
  175. 'datetimeAccessFormPaths': [
  176. 'document.datetimeElement'
  177. ]
  178. });
  179. var js = x.xml2js(xml);
  180. assert.ok(js.document);
  181. assert.ok(js.document.datetimeElement);
  182. assert.ok(js.document.datetimeElement.length);
  183. assert.strictEqual(js.document.datetimeElement.length, 4);
  184. for (var i = 0; i < js.document.datetimeElement.length; i++) {
  185. assert.ok(js.document.datetimeElement[i]);
  186. assert.ok(js.document.datetimeElement[i] instanceof Date);
  187. assert.strictEqual(js.document.datetimeElement[i].getFullYear(), 2002);
  188. }
  189. });
  190. QUnit.test('Options to xmldom', function (assert) {
  191. var xml = '<';
  192. var x = new X2JS({
  193. 'xmldomOptions': {
  194. 'errorHandler': {
  195. error(error) {
  196. throw error;
  197. }
  198. }
  199. }
  200. });
  201. try {
  202. x.xml2js(xml);
  203. } catch (e) {
  204. assert.equal(e, '[xmldom error]\telement parse error: [xmldom error]\tunexpected end of input\n' +
  205. '@#[line:undefined,col:undefined]\n' +
  206. '@#[line:undefined,col:undefined]');
  207. }
  208. assert.ok(true);
  209. });
  210. QUnit.test(`Element only has text node with default keepText(keepText='false')`, function (assert) {
  211. var xml = '<document><element>text</element></document>';
  212. var x = new X2JS();
  213. var js = x.xml2js(xml);
  214. assert.ok(js.document);
  215. assert.ok(js.document.element);
  216. assert.strictEqual(js.document.element, 'text');
  217. });
  218. QUnit.test(`Element only has text node with keepText='true'`, function (assert) {
  219. var xml = '<document><element>text</element></document>';
  220. var x = new X2JS({
  221. 'keepText': true
  222. });
  223. var js = x.xml2js(xml);
  224. assert.ok(js.document);
  225. assert.ok(js.document.element);
  226. assert.strictEqual(js.document.element.__text, 'text');
  227. });
  228. });