/*
* Copyright (c) 2014 Tom Parker <thpr@users.sourceforge.net>
*
* This program 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 program 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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
package tokenmodel.testsupport;
import pcgen.cdom.base.UserSelection;
import pcgen.cdom.content.CNAbility;
import pcgen.cdom.content.CNAbilityFactory;
import pcgen.cdom.enumeration.Nature;
import pcgen.cdom.helper.CNAbilitySelection;
import pcgen.core.Ability;
import pcgen.core.AbilityCategory;
import pcgen.rules.persistence.token.CDOMToken;
import pcgen.rules.persistence.token.ParseResult;
import plugin.lsttokens.ability.StackToken;
import plugin.lsttokens.choose.NoChoiceToken;
import plugin.lsttokens.testsupport.TokenRegistration;
public abstract class AbstractAbilityGrantCheckTest extends AbstractTokenModelTest
{
private static final plugin.lsttokens.AbilityLst ABILITY_TOKEN =
new plugin.lsttokens.AbilityLst();
protected static final plugin.lsttokens.deprecated.AutoFeatToken AUTO_FEAT_TOKEN =
new plugin.lsttokens.deprecated.AutoFeatToken();
private static final plugin.lsttokens.deprecated.ChooseFeatSelectionToken CHOOSE_FEATSELECTION_TOKEN =
new plugin.lsttokens.deprecated.ChooseFeatSelectionToken();
private static final plugin.lsttokens.TypeLst TYPE_TOKEN =
new plugin.lsttokens.TypeLst();
private static final StackToken ABILITY_STACK_TOKEN = new StackToken();
private static final NoChoiceToken CHOOSE_NOCHOICE_TOKEN =
new NoChoiceToken();
@Override
protected void setUp() throws Exception
{
super.setUp();
TokenRegistration.register(ABILITY_TOKEN);
}
public Ability getMultNo(String s)
{
Ability a = create(Ability.class, s);
context.getReferenceContext().reassociateCategory(AbilityCategory.FEAT, a);
ParseResult result = TYPE_TOKEN.parseToken(context, a, "Selectable");
if (result != ParseResult.SUCCESS)
{
result.printMessages();
fail("Test Setup Failed");
}
return a;
}
public Ability getMultYesStackNo(String s, String target)
{
Ability a = create(Ability.class, s);
context.getReferenceContext().reassociateCategory(AbilityCategory.FEAT, a);
ParseResult result = AUTO_FEAT_TOKEN.parseToken(context, a, "FEAT|%LIST");
if (result != ParseResult.SUCCESS)
{
result.printMessages();
fail("Test Setup Failed");
}
result = ABILITY_MULT_TOKEN.parseToken(context, a, "YES");
if (result != ParseResult.SUCCESS)
{
result.printMessages();
fail("Test Setup Failed");
}
result = CHOOSE_FEATSELECTION_TOKEN.parseToken(context, a, target);
if (result != ParseResult.SUCCESS)
{
result.printMessages();
fail("Test Setup Failed");
}
return a;
}
public Ability getMultYesStackYes(String s, String target)
{
Ability a = create(Ability.class, s);
context.getReferenceContext().reassociateCategory(AbilityCategory.FEAT, a);
ParseResult result = AUTO_FEAT_TOKEN.parseToken(context, a, "FEAT|%LIST");
if (result != ParseResult.SUCCESS)
{
result.printMessages();
fail("Test Setup Failed");
}
result = ABILITY_MULT_TOKEN.parseToken(context, a, "YES");
if (result != ParseResult.SUCCESS)
{
result.printMessages();
fail("Test Setup Failed");
}
result = ABILITY_STACK_TOKEN.parseToken(context, a, "YES");
if (result != ParseResult.SUCCESS)
{
result.printMessages();
fail("Test Setup Failed");
}
result = CHOOSE_FEATSELECTION_TOKEN.parseToken(context, a, target);
if (result != ParseResult.SUCCESS)
{
result.printMessages();
fail("Test Setup Failed");
}
return a;
}
public Ability getMultYesStackNoChooseNoChoice(String s)
{
Ability a = create(Ability.class, s);
context.getReferenceContext().reassociateCategory(AbilityCategory.FEAT, a);
ParseResult result = ABILITY_MULT_TOKEN.parseToken(context, a, "YES");
if (result != ParseResult.SUCCESS)
{
result.printMessages();
fail("Test Setup Failed");
}
result = CHOOSE_NOCHOICE_TOKEN.parseToken(context, a, null);
if (result != ParseResult.SUCCESS)
{
result.printMessages();
fail("Test Setup Failed");
}
return a;
}
public Ability getMultYesStackYesChooseNoChoice(String s)
{
Ability a = create(Ability.class, s);
context.getReferenceContext().reassociateCategory(AbilityCategory.FEAT, a);
ParseResult result = ABILITY_MULT_TOKEN.parseToken(context, a, "YES");
if (result != ParseResult.SUCCESS)
{
result.printMessages();
fail("Test Setup Failed");
}
result = ABILITY_STACK_TOKEN.parseToken(context, a, "YES");
if (result != ParseResult.SUCCESS)
{
result.printMessages();
fail("Test Setup Failed");
}
result = CHOOSE_NOCHOICE_TOKEN.parseToken(context, a, null);
if (result != ParseResult.SUCCESS)
{
result.printMessages();
fail("Test Setup Failed");
}
return a;
}
public void testMultNo()
{
getMultNo("MultNo");
Ability parent = getGrantor("MultNo");
finishLoad();
applyParent(parent);
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "Parent"));
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "Grantor"));
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "MultNo"));
}
public void testNaturalParens()
{
getMultNo("Natural (Parens)");
Ability parent = getGrantor("Natural (Parens)");
finishLoad();
applyParent(parent);
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "Parent"));
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "Grantor"));
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "Natural (Parens)"));
}
public void testMultYes()
{
getMultNo("Target");
getMultYesStackNo("MultYes", "Target");
Ability parent = getGrantor("MultYes (Target)");
finishLoad();
applyParent(parent);
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "Parent"));
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "Grantor"));
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "MultYes"));
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "Target"));
}
public void testMultYesTargetParens()
{
getMultNo("Target (Parens)");
getMultYesStackNo("MultYes", "Target (Parens)");
Ability parent = getGrantor("MultYes (Target (Parens))");
finishLoad();
applyParent(parent);
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "Parent"));
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "Grantor"));
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "MultYes"));
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "Target (Parens)"));
}
public void testMultYesNC()
{
getMultYesStackNoChooseNoChoice("MultYesNC");
Ability parent = getGrantor("MultYesNC");
finishLoad();
applyParent(parent);
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "Parent"));
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "Grantor"));
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "MultYesNC"));
}
public void testStackYes()
{
getMultNo("Target");
getMultYesStackNo("MultYesStackYes", "Target");
Ability parent = getGrantor("MultYesStackYes (Target)");
finishLoad();
applyParent(parent);
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "Parent"));
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "Grantor"));
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "MultYesStackYes"));
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "Target"));
}
public void testStackYesNC()
{
getMultYesStackNoChooseNoChoice("MultYesStackYesNC");
Ability parent = getGrantor("MultYesStackYesNC");
finishLoad();
applyParent(parent);
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "Parent"));
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "Grantor"));
assertTrue(pc.hasAbilityKeyed(AbilityCategory.FEAT, "MultYesStackYesNC"));
}
private void applyParent(Ability parent)
{
CNAbility cna = CNAbilityFactory.getCNAbility(AbilityCategory.FEAT, Nature.NORMAL, parent);
CNAbilitySelection cnas = new CNAbilitySelection(cna);
pc.addAbility(cnas, UserSelection.getInstance(), this);
}
public void generic()
{
//Need to do these with 2 choices and test :P
// 6) Ability granted by a ADD:VFEAT token where the target (in parens) is MULT:YES STACK:YES CHOOSE:NOCHOICE and the stackable items are chosen more than once (STACK is used)
// 7) Ability granted by a ADD:VFEAT token where the target (in parens) is MULT:YES STACK:YES and any CHOOSE except NOCHOICE or USERINPUT. and the stackable items are chosen more than once (STACK is used)
Ability multyesstackyes = getMultYesStackYes("MultYes", "Target");
Ability multyesstackyesNC = getMultYesStackYesChooseNoChoice("MultYes");
}
private Ability getGrantor(String s)
{
getMultYesStackNo("Grantor", s);
Ability parent = getMultNo("Parent");
ParseResult result =
getGrantToken().parseToken(context, parent,
getGrantPrefix() + "Grantor (" + s + ")");
if (result != ParseResult.SUCCESS)
{
result.printMessages();
fail("Test Setup Failed");
}
return parent;
}
protected String getGrantPrefix()
{
return "";
}
protected abstract CDOMToken<? super Ability> getGrantToken();
// {
// //TODO Need to cycle through:
// //ADD:FEAT
// //ABILITY (Virtual)
// //ABILITY (Normal)
// //AUTO:FEAT
// //ADD:VFEAT
// //ADD:ABILITY (Virtual)
// //ADD:ABILITY (Normal)
// //VFEAT:
// //(domain's Feat)
// //(race's Feat)
// //(template's Feat)
// return ADD_FEAT_TOKEN;
// }
/*
* Is it at all possible to deal with
*
* This (%LIST) in Ability, Domain Feat, Auto Feat
*/
@Override
public CDOMToken<?> getToken()
{
return getGrantToken();
}
}