/* * Copyright (c) 2009 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.facet; import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.FormulaFactory; import pcgen.cdom.enumeration.CharID; import pcgen.cdom.enumeration.DataSetID; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.facet.analysis.NonAbilityFacet; import pcgen.cdom.facet.analysis.NonStatStatFacet; import pcgen.cdom.facet.analysis.NonStatToStatFacet; import pcgen.cdom.facet.analysis.StatLockFacet; import pcgen.cdom.facet.analysis.UnlockedStatFacet; import pcgen.cdom.facet.model.RaceFacet; import pcgen.cdom.facet.model.TemplateFacet; import pcgen.cdom.helper.StatLock; import pcgen.cdom.reference.CDOMDirectSingleRef; import pcgen.core.PCStat; import pcgen.core.PCTemplate; import pcgen.core.Race; import org.junit.Before; import org.junit.Test; import plugin.lsttokens.testsupport.BuildUtilities; import static org.junit.Assert.*; public class StatIntegrationTest { /* * NOTE: This is not literal unit testing - it is leveraging the existing * RaceFacet and TemplateFacet frameworks. This class trusts that * RaceFacetTest and TemplateFacetTest has fully vetted RaceFacet and * TemplateFacet. PLEASE ensure all tests there are working before * investigating tests here. */ private CharID id; private CharID altid; private UnlockedStatFacet unlockedFacet; private StatLockFacet lockFacet; private NonAbilityFacet nonAbilityFacet; private RaceFacet rfacet; private TemplateFacet tfacet; private PCStat stat1; private PCStat stat2; private final Object tsource = new Object(); @Before public void setUp() throws Exception { DataSetID cid = DataSetID.getID(); id = CharID.getID(cid); altid = CharID.getID(cid); stat1 = BuildUtilities.createStat("Stat1", "Stat1"); stat2 = BuildUtilities.createStat("Stat2", "Stat2"); unlockedFacet = new UnlockedStatFacet(); lockFacet = new StatLockFacet(); lockFacet.setFormulaResolvingFacet(new FormulaResolvingFacet()); nonAbilityFacet = new NonAbilityFacet(); NonStatStatFacet nonStatStatFacet = new NonStatStatFacet(); nonAbilityFacet.setNonStatStatFacet(nonStatStatFacet); NonStatToStatFacet nonStatToStatFacet = new NonStatToStatFacet(); nonAbilityFacet.setNonStatToStatFacet(nonStatToStatFacet); rfacet = new RaceFacet(); tfacet = new TemplateFacet(); CDOMObjectConsolidationFacet cdomFacet = new CDOMObjectConsolidationFacet(); CDOMObjectBridge bridge = new CDOMObjectBridge(); cdomFacet.setBridgeFacet(bridge); rfacet.addDataFacetChangeListener(cdomFacet); tfacet.addDataFacetChangeListener(cdomFacet); cdomFacet.addDataFacetChangeListener(lockFacet); cdomFacet.addDataFacetChangeListener(unlockedFacet); cdomFacet.addDataFacetChangeListener(nonStatStatFacet); cdomFacet.addDataFacetChangeListener(nonStatToStatFacet); } @Test public void testNonAbilityUnset() { assertFalse(nonAbilityFacet.isNonAbility(id, stat1)); assertFalse(nonAbilityFacet.isNonAbility(id, stat2)); assertFalse(nonAbilityFacet.isNonAbility(altid, stat1)); assertFalse(nonAbilityFacet.isNonAbility(altid, stat2)); } @Test public void testLockUnset() { assertNull(lockFacet.getLockedStat(id, stat1)); assertNull(lockFacet.getLockedStat(id, stat2)); } /* * TODO Would be nice to get rid of this conditional - should be easier once * StatFacet actually contains the stat values. */ @Test public void testLockUnsetConditional() { if (!unlockedFacet.contains(id, stat1)) { assertNull(lockFacet.getLockedStat(id, stat1)); } if (!unlockedFacet.contains(id, stat2)) { assertNull(lockFacet.getLockedStat(id, stat2)); } } @Test public void testWithNothingInRace() { Race r = new Race(); rfacet.set(id, r); testNonAbilityUnset(); testLockUnset(); } @Test public void testLockNonAbilityInRace() { Race r = new Race(); causeLockNonAbility(r, stat1); rfacet.set(id, r); assertFalse(nonAbilityFacet.isNonAbility(id, stat2)); assertTrue(nonAbilityFacet.isNonAbility(id, stat1)); assertFalse(nonAbilityFacet.isNonAbility(altid, stat1)); // Make sure cleans up when race changed rfacet.set(id, new Race()); testNonAbilityUnset(); testLockUnset(); } @Test public void testLockInRace() { Race r = new Race(); causeLock(r, stat1, 14); rfacet.set(id, r); testNonAbilityUnset(); assertEquals(14, lockFacet.getLockedStat(id, stat1)); assertNull(lockFacet.getLockedStat(id, stat2)); // Make sure cleans up when race changed rfacet.set(id, new Race()); testNonAbilityUnset(); testLockUnset(); } @Test public void testUnlockOverrideNonAbilityLockSimple() { Race r1 = new Race(); causeLockNonAbility(r1, stat2); causeUnLockNonAbility(r1, stat2); rfacet.set(id, r1); testNonAbilityUnset(); testLockUnsetConditional(); } @Test public void testUnlockOverrideLockSimple() { Race r1 = new Race(); causeLock(r1, stat2, 14); causeUnlock(r1, stat2); rfacet.set(id, r1); testNonAbilityUnset(); testLockUnsetConditional(); } @Test public void testUnlockInnocent() { CDOMObject r1 = new Race(); causeUnlock(r1, stat2); testNonAbilityUnset(); testLockUnset(); } @Test public void testLockNonAbilityInTemplate() { Race r = new Race(); rfacet.set(id, r); testNonAbilityUnset(); PCTemplate t1 = new PCTemplate(); causeLockNonAbility(t1, stat1); tfacet.add(id, t1, tsource); assertFalse(nonAbilityFacet.isNonAbility(id, stat2)); assertTrue(nonAbilityFacet.isNonAbility(id, stat1)); assertFalse(nonAbilityFacet.isNonAbility(altid, stat1)); // Make sure cleans up when template removed tfacet.remove(id, t1, tsource); testNonAbilityUnset(); testLockUnset(); } @Test public void testLockComplex() { Race r = new Race(); causeLock(r, stat1, 14); rfacet.set(id, r); testNonAbilityUnset(); assertEquals(14, lockFacet.getLockedStat(id, stat1)); assertNull(lockFacet.getLockedStat(id, stat2)); PCTemplate t1 = new PCTemplate(); causeLock(t1, stat1, 15); tfacet.add(id, t1, tsource); testNonAbilityUnset(); assertEquals(15, lockFacet.getLockedStat(id, stat1)); assertNull(lockFacet.getLockedStat(id, stat2)); // Make sure cleans up when template removed tfacet.remove(id, t1, tsource); testNonAbilityUnset(); assertEquals(14, lockFacet.getLockedStat(id, stat1)); assertNull(lockFacet.getLockedStat(id, stat2)); } @Test public void testNonStatToStatOverrideNonAbilityLockComplex() { testNonAbilityUnset(); Race r = new Race(); causeLockNonAbility(r, stat1); rfacet.set(id, r); PCTemplate t1 = new PCTemplate(); causeUnLockNonAbility(t1, stat1); tfacet.add(id, t1, tsource); testNonAbilityUnset(); testLockUnsetConditional(); } @Test public void testUnlockOverrideLockComplex() { testNonAbilityUnset(); Race r = new Race(); causeLock(r, stat1, 13); rfacet.set(id, r); PCTemplate t1 = new PCTemplate(); causeUnlock(t1, stat1); tfacet.add(id, t1, tsource); testNonAbilityUnset(); testLockUnsetConditional(); } @Test public void testUnlockNotOverrideNonAbilityLockComplex() { testNonAbilityUnset(); Race r = new Race(); causeLockNonAbility(r, stat1); rfacet.set(id, r); assertTrue(nonAbilityFacet.isNonAbility(id, stat1)); PCTemplate t1 = new PCTemplate(); causeUnlock(t1, stat1); tfacet.add(id, t1, tsource); assertTrue(nonAbilityFacet.isNonAbility(id, stat1)); } private static void causeLockNonAbility(CDOMObject r, PCStat stat) { r.addToListFor(ListKey.NONSTAT_STATS, CDOMDirectSingleRef.getRef(stat)); } private static void causeUnLockNonAbility(CDOMObject r, PCStat stat) { r.addToListFor(ListKey.NONSTAT_TO_STAT_STATS, CDOMDirectSingleRef.getRef(stat)); } private static void causeLock(CDOMObject r, PCStat stat, int i) { StatLock sl = new StatLock(CDOMDirectSingleRef.getRef(stat), FormulaFactory.getFormulaFor(i)); r.addToListFor(ListKey.STAT_LOCKS, sl); } private static void causeUnlock(CDOMObject r, PCStat stat) { r.addToListFor(ListKey.UNLOCKED_STATS, CDOMDirectSingleRef.getRef(stat)); } }