void LinkedHashMapTest::testRemove() { { LinkedHashMap<int, std::string> hashMap; populateMap(hashMap); int size = hashMap.size(); CPPUNIT_ASSERT_NO_THROW_MESSAGE("Remove returned incorrect value", hashMap.remove(9)); CPPUNIT_ASSERT_THROW_MESSAGE( "Should have thrown a NoSuchElementException on get of non-existent key.", hashMap.get(9), NoSuchElementException); CPPUNIT_ASSERT_MESSAGE("Failed to decrement size", hashMap.size() == (size - 1)); CPPUNIT_ASSERT_THROW_MESSAGE( "Should have thrown a NoSuchElementException on remove of non-existent key.", hashMap.remove(9), NoSuchElementException); } { LinkedHashMap<int, std::string> hashMap; for (int i = 0; i < 8192; i++) { hashMap.put(i, "const"); } for (int i = 0; i < 8192; i++) { hashMap.put(i, Integer::toString(i)); } for (int i = 8191; i >= 0; i--) { std::string iValue = Integer::toString(i); CPPUNIT_ASSERT_MESSAGE(std::string("Failed to replace value: ") + iValue, hashMap.containsValue(iValue)); hashMap.remove(i); CPPUNIT_ASSERT_MESSAGE(std::string("Failed to remove same value: ") + iValue, !hashMap.containsValue(iValue)); } } { // Ensure keys with identical hashcode are stored separately and removed correctly. LinkedHashMap<MyKey, std::string> map; // Put non-equal object with same hashcode MyKey aKey; CPPUNIT_ASSERT(!map.containsKey(aKey)); map.put(aKey, "value"); MyKey aKey2; CPPUNIT_ASSERT_THROW_MESSAGE( "Should have thrown NoSuchElementException", map.remove(aKey2), NoSuchElementException); MyKey aKey3; map.put(aKey3, "foobar"); CPPUNIT_ASSERT_EQUAL(std::string("foobar"), map.get(aKey3)); CPPUNIT_ASSERT_EQUAL(std::string("value"), map.get(aKey)); map.remove(aKey); map.remove(aKey3); CPPUNIT_ASSERT(!map.containsKey(aKey)); CPPUNIT_ASSERT(map.isEmpty()); } }
void LinkedHashMapTest::testClear() { LinkedHashMap<int, std::string> hashMap; hashMap.put(1, "one"); hashMap.put(3, "three"); hashMap.put(2, "two"); hashMap.clear(); CPPUNIT_ASSERT_EQUAL_MESSAGE("Clear failed to reset size", 0, hashMap.size()); for (int i = 0; i < 125; i++) { CPPUNIT_ASSERT_THROW_MESSAGE( "Failed to clear all elements", hashMap.get(i), NoSuchElementException); } // Check clear on a large loaded map of Integer keys LinkedHashMap<int, std::string> map; for (int i = -32767; i < 32768; i++) { map.put(i, "foobar"); } map.clear(); CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed to reset size on large integer map", 0, map.size()); for (int i = -32767; i < 32768; i++) { CPPUNIT_ASSERT_THROW_MESSAGE( "Failed to clear all elements", map.get(i), NoSuchElementException); } }
TEST(LinkedHashmapTest, Erase) { LinkedHashMap<string, int> map; map["foo"] = 1; map["bar"] = 2; ASSERT_EQ(2, map.size()); ASSERT_EQ(1, map.erase("foo")); ASSERT_EQ(0, map.erase("caz")); // Non-existent key. ASSERT_NONE(map.get("foo")); ASSERT_EQ(1, map.size()); ASSERT_SOME_EQ(2, map.get("bar")); }
TEST(LinkedHashmapTest, Put) { LinkedHashMap<string, int> map; map["foo"] = 1; ASSERT_SOME_EQ(1, map.get("foo")); ASSERT_EQ(1, map.size()); map["bar"] = 2; ASSERT_SOME_EQ(2, map.get("bar")); ASSERT_EQ(2, map.size()); map["foo"] = 3; ASSERT_SOME_EQ(3, map.get("foo")); ASSERT_EQ(2, map.size()); }
void LinkedHashMapTest::testOrderedEntrySet() { int i; int size = 100; { LinkedHashMap<int, std::string> map; populateMap(map, size); Set<MapEntry<int, std::string> >& set = map.entrySet(); Pointer< Iterator<MapEntry<int, std::string> > > iter(set.iterator()); CPPUNIT_ASSERT_MESSAGE("Returned set of incorrect size 1", map.size() == set.size()); for (i = 0; iter->hasNext(); i++) { MapEntry<int, std::string> entry = iter->next(); int key = entry.getKey(); CPPUNIT_ASSERT_MESSAGE("Returned incorrect entry set 1", key == i); } } LinkedHashMap<int, std::string> map2(200, .75f, true); populateMap(map2, size); Set<MapEntry<int, std::string> >& set = map2.entrySet(); Pointer< Iterator<MapEntry<int, std::string> > > iter(set.iterator()); CPPUNIT_ASSERT_MESSAGE("Returned set of incorrect size 2", map2.size() == set.size()); for (i = 0; i < size && iter->hasNext(); i++) { MapEntry<int, std::string> entry = iter->next(); int key = entry.getKey(); CPPUNIT_ASSERT_MESSAGE("Returned incorrect entry set 2", key == i); } /* fetch the even numbered entries to affect traversal order */ int p = 0; for (i = 0; i < size; i += 2) { std::string ii = map2.get(i); p = p + Integer::parseInt(ii); } CPPUNIT_ASSERT_EQUAL_MESSAGE("invalid sum of even numbers", 2450, p); set = map2.entrySet(); iter.reset(set.iterator()); CPPUNIT_ASSERT_MESSAGE("Returned set of incorrect size 3", map2.size() == set.size()); for (i = 1; i < size && iter->hasNext(); i += 2) { MapEntry<int, std::string> entry = iter->next(); int key = entry.getKey(); CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect entry set 3", key, i); } for (i = 0; i < size && iter->hasNext(); i += 2) { MapEntry<int, std::string> entry = iter->next(); int key = entry.getKey(); CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect entry set 4", key, i); } CPPUNIT_ASSERT_MESSAGE("Entries left to iterate on", !iter->hasNext()); }
void LinkedHashMapTest::testOrderedValues() { int i; int size = 100; { LinkedHashMap<int, int> map; for (i = 0; i < size; i++) { map.put(i, i * 2); } Collection<int>& set = map.values(); Pointer< Iterator<int> > iter(set.iterator()); CPPUNIT_ASSERT_MESSAGE("Returned set of incorrect size 1", map.size() == set.size()); for (i = 0; iter->hasNext(); i++) { int value = iter->next(); CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect values set 1", value, i * 2); } } LinkedHashMap<int, int> map2(200, .75f, true); for (i = 0; i < size; i++) { map2.put(i, i * 2); } Collection<int>& set = map2.values(); Pointer< Iterator<int> > iter(set.iterator()); CPPUNIT_ASSERT_MESSAGE("Returned set of incorrect size 2", map2.size() == set.size()); for (i = 0; i < size && iter->hasNext(); i++) { int value = iter->next(); CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect values set 2", value, i * 2); } /* fetch the even numbered entries to affect traversal order */ int p = 0; for (i = 0; i < size; i += 2) { p = p + map2.get(i); } CPPUNIT_ASSERT_EQUAL_MESSAGE("invalid sum of even numbers", 2450 * 2, p); set = map2.values(); iter.reset(set.iterator()); CPPUNIT_ASSERT_MESSAGE("Returned set of incorrect size 3", map2.size() == set.size()); for (i = 1; i < size && iter->hasNext(); i += 2) { int value = iter->next(); CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect values set 3", value, i * 2); } for (i = 0; i < size && iter->hasNext(); i += 2) { int value = iter->next(); CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect values set 4", value, i * 2); } CPPUNIT_ASSERT_MESSAGE("Entries left to iterate on", !iter->hasNext()); }
void LinkedHashMapTest::testValues() { LinkedHashMap<int, std::string> hashMap; populateMap(hashMap); Collection<std::string>& c = hashMap.values(); CPPUNIT_ASSERT_MESSAGE("Returned collection of incorrect size()", c.size() == hashMap.size()); for (int i = 0; i < MAP_SIZE; i++) { CPPUNIT_ASSERT_MESSAGE("Returned collection does not contain all keys", c.contains(Integer::toString(i))); } c.remove("10"); CPPUNIT_ASSERT_MESSAGE("Removing from collection should alter Map", !hashMap.containsKey(10)); }
void LinkedHashMapTest::testEntrySet() { LinkedHashMap<int, std::string> hashMap; for (int i = 0; i < 50; i++) { hashMap.put(i, Integer::toString(i)); } Set<MapEntry<int, std::string> >& set = hashMap.entrySet(); Pointer< Iterator<MapEntry<int, std::string> > > iterator(set.iterator()); CPPUNIT_ASSERT_MESSAGE("Returned set of incorrect size", hashMap.size() == set.size()); while (iterator->hasNext()) { MapEntry<int, std::string> entry = iterator->next(); CPPUNIT_ASSERT_MESSAGE("Returned incorrect entry set", hashMap.containsKey(entry.getKey()) && hashMap.containsValue(entry.getValue())); } iterator.reset(set.iterator()); set.remove(iterator->next()); CPPUNIT_ASSERT_EQUAL_MESSAGE("Remove on set didn't take", 49, set.size()); }
void LinkedHashMapTest::testConstructor() { LinkedHashMap<int, std::string> map; CPPUNIT_ASSERT(map.isEmpty()); CPPUNIT_ASSERT(map.size() == 0); }
void LinkedHashMapTest::testSize() { LinkedHashMap<int, std::string> hashMap; populateMap(hashMap); CPPUNIT_ASSERT_MESSAGE("Returned incorrect size", hashMap.size() == MAP_SIZE); }
void LinkedHashMapTest::testKeySet() { LinkedHashMap<int, std::string> hashMap; populateMap(hashMap); Set<int>& set = hashMap.keySet(); CPPUNIT_ASSERT_MESSAGE("Returned set of incorrect size()", set.size() == hashMap.size()); for (int i = 0; i < MAP_SIZE; i++) { CPPUNIT_ASSERT_MESSAGE("Returned set does not contain all keys", set.contains(i)); } { LinkedHashMap<int, std::string> localMap; localMap.put(0, "test"); Set<int>& intSet = localMap.keySet(); CPPUNIT_ASSERT_MESSAGE("Failed with zero key", intSet.contains(0)); } { LinkedHashMap<int, std::string> localMap; localMap.put(1, "1"); localMap.put(102, "102"); localMap.put(203, "203"); Set<int>& intSet = localMap.keySet(); Pointer< Iterator<int> > it(intSet.iterator()); int remove1 = it->next(); it->hasNext(); it->remove(); int remove2 = it->next(); it->remove(); ArrayList<int> list; list.add(1); list.add(102); list.add(203); list.remove(remove1); list.remove(remove2); CPPUNIT_ASSERT_MESSAGE("Wrong result", it->next() == list.get(0)); CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong size", 1, localMap.size()); it.reset(intSet.iterator()); CPPUNIT_ASSERT_MESSAGE("Wrong contents", it->next() == list.get(0)); } { LinkedHashMap<int, std::string> map2(101); map2.put(1, "1"); map2.put(4, "4"); Set<int>& intSet = map2.keySet(); Pointer< Iterator<int> > it2(intSet.iterator()); int remove3 = it2->next(); int next; if (remove3 == 1) { next = 4; } else { next = 1; } it2->hasNext(); it2->remove(); CPPUNIT_ASSERT_MESSAGE("Wrong result 2", it2->next() == next); CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong size 2", 1, map2.size()); it2.reset(intSet.iterator()); CPPUNIT_ASSERT_MESSAGE("Wrong contents 2", it2->next() == next); } }