/*
*
* Copyright 2005 (C) Greg Bingleman <byngl@hotmail.com>
*
* 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 September 26, 2005, 10:32 PM
*
* @author Greg Bingleman <byngl@hotmail.com>
*
* Current Ver: $Revision$
*
*
*
*/
package pcgen.persistence.lst.output.prereq;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import pcgen.base.format.StringManager;
import pcgen.cdom.enumeration.FactKey;
import pcgen.cdom.enumeration.FactSetKey;
import pcgen.core.GameMode;
import pcgen.core.Globals;
import pcgen.core.SettingsHandler;
import pcgen.core.SystemCollections;
import pcgen.core.prereq.Prerequisite;
import pcgen.persistence.GameModeFileLoader;
import pcgen.persistence.PersistenceLayerException;
import pcgen.persistence.lst.prereq.PreParserFactory;
import pcgen.util.TestHelper;
import util.Alignment;
/**
* Tests PrerequisiteWriter code
*/
public class PrerequisiteWriterTest extends TestCase
{
private static final StringManager STR_MGR = new StringManager();
/**
* Constructs a test case with the given name.
* @param name
*/
public PrerequisiteWriterTest(String name) {
super(name);
}
/**
* Main
* @param args
*/
public static void main(String[] args)
{
junit.textui.TestRunner.run(PrerequisiteWriterTest.suite());
}
/**
* @return Test
*/
public static Test suite()
{
TestSuite suite = new TestSuite();
for (int i = 0; i < testparams.length >> 1; ++i)
{
suite.addTest(new PrerequisiteWriterTest(i));
}
return suite;
}
static String testparams[] = {
//
// Examples from the PCGen documentation - note that there are two columns for each entry below
//
"PREABILITY:1,CATEGORY=Special Attack,Sneak Attack", "PREABILITY:1,CATEGORY=Special Attack,Sneak Attack",
"PREALIGN:LG,NG,CG", "PREALIGN:LG,NG,CG",
"PREALIGN:LG,Deity", "PREALIGN:LG,Deity",
"PREPROFWITHARMOR:1,Chainmail,Full Plate", "PREPROFWITHARMOR:1,Chainmail,Full Plate",
"PREPROFWITHARMOR:1,TYPE.Medium", "PREPROFWITHARMOR:1,TYPE.Medium",
"PREATT:6", "PREATT:6",
"PREBASESIZELTEQ:Medium", "PREBASESIZELTEQ:M",
"PREBIRTHPLACE:Klamath", "PREBIRTHPLACE:Klamath",
"PRECHECK:1,Fortitude=5,Reflex=3", "PRECHECK:1,Fortitude=5,Reflex=3",
"PRECHECK:2,Fortitude=5,Reflex=3,Will=4", "PRECHECK:2,Fortitude=5,Reflex=3,Will=4",
"PRECHECKBASE:2,Fortitude=3,Reflex=3", "PRECHECKBASE:2,Fortitude=3,Reflex=3",
"PRECHECKBASE:1,Fortitude=5,Reflex=3", "PRECHECKBASE:1,Fortitude=5,Reflex=3",
"PRECITY:Klamath", "PRECITY:Klamath",
"PRECLASS:2,Wizard=5,Sorceror=6,Cleric=7", "PRECLASS:2,Wizard=5,Sorceror=6,Cleric=7",
"PRECLASS:1,SPELLCASTER=2", "PRECLASS:1,SPELLCASTER=2",
"PRECLASS:1,SPELLCASTER.Arcane=2", "PRECLASS:1,SPELLCASTER.Arcane=2",
"PRECLASS:2,TYPE.Base=5,TYPE.Prestige=1", "PRECLASS:2,TYPE.Base=5,TYPE.Prestige=1",
"PRECLASSLEVELMAX:2,Fighter,SPELLCASTER=2", "!PRECLASS:1,Fighter=3,SPELLCASTER=3",
"PRECSKILL:1,Spot,Listen", "PRECSKILL:1,Spot,Listen",
"PRECSKILL:2,TYPE.Spy", "PRECSKILL:2,TYPE.Spy",
"PREDEITY:1,Y", "PREDEITY:1,Y",
"PREDEITY:1,N", "PREDEITY:1,N",
"PREDEITY:1,Zeus,Odin", "PREDEITY:1,Zeus,Odin",
"PREDEITYDOMAIN:1,Good,Law", "PREDEITYDOMAIN:1,Good,Law",
"PREDOMAIN:1,Good,Law", "PREDOMAIN:1,Good,Law",
"PREDR:1,+1=10", "PREDR:1,+1=10",
"PREDR:1,-=10,+1=10,+2=10,+3=10,+4=10,+5=10,Silver=10", "PREDR:1,-=10,+1=10,+2=10,+3=10,+4=10,+5=10,Silver=10",
"PREEQUIP:1,Leather Armor", "PREEQUIP:1,Leather Armor",
"PREEQUIP:1,Leather Armor%", "PREEQUIP:1,Leather Armor%",
"PREEQUIP:1,TYPE=Armor", "PREEQUIP:1,TYPE=Armor",
"PREEQUIP:2,TYPE=Armor,Sword (Long)%", "PREEQUIP:2,TYPE=Armor,Sword (Long)%",
"PREEQUIP:2,TYPE=Armor,TYPE=Shield", "PREEQUIP:2,TYPE=Armor,TYPE=Shield",
"PREEQUIPPRIMARY:1,Dagger", "PREEQUIPPRIMARY:1,Dagger",
"PREEQUIPPRIMARY:1,Dagger%", "PREEQUIPPRIMARY:1,Dagger%",
"PREEQUIPPRIMARY:1,TYPE=Slashing", "PREEQUIPPRIMARY:1,TYPE=Slashing",
"PREEQUIPSECONDARY:1,Dagger", "PREEQUIPSECONDARY:1,Dagger",
"PREEQUIPSECONDARY:1,Dagger%", "PREEQUIPSECONDARY:1,Dagger%",
"PREEQUIPSECONDARY:1,TYPE=Slashing", "PREEQUIPSECONDARY:1,TYPE=Slashing",
"PREEQUIPBOTH:1,Quarterstaff", "PREEQUIPBOTH:1,Quarterstaff",
"PREEQUIPBOTH:1,Sword (Great%", "PREEQUIPBOTH:1,Sword (Great%",
"PREEQUIPBOTH:1,TYPE=Slashing", "PREEQUIPBOTH:1,TYPE=Slashing",
"PREEQUIPTWOWEAPON:1,Sword (Short)", "PREEQUIPTWOWEAPON:1,Sword (Short)",
"PREEQUIPTWOWEAPON:1,Sword (Short%", "PREEQUIPTWOWEAPON:1,Sword (Short%",
"PREEQUIPTWOWEAPON:1,TYPE=Slashing", "PREEQUIPTWOWEAPON:1,TYPE=Slashing",
"PREFACT:1,RACE,IsPC=TRUE", "PREFACT:1,RACE,IsPC=TRUE",
"PREFACTSET:1,DEITY,PANTHEONS=Greek", "PREFACTSET:1,DEITY,PANTHEONS=Greek",
"PREFEAT:1,Dodge,Combat Reflexes", "PREABILITY:1,CATEGORY=FEAT,Dodge,Combat Reflexes",
"PREFEAT:2,CHECKMULT,Spell Focus", "PREABILITY:2,CHECKMULT,CATEGORY=FEAT,Spell Focus",
// "PREFEAT:2,CHECKMULT,Spell Focus,[Spell Focus(Enchantment)]", "PREABILITY:2,CATEGORY=FEAT,CHECKMULT,Spell Focus\t!PREABILITY:1,CATEGORY=FEAT,CHECKMULT,Spell Focus (Enchantment)",
"PREFEAT:2,Weapon Focus (TYPE=Bow),Weapon Focus (Longsword)", "PREABILITY:2,CATEGORY=FEAT,Weapon Focus (TYPE=Bow),Weapon Focus (Longsword)",
"PREFEAT:2,CHECKMULT,Weapon Focus(TYPE=Sword)", "PREABILITY:2,CHECKMULT,CATEGORY=FEAT,Weapon Focus (TYPE=Sword)",
"PREFEAT:2,Skill Focus (Spot),Skill Focus (Listen),Skill Focus (Search)", "PREABILITY:2,CATEGORY=FEAT,Skill Focus (Spot),Skill Focus (Listen),Skill Focus (Search)",
"PREFEAT:2,TYPE=ItemCreation", "PREABILITY:2,CATEGORY=FEAT,TYPE=ItemCreation",
"PREGENDER:M", "PREGENDER:M",
"PREHANDSGT:2", "PREHANDSGT:2",
"PREITEM:1,Sword (Long),Sword (Short)", "PREITEM:1,Sword (Long),Sword (Short)",
"PREITEM:2,TYPE=Armor,TYPE=Armor", "PREITEM:2,TYPE=Armor,TYPE=Armor",
"PREKIT:1,Starting Gold", "PREKIT:1,Starting Gold",
"PREKIT:2,Flumph Abilities,Flumph Skills", "PREKIT:2,Flumph Abilities,Flumph Skills",
"!PREKIT:1,Alchemist's Kit", "!PREKIT:1,Alchemist's Kit",
"PRELANG:1,Dwarven,Elven", "PRELANG:1,Dwarven,Elven",
"PRELANG:2,Dwarven,Elven", "PRELANG:2,Dwarven,Elven",
"PRELANG:2,Dwarven,Elven,Halfling", "PRELANG:2,Dwarven,Elven,Halfling",
"PRELANG:3,ANY", "PRELANG:3,ANY",
"PRELEGSGTEQ:4", "PRELEGSGTEQ:4",
"PRELEVEL:MIN=5", "PRELEVEL:MIN=5",
"PRELEVEL:MAX=5", "PRELEVEL:MAX=5",
"PRELEVEL:MIN=4,MAX=5", "PRELEVEL:MIN=4,MAX=5",
"PRELEVELMAX:10", "PRELEVELMAX:10",
"PREPCLEVEL:MIN=5", "PREPCLEVEL:MIN=5",
"PREPCLEVEL:MAX=5", "PREPCLEVEL:MAX=5",
"PREPCLEVEL:MIN=4,MAX=5", "PREPCLEVEL:MIN=4,MAX=5",
"PREMOVE:1,Walk=30,Fly=20", "PREMOVE:1,Walk=30,Fly=20",
"PREMOVE:1,Swim=10", "PREMOVE:1,Swim=10",
"PREMULT:1,[PRERACE:1,Gnome],[PRECLASS:1,Cleric=1]", "PREMULT:1,[PRERACE:1,Gnome],[PRECLASS:1,Cleric=1]",
"PREMULT:1,[PRERACE:1,Gnome],[PREMULT:2,[PRESIZEGTEQ:M],[PREFEAT:1,Alertness]]", "PREMULT:1,[PRERACE:1,Gnome],[PREMULT:2,[PRESIZEGTEQ:M],[PREABILITY:1,CATEGORY=FEAT,Alertness]]",
"PRERACE:1,Dwarf,Elf,Human", "PRERACE:1,Dwarf,Elf,Human",
"PRERACE:1,Elf,[Elf (aquatic)]", "PREMULT:2,[PRERACE:1,Elf],[!PRERACE:1,Elf (aquatic)]",
"PREREGION:Slithe", "PREREGION:Slithe",
"PREREGION:Slithe (Barrows)", "PREREGION:Slithe (Barrows)",
"PRERULE:1,SYS_WTPSK", "PRERULE:1,SYS_WTPSK",
"PRESA:1,Turn undead,Rebuke undead,Smite Evil", "PRESA:1,Turn undead,Rebuke undead,Smite Evil",
"PREPROFWITHSHIELD:1,Buckler,Large Shield", "PREPROFWITHSHIELD:1,Buckler,Large Shield",
"PREPROFWITHARMOR:1,TYPE.Tower", "PREPROFWITHARMOR:1,TYPE.Tower",
"PRESIZEEQ:H", "PRESIZEEQ:H",
"PRESKILL:1,Spot=10,Listen=10", "PRESKILL:1,Spot=10,Listen=10",
"PRESKILL:2,TYPE.Spy=2", "PRESKILL:2,TYPE.Spy=2",
"PRESKILLMULT:1,Spot=10,Listen=10", "PRESKILLMULT:1,Spot=10,Listen=10",
"PRESKILLTOT:Spot,Listen,Search=30", "PRESKILLTOT:Spot,Listen,Search=30",
"PRESPELL:1,Magic Missile,Lightning Bolt", "PRESPELL:1,Magic Missile,Lightning Bolt",
"PRESPELLBOOK:YES", "PRESPELLBOOK:YES",
"PRESPELLBOOK:NO", "PRESPELLBOOK:NO",
"PRESPELLCAST:MEMORIZE=Y", "PRESPELLCAST:MEMORIZE=Y",
"PRESPELLCAST:MEMORIZE=N", "PRESPELLCAST:MEMORIZE=N",
"PRESPELLCAST:TYPE=Arcane", "PRESPELLCAST:TYPE=Arcane",
"PRESPELLCAST:TYPE=Divine", "PRESPELLCAST:TYPE=Divine",
"PRESPELLDESCRIPTOR:4,Mind-Affecting=3", "PRESPELLDESCRIPTOR:4,Mind-Affecting=3",
"PRESPELLSCHOOL:3,Necromancy=2", "PRESPELLSCHOOL:3,Necromancy=2",
"PRESPELLSCHOOLSUB:3,Creation=2", "PRESPELLSCHOOLSUB:3,Creation=2",
"PRESPELLTYPE:4,Arcane=5", "PRESPELLTYPE:4,Arcane=5",
"PRESRGTEQ:10", "PRESRGTEQ:10",
"PRESTAT:1,STR=18", "PRESTAT:1,STR=18",
"PRESTAT:1,STR=18,WIS=18", "PRESTAT:1,STR=18,WIS=18",
"PRESTAT:2,STR=18,WIS=18", "PRESTAT:2,STR=18,WIS=18",
"PRESTAT:1,STR=15,WIS=13", "PRESTAT:1,STR=15,WIS=13",
"PRESTAT:2,STR=13,INT=10,CHA=13", "PRESTAT:2,STR=13,INT=10,CHA=13",
"PRESUBCLASS:1,Evoker,Abjurer,Enchanter,Illusionist", "PRESUBCLASS:1,Evoker,Abjurer,Enchanter,Illusionist",
"PRETEMPLATE:1,Celestial,Fiendish", "PRETEMPLATE:1,Celestial,Fiendish",
"PRETEXT:Character must make a sacrifice of bananas to the Monkey God", "PRETEXT:Character must make a sacrifice of bananas to the Monkey God",
"PRETYPE:1,Elemental,Fey,Outsider", "PRETYPE:1,Elemental,Fey,Outsider",
"PRETYPE:2,Humanoid,Undead", "PRETYPE:2,Humanoid,Undead",
"PREUATT:4", "PREUATT:4",
"PREVARGT:Rage,4", "PREVARGT:Rage,4",
"PREVARGT:SneakAttack,5", "PREVARGT:SneakAttack,5",
"PREVARGT:SneakAttack,5,Rage,4", "PREVARGT:SneakAttack,5,Rage,4",
"PREVISION:2,Normal=1,Darkvision=1", "PREVISION:2,Normal=1,Darkvision=1",
"PREVISION:1,Blindsight=30,Darkvision=30", "PREVISION:1,Blindsight=30,Darkvision=30",
"PREWEAPONPROF:2,Kama,Katana", "PREWEAPONPROF:2,Kama,Katana",
"PREWEAPONPROF:1,TYPE.Exotic", "PREWEAPONPROF:1,TYPE.Exotic",
"PREWEAPONPROF:1,TYPE.Martial,Chain (Spiked)", "PREWEAPONPROF:1,TYPE.Martial,Chain (Spiked)",
"PREWEAPONPROF:1,DEITYWEAPON", "PREWEAPONPROF:1,DEITYWEAPON",
"PREWIELD:1,Light,OneHanded", "PREWIELD:1,Light,OneHanded",
"PREWIELD:1,TwoHanded", "PREWIELD:1,TwoHanded",
"PREWIELD:Q:1,TwoHanded", "PREWIELD:Q:1,TwoHanded",
"PRERACE:1,Orc,[%]", "PREMULT:2,[PRERACE:1,Orc],[!PRERACE:1,%]",
//
// Not in the docs
"PREARMORTYPE:1,TYPE.Exotic", "PREARMORTYPE:1,TYPE.Exotic",
"PREARMORTYPE:1,Leather%", "PREARMORTYPE:1,Leather%",
"PREARMORTYPE:1,LIST", "PREARMORTYPE:1,LIST",
"PREHD:MIN=3", "PREHD:MIN=3",
"PREHD:MIN=3,MAX=12", "PREHD:MIN=3,MAX=12",
"PREHP:12", "PREHP:12",
"PREPOINTBUYMETHOD:1,Standard", "PREPOINTBUYMETHOD:1,Standard",
"PREPOINTBUYMETHOD:1,Standard,High-powered", "PREPOINTBUYMETHOD:1,Standard,High-powered",
//
// Just for good measure
//
"PREMULT:1,[PREFEAT:1,CHECKMULT,Dodge],[PREFEAT:1,CHECKMULT,Combat Reflexes]", "PREMULT:1,[PREABILITY:1,CHECKMULT,CATEGORY=FEAT,Dodge],[PREABILITY:1,CHECKMULT,CATEGORY=FEAT,Combat Reflexes]",
"PRERACE:1,Dwarf", "PRERACE:1,Dwarf",
"PRESPELLDESCRIPTOR:4,Mind-Affecting=3", "PRESPELLDESCRIPTOR:4,Mind-Affecting=3",
"PRESPELLDESCRIPTOR:4,Mind-Affecting=3,Fire=2", "PRESPELLDESCRIPTOR:4,Mind-Affecting=3,Fire=2",
"PRESPELLSCHOOL:3,Necromancy=2", "PRESPELLSCHOOL:3,Necromancy=2",
"PRESPELLSCHOOL:3,Necromancy=2,Divination=4", "PRESPELLSCHOOL:3,Necromancy=2,Divination=4",
"PRESPELLSCHOOLSUB:3,Creation=2", "PRESPELLSCHOOLSUB:3,Creation=2",
"PRESPELLSCHOOLSUB:3,Subshool1=2,Subshool2=4", "PRESPELLSCHOOLSUB:3,Subshool1=2,Subshool2=4",
"PRESPELLTYPE:4,Arcane=5", "PRESPELLTYPE:4,Arcane=5",
"PRESPELLTYPE:4,Arcane=5,Divine=2", "PRESPELLTYPE:4,Arcane=5,Divine=2",
"PRESKILLTOT:TYPE.Knowledge=20", "PRESKILLTOT:TYPE.Knowledge=20",
"PRESTATEQ:1,STR=18", "PRESTATEQ:1,STR=18",
"PRESTATNEQ:1,STR=18", "PRESTATNEQ:1,STR=18",
"PRESTATGTEQ:1,STR=18", "PRESTAT:1,STR=18",
"PRESTATLT:1,STR=18", "!PRESTAT:1,STR=18",
"PRESTATLTEQ:1,STR=18", "PRESTATLTEQ:1,STR=18",
"PRESTATGT:1,STR=18", "PRESTATGT:1,STR=18",
"PRECSKILL:1,Craft (Basketweaving)", "PRECSKILL:1,Craft (Basketweaving)",
"!PRECSKILL:1,Craft (Basketweaving)", "!PRECSKILL:1,Craft (Basketweaving)",
//
// Test default logic cases
//
"PREBASESIZE:Medium", "PREBASESIZEGTEQ:M",
"PREHANDS:2", "PREHANDSGTEQ:2",
"PRELEGS:4", "PRELEGSGTEQ:4",
"PRESIZE:H", "PRESIZEGTEQ:H",
"PRESR:10", "PRESRGTEQ:10",
"PREVAR:Rage,4", "PREVARGTEQ:Rage,4",
//
//
// Invert to test the negative logic
//
"!PRESPELLCAST:MEMORIZE=Y", "!PRESPELLCAST:MEMORIZE=Y",
"!PRESPELLCAST:MEMORIZE=N", "!PRESPELLCAST:MEMORIZE=N",
"!PRESPELLCAST:TYPE=Arcane", "!PRESPELLCAST:TYPE=Arcane",
"!PRESPELLCAST:TYPE=Divine", "!PRESPELLCAST:TYPE=Divine",
"!PRECSKILL:1,Spot,Listen", "!PRECSKILL:1,Spot,Listen",
"!PREBASESIZELTEQ:Medium", "PREBASESIZEGT:M",
"!PREHANDSGT:2", "PREHANDSLTEQ:2",
"!PRELEGSGTEQ:4", "PRELEGSLT:4",
"!PRESIZEEQ:H", "PRESIZENEQ:H",
"!PRESRGTEQ:10", "PRESRLT:10",
"!PREVARGT:Rage,4", "PREVARLTEQ:Rage,4",
"!PREPROFWITHARMOR:1,TYPE.Medium", "!PREPROFWITHARMOR:1,TYPE.Medium",
"!PREARMORTYPE:1,TYPE.Exotic", "!PREARMORTYPE:1,TYPE.Exotic",
"!PREATT:6", "!PREATT:6",
"!PREBIRTHPLACE:Klamath", "!PREBIRTHPLACE:Klamath",
"!PRECITY:Klamath", "!PRECITY:Klamath",
"!PREDEITYDOMAIN:1,Good", "!PREDEITYDOMAIN:1,Good",
"!PREDEITY:1,Odin", "!PREDEITY:1,Odin",
"!PREEQUIP:1,Leather Armor", "!PREEQUIP:1,Leather Armor",
"!PREEQUIPBOTH:1,Quarterstaff", "!PREEQUIPBOTH:1,Quarterstaff",
"!PREEQUIPPRIMARY:1,Dagger", "!PREEQUIPPRIMARY:1,Dagger",
"!PREEQUIPSECONDARY:1,Dagger", "!PREEQUIPSECONDARY:1,Dagger",
"!PREEQUIPTWOWEAPON:1,Sword (Short)", "!PREEQUIPTWOWEAPON:1,Sword (Short)",
"!PREFACT:1,RACE,LEGS=2", "!PREFACT:1,RACE,LEGS=2",
"!PREFACTSET:1,DEITY,PANTHEONS=Greek", "!PREFACTSET:1,DEITY,PANTHEONS=Greek",
"!PREGENDER:M", "!PREGENDER:M",
"!PREHP:12", "!PREHP:12",
"!PREDEITY:1,Y", "!PREDEITY:1,Y",
"!PREITEM:1,Sword (Long)", "!PREITEM:1,Sword (Long)",
"!PRELEVELMAX:10", "!PRELEVELMAX:10",
"!PRELEVEL:MIN=4", "!PRELEVEL:MIN=4",
"!PRELEVEL:MAX=4", "!PRELEVEL:MAX=4",
"!PRELEVEL:MIN=4,MAX=6", "!PRELEVEL:MIN=4,MAX=6",
"!PREPCLEVEL:MIN=4", "!PREPCLEVEL:MIN=4",
"!PREPCLEVEL:MAX=4", "!PREPCLEVEL:MAX=4",
"!PREPCLEVEL:MIN=4,MAX=6", "!PREPCLEVEL:MIN=4,MAX=6",
"!PREREGION:Slithe", "!PREREGION:Slithe",
"!PRERULE:1,SYS_WTPSK", "!PRERULE:1,SYS_WTPSK",
"!PREPROFWITHSHIELD:1,Buckler", "!PREPROFWITHSHIELD:1,Buckler",
"!PRESA:1,Turn undead", "!PRESA:1,Turn undead",
"!PRESPELLBOOK:YES", "!PRESPELLBOOK:YES",
"!PRESPELL:1,Magic Missile", "!PRESPELL:1,Magic Missile",
"!PRESUBCLASS:1,Evoker", "!PRESUBCLASS:1,Evoker",
"!PRETEMPLATE:1,Celestial", "!PRETEMPLATE:1,Celestial",
"!PREUATT:4", "!PREUATT:4",
"!PREWEAPONPROF:1,TYPE.Exotic", "!PREWEAPONPROF:1,TYPE.Exotic",
"!PREWIELD:1,TwoHanded", "!PREWIELD:1,TwoHanded",
"!PRECHECKBASE:1,Fortitude=5", "!PRECHECKBASE:1,Fortitude=5",
"!PRECHECK:1,Fortitude=5", "!PRECHECK:1,Fortitude=5",
"!PREDOMAIN:1,Travel", "!PREDOMAIN:1,Travel",
"!PREDR:1,+1=10", "!PREDR:1,+1=10",
"!PREMOVE:1,Swim=10", "!PREMOVE:1,Swim=10",
"!PRESTAT:1,STR=18", "!PRESTAT:1,STR=18",
"!PRESTATEQ:1,STR=18", "PRESTATNEQ:1,STR=18",
"!PRESTATNEQ:1,STR=18", "PRESTATEQ:1,STR=18",
"!PRESTATGTEQ:1,STR=18", "!PRESTAT:1,STR=18",
"!PRESTATLT:1,STR=18", "PRESTAT:1,STR=18",
"!PRESTATLTEQ:1,STR=18", "PRESTATGT:1,STR=18",
"!PRESTATGT:1,STR=18", "PRESTATLTEQ:1,STR=18",
"!PREVISION:1,Blindsight=ANY", "!PREVISION:1,Blindsight=ANY",
"!PREPOINTBUYMETHOD:1,Standard", "!PREPOINTBUYMETHOD:1,Standard",
"!PRESKILLTOT:Spot,Listen,Search=30", "!PRESKILLTOT:Spot,Listen,Search=30",
"!PREFEAT:1,Dodge", "!PREABILITY:1,CATEGORY=FEAT,Dodge",
"!PRESPELLDESCRIPTOR:4,Mind-Affecting=3", "!PRESPELLDESCRIPTOR:4,Mind-Affecting=3",
"!PRESPELLSCHOOLSUB:3,Creation=2", "!PRESPELLSCHOOLSUB:3,Creation=2",
"!PRESPELLSCHOOL:3,Necromancy=2", "!PRESPELLSCHOOL:3,Necromancy=2",
"!PRESPELLTYPE:4,Arcane=5", "!PRESPELLTYPE:4,Arcane=5",
"PREHD:MIN=3", "PREHD:MIN=3",
"PREHD:MIN=3,MAX=12", "PREHD:MIN=3,MAX=12",
"!PRECLASS:1,SPELLCASTER=2", "!PRECLASS:1,SPELLCASTER=2",
"!PRESPELLTYPE:4,Arcane=5,Divine=2", "!PRESPELLTYPE:4,Arcane=5,Divine=2",
"!PRESPELLSCHOOL:3,Necromancy=2,Divination=4", "!PRESPELLSCHOOL:3,Necromancy=2,Divination=4",
"!PRESPELLSCHOOLSUB:3,Subshool1=2,Subshool2=4", "!PRESPELLSCHOOLSUB:3,Subshool1=2,Subshool2=4",
"!PRESPELLDESCRIPTOR:4,Mind-Affecting=3,Fire=2", "!PRESPELLDESCRIPTOR:4,Mind-Affecting=3,Fire=2",
"!PRESKILLTOT:TYPE.Knowledge=20", "!PRESKILLTOT:TYPE.Knowledge=20",
"!PREPOINTBUYMETHOD:1,Standard,High-powered", "!PREPOINTBUYMETHOD:1,Standard,High-powered",
"PREBASESIZEEQ:Medium", "PREBASESIZEEQ:M",
"PREBASESIZEGT:Medium", "PREBASESIZEGT:M",
"PREBASESIZEGTEQ:Medium", "PREBASESIZEGTEQ:M",
"PREBASESIZELT:Medium", "PREBASESIZELT:M",
"PREBASESIZENEQ:Medium", "PREBASESIZENEQ:M",
"PRECHECK:1,Fortitude=3", "PRECHECK:1,Fortitude=3",
"PRECHECKBASE:1,Will=3", "PRECHECKBASE:1,Will=3",
"PRECLASSLEVELMAX:1,Barbarian=1", "!PRECLASS:1,Barbarian=2",
"!PRECLASSLEVELMAX:1,Barbarian=1", "PRECLASS:1,Barbarian=2",
"PRECLASSLEVELMAX:4,Rogue=5,Fighter=2,SPELLCASTER=2,Monk=3", "!PRECLASS:1,Rogue=6,Fighter=3,SPELLCASTER=3,Monk=4",
"PRECLASSLEVELMAX:1,Cleric=1,Fighter=1,Monk=1,Rogue=1", "PREMULT:1,[!PRECLASS:1,Cleric=2],[!PRECLASS:1,Fighter=2],[!PRECLASS:1,Monk=2],[!PRECLASS:1,Rogue=2]",
"!PRECLASS:1,Battlemind=7", "!PRECLASS:1,Battlemind=7",
"PRECSKILL:1,Swim", "PRECSKILL:1,Swim",
"PREDR:1,Silver.10", "PREDR:1,Silver=10",
"PREDR:1,Silver=10", "PREDR:1,Silver=10",
"PREDR:1,-=10,Cold Iron=10,+1=10", "PREDR:1,-=10,Cold Iron=10,+1=10",
"PREDEITY:1,Thor", "PREDEITY:1,Thor",
"PREDEITYDOMAIN:1,Travel", "PREDEITYDOMAIN:1,Travel",
"PREDOMAIN:1,Sex,Travel", "PREDOMAIN:1,Sex,Travel",
"PREDOMAIN:1,Travel", "PREDOMAIN:1,Travel",
"PRERULE:1,SYS_DOMAIN", "PRERULE:1,SYS_DOMAIN",
"PRESKILL:1,Knowledge (History)=1", "PRESKILL:1,Knowledge (History)=1",
"PRESKILL:3,TYPE.Knowledge=2", "PRESKILL:3,TYPE.Knowledge=2",
"!PRESKILL:3,TYPE.Knowledge=2", "!PRESKILL:3,TYPE.Knowledge=2",
"PREVARGTEQ:BarbRagePowerLVL,11", "PREVARGTEQ:BarbRagePowerLVL,11",
"PREVAREQ:TL,CL", "PREVAREQ:TL,CL",
"PREVAREQ:TL,(CL=Barbarian+CL=Ex Barbarian)", "PREVAREQ:TL,(CL=Barbarian+CL=Ex Barbarian)",
"PREVARLT:ENCUMBERANCE,2", "PREVARLT:ENCUMBERANCE,2",
"PREMULT:3,[PRETYPE:1,type1],[PRETYPE:1,type2,type3],[!PRETYPE:1,type4]", "PREMULT:3,[PRETYPE:1,type1],[PRETYPE:1,type2,type3],[!PRETYPE:1,type4]",
"PRETYPE:1,Animal", "PRETYPE:1,Animal",
"!PRETYPE:1,Animal", "!PRETYPE:1,Animal",
// From PrerequisiteLanguageWriterTest.java
"!PRELANG:1,Dwarven,Elven", "!PRELANG:1,Dwarven,Elven",
"PRELANG:2,Any", "PRELANG:2,Any",
"!PRELANG:2,Any", "!PRELANG:2,Any",
// From PrerequisiteSkillWriterTest.java
"PRESKILL:1,Ride=10", "PRESKILL:1,Ride=10",
"!PRESKILL:1,Ride=10", "!PRESKILL:1,Ride=10",
"PRESKILL:1,Ride=10,Listen=5", "PRESKILL:1,Ride=10,Listen=5",
"PRESKILL:2,Ride=10,Listen=5", "PRESKILL:2,Ride=10,Listen=5",
"!PRESKILL:2,Ride=10,Listen=5", "!PRESKILL:2,Ride=10,Listen=5",
"PRESKILLTOT:Ride,Listen=20", "PRESKILLTOT:Ride,Listen=20",
"!PRESKILLTOT:Ride,Listen=20", "!PRESKILLTOT:Ride,Listen=20",
//
// Other oddballs
//
"PREMULT:1,[PRESPELLTYPE:4,Arcane=5],[PRESPELLSCHOOL:3,Necromancy=2]", "PREMULT:1,[PRESPELLTYPE:4,Arcane=5],[PRESPELLSCHOOL:3,Necromancy=2]",
"!PREMULT:1,[PRESPELLTYPE:4,Arcane=5],[PRESPELLSCHOOL:3,Necromancy=2]", "!PREMULT:1,[PRESPELLTYPE:4,Arcane=5],[PRESPELLSCHOOL:3,Necromancy=2]",
"PRECLASSLEVELMAX:1,Fighter=VARNAME", "!PRECLASS:1,Fighter=(VARNAME)+1",
"!PRETEXT:Character must make a sacrifice of bananas to the Monkey God", "!PRETEXT:Character must make a sacrifice of bananas to the Monkey God",
"PREWEAPONPROF:2,TYPE.Exotic,[Chain (Spiked)]", "PREMULT:2,[PREWEAPONPROF:1,TYPE.Exotic],[!PREWEAPONPROF:1,Chain (Spiked)]",
"PREWEAPONPROF:1,TYPE.Exotic,[Chain (Spiked)]", "PREMULT:1,[PREWEAPONPROF:1,TYPE.Exotic],[!PREWEAPONPROF:1,Chain (Spiked)]",
"PREWEAPONPROF:1,[Chain (Spiked)]", "!PREWEAPONPROF:1,Chain (Spiked)",
"PREATT:should_be_numeric", "PREATT:1",
"PRESTAT:should_be_numeric,STR=18", "PRESTAT:1,STR=18",
"PRESTAT:1,Strength=18", "PRESTAT:1,Str=18",
"PREABILITY:1,CATEGORY=Special Ability,Dire Animal (Dire Rat)_Companion", "PREABILITY:1,CATEGORY=Special Ability,Dire Animal (Dire Rat)_Companion",
"PREABILITY:1,CATEGORY=FEAT,[Surprise Strike]", "PREABILITY:1,CATEGORY=FEAT,[Surprise Strike]",
"PREABILITY:1,CATEGORY=FEAT,Sneak Attack,[Alertness]", "PREABILITY:1,CATEGORY=FEAT,Sneak Attack,[Alertness]",
//
// To cause exceptions
"PREDR:1,+1=should_be_numeric", "",
"PRESPELLTYPE:Arcane,4,5,2", "", // too many tokens
"PRESPELLTYPE:4,Arcane", "", // missing '='
"PRESPELLTYPE:4", "", // missing tokens
"PRESPELLSCHOOLSUB:Creation,3,2,2", "", // too many tokens
"PRESPELLSCHOOLSUB:3,Creation", "", // missing '='
"PRESPELLSCHOOLSUB:3", "", // missing tokens
"PRESPELLSCHOOL:Necromancy,3,2,2", "", // too many tokens
"PRESPELLSCHOOL:3,Necromancy", "", // missing '='
"PRESPELLSCHOOL:3", "", // missing tokens
"PRESPELLDESCRIPTOR:Mind-Affecting,4,3,2", "", // too many tokens
"PRESPELLDESCRIPTOR:4,Mind-Affecting", "", // missing '='
"PRESPELLDESCRIPTOR:4", "", // missing tokens
"PREHD:3-12+3", "", // too many tokens
"PREHD:should_be_numeric", "", // should me numeric
"PREHD:MIN=x", "", // bad int value
"PREHD:MAX=23asdc", "", // bad int value
"PREHD:MIN=3,MAX=asdf", "", // one bad int value
"PREVARGT:SneakAttack,Rage,4", "", // invalid # of tokens
"PRESTAT:1,S=18", "", // need 3 character attribute
"PRESTAT:1,STR", "", // missing '='
"PRESTAT:1,ST", "", // need at least 3 characters
"PRESTAT", "", // missing ':'
"PREHP:should_be_numeric", "",
"PRESRGTEQ:should_be_numeric", "",
"PREDUMMYKIND:1,arg", ""
};
private String preString = "";
private String postString = "";
private PrerequisiteWriterTest(final int idx)
{
super("Test_" + testparams[idx << 1]);
preString = testparams[idx << 1];
postString = testparams[(idx << 1) + 1];
}
@Override
protected void runTest() throws Throwable
{
setName(preString);
PreTest(preString, postString);
}
@Override
protected void setUp() throws Exception
{
TestHelper.loadPlugins();
Globals.setUseGUI(false);
Globals.emptyLists();
GameMode gamemode = new GameMode("3.5");
SystemCollections.addToGameModeList(gamemode);
GameModeFileLoader.addDefaultTabInfo(gamemode);
SettingsHandler.setGame("3.5");
Alignment.createAllAlignments();
TestHelper.makeSizeAdjustments();
FactKey.getConstant("IsPC", STR_MGR);
FactKey.getConstant("LEGS", STR_MGR);
FactSetKey.getConstant("PANTHEONS", STR_MGR);
}
/**
* @param aPreString
* @param expectedOutput
*/
private void PreTest(final String aPreString, final String expectedOutput)
{
Prerequisite prereq = null;
boolean bExceptionThrown = false;
boolean bExceptionExpected = expectedOutput.isEmpty();
try
{
prereq = PreParserFactory.getInstance().parse(aPreString);
}
catch (PersistenceLayerException ple)
{
if (!bExceptionExpected)
{
ple.printStackTrace();
fail("parse caused PersistenceLayerException: "
+ ple.toString());
}
bExceptionThrown = true;
}
//
// Did we expect an exception to be thrown?
//
if (bExceptionExpected)
{
if (!bExceptionThrown)
{
if (prereq != null)
{
System.out.println(prereq.toString());
}
fail("exception expected but not thrown");
}
return;
}
if (prereq == null)
{
fail("Could not parse prereq: '" + aPreString + "'");
}
StringWriter sw = new StringWriter();
PrerequisiteWriter writer = new PrerequisiteWriter();
try
{
writer.write(sw, prereq);
}
catch (PersistenceLayerException ple)
{
fail("write caused PersistenceLayerException: " + ple.toString());
}
final String writerOutput = sw.toString();
System.out.println("'" + aPreString + "' returned '" + writerOutput
+ "'");
assertTrue(aPreString + " returned '" + writerOutput + "' (expected '"
+ expectedOutput + "'). " + prereq.toString(), expectedOutput
.equals(writerOutput));
//
// Test .lst output
//
pcgen.core.PObject pobj = new pcgen.core.PObject();
pobj.addPrerequisite(prereq);
assertTrue("PrerequisiteWriter.prereqsToString failure",
PrerequisiteWriter.prereqsToString(pobj).equals(expectedOutput));
try
{
writer.write(new myWriter(), prereq);
}
catch (PersistenceLayerException ple)
{
// expect a PersistenceLayerException as passed custom writer that throws IOExceptions
return;
}
fail("test writer failed to throw PersistenceLayerException");
}
private class myWriter extends Writer
{
@Override
public void flush() throws IOException
{
throwException();
}
@Override
public void close() throws IOException
{
throwException();
}
@Override
public void write(char[] cbuf, int off, int len) throws IOException
{
throwException();
}
@Override
public void write(int c) throws IOException
{
throwException();
}
@Override
public void write(String str) throws IOException
{
throwException();
}
@Override
public void write(String str, int off, int len) throws IOException
{
throwException();
}
private void throwException() throws IOException
{
throw new IOException("intentionally generated exception");
}
}
}