package pcgen.rules.persistence; import java.net.URI; import pcgen.base.format.NumberManager; import pcgen.base.format.StringManager; import pcgen.cdom.format.table.DataTable; import pcgen.persistence.PersistenceLayerException; import pcgen.rules.context.ConsolidatedListCommitStrategy; import pcgen.rules.context.LoadContext; import pcgen.rules.context.RuntimeLoadContext; import pcgen.rules.context.RuntimeReferenceContext; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; public class TableLoaderTest { private LoadContext context; private URI uri; private TableLoader loader; @Before public void setUp() throws Exception { uri = new URI("file:/Test%20Case"); context = new RuntimeLoadContext(new RuntimeReferenceContext(), new ConsolidatedListCommitStrategy()); loader = new TableLoader(); } @Test public void testNoNames() { try { loader.loadLstString(context, uri, "STARTTABLE:A\nENDTABLE:A"); fail("Expected Failure"); } catch (PersistenceLayerException e) { //Yes } } @Test public void testNoFormats() { try { loader.loadLstString(context, uri, "STARTTABLE:A\nName1,Name2ENDTABLE:A"); fail("Expected Failure"); } catch (PersistenceLayerException e) { //Yes } } @Test public void testNoData() { try { loader.loadLstString(context, uri, "STARTTABLE:A\nName1,Name2\nSTRING,NUMBER\nENDTABLE:A"); fail("Expected Failure"); } catch (PersistenceLayerException e) { //Yes } } @Test public void testTwoStartAtData() { try { loader.loadLstString(context, uri, "STARTTABLE:A\nName\nSTRING\nSTARTTABLE:B"); fail("Expected Failure"); } catch (PersistenceLayerException e) { //Yes } } @Test public void testTwoStartAtFormat() { try { loader.loadLstString(context, uri, "STARTTABLE:A\nName\nSTARTTABLE:B"); fail("Expected Failure"); } catch (PersistenceLayerException e) { //Yes } } @Test public void testTwoStart() { try { loader.loadLstString(context, uri, "STARTTABLE:A\nSTARTTABLE:B"); fail("Expected Failure"); } catch (PersistenceLayerException e) { //Yes } } @Test public void testNoEnd() { try { loader.loadLstString(context, uri, "STARTTABLE:A\nName\nSTRING\n"); fail("Expected Failure"); } catch (PersistenceLayerException e) { //Yes } } @Test public void testNoStart() { try { loader.loadLstString(context, uri, "\nName\nSTRING\n"); fail("Expected Failure"); } catch (PersistenceLayerException e) { //Yes } } @Test public void testResetOnEnd() { try { loader.loadLstString(context, uri, "STARTTABLE:A\nName\nSTRING\nFoo\nENDTABLE:A\nBar"); fail("Expected Failure"); } catch (PersistenceLayerException e) { //Yes } } @Test public void testBadEnd() { try { loader.loadLstString(context, uri, "STARTTABLE:A\nName\nSTRING\nFoo\nENDTABLE:A,BCD"); fail("Expected Failure"); } catch (PersistenceLayerException e) { //Yes } } @Test public void testBadStart() { try { loader.loadLstString(context, uri, "STARTTABLE:A,,,Problem\nName\nSTRING\nFoo\nENDTABLE:A\n"); fail("Expected Failure"); } catch (PersistenceLayerException e) { //Yes } } @Test public void testSkippedName() { try { loader.loadLstString(context, uri, "STARTTABLE:A\nName,,Value2\nSTRING,NUMBER,NUMBER\nFoo,1,2\nENDTABLE:A\n"); fail("Expected Failure"); } catch (PersistenceLayerException e) { //Yes } } @Test public void testMissingName() { try { loader.loadLstString(context, uri, "STARTTABLE:A\nName,\nSTRING,NUMBER\nFoo,1\nENDTABLE:A\n"); fail("Expected Failure"); } catch (PersistenceLayerException e) { //Yes } } @Test public void testMissingName2() { try { //Doesn't need to have the comma loader.loadLstString(context, uri, "STARTTABLE:A\nName\nSTRING,NUMBER\nFoo,1\nENDTABLE:A\n"); fail("Expected Failure"); } catch (PersistenceLayerException e) { //Yes } } @Test public void testSkippedFormat() { try { loader.loadLstString(context, uri, "STARTTABLE:A\nName,Value1,Value2\nSTRING,,NUMBER\nFoo,1,2\nENDTABLE:A\n"); fail("Expected Failure"); } catch (PersistenceLayerException e) { //Yes } } @Test public void testMissingFormat() { try { loader.loadLstString(context, uri, "STARTTABLE:A\nName,Value\nSTRING,\nFoo,1\nENDTABLE:A\n"); fail("Expected Failure"); } catch (PersistenceLayerException e) { //Yes } } @Test public void testMissingFormat2() { try { //Doesn't need to have the comma loader.loadLstString(context, uri, "STARTTABLE:A\nName,Value\nSTRING\nFoo,1\nENDTABLE:A\n"); fail("Expected Failure"); } catch (PersistenceLayerException e) { //Yes } } @Test public void testTooMuchData() { try { loader.loadLstString(context, uri, "STARTTABLE:A\nName,Value\nSTRING,NUMBER\nFoo,1,2\nENDTABLE:A\n"); fail("Expected Failure"); } catch (PersistenceLayerException | IndexOutOfBoundsException | IllegalArgumentException e) { //Yes } } @Test public void testBadFormat() { try { loader.loadLstString(context, uri, "STARTTABLE:A\nName,Value\nSTRING,NIMBLER\nFoo,1\nENDTABLE:A\n"); fail("Expected Failure"); } catch (PersistenceLayerException | IllegalArgumentException e) { //Yes } } @Test public void testDataIncorrectFormat() { try { loader.loadLstString(context, uri, "STARTTABLE:A\nName,Value\nSTRING,NUMBER\nFoo,Bar\nENDTABLE:A\n"); fail("Expected Failure"); } catch (PersistenceLayerException | IllegalArgumentException e) { //Yes } } //TODO Blank Data in middle of Row? //TODO Blank Data at end of row? @Test public void testBasic() { try { loader.loadLstString(context, uri, "#Let me tell you about this table\n\n,,,\n" + "STARTTABLE:A\n\n,,,\n" + "#It's the story of a parsing test\n" + "Name,Value,\n\n,,,\n" + "\"#And testing tolerance\",For lots of things\n" + "STRING,NUMBER,,\n\n,,,\n\n" + "#Because really....\n" + "This,1\n\n" + "#Why call the comments?\n,,,\n" + "\"That\",\"2\"\n" + "\"The \"\"Other\"\"\",\"3\"\n,,,\n\n" + "ENDTABLE:A\n" + "#They seem to just take up a lot of space"); DataTable a = context.getReferenceContext() .silentlyGetConstructedCDOMObject(DataTable.class, "A"); assertEquals(2, a.getColumnCount()); assertEquals(new StringManager(), a.getFormat(0)); assertEquals(new NumberManager(), a.getFormat(1)); assertEquals("This", a.get("Name", 0)); assertEquals("That", a.get("Name", 1)); assertEquals("The \"Other\"", a.get("Name", 2)); assertEquals(1, a.get("Value", 0)); assertEquals(2, a.get("Value", 1)); assertEquals(3, a.get("Value", 2)); assertEquals(2, a.lookupExact("That", "Value")); } catch (PersistenceLayerException e) { fail("Did not Expect Failure: " + e.getLocalizedMessage()); } } @Test public void testIndependence() { try { loader.loadLstString(context, uri, "STARTTABLE:A\n\n,,,\n" + "Name,Value,\n\n,,,\n" + "STRING,NUMBER,,\n\n,,,\n\n" + "This,1\n\n" + "\"That\",\"2\"\n" + "ENDTABLE:A\n" + "#What comments?\n,,,\n" + "STARTTABLE:B\n\n,,,\n" + "Name,Value,\n\n,,,\n" + "STRING,NUMBER,,\n\n,,,\n\n" + "\"The \"\"Other\"\"\",\"3\"\n,,,\n\n" + "ENDTABLE:B\n"); DataTable a = context.getReferenceContext() .silentlyGetConstructedCDOMObject(DataTable.class, "A"); DataTable b = context.getReferenceContext() .silentlyGetConstructedCDOMObject(DataTable.class, "B"); assertEquals(2, a.getColumnCount()); assertEquals(new StringManager(), a.getFormat(0)); assertEquals(new NumberManager(), a.getFormat(1)); assertEquals("This", a.get("Name", 0)); assertEquals("That", a.get("Name", 1)); assertEquals("The \"Other\"", b.get("Name", 0)); assertEquals(1, a.get("Value", 0)); assertEquals(2, a.get("Value", 1)); assertEquals(3, b.get("Value", 0)); } catch (PersistenceLayerException e) { fail("Did not Expect Failure: " + e.getLocalizedMessage()); } } @Test public void testDuplicateIndependence() { try { loader.loadLstString(context, uri, "STARTTABLE:A\n\n,,,\n" + "Name,Value,\n\n,,,\n" + "STRING,NUMBER,,\n\n,,,\n\n" + "This,1\n\n" + "\"That\",\"2\"\n" + "ENDTABLE:A\n" + "#What comments?\n,,,\n" + "STARTTABLE:A\n\n,,,\n" + "Name,Value,\n\n,,,\n" + "STRING,NUMBER,,\n\n,,,\n\n" + "\"The \"\"Other\"\"\",\"3\"\n,,,\n\n" + "ENDTABLE:A\n"); DataTable a = context.getReferenceContext() .silentlyGetConstructedCDOMObject(DataTable.class, "A"); assertEquals(2, a.getColumnCount()); assertEquals(new StringManager(), a.getFormat(0)); assertEquals(new NumberManager(), a.getFormat(1)); assertEquals("This", a.get("Name", 0)); assertEquals("That", a.get("Name", 1)); assertEquals(1, a.get("Value", 0)); assertEquals(2, a.get("Value", 1)); context.getReferenceContext().forget(a); DataTable b = context.getReferenceContext() .silentlyGetConstructedCDOMObject(DataTable.class, "A"); assertEquals("The \"Other\"", b.get("Name", 0)); assertEquals(3, b.get("Value", 0)); } catch (PersistenceLayerException e) { fail("Did not Expect Failure: " + e.getLocalizedMessage()); } } @Test public void testMismatchedFormat() { try { loader.loadLstString(context, uri, "STARTTABLE:A\n\n,,,\n" + "Name,Value,\n\n,,,\n" + "STRING,NUMBER,,\n\n,,,\n\n" + "This,1\n\n" + "\"That\",\"2\"\n" + "ENDTABLE:A\n" + "#What comments?\n,,,\n" + "STARTTABLE:B\n\n,,,\n" + "Name,Value,\n\n,,,\n" + "STRING,STRING,,\n\n,,,\n\n" + "\"The \"\"Other\"\"\",\"3\"\n,,,\n\n" + "ENDTABLE:A\n"); fail("Expected Failure: Mismatched Formats"); } catch (PersistenceLayerException e) { //yep } } }