package pcgen.cdom.testsupport; import java.util.ArrayList; import java.util.Collection; import java.util.List; import junit.framework.TestCase; import org.junit.Test; import pcgen.cdom.content.CNAbility; import pcgen.cdom.content.CNAbilityFactory; import pcgen.cdom.enumeration.CharID; import pcgen.cdom.enumeration.DataSetID; import pcgen.cdom.enumeration.Nature; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.facet.base.AbstractCNASEnforcingFacet; import pcgen.cdom.facet.event.DataFacetChangeEvent; import pcgen.cdom.facet.event.DataFacetChangeListener; import pcgen.cdom.helper.CNAbilitySelection; import pcgen.cdom.helper.CNAbilitySelectionUtilities; import pcgen.cdom.reference.CDOMDirectSingleRef; import pcgen.core.Ability; import pcgen.core.AbilityCategory; public abstract class AbstractCNASEnforcingFacetTest extends TestCase { CharID id; CharID altid; AbilityCategory feat; AbilityCategory fighterfeat; AbilityCategory specialty; Ability nomult; Ability multyes; Ability stackyes; Ability othernomult; private Listener listener = new Listener(); protected Object oneSource = new Object(); private class Listener implements DataFacetChangeListener<CharID, CNAbilitySelection> { public int addEventCount; public int removeEventCount; @Override public void dataAdded( DataFacetChangeEvent<CharID, CNAbilitySelection> dfce) { addEventCount++; } @Override public void dataRemoved( DataFacetChangeEvent<CharID, CNAbilitySelection> dfce) { removeEventCount++; } } protected void assertEventCount(int a, int r) { assertEquals(a, listener.addEventCount); assertEquals(r, listener.removeEventCount); } @Override protected void setUp() throws Exception { super.setUp(); getFacet().addDataFacetChangeListener(listener); CNAbilityFactory.reset(); DataSetID cid = DataSetID.getID(); id = CharID.getID(cid); altid = CharID.getID(cid); feat = new AbilityCategory(); feat.setName("FEAT"); fighterfeat = new AbilityCategory(); fighterfeat.setName("Fighter Feat"); fighterfeat.setAbilityCategory(CDOMDirectSingleRef.getRef(feat)); specialty = new AbilityCategory(); specialty.setName("Specialty"); nomult = new Ability(); nomult.setName("NoMult"); nomult.setCDOMCategory(feat); multyes = new Ability(); multyes.setName("MultYes"); multyes.setCDOMCategory(feat); multyes.put(ObjectKey.MULTIPLE_ALLOWED, true); stackyes = new Ability(); stackyes.setName("MultYes"); stackyes.setCDOMCategory(feat); stackyes.put(ObjectKey.MULTIPLE_ALLOWED, true); stackyes.put(ObjectKey.STACKS, true); othernomult = new Ability(); othernomult.setName("OtherNoMult"); othernomult.setCDOMCategory(feat); } @Test public void testTypeUnsetZeroCount() { assertEquals(0, getFacet().getCount(id)); } @Test public void testTypeUnsetEmpty() { assertTrue(getFacet().isEmpty(id)); } @Test public void testTypeUnsetEmptySet() { assertNotNull(getFacet().getSet(id)); assertTrue(getFacet().getSet(id).isEmpty()); } @Test public void testTypeAddNull() { Object source1 = new Object(); try { getFacet().add(id, null, source1); fail(); } catch (IllegalArgumentException e) { // Yep! } testTypeUnsetZeroCount(); testTypeUnsetEmpty(); testTypeUnsetEmptySet(); assertEventCount(0, 0); } @Test public void testTypeAddNullID() { Object source1 = new Object(); //Remove to try to avoid any event being formed getFacet().removeDataFacetChangeListener(listener); try { getFacet().add(null, getObject(), source1); fail(); } catch (IllegalArgumentException e) { // Yep! } testTypeUnsetZeroCount(); testTypeUnsetEmpty(); testTypeUnsetEmptySet(); assertEventCount(0, 0); } @Test public void testTypeAddNullSource() { //Remove to try to avoid any event being formed getFacet().removeDataFacetChangeListener(listener); try { getFacet().add(id, getObject(), null); fail(); } catch (IllegalArgumentException e) { // Yep! } testTypeUnsetZeroCount(); testTypeUnsetEmpty(); testTypeUnsetEmptySet(); assertEventCount(0, 0); } @Test public void testTypeAddSingleGet() { Object source1 = new Object(); CNAbilitySelection t1 = getObject(); getFacet().add(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()); assertEventCount(1, 0); // No cross-pollution assertEquals(0, getFacet().getCount(altid)); assertTrue(getFacet().isEmpty(altid)); assertNotNull(getFacet().getSet(altid)); assertTrue(getFacet().getSet(altid).isEmpty()); } @Test public void testTypeAddSingleSourceTwiceGet() { Object source1 = new Object(); CNAbilitySelection t1 = getObject(); getFacet().add(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()); assertEventCount(1, 0); // Add same, still only once in set (and only one event) getFacet().add(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()); assertEventCount(1, 0); } @Test public void testTypeAddSingleTwiceTwoSourceGet() { Object source1 = new Object(); Object source2 = new Object(); CNAbilitySelection t1 = getObject(); getFacet().add(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()); assertEventCount(1, 0); // Add same, still only once in set (and only one event) getFacet().add(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()); assertEventCount(1, 0); } @Test public void testTypeAddMultGet() { Object source1 = new Object(); CNAbilitySelection t1 = getMultObject("English"); getFacet().add(id, t1, source1); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); Collection<CNAbilitySelection> setofone = getFacet().getSet(id); assertNotNull(setofone); assertEquals(1, setofone.size()); assertEquals(t1, setofone.iterator().next()); assertEventCount(1, 0); CNAbilitySelection t2 = getMultObject("German"); getFacet().add(id, t2, source1); assertEquals(2, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); Collection<CNAbilitySelection> setoftwo = getFacet().getSet(id); assertNotNull(setoftwo); assertEquals(2, setoftwo.size()); assertTrue(setoftwo.contains(t1)); assertTrue(setoftwo.contains(t2)); assertEventCount(2, 0); } @Test public void testTypeRemoveUseless() { Object source1 = new Object(); //Remove to try to avoid any event being formed getFacet().removeDataFacetChangeListener(listener); try { getFacet().add(null, getObject(), source1); //ignored } catch (IllegalArgumentException e) { // Yep this is good too! } testTypeUnsetZeroCount(); testTypeUnsetEmpty(); testTypeUnsetEmptySet(); assertEventCount(0, 0); } @Test public void testTypeRemoveUselessSource() { Object source1 = new Object(); CNAbilitySelection t1 = getObject(); getFacet().add(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()); assertEventCount(1, 0); Object source2 = new Object(); getFacet().remove(id, t1, source2); // No change (wrong source) 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()); assertEventCount(1, 0); } @Test public void testTypeAddSingleRemove() { Object source1 = new Object(); CNAbilitySelection t1 = getObject(); getFacet().add(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()); assertEventCount(1, 0); // Remove getFacet().remove(id, t1, source1); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); assertNotNull(getFacet().getSet(id)); assertTrue(getFacet().getSet(id).isEmpty()); assertEventCount(1, 1); } @Test public void testTypeAddUselessRemove() { Object source1 = new Object(); CNAbilitySelection t1 = getMultObject("English"); getFacet().add(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()); assertEventCount(1, 0); // Useless Remove getFacet().remove(id, getMultObject("German"), 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()); assertEventCount(1, 0); } @Test public void testTypeAddMultRemove() { Object source1 = new Object(); CNAbilitySelection t1 = getMultObject("English"); CNAbilitySelection t2 = getMultObject("German"); getFacet().add(id, t1, source1); getFacet().add(id, t2, source1); getFacet().remove(id, t1, source1); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); Collection<CNAbilitySelection> setofone = getFacet().getSet(id); assertNotNull(setofone); assertEquals(1, setofone.size()); assertTrue(setofone.contains(t2)); assertEventCount(2, 1); } @Test public void testGetSetIndependence() { Object source1 = new Object(); CNAbilitySelection t1 = getObject(); CNAbilitySelection t2 = getObject(); getFacet().add(id, t1, source1); Collection<CNAbilitySelection> set = getFacet().getSet(id); try { set.add(t2); // If we can modify, then make sure it's independent of the facet 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 facet 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<CNAbilitySelection> 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 facet 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 facet 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<CNAbilitySelection>()); // If we can modify, then make sure it's independent of the facet 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().add(id, t1, source1); try { set.clear(); // If we can modify, then make sure it's independent of the facet 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); testTypeUnsetZeroCount(); testTypeUnsetEmpty(); testTypeUnsetEmptySet(); } @Test public void testCopyContents() { Object source1 = new Object(); CNAbilitySelection t1 = getMultObject("English"); CNAbilitySelection t2 = getMultObject("German"); getFacet().add(id, t1, source1); getFacet().add(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)); Collection<CNAbilitySelection> 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, source1); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); Collection<CNAbilitySelection> 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, source1); 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 testDifferentCategory() { Object source1 = new Object(); assertTrue(getFacet().isEmpty(id)); assertEquals(0, getFacet().getCount(id)); CNAbility nomultCNA = CNAbilityFactory.getCNAbility(feat, Nature.NORMAL, nomult); Ability trickster = new Ability(); trickster.setName("NoMult"); trickster.setCDOMCategory(specialty); CNAbility othernomultCNA = CNAbilityFactory.getCNAbility(specialty, Nature.NORMAL, trickster); CNAbilitySelection cnas1 = new CNAbilitySelection(nomultCNA); CNAbilitySelection cnas2 = new CNAbilitySelection(othernomultCNA); assertTrue(getFacet().add(id, cnas1, source1)); assertFalse(getFacet().isEmpty(id)); assertEquals(1, getFacet().getCount(id)); assertTrue(getFacet().add(id, cnas2, source1)); assertEquals(2, getFacet().getCount(id)); assertTrue(getFacet().remove(id, cnas2, source1)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); //Useless remove assertFalse(getFacet().remove(id, cnas2, source1)); assertEquals(1, getFacet().getCount(id)); //Now a real remove assertTrue(getFacet().remove(id, cnas1, source1)); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); //Useless remove assertFalse(getFacet().remove(id, cnas2, source1)); } @Test public void testDifferentAbility() { Object source1 = new Object(); assertTrue(getFacet().isEmpty(id)); assertEquals(0, getFacet().getCount(id)); CNAbility nomultCNA = CNAbilityFactory.getCNAbility(feat, Nature.NORMAL, nomult); CNAbility othernomultCNA = CNAbilityFactory.getCNAbility(feat, Nature.NORMAL, othernomult); CNAbilitySelection cnas1 = new CNAbilitySelection(nomultCNA); CNAbilitySelection cnas2 = new CNAbilitySelection(othernomultCNA); assertTrue(getFacet().add(id, cnas1, source1)); assertFalse(getFacet().isEmpty(id)); assertEquals(1, getFacet().getCount(id)); assertTrue(getFacet().add(id, cnas2, source1)); assertEquals(2, getFacet().getCount(id)); assertTrue(getFacet().remove(id, cnas2, source1)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertTrue(getFacet().remove(id, cnas1, source1)); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); } @Test public void testDifferentNature() { Object source1 = new Object(); assertTrue(getFacet().isEmpty(id)); assertEquals(0, getFacet().getCount(id)); CNAbility normal = CNAbilityFactory.getCNAbility(feat, Nature.NORMAL, nomult); CNAbility virtual = CNAbilityFactory.getCNAbility(feat, Nature.VIRTUAL, nomult); CNAbilitySelection cnas1 = new CNAbilitySelection(normal); CNAbilitySelection cnas2 = new CNAbilitySelection(virtual); assertFalse(CNAbilitySelectionUtilities.canCoExist(cnas1, cnas2)); assertTrue(getFacet().add(id, cnas1, source1)); assertFalse(getFacet().isEmpty(id)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().add(id, cnas2, source1)); assertEquals(1, getFacet().getCount(id)); //LIFO assertFalse(getFacet().remove(id, cnas2, source1)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertTrue(getFacet().remove(id, cnas1, source1)); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); assertTrue(getFacet().add(id, cnas1, source1)); assertFalse(getFacet().isEmpty(id)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().add(id, cnas2, source1)); assertEquals(1, getFacet().getCount(id)); //FIFO assertTrue(getFacet().remove(id, cnas1, source1)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertTrue(getFacet().remove(id, cnas2, source1)); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); } @Test public void testDetectSameParentCategory() { Object source1 = new Object(); assertTrue(getFacet().isEmpty(id)); assertEquals(0, getFacet().getCount(id)); CNAbility n1 = CNAbilityFactory.getCNAbility(feat, Nature.NORMAL, nomult); CNAbility n2 = CNAbilityFactory.getCNAbility(fighterfeat, Nature.NORMAL, nomult); CNAbilitySelection cnas1 = new CNAbilitySelection(n1); CNAbilitySelection cnas2 = new CNAbilitySelection(n2); assertTrue(getFacet().add(id, cnas1, source1)); assertFalse(getFacet().isEmpty(id)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().add(id, cnas2, source1)); assertEquals(1, getFacet().getCount(id)); //LIFO assertFalse(getFacet().remove(id, cnas2, source1)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertTrue(getFacet().remove(id, cnas1, source1)); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); assertTrue(getFacet().add(id, cnas1, source1)); assertFalse(getFacet().isEmpty(id)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().add(id, cnas2, source1)); assertEquals(1, getFacet().getCount(id)); //FIFO assertTrue(getFacet().remove(id, cnas1, source1)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertTrue(getFacet().remove(id, cnas2, source1)); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); CNAbility virtual = CNAbilityFactory.getCNAbility(fighterfeat, Nature.VIRTUAL, nomult); CNAbilitySelection cnas3 = new CNAbilitySelection(virtual); assertTrue(getFacet().add(id, cnas1, source1)); assertFalse(getFacet().isEmpty(id)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().add(id, cnas3, source1)); assertEquals(1, getFacet().getCount(id)); //LIFO assertFalse(getFacet().remove(id, cnas3, source1)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertTrue(getFacet().remove(id, cnas1, source1)); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); assertTrue(getFacet().add(id, cnas1, source1)); assertFalse(getFacet().isEmpty(id)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().add(id, cnas3, source1)); assertEquals(1, getFacet().getCount(id)); //FIFO assertTrue(getFacet().remove(id, cnas1, source1)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertTrue(getFacet().remove(id, cnas3, source1)); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); //Three, Midoutfirst assertTrue(getFacet().add(id, cnas1, source1)); assertFalse(getFacet().add(id, cnas2, source1)); assertFalse(getFacet().add(id, cnas3, source1)); assertFalse(getFacet().remove(id, cnas2, source1)); assertEquals(1, getFacet().getCount(id)); assertTrue(getFacet().remove(id, cnas1, source1)); assertEquals(1, getFacet().getCount(id)); assertTrue(getFacet().remove(id, cnas3, source1)); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); //Test different source (LIFO) Object source2 = new Object(); assertTrue(getFacet().add(id, cnas1, source1)); assertFalse(getFacet().add(id, cnas1, source2)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().remove(id, cnas1, source2)); assertEquals(1, getFacet().getCount(id)); assertTrue(getFacet().remove(id, cnas1, source1)); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); //Test different source (FIFO - counter-intuitive) assertTrue(getFacet().add(id, cnas1, source1)); assertFalse(getFacet().add(id, cnas1, source2)); assertEquals(1, getFacet().getCount(id)); //Note: This is FALSE since the CNAS didn't change - don't want to fire an event assertFalse(getFacet().remove(id, cnas1, source1)); assertEquals(1, getFacet().getCount(id)); assertTrue(getFacet().remove(id, cnas1, source2)); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); } @Test public void testDetectSameSelection() { Object source1 = new Object(); assertTrue(getFacet().isEmpty(id)); assertEquals(0, getFacet().getCount(id)); //Note: This is also an identity tests CNAbility n1 = CNAbilityFactory.getCNAbility(feat, Nature.NORMAL, multyes); CNAbility n2 = CNAbilityFactory.getCNAbility(feat, Nature.NORMAL, multyes); CNAbilitySelection cnas1 = new CNAbilitySelection(n1, "English"); CNAbilitySelection cnas2 = new CNAbilitySelection(n2, "English"); assertTrue(getFacet().add(id, cnas1, source1)); assertFalse(getFacet().isEmpty(id)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().add(id, cnas2, source1)); assertEquals(1, getFacet().getCount(id)); //LIFO assertFalse(getFacet().remove(id, cnas2, source1)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertTrue(getFacet().remove(id, cnas1, source1)); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); assertTrue(getFacet().add(id, cnas1, source1)); assertFalse(getFacet().isEmpty(id)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().add(id, cnas2, source1)); assertEquals(1, getFacet().getCount(id)); //FIFO //This assertFalse is the identity test, since it *actually* removes cnas2 and thus returns false assertFalse(getFacet().remove(id, cnas1, source1)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertTrue(getFacet().remove(id, cnas2, source1)); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); } @Test public void testDifferentSelection() { Object source1 = new Object(); assertTrue(getFacet().isEmpty(id)); assertEquals(0, getFacet().getCount(id)); CNAbility n1 = CNAbilityFactory.getCNAbility(feat, Nature.NORMAL, multyes); CNAbility n2 = CNAbilityFactory.getCNAbility(feat, Nature.NORMAL, multyes); CNAbilitySelection cnas1 = new CNAbilitySelection(n1, "English"); CNAbilitySelection cnas2 = new CNAbilitySelection(n2, "German"); assertTrue(getFacet().add(id, cnas1, source1)); assertFalse(getFacet().isEmpty(id)); assertEquals(1, getFacet().getCount(id)); assertTrue(getFacet().add(id, cnas2, source1)); assertEquals(2, getFacet().getCount(id)); assertTrue(getFacet().remove(id, cnas2, source1)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertTrue(getFacet().remove(id, cnas1, source1)); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); } @Test public void testDifferentSelectionAndNature() { Object source1 = new Object(); assertTrue(getFacet().isEmpty(id)); assertEquals(0, getFacet().getCount(id)); CNAbility normal = CNAbilityFactory.getCNAbility(feat, Nature.NORMAL, multyes); CNAbility virtual = CNAbilityFactory.getCNAbility(feat, Nature.VIRTUAL, multyes); CNAbilitySelection cnas1 = new CNAbilitySelection(normal, "English"); CNAbilitySelection cnas2 = new CNAbilitySelection(virtual, "German"); assertTrue(getFacet().add(id, cnas1, source1)); assertFalse(getFacet().isEmpty(id)); assertEquals(1, getFacet().getCount(id)); assertTrue(getFacet().add(id, cnas2, source1)); assertEquals(2, getFacet().getCount(id)); assertTrue(getFacet().remove(id, cnas2, source1)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertTrue(getFacet().remove(id, cnas1, source1)); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); } @Test public void testDifferentSelectionStack() { Object source1 = new Object(); assertTrue(getFacet().isEmpty(id)); assertEquals(0, getFacet().getCount(id)); CNAbility n1 = CNAbilityFactory.getCNAbility(feat, Nature.NORMAL, stackyes); CNAbility n2 = CNAbilityFactory.getCNAbility(feat, Nature.NORMAL, stackyes); CNAbilitySelection cnas1 = new CNAbilitySelection(n1, "English"); CNAbilitySelection cnas2 = new CNAbilitySelection(n2, "German"); assertTrue(getFacet().add(id, cnas1, source1)); assertFalse(getFacet().isEmpty(id)); assertEquals(1, getFacet().getCount(id)); assertTrue(getFacet().add(id, cnas2, source1)); assertEquals(2, getFacet().getCount(id)); assertTrue(getFacet().remove(id, cnas2, source1)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertTrue(getFacet().remove(id, cnas1, source1)); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); } @Test public void testStack() { Object source1 = new Object(); assertTrue(getFacet().isEmpty(id)); assertEquals(0, getFacet().getCount(id)); CNAbility n1 = CNAbilityFactory.getCNAbility(feat, Nature.NORMAL, stackyes); CNAbility n2 = CNAbilityFactory.getCNAbility(feat, Nature.NORMAL, stackyes); CNAbilitySelection cnas1 = new CNAbilitySelection(n1, "English"); CNAbilitySelection cnas2 = new CNAbilitySelection(n2, "English"); assertTrue(getFacet().add(id, cnas1, source1)); assertFalse(getFacet().isEmpty(id)); assertEquals(1, getFacet().getCount(id)); assertTrue(getFacet().add(id, cnas2, source1)); assertEquals(2, getFacet().getCount(id)); assertTrue(getFacet().remove(id, cnas2, source1)); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertTrue(getFacet().remove(id, cnas1, source1)); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); } @Test public void testIdentity() { Object source1 = new Object(); assertTrue(getFacet().isEmpty(id)); assertEquals(0, getFacet().getCount(id)); CNAbility n1 = CNAbilityFactory.getCNAbility(feat, Nature.NORMAL, stackyes); CNAbility n2 = CNAbilityFactory.getCNAbility(feat, Nature.NORMAL, stackyes); CNAbility ff = CNAbilityFactory.getCNAbility(fighterfeat, Nature.NORMAL, stackyes); CNAbility virtual = CNAbilityFactory.getCNAbility(feat, Nature.VIRTUAL, stackyes); CNAbilitySelection cnas1 = new CNAbilitySelection(n1, "English"); CNAbilitySelection cnas2 = new CNAbilitySelection(n2, "English"); CNAbilitySelection cnas3 = new CNAbilitySelection(virtual, "English"); CNAbilitySelection cnas4 = new CNAbilitySelection(ff, "English"); //Check identity is .equals not == assertTrue(getFacet().add(id, cnas1, source1)); assertEquals(1, getFacet().getCount(id)); //Avoid false positives; assertFalse(getFacet().remove(id, cnas3, source1)); assertFalse(getFacet().remove(id, cnas4, source1)); //Should succeed (.equals identity) assertTrue(getFacet().remove(id, cnas2, source1)); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); } protected abstract AbstractCNASEnforcingFacet getFacet(); protected CNAbilitySelection getObject() { Ability a1 = new Ability(); a1.setName("Abil"); a1.setCDOMCategory(AbilityCategory.FEAT); return new CNAbilitySelection(CNAbilityFactory.getCNAbility(AbilityCategory.FEAT, Nature.VIRTUAL, a1)); } protected CNAbilitySelection getMultObject(String tgt) { Ability a1 = new Ability(); a1.setName("Abil"); a1.setCDOMCategory(AbilityCategory.FEAT); a1.put(ObjectKey.MULTIPLE_ALLOWED, true); return new CNAbilitySelection(CNAbilityFactory.getCNAbility(AbilityCategory.FEAT, Nature.VIRTUAL, a1), tgt); } //TODO Need to test events :/ }