package plugin.lsttokens.datacontrol;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collection;
import pcgen.base.format.StringManager;
import pcgen.base.util.BasicIndirect;
import pcgen.cdom.base.PrimitiveCollection;
import pcgen.cdom.content.fact.FactDefinition;
import pcgen.cdom.converter.DereferencingConverter;
import pcgen.cdom.enumeration.FactKey;
import pcgen.cdom.reference.ReferenceManufacturer;
import pcgen.core.Campaign;
import pcgen.core.Domain;
import pcgen.persistence.PersistenceLayerException;
import pcgen.persistence.SourceFileLoader;
import pcgen.persistence.lst.CampaignSourceEntry;
import pcgen.rules.context.ConsolidatedListCommitStrategy;
import pcgen.rules.context.LoadContext;
import pcgen.rules.context.RuntimeLoadContext;
import pcgen.rules.context.RuntimeReferenceContext;
import pcgen.util.enumeration.Visibility;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import plugin.lsttokens.testsupport.TokenRegistration;
import static org.junit.Assert.*;
public class SelectableTokenIntegrationTest
{
private static final String PROP_1 = "Property";
private static final String PROP_2 = "Psychology";
private static final StringManager STRING_MGR = new StringManager();
private static final SelectableToken token = new SelectableToken();
FactDefinition cd;
protected LoadContext context;
protected static CampaignSourceEntry testCampaign;
@BeforeClass
public static void classSetUp() throws URISyntaxException
{
testCampaign =
new CampaignSourceEntry(new Campaign(), new URI(
"file:/Test%20Case"));
}
@Before
public void setUp() throws PersistenceLayerException, URISyntaxException
{
TokenRegistration.clearTokens();
TokenRegistration.register(token);
resetContext();
}
private void resetContext()
{
URI testURI = testCampaign.getURI();
context =
new RuntimeLoadContext(new RuntimeReferenceContext(),
new ConsolidatedListCommitStrategy());
context.setSourceURI(testURI);
context.setExtractURI(testURI);
cd = new FactDefinition();
cd.setDisplayName(PROP_1);
cd.setFormatManager(STRING_MGR);
cd.setName(PROP_1);
cd.setFactName(PROP_1);
cd.setUsableLocation(Domain.class);
cd.setVisibility(Visibility.DEFAULT);
}
@Test
public void testValidStringYes() throws PersistenceLayerException
{
assertNull(cd.getSelectable());
assertTrue(token.parseToken(context, cd, "YES").passed());
assertNotNull(cd.getSelectable());
assertTrue(cd.getSelectable().booleanValue());
context.getReferenceContext().importObject(cd);
SourceFileLoader.processFactDefinitions(context);
//Now check for group!!
Domain d1 = createDomain("Domain1", PROP_1, "Aggressive");
Domain d2 = createDomain("Domain2", PROP_1, "Aggressive");
Domain d3 = createDomain("Domain3", PROP_1, "Crazy");
Domain d4 = createDomain("Domain4", PROP_2, "Aggressive");
ReferenceManufacturer<Domain> mfg = context.getReferenceContext().getManufacturer(Domain.class);
PrimitiveCollection<Domain> pcf = context.getPrimitiveChoiceFilter(mfg, "PROPERTY=Aggressive");
context.getReferenceContext().resolveReferences(null);
Collection<?> coll = pcf.getCollection(null, new DereferencingConverter<>(null));
assertEquals(2, coll.size());
assertTrue(coll.contains(d1));
assertTrue(coll.contains(d2));
assertFalse(coll.contains(d3));
assertFalse(coll.contains(d4));
}
private Domain createDomain(String key, String prop, String val)
{
Domain d = new Domain();
d.setName(key);
FactKey<String> fk = FactKey.getConstant(prop, STRING_MGR);
d.put(fk, new BasicIndirect<>(STRING_MGR, val));
context.getReferenceContext().importObject(d);
return d;
}
}