From 41981711f0240976c4fffc861995a8f2efebe191 Mon Sep 17 00:00:00 2001 From: Eduardo Pedroni Date: Thu, 30 Jul 2015 10:37:54 +0200 Subject: Refactored comparators, did a little bit of CLI testing but will need to look into mocking --- src/eu/equalparts/cardbase/cli/CardbaseCLI.java | 8 +++-- .../cardbase/comparator/CardComparator.java | 24 +++---------- .../cardbase/comparator/ComparatorDelegates.java | 11 ++++++ .../cardbase/comparator/SpecialFields.java | 4 ++- src/eu/equalparts/cardbase/utils/MTGUniverse.java | 26 ++++++-------- .../equalparts/cardbase/cli/CardbaseCLITest.java | 41 ++++++++++++++++++++++ 6 files changed, 76 insertions(+), 38 deletions(-) diff --git a/src/eu/equalparts/cardbase/cli/CardbaseCLI.java b/src/eu/equalparts/cardbase/cli/CardbaseCLI.java index 0b2c869..8c0c97a 100644 --- a/src/eu/equalparts/cardbase/cli/CardbaseCLI.java +++ b/src/eu/equalparts/cardbase/cli/CardbaseCLI.java @@ -47,6 +47,10 @@ public final class CardbaseCLI { * The last action performed by the user. */ Action lastAction = null; + /** + * + */ + MTGUniverse mtgUniverse = new MTGUniverse(); /** * The currently selected set, from which new cards are added. */ @@ -267,7 +271,7 @@ public final class CardbaseCLI { * Print a list of valid set codes. */ void sets() { - for (CardSetInformation set : MTGUniverse.getCardSetList()) { + for (CardSetInformation set : mtgUniverse.getCardSetList()) { // CardSet has an overridden toString() System.out.println(set); } @@ -281,7 +285,7 @@ public final class CardbaseCLI { void set(String... args) { if (args != null && args.length > 0) { try { - selectedSet = MTGUniverse.getFullCardSet(args[0]); + selectedSet = mtgUniverse.getFullCardSet(args[0]); // if the set code is invalid, null is returned if (selectedSet != null) { System.out.println("Selected set: " + selectedSet.name + "."); diff --git a/src/eu/equalparts/cardbase/comparator/CardComparator.java b/src/eu/equalparts/cardbase/comparator/CardComparator.java index 9f90e00..7173109 100644 --- a/src/eu/equalparts/cardbase/comparator/CardComparator.java +++ b/src/eu/equalparts/cardbase/comparator/CardComparator.java @@ -37,7 +37,7 @@ public class CardComparator implements Comparator { /** * The comparison delegate to use for the specified field. */ - private BiFunction selectedComparisonDelegate = this::defaultComparison; + private BiFunction comparisonDelegate = (field1, field2) -> field1.compareTo(field2); /** * Creates a new comparator for the specified field only. This class @@ -58,9 +58,9 @@ public class CardComparator implements Comparator { // if annotated with a special comparator, set the comparison delegate here for (Annotation annotation : fieldToCompare.getAnnotations()) { if (annotation.annotationType() == DirtyNumber.class) { - this.selectedComparisonDelegate = ComparatorDelegates::compareDirtyNumber; + this.comparisonDelegate = ComparatorDelegates::compareDirtyNumber; } else if (annotation.annotationType() == Rarity.class) { - this.selectedComparisonDelegate = ComparatorDelegates::compareRarity; + this.comparisonDelegate = ComparatorDelegates::compareRarity; } } } else { @@ -72,7 +72,7 @@ public class CardComparator implements Comparator { public int compare(Card o1, Card o2) { /* * we've already checked that the field is self comparable, - * so we are now free to cast to whatever type it is and compare. + * so we are now free to cast to comparable */ try { Comparable field1 = (Comparable) fieldToCompare.get(o1); @@ -88,7 +88,7 @@ public class CardComparator implements Comparator { } else if (field2 == null) { return 1; } else { - return selectedComparisonDelegate.apply(field1, field2); + return comparisonDelegate.apply(field1, field2); } } catch (IllegalArgumentException e) { @@ -102,20 +102,6 @@ public class CardComparator implements Comparator { // fallback, this shouldn't happen return 0; } - - /** - * The standard comparison operation, which uses the field's own {@code compareTo()} - * method. - * - * @param field1 the first object to be compared. - * @param field2 the second object to be compared. - * @return a negative integer, zero, or a positive integer as the - * first argument is less than, equal to, or greater than the - * second. - */ - private int defaultComparison(Comparable field1, Comparable field2) { - return field1.compareTo(field2); - } /** * Use reflection to determine if the specified class can be compared with itself. diff --git a/src/eu/equalparts/cardbase/comparator/ComparatorDelegates.java b/src/eu/equalparts/cardbase/comparator/ComparatorDelegates.java index 7bf09ac..cede956 100644 --- a/src/eu/equalparts/cardbase/comparator/ComparatorDelegates.java +++ b/src/eu/equalparts/cardbase/comparator/ComparatorDelegates.java @@ -8,6 +8,17 @@ final class ComparatorDelegates { /* * Delegates */ + /** + * Compares two dirty numbers, that is, strings containing a single number + * and, optionally, additional non-numerical characters. + * For instance, when comparing "150a" and "36", this comparator delegate + * first compares 150 with 36 using the standard integer comparison, and + * returns an integer > 1 because 150 > 36. + * + * @param field1 the first field to compare. + * @param field2 the second field to compare. + * @return a value smaller than, equal to or greater than 0 according to the standard comparison convention. + */ public static Integer compareDirtyNumber(Comparable field1, Comparable field2) { // this assumes that the format is uninterrupted numbers and letters String number1 = ((String) field1).replaceAll("[^0-9]+", ""); diff --git a/src/eu/equalparts/cardbase/comparator/SpecialFields.java b/src/eu/equalparts/cardbase/comparator/SpecialFields.java index f17ccc6..692f774 100644 --- a/src/eu/equalparts/cardbase/comparator/SpecialFields.java +++ b/src/eu/equalparts/cardbase/comparator/SpecialFields.java @@ -4,7 +4,9 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -public class SpecialFields { +public final class SpecialFields { + + private SpecialFields() {} @Retention(RetentionPolicy.RUNTIME) public @interface DirtyNumber {} diff --git a/src/eu/equalparts/cardbase/utils/MTGUniverse.java b/src/eu/equalparts/cardbase/utils/MTGUniverse.java index b40e518..98067fa 100644 --- a/src/eu/equalparts/cardbase/utils/MTGUniverse.java +++ b/src/eu/equalparts/cardbase/utils/MTGUniverse.java @@ -18,7 +18,7 @@ import eu.equalparts.cardbase.cards.FullCardSet; /** * Access point to the complete set of cards that exist in the - * MTG universe. This class has a series of utility functions that + * MTG universe. This class has a series of methods that * query remote databases to acquire card information. *
* Conversely, {@code Cardbase}'s methods are used solely to @@ -32,24 +32,19 @@ public final class MTGUniverse { /** * The base URL from where the information is fetched. */ - private static final String BASE_DATA_URL = "http://mtgjson.com/json/"; + private final String BASE_DATA_URL = "http://mtgjson.com/json/"; /** * If the upstream set code list can't be loaded, this is loaded instead. */ - private static final String FALLBACK_LIST_PATH = "/setlist.json"; + private final String FALLBACK_LIST_PATH = "/setlist.json"; /** * A cache of CardSets to avoid querying the server many times for the same information. */ - private static List cardSets; + private List cardSets; /** * A cache of {@code FullCardSets} to avoid querying the server many times for the same information. */ - private static HashMap cardSetCache = new HashMap(); - - /** - * Private constructor, this class is not to be instantiated. - */ - private MTGUniverse() {} + private HashMap cardSetCache = new HashMap(); /** * Returns the specified card in the form of a {@code Card} object. If the specified number does @@ -64,7 +59,7 @@ public final class MTGUniverse { * @throws JsonMappingException if the upstream JSON does not map to a local class. * @throws IOException if a low-level I/O problem (unexpected end-of-input, network error) occurs. */ - public static Card getCard(String setCode, String number) throws JsonParseException, JsonMappingException, IOException { + public Card getCard(String setCode, String number) throws JsonParseException, JsonMappingException, IOException { Card card = null; FullCardSet fullCardSet = getFullCardSet(setCode); @@ -89,7 +84,7 @@ public final class MTGUniverse { * @throws JsonMappingException if the upstream JSON does not map to {@code FullCardSet}. * @throws IOException if a low-level I/O problem (unexpected end-of-input, network error) occurs. */ - public static FullCardSet getFullCardSet(String setCode) throws JsonParseException, JsonMappingException, IOException { + public FullCardSet getFullCardSet(String setCode) throws JsonParseException, JsonMappingException, IOException { FullCardSet requestedSet = null; String validCode = validateSetCode(setCode); if (validCode != null) { @@ -109,7 +104,7 @@ public final class MTGUniverse { /** * @return a list of all card sets in the form of {@code CardSet} objects. */ - public static List getCardSetList() { + public List getCardSetList() { // if the list isn't cached, fetch and cache it if (cardSets == null) { try { @@ -142,7 +137,7 @@ public final class MTGUniverse { * @param setCode the set code to be validated. * @return the valid form of the set code if any, null otherwise. */ - public static String validateSetCode(String setCode) { + public String validateSetCode(String setCode) { for (CardSetInformation cardSet : getCardSetList()) { if (cardSet.getCode().equalsIgnoreCase(setCode)) { return cardSet.getCode(); @@ -161,7 +156,7 @@ public final class MTGUniverse { * @throws JsonMappingException if the upstream JSON does not map to {@code FullCardSet}. * @throws IOException if a low-level I/O problem (unexpected end-of-input, network error) occurs. */ - private static FullCardSet parseFullSet(JsonNode jsonTree) throws JsonMappingException, IOException { + private FullCardSet parseFullSet(JsonNode jsonTree) throws JsonMappingException, IOException { FullCardSet fcs = new FullCardSet(); @@ -221,6 +216,5 @@ public final class MTGUniverse { fcs.block = jsonTree.hasNonNull("block") ? jsonTree.get("block").asText() : null; return fcs; - } } \ No newline at end of file diff --git a/test/eu/equalparts/cardbase/cli/CardbaseCLITest.java b/test/eu/equalparts/cardbase/cli/CardbaseCLITest.java index e84c13c..44b5d01 100644 --- a/test/eu/equalparts/cardbase/cli/CardbaseCLITest.java +++ b/test/eu/equalparts/cardbase/cli/CardbaseCLITest.java @@ -355,7 +355,48 @@ public class CardbaseCLITest { assertEquals("Incorrect state for exit flag.", true, uut.exit); } + /*********************************************************************************** + * sets() tests, happy path + ***********************************************************************************/ + // mock MTG universe + + /*********************************************************************************** + * set() tests, happy path + ***********************************************************************************/ + // mock MTG universe + /*********************************************************************************** + * glance() tests, happy path + ***********************************************************************************/ + @Test + public void glanceIsPrinted() 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); + } + + /*********************************************************************************** + * peruse() tests, happy path + ***********************************************************************************/ + + /*********************************************************************************** + * undo() tests, happy path + ***********************************************************************************/ + + /*********************************************************************************** + * remove() tests, happy path + ***********************************************************************************/ + + /*********************************************************************************** + * add() tests, happy path + ***********************************************************************************/ } -- cgit v1.2.3