/* * PreMultTest.java * Copyright 2004 (C) James Dempsey <jdempsey@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 * * Created on Sep 4, 2004 * * $Id$ * */ package pcgen.core.prereq; import junit.framework.Test; import junit.framework.TestSuite; import junit.textui.TestRunner; import pcgen.AbstractCharacterTestCase; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.enumeration.Type; import pcgen.core.Ability; import pcgen.core.AbilityCategory; import pcgen.core.Globals; import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; import pcgen.core.Skill; import pcgen.core.analysis.SkillRankControl; import pcgen.rules.context.LoadContext; import pcgen.util.TestHelper; import plugin.lsttokens.testsupport.BuildUtilities; import plugin.pretokens.parser.PreAbilityParser; import plugin.pretokens.parser.PreClassParser; import plugin.pretokens.parser.PreSkillParser; /** * <code>PreMultTest</code> tests that the PreMult class * is working correctly. * * * @author James Dempsey <jdempsey@users.sourceforge.net> */ public class PreMultTest extends AbstractCharacterTestCase { private Skill knowledge; private PCClass myClass; public static void main(final String[] args) { TestRunner.run(PreMultTest.class); } /** * @return Test */ public static Test suite() { return new TestSuite(PreMultTest.class); } /* (non-Javadoc) * @see junit.framework.TestCase#setUp() */ @Override protected void setUp() throws Exception { super.setUp(); final PlayerCharacter character = getCharacter(); myClass = new PCClass(); myClass.setName("My Class"); knowledge = new Skill(); Globals.getContext().unconditionallyProcess(knowledge, "CLASSES", "My Class"); knowledge.setName("KNOWLEDGE (ARCANA)"); TestHelper.addType(knowledge, "KNOWLEDGE.INT"); SkillRankControl.modRanks(8.0, myClass, true, character, knowledge); } /* (non-Javadoc) * @see junit.framework.TestCase#tearDown() */ @Override protected void tearDown() throws Exception { knowledge = null; super.tearDown(); } /** * Test to ensure that a character will fail a test * if it does not have the correct number of levels * in the class. * @throws Exception */ public void testCharWithMultipleSpellClasses() throws Exception { LoadContext context = Globals.getContext(); final PCClass pcClass = context.getReferenceContext().constructCDOMObject(PCClass.class, "MyClass"); context.unconditionallyProcess(pcClass, "SPELLSTAT", "CHA"); BuildUtilities.setFact(pcClass, "SpellType", "Arcane"); context.unconditionallyProcess(pcClass.getOriginalClassLevel(1), "CAST", "5,4"); final PCClass pcClass2 = context.getReferenceContext().constructCDOMObject(PCClass.class, "Other Class"); context.unconditionallyProcess(pcClass2, "SPELLSTAT", "INT"); BuildUtilities.setFact(pcClass2, "SpellType", "Arcane"); context.unconditionallyProcess(pcClass2.getOriginalClassLevel(1), "CAST", "5,4"); context.getReferenceContext().buildDerivedObjects(); context.getReferenceContext().resolveReferences(null); context.loadCampaignFacets(); final PlayerCharacter character = getCharacter(); setPCStat(character, cha, 12); setPCStat(character, intel, 12); character.incrementClassLevel(1, pcClass); character.incrementClassLevel(2, pcClass2); final PreClassParser producer = new PreClassParser(); final Prerequisite prereq = producer.parse("CLASS", "1,SPELLCASTER.Arcane,SPELLCASTER.Arcane=2", false, false); final PreMult test = new PreMult(); final int passes = test.passes(prereq, character, null); assertEquals(1, passes); } /** * Test to ensure that a number of feat test will * correctly require a number of separate feats in * any combination of two types. * @throws Exception */ public void testMultiFeats() throws Exception { final Ability metamagic1 = new Ability(); metamagic1.addToListFor(ListKey.TYPE, Type.getConstant("METAMAGIC")); metamagic1.setName("MM1"); metamagic1.put(StringKey.KEY_NAME, "MM1"); metamagic1.setCDOMCategory(AbilityCategory.FEAT); final Ability metamagic2 = new Ability(); metamagic2.addToListFor(ListKey.TYPE, Type.getConstant("METAMAGIC")); metamagic2.setName("MM2"); metamagic2.put(StringKey.KEY_NAME, "MM2"); metamagic2.setCDOMCategory(AbilityCategory.FEAT); final Ability metamagic3 = new Ability(); metamagic3.addToListFor(ListKey.TYPE, Type.getConstant("METAMAGIC")); metamagic3.setName("MM3"); metamagic3.put(StringKey.KEY_NAME, "MM3"); metamagic3.setCDOMCategory(AbilityCategory.FEAT); final Ability item1 = new Ability(); item1.addToListFor(ListKey.TYPE, Type.getConstant("ItemCreation")); item1.setName("IC1"); item1.put(StringKey.KEY_NAME, "IC1"); item1.setCDOMCategory(AbilityCategory.FEAT); final Ability item2 = new Ability(); item2.addToListFor(ListKey.TYPE, Type.getConstant("ItemCreation")); item2.setName("IC2"); item2.put(StringKey.KEY_NAME, "IC2"); item2.setCDOMCategory(AbilityCategory.FEAT); final Ability item3 = new Ability(); item3.addToListFor(ListKey.TYPE, Type.getConstant("ItemCreation")); item3.setName("IC3"); item3.put(StringKey.KEY_NAME, "IC3"); item3.setCDOMCategory(AbilityCategory.FEAT); final PlayerCharacter character = getCharacter(); final PreAbilityParser producer = new PreAbilityParser(); final Prerequisite prereq = producer.parse("FEAT", "3,TYPE=Metamagic,TYPE=ItemCreation", false, false); final PreMult test = new PreMult(); int passes = test.passes(prereq, character, null); assertEquals("No feats should not pass", 0, passes); addAbility(AbilityCategory.FEAT, metamagic1); passes = test.passes(prereq, character, null); assertEquals("One feat should not pass", 0, passes); addAbility(AbilityCategory.FEAT, metamagic2); passes = test.passes(prereq, character, null); assertEquals("Two feats should not pass", 0, passes); addAbility(AbilityCategory.FEAT, metamagic3); passes = test.passes(prereq, character, null); assertEquals("Three feats should pass", 1, passes); removeAbility(AbilityCategory.FEAT, metamagic3); addAbility(AbilityCategory.FEAT, item1); passes = test.passes(prereq, character, null); assertEquals("Three feats should pass", 1, passes); addAbility(AbilityCategory.FEAT, item2); addAbility(AbilityCategory.FEAT, item3); addAbility(AbilityCategory.FEAT, metamagic3); passes = test.passes(prereq, character, null); assertEquals("Six feats should pass", 1, passes); removeAbility(AbilityCategory.FEAT, metamagic3); removeAbility(AbilityCategory.FEAT, item3); removeAbility(AbilityCategory.FEAT, item2); removeAbility(AbilityCategory.FEAT, item1); removeAbility(AbilityCategory.FEAT, metamagic2); removeAbility(AbilityCategory.FEAT, metamagic1); } /** * Test to ensure that a number of skills test will * correctly require a number of separate skills at * the required level. * @throws Exception */ public void testMultiSkills() throws Exception { final PreSkillParser producer = new PreSkillParser(); final Prerequisite prereq = producer.parse("SKILL", "2,TYPE.Knowledge=4", false, false); final PlayerCharacter character = getCharacter(); boolean passes = PrereqHandler.passes(prereq, character, null); assertFalse("Should not pass 2 knowledge skill test with 1 skill", passes); final Skill extraKnow = new Skill(); Globals.getContext().unconditionallyProcess(extraKnow, "CLASSES", "MyClass"); extraKnow.setName("KNOWLEDGE (RELIGION)"); TestHelper.addType(extraKnow, "KNOWLEDGE.INT"); SkillRankControl.modRanks(5.0, myClass, true, character, extraKnow); passes = PrereqHandler.passes(prereq, character, null); assertTrue("Should pass 2 knowledge skill test with 2 skills", passes); } }