diff --git a/.classpath b/.classpath index 16de989..1ab42a3 100644 --- a/.classpath +++ b/.classpath @@ -18,12 +18,16 @@ - + + + + + diff --git a/.gitignore b/.gitignore index 288a569..4ab02c4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .metadata +doc/ bin/ tmp/ *.tmp diff --git a/src/main/java/edu/mills/cs180a/wordui/model/SampleData.java b/src/main/java/edu/mills/cs180a/wordui/model/SampleData.java index f9d8846..a58eee3 100644 --- a/src/main/java/edu/mills/cs180a/wordui/model/SampleData.java +++ b/src/main/java/edu/mills/cs180a/wordui/model/SampleData.java @@ -12,9 +12,16 @@ import edu.mills.cs180a.wordnik.client.model.WordOfTheDay; import javafx.collections.ObservableList; + public class SampleData { + /** + * String key for the count. + */ @VisibleForTesting protected static final String FREQ_COUNT_KEY = "count"; + /** + * String key for the frequency. + */ @VisibleForTesting protected static final String FREQ_YEAR_KEY = "year"; private static final int FREQ_YEAR = 2012; @@ -22,8 +29,6 @@ public class SampleData { private static int getFrequencyFromSummary(FrequencySummary fs, int year) { List freqObjects = fs.getFrequency(); - // freqObjects is a List [{"year" = "2012", "count" = 179}] for "Java" - if (freqObjects instanceof List) { List maps = (List) freqObjects; for (Object map : maps) { @@ -43,34 +48,43 @@ private static int getFrequencyFromSummary(FrequencySummary fs, int year) { } // TODO: Move to spring-swagger-wordnik-client + @VisibleForTesting protected static int getFrequencyByYear(WordApi wordApi, String word, int year) { FrequencySummary fs = wordApi.getWordFrequency(word, "false", year, year); return getFrequencyFromSummary(fs, year); } - private static WordRecord buildWordRecord(String word, Map definition) { - WordApi wordApi = client.buildClient(WordApi.class); + private static WordRecord buildWordRecord(String word, Map definition, + WordApi wordApi) { return new WordRecord( word, getFrequencyByYear(wordApi, word, FREQ_YEAR), definition.get("text").toString()); } + /** + * Gets a word of the day object. + * + * @param wordsApi the words API + * @return the word of the day + */ + @VisibleForTesting + protected static WordOfTheDay getWordOfTheDay(WordsApi wordsApi) { + return wordsApi.getWordOfTheDay(); + } + + /** + * Adds word records to a passed list. + * + * @param backingList the list of word records + */ public static void fillSampleData(ObservableList backingList) { try { client = ApiClientHelper.getApiClient(); WordsApi wordsApi = client.buildClient(WordsApi.class); - WordOfTheDay word = wordsApi.getWordOfTheDay(); - List definitions = word.getDefinitions(); - if (definitions != null && !definitions.isEmpty()) { - Object definition = definitions.get(0); - if (definition instanceof Map) { - @SuppressWarnings("unchecked") - Map definitionAsMap = (Map) definition; - backingList.add(buildWordRecord(word.getWord(), definitionAsMap)); - } - } + WordApi wordApi = client.buildClient(WordApi.class); + addWordOfTheDay(backingList, wordsApi, wordApi); } catch (IOException e) { System.err.println("Unable to get API key."); } @@ -82,4 +96,27 @@ public static void fillSampleData(ObservableList backingList) { backingList.add(new WordRecord("random", 794, "Having no specific pattern, purpose, or objective")); } + + /** + * Adds the word to the passed list. + * + * @param backingList the list of word records + * @param wordsApi the words API + * @param wordApi the word API + */ + @VisibleForTesting + protected static void addWordOfTheDay(ObservableList backingList, + WordsApi wordsApi, WordApi wordApi) { + WordOfTheDay word = getWordOfTheDay(wordsApi); + + List definitions = word.getDefinitions(); + if (definitions != null && !definitions.isEmpty()) { + Object definition = definitions.get(0); + if (definition instanceof Map) { + @SuppressWarnings("unchecked") + Map definitionAsMap = (Map) definition; + backingList.add(buildWordRecord(word.getWord(), definitionAsMap, wordApi)); + } + } + } } diff --git a/src/test/java/edu/mills/cs180a/wordui/model/SampleDataTest.java b/src/test/java/edu/mills/cs180a/wordui/model/SampleDataTest.java index 2d346d0..43b0df4 100644 --- a/src/test/java/edu/mills/cs180a/wordui/model/SampleDataTest.java +++ b/src/test/java/edu/mills/cs180a/wordui/model/SampleDataTest.java @@ -5,28 +5,76 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import java.util.ArrayList; import java.util.List; import java.util.Map; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import edu.mills.cs180a.wordnik.client.api.WordApi; +import edu.mills.cs180a.wordnik.client.api.WordsApi; import edu.mills.cs180a.wordnik.client.model.FrequencySummary; +import edu.mills.cs180a.wordnik.client.model.WordOfTheDay; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + class SampleDataTest { private final FrequencySummary mockFS = mock(FrequencySummary.class); private final WordApi mockWordApi = mock(WordApi.class); + private final WordsApi mockWordsApi = mock(WordsApi.class); + private static final WordOfTheDay TODAYS_WORD = mock(WordOfTheDay.class); + private static final String A_WORD = "jingle"; + private static final Map FREQS_MAP = Map.of( + "apple", + makeFreqSummary(List.of( + makeMap(2000, 339), + makeMap(2001, 464))), + "orange", + makeFreqSummary(List.of( + makeMap(2000, 774), + makeMap(2001, 941))), + A_WORD, + makeFreqSummary(List.of( + makeMap(2020, 187)))); + private static final String TODAYS_DEF = "def for jingle"; + private static final List WORD_DEFS = List.of(TODAYS_DEF); + private static final List DEF_LIST = List.of(Map.of("text", TODAYS_DEF)); + private static final List DEF_LIST_MAP = List.of(Map.of( + "text", WORD_DEFS.get(0))); + + @BeforeEach void setup() { - List freqObjects = List.of( - // frequencies for "apple" - makeMap(2000, 339), - makeMap(2001, 464)); - when(mockFS.getFrequency()) - .thenReturn(freqObjects); when(mockWordApi.getWordFrequency(anyString(), anyString(), anyInt(), anyInt())) - .thenReturn(mockFS); + .thenAnswer(invocation -> FREQS_MAP.get(invocation.getArgument(0))); + when(mockWordsApi.getWordOfTheDay()) + .thenReturn(TODAYS_WORD); + when(TODAYS_WORD.getWord()) + .thenReturn(A_WORD); + when(TODAYS_WORD.getDefinitions()) + .thenReturn(DEF_LIST_MAP); + } + + @Test + void addWordOfTheDay_EqualsWordRecord_MockWordsObject() { + List testList = new ArrayList<>(); + ObservableList testListRecord = FXCollections.observableList(testList); + SampleData.addWordOfTheDay(testListRecord, mockWordsApi, mockWordApi); + + assertEquals("jingle", TODAYS_WORD.getWord()); + assertEquals(DEF_LIST, TODAYS_WORD.getDefinitions()); + assertEquals(1, testListRecord.size()); + assertEquals(187, SampleData.getFrequencyByYear(mockWordApi, TODAYS_WORD.getWord(), 2020)); + } + + private static FrequencySummary makeFreqSummary(List freqs) { + FrequencySummary fs = mock(FrequencySummary.class); + when(fs.getFrequency()) + .thenReturn(freqs); + return fs; } private static Map makeMap(int year, int count) { @@ -34,9 +82,18 @@ private static Map makeMap(int year, int count) { SampleData.FREQ_COUNT_KEY, count); } + @Test + void getWordOfTheDay_EqualsWordRecord_MockWordsObject() { + assertEquals("jingle", TODAYS_WORD.getWord()); + assertEquals(DEF_LIST, TODAYS_WORD.getDefinitions()); + assertEquals(187, SampleData.getFrequencyByYear(mockWordApi, TODAYS_WORD.getWord(), 2020)); + } + @ParameterizedTest - @CsvSource({"apple,2000,339", "apple,2001,464", "apple,2020,0"}) + @CsvSource({"apple,2000,339", "apple,2001,464", "apple,2020,0", + "orange,2000,774", "orange,2001,941", "orange,2050,0"}) void testGetFrequencyFromSummary(String word, int year, int count) { assertEquals(count, SampleData.getFrequencyByYear(mockWordApi, word, year)); } + }