329 lines
7.8 KiB
JavaScript
329 lines
7.8 KiB
JavaScript
// Copyright 2012 The Closure Library Authors. All Rights Reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
goog.provide('goog.labs.structs.MultimapTest');
|
|
goog.setTestOnly('goog.labs.structs.MultimapTest');
|
|
|
|
goog.require('goog.labs.structs.Map');
|
|
goog.require('goog.labs.structs.Multimap');
|
|
goog.require('goog.testing.jsunit');
|
|
|
|
var map;
|
|
|
|
|
|
function setUp() {
|
|
map = new goog.labs.structs.Multimap();
|
|
}
|
|
|
|
|
|
function testGetCountWithEmptyMultimap() {
|
|
assertEquals(0, map.getCount());
|
|
assertTrue(map.isEmpty());
|
|
}
|
|
|
|
|
|
function testClone() {
|
|
map.add('k', 'v');
|
|
map.addAllValues('k2', ['v', 'v1', 'v2']);
|
|
|
|
var map2 = map.clone();
|
|
|
|
assertSameElements(['v'], map.get('k'));
|
|
assertSameElements(['v', 'v1', 'v2'], map.get('k2'));
|
|
}
|
|
|
|
|
|
function testAdd() {
|
|
map.add('key', 'v');
|
|
assertEquals(1, map.getCount());
|
|
map.add('key', 'v2');
|
|
assertEquals(2, map.getCount());
|
|
map.add('key', 'v3');
|
|
assertEquals(3, map.getCount());
|
|
|
|
var values = map.get('key');
|
|
assertEquals(3, values.length);
|
|
assertContains('v', values);
|
|
assertContains('v2', values);
|
|
assertContains('v3', values);
|
|
}
|
|
|
|
|
|
function testAddValues() {
|
|
map.addAllValues('key', ['v', 'v2', 'v3']);
|
|
assertSameElements(['v', 'v2', 'v3'], map.get('key'));
|
|
|
|
map.add('key2', 'a');
|
|
map.addAllValues('key2', ['v', 'v2', 'v3']);
|
|
assertSameElements(['a', 'v', 'v2', 'v3'], map.get('key2'));
|
|
}
|
|
|
|
|
|
function testAddAllWithMultimap() {
|
|
map.add('k', 'v');
|
|
map.addAllValues('k2', ['v', 'v1', 'v2']);
|
|
|
|
var map2 = new goog.labs.structs.Multimap();
|
|
map2.add('k2', 'v');
|
|
map2.addAllValues('k3', ['a', 'a1', 'a2']);
|
|
|
|
map.addAllFromMultimap(map2);
|
|
assertSameElements(['v'], map.get('k'));
|
|
assertSameElements(['v', 'v1', 'v2', 'v'], map.get('k2'));
|
|
assertSameElements(['a', 'a1', 'a2'], map.get('k3'));
|
|
}
|
|
|
|
|
|
function testAddAllWithMap() {
|
|
map.add('k', 'v');
|
|
map.addAllValues('k2', ['v', 'v1', 'v2']);
|
|
|
|
var map2 = new goog.labs.structs.Map();
|
|
map2.set('k2', 'v');
|
|
map2.set('k3', 'a');
|
|
|
|
map.addAllFromMultimap(map2);
|
|
assertSameElements(['v'], map.get('k'));
|
|
assertSameElements(['v', 'v1', 'v2', 'v'], map.get('k2'));
|
|
assertSameElements(['a'], map.get('k3'));
|
|
}
|
|
|
|
|
|
function testReplaceValues() {
|
|
map.add('key', 'v');
|
|
map.add('key', 'v2');
|
|
|
|
map.replaceValues('key', [0, 1, 2]);
|
|
assertSameElements([0, 1, 2], map.get('key'));
|
|
assertEquals(3, map.getCount());
|
|
|
|
map.replaceValues('key', ['v']);
|
|
assertSameElements(['v'], map.get('key'));
|
|
assertEquals(1, map.getCount());
|
|
|
|
map.replaceValues('key', []);
|
|
assertSameElements([], map.get('key'));
|
|
assertEquals(0, map.getCount());
|
|
}
|
|
|
|
|
|
function testRemove() {
|
|
map.add('key', 'v');
|
|
map.add('key', 'v2');
|
|
map.add('key', 'v3');
|
|
|
|
assertTrue(map.remove('key', 'v'));
|
|
var values = map.get('key');
|
|
assertEquals(2, map.getCount());
|
|
assertEquals(2, values.length);
|
|
assertContains('v2', values);
|
|
assertContains('v3', values);
|
|
assertFalse(map.remove('key', 'v'));
|
|
|
|
assertTrue(map.remove('key', 'v2'));
|
|
values = map.get('key');
|
|
assertEquals(1, map.getCount());
|
|
assertEquals(1, values.length);
|
|
assertContains('v3', values);
|
|
assertFalse(map.remove('key', 'v2'));
|
|
|
|
assertTrue(map.remove('key', 'v3'));
|
|
map.remove('key', 'v3');
|
|
assertTrue(map.isEmpty());
|
|
assertEquals(0, map.get('key').length);
|
|
assertFalse(map.remove('key', 'v2'));
|
|
}
|
|
|
|
|
|
function testRemoveWithNaN() {
|
|
map.add('key', NaN);
|
|
map.add('key', NaN);
|
|
|
|
assertTrue(map.remove('key', NaN));
|
|
var values = map.get('key');
|
|
assertEquals(1, values.length);
|
|
assertTrue(isNaN(values[0]));
|
|
|
|
assertTrue(map.remove('key', NaN));
|
|
assertEquals(0, map.get('key').length);
|
|
assertFalse(map.remove('key', NaN));
|
|
}
|
|
|
|
|
|
function testRemoveWithNegativeZero() {
|
|
map.add('key', 0);
|
|
map.add('key', -0);
|
|
|
|
assertTrue(map.remove('key', -0));
|
|
var values = map.get('key');
|
|
assertEquals(1, values.length);
|
|
assertTrue(1 / values[0] === 1 / 0);
|
|
assertFalse(map.remove('key', -0));
|
|
|
|
map.add('key', -0);
|
|
|
|
assertTrue(map.remove('key', 0));
|
|
var values = map.get('key');
|
|
assertEquals(1, values.length);
|
|
assertTrue(1 / values[0] === 1 / -0);
|
|
assertFalse(map.remove('key', 0));
|
|
|
|
assertTrue(map.remove('key', -0));
|
|
assertEquals(0, map.get('key').length);
|
|
}
|
|
|
|
|
|
function testRemoveAll() {
|
|
map.add('key', 'v');
|
|
map.add('key', 'v2');
|
|
map.add('key', 'v3');
|
|
map.add('key', 'v4');
|
|
map.add('key2', 'v');
|
|
|
|
assertTrue(map.removeAll('key'));
|
|
assertSameElements([], map.get('key'));
|
|
assertSameElements(['v'], map.get('key2'));
|
|
assertFalse(map.removeAll('key'));
|
|
assertEquals(1, map.getCount());
|
|
|
|
assertTrue(map.removeAll('key2'));
|
|
assertSameElements([], map.get('key2'));
|
|
assertFalse(map.removeAll('key2'));
|
|
assertTrue(map.isEmpty());
|
|
}
|
|
|
|
|
|
function testAddWithDuplicateValue() {
|
|
map.add('key', 'v');
|
|
map.add('key', 'v');
|
|
map.add('key', 'v');
|
|
assertArrayEquals(['v', 'v', 'v'], map.get('key'));
|
|
}
|
|
|
|
|
|
function testContainsEntry() {
|
|
assertFalse(map.containsEntry('k', 'v'));
|
|
assertFalse(map.containsEntry('k', 'v2'));
|
|
assertFalse(map.containsEntry('k2', 'v'));
|
|
|
|
map.add('k', 'v');
|
|
assertTrue(map.containsEntry('k', 'v'));
|
|
assertFalse(map.containsEntry('k', 'v2'));
|
|
assertFalse(map.containsEntry('k2', 'v'));
|
|
|
|
map.add('k', 'v2');
|
|
assertTrue(map.containsEntry('k', 'v'));
|
|
assertTrue(map.containsEntry('k', 'v2'));
|
|
assertFalse(map.containsEntry('k2', 'v'));
|
|
|
|
map.add('k2', 'v');
|
|
assertTrue(map.containsEntry('k', 'v'));
|
|
assertTrue(map.containsEntry('k', 'v2'));
|
|
assertTrue(map.containsEntry('k2', 'v'));
|
|
}
|
|
|
|
|
|
function testContainsKey() {
|
|
assertFalse(map.containsKey('k'));
|
|
assertFalse(map.containsKey('k2'));
|
|
|
|
map.add('k', 'v');
|
|
assertTrue(map.containsKey('k'));
|
|
map.add('k2', 'v');
|
|
assertTrue(map.containsKey('k2'));
|
|
|
|
map.remove('k', 'v');
|
|
assertFalse(map.containsKey('k'));
|
|
map.remove('k2', 'v');
|
|
assertFalse(map.containsKey('k2'));
|
|
}
|
|
|
|
|
|
function testContainsValue() {
|
|
assertFalse(map.containsValue('v'));
|
|
assertFalse(map.containsValue('v2'));
|
|
|
|
map.add('key', 'v');
|
|
assertTrue(map.containsValue('v'));
|
|
map.add('key', 'v2');
|
|
assertTrue(map.containsValue('v2'));
|
|
}
|
|
|
|
|
|
function testGetEntries() {
|
|
map.add('key', 'v');
|
|
map.add('key', 'v2');
|
|
map.add('key2', 'v3');
|
|
|
|
var entries = map.getEntries();
|
|
assertEquals(3, entries.length);
|
|
assertContainsEntry(['key', 'v'], entries);
|
|
assertContainsEntry(['key', 'v2'], entries);
|
|
assertContainsEntry(['key2', 'v3'], entries);
|
|
}
|
|
|
|
|
|
function testGetKeys() {
|
|
map.add('key', 'v');
|
|
map.add('key', 'v2');
|
|
map.add('key2', 'v3');
|
|
map.add('key3', 'v4');
|
|
map.removeAll('key3');
|
|
|
|
assertSameElements(['key', 'key2'], map.getKeys());
|
|
}
|
|
|
|
|
|
function testGetKeys() {
|
|
map.add('key', 'v');
|
|
map.add('key', 'v2');
|
|
map.add('key2', 'v2');
|
|
map.add('key3', 'v4');
|
|
map.removeAll('key3');
|
|
|
|
assertSameElements(['v', 'v2', 'v2'], map.getValues());
|
|
}
|
|
|
|
|
|
function testGetReturnsDefensiveCopyOfUnderlyingData() {
|
|
map.add('key', 'v');
|
|
map.add('key', 'v2');
|
|
map.add('key', 'v3');
|
|
|
|
var values = map.get('key');
|
|
values.push('v4');
|
|
assertFalse(map.containsEntry('key', 'v4'));
|
|
}
|
|
|
|
|
|
function testClear() {
|
|
map.add('key', 'v');
|
|
map.add('key', 'v2');
|
|
map.add('key2', 'v3');
|
|
|
|
map.clear();
|
|
assertTrue(map.isEmpty());
|
|
assertSameElements([], map.getEntries());
|
|
}
|
|
|
|
|
|
function assertContainsEntry(entry, entryList) {
|
|
for (var i = 0; i < entryList.length; ++i) {
|
|
if (entry[0] == entryList[i][0] && entry[1] === entryList[i][1]) {
|
|
return;
|
|
}
|
|
}
|
|
fail('Did not find entry: ' + entry + ' in: ' + entryList);
|
|
}
|