tests_js2xml.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  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. QUnit.module('Converting JavaScript objects to XML');
  14. QUnit.test('Element with attribute', function (assert) {
  15. var js = {
  16. 'document': {
  17. 'element': {
  18. '_attribute': 'value'
  19. }
  20. }
  21. };
  22. var x = new X2JS();
  23. var xml = x.js2xml(js);
  24. var expected = '<document>' +
  25. '<element attribute="value" />' +
  26. '</document>';
  27. // Implementation does not guarantee formatting so the test is somewhat fragile.
  28. assert.strictEqual(xml, expected);
  29. });
  30. QUnit.test('Element with attribute and selfClosingElements set to false', function (assert) {
  31. var js = {
  32. 'document': {
  33. 'element': {
  34. '_attribute': 'value'
  35. }
  36. }
  37. };
  38. var x = new X2JS({
  39. 'selfClosingElements': false
  40. });
  41. var xml = x.js2xml(js);
  42. var expected = '<document>' +
  43. '<element attribute="value"></element>' +
  44. '</document>';
  45. // Implementation does not guarantee formatting so the test is somewhat fragile.
  46. assert.strictEqual(xml, expected);
  47. });
  48. QUnit.test('Element with attribute and selfClosingElements set to true', function (assert) {
  49. var js = {
  50. 'document': {
  51. 'element': {
  52. '_attribute': 'value'
  53. }
  54. }
  55. };
  56. var x = new X2JS({
  57. 'selfClosingElements': true
  58. });
  59. var xml = x.js2xml(js);
  60. var expected = '<document>' +
  61. '<element attribute="value" />' +
  62. '</document>';
  63. // Implementation does not guarantee formatting so the test is somewhat fragile.
  64. assert.strictEqual(xml, expected);
  65. });
  66. QUnit.test('Element with attribute containing XML characters', function (assert) {
  67. var js = {
  68. 'document': {
  69. 'element': {
  70. '_attribute': 'va&lue<'
  71. }
  72. }
  73. };
  74. var x = new X2JS();
  75. var xml = x.js2xml(js);
  76. var expected = '<document>' +
  77. '<element attribute="va&amp;lue&lt;" />' +
  78. '</document>';
  79. // Implementation does not guarantee formatting so the test is somewhat fragile.
  80. assert.strictEqual(xml, expected);
  81. });
  82. QUnit.test('Just a string', function (assert) {
  83. var js = {
  84. 'document': {
  85. 'elementY': 'hello there'
  86. }
  87. };
  88. var x = new X2JS();
  89. var xml = x.js2xml(js);
  90. var expected = '<document>' +
  91. '<elementY>hello there</elementY>' +
  92. '</document>';
  93. // Implementation does not guarantee formatting so the test is somewhat fragile.
  94. assert.strictEqual(xml, expected);
  95. });
  96. QUnit.test('String with XML characters', function (assert) {
  97. var js = {
  98. 'document': {
  99. 'elementY': 'hello &there<'
  100. }
  101. };
  102. var x = new X2JS();
  103. var xml = x.js2xml(js);
  104. var expected = '<document>' +
  105. '<elementY>hello &amp;there&lt;</elementY>' +
  106. '</document>';
  107. // Implementation does not guarantee formatting so the test is somewhat fragile.
  108. assert.strictEqual(xml, expected);
  109. });
  110. QUnit.test('CDATA', function (assert) {
  111. var js = {
  112. 'document': {
  113. 'elementZ': { '__cdata': 'hello again' }
  114. }
  115. };
  116. var x = new X2JS();
  117. var xml = x.js2xml(js);
  118. var expected = '<document>' +
  119. '<elementZ><![CDATA[hello again]]></elementZ>' +
  120. '</document>';
  121. // Implementation does not guarantee formatting so the test is somewhat fragile.
  122. assert.strictEqual(xml, expected);
  123. });
  124. QUnit.test('CDATA with XML characters', function (assert) {
  125. var js = {
  126. 'document': {
  127. 'elementZ': { '__cdata': 'hello &again<' }
  128. }
  129. };
  130. var x = new X2JS();
  131. var xml = x.js2xml(js);
  132. var expected = '<document>' +
  133. '<elementZ><![CDATA[hello &again<]]></elementZ>' +
  134. '</document>';
  135. // Implementation does not guarantee formatting so the test is somewhat fragile.
  136. assert.strictEqual(xml, expected);
  137. });
  138. QUnit.test('Empty string as value', function (assert) {
  139. var js = {
  140. 'document': {
  141. 'elementU': ''
  142. }
  143. };
  144. var x = new X2JS();
  145. var xml = x.js2xml(js);
  146. var expected = '<document>' +
  147. '<elementU />' +
  148. '</document>';
  149. // Implementation does not guarantee formatting so the test is somewhat fragile.
  150. assert.strictEqual(xml, expected);
  151. });
  152. QUnit.test('Zero as value', function (assert) {
  153. var js = {
  154. 'document': {
  155. 'element': 0
  156. }
  157. };
  158. var x = new X2JS();
  159. var xml = x.js2xml(js);
  160. var expected = '<document>' +
  161. '<element>0</element>' +
  162. '</document>';
  163. assert.strictEqual(xml, expected);
  164. });
  165. QUnit.test('Empty string as value with selfClosingElements set to false', function (assert) {
  166. var js = {
  167. 'document': {
  168. 'elementU': ''
  169. }
  170. };
  171. var x = new X2JS({
  172. 'selfClosingElements': false
  173. });
  174. var xml = x.js2xml(js);
  175. var expected = '<document>' +
  176. '<elementU></elementU>' +
  177. '</document>';
  178. // Implementation does not guarantee formatting so the test is somewhat fragile.
  179. assert.strictEqual(xml, expected);
  180. });
  181. QUnit.test('Basic array', function (assert) {
  182. var js = {
  183. 'document': {
  184. 'elementV': [
  185. { 'x': 't' },
  186. { 'm': 'n' }
  187. ]
  188. }
  189. };
  190. var x = new X2JS();
  191. var xml = x.js2xml(js);
  192. var expected = '<document>' +
  193. '<elementV><x>t</x></elementV>' +
  194. '<elementV><m>n</m></elementV>' +
  195. '</document>';
  196. // Implementation does not guarantee formatting so the test is somewhat fragile.
  197. assert.strictEqual(xml, expected);
  198. });
  199. QUnit.test('Array of empty strings', function (assert) {
  200. var js = {
  201. 'document': {
  202. 'elementX': ['', '']
  203. }
  204. };
  205. var x = new X2JS();
  206. var xml = x.js2xml(js);
  207. var expected = '<document>' +
  208. '<elementX />' +
  209. '<elementX />' +
  210. '</document>';
  211. // Implementation does not guarantee formatting so the test is somewhat fragile.
  212. assert.strictEqual(xml, expected);
  213. });
  214. QUnit.test('Array of empty strings with selfClosingElements set to false', function (assert) {
  215. var js = {
  216. 'document': {
  217. 'elementX': ['', '']
  218. }
  219. };
  220. var x = new X2JS({
  221. 'selfClosingElements': false
  222. });
  223. var xml = x.js2xml(js);
  224. var expected = '<document>' +
  225. '<elementX></elementX>' +
  226. '<elementX></elementX>' +
  227. '</document>';
  228. // Implementation does not guarantee formatting so the test is somewhat fragile.
  229. assert.strictEqual(xml, expected);
  230. });
  231. QUnit.test('Attributes in array', function (assert) {
  232. var js = {
  233. 'document': {
  234. 'elementV': [
  235. {
  236. 'x': 't',
  237. '_a': 'a'
  238. },
  239. {
  240. 'm': 'n',
  241. '_b': 'b'
  242. }
  243. ]
  244. }
  245. };
  246. var x = new X2JS();
  247. var xml = x.js2xml(js);
  248. var expected = '<document>' +
  249. '<elementV a="a"><x>t</x></elementV>' +
  250. '<elementV b="b"><m>n</m></elementV>' +
  251. '</document>';
  252. // Implementation does not guarantee formatting so the test is somewhat fragile.
  253. assert.strictEqual(xml, expected);
  254. });
  255. QUnit.test('Falsey element values + attributes', function (assert) {
  256. var js = {
  257. 'document': {
  258. 'elementV': [
  259. {
  260. 'm': {
  261. '__text': 'n',
  262. '_a': 'ns'
  263. }
  264. },
  265. {
  266. 'm': {
  267. '__text': 0,
  268. '_a': 'ns'
  269. }
  270. },
  271. {
  272. 'm': {
  273. '__text': false,
  274. '_a': 'ns'
  275. }
  276. }
  277. ]
  278. }
  279. };
  280. var x = new X2JS();
  281. var xml = x.js2xml(js);
  282. var expected = '<document>' +
  283. '<elementV><m a="ns">n</m></elementV>' +
  284. '<elementV><m a="ns">0</m></elementV>' +
  285. '<elementV><m a="ns">false</m></elementV>' +
  286. '</document>';
  287. // Implementation does not guarantee formatting so the test is somewhat fragile.
  288. assert.strictEqual(xml, expected);
  289. });
  290. QUnit.test('Namespaces', function (assert) {
  291. var js = {
  292. 'document': {
  293. '__prefix': 'ns',
  294. '_ns:xmlns': 'http://example.com',
  295. 'elementV': [
  296. {
  297. '__prefix': 'ns',
  298. 'x': 't',
  299. '_a': 'a'
  300. },
  301. {
  302. 'm': {
  303. '__text': 'n',
  304. '__prefix': 'ns'
  305. },
  306. '_b': 'b'
  307. }
  308. ]
  309. }
  310. };
  311. var x = new X2JS();
  312. var xml = x.js2xml(js);
  313. var expected = '<ns:document ns:xmlns="http://example.com">' +
  314. '<ns:elementV a="a"><x>t</x></ns:elementV>' +
  315. '<elementV b="b"><ns:m>n</ns:m></elementV>' +
  316. '</ns:document>';
  317. // Implementation does not guarantee formatting so the test is somewhat fragile.
  318. assert.strictEqual(xml, expected);
  319. });
  320. QUnit.test('Filter out', function (assert) {
  321. var js = {
  322. 'document': {
  323. 'elementV': [
  324. { 'x': 't' },
  325. { 'password': 'n' }
  326. ],
  327. 'password': 'n'
  328. }
  329. };
  330. var x = new X2JS({
  331. 'jsAttributeFilter': function (name, value) {
  332. return name === 'password';
  333. }
  334. });
  335. var xml = x.js2xml(js);
  336. var expected = '<document>' +
  337. '<elementV><x>t</x></elementV>' +
  338. '<elementV></elementV>' +
  339. '</document>';
  340. // Implementation does not guarantee formatting so the test is somewhat fragile.
  341. assert.strictEqual(xml, expected);
  342. });
  343. QUnit.test('Attribute converter', function (assert) {
  344. var js = {
  345. 'document': {
  346. 'elementV': [
  347. { 'x': 't' },
  348. { 'password': 'n' }
  349. ],
  350. 'password': 'n'
  351. }
  352. };
  353. var x = new X2JS({
  354. 'jsAttributeConverter': function (name, value) {
  355. return name === 'password' ? '***' : value;
  356. }
  357. });
  358. var xml = x.js2xml(js);
  359. var expected = '<document>' +
  360. '<elementV><x>t</x></elementV>' +
  361. '<elementV><password>***</password></elementV>' +
  362. '<password>***</password>' +
  363. '</document>';
  364. // Implementation does not guarantee formatting so the test is somewhat fragile.
  365. assert.strictEqual(xml, expected);
  366. });
  367. QUnit.test('UTC dates', function (assert) {
  368. var date = new Date();
  369. var js = {
  370. 'date': date
  371. };
  372. var x = new X2JS({
  373. 'jsDateUTC': true
  374. });
  375. var xml = x.js2xml(js);
  376. var expected = '<date>' +
  377. date.toUTCString() +
  378. '</date>';
  379. // Implementation does not guarantee formatting so the test is somewhat fragile.
  380. assert.strictEqual(xml, expected);
  381. });
  382. QUnit.test('ISO dates', function (assert) {
  383. var date = new Date();
  384. var js = {
  385. 'date': date
  386. };
  387. var x = new X2JS();
  388. var xml = x.js2xml(js);
  389. var expected = '<date>' +
  390. date.toISOString() +
  391. '</date>';
  392. // Implementation does not guarantee formatting so the test is somewhat fragile.
  393. assert.strictEqual(xml, expected);
  394. });
  395. });