/* * 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.Set; import org.junit.Test; import pcgen.cdom.enumeration.CharID; import pcgen.cdom.facet.event.DataFacetChangeEvent; import pcgen.cdom.facet.event.DataFacetChangeListener; public abstract class AbstractExtractingFacetTest<S, T> extends AbstractSourcedListFacetTest<T> { protected abstract DataFacetChangeListener<CharID, S> getListener(); @Test public void testExtTypeAddNullSource() { Object source = new Object(); S t1 = getContainingObject(0); DataFacetChangeEvent<CharID, S> dfce = new DataFacetChangeEvent<>(id, t1, source, DataFacetChangeEvent.DATA_ADDED); getListener().dataAdded(dfce); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertNotNull(getFacet().getSet(id)); assertEquals(1, getFacet().getSet(id).size()); T tgt1 = getTargetObject(0); assertEquals(tgt1, 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 testExtTypeAddSingleGet() { Object source = new Object(); S t1 = getContainingObject(0); DataFacetChangeEvent<CharID, S> dfce = new DataFacetChangeEvent<>(id, t1, source, DataFacetChangeEvent.DATA_ADDED); getListener().dataAdded(dfce); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertNotNull(getFacet().getSet(id)); assertEquals(1, getFacet().getSet(id).size()); T tgt1 = getTargetObject(0); assertEquals(tgt1, 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 testExtTypeAddSingleSourceTwiceGet() { Object source = new Object(); S t1 = getContainingObject(0); DataFacetChangeEvent<CharID, S> dfce = new DataFacetChangeEvent<>(id, t1, source, DataFacetChangeEvent.DATA_ADDED); getListener().dataAdded(dfce); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertNotNull(getFacet().getSet(id)); assertEquals(1, getFacet().getSet(id).size()); T tgt1 = getTargetObject(0); assertEquals(tgt1, getFacet().getSet(id).iterator().next()); assertEventCount(1, 0); // Add same, still only once in set (and only one event) dfce = new DataFacetChangeEvent<>(id, t1, source, DataFacetChangeEvent.DATA_ADDED); getListener().dataAdded(dfce); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertNotNull(getFacet().getSet(id)); assertEquals(1, getFacet().getSet(id).size()); assertEquals(tgt1, getFacet().getSet(id).iterator().next()); assertEventCount(1, 0); } @Test public void testExtTypeAddSingleTwiceTwoSourceGet() { Object source = new Object(); S t1 = getContainingObject(0); DataFacetChangeEvent<CharID, S> dfce = new DataFacetChangeEvent<>(id, t1, source, DataFacetChangeEvent.DATA_ADDED); getListener().dataAdded(dfce); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertNotNull(getFacet().getSet(id)); assertEquals(1, getFacet().getSet(id).size()); T tgt1 = getTargetObject(0); assertEquals(tgt1, getFacet().getSet(id).iterator().next()); assertEventCount(1, 0); // Add same, still only once in set (and only one event) Object source2 = new Object(); dfce = new DataFacetChangeEvent<>(id, t1, source2, DataFacetChangeEvent.DATA_ADDED); getListener().dataAdded(dfce); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertNotNull(getFacet().getSet(id)); assertEquals(1, getFacet().getSet(id).size()); assertEquals(tgt1, getFacet().getSet(id).iterator().next()); assertEventCount(1, 0); } @Test public void testExtTypeAddMultGet() { Object source = new Object(); S t1 = getContainingObject(0); DataFacetChangeEvent<CharID, S> dfce = new DataFacetChangeEvent<>(id, t1, source, DataFacetChangeEvent.DATA_ADDED); getListener().dataAdded(dfce); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); Set<T> setofone = getFacet().getSet(id); assertNotNull(setofone); assertEquals(1, setofone.size()); T tgt1 = getTargetObject(0); assertEquals(tgt1, setofone.iterator().next()); assertEventCount(1, 0); dfce = new DataFacetChangeEvent<>(id, getContainingObject(1), source, DataFacetChangeEvent.DATA_ADDED); getListener().dataAdded(dfce); assertEquals(2, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); Set<T> setoftwo = getFacet().getSet(id); assertNotNull(setoftwo); assertEquals(2, setoftwo.size()); assertTrue(setoftwo.contains(getTargetObject(0))); assertTrue(setoftwo.contains(getTargetObject(1))); assertEventCount(2, 0); } @Test public void testExtTypeContains() { Object source1 = new Object(); S t1 = getContainingObject(0); DataFacetChangeEvent<CharID, S> dfce = new DataFacetChangeEvent<>(id, t1, source1, DataFacetChangeEvent.DATA_ADDED); T tgt1 = getTargetObject(0); assertFalse(getFacet().contains(id, tgt1)); getListener().dataAdded(dfce); assertTrue(getFacet().contains(id, tgt1)); dfce = new DataFacetChangeEvent<>(id, t1, source1, DataFacetChangeEvent.DATA_REMOVED); getListener().dataRemoved(dfce); assertFalse(getFacet().contains(id, tgt1)); } @Test public void testExtTypeRemoveUselessSource() { Object source1 = new Object(); S t1 = getContainingObject(0); S t2 = getContainingObject(1); DataFacetChangeEvent<CharID, S> dfce = new DataFacetChangeEvent<>(id, t1, source1, DataFacetChangeEvent.DATA_ADDED); getListener().dataAdded(dfce); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertNotNull(getFacet().getSet(id)); assertEquals(1, getFacet().getSet(id).size()); T tgt1 = getTargetObject(0); assertEquals(tgt1, getFacet().getSet(id).iterator().next()); assertEventCount(1, 0); dfce = new DataFacetChangeEvent<>(id, t2, source1, DataFacetChangeEvent.DATA_REMOVED); getListener().dataRemoved(dfce); // No change (wrong source) assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertNotNull(getFacet().getSet(id)); assertEquals(1, getFacet().getSet(id).size()); assertEquals(tgt1, getFacet().getSet(id).iterator().next()); assertEventCount(1, 0); } @Test public void testExtTypeAddSingleRemove() { Object source1 = new Object(); S t1 = getContainingObject(0); DataFacetChangeEvent<CharID, S> dfce = new DataFacetChangeEvent<>(id, t1, source1, DataFacetChangeEvent.DATA_ADDED); getListener().dataAdded(dfce); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertNotNull(getFacet().getSet(id)); assertEquals(1, getFacet().getSet(id).size()); T tgt1 = getTargetObject(0); assertEquals(tgt1, getFacet().getSet(id).iterator().next()); assertEventCount(1, 0); // Remove dfce = new DataFacetChangeEvent<>(id, t1, source1, DataFacetChangeEvent.DATA_REMOVED); getListener().dataRemoved(dfce); assertEquals(0, getFacet().getCount(id)); assertTrue(getFacet().isEmpty(id)); assertNotNull(getFacet().getSet(id)); assertTrue(getFacet().getSet(id).isEmpty()); assertEventCount(1, 1); } @Test public void testExtTypeAddUselessRemove() { Object source1 = new Object(); S t1 = getContainingObject(0); DataFacetChangeEvent<CharID, S> dfce = new DataFacetChangeEvent<>(id, t1, source1, DataFacetChangeEvent.DATA_ADDED); getListener().dataAdded(dfce); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertNotNull(getFacet().getSet(id)); assertEquals(1, getFacet().getSet(id).size()); T tgt1 = getTargetObject(0); assertEquals(tgt1, getFacet().getSet(id).iterator().next()); assertEventCount(1, 0); // Useless Remove dfce = new DataFacetChangeEvent<>(id, getContainingObject(1), source1, DataFacetChangeEvent.DATA_REMOVED); getListener().dataRemoved(dfce); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertNotNull(getFacet().getSet(id)); assertEquals(1, getFacet().getSet(id).size()); assertEquals(tgt1, getFacet().getSet(id).iterator().next()); assertEventCount(1, 0); } @Test public void testExtTypeAddSingleTwiceRemove() { Object source1 = new Object(); S t1 = getContainingObject(0); DataFacetChangeEvent<CharID, S> dfce = new DataFacetChangeEvent<>(id, t1, source1, DataFacetChangeEvent.DATA_ADDED); getListener().dataAdded(dfce); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertNotNull(getFacet().getSet(id)); assertEquals(1, getFacet().getSet(id).size()); T tgt1 = getTargetObject(0); assertEquals(tgt1, getFacet().getSet(id).iterator().next()); assertEventCount(1, 0); // Add same, still only once in set (but twice on that source) dfce = new DataFacetChangeEvent<>(id, t1, source1, DataFacetChangeEvent.DATA_ADDED); getListener().dataAdded(dfce); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); assertNotNull(getFacet().getSet(id)); assertEquals(1, getFacet().getSet(id).size()); assertEquals(tgt1, getFacet().getSet(id).iterator().next()); assertEventCount(1, 0); // Only one Remove required to clear (source Set not source List) dfce = new DataFacetChangeEvent<>(id, t1, source1, DataFacetChangeEvent.DATA_REMOVED); getListener().dataRemoved(dfce); testTypeUnsetZeroCount(); testTypeUnsetEmpty(); testTypeUnsetEmptySet(); assertEventCount(1, 1); // Second remove useless dfce = new DataFacetChangeEvent<>(id, t1, source1, DataFacetChangeEvent.DATA_REMOVED); getListener().dataRemoved(dfce); testTypeUnsetZeroCount(); testTypeUnsetEmpty(); testTypeUnsetEmptySet(); assertEventCount(1, 1); } @Test public void testExtTypeAddMultRemove() { Object source1 = new Object(); S t1 = getContainingObject(0); DataFacetChangeEvent<CharID, S> dfce = new DataFacetChangeEvent<>(id, t1, source1, DataFacetChangeEvent.DATA_ADDED); getListener().dataAdded(dfce); S t2 = getContainingObject(1); dfce = new DataFacetChangeEvent<>(id, t2, source1, DataFacetChangeEvent.DATA_ADDED); getListener().dataAdded(dfce); dfce = new DataFacetChangeEvent<>(id, t1, source1, DataFacetChangeEvent.DATA_REMOVED); getListener().dataRemoved(dfce); assertEquals(1, getFacet().getCount(id)); assertFalse(getFacet().isEmpty(id)); Set<T> setofone = getFacet().getSet(id); assertNotNull(setofone); assertEquals(1, setofone.size()); assertTrue(setofone.contains(getTargetObject(1))); assertEventCount(2, 1); } protected abstract S getContainingObject(int i); protected abstract T getTargetObject(int i); }