/* * Copyright (c) 2007 Tom Parker <thpr@users.sourceforge.net> * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package pcgen.base.util; import java.util.ArrayList; import java.util.IdentityHashMap; import java.util.List; import java.util.Set; import junit.framework.TestCase; import org.junit.Before; import org.junit.Test; public class GenericMapToListTest_IdentityHash extends TestCase { private static final Integer CONST_5 = Integer.valueOf(5); private static final Integer CONST_2 = Integer.valueOf(2); private static final Integer CONST_1A = new Integer(1); private static final Integer CONST_1B = new Integer(1); private static final Character CONST_E = 'E'; private static final Character CONST_C = 'C'; private static final Character CONST_F = 'F'; private static final Character CONST_D = 'D'; private static final Character CONST_B = 'B'; private static final Character CONST_A = 'A'; GenericMapToList<Integer, Character> dkm; @Override @Before public void setUp() { dkm = GenericMapToList.getMapToList(IdentityHashMap.class); } public void populate() { dkm.addToListFor(CONST_1A, CONST_A); dkm.addToListFor(CONST_1B, CONST_B); dkm.addToListFor(CONST_1B, CONST_C); dkm.addToListFor(CONST_2, CONST_D); dkm.addToListFor(CONST_2, CONST_E); dkm.addToListFor(CONST_2, null); dkm.addToListFor(null, CONST_F); dkm.addToListFor(CONST_5, null); } @Test public void testInitializeListFor() { assertNull(dkm.getListFor(CONST_1A)); assertNull(dkm.getListFor(CONST_1B)); dkm.initializeListFor(CONST_1A); List<Character> l = dkm.getListFor(CONST_1A); assertEquals(0, l.size()); assertNull(dkm.getListFor(CONST_1B)); dkm.initializeListFor(CONST_1B); l = dkm.getListFor(CONST_1B); assertEquals(0, l.size()); try { dkm.initializeListFor(CONST_1A); fail(); } catch (IllegalArgumentException e) { // OK } } @Test public void testPutGet() { assertNull(dkm.getListFor(null)); assertNull(dkm.getListFor(CONST_1A)); populate(); List<Character> l = dkm.getListFor(CONST_1A); assertEquals(1, l.size()); assertTrue(l.contains(CONST_A)); dkm.addToListFor(CONST_1B, CONST_C); l = dkm.getListFor(CONST_1B); assertEquals(3, l.size()); assertTrue(l.contains(CONST_B)); assertTrue(l.contains(CONST_C)); // two of them l.remove(Character.valueOf(CONST_C)); assertTrue(l.contains(CONST_C)); l = dkm.getListFor(CONST_2); assertEquals(3, l.size()); assertTrue(l.contains(CONST_D)); assertTrue(l.contains(CONST_E)); assertTrue(l.contains(null)); dkm.addToListFor(CONST_2, null); l = dkm.getListFor(CONST_2); assertEquals(4, l.size()); assertTrue(l.contains(CONST_D)); assertTrue(l.contains(CONST_E)); assertTrue(l.contains(null)); // Two of them. l.remove(null); assertTrue(l.contains(null)); assertNull(dkm.getListFor(Integer.valueOf(4))); l = dkm.getListFor(null); assertEquals(1, l.size()); assertTrue(l.contains(CONST_F)); l.add(CONST_A); List<Character> l2 = dkm.getListFor(null); assertEquals(1, l2.size()); assertTrue(l2.contains(CONST_F)); assertEquals(2, l.size()); assertTrue(l.contains(CONST_F)); assertTrue(l.contains(CONST_A)); dkm.clear(); assertEquals(1, l2.size()); assertTrue(l2.contains(CONST_F)); assertEquals(2, l.size()); assertTrue(l.contains(CONST_F)); assertTrue(l.contains(CONST_A)); l2.clear(); assertEquals(0, l2.size()); assertEquals(2, l.size()); assertTrue(l.contains(CONST_F)); assertTrue(l.contains(CONST_A)); } @Test public void testContainsKey() { assertFalse(dkm.containsListFor(CONST_1A)); assertFalse(dkm.containsListFor(null)); populate(); assertTrue(dkm.containsListFor(CONST_1A)); // Keys are .equals items, not instance assertFalse(dkm.containsListFor(new Integer(1))); assertTrue(dkm.containsListFor(CONST_2)); assertTrue(dkm.containsListFor(CONST_5)); assertFalse(dkm.containsListFor(Integer.valueOf(-4))); assertTrue(dkm.containsListFor(null)); } @Test public void testRemoveListFor() { assertNull(dkm.removeListFor(CONST_1A)); assertNull(dkm.removeListFor(null)); populate(); List<Character> l = dkm.removeListFor(CONST_1A); assertEquals(1, l.size()); assertTrue(l.contains(CONST_A)); assertFalse(dkm.containsListFor(CONST_1A)); assertNull(dkm.getListFor(CONST_1A)); l = dkm.removeListFor(CONST_2); assertEquals(3, l.size()); assertTrue(l.contains(CONST_D)); assertTrue(l.contains(CONST_E)); assertTrue(l.contains(null)); l = dkm.removeListFor(null); assertEquals(1, l.size()); assertTrue(l.contains(CONST_F)); } @Test public void testRemoveFromListFor() { assertFalse(dkm.removeFromListFor(CONST_1B, CONST_D)); populate(); assertTrue(dkm.removeFromListFor(CONST_1B, CONST_B)); assertTrue(dkm.containsListFor(CONST_1B)); // Keys are instance assertFalse(dkm.containsListFor(new Integer(1))); assertEquals(1, dkm.sizeOfListFor(CONST_1B)); assertFalse(dkm.removeFromListFor(CONST_1B, CONST_A)); assertTrue(dkm.containsListFor(CONST_1B)); assertFalse(dkm.removeFromListFor(CONST_1B, CONST_B)); assertTrue(dkm.removeFromListFor(CONST_1B, CONST_C)); assertEquals(0, dkm.sizeOfListFor(CONST_1B)); assertFalse(dkm.containsListFor(CONST_1B)); // add a second :) dkm.addToListFor(CONST_2, CONST_D); assertFalse(dkm.removeFromListFor(CONST_2, CONST_A)); assertTrue(dkm.containsListFor(CONST_2)); assertEquals(4, dkm.sizeOfListFor(CONST_2)); assertFalse(dkm.removeFromListFor(CONST_2, CONST_A)); assertTrue(dkm.removeFromListFor(CONST_2, CONST_D)); assertEquals(3, dkm.sizeOfListFor(CONST_2)); assertTrue(dkm.containsListFor(CONST_2)); assertTrue(dkm.removeFromListFor(CONST_2, CONST_E)); assertEquals(2, dkm.sizeOfListFor(CONST_2)); assertTrue(dkm.containsListFor(CONST_2)); assertTrue(dkm.removeFromListFor(CONST_2, null)); assertEquals(1, dkm.sizeOfListFor(CONST_2)); assertTrue(dkm.containsListFor(CONST_2)); assertTrue(dkm.removeFromListFor(CONST_2, CONST_D)); assertEquals(0, dkm.sizeOfListFor(CONST_2)); assertFalse(dkm.containsListFor(CONST_2)); // Test null stuff :) assertFalse(dkm.removeFromListFor(null, CONST_A)); assertTrue(dkm.containsListFor(null)); assertEquals(1, dkm.sizeOfListFor(null)); assertFalse(dkm.removeFromListFor(null, CONST_A)); assertTrue(dkm.removeFromListFor(null, CONST_F)); assertEquals(0, dkm.sizeOfListFor(null)); assertFalse(dkm.containsListFor(null)); } @Test public void testContainsInList() { assertFalse(dkm.containsInList(CONST_1B, CONST_D)); populate(); assertTrue(dkm.containsInList(CONST_1B, CONST_B)); // Keys are instance assertFalse(dkm.containsInList(new Integer(1), CONST_B)); assertTrue(dkm.containsInList(CONST_1B, CONST_B)); assertTrue(dkm.containsInList(CONST_1B, CONST_C)); assertFalse(dkm.containsInList(CONST_1B, CONST_D)); // add a second :) dkm.addToListFor(CONST_1B, CONST_C); assertTrue(dkm.containsInList(CONST_1B, CONST_C)); // Test null stuff :) assertTrue(dkm.containsInList(CONST_2, null)); assertFalse(dkm.containsInList(null, CONST_A)); assertTrue(dkm.containsInList(null, CONST_F)); } @Test public void testGetKeySet() { Set<Integer> s = dkm.getKeySet(); assertEquals(0, s.size()); s.add(Integer.valueOf(-5)); // Ensure not saved in DoubleKeyMap Set<Integer> s2 = dkm.getKeySet(); assertEquals(0, s2.size()); assertEquals(1, s.size()); // And ensure references are not kept the other direction to be altered // by changes in the underlying DoubleKeyMap populate(); assertEquals(1, s.size()); assertEquals(0, s2.size()); Set<Integer> s3 = dkm.getKeySet(); assertEquals(5, s3.size()); assertTrue(s3.contains(CONST_1A)); assertTrue(s3.contains(CONST_1B)); assertTrue(s3.contains(CONST_2)); assertTrue(s3.contains(CONST_5)); assertTrue(s3.contains(null)); } @Test public void testClearIsEmpty() { assertTrue(dkm.isEmpty()); assertEquals(0, dkm.size()); populate(); assertFalse(dkm.isEmpty()); assertEquals(5, dkm.size()); dkm.clear(); assertTrue(dkm.isEmpty()); assertEquals(0, dkm.size()); dkm.addToListFor(null, 'F'); assertFalse(dkm.isEmpty()); assertEquals(1, dkm.size()); dkm.clear(); assertTrue(dkm.isEmpty()); assertEquals(0, dkm.size()); dkm.addToListFor(Integer.valueOf(3), 'G'); assertFalse(dkm.isEmpty()); assertEquals(1, dkm.size()); dkm.clear(); assertTrue(dkm.isEmpty()); assertEquals(0, dkm.size()); dkm.addToListFor(CONST_5, null); assertFalse(dkm.isEmpty()); assertEquals(1, dkm.size()); dkm.clear(); assertTrue(dkm.isEmpty()); assertEquals(0, dkm.size()); } @Test public void testEmptyAddAll() { dkm.addAllToListFor(CONST_1A, null); assertFalse(dkm.containsListFor(CONST_1A)); dkm.addAllToListFor(CONST_1A, new ArrayList<Character>()); assertFalse(dkm.containsListFor(CONST_1A)); } @Test public void testAddAll() { List<Character> l = new ArrayList<Character>(); l.add(CONST_A); l.add(null); l.add(CONST_A); l.add(CONST_B); dkm.addAllToListFor(CONST_1A, l); assertTrue(dkm.containsListFor(CONST_1A)); assertEquals(4, dkm.sizeOfListFor(CONST_1A)); dkm.addToListFor(CONST_1A, CONST_D); assertEquals(4, l.size()); // Check reference semantics! l.add(CONST_C); l.add(CONST_E); assertTrue(dkm.containsListFor(CONST_1A)); assertEquals(5, dkm.sizeOfListFor(CONST_1A)); l.clear(); assertTrue(dkm.containsListFor(CONST_1A)); assertEquals(5, dkm.sizeOfListFor(CONST_1A)); } @Test public void testInstanceBehavior() { Character ca = Character.valueOf('a'); Character cb = Character.valueOf('b'); Character cc = Character.valueOf('c'); Character ca1 = new Character('a'); Integer i1 = CONST_1A; dkm.addToListFor(i1, ca); dkm.addToListFor(i1, cb); dkm.addToListFor(i1, cc); Integer i2 = CONST_2; dkm.addToListFor(i2, ca); dkm.addToListFor(i2, ca); Integer i3 = Integer.valueOf(3); dkm.addToListFor(i3, cb); dkm.addToListFor(i3, cc); assertTrue(dkm.containsInList(i1, ca)); assertTrue(dkm.containsInList(i1, ca1)); assertTrue(dkm.removeFromListFor(i1, ca1)); assertFalse(dkm.containsInList(i1, ca)); assertTrue(dkm.containsInList(i2, ca)); assertTrue(dkm.containsInList(i2, ca1)); assertTrue(dkm.removeFromListFor(i2, ca1)); // There were two assertTrue(dkm.containsInList(i2, ca)); assertTrue(dkm.removeFromListFor(i2, ca)); // There were two assertFalse(dkm.containsInList(i2, ca)); } @Test public void testAddAllLists() { HashMapToList<Integer, Character> dkm2 = new HashMapToList<Integer, Character>(); populate(); dkm2.addAllLists(dkm); assertTrue(dkm.removeFromListFor(CONST_1B, CONST_C)); assertTrue(dkm2.containsInList(CONST_1B, CONST_C)); assertTrue(dkm2.removeFromListFor(CONST_1B, CONST_B)); assertTrue(dkm.containsInList(CONST_1B, CONST_B)); dkm.removeListFor(CONST_1B); assertFalse(dkm.containsListFor(CONST_1B)); assertTrue(dkm2.containsListFor(CONST_1B)); } }