blob: 69eb2a0eea5c4059abe2114e5c49ae43097bed38 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
#include "StlMapTest.h"
#include <string>
#include <decaf/util/HashMap.h>
#include <decaf/util/StlMap.h>
#include <decaf/util/ArrayList.h>
#include <decaf/lang/Integer.h>
#include <decaf/lang/exceptions/IllegalArgumentException.h>
#include <decaf/lang/exceptions/IllegalStateException.h>
using namespace std;
using namespace decaf;
using namespace decaf::util;
using namespace decaf::lang;
using namespace decaf::lang::exceptions;
////////////////////////////////////////////////////////////////////////////////
namespace {
const int MAP_SIZE = 1000;
void populateMap(StlMap<int, std::string>& map) {
for (int i = 0; i < MAP_SIZE; ++i) {
map.put(i, Integer::toString(i));
}
}
}
////////////////////////////////////////////////////////////////////////////////
void StlMapTest::testConstructor() {
StlMap<string, int> map1;
CPPUNIT_ASSERT( map1.isEmpty() );
CPPUNIT_ASSERT( map1.size() == 0 );
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should Throw a NoSuchElementException",
map1.get( "TEST" ),
decaf::util::NoSuchElementException );
HashMap<string, int> srcMap;
srcMap.put( "A", 1 );
srcMap.put( "B", 1 );
srcMap.put( "C", 1 );
StlMap<string, int> destMap( srcMap );
CPPUNIT_ASSERT( srcMap.size() == 3 );
CPPUNIT_ASSERT( destMap.size() == 3 );
CPPUNIT_ASSERT( destMap.get( "B" ) == 1 );
}
////////////////////////////////////////////////////////////////////////////////
void StlMapTest::testContainsKey(){
StlMap<string, bool> boolMap;
CPPUNIT_ASSERT(boolMap.containsKey("bob") == false);
boolMap.put( "bob", true );
CPPUNIT_ASSERT(boolMap.containsKey("bob") == true );
CPPUNIT_ASSERT(boolMap.containsKey("fred") == false );
}
////////////////////////////////////////////////////////////////////////////////
void StlMapTest::testContiansValue() {
StlMap<string, bool> boolMap;
boolMap.put( "fred", true );
boolMap.put( "fred1", false );
CPPUNIT_ASSERT( boolMap.containsValue(true) == true );
boolMap.remove( "fred" );
CPPUNIT_ASSERT( boolMap.containsValue(true) == false );
}
////////////////////////////////////////////////////////////////////////////////
void StlMapTest::testClear() {
StlMap<string, bool> boolMap;
boolMap.put( "bob", true );
boolMap.put( "fred", true );
CPPUNIT_ASSERT(boolMap.size() == 2 );
boolMap.clear();
CPPUNIT_ASSERT(boolMap.size() == 0 );
}
////////////////////////////////////////////////////////////////////////////////
void StlMapTest::testCopy() {
StlMap<string, int> destMap;
HashMap<string, int> srcMap;
StlMap<string, int> srcMap2;
CPPUNIT_ASSERT( destMap.size() == 0 );
srcMap.put( "A", 1 );
srcMap.put( "B", 2 );
srcMap.put( "C", 3 );
srcMap.put( "D", 4 );
srcMap.put( "E", 5 );
srcMap.put( "F", 6 );
destMap.copy( srcMap );
CPPUNIT_ASSERT( destMap.size() == 6 );
CPPUNIT_ASSERT( destMap.get( "A" ) == 1 );
CPPUNIT_ASSERT( destMap.get( "B" ) == 2 );
CPPUNIT_ASSERT( destMap.get( "C" ) == 3 );
CPPUNIT_ASSERT( destMap.get( "D" ) == 4 );
CPPUNIT_ASSERT( destMap.get( "E" ) == 5 );
CPPUNIT_ASSERT( destMap.get( "F" ) == 6 );
destMap.copy( srcMap2 );
CPPUNIT_ASSERT( destMap.size() == 0 );
srcMap2.put( "A", 1 );
srcMap2.put( "B", 2 );
srcMap2.put( "C", 3 );
srcMap2.put( "D", 4 );
srcMap2.put( "E", 5 );
destMap.copy( srcMap2 );
CPPUNIT_ASSERT( destMap.size() == 5 );
}
////////////////////////////////////////////////////////////////////////////////
void StlMapTest::testIsEmpty() {
StlMap<string, bool> boolMap;
boolMap.put( "bob", true );
boolMap.put( "fred", true );
CPPUNIT_ASSERT(boolMap.isEmpty() == false );
boolMap.clear();
CPPUNIT_ASSERT(boolMap.isEmpty() == true );
}
////////////////////////////////////////////////////////////////////////////////
void StlMapTest::testSize() {
StlMap<string, bool> boolMap;
CPPUNIT_ASSERT(boolMap.size() == 0 );
boolMap.put( "bob", true );
CPPUNIT_ASSERT(boolMap.size() == 1 );
boolMap.put( "fred", true );
CPPUNIT_ASSERT(boolMap.size() == 2 );
}
////////////////////////////////////////////////////////////////////////////////
void StlMapTest::testGet() {
StlMap<string, bool> boolMap;
boolMap.put( "fred", true );
CPPUNIT_ASSERT( boolMap.get("fred") == true );
boolMap.put( "bob", false );
CPPUNIT_ASSERT( boolMap.get("bob") == false );
CPPUNIT_ASSERT( boolMap.get("fred") == true );
try{
boolMap.get( "mike" );
CPPUNIT_ASSERT(false);
} catch( decaf::util::NoSuchElementException& e ){
}
}
////////////////////////////////////////////////////////////////////////////////
void StlMapTest::testPut() {
StlMap<string, bool> boolMap;
boolMap.put( "fred", true );
CPPUNIT_ASSERT( boolMap.get("fred") == true );
boolMap.put( "bob", false );
CPPUNIT_ASSERT( boolMap.get("bob") == false );
CPPUNIT_ASSERT( boolMap.get("fred") == true );
boolMap.put( "bob", true );
CPPUNIT_ASSERT( boolMap.get("bob") == true );
CPPUNIT_ASSERT( boolMap.get("fred") == true );
}
////////////////////////////////////////////////////////////////////////////////
void StlMapTest::testPutAll() {
StlMap<string, int> destMap;
HashMap<string, int> srcMap;
HashMap<string, int> srcMap2;
srcMap.put( "A", 1 );
srcMap.put( "B", 1 );
srcMap.put( "C", 1 );
CPPUNIT_ASSERT( srcMap.size() == 3 );
CPPUNIT_ASSERT( destMap.size() == 0 );
srcMap.put( "D", 1 );
srcMap.put( "E", 1 );
srcMap.put( "F", 1 );
destMap.putAll( srcMap );
CPPUNIT_ASSERT( destMap.size() == 6 );
destMap.putAll( srcMap2 );
CPPUNIT_ASSERT( destMap.size() == 6 );
}
////////////////////////////////////////////////////////////////////////////////
void StlMapTest::testRemove() {
StlMap<string, bool> boolMap;
boolMap.put( "fred", true );
CPPUNIT_ASSERT( boolMap.containsKey("fred") == true );
CPPUNIT_ASSERT( boolMap.remove( "fred" ) == true );
CPPUNIT_ASSERT( boolMap.containsKey("fred") == false );
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should throw a NoSuchElementException",
boolMap.remove( "fred" ),
decaf::util::NoSuchElementException );
}
////////////////////////////////////////////////////////////////////////////////
void StlMapTest::testEntrySet() {
StlMap<int, std::string> map;
for (int i = 0; i < 50; i++) {
map.put(i, Integer::toString(i));
}
Set<MapEntry<int, std::string> >& set = map.entrySet();
Pointer< Iterator<MapEntry<int, std::string> > > iterator(set.iterator());
CPPUNIT_ASSERT_MESSAGE("Returned set of incorrect size", map.size() == set.size());
while (iterator->hasNext()) {
MapEntry<int, std::string> entry = iterator->next();
CPPUNIT_ASSERT_MESSAGE("Returned incorrect entry set",
map.containsKey(entry.getKey()) && map.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 StlMapTest::testKeySet() {
StlMap<int, std::string> map;
populateMap(map);
Set<int>& set = map.keySet();
CPPUNIT_ASSERT_MESSAGE("Returned set of incorrect size()", set.size() == map.size());
for (int i = 0; i < MAP_SIZE; i++) {
CPPUNIT_ASSERT_MESSAGE("Returned set does not contain all keys", set.contains(i));
}
{
StlMap<int, std::string> localMap;
localMap.put(0, "test");
Set<int>& intSet = localMap.keySet();
CPPUNIT_ASSERT_MESSAGE("Failed with zero key", intSet.contains(0));
}
{
StlMap<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));
}
{
StlMap<int, std::string> map2;
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);
}
}
////////////////////////////////////////////////////////////////////////////////
void StlMapTest::testValues() {
StlMap<int, std::string> map;
populateMap(map);
Collection<std::string>& c = map.values();
CPPUNIT_ASSERT_MESSAGE("Returned collection of incorrect size()", c.size() == map.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",
!map.containsKey(10));
}
////////////////////////////////////////////////////////////////////////////////
void StlMapTest::testEntrySetIterator() {
StlMap<int, std::string> map;
populateMap(map);
int count = 0;
Pointer< Iterator<MapEntry<int, std::string> > > iterator(map.entrySet().iterator());
while (iterator->hasNext()) {
MapEntry<int, std::string> entry = iterator->next();
CPPUNIT_ASSERT_EQUAL(count, entry.getKey());
CPPUNIT_ASSERT_EQUAL(Integer::toString(count), entry.getValue());
count++;
}
CPPUNIT_ASSERT_MESSAGE("Iterator didn't cover the expected range", count++ == MAP_SIZE);
iterator.reset(map.entrySet().iterator());
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should throw an IllegalStateException",
iterator->remove(),
IllegalStateException);
count = 0;
while (iterator->hasNext()) {
iterator->next();
iterator->remove();
count++;
}
CPPUNIT_ASSERT_MESSAGE("Iterator didn't remove the expected range", count++ == MAP_SIZE);
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should throw an IllegalStateException",
iterator->remove(),
IllegalStateException);
}
////////////////////////////////////////////////////////////////////////////////
void StlMapTest::testKeySetIterator() {
StlMap<int, std::string> map;
populateMap(map);
int count = 0;
Pointer< Iterator<int> > iterator(map.keySet().iterator());
while (iterator->hasNext()) {
int key = iterator->next();
CPPUNIT_ASSERT_EQUAL(count, key);
count++;
}
CPPUNIT_ASSERT_MESSAGE("Iterator didn't cover the expected range", count++ == MAP_SIZE);
iterator.reset(map.keySet().iterator());
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should throw an IllegalStateException",
iterator->remove(),
IllegalStateException);
count = 0;
while (iterator->hasNext()) {
iterator->next();
iterator->remove();
count++;
}
CPPUNIT_ASSERT_MESSAGE("Iterator didn't remove the expected range", count++ == MAP_SIZE);
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should throw an IllegalStateException",
iterator->remove(),
IllegalStateException);
}
////////////////////////////////////////////////////////////////////////////////
void StlMapTest::testValuesIterator() {
StlMap<int, std::string> map;
populateMap(map);
int count = 0;
Pointer< Iterator<std::string> > iterator(map.values().iterator());
while (iterator->hasNext()) {
std::string value = iterator->next();
CPPUNIT_ASSERT_EQUAL(Integer::toString(count), value);
count++;
}
CPPUNIT_ASSERT_MESSAGE("Iterator didn't cover the expected range", count++ == MAP_SIZE);
iterator.reset(map.values().iterator());
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should throw an IllegalStateException",
iterator->remove(),
IllegalStateException);
count = 0;
while (iterator->hasNext()) {
iterator->next();
iterator->remove();
count++;
}
CPPUNIT_ASSERT_MESSAGE("Iterator didn't remove the expected range", count++ == MAP_SIZE);
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should throw an IllegalStateException",
iterator->remove(),
IllegalStateException);
}