aboutsummaryrefslogtreecommitdiffstats
path: root/tests/src/com/android/inputmethod
diff options
context:
space:
mode:
authorYuichiro Hanada <yhanada@google.com>2012-08-16 18:40:14 +0900
committerYuichiro Hanada <yhanada@google.com>2012-08-31 15:08:57 +0900
commit666a4338026866df1f18dd6b3f968c3788943e4c (patch)
treef960c4683032798e88d6f4e289820becdf8a41d1 /tests/src/com/android/inputmethod
parent9bbc7ec052e3cb0a575fd56e5d8ddbc172841f6e (diff)
downloadlatinime-666a4338026866df1f18dd6b3f968c3788943e4c.tar.gz
latinime-666a4338026866df1f18dd6b3f968c3788943e4c.tar.xz
latinime-666a4338026866df1f18dd6b3f968c3788943e4c.zip
add UserHistoryDictIOUtils.
Change-Id: I8a70e43b23f65b5fd5f0ee0b30a94ad8f5ef8a8a
Diffstat (limited to 'tests/src/com/android/inputmethod')
-rw-r--r--tests/src/com/android/inputmethod/latin/UserHistoryDictIOUtilsTests.java249
1 files changed, 249 insertions, 0 deletions
diff --git a/tests/src/com/android/inputmethod/latin/UserHistoryDictIOUtilsTests.java b/tests/src/com/android/inputmethod/latin/UserHistoryDictIOUtilsTests.java
new file mode 100644
index 000000000..8f0551b4c
--- /dev/null
+++ b/tests/src/com/android/inputmethod/latin/UserHistoryDictIOUtilsTests.java
@@ -0,0 +1,249 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.latin;
+
+import com.android.inputmethod.latin.UserHistoryDictIOUtils.BigramDictionaryInterface;
+import com.android.inputmethod.latin.UserHistoryDictIOUtils.OnAddWordListener;
+import com.android.inputmethod.latin.makedict.FusionDictionary;
+import com.android.inputmethod.latin.makedict.FusionDictionary.CharGroup;
+
+import android.content.Context;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+
+/**
+ * Unit tests for UserHistoryDictIOUtils
+ */
+public class UserHistoryDictIOUtilsTests extends AndroidTestCase
+ implements BigramDictionaryInterface {
+
+ private static final String TAG = UserHistoryDictIOUtilsTests.class.getSimpleName();
+ private static final int UNIGRAM_FREQUENCY = 50;
+ private static final int BIGRAM_FREQUENCY = 100;
+ private static final ArrayList<String> NOT_HAVE_BIGRAM = new ArrayList<String>();
+
+ /**
+ * Return same frequency for all words and bigrams
+ */
+ @Override
+ public int getFrequency(String word1, String word2) {
+ if (word1 == null) return UNIGRAM_FREQUENCY;
+ return BIGRAM_FREQUENCY;
+ }
+
+ // Utilities for Testing
+
+ private void addWord(final String word,
+ final HashMap<String, ArrayList<String> > addedWords) {
+ if (!addedWords.containsKey(word)) {
+ addedWords.put(word, new ArrayList<String>());
+ }
+ }
+
+ private void addBigram(final String word1, final String word2,
+ final HashMap<String, ArrayList<String> > addedWords) {
+ addWord(word1, addedWords);
+ addWord(word2, addedWords);
+ addedWords.get(word1).add(word2);
+ }
+
+ private void addBigramToBigramList(final String word1, final String word2,
+ final HashMap<String, ArrayList<String> > addedWords,
+ final UserHistoryDictionaryBigramList bigramList) {
+ bigramList.addBigram(null, word1);
+ bigramList.addBigram(word1, word2);
+
+ addBigram(word1, word2, addedWords);
+ }
+
+ private void checkWordInFusionDict(final FusionDictionary dict, final String word,
+ final ArrayList<String> expectedBigrams) {
+ final CharGroup group = FusionDictionary.findWordInTree(dict.mRoot, word);
+ assertNotNull(group);
+ assertTrue(group.isTerminal());
+
+ for (final String bigram : expectedBigrams) {
+ assertNotNull(group.getBigram(bigram));
+ }
+ }
+
+ private void checkWordsInFusionDict(final FusionDictionary dict,
+ final HashMap<String, ArrayList<String> > bigrams) {
+ for (final String word : bigrams.keySet()) {
+ if (bigrams.containsKey(word)) {
+ checkWordInFusionDict(dict, word, bigrams.get(word));
+ } else {
+ checkWordInFusionDict(dict, word, NOT_HAVE_BIGRAM);
+ }
+ }
+ }
+
+ private void checkWordInBigramList(
+ final UserHistoryDictionaryBigramList bigramList, final String word,
+ final ArrayList<String> expectedBigrams) {
+ // check unigram
+ final HashMap<String,Byte> unigramMap = bigramList.getBigrams(null);
+ assertTrue(unigramMap.containsKey(word));
+
+ // check bigrams
+ final ArrayList<String> actualBigrams = new ArrayList<String>(
+ bigramList.getBigrams(word).keySet());
+
+ Collections.sort(expectedBigrams);
+ Collections.sort(actualBigrams);
+ assertEquals(expectedBigrams, actualBigrams);
+ }
+
+ private void checkWordsInBigramList(final UserHistoryDictionaryBigramList bigramList,
+ final HashMap<String, ArrayList<String> > addedWords) {
+ for (final String word : addedWords.keySet()) {
+ if (addedWords.containsKey(word)) {
+ checkWordInBigramList(bigramList, word, addedWords.get(word));
+ } else {
+ checkWordInBigramList(bigramList, word, NOT_HAVE_BIGRAM);
+ }
+ }
+ }
+
+ private void writeDictToFile(final File file,
+ final UserHistoryDictionaryBigramList bigramList) {
+ try {
+ final FileOutputStream out = new FileOutputStream(file);
+ UserHistoryDictIOUtils.writeDictionaryBinary(out, this, bigramList, 2);
+ out.flush();
+ out.close();
+ } catch (IOException e) {
+ Log.e(TAG, "IO exception while writing file: " + e);
+ }
+ }
+
+ private void readDictFromFile(final File file, final OnAddWordListener listener) {
+ FileInputStream inStream = null;
+
+ try {
+ inStream = new FileInputStream(file);
+ final byte[] buffer = new byte[(int)file.length()];
+ inStream.read(buffer);
+
+ UserHistoryDictIOUtils.readDictionaryBinary(
+ new UserHistoryDictIOUtils.ByteArrayWrapper(buffer), listener);
+ } catch (FileNotFoundException e) {
+ Log.e(TAG, "file not found: " + e);
+ } catch (IOException e) {
+ Log.e(TAG, "IOException: " + e);
+ } finally {
+ if (inStream != null) {
+ try {
+ inStream.close();
+ } catch (IOException e) {
+ // do nothing
+ }
+ }
+ }
+ }
+
+ public void testGenerateFusionDictionary() {
+ final UserHistoryDictionaryBigramList originalList = new UserHistoryDictionaryBigramList();
+
+ final HashMap<String, ArrayList<String> > addedWords =
+ new HashMap<String, ArrayList<String>>();
+ addBigramToBigramList("this", "is", addedWords, originalList);
+ addBigramToBigramList("this", "was", addedWords, originalList);
+ addBigramToBigramList("hello", "world", addedWords, originalList);
+
+ final FusionDictionary fusionDict =
+ UserHistoryDictIOUtils.constructFusionDictionary(this, originalList);
+
+ checkWordsInFusionDict(fusionDict, addedWords);
+ }
+
+ public void testReadAndWrite() {
+ final Context context = getContext();
+
+ File file = null;
+ try {
+ file = File.createTempFile("testReadAndWrite", ".dict");
+ } catch (IOException e) {
+ Log.d(TAG, "IOException while creating a temporary file: " + e);
+ }
+ assertNotNull(file);
+
+ // make original dictionary
+ final UserHistoryDictionaryBigramList originalList = new UserHistoryDictionaryBigramList();
+ final HashMap<String, ArrayList<String>> addedWords = CollectionUtils.newHashMap();
+ addBigramToBigramList("this" , "is" , addedWords, originalList);
+ addBigramToBigramList("this" , "was" , addedWords, originalList);
+ addBigramToBigramList("is" , "not" , addedWords, originalList);
+ addBigramToBigramList("hello", "world", addedWords, originalList);
+
+ // write to file
+ writeDictToFile(file, originalList);
+
+ // make result dict.
+ final UserHistoryDictionaryBigramList resultList = new UserHistoryDictionaryBigramList();
+ final OnAddWordListener listener = new OnAddWordListener() {
+ @Override
+ public void setUnigram(final String word,
+ final String shortcutTarget, final int frequency) {
+ Log.d(TAG, "in: setUnigram: " + word + "," + frequency);
+ resultList.addBigram(null, word, (byte)frequency);
+ }
+ @Override
+ public void setBigram(final String word1, final String word2, final int frequency) {
+ Log.d(TAG, "in: setBigram: " + word1 + "," + word2 + "," + frequency);
+ resultList.addBigram(word1, word2, (byte)frequency);
+ }
+ };
+
+ // load from file
+ readDictFromFile(file, listener);
+ checkWordsInBigramList(resultList, addedWords);
+
+ // add new bigram
+ addBigramToBigramList("hello", "java", addedWords, resultList);
+
+ // rewrite
+ writeDictToFile(file, resultList);
+ final UserHistoryDictionaryBigramList resultList2 = new UserHistoryDictionaryBigramList();
+ final OnAddWordListener listener2 = new OnAddWordListener() {
+ @Override
+ public void setUnigram(final String word,
+ final String shortcutTarget, final int frequency) {
+ Log.d(TAG, "in: setUnigram: " + word + "," + frequency);
+ resultList2.addBigram(null, word, (byte)frequency);
+ }
+ @Override
+ public void setBigram(final String word1, final String word2, final int frequency) {
+ Log.d(TAG, "in: setBigram: " + word1 + "," + word2 + "," + frequency);
+ resultList2.addBigram(word1, word2, (byte)frequency);
+ }
+ };
+
+ // load from file
+ readDictFromFile(file, listener2);
+ checkWordsInBigramList(resultList2, addedWords);
+ }
+}