/* * PlayerCharacterSpellTest.java * Copyright James Dempsey, 2012 * * 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 26/01/2012 11:09:46 AM * * $Id: PlayerCharacterSpellTest.java 19041 2013-01-06 18:52:59Z thpr $ */ package pcgen.core; import java.util.ArrayList; import java.util.Arrays; import pcgen.AbstractCharacterTestCase; import pcgen.cdom.content.fact.FactDefinition; import pcgen.persistence.SourceFileLoader; import pcgen.persistence.lst.CampaignSourceEntry; import pcgen.persistence.lst.GenericLoader; import pcgen.persistence.lst.PCClassLoader; import pcgen.rules.context.LoadContext; import pcgen.util.TestHelper; import plugin.lsttokens.testsupport.BuildUtilities; /** * The Class <code>ChallengeRatingPathfinderTest</code> checks the calculation * of challenge ratings for the Pathfinder RPG game mode * * <br/> * * @author Stefan Radermacher <zaister@users.sourceforge.net> */ public class ChallengeRatingPathfinderTest extends AbstractCharacterTestCase { private Race standardRace; private Race koboldRace; private Race drowNobleRace; private Race babauRace; private Race dryadRace; private Race companionRace; private Race zombieRace; private Race direRatRace; private Race miteRace; private Race beetleRace; private Race centipedeRace; private PCClass pcClass; private PCClass pcClass2; private PCClass npcClass; private PCClass npcClass2; private PCClass monsterClass; private PCClass companionClass; /** * Run the test * @param args don't need args apparently */ public static void main(final String[] args) { junit.textui.TestRunner.run(ChallengeRatingPathfinderTest.class); } @Override protected void additionalSetUp() throws Exception { SettingsHandler.getGame().setCRSteps("1/2|1/3|1/4|1/6|1/8"); SettingsHandler.getGame().setCRThreshold("BASECR"); SettingsHandler.getGame().setMonsterRoleList(new ArrayList<>(Arrays.asList("Combat", "Skill", "Druid"))); SettingsHandler.getGame().addClassType("PC CRFORMULA:CL ISMONSTER:NO CRMOD:-1 CRMODPRIORITY:1"); SettingsHandler.getGame().addClassType("NPC CRFORMULA:CL ISMONSTER:NO CRMOD:-2 CRMODPRIORITY:2"); SettingsHandler.getGame().addClassType("Monster CRFORMULA:0 ISMONSTER:YES"); SettingsHandler.getGame().addClassType("Companion CRFORMULA:NONE ISMONSTER:YES"); LoadContext context = Globals.getContext(); BuildUtilities.createFact(context, "ClassType", PCClass.class); SourceFileLoader.processFactDefinitions(context); CampaignSourceEntry source = TestHelper.createSource(getClass()); GenericLoader<Race> raceLoader = new GenericLoader<>(Race.class); PCClassLoader classLoader = new PCClassLoader(); final String standardRaceLine = "Standard Race"; raceLoader.parseLine(context, null, standardRaceLine, source); standardRace = context.getReferenceContext().silentlyGetConstructedCDOMObject(Race.class, "Standard Race"); final String koboldRaceLine = "Kobold CRMOD:NPC|-3"; raceLoader.parseLine(context, null, koboldRaceLine, source); koboldRace = context.getReferenceContext().silentlyGetConstructedCDOMObject(Race.class, "Kobold"); final String drowNobleLine = "Drow Noble CRMOD:PC.NPC|0"; raceLoader.parseLine(context, null, drowNobleLine, source); drowNobleRace = context.getReferenceContext().silentlyGetConstructedCDOMObject(Race.class, "Drow Noble"); final String babauLine = "Babau MONSTERCLASS:TestMonsterClass:7 CR:6 ROLE:Combat.Skill"; raceLoader.parseLine(context, null, babauLine, source); babauRace = context.getReferenceContext().silentlyGetConstructedCDOMObject(Race.class, "Babau"); final String dryadLine = "Dryad MONSTERCLASS:TestMonsterClass:8 CR:7 ROLE:Druid"; raceLoader.parseLine(context, null, dryadLine, source); dryadRace = context.getReferenceContext().silentlyGetConstructedCDOMObject(Race.class, "Dryad"); final String companionLine = "TestCompanion MONSTERCLASS:TestCompanionClass:4"; raceLoader.parseLine(context, null, companionLine, source); companionRace = context.getReferenceContext().silentlyGetConstructedCDOMObject(Race.class, "TestCompanion"); final String zombieLine = "Zombie MONSTERCLASS:TestMonsterClass:1 CR:1/2 ROLE:Combat"; raceLoader.parseLine(context, null, zombieLine, source); zombieRace = context.getReferenceContext().silentlyGetConstructedCDOMObject(Race.class, "Zombie"); final String direRatLine = "Dire Rat MONSTERCLASS:TestMonsterClass:1 CR:1/3 ROLE:Combat"; raceLoader.parseLine(context, null, direRatLine, source); direRatRace = context.getReferenceContext().silentlyGetConstructedCDOMObject(Race.class, "Dire rat"); final String miteLine = "Mite MONSTERCLASS:TestMonsterClass:1 CR:1/4 ROLE:Combat"; raceLoader.parseLine(context, null, miteLine, source); miteRace = context.getReferenceContext().silentlyGetConstructedCDOMObject(Race.class, "Mite"); final String beetleLine = "Beetle MONSTERCLASS:TestMonsterClass:1 CR:1/6 ROLE:Combat"; raceLoader.parseLine(context, null, beetleLine, source); beetleRace = context.getReferenceContext().silentlyGetConstructedCDOMObject(Race.class, "Beetle"); final String centipedeLine = "Centipede MONSTERCLASS:TestMonsterClass:1 CR:1/8 Centipede"; raceLoader.parseLine(context, null, centipedeLine, source); centipedeRace = context.getReferenceContext().silentlyGetConstructedCDOMObject(Race.class, "Centipede"); final String pcClassLine = "CLASS:TestPCClass TYPE:PC ROLE:Combat"; pcClass = classLoader.parseLine(context, null, pcClassLine, source); context.getReferenceContext().importObject(pcClass); final String pcClassLine2 = "CLASS:TestPCClass2 TYPE:PC ROLE:Druid"; pcClass2 = classLoader.parseLine(context, null, pcClassLine2, source); context.getReferenceContext().importObject(pcClass2); final String npcClassLine = "CLASS:TestNPCClass2 TYPE:NPC"; npcClass = classLoader.parseLine(context, null, npcClassLine, source); context.getReferenceContext().importObject(npcClass); final String npcClassLine2 = "CLASS:TestNPCClass2 TYPE:NPC"; npcClass2 = classLoader.parseLine(context, null, npcClassLine2, source); context.getReferenceContext().importObject(npcClass2); final String monsterClassLine = "CLASS:TestMonsterClass HD:8 CLASSTYPE:Monster"; monsterClass = classLoader.parseLine(context, null, monsterClassLine, source); context.getReferenceContext().importObject(monsterClass); final String companionClassLine = "CLASS:TestCompanionClass HD:8 CLASSTYPE:Companion"; companionClass = classLoader.parseLine(context, null, companionClassLine, source); context.getReferenceContext().importObject(companionClass); context.commit(); BuildUtilities.createFact(context, "ClassType", PCClass.class); FactDefinition<?, String> fd = BuildUtilities.createFact(context, "SpellType", PCClass.class); fd.setSelectable(true); SourceFileLoader.processFactDefinitions(context); context.getReferenceContext().buildDerivedObjects(); context.resolveDeferredTokens(); } /** * Test PC class level 1 => CR 1/2 * @throws Exception If an error occurs. */ public void testPCClassLevel1() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(standardRace); pc.incrementClassLevel(1, pcClass); assertEquals(SettingsHandler.getGame().getCRInteger("1/2"), pc.getDisplay().calcCR(), 0.0); } /** * Test PC class level 2 => CR 1/4 * @throws Exception If an error occurs. */ public void testPCClassLevel2() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(standardRace); pc.incrementClassLevel(2, pcClass); assertEquals(SettingsHandler.getGame().getCRInteger("1"), pc.getDisplay().calcCR(), 0.0); } /** * Test NPC class level 1 => CR 1/3 * @throws Exception If an error occurs. */ public void testNPCClassLevel1() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(standardRace); pc.incrementClassLevel(1, npcClass); assertEquals(SettingsHandler.getGame().getCRInteger("1/3"), pc.getDisplay().calcCR(), 0.01); } /** * Test NPC class level 2 => CR 1/2 * @throws Exception If an error occurs. */ public void testNPCClassLevel2() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(standardRace); pc.incrementClassLevel(2, npcClass); assertEquals(SettingsHandler.getGame().getCRInteger("1/2"), pc.getDisplay().calcCR(), 0.0); } /** * Test NPC class level 3 => CR 1 * @throws Exception If an error occurs. */ public void testNPCClassLevel3() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(standardRace); pc.incrementClassLevel(3, npcClass); assertEquals(SettingsHandler.getGame().getCRInteger("1"), pc.getDisplay().calcCR(), 0.0); } /** * Test PC class multiclass level 4/4 => CR 7 * @throws Exception If an error occurs. */ public void testMultiClassPCLevel4PCLevel4() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(standardRace); pc.incrementClassLevel(4, pcClass); pc.incrementClassLevel(4, pcClass2); assertEquals(SettingsHandler.getGame().getCRInteger("7"), pc.getDisplay().calcCR(), 0.0); } /** * Test NPC class multiclass level 4/4 => CR 6 * @throws Exception If an error occurs. */ public void testMultiClassNPCLevel4NPCLevel4() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(standardRace); pc.incrementClassLevel(4, npcClass); pc.incrementClassLevel(4, npcClass2); assertEquals(SettingsHandler.getGame().getCRInteger("6"), pc.getDisplay().calcCR(), 0.0); } /** * Test NPC/PC class multiclass level 4/4 => CR 7 * @throws Exception If an error occurs. */ public void testMultiClassNPCLevel4PCLevel4() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(standardRace); pc.incrementClassLevel(4, npcClass); pc.incrementClassLevel(4, pcClass); assertEquals(SettingsHandler.getGame().getCRInteger("7"), pc.getDisplay().calcCR(), 0.0); } /** * Test NPC class level 1, kobold (CRMOD:NPC|-3) => CR 1/4 * @throws Exception If an error occurs. */ public void testNPCClassKoboldLevel1() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(koboldRace); pc.incrementClassLevel(1, npcClass); assertEquals(SettingsHandler.getGame().getCRInteger("1/4"), pc.getDisplay().calcCR(), 0.0); } /** * Test NPC class level 2, kobold (CRMOD:NPC|-3) => CR 1/3 * @throws Exception If an error occurs. */ public void testNPCClassKoboldLevel2() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(koboldRace); pc.incrementClassLevel(2, npcClass); assertEquals(SettingsHandler.getGame().getCRInteger("1/3"), pc.getDisplay().calcCR(), 0.01); } /** * Test NPC class level 3, kobold (CRMOD:NPC|-3) => CR 1/2 * @throws Exception If an error occurs. */ public void testNPCClassKoboldLevel3() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(koboldRace); pc.incrementClassLevel(3, npcClass); assertEquals(SettingsHandler.getGame().getCRInteger("1/2"), pc.getDisplay().calcCR(), 0.0); } /** * Test NPC class level 4, kobold (CRMOD:NPC|-3) => CR 1 * @throws Exception If an error occurs. */ public void testNPCClassKoboldLevel4() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(koboldRace); pc.incrementClassLevel(4, npcClass); assertEquals(SettingsHandler.getGame().getCRInteger("1"), pc.getDisplay().calcCR(), 0.0); } /** * Test PC class level 4, kobold (CRMOD:NPC|-3) => CR 3 * @throws Exception If an error occurs. */ public void testPCClassKoboldLevel4() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(koboldRace); pc.incrementClassLevel(4, pcClass); assertEquals(SettingsHandler.getGame().getCRInteger("3"), pc.getDisplay().calcCR(), 0.0); } /** * Test PC class level 4, drow noble (CRMOD:PC.NPC|0) => CR 4 * @throws Exception If an error occurs. */ public void testPCClassDrowNobleLevel4() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(drowNobleRace); pc.incrementClassLevel(4, pcClass); assertEquals(SettingsHandler.getGame().getCRInteger("4"), pc.getDisplay().calcCR(), 0.0); } /** * Test NPC class level 4, drow noble (CRMOD:PC.NPC|0) => CR 4 * @throws Exception If an error occurs. */ public void testNPCClassDrowNobleLevel4() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(drowNobleRace); pc.incrementClassLevel(4, npcClass); assertEquals(SettingsHandler.getGame().getCRInteger("4"), pc.getDisplay().calcCR(), 0.0); } /** * Test PC class key level 4 babau => CR 10 * @throws Exception If an error occurs. */ public void testPCClassBabauKeyLevel4() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(babauRace); pc.incrementClassLevel(4, pcClass); assertEquals(SettingsHandler.getGame().getCRInteger("10"), pc.getDisplay().calcCR(), 0.0); } /** * Test PC class key level 4 babau => CR 8 * @throws Exception If an error occurs. */ public void testPCClassBabauNonKeyLevel4() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(babauRace); pc.incrementClassLevel(4, pcClass2); assertEquals(SettingsHandler.getGame().getCRInteger("8"), pc.getDisplay().calcCR(), 0.0); } /** * Test PC class key level 10 babau => CR 13 * @throws Exception If an error occurs. */ public void testPCClassBabauNonKeyLevel10() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(babauRace); pc.incrementClassLevel(10, pcClass2); assertEquals(SettingsHandler.getGame().getCRInteger("13"), pc.getDisplay().calcCR(), 0.0); } /** * Test PC class key level 8 dryad => CR 15 * @throws Exception If an error occurs. */ public void testPCClassDyradKeyLevel8() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(dryadRace); pc.incrementClassLevel(8, pcClass2); assertEquals(SettingsHandler.getGame().getCRInteger("15"), pc.getDisplay().calcCR(), 0.0); } /** * Test PC class non key level 8 dryad => CR 11 * @throws Exception If an error occurs. */ public void testPCClassDryadNonKeyLevel8() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(dryadRace); pc.incrementClassLevel(8, pcClass); assertEquals(SettingsHandler.getGame().getCRInteger("11"), pc.getDisplay().calcCR(), 0.0); } /** * Test Companion => CR 0 * @throws Exception If an error occurs. */ public void testCompanion() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(companionRace); pc.incrementClassLevel(4, companionClass); assertNull(pc.getDisplay().calcCR()); } /** * Test zombie => CR 1/2 * @throws Exception If an error occurs. */ public void testZombie() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(zombieRace); assertEquals(SettingsHandler.getGame().getCRInteger("1/2"), pc.getDisplay().calcCR(), 0.0); } /** * Test dire rat => CR 1/3 * @throws Exception If an error occurs. */ public void testDireRat() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(direRatRace); assertEquals(SettingsHandler.getGame().getCRInteger("1/3"), pc.getDisplay().calcCR(), 0.0); } /** * Test mite => CR 1/4 * @throws Exception If an error occurs. */ public void testMite() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(miteRace); assertEquals(SettingsHandler.getGame().getCRInteger("1/4"), pc.getDisplay().calcCR(), 0.0); } /** * Test beetle => CR 1/6 * @throws Exception If an error occurs. */ public void testBeetle() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(beetleRace); assertEquals(SettingsHandler.getGame().getCRInteger("1/6"), pc.getDisplay().calcCR(), 0.0); } /** * Test centipede => CR 1/8 * @throws Exception If an error occurs. */ public void testCentipede() throws Exception { PlayerCharacter pc = getCharacter(); pc.setRace(centipedeRace); assertEquals(SettingsHandler.getGame().getCRInteger("1/8"), pc.getDisplay().calcCR(), 0.0); } }