/*
* BioSetLoaderTest.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 05-Feb-2004
*
* Current Ver: $Revision$
*
*
*
*/
package pcgen.persistence.lst;
import java.net.URI;
import java.util.List;
import junit.framework.Test;
import junit.framework.TestSuite;
import junit.framework.TestCase;
import pcgen.cdom.base.Constants;
import pcgen.core.BioSet;
import pcgen.core.Globals;
import pcgen.core.SettingsHandler;
import pcgen.rules.context.LoadContext;
/**
* A collection of tests to validate the functioning of the BioSetLoader class.
* Static methods are also made available should other test classes require
* BioSet loading functions.
*/
public final class BioSetLoaderTest extends TestCase
{
/**
* The sample Bio set data for testing.
*/
private final static String[] BIO_SET_DATA =
new String[]{
"AGESET:0|Adulthood",
"RACENAME:Human% CLASS:Barbarian,Rogue,Sorcerer[BASEAGEADD:1d4]|Bard,Fighter,Paladin,Ranger[BASEAGEADD:1d6]|Cleric,Druid,Monk,Wizard[BASEAGEADD:2d6]",
"RACENAME:Human% SEX:Male[BASEHT:58|HTDIEROLL:2d10|BASEWT:120|WTDIEROLL:2d4|TOTALWT:BASEWT+(HTDIEROLL*WTDIEROLL)]Female[BASEHT:53|HTDIEROLL:2d10|BASEWT:85|WTDIEROLL:2d4|TOTALWT:BASEWT+(HTDIEROLL*WTDIEROLL)]",
"RACENAME:Human% BASEAGE:15 MAXAGE:34 AGEDIEROLL:5d4 HAIR:Blond|Brown EYES:Blue SKINTONE:Tanned|Pasty",
"RACENAME:Half-Elf% CLASS:Barbarian,Rogue,Sorcerer[BASEAGEADD:1d6]|Bard,Fighter,Paladin,Ranger[BASEAGEADD:2d6]|Cleric,Druid,Monk,Wizard[BASEAGEADD:3d6]",
"RACENAME:Half-Elf% SEX:Male[BASEHT:55|HTDIEROLL:2d8|BASEWT:100|WTDIEROLL:2d4|TOTALWT:BASEWT+(HTDIEROLL*WTDIEROLL)]Female[BASEHT:53|HTDIEROLL:2d8|BASEWT:80|WTDIEROLL:2d4|TOTALWT:BASEWT+(HTDIEROLL*WTDIEROLL)]",
"RACENAME:Half-Elf% BASEAGE:20 MAXAGE:61 AGEDIEROLL:7d6 HAIR:White|Pale Yellow|Silver-White|Black|Blue|Golden Blonde|Copper|Brown EYES:Violet|Silver|Pink|Pale Blue|Gold-flecked Green|Gold-flecked Blue|Green|Gold|Brown|Hazel SKINTONE:Obsidian|Fair|Tanned|Pasty|Bronze|Dark Brown|Copper",
"AGESET:1|Middle Age BONUS:STAT|STR,CON,DEX|-1 BONUS:STAT|INT,WIS,CHA|1",
"RACENAME:Human% BASEAGE:35 MAXAGE:52 AGEDIEROLL:3d6",
"RACENAME:Half-Elf% BASEAGE:62 MAXAGE:92 AGEDIEROLL:5d6",
"AGESET:2|Old BONUS:STAT|STR,CON,DEX|-3 BONUS:STAT|INT,WIS,CHA|2",
"RACENAME:Human% BASEAGE:53 MAXAGE:69 AGEDIEROLL:4d4+1",
"RACENAME:Half-Elf% BASEAGE:93 MAXAGE:124 AGEDIEROLL:5d6+1",
"AGESET:3|Venerable BONUS:STAT|STR,CON,DEX|-6 BONUS:STAT|INT,WIS,CHA|3",
"RACENAME:Human% BASEAGE:70 MAXAGE:110 AGEDIEROLL:4d10",
"RACENAME:Half-Elf% BASEAGE:125 MAXAGE:185 AGEDIEROLL:6d10",
"AGESET:0|Adulthood",
"RACENAME:Dwarf% CLASS:Barbarian,Rogue,Sorcerer[BASEAGEADD:3d6]|Bard,Fighter,Paladin,Ranger[BASEAGEADD:5d6]|Cleric,Druid,Monk,Wizard[BASEAGEADD:7d6]",
"RACENAME:Dwarf% SEX:Male[BASEHT:45|HTDIEROLL:2d4|BASEWT:130|WTDIEROLL:2d6|TOTALWT:BASEWT+(HTDIEROLL*WTDIEROLL)]Female[BASEHT:43|HTDIEROLL:2d4|BASEWT:100|WTDIEROLL:2d6|TOTALWT:BASEWT+(HTDIEROLL*WTDIEROLL)]",
"RACENAME:Dwarf% BASEAGE:40 MAXAGE:124 AGEDIEROLL:4d20+1d4 HAIR:Blond|Brown|Bald|Gray EYES:Blue|Black|Brown|Gray SKINTONE:Tanned|Pasty|Fair|Gray",
"AGESET:1|Middle Age BONUS:STAT|STR,CON,DEX|-1 BONUS:STAT|INT,WIS,CHA|1",
"RACENAME:Dwarf% BASEAGE:125 MAXAGE:187 AGEDIEROLL:(7d8+1d6)",
"AGESET:2|Old BONUS:STAT|STR,CON,DEX|-3 BONUS:STAT|INT,WIS,CHA|2",
"RACENAME:Dwarf% BASEAGE:188 MAXAGE:249 AGEDIEROLL:10d6+1",
"AGESET:3|Venerable BONUS:STAT|STR,CON,DEX|-6 BONUS:STAT|INT,WIS,CHA|3",
"RACENAME:Dwarf% BASEAGE:250 MAXAGE:450 AGEDIEROLL:2d100"};
/**
* The base race used in the bio set data.
*/
private final static String[] BASE_RACE_NAME =
new String[]{"Human", "Dwarf", "Half-Elf"};
private BioSetLoader loader;
/* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
@Override
protected void setUp() throws Exception
{
super.setUp();
loader = new BioSetLoader();
BioSetLoaderTest.loadBioSet(Globals.getContext(), BIO_SET_DATA, loader);
}
/* (non-Javadoc)
* @see junit.framework.TestCase#tearDown()
*/
@Override
protected void tearDown() throws Exception
{
try
{
SettingsHandler.getGame().getBioSet().clearUserMap();
}
finally
{
super.tearDown();
}
}
/**
* Basic constructor, name only.
*/
public BioSetLoaderTest()
{
// Do Nothing
}
/**
* Basic constructor, name only.
*
* @param name The name of the test class.
*/
public BioSetLoaderTest(final String name)
{
super(name);
}
/**
* Load the supplied bio set data.
*
* @param bioSetData The data to be loaded.
*
* @throws Exception If a problem occurs when loading the data
*/
public static void loadBioSet(LoadContext context, final String[] bioSetData, BioSetLoader loader) throws Exception
{
for (int i = 0; i < bioSetData.length; i++)
{
final String line = bioSetData[i];
loader.parseLine(context, line, new URI("http://UNIT_TEST_CASE"));
}
SettingsHandler.getGame().setBioSet(loader.bioSet);
}
/**
* Run the tests standalone from the command line.
*
* @param args Command line args - ignored.
*/
public static void main(final String[] args)
{
junit.textui.TestRunner.run(BioSetLoaderTest.class);
}
/**
* Quick test suite creation - adds all methods beginning with "test".
*
* @return The Test suite
*/
public static Test suite()
{
return new TestSuite(BioSetLoaderTest.class);
}
/**
* Validate the data loaded in setUp() to verify that the parseLine fucntion in
* BioSetLoader is functioning properly.
*/
public void testParseLine()
{
final String[] TEST_TAGS =
new String[]{"HAIR", "EYES", "SKINTONE", "AGEDIEROLL", "CLASS",
"BASEAGE", "MAXAGE", "SEX"};
final String[][] EXPECTED_VALUES =
new String[][]{
{
"[Blond|Brown]",
"[Blue]",
"[Tanned|Pasty]",
"[5d4, 3d6, 4d4+1, 4d10]",
"[Barbarian,Rogue,Sorcerer[BASEAGEADD:1d4]|Bard,Fighter,Paladin,Ranger[BASEAGEADD:1d6]|Cleric,Druid,Monk,Wizard[BASEAGEADD:2d6]]",
"[15, 35, 53, 70]",
"[34, 52, 69, 110]",
"[Male[BASEHT:58|HTDIEROLL:2d10|BASEWT:120|WTDIEROLL:2d4|TOTALWT:BASEWT+(HTDIEROLL*WTDIEROLL)]Female[BASEHT:53|HTDIEROLL:2d10|BASEWT:85|WTDIEROLL:2d4|TOTALWT:BASEWT+(HTDIEROLL*WTDIEROLL)]]"},
{
"[Blond|Brown|Bald|Gray]",
"[Blue|Black|Brown|Gray]",
"[Tanned|Pasty|Fair|Gray]",
"[4d20+1d4, (7d8+1d6), 10d6+1, 2d100]",
"[Barbarian,Rogue,Sorcerer[BASEAGEADD:3d6]|Bard,Fighter,Paladin,Ranger[BASEAGEADD:5d6]|Cleric,Druid,Monk,Wizard[BASEAGEADD:7d6]]",
"[40, 125, 188, 250]",
"[124, 187, 249, 450]",
"[Male[BASEHT:45|HTDIEROLL:2d4|BASEWT:130|WTDIEROLL:2d6|TOTALWT:BASEWT+(HTDIEROLL*WTDIEROLL)]Female[BASEHT:43|HTDIEROLL:2d4|BASEWT:100|WTDIEROLL:2d6|TOTALWT:BASEWT+(HTDIEROLL*WTDIEROLL)]]"},
{
"[White|Pale Yellow|Silver-White|Black|Blue|Golden Blonde|Copper|Brown]",
"[Violet|Silver|Pink|Pale Blue|Gold-flecked Green|Gold-flecked Blue|Green|Gold|Brown|Hazel]",
"[Obsidian|Fair|Tanned|Pasty|Bronze|Dark Brown|Copper]",
"[7d6, 5d6, 5d6+1, 6d10]",
"[Barbarian,Rogue,Sorcerer[BASEAGEADD:1d6]|Bard,Fighter,Paladin,Ranger[BASEAGEADD:2d6]|Cleric,Druid,Monk,Wizard[BASEAGEADD:3d6]]",
"[20, 62, 93, 125]",
"[61, 92, 124, 185]",
"[Male[BASEHT:55|HTDIEROLL:2d8|BASEWT:100|WTDIEROLL:2d4|TOTALWT:BASEWT+(HTDIEROLL*WTDIEROLL)]Female[BASEHT:53|HTDIEROLL:2d8|BASEWT:80|WTDIEROLL:2d4|TOTALWT:BASEWT+(HTDIEROLL*WTDIEROLL)]]"}};
// Check the data loaded in setup to ensure that it has been loaded correctly.
final BioSet currBioSet = SettingsHandler.getGame().getBioSet();
List<String> baseRaceTag;
for (int i = 0; i < BASE_RACE_NAME.length; i++)
{
final String raceName = BASE_RACE_NAME[i];
for (int j = 0; j < TEST_TAGS.length; j++)
{
final String testArg = TEST_TAGS[j];
baseRaceTag =
currBioSet.getTagForRace(Constants.NONE, raceName,
testArg);
// System.out.println(
// "Got '"
// + testArg
// + "' tag for race '"
// + raceName
// + "' of "
// + baseRaceTag
// + ".");
assertEquals("BioSet tag " + testArg + " for race " + raceName
+ ":", EXPECTED_VALUES[i][j], baseRaceTag.toString());
}
}
}
/**
* Check that a valid second bio set definition can be loaded.
* @throws Exception
*/
public void testParseSecondBioSetGood() throws Exception
{
assertEquals("No ogre bio details expected before load", "REGION:None\n\n", SettingsHandler
.getGame().getBioSet().getRacePCCText("None", "Ogre"));
String[] bioData2 = new String[]{
"AGESET:0|Adulthood",
"RACENAME:Ogre CLASS:Barbarian,Rogue,Sorcerer[BASEAGEADD:1d4]|Bard,Fighter,Paladin,Ranger[BASEAGEADD:1d6]|Cleric,Druid,Monk,Wizard[BASEAGEADD:2d6]",
"RACENAME:Ogre SEX:Male[BASEHT:58|HTDIEROLL:2d10|BASEWT:120|WTDIEROLL:2d4|TOTALWT:BASEWT+(HTDIEROLL*WTDIEROLL)]Female[BASEHT:53|HTDIEROLL:2d10|BASEWT:85|WTDIEROLL:2d4|TOTALWT:BASEWT+(HTDIEROLL*WTDIEROLL)]",
"RACENAME:Ogre BASEAGE:15 MAXAGE:34 AGEDIEROLL:5d4 HAIR:Blond|Brown EYES:Blue SKINTONE:Tanned|Pasty",
"AGESET:1|Middle Age",
"RACENAME:Ogre BASEAGE:35 MAXAGE:52 AGEDIEROLL:3d6",
"AGESET:2|Old BONUS:STAT|STR,CON,DEX|-3 BONUS:STAT|INT,WIS,CHA|2",
"RACENAME:Ogre BASEAGE:53 MAXAGE:69 AGEDIEROLL:4d4+1",
"AGESET:3|Venerable BONUS:STAT|STR,CON,DEX|-6 BONUS:STAT|INT,WIS,CHA|3",
"RACENAME:Ogre BASEAGE:70 MAXAGE:110 AGEDIEROLL:4d10",
};
BioSetLoaderTest.loadBioSet(Globals.getContext(), bioData2, loader);
String racePCCText =
SettingsHandler.getGame().getBioSet()
.getRacePCCText("None", "Ogre");
assertFalse("Ogre bio details expected after load but was "
+ racePCCText, "REGION:None\n\n".equals(racePCCText));
}
/**
* Check that an invalid second bio set definition gets properly processed.
* It is expected that the bioset will be loaded but the original name for
* the age set will be used.
* @throws Exception
*/
public void testParseSecondBioSetBadName() throws Exception
{
assertEquals("No ogre bio details expected before load", "REGION:None\n\n", SettingsHandler
.getGame().getBioSet().getRacePCCText("None", "Ogre"));
String[] bioData2 = new String[]{
"AGESET:0|Bad",
"RACENAME:Ogre CLASS:Barbarian,Rogue,Sorcerer[BASEAGEADD:1d4]|Bard,Fighter,Paladin,Ranger[BASEAGEADD:1d6]|Cleric,Druid,Monk,Wizard[BASEAGEADD:2d6]",
"RACENAME:Ogre SEX:Male[BASEHT:58|HTDIEROLL:2d10|BASEWT:120|WTDIEROLL:2d4|TOTALWT:BASEWT+(HTDIEROLL*WTDIEROLL)]Female[BASEHT:53|HTDIEROLL:2d10|BASEWT:85|WTDIEROLL:2d4|TOTALWT:BASEWT+(HTDIEROLL*WTDIEROLL)]",
"RACENAME:Ogre BASEAGE:15 MAXAGE:34 AGEDIEROLL:5d4 HAIR:Blond|Brown EYES:Blue SKINTONE:Tanned|Pasty",
"AGESET:1|Middle Age",
"RACENAME:Ogre BASEAGE:35 MAXAGE:52 AGEDIEROLL:3d6",
"AGESET:2|Old BONUS:STAT|STR,CON,DEX|-3 BONUS:STAT|INT,WIS,CHA|2",
"RACENAME:Ogre BASEAGE:53 MAXAGE:69 AGEDIEROLL:4d4+1",
"AGESET:3|Venerable BONUS:STAT|STR,CON,DEX|-6 BONUS:STAT|INT,WIS,CHA|3",
"RACENAME:Ogre BASEAGE:70 MAXAGE:110 AGEDIEROLL:4d10",
};
BioSetLoaderTest.loadBioSet(Globals.getContext(), bioData2, loader);
String racePCCText =
SettingsHandler.getGame().getBioSet()
.getRacePCCText("None", "Ogre");
assertTrue(
"Expected details to be against original ageset name but was "
+ racePCCText,
racePCCText
.startsWith("REGION:None\n\nAGESET:0|Adulthood\nRACENAME:Ogre"));
}
}