/*
* Copyright (c) 2010 Tom Parker <thpr@users.sourceforge.net>
*
* This library 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 library 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package pcgen.cdom.testsupport;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import junit.framework.TestCase;
import org.junit.Test;
import pcgen.cdom.enumeration.CharID;
import pcgen.cdom.enumeration.DataSetID;
import pcgen.cdom.facet.base.AbstractAssociationFacet;
public abstract class AbstractAssociationFacetTest<CT, ST> extends
TestCase
{
private CharID id;
private CharID altid;
ST oneSource = developSource(getTypeObj());
@Override
public void setUp() throws Exception
{
super.setUp();
DataSetID cid = DataSetID.getID();
id = CharID.getID(cid);
altid = CharID.getID(cid);
}
@Test
public void testObjUnsetZeroCount()
{
assertEquals(0, getFacet().getCount(id));
}
@Test
public void testObjUnsetEmpty()
{
assertTrue(getFacet().isEmpty(id));
}
@Test
public void testRemoveAllUnsetEmpty()
{
// Not particularly a test, just make sure it doesn't throw an exception
getFacet().removeAll(id);
}
@Test
public void testObjUnsetEmptySet()
{
assertNotNull(getFacet().getSet(id));
assertTrue(getFacet().getSet(id).isEmpty());
}
@Test
public void testTypeAddNullID()
{
ST source1 = developSource(getTypeObj());
try
{
getFacet().set(null, getTypeObj(), source1);
fail();
}
catch (IllegalArgumentException e)
{
// Yep!
}
testObjUnsetZeroCount();
testObjUnsetEmpty();
testObjUnsetEmptySet();
}
@Test
public void testObjAddNull()
{
ST source1 = developSource(getTypeObj());
try
{
getFacet().set(id, null, source1);
fail();
}
catch (IllegalArgumentException e)
{
// Yep!
}
testObjUnsetZeroCount();
testObjUnsetEmpty();
testObjUnsetEmptySet();
}
@Test
public void testObjAddNullSource()
{
CT t1 = getTypeObj();
try
{
getFacet().set(id, t1, null);
fail();
}
catch (IllegalArgumentException e)
{
// OK
}
assertEquals(0, getFacet().getCount(id));
assertTrue(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertTrue(getFacet().getSet(id).isEmpty());
}
@Test
public void testObjAddSingleGet()
{
CT t1 = getTypeObj();
ST source1 = developSource(t1);
getFacet().set(id, t1, source1);
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
// No cross-pollution
assertEquals(0, getFacet().getCount(altid));
assertTrue(getFacet().isEmpty(altid));
assertNotNull(getFacet().getSet(altid));
assertTrue(getFacet().getSet(altid).isEmpty());
}
@Test
public void testObjAddSingleSourceTwiceGet()
{
CT t1 = getTypeObj();
ST source1 = developSource(t1);
getFacet().set(id, t1, source1);
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
// Add same, still only once in set (and only one event)
getFacet().set(id, t1, source1);
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
}
@Test
public void testObjAddSingleTwiceTwoSourceGet()
{
CT t1 = getTypeObj();
ST source1 = developSource(t1);
ST source2 = developSource(t1);
getFacet().set(id, t1, source1);
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
// Add same, still only once in set (and only one event)
getFacet().set(id, t1, source2);
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
}
@Test
public void testObjAddMultGet()
{
CT t1 = getTypeObj();
ST source1 = developSource(t1);
getFacet().set(id, t1, source1);
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
Set<CT> setofone = getFacet().getSet(id);
assertNotNull(setofone);
assertEquals(1, setofone.size());
assertEquals(t1, setofone.iterator().next());
CT t2 = getTypeObj();
getFacet().set(id, t2, source1);
assertEquals(2, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
Set<CT> setoftwo = getFacet().getSet(id);
assertNotNull(setoftwo);
assertEquals(2, setoftwo.size());
assertTrue(setoftwo.contains(t1));
assertTrue(setoftwo.contains(t2));
}
@Test
public void testObjContains()
{
CT t1 = getTypeObj();
ST source1 = developSource(t1);
assertFalse(getFacet().contains(id, t1));
getFacet().set(id, t1, source1);
assertTrue(getFacet().contains(id, t1));
getFacet().remove(id, t1);
assertFalse(getFacet().contains(id, t1));
}
@Test
public void testObjRemoveUseless()
{
ST source1 = developSource(getTypeObj());
getFacet().remove(id, null);
testObjUnsetZeroCount();
testObjUnsetEmpty();
testObjUnsetEmptySet();
}
@Test
public void testObjAddSingleRemove()
{
CT t1 = getTypeObj();
ST source1 = developSource(t1);
getFacet().set(id, t1, source1);
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
// Remove
getFacet().remove(id, t1);
assertEquals(0, getFacet().getCount(id));
assertTrue(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertTrue(getFacet().getSet(id).isEmpty());
}
@Test
public void testObjAddUselessRemove()
{
CT t1 = getTypeObj();
ST source1 = developSource(t1);
getFacet().set(id, t1, source1);
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
// Useless Remove
getFacet().remove(id, getTypeObj());
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
}
@Test
public void testObjAddSingleTwiceRemove()
{
CT t1 = getTypeObj();
ST source1 = developSource(t1);
getFacet().set(id, t1, source1);
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
// Add same, still only once in set (but twice on that source)
getFacet().set(id, t1, source1);
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
// Only one Remove required to clear (source Set not source List)
getFacet().remove(id, t1);
testObjUnsetZeroCount();
testObjUnsetEmpty();
testObjUnsetEmptySet();
// Second remove useless
getFacet().remove(id, t1);
testObjUnsetZeroCount();
testObjUnsetEmpty();
testObjUnsetEmptySet();
}
@Test
public void testObjAddMultRemove()
{
CT t1 = getTypeObj();
ST source1 = developSource(t1);
CT t2 = getTypeObj();
getFacet().set(id, t1, source1);
getFacet().set(id, t2, source1);
getFacet().remove(id, t1);
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
Set<CT> setofone = getFacet().getSet(id);
assertNotNull(setofone);
assertEquals(1, setofone.size());
assertTrue(setofone.contains(t2));
}
@Test
public void testObjRemoveNullInnocent()
{
CT t1 = getTypeObj();
ST source1 = developSource(t1);
getFacet().set(id, t1, source1);
getFacet().remove(id, null);
}
@Test
public void testObjRemoveAll()
{
CT t1 = getTypeObj();
ST source1 = developSource(t1);
ST source2 = developSource(t1);
CT t2 = getTypeObj();
ST source3 = developSource(t2);
assertNotNull(getFacet().removeAll(id));
assertTrue(getFacet().removeAll(id).isEmpty());
getFacet().set(id, t1, source1);
getFacet().set(id, t1, source2);
getFacet().set(id, t2, source3);
Map<CT, ST> map = getFacet().removeAll(id);
assertNotNull(map);
assertEquals(2, map.size());
assertTrue(map.containsKey(t1));
assertTrue(map.containsKey(t2));
assertNotNull(map.get(t1));
assertNotNull(map.get(t2));
assertEquals(source2, map.get(t1));
assertEquals(source3, map.get(t2));
testObjUnsetZeroCount();
testObjUnsetEmpty();
testObjUnsetEmptySet();
}
@Test
public void testGetSetIndependence()
{
CT t1 = getTypeObj();
ST source1 = developSource(t1);
CT t2 = getTypeObj();
getFacet().set(id, t1, source1);
Set<CT> set = getFacet().getSet(id);
try
{
set.add(t2);
// If we can modify, then make sure it's independent of the
// getFacet()
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
}
catch (UnsupportedOperationException e)
{
// This is ok too
}
try
{
set.remove(t1);
// If we can modify, then make sure it's independent of the
// getFacet()
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
}
catch (UnsupportedOperationException e)
{
// This is ok too
}
List<CT> pct = new ArrayList<>();
pct.add(t1);
pct.add(t2);
try
{
set.addAll(pct);
// If we can modify, then make sure it's independent of the
// getFacet()
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
}
catch (UnsupportedOperationException e)
{
// This is ok too
}
try
{
set.removeAll(pct);
// If we can modify, then make sure it's independent of the
// getFacet()
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
}
catch (UnsupportedOperationException e)
{
// This is ok too
}
try
{
set.retainAll(new ArrayList<CT>());
// If we can modify, then make sure it's independent of the
// getFacet()
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
}
catch (UnsupportedOperationException e)
{
// This is ok too
}
getFacet().set(id, t1, source1);
try
{
set.clear();
// If we can modify, then make sure it's independent of the
// getFacet()
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
}
catch (UnsupportedOperationException e)
{
// This is ok too
}
}
@Test
public void testCopyContentsNone()
{
getFacet().copyContents(altid, id);
testObjUnsetZeroCount();
testObjUnsetEmpty();
testObjUnsetEmptySet();
}
@Test
public void testCopyContents()
{
CT t1 = getTypeObj();
ST source1 = developSource(t1);
CT t2 = getTypeObj();
getFacet().set(id, t1, source1);
getFacet().set(id, t2, source1);
assertEquals(2, getFacet().getCount(id));
assertEquals(0, getFacet().getCount(altid));
getFacet().copyContents(id, altid);
assertEquals(2, getFacet().getCount(altid));
assertFalse(getFacet().isEmpty(altid));
Set<CT> setoftwo = getFacet().getSet(altid);
assertNotNull(setoftwo);
assertEquals(2, setoftwo.size());
assertTrue(setoftwo.contains(t1));
assertTrue(setoftwo.contains(t2));
// Prove independence (remove from id)
getFacet().remove(id, t1);
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
Set<CT> setofone = getFacet().getSet(id);
assertNotNull(setofone);
assertEquals(1, setofone.size());
assertTrue(setofone.contains(t2));
assertEquals(2, getFacet().getCount(altid));
assertFalse(getFacet().isEmpty(altid));
setoftwo = getFacet().getSet(altid);
assertNotNull(setoftwo);
assertEquals(2, setoftwo.size());
assertTrue(setoftwo.contains(t1));
assertTrue(setoftwo.contains(t2));
// Prove Independence (remove from altid)
getFacet().remove(altid, t2);
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
setofone = getFacet().getSet(id);
assertNotNull(setofone);
assertEquals(1, setofone.size());
assertTrue(setofone.contains(t2));
assertEquals(1, getFacet().getCount(altid));
assertFalse(getFacet().isEmpty(altid));
setofone = getFacet().getSet(altid);
assertNotNull(setofone);
assertEquals(1, setofone.size());
assertTrue(setofone.contains(t1));
}
@Test
public void testObjAddSingleTwiceRemoveUnsourced()
{
CT t1 = getTypeObj();
ST source1 = developSource(t1);
getFacet().set(id, t1, source1);
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
// Add same, still only once in set (but twice on that source)
getFacet().set(id, t1, source1);
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
// Only one Remove required to clear (source Set not source List)
getFacet().remove(id, t1);
testObjUnsetZeroCount();
testObjUnsetEmpty();
testObjUnsetEmptySet();
// Second remove useless
getFacet().remove(id, t1);
testObjUnsetZeroCount();
testObjUnsetEmpty();
testObjUnsetEmptySet();
}
@Test
public void testObjAddTwoSourcesTwiceRemoveUnsourced()
{
CT t1 = getTypeObj();
ST source1 = developSource(t1);
ST source2 = developSource(t1);
getFacet().set(id, t1, source1);
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
// Add same, still only once in set (but twice on that source)
getFacet().set(id, t1, source2);
assertEquals(1, getFacet().getCount(id));
assertFalse(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(1, getFacet().getSet(id).size());
assertEquals(t1, getFacet().getSet(id).iterator().next());
// Only one Remove required to clear (source Set not source List)
getFacet().remove(id, t1);
testObjUnsetZeroCount();
testObjUnsetEmpty();
testObjUnsetEmptySet();
// Second remove useless
getFacet().remove(id, t1);
testObjUnsetZeroCount();
testObjUnsetEmpty();
testObjUnsetEmptySet();
}
@Test
public void testObjGetSource()
{
CT t1 = getTypeObj();
assertNull(getFacet().get(id, t1));
ST source1 = developSource(t1);
ST source2 = developSource(t1);
getFacet().set(id, t1, source1);
assertEquals(source1, getFacet().get(id, t1));
// Add same, still only once in set (but twice on that source)
getFacet().set(id, t1, source2);
assertEquals(source2, getFacet().get(id, t1));
// Only one Remove required to clear (source Set not source List)
getFacet().remove(id, t1);
testObjUnsetZeroCount();
testObjUnsetEmpty();
testObjUnsetEmptySet();
assertNull(getFacet().get(id, t1));
// Second remove useless
getFacet().remove(id, t1);
testObjUnsetZeroCount();
testObjUnsetEmpty();
testObjUnsetEmptySet();
assertNull(getFacet().get(id, t1));
}
protected abstract CT getTypeObj();
protected abstract AbstractAssociationFacet<CharID, CT, ST> getFacet();
protected abstract ST developSource(CT obj);
}