multimap_test.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. // Copyright 2012 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.labs.structs.MultimapTest');
  15. goog.setTestOnly('goog.labs.structs.MultimapTest');
  16. goog.require('goog.labs.structs.Map');
  17. goog.require('goog.labs.structs.Multimap');
  18. goog.require('goog.testing.jsunit');
  19. var map;
  20. function setUp() {
  21. map = new goog.labs.structs.Multimap();
  22. }
  23. function testGetCountWithEmptyMultimap() {
  24. assertEquals(0, map.getCount());
  25. assertTrue(map.isEmpty());
  26. }
  27. function testClone() {
  28. map.add('k', 'v');
  29. map.addAllValues('k2', ['v', 'v1', 'v2']);
  30. var map2 = map.clone();
  31. assertSameElements(['v'], map.get('k'));
  32. assertSameElements(['v', 'v1', 'v2'], map.get('k2'));
  33. }
  34. function testAdd() {
  35. map.add('key', 'v');
  36. assertEquals(1, map.getCount());
  37. map.add('key', 'v2');
  38. assertEquals(2, map.getCount());
  39. map.add('key', 'v3');
  40. assertEquals(3, map.getCount());
  41. var values = map.get('key');
  42. assertEquals(3, values.length);
  43. assertContains('v', values);
  44. assertContains('v2', values);
  45. assertContains('v3', values);
  46. }
  47. function testAddValues() {
  48. map.addAllValues('key', ['v', 'v2', 'v3']);
  49. assertSameElements(['v', 'v2', 'v3'], map.get('key'));
  50. map.add('key2', 'a');
  51. map.addAllValues('key2', ['v', 'v2', 'v3']);
  52. assertSameElements(['a', 'v', 'v2', 'v3'], map.get('key2'));
  53. }
  54. function testAddAllWithMultimap() {
  55. map.add('k', 'v');
  56. map.addAllValues('k2', ['v', 'v1', 'v2']);
  57. var map2 = new goog.labs.structs.Multimap();
  58. map2.add('k2', 'v');
  59. map2.addAllValues('k3', ['a', 'a1', 'a2']);
  60. map.addAllFromMultimap(map2);
  61. assertSameElements(['v'], map.get('k'));
  62. assertSameElements(['v', 'v1', 'v2', 'v'], map.get('k2'));
  63. assertSameElements(['a', 'a1', 'a2'], map.get('k3'));
  64. }
  65. function testAddAllWithMap() {
  66. map.add('k', 'v');
  67. map.addAllValues('k2', ['v', 'v1', 'v2']);
  68. var map2 = new goog.labs.structs.Map();
  69. map2.set('k2', 'v');
  70. map2.set('k3', 'a');
  71. map.addAllFromMultimap(map2);
  72. assertSameElements(['v'], map.get('k'));
  73. assertSameElements(['v', 'v1', 'v2', 'v'], map.get('k2'));
  74. assertSameElements(['a'], map.get('k3'));
  75. }
  76. function testReplaceValues() {
  77. map.add('key', 'v');
  78. map.add('key', 'v2');
  79. map.replaceValues('key', [0, 1, 2]);
  80. assertSameElements([0, 1, 2], map.get('key'));
  81. assertEquals(3, map.getCount());
  82. map.replaceValues('key', ['v']);
  83. assertSameElements(['v'], map.get('key'));
  84. assertEquals(1, map.getCount());
  85. map.replaceValues('key', []);
  86. assertSameElements([], map.get('key'));
  87. assertEquals(0, map.getCount());
  88. }
  89. function testRemove() {
  90. map.add('key', 'v');
  91. map.add('key', 'v2');
  92. map.add('key', 'v3');
  93. assertTrue(map.remove('key', 'v'));
  94. var values = map.get('key');
  95. assertEquals(2, map.getCount());
  96. assertEquals(2, values.length);
  97. assertContains('v2', values);
  98. assertContains('v3', values);
  99. assertFalse(map.remove('key', 'v'));
  100. assertTrue(map.remove('key', 'v2'));
  101. values = map.get('key');
  102. assertEquals(1, map.getCount());
  103. assertEquals(1, values.length);
  104. assertContains('v3', values);
  105. assertFalse(map.remove('key', 'v2'));
  106. assertTrue(map.remove('key', 'v3'));
  107. map.remove('key', 'v3');
  108. assertTrue(map.isEmpty());
  109. assertEquals(0, map.get('key').length);
  110. assertFalse(map.remove('key', 'v2'));
  111. }
  112. function testRemoveWithNaN() {
  113. map.add('key', NaN);
  114. map.add('key', NaN);
  115. assertTrue(map.remove('key', NaN));
  116. var values = map.get('key');
  117. assertEquals(1, values.length);
  118. assertTrue(isNaN(values[0]));
  119. assertTrue(map.remove('key', NaN));
  120. assertEquals(0, map.get('key').length);
  121. assertFalse(map.remove('key', NaN));
  122. }
  123. function testRemoveWithNegativeZero() {
  124. map.add('key', 0);
  125. map.add('key', -0);
  126. assertTrue(map.remove('key', -0));
  127. var values = map.get('key');
  128. assertEquals(1, values.length);
  129. assertTrue(1 / values[0] === 1 / 0);
  130. assertFalse(map.remove('key', -0));
  131. map.add('key', -0);
  132. assertTrue(map.remove('key', 0));
  133. var values = map.get('key');
  134. assertEquals(1, values.length);
  135. assertTrue(1 / values[0] === 1 / -0);
  136. assertFalse(map.remove('key', 0));
  137. assertTrue(map.remove('key', -0));
  138. assertEquals(0, map.get('key').length);
  139. }
  140. function testRemoveAll() {
  141. map.add('key', 'v');
  142. map.add('key', 'v2');
  143. map.add('key', 'v3');
  144. map.add('key', 'v4');
  145. map.add('key2', 'v');
  146. assertTrue(map.removeAll('key'));
  147. assertSameElements([], map.get('key'));
  148. assertSameElements(['v'], map.get('key2'));
  149. assertFalse(map.removeAll('key'));
  150. assertEquals(1, map.getCount());
  151. assertTrue(map.removeAll('key2'));
  152. assertSameElements([], map.get('key2'));
  153. assertFalse(map.removeAll('key2'));
  154. assertTrue(map.isEmpty());
  155. }
  156. function testAddWithDuplicateValue() {
  157. map.add('key', 'v');
  158. map.add('key', 'v');
  159. map.add('key', 'v');
  160. assertArrayEquals(['v', 'v', 'v'], map.get('key'));
  161. }
  162. function testContainsEntry() {
  163. assertFalse(map.containsEntry('k', 'v'));
  164. assertFalse(map.containsEntry('k', 'v2'));
  165. assertFalse(map.containsEntry('k2', 'v'));
  166. map.add('k', 'v');
  167. assertTrue(map.containsEntry('k', 'v'));
  168. assertFalse(map.containsEntry('k', 'v2'));
  169. assertFalse(map.containsEntry('k2', 'v'));
  170. map.add('k', 'v2');
  171. assertTrue(map.containsEntry('k', 'v'));
  172. assertTrue(map.containsEntry('k', 'v2'));
  173. assertFalse(map.containsEntry('k2', 'v'));
  174. map.add('k2', 'v');
  175. assertTrue(map.containsEntry('k', 'v'));
  176. assertTrue(map.containsEntry('k', 'v2'));
  177. assertTrue(map.containsEntry('k2', 'v'));
  178. }
  179. function testContainsKey() {
  180. assertFalse(map.containsKey('k'));
  181. assertFalse(map.containsKey('k2'));
  182. map.add('k', 'v');
  183. assertTrue(map.containsKey('k'));
  184. map.add('k2', 'v');
  185. assertTrue(map.containsKey('k2'));
  186. map.remove('k', 'v');
  187. assertFalse(map.containsKey('k'));
  188. map.remove('k2', 'v');
  189. assertFalse(map.containsKey('k2'));
  190. }
  191. function testContainsValue() {
  192. assertFalse(map.containsValue('v'));
  193. assertFalse(map.containsValue('v2'));
  194. map.add('key', 'v');
  195. assertTrue(map.containsValue('v'));
  196. map.add('key', 'v2');
  197. assertTrue(map.containsValue('v2'));
  198. }
  199. function testGetEntries() {
  200. map.add('key', 'v');
  201. map.add('key', 'v2');
  202. map.add('key2', 'v3');
  203. var entries = map.getEntries();
  204. assertEquals(3, entries.length);
  205. assertContainsEntry(['key', 'v'], entries);
  206. assertContainsEntry(['key', 'v2'], entries);
  207. assertContainsEntry(['key2', 'v3'], entries);
  208. }
  209. function testGetKeys() {
  210. map.add('key', 'v');
  211. map.add('key', 'v2');
  212. map.add('key2', 'v3');
  213. map.add('key3', 'v4');
  214. map.removeAll('key3');
  215. assertSameElements(['key', 'key2'], map.getKeys());
  216. }
  217. function testGetKeys() {
  218. map.add('key', 'v');
  219. map.add('key', 'v2');
  220. map.add('key2', 'v2');
  221. map.add('key3', 'v4');
  222. map.removeAll('key3');
  223. assertSameElements(['v', 'v2', 'v2'], map.getValues());
  224. }
  225. function testGetReturnsDefensiveCopyOfUnderlyingData() {
  226. map.add('key', 'v');
  227. map.add('key', 'v2');
  228. map.add('key', 'v3');
  229. var values = map.get('key');
  230. values.push('v4');
  231. assertFalse(map.containsEntry('key', 'v4'));
  232. }
  233. function testClear() {
  234. map.add('key', 'v');
  235. map.add('key', 'v2');
  236. map.add('key2', 'v3');
  237. map.clear();
  238. assertTrue(map.isEmpty());
  239. assertSameElements([], map.getEntries());
  240. }
  241. function assertContainsEntry(entry, entryList) {
  242. for (var i = 0; i < entryList.length; ++i) {
  243. if (entry[0] == entryList[i][0] && entry[1] === entryList[i][1]) {
  244. return;
  245. }
  246. }
  247. fail('Did not find entry: ' + entry + ' in: ' + entryList);
  248. }