aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorYuichiro Hanada <yhanada@google.com>2012-09-19 14:38:17 +0900
committerYuichiro Hanada <yhanada@google.com>2012-09-20 18:02:16 +0900
commitd36245fad292ea660ca49f38a3ec36e07727dda5 (patch)
treedc490be912aa746d32bc0e3c648eeb59e57bdbe5 /tests
parent84c1bbd76d144c2d777952079b9e8d8fea98c9b2 (diff)
downloadlatinime-d36245fad292ea660ca49f38a3ec36e07727dda5.tar.gz
latinime-d36245fad292ea660ca49f38a3ec36e07727dda5.tar.xz
latinime-d36245fad292ea660ca49f38a3ec36e07727dda5.zip
Add getTerminalPosition.
Change-Id: If04d779db23b1aea2cc12e5e9b8cecfcb35a5737
Diffstat (limited to 'tests')
-rw-r--r--tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java91
1 files changed, 90 insertions, 1 deletions
diff --git a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java
index 4c2d3f6fe..24776d536 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java
@@ -19,7 +19,7 @@ package com.android.inputmethod.latin.makedict;
import com.android.inputmethod.latin.CollectionUtils;
import com.android.inputmethod.latin.UserHistoryDictIOUtils;
import com.android.inputmethod.latin.makedict.BinaryDictInputOutput.FusionDictionaryBufferInterface;
-import com.android.inputmethod.latin.makedict.FormatSpec;
+import com.android.inputmethod.latin.makedict.FormatSpec.FileHeader;
import com.android.inputmethod.latin.makedict.FusionDictionary.CharGroup;
import com.android.inputmethod.latin.makedict.FusionDictionary.Node;
import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString;
@@ -475,4 +475,93 @@ public class BinaryDictIOTests extends AndroidTestCase {
Log.d(TAG, result);
}
}
+
+ // Tests for getTerminalPosition
+ private String getWordFromBinary(final FusionDictionaryBufferInterface buffer,
+ final int address) {
+ if (buffer.position() != 0) buffer.position(0);
+
+ FileHeader header = null;
+ try {
+ header = BinaryDictInputOutput.readHeader(buffer);
+ } catch (IOException e) {
+ return null;
+ } catch (UnsupportedFormatException e) {
+ return null;
+ }
+ if (header == null) return null;
+ return BinaryDictInputOutput.getWordAtAddress(buffer, header.mHeaderSize,
+ address - header.mHeaderSize, header.mFormatOptions);
+ }
+
+ private long runGetTerminalPosition(final FusionDictionaryBufferInterface buffer,
+ final String word, int index, boolean contained) {
+ final int expectedFrequency = (UNIGRAM_FREQ + index) % 255;
+ long diff = -1;
+ int position = -1;
+ try {
+ final long now = System.nanoTime();
+ position = BinaryDictIOUtils.getTerminalPosition(buffer, word);
+ diff = System.nanoTime() - now;
+ } catch (IOException e) {
+ Log.e(TAG, "IOException while getTerminalPosition: " + e);
+ } catch (UnsupportedFormatException e) {
+ Log.e(TAG, "UnsupportedFormatException while getTermianlPosition: " + e);
+ }
+
+ assertEquals(FormatSpec.NOT_VALID_WORD != position, contained);
+ if (contained) assertEquals(getWordFromBinary(buffer, position), word);
+ return diff;
+ }
+
+ public void testGetTerminalPosition() {
+ File file = null;
+ try {
+ file = File.createTempFile("runReadUnigrams", ".dict");
+ } catch (IOException e) {
+ // do nothing
+ }
+ assertNotNull(file);
+
+ final FusionDictionary dict = new FusionDictionary(new Node(),
+ new FusionDictionary.DictionaryOptions(
+ new HashMap<String, String>(), false, false));
+ addUnigrams(sWords.size(), dict, sWords, null /* shortcutMap */);
+ timeWritingDictToFile(file, dict, VERSION3_WITH_LINKEDLIST_NODE);
+
+ final FusionDictionaryBufferInterface buffer = getBuffer(file, USE_BYTE_ARRAY);
+
+ try {
+ // too long word
+ final String longWord = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
+ assertEquals(FormatSpec.NOT_VALID_WORD,
+ BinaryDictIOUtils.getTerminalPosition(buffer, longWord));
+
+ // null
+ assertEquals(FormatSpec.NOT_VALID_WORD,
+ BinaryDictIOUtils.getTerminalPosition(buffer, null));
+
+ // empty string
+ assertEquals(FormatSpec.NOT_VALID_WORD,
+ BinaryDictIOUtils.getTerminalPosition(buffer, ""));
+ } catch (IOException e) {
+ } catch (UnsupportedFormatException e) {
+ }
+
+ // Test a word that is contained within the dictionary.
+ long sum = 0;
+ for (int i = 0; i < sWords.size(); ++i) {
+ final long time = runGetTerminalPosition(buffer, sWords.get(i), i, true);
+ sum += time == -1 ? 0 : time;
+ }
+ Log.d(TAG, "per a search : " + (((double)sum) / sWords.size() / 1000000));
+
+ // Test a word that isn't contained within the dictionary.
+ final Random random = new Random((int)System.currentTimeMillis());
+ for (int i = 0; i < 1000; ++i) {
+ final String word = generateWord(random.nextInt());
+ if (sWords.indexOf(word) != -1) continue;
+ runGetTerminalPosition(buffer, word, i, false);
+ }
+ }
}