/*
* 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 AbstractConsolidatingFacetTest<ST, T> extends
AbstractSourcedListFacetTest<T>
{
protected abstract DataFacetChangeListener<CharID, ST> getListener();
protected abstract ST getSourceObject();
protected abstract T getConverted(ST t1);
protected boolean sourcedFromEvent()
{
return true;
}
@Test
public void testConTypeAddNullSource()
{
Object source = new Object();
ST t1 = getSourceObject();
DataFacetChangeEvent<CharID, ST> 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(getConverted(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 testConTypeAddSingleGet()
{
Object source = new Object();
ST t1 = getSourceObject();
DataFacetChangeEvent<CharID, ST> 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(getConverted(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 testConTypeAddSingleSourceTwiceGet()
{
Object source = new Object();
ST t1 = getSourceObject();
DataFacetChangeEvent<CharID, ST> 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(getConverted(t1), 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(getConverted(t1), getFacet().getSet(id).iterator().next());
assertEventCount(1, 0);
}
@Test
public void testConTypeAddSingleTwiceTwoSourceGet()
{
Object source = new Object();
ST t1 = getSourceObject();
DataFacetChangeEvent<CharID, ST> 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(getConverted(t1), 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(getConverted(t1), getFacet().getSet(id).iterator().next());
assertEventCount(1, 0);
}
@Test
public void testConTypeAddMultGet()
{
Object source = new Object();
ST t1 = getSourceObject();
DataFacetChangeEvent<CharID, ST> 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());
assertEquals(getConverted(t1), setofone.iterator().next());
assertEventCount(1, 0);
ST t2 = getSourceObject();
dfce =
new DataFacetChangeEvent<>(id, t2, 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(getConverted(t1)));
assertTrue(setoftwo.contains(getConverted(t2)));
assertEventCount(2, 0);
}
@Test
public void testConTypeContains()
{
Object source1 = new Object();
ST t1 = getSourceObject();
DataFacetChangeEvent<CharID, ST> dfce =
new DataFacetChangeEvent<>(id, t1, source1,
DataFacetChangeEvent.DATA_ADDED);
T obj1 = getConverted(t1);
assertFalse(getFacet().contains(id, obj1));
getListener().dataAdded(dfce);
assertTrue(getFacet().contains(id, obj1));
dfce =
new DataFacetChangeEvent<>(id, t1, source1,
DataFacetChangeEvent.DATA_REMOVED);
getListener().dataRemoved(dfce);
assertFalse(getFacet().contains(id, obj1));
}
@Test
public void testConTypeRemoveUselessSource()
{
Object source1 = new Object();
ST t1 = getSourceObject();
DataFacetChangeEvent<CharID, ST> 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(getConverted(t1), getFacet().getSet(id).iterator().next());
assertEventCount(1, 0);
Object source2 = new Object();
dfce =
new DataFacetChangeEvent<>(id, t1, source2,
DataFacetChangeEvent.DATA_REMOVED);
getListener().dataRemoved(dfce);
if (sourcedFromEvent())
{
// 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);
}
else
{
assertEquals(0, getFacet().getCount(id));
assertTrue(getFacet().isEmpty(id));
assertNotNull(getFacet().getSet(id));
assertEquals(0, getFacet().getSet(id).size());
assertEventCount(1, 1);
}
}
@Test
public void testConTypeAddSingleRemove()
{
Object source1 = new Object();
ST t1 = getSourceObject();
DataFacetChangeEvent<CharID, ST> 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(getConverted(t1), 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 testConTypeAddUselessRemove()
{
Object source1 = new Object();
ST t1 = getSourceObject();
DataFacetChangeEvent<CharID, ST> 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(getConverted(t1), getFacet().getSet(id).iterator().next());
assertEventCount(1, 0);
// Useless Remove
dfce =
new DataFacetChangeEvent<>(id, getSourceObject(), 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(getConverted(t1), getFacet().getSet(id).iterator().next());
assertEventCount(1, 0);
}
@Test
public void testConTypeAddSingleTwiceRemove()
{
Object source1 = new Object();
ST t1 = getSourceObject();
DataFacetChangeEvent<CharID, ST> 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(getConverted(t1), 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(getConverted(t1), 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 testConTypeAddMultRemove()
{
Object source1 = new Object();
ST t1 = getSourceObject();
DataFacetChangeEvent<CharID, ST> dfce =
new DataFacetChangeEvent<>(id, t1, source1,
DataFacetChangeEvent.DATA_ADDED);
getListener().dataAdded(dfce);
ST t2 = getSourceObject();
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(getConverted(t2)));
assertEventCount(2, 1);
}
}