blob: 085ccacc13103587b5172032f91f1a2b70c14504 [file] [log] [blame]
// 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);
}