datasource_test.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. // Copyright 2006 The Closure Library Authors. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS-IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. goog.provide('goog.ds.JsDataSourceTest');
  15. goog.setTestOnly('goog.ds.JsDataSourceTest');
  16. goog.require('goog.dom.xml');
  17. goog.require('goog.ds.DataManager');
  18. goog.require('goog.ds.JsDataSource');
  19. goog.require('goog.ds.SortedNodeList');
  20. goog.require('goog.ds.XmlDataSource');
  21. goog.require('goog.testing.jsunit');
  22. var xmlDs;
  23. var jsDs;
  24. function setUp() {
  25. var xmltext = '<test><node value="5">some data</node></test>';
  26. var doc = goog.dom.xml.loadXml(xmltext);
  27. xmlDs = new goog.ds.XmlDataSource(doc.documentElement, null, null);
  28. var jsObj = {
  29. node: {
  30. '@value': 5,
  31. '#text': 'some data',
  32. name: 'bob',
  33. age: 35,
  34. alive: true,
  35. aliases: ['bobbo', 'robbo']
  36. }
  37. };
  38. jsDs = new goog.ds.JsDataSource(jsObj, 'JSDS', null);
  39. }
  40. function testJsDataSource() {
  41. var child = jsDs.getChildNode('node');
  42. var attr = child.getChildNode('@value');
  43. var text = child.getChildNode('#text');
  44. var name = child.getChildNode('name');
  45. var age = child.getChildNode('age');
  46. var alive = child.getChildNode('alive');
  47. var aliases = child.getChildNode('aliases');
  48. assertEquals('Attribute get', attr.get(), 5);
  49. assertEquals('Text get', text.get(), 'some data');
  50. assertEquals('string node get', name.get(), 'bob');
  51. assertEquals('Number get', age.get(), 35);
  52. assertEquals('Boolean get', alive.get(), true);
  53. assertEquals('Array value', aliases.get().getByIndex(1).get(), 'robbo');
  54. assertEquals('Array length', aliases.get().getCount(), 2);
  55. assertEquals('Datasource name', jsDs.getDataName(), 'JSDS');
  56. }
  57. function testXmlDataSource() {
  58. var child = xmlDs.getChildNode('node');
  59. var attr = child.getChildNode('@value');
  60. var text = child.getChildNode('#text');
  61. assertEquals('Attribute get', attr.get(), '5');
  62. assertEquals('Text get', text.get(), 'some data');
  63. assertEquals('Attr child node value', child.getChildNodeValue('@value'), '5');
  64. }
  65. function testChildNodeValue() {
  66. var child = jsDs.getChildNode('node');
  67. assertEquals('Child node value', child.getChildNodeValue('age'), 35);
  68. }
  69. function testJsSet() {
  70. assertNull('Get new child node is null', jsDs.getChildNode('Newt'));
  71. jsDs.setChildNode('Newt', 'A newt');
  72. assertEquals(
  73. 'New string child node', jsDs.getChildNode('Newt').get(), 'A newt');
  74. jsDs.setChildNode('Number', 35);
  75. assertEquals('New number child node', jsDs.getChildNodeValue('Number'), 35);
  76. var numNode = jsDs.getChildNode('Number');
  77. jsDs.getChildNode('Number').set(38);
  78. assertEquals('Changed number child node', numNode.get(), 38);
  79. assertThrows('Shouldn\'t be able to set a group node yet', function() {
  80. jsDs.set(5);
  81. });
  82. }
  83. function testDataManager() {
  84. var dm = goog.ds.DataManager.getInstance();
  85. assertNotNull('DataManager exists', dm);
  86. assertTrue('No datasources yet', dm.getChildNodes().getCount() == 0);
  87. dm.addDataSource(jsDs, true);
  88. assertTrue('One data source', dm.getChildNodes().getCount() == 1);
  89. assertEquals(
  90. 'Renamed to global prefix', '$JSDS',
  91. dm.getChildNodes().getByIndex(0).getDataName());
  92. }
  93. /**
  94. * Constructs an array of data nodes from a javascript array.
  95. */
  96. function createDataNodesArrayFromJs(jsObj) {
  97. var jsds = new goog.ds.JsDataSource(jsObj, 'MYJSDS', null);
  98. var dataNodes = jsds.getChildNodes();
  99. var dataNodesArray = [];
  100. var dataNodesCount = dataNodes.getCount();
  101. for (var i = 0; i < dataNodesCount; i++) {
  102. dataNodesArray[i] = dataNodes.getByIndex(i);
  103. }
  104. return dataNodesArray;
  105. }
  106. function testSortedNodeListConstruction() {
  107. var dataNodesArray = createDataNodesArrayFromJs([
  108. {'Value': 2, 'id': 'C'}, {'Value': 0, 'id': 'A'}, {'Value': 1, 'id': 'B'},
  109. {'Value': 3, 'id': 'D'}
  110. ]);
  111. var sortedNodeList = new goog.ds.SortedNodeList(valueSort, dataNodesArray);
  112. assertEquals('SortedNodeList count', 4, sortedNodeList.getCount());
  113. var expectedValues = [0, 1, 2, 3];
  114. for (var i = 0; i < expectedValues.length; i++) {
  115. assertEquals(
  116. 'SortedNodeList position after construction', expectedValues[i],
  117. sortedNodeList.getByIndex(i).getChildNode('Value').get());
  118. }
  119. }
  120. function testSortedNodeListAdd() {
  121. var sortedNodeList = new goog.ds.SortedNodeList(valueSort);
  122. var dataNodesArray = createDataNodesArrayFromJs([
  123. {'Value': 2, 'id': 'C'}, {'Value': 0, 'id': 'A'}, {'Value': 1, 'id': 'B'},
  124. {'Value': 3, 'id': 'D'}
  125. ]);
  126. for (var i = 0; i < dataNodesArray.length; i++) {
  127. sortedNodeList.add(dataNodesArray[i]);
  128. }
  129. assertEquals('SortedNodeList count', 4, sortedNodeList.getCount());
  130. var expectedValues = [0, 1, 2, 3];
  131. for (var i = 0; i < expectedValues.length; i++) {
  132. assertEquals(
  133. 'SortedNodeList position after construction', expectedValues[i],
  134. sortedNodeList.getByIndex(i).getChildNode('Value').get());
  135. }
  136. }
  137. function testSortedNodeListAppend() {
  138. var sortedNodeList = new goog.ds.SortedNodeList(valueSort);
  139. var dataNodesArray = createDataNodesArrayFromJs([
  140. {'Value': 2, 'id': 'C'}, {'Value': 0, 'id': 'A'}, {'Value': 1, 'id': 'B'},
  141. {'Value': 3, 'id': 'D'}
  142. ]);
  143. for (var i = 0; i < dataNodesArray.length; i++) {
  144. sortedNodeList.append(dataNodesArray[i]);
  145. }
  146. assertEquals(
  147. 'SortedNodeList count', dataNodesArray.length, sortedNodeList.getCount());
  148. var expectedValues = [2, 0, 1, 3];
  149. for (var i = 0; i < expectedValues.length; i++) {
  150. assertEquals(
  151. 'SortedNodeList position after construction', expectedValues[i],
  152. sortedNodeList.getByIndex(i).getChildNode('Value').get());
  153. }
  154. }
  155. function testSortedNodeListSet() {
  156. var dataNodesArray = createDataNodesArrayFromJs([
  157. {'Value': 4, 'id': 'C'}, {'Value': 0, 'id': 'A'}, {'Value': 2, 'id': 'B'},
  158. {'Value': 6, 'id': 'D'}
  159. ]);
  160. var sortedNodeList = new goog.ds.SortedNodeList(valueSort, dataNodesArray);
  161. assertEquals('SortedNodeList count', 4, sortedNodeList.getCount());
  162. // test set that replaces an existing node
  163. var replaceNode = createDataNodesArrayFromJs([{'Value': 5, 'id': 'B'}])[0];
  164. sortedNodeList.setNode('B', replaceNode);
  165. assertEquals('SortedNodeList count', 4, sortedNodeList.getCount());
  166. assertEquals(
  167. 'SortedNodeList replacement node correct', replaceNode,
  168. sortedNodeList.get('B'));
  169. var expectedValues = [0, 4, 5, 6];
  170. for (var i = 0; i < expectedValues.length; i++) {
  171. assertEquals(
  172. 'SortedNodeList position after set', expectedValues[i],
  173. sortedNodeList.getByIndex(i).getChildNode('Value').get());
  174. }
  175. // test a set that adds a new node
  176. var addedNode = createDataNodesArrayFromJs([{'Value': 1, 'id': 'E'}])[0];
  177. sortedNodeList.setNode('E', addedNode);
  178. assertEquals('SortedNodeList count', 5, sortedNodeList.getCount());
  179. assertEquals(
  180. 'SortedNodeList added node correct', addedNode, sortedNodeList.get('E'));
  181. var expectedValues = [0, 1, 4, 5, 6];
  182. for (var i = 0; i < expectedValues.length; i++) {
  183. assertEquals(
  184. 'SortedNodeList position after set', expectedValues[i],
  185. sortedNodeList.getByIndex(i).getChildNode('Value').get());
  186. }
  187. }
  188. function valueSort(a, b) {
  189. var valueA = a.getChildNode('Value').get();
  190. var valueB = b.getChildNode('Value').get();
  191. return (valueA - valueB);
  192. }