From 3cb8dad3917cad4df95340253db5f5b743844f58 Mon Sep 17 00:00:00 2001 From: Eduardo Pedroni Date: Fri, 24 Jul 2015 22:29:10 +0200 Subject: Did many CLI tests, have to rethink the MTGUniverse thing to make it more testable --- test/eu/equalparts/cardbase/CardbaseSortTest.java | 2 +- test/eu/equalparts/cardbase/CardbaseTest.java | 62 +++-- .../equalparts/cardbase/cli/CardbaseCLITest.java | 260 +++++++++++++++++++-- .../eu/equalparts/cardbase/testutils/TestFile.java | 23 -- .../equalparts/cardbase/testutils/TestUtils.java | 24 -- test/notjson.txt | 1 - 6 files changed, 282 insertions(+), 90 deletions(-) delete mode 100644 test/eu/equalparts/cardbase/testutils/TestFile.java delete mode 100644 test/eu/equalparts/cardbase/testutils/TestUtils.java delete mode 100644 test/notjson.txt (limited to 'test') diff --git a/test/eu/equalparts/cardbase/CardbaseSortTest.java b/test/eu/equalparts/cardbase/CardbaseSortTest.java index 298872a..44b68be 100644 --- a/test/eu/equalparts/cardbase/CardbaseSortTest.java +++ b/test/eu/equalparts/cardbase/CardbaseSortTest.java @@ -30,7 +30,7 @@ public class CardbaseSortTest { @BeforeClass public static void setUpBeforeClass() throws Exception { ObjectMapper mapper = new ObjectMapper(); - testCards = mapper.readValue(CardbaseSortTest.class.getResourceAsStream("testcards.json"), new TypeReference>() {}); + testCards = mapper.readValue(CardbaseSortTest.class.getResourceAsStream("/testcards.json"), new TypeReference>() {}); } @AfterClass diff --git a/test/eu/equalparts/cardbase/CardbaseTest.java b/test/eu/equalparts/cardbase/CardbaseTest.java index 48a0bb4..82b05ba 100644 --- a/test/eu/equalparts/cardbase/CardbaseTest.java +++ b/test/eu/equalparts/cardbase/CardbaseTest.java @@ -3,6 +3,7 @@ package eu.equalparts.cardbase; import static org.junit.Assert.*; import java.io.File; +import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.Field; import java.util.Map; @@ -13,6 +14,7 @@ import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.junit.rules.TemporaryFolder; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.type.TypeReference; @@ -21,8 +23,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import eu.equalparts.cardbase.Cardbase; import eu.equalparts.cardbase.cards.Card; -import eu.equalparts.cardbase.testutils.TestFile; -import eu.equalparts.cardbase.testutils.TestUtils; /** * TODO deck functionality needs to be built into these. @@ -38,6 +38,9 @@ public class CardbaseTest { @Rule public final ExpectedException exception = ExpectedException.none(); + @Rule + public final TemporaryFolder tempFolder = new TemporaryFolder(); + @BeforeClass public static void setUpBeforeClass() throws Exception { ObjectMapper mapper = new ObjectMapper(); @@ -63,7 +66,7 @@ public class CardbaseTest { @Test public void fileCardbaseIsInitialised() throws Exception { - uut = new Cardbase(new File(getClass().getResource("/testbase.cb").toURI())); + uut = new Cardbase(new File(getClass().getResource("/testbase.cb").getFile())); assertEquals("Card collection contains the wrong number of card entries.", 6, uut.getCards().size()); @@ -102,20 +105,33 @@ public class CardbaseTest { @Test public void loadFileDoesNotExist() throws Exception { + File notAFile = tempFolder.newFile(); + tempFolder.delete(); + exception.expect(IOException.class); - uut = new Cardbase(new File("not a file")); + uut = new Cardbase(notAFile); } @Test public void loadFileHasWrongStructure() throws Exception { + File wrongStructure = tempFolder.newFile("wrongStructure.json"); + try (FileWriter writer = new FileWriter(wrongStructure)) { + writer.write("{\"field1\":\"content\",\"field2\":50,\"list\":[10,20,30]}"); + } + exception.expect(JsonMappingException.class); - uut = new Cardbase(new File(getClass().getResource("/testcards.json").toURI())); + uut = new Cardbase(wrongStructure); } @Test public void loadFileIsNotJson() throws Exception { + File notJson = tempFolder.newFile("wrongStructure.json"); + try (FileWriter writer = new FileWriter(notJson)) { + writer.write("This is a file which does not contain valid JSON."); + } + exception.expect(JsonParseException.class); - uut = new Cardbase(new File(getClass().getResource("/notjson.txt").toURI())); + uut = new Cardbase(notJson); } /*********************************************************************************** @@ -123,20 +139,19 @@ public class CardbaseTest { ***********************************************************************************/ @Test public void cardbaseIsSaved() throws Exception { - try (TestFile testFile = TestUtils.createValidTestFile("savetest.cb")) { - uut.writeCollection(testFile); - uut = new Cardbase(testFile); - assertEquals("Cardbase should contain no cards.", 0, uut.getCards().size()); + File testFile = tempFolder.newFile("saveTest.cb"); + uut.writeCollection(testFile); + uut = new Cardbase(testFile); + assertEquals("Cardbase should contain no cards.", 0, uut.getCards().size()); - uut.addCard(testCard); + uut.addCard(testCard); - uut.writeCollection(testFile); - uut = new Cardbase(testFile); - assertEquals("Cardbase should contain one card.", 1, uut.getCards().size()); - Card card = uut.getCard("M15", "281"); - assertNotNull("Cardbase should contain a Shivan Dragon.", card); - assertEquals("Cardbase should contain only one Shivan Dragon", new Integer(1), card.count); - } + uut.writeCollection(testFile); + uut = new Cardbase(testFile); + assertEquals("Cardbase should contain one card.", 1, uut.getCards().size()); + Card card = uut.getCard("M15", "281"); + assertNotNull("Cardbase should contain a Shivan Dragon.", card); + assertEquals("Cardbase should contain only one Shivan Dragon.", new Integer(1), card.count); } /* @@ -144,11 +159,10 @@ public class CardbaseTest { */ @Test public void saveFileCannotBeWrittenTo() throws Exception { - try (TestFile testFile = TestUtils.createValidTestFile("savetest.cb")) { - testFile.setWritable(false); - exception.expect(IOException.class); - uut.writeCollection(testFile); - } + File testFile = tempFolder.newFile("saveTest.cb"); + testFile.setWritable(false); + exception.expect(IOException.class); + uut.writeCollection(testFile); } @Test @@ -267,7 +281,7 @@ public class CardbaseTest { @Test public void correctCardCollectionIsReturnedByGetter() throws Exception { - uut = new Cardbase(new File(getClass().getResource("/testbase.cb").toURI())); + uut = new Cardbase(new File(getClass().getResource("/testbase.cb").getFile())); Map cards = new ObjectMapper().readValue(getClass().getResourceAsStream("/testbase.cb"), new TypeReference>() {}); assertTrue("Not all cards were returned by the getter.", uut.getCards().containsAll(cards.values())); diff --git a/test/eu/equalparts/cardbase/cli/CardbaseCLITest.java b/test/eu/equalparts/cardbase/cli/CardbaseCLITest.java index 0cc0cbc..e84c13c 100644 --- a/test/eu/equalparts/cardbase/cli/CardbaseCLITest.java +++ b/test/eu/equalparts/cardbase/cli/CardbaseCLITest.java @@ -2,8 +2,8 @@ package eu.equalparts.cardbase.cli; import static org.junit.Assert.*; -import java.io.IOException; -import java.io.OutputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.PrintStream; import java.util.Scanner; @@ -11,27 +11,32 @@ import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.junit.rules.TemporaryFolder; import com.fasterxml.jackson.databind.ObjectMapper; import eu.equalparts.cardbase.cards.Card; -import eu.equalparts.cardbase.testutils.TestFile; -import eu.equalparts.cardbase.testutils.TestUtils; public class CardbaseCLITest { private CardbaseCLI uut; - private static StringBuilder output = new StringBuilder(); + + private ByteArrayOutputStream testOutput; + private final PrintStream console = System.out; + private final String EOL = System.getProperty("line.separator"); + + @Rule + public ExpectedException exception = ExpectedException.none(); + + @Rule + public TemporaryFolder tempFolder = new TemporaryFolder(); @BeforeClass public static void setUpBeforeClass() throws Exception { -// System.setOut(new PrintStream(new OutputStream() { -// @Override -// public void write(int b) throws IOException { -// output.append((char) b); -// } -// }, true)); + } @AfterClass @@ -41,6 +46,7 @@ public class CardbaseCLITest { @Before public void setUp() throws Exception { uut = new CardbaseCLI(); + testOutput = new ByteArrayOutputStream(); } @After @@ -89,7 +95,7 @@ public class CardbaseCLITest { @Test public void leadingTrailingAndIntermediaryWhiteSpace() throws Exception { - String[] processedInput = uut.sanitiseInput(" this was a triumph "); + String[] processedInput = uut.sanitiseInput(" \t this \twas \t \t a triumph \t\t "); assertEquals("Wrong array length.", 4, processedInput.length); assertEquals("this", processedInput[0]); @@ -136,27 +142,247 @@ public class CardbaseCLITest { public void nameWithIllegalCharacters() throws Exception { String processedName = uut.sanitiseFileName("f1lEnämẽ\n\t\"--._-//? \t^|#ŧ@fhw9vLL'''"); - assertEquals("f1lEnm--._-fhw9vLL.cb", processedName); + assertEquals("f1lEnm--._-//fhw9vLL.cb", processedName); } /*********************************************************************************** - * Write method tests, happy path + * Constructor tests, happy path + ***********************************************************************************/ + @Test + public void instantiationWithoutArguments() throws Exception { + uut = new CardbaseCLI(); + + assertEquals("Cardbase contains the wrong number of card entries.", 0, uut.cardbase.getCards().size()); + } + + @Test + public void instantiationWithCardbaseFile() throws Exception { + uut = new CardbaseCLI(getClass().getResource("/testbase.cb").getFile()); + + assertEquals("Cardbase contains the wrong number of card entries.", 6, uut.cardbase.getCards().size()); + + class CardInfo { + String setCode, number; + Integer count; + public CardInfo(String setCode, String number, Integer count) { + this.setCode = setCode; + this.number = number; + this.count = count; + } + } + CardInfo[] testCards = new CardInfo[] { + new CardInfo("M12", "34", 2), + new CardInfo("FRF", "129", 8), + new CardInfo("M12", "26", 1), + new CardInfo("FRF", "127", 1), + new CardInfo("FRF", "128", 1), + new CardInfo("M12", "152", 1)}; + + for (CardInfo ci : testCards) { + Card card = uut.cardbase.getCard(ci.setCode, ci.number); + assertNotNull("Missing card, set " + ci.setCode + ", " + ci.number, card); + assertEquals("Wrong card count, set " + ci.setCode + ", " + ci.number, ci.count, card.count); + } + } + + /* + * Edge cases + */ + @Test + public void instantiationWithInvalidArguments() throws Exception { + File notAFile = tempFolder.newFile(); + tempFolder.delete(); + + exception.expect(IllegalArgumentException.class); + uut = new CardbaseCLI(notAFile.getAbsolutePath()); + } + + @Test + public void instantiationWithEmptyArguments() throws Exception { + uut = new CardbaseCLI(""); + + assertEquals("Cardbase contains the wrong number of card entries.", 0, uut.cardbase.getCards().size()); + } + + /*********************************************************************************** + * help() tests, happy path + ***********************************************************************************/ + @Test + public void helpInformationIsPrinted() throws Exception { + try (Scanner scanner = new Scanner(getClass().getResourceAsStream("/help_en"))) { + String help = scanner.useDelimiter("\\Z").next(); + + try { + System.setOut(new PrintStream(testOutput)); + uut.help(); + } finally { + System.setOut(console); + } + assertEquals(help + EOL, testOutput.toString()); + } + } + + /*********************************************************************************** + * write() tests, happy path ***********************************************************************************/ @Test public void writeCardbaseToSpecifiedFile() throws Exception { + File testFile = tempFolder.newFile("saveTest.cb"); + try (Scanner scanner = new Scanner(getClass().getResourceAsStream("/shivandragon.json")); - TestFile testFile = TestUtils.createValidTestFile("testsave.cb"); Scanner scanner2 = new Scanner(testFile)) { - String cardJSON = scanner.useDelimiter("\\Z").next(); Card testCard = new ObjectMapper().readValue(cardJSON, Card.class); testCard.count = 1; uut.cardbase.addCard(testCard); + + try { + System.setOut(new PrintStream(testOutput)); + uut.write(testFile.getAbsolutePath()); + } finally { + System.setOut(console); + } + + String save = scanner2.useDelimiter("\\Z").next(); + assertTrue(save.contains(cardJSON)); + assertEquals("Cardbase was saved to \"" + testFile.getAbsolutePath() + "\". " + + "Subsequent writes will be done to this same file unless otherwise requested." + EOL, testOutput.toString()); + } + } + + @Test + public void specifiedFileIsSubsequentlyUsedByDefault() throws Exception { + File testFile = tempFolder.newFile("saveTest.cb"); + + try (Scanner scanner = new Scanner(getClass().getResourceAsStream("/shivandragon.json")); + Scanner scanner2 = new Scanner(testFile)) { uut.write(testFile.getAbsolutePath()); + String cardJSON = scanner.useDelimiter("\\Z").next(); + Card testCard = new ObjectMapper().readValue(cardJSON, Card.class); + testCard.count = 1; + uut.cardbase.addCard(testCard); + + try { + System.setOut(new PrintStream(testOutput)); + uut.write(); + } finally { + System.setOut(console); + } + String save = scanner2.useDelimiter("\\Z").next(); assertTrue(save.contains(cardJSON)); - + + assertEquals("Cardbase was saved to \"" + testFile.getAbsolutePath() + "\". " + + "Subsequent writes will be done to this same file unless otherwise requested." + EOL, testOutput.toString()); + } + } + + @Test + public void noFileIsProvidedAndNoDefaultIsAvailable() throws Exception { + try { + System.setOut(new PrintStream(testOutput)); + uut.write(); + } finally { + System.setOut(console); } + assertEquals("Please provide a file name." + EOL, testOutput.toString()); } + + /* + * Edge cases + */ + @Test + public void pathProvidedIsDirectory() throws Exception { + File directory = tempFolder.newFolder("testdirectory.cb"); + try { + System.setOut(new PrintStream(testOutput)); + uut.write(directory.getAbsolutePath()); + } finally { + System.setOut(console); + } + assertEquals("Could not write to \"" + directory.getAbsolutePath() + "\"." + EOL, testOutput.toString()); + } + + /*********************************************************************************** + * version() tests, happy path + ***********************************************************************************/ + @Test + public void correctVersionIsPrinted() throws Exception { + try { + System.setOut(new PrintStream(testOutput)); + uut.version(); + } finally { + System.setOut(console); + } + assertEquals("Cardbase v" + CardbaseCLI.VERSION + EOL, testOutput.toString()); + } + + /*********************************************************************************** + * exit() tests, happy path + ***********************************************************************************/ + @Test + public void exitFlagIsRaised() throws Exception { + uut.exit(); + + assertEquals("Incorrect state for exit flag.", true, uut.exit); + } + + @Test + public void saveReminderIsPrintedIfPromptFlagIsRaised() throws Exception { + uut.savePrompt = true; + try { + System.setOut(new PrintStream(testOutput)); + uut.exit(); + } finally { + System.setOut(console); + } + assertEquals("Don't forget to save. If you really wish to quit without saving, type \"exit\" again." + EOL, testOutput.toString()); + assertEquals("Incorrect state for exit flag.", false, uut.exit); + } + + @Test + public void exitFlagIsRaisedAfterSavePromptIsAcknowledged() throws Exception { + uut.savePrompt = true; + + uut.exit(); + + assertEquals("Incorrect state for exit flag.", false, uut.exit); + assertEquals("Incorrect state for save flag.", false, uut.savePrompt); + + uut.exit(); + + assertEquals("Incorrect state for exit flag.", true, uut.exit); + } + + + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/eu/equalparts/cardbase/testutils/TestFile.java b/test/eu/equalparts/cardbase/testutils/TestFile.java deleted file mode 100644 index ac666a9..0000000 --- a/test/eu/equalparts/cardbase/testutils/TestFile.java +++ /dev/null @@ -1,23 +0,0 @@ -package eu.equalparts.cardbase.testutils; - -import java.io.File; - -public class TestFile extends File implements AutoCloseable { - - /** - * - */ - private static final long serialVersionUID = 3716372675161543906L; - - public TestFile(String pathname) { - super(pathname); - } - - @Override - public void close() throws Exception { - delete(); - } - - - -} diff --git a/test/eu/equalparts/cardbase/testutils/TestUtils.java b/test/eu/equalparts/cardbase/testutils/TestUtils.java deleted file mode 100644 index ba590c8..0000000 --- a/test/eu/equalparts/cardbase/testutils/TestUtils.java +++ /dev/null @@ -1,24 +0,0 @@ -package eu.equalparts.cardbase.testutils; - -public class TestUtils { - - public static TestFile createValidTestFile(String fileName) throws Exception { - TestFile testFile = new TestFile(fileName); - if (!testFile.exists()) { - if (testFile.createNewFile()) { - if (testFile.canWrite()) { - return testFile; - } else { - throw new IllegalArgumentException("Cannot write to " + testFile.getAbsolutePath() + ", aborting..."); - } - } else { - throw new IllegalArgumentException(testFile.getAbsolutePath() + " could not be created, aborting..."); - } - } else { - throw new IllegalArgumentException(testFile.getAbsolutePath() + " already exists, aborting..."); - } - } - - - -} diff --git a/test/notjson.txt b/test/notjson.txt deleted file mode 100644 index 7705955..0000000 --- a/test/notjson.txt +++ /dev/null @@ -1 +0,0 @@ -This is a file which does not contain valid JSON. \ No newline at end of file -- cgit v1.2.3