diff options
Diffstat (limited to 'tests/src')
3 files changed, 116 insertions, 47 deletions
diff --git a/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java b/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java index 6ba18d665..dbe3e25b8 100644 --- a/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java +++ b/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java @@ -55,6 +55,10 @@ public class BinaryDictionaryTests extends AndroidTestCase { return formatVersion > FormatSpec.VERSION401; } + private static boolean supportsNgram(final int formatVersion) { + return formatVersion >= FormatSpec.VERSION4_DEV; + } + private File createEmptyDictionaryAndGetFile(final String dictId, final int formatVersion) throws IOException { if (formatVersion == FormatSpec.VERSION4 @@ -208,6 +212,14 @@ public class BinaryDictionaryTests extends AndroidTestCase { BinaryDictionary.NOT_A_VALID_TIMESTAMP /* timestamp */); } + private static void addTrigramEntry(final BinaryDictionary binaryDictionary, final String word0, + final String word1, final String word2, final int probability) { + final PrevWordsInfo prevWordsInfo = + new PrevWordsInfo(new WordInfo[] { new WordInfo(word1), new WordInfo(word0) } ); + binaryDictionary.addNgramEntry(prevWordsInfo, word2, probability, + BinaryDictionary.NOT_A_VALID_TIMESTAMP /* timestamp */); + } + private static boolean isValidBigram(final BinaryDictionary binaryDictionary, final String word0, final String word1) { return binaryDictionary.isValidNgram(new PrevWordsInfo(new WordInfo(word0)), word1); @@ -218,11 +230,25 @@ public class BinaryDictionaryTests extends AndroidTestCase { binaryDictionary.removeNgramEntry(new PrevWordsInfo(new WordInfo(word0)), word1); } + private static void removeTrigramEntry(final BinaryDictionary binaryDictionary, + final String word0, final String word1, final String word2) { + final PrevWordsInfo prevWordsInfo = + new PrevWordsInfo(new WordInfo[] { new WordInfo(word1), new WordInfo(word0) } ); + binaryDictionary.removeNgramEntry(prevWordsInfo, word2); + } + private static int getBigramProbability(final BinaryDictionary binaryDictionary, final String word0, final String word1) { return binaryDictionary.getNgramProbability(new PrevWordsInfo(new WordInfo(word0)), word1); } + private static int getTrigramProbability(final BinaryDictionary binaryDictionary, + final String word0, final String word1, final String word2) { + final PrevWordsInfo prevWordsInfo = + new PrevWordsInfo(new WordInfo[] { new WordInfo(word1), new WordInfo(word0) } ); + return binaryDictionary.getNgramProbability(prevWordsInfo, word2); + } + public void testAddUnigramWord() { for (final int formatVersion : DICT_FORMAT_VERSIONS) { testAddUnigramWord(formatVersion); @@ -500,6 +526,56 @@ public class BinaryDictionaryTests extends AndroidTestCase { dictFile.delete(); } + public void testAddTrigramWords() { + for (final int formatVersion : DICT_FORMAT_VERSIONS) { + if (supportsNgram(formatVersion)) { + testAddTrigramWords(formatVersion); + } + } + } + + private void testAddTrigramWords(final int formatVersion) { + File dictFile = null; + try { + dictFile = createEmptyDictionaryAndGetFile("TestBinaryDictionary", formatVersion); + } catch (IOException e) { + fail("IOException while writing an initial dictionary : " + e); + } + BinaryDictionary binaryDictionary = new BinaryDictionary(dictFile.getAbsolutePath(), + 0 /* offset */, dictFile.length(), true /* useFullEditDistance */, + Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */); + + final int unigramProbability = 100; + final int trigramProbability = 150; + final int updatedTrigramProbability = 200; + addUnigramWord(binaryDictionary, "aaa", unigramProbability); + addUnigramWord(binaryDictionary, "abb", unigramProbability); + addUnigramWord(binaryDictionary, "bcc", unigramProbability); + + addBigramWords(binaryDictionary, "abb", "bcc", 10); + addBigramWords(binaryDictionary, "abb", "aaa", 10); + + addTrigramEntry(binaryDictionary, "aaa", "abb", "bcc", trigramProbability); + addTrigramEntry(binaryDictionary, "bcc", "abb", "aaa", trigramProbability); + + assertEquals(trigramProbability, + getTrigramProbability(binaryDictionary, "aaa", "abb", "bcc")); + assertEquals(trigramProbability, + getTrigramProbability(binaryDictionary, "bcc", "abb", "aaa")); + assertFalse(isValidBigram(binaryDictionary, "aaa", "abb")); + + addTrigramEntry(binaryDictionary, "bcc", "abb", "aaa", updatedTrigramProbability); + assertEquals(updatedTrigramProbability, + getTrigramProbability(binaryDictionary, "bcc", "abb", "aaa")); + + removeTrigramEntry(binaryDictionary, "aaa", "abb", "bcc"); + assertEquals(Dictionary.NOT_A_PROBABILITY, + getTrigramProbability(binaryDictionary, "aaa", "abb", "bcc")); + assertTrue(isValidBigram(binaryDictionary, "abb", "bcc")); + + dictFile.delete(); + } + public void testFlushDictionary() { for (final int formatVersion : DICT_FORMAT_VERSIONS) { testFlushDictionary(formatVersion); diff --git a/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java b/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java index 869c550e0..563261f8f 100644 --- a/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java +++ b/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java @@ -147,7 +147,7 @@ public class SuggestedWordsTests extends AndroidTestCase { assertNull(wordsWithoutTypedWord.getTypedWordInfoOrNull()); // Make sure getTypedWordInfoOrNull() returns null. - assertNull(SuggestedWords.EMPTY.getTypedWordInfoOrNull()); + assertNull(SuggestedWords.getEmptyInstance().getTypedWordInfoOrNull()); final SuggestedWords emptySuggestedWords = new SuggestedWords( new ArrayList<SuggestedWordInfo>(), null /* rawSuggestions */, @@ -157,6 +157,6 @@ public class SuggestedWordsTests extends AndroidTestCase { SuggestedWords.INPUT_STYLE_NONE); assertNull(emptySuggestedWords.getTypedWordInfoOrNull()); - assertNull(SuggestedWords.EMPTY.getTypedWordInfoOrNull()); + assertNull(SuggestedWords.getEmptyInstance().getTypedWordInfoOrNull()); } } diff --git a/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java b/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java index abb468fda..62f106110 100644 --- a/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java +++ b/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java @@ -74,9 +74,10 @@ public class UserHistoryDictionaryTests extends AndroidTestCase { } } - private void checkExistenceAndRemoveDictFile(final Locale locale, final File dictFile) { + private void checkExistenceAndRemoveDictFile(final UserHistoryDictionary dict, + final File dictFile) { Log.d(TAG, "waiting for writing ..."); - waitForWriting(locale); + dict.waitAllTasksForTests(); if (!dictFile.exists()) { try { Log.d(TAG, dictFile + " is not existing. Wait " @@ -91,6 +92,10 @@ public class UserHistoryDictionaryTests extends AndroidTestCase { FileUtils.deleteRecursively(dictFile); } + private static Locale getDummyLocale(final String name) { + return new Locale(TEST_LOCALE_PREFIX + name + System.currentTimeMillis()); + } + @Override protected void setUp() throws Exception { super.setUp(); @@ -168,11 +173,9 @@ public class UserHistoryDictionaryTests extends AndroidTestCase { * @param checkContents if true, checks whether written words are actually in the dictionary * or not. */ - private void addAndWriteRandomWords(final Locale locale, final int numberOfWords, - final Random random, final boolean checkContents) { + private void addAndWriteRandomWords(final UserHistoryDictionary dict, + final int numberOfWords, final Random random, final boolean checkContents) { final List<String> words = generateWords(numberOfWords, random); - final UserHistoryDictionary dict = PersonalizationHelper.getUserHistoryDictionary( - mContext, locale); // Add random words to the user history dictionary. addToDict(dict, words); if (checkContents) { @@ -188,46 +191,34 @@ public class UserHistoryDictionaryTests extends AndroidTestCase { /** * Clear all entries in the user history dictionary. - * @param locale dummy locale for testing. + * @param dict the user history dictionary. */ - private void clearHistory(final Locale locale) { - final UserHistoryDictionary dict = PersonalizationHelper.getUserHistoryDictionary( - mContext, locale); + private void clearHistory(final UserHistoryDictionary dict) { dict.waitAllTasksForTests(); dict.clear(); dict.close(); dict.waitAllTasksForTests(); } - /** - * Shut down executer and wait until all operations of user history are done. - * @param locale dummy locale for testing. - */ - private void waitForWriting(final Locale locale) { - final UserHistoryDictionary dict = PersonalizationHelper.getUserHistoryDictionary( - mContext, locale); - dict.waitAllTasksForTests(); - } - public void testRandomWords() { Log.d(TAG, "This test can be used for profiling."); Log.d(TAG, "Usage: please set UserHistoryDictionary.PROFILE_SAVE_RESTORE to true."); - final Locale dummyLocale = - new Locale(TEST_LOCALE_PREFIX + "random_words" + System.currentTimeMillis()); + final Locale dummyLocale = getDummyLocale("random_words"); final String dictName = ExpandableBinaryDictionary.getDictName( UserHistoryDictionary.NAME, dummyLocale, null /* dictFile */); final File dictFile = ExpandableBinaryDictionary.getDictFile( mContext, dictName, null /* dictFile */); + final UserHistoryDictionary dict = PersonalizationHelper.getUserHistoryDictionary( + getContext(), dummyLocale); final int numberOfWords = 1000; final Random random = new Random(123456); try { - clearHistory(dummyLocale); - addAndWriteRandomWords(dummyLocale, numberOfWords, random, - true /* checksContents */); + clearHistory(dict); + addAndWriteRandomWords(dict, numberOfWords, random, true /* checksContents */); } finally { - checkExistenceAndRemoveDictFile(dummyLocale, dictFile); + checkExistenceAndRemoveDictFile(dict, dictFile); } } @@ -237,28 +228,30 @@ public class UserHistoryDictionaryTests extends AndroidTestCase { final int numberOfWordsInsertedForEachLanguageSwitch = 100; final File dictFiles[] = new File[numberOfLanguages]; - final Locale dummyLocales[] = new Locale[numberOfLanguages]; + final UserHistoryDictionary dicts[] = new UserHistoryDictionary[numberOfLanguages]; + try { final Random random = new Random(123456); // Create filename suffixes for this test. for (int i = 0; i < numberOfLanguages; i++) { - dummyLocales[i] = new Locale(TEST_LOCALE_PREFIX + "switching_languages" + i); + final Locale dummyLocale = getDummyLocale("switching_languages" + i); final String dictName = ExpandableBinaryDictionary.getDictName( - UserHistoryDictionary.NAME, dummyLocales[i], null /* dictFile */); + UserHistoryDictionary.NAME, dummyLocale, null /* dictFile */); dictFiles[i] = ExpandableBinaryDictionary.getDictFile( mContext, dictName, null /* dictFile */); - clearHistory(dummyLocales[i]); + dicts[i] = PersonalizationHelper.getUserHistoryDictionary(getContext(), + dummyLocale); + clearHistory(dicts[i]); } final long start = System.currentTimeMillis(); for (int i = 0; i < numberOfLanguageSwitching; i++) { final int index = i % numberOfLanguages; - // Switch languages to testFilenameSuffixes[index]. - addAndWriteRandomWords(dummyLocales[index], - numberOfWordsInsertedForEachLanguageSwitch, random, - false /* checksContents */); + // Switch to dicts[index]. + addAndWriteRandomWords(dicts[index], numberOfWordsInsertedForEachLanguageSwitch, + random, false /* checksContents */); } final long end = System.currentTimeMillis(); @@ -266,38 +259,38 @@ public class UserHistoryDictionaryTests extends AndroidTestCase { + (end - start) + " ms"); } finally { for (int i = 0; i < numberOfLanguages; i++) { - checkExistenceAndRemoveDictFile(dummyLocales[i], dictFiles[i]); + checkExistenceAndRemoveDictFile(dicts[i], dictFiles[i]); } } } public void testAddManyWords() { - final Locale dummyLocale = - new Locale(TEST_LOCALE_PREFIX + "many_random_words" + System.currentTimeMillis()); + final Locale dummyLocale = getDummyLocale("many_random_words"); final String dictName = ExpandableBinaryDictionary.getDictName( UserHistoryDictionary.NAME, dummyLocale, null /* dictFile */); final File dictFile = ExpandableBinaryDictionary.getDictFile( mContext, dictName, null /* dictFile */); final int numberOfWords = 10000; final Random random = new Random(123456); - clearHistory(dummyLocale); + final UserHistoryDictionary dict = PersonalizationHelper.getUserHistoryDictionary( + getContext(), dummyLocale); + clearHistory(dict); try { - addAndWriteRandomWords(dummyLocale, numberOfWords, random, true /* checksContents */); + addAndWriteRandomWords(dict, numberOfWords, random, true /* checksContents */); } finally { - checkExistenceAndRemoveDictFile(dummyLocale, dictFile); + checkExistenceAndRemoveDictFile(dict, dictFile); } } public void testDecaying() { - final Locale dummyLocale = - new Locale(TEST_LOCALE_PREFIX + "decaying" + System.currentTimeMillis()); + final Locale dummyLocale = getDummyLocale("decaying"); + final UserHistoryDictionary dict = PersonalizationHelper.getUserHistoryDictionary( + getContext(), dummyLocale); final int numberOfWords = 5000; final Random random = new Random(123456); resetCurrentTimeForTestMode(); - clearHistory(dummyLocale); + clearHistory(dict); final List<String> words = generateWords(numberOfWords, random); - final UserHistoryDictionary dict = - PersonalizationHelper.getUserHistoryDictionary(getContext(), dummyLocale); dict.waitAllTasksForTests(); PrevWordsInfo prevWordsInfo = PrevWordsInfo.EMPTY_PREV_WORDS_INFO; for (final String word : words) { |