Merge "Revise gesture preview trail design" into jb-mr1-dev
diff --git a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java
index 6036562..3a21536 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java
@@ -21,6 +21,7 @@
 import com.android.inputmethod.latin.makedict.FusionDictionary;
 import com.android.inputmethod.latin.makedict.FusionDictionary.CharGroup;
 import com.android.inputmethod.latin.makedict.FusionDictionary.Node;
+import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString;
 import com.android.inputmethod.latin.makedict.PendingAttribute;
 import com.android.inputmethod.latin.makedict.UnsupportedFormatException;
 
@@ -53,14 +54,40 @@
     private static final int BIGRAM_FREQ = 50;
     private static final int TOLERANCE_OF_BIGRAM_FREQ = 5;
 
+    private static final List<String> sWords = CollectionUtils.newArrayList();
+    private static final SparseArray<List<Integer>> sEmptyBigrams =
+            CollectionUtils.newSparseArray();
+    private static final SparseArray<List<Integer>> sStarBigrams = CollectionUtils.newSparseArray();
+    private static final SparseArray<List<Integer>> sChainBigrams =
+            CollectionUtils.newSparseArray();
+
     private static final BinaryDictInputOutput.FormatOptions VERSION2 =
             new BinaryDictInputOutput.FormatOptions(2);
 
-    private static final String[] CHARACTERS =
-        {
+    private static final String[] CHARACTERS = {
         "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
         "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"
-        };
+    };
+
+    public BinaryDictIOTests() {
+        super();
+
+        final Random random = new Random(123456);
+        sWords.clear();
+        generateWords(MAX_UNIGRAMS, random);
+
+        for (int i = 0; i < sWords.size(); ++i) {
+            sChainBigrams.put(i, new ArrayList<Integer>());
+            if (i > 0) {
+                sChainBigrams.get(i-1).add(i);
+            }
+        }
+
+        sStarBigrams.put(0, new ArrayList<Integer>());
+        for (int i = 1; i < sWords.size(); ++i) {
+            sStarBigrams.get(0).add(i);
+        }
+    }
 
     // Utilities for test
     /**
@@ -77,23 +104,29 @@
         return builder.toString();
     }
 
-    private List<String> generateWords(final int number, final Random random) {
+    private void generateWords(final int number, final Random random) {
         final Set<String> wordSet = CollectionUtils.newHashSet();
         while (wordSet.size() < number) {
             wordSet.add(generateWord(random.nextInt()));
         }
-        return new ArrayList<String>(wordSet);
+        sWords.addAll(wordSet);
     }
 
     /**
      * Adds unigrams to the dictionary.
      */
-    private void addUnigrams(final int number,
-            final FusionDictionary dict,
-            final List<String> words) {
+    private void addUnigrams(final int number, final FusionDictionary dict,
+            final List<String> words, final Map<String, List<String>> shortcutMap) {
         for (int i = 0; i < number; ++i) {
             final String word = words.get(i);
-            dict.add(word, UNIGRAM_FREQ, null, false /* isNotAWord */);
+            final ArrayList<WeightedString> shortcuts = CollectionUtils.newArrayList();
+            if (shortcutMap != null && shortcutMap.containsKey(word)) {
+                for (final String shortcut : shortcutMap.get(word)) {
+                    shortcuts.add(new WeightedString(shortcut, UNIGRAM_FREQ));
+                }
+            }
+            dict.add(word, UNIGRAM_FREQ, (shortcutMap == null) ? null : shortcuts,
+                    false /* isNotAWord */);
         }
     }
 
@@ -130,9 +163,8 @@
         return diff;
     }
 
-    private void checkDictionary(final FusionDictionary dict,
-            final List<String> words,
-            final SparseArray<List<Integer>> bigrams) {
+    private void checkDictionary(final FusionDictionary dict, final List<String> words,
+            final SparseArray<List<Integer>> bigrams, final Map<String, List<String>> shortcutMap) {
         assertNotNull(dict);
 
         // check unigram
@@ -149,12 +181,23 @@
                 assertNotNull(words.get(w1) + "," + words.get(w2), cg.getBigram(words.get(w2)));
             }
         }
+
+        // check shortcut
+        if (shortcutMap != null) {
+            for (final Map.Entry<String, List<String>> entry : shortcutMap.entrySet()) {
+                final CharGroup group = FusionDictionary.findWordInTree(dict.mRoot, entry.getKey());
+                for (final String word : entry.getValue()) {
+                    assertNotNull("shortcut not found: " + entry.getKey() + ", " + word,
+                            group.getShortcut(word));
+                }
+            }
+        }
     }
 
     // Tests for readDictionaryBinary and writeDictionaryBinary
 
     private long timeReadingAndCheckDict(final File file, final List<String> words,
-            final SparseArray<List<Integer>> bigrams) {
+            final SparseArray<List<Integer>> bigrams, final Map<String, List<String>> shortcutMap) {
 
         long now, diff = -1;
 
@@ -165,13 +208,11 @@
                     FileChannel.MapMode.READ_ONLY, 0, file.length());
 
             now = System.currentTimeMillis();
-
             final FusionDictionary dict =
                     BinaryDictInputOutput.readDictionaryBinary(buffer, null);
-
             diff = System.currentTimeMillis() - now;
 
-            checkDictionary(dict, words, bigrams);
+            checkDictionary(dict, words, bigrams, shortcutMap);
             return diff;
 
         } catch (IOException e) {
@@ -191,29 +232,27 @@
         return diff;
     }
 
+    // Tests for readDictionaryBinary and writeDictionaryBinary
     private String runReadAndWrite(final List<String> words,
-            final SparseArray<List<Integer>> bigrams,
+            final SparseArray<List<Integer>> bigrams, final Map<String, List<String>> shortcuts,
             final String message) {
-        final FusionDictionary dict = new FusionDictionary(new Node(),
-                new FusionDictionary.DictionaryOptions(
-                        new HashMap<String,String>(), false, false));
-
         File file = null;
         try {
             file = File.createTempFile("runReadAndWrite", ".dict");
         } catch (IOException e) {
             Log.e(TAG, "IOException: " + e);
         }
-
         assertNotNull(file);
 
-        addUnigrams(words.size(), dict, words);
+        final FusionDictionary dict = new FusionDictionary(new Node(),
+                new FusionDictionary.DictionaryOptions(
+                        new HashMap<String,String>(), false, false));
+        addUnigrams(words.size(), dict, words, shortcuts);
         addBigrams(dict, words, bigrams);
-        // check original dictionary
-        checkDictionary(dict, words, bigrams);
+        checkDictionary(dict, words, bigrams, shortcuts);
 
         final long write = timeWritingDictToFile(file, dict);
-        final long read = timeReadingAndCheckDict(file, words, bigrams);
+        final long read = timeReadingAndCheckDict(file, words, bigrams, shortcuts);
 
         return "PROF: read=" + read + "ms, write=" + write + "ms    :" + message;
     }
@@ -221,22 +260,9 @@
     public void testReadAndWrite() {
         final List<String> results = new ArrayList<String>();
 
-        final Random random = new Random(123456);
-        final List<String> words = generateWords(MAX_UNIGRAMS, random);
-        final SparseArray<List<Integer>> emptyArray = CollectionUtils.newSparseArray();
-
-        final SparseArray<List<Integer>> chain = CollectionUtils.newSparseArray();
-        for (int i = 0; i < words.size(); ++i) chain.put(i, new ArrayList<Integer>());
-        for (int i = 1; i < words.size(); ++i) chain.get(i-1).add(i);
-
-        final SparseArray<List<Integer>> star = CollectionUtils.newSparseArray();
-        final List<Integer> list0 = CollectionUtils.newArrayList();
-        star.put(0, list0);
-        for (int i = 1; i < words.size(); ++i) star.get(0).add(i);
-
-        results.add(runReadAndWrite(words, emptyArray, "only unigram"));
-        results.add(runReadAndWrite(words, chain, "chain"));
-        results.add(runReadAndWrite(words, star, "star"));
+        results.add(runReadAndWrite(sWords, sEmptyBigrams, null /* shortcuts */ , "unigram"));
+        results.add(runReadAndWrite(sWords, sChainBigrams, null /* shortcuts */ , "chain"));
+        results.add(runReadAndWrite(sWords, sStarBigrams, null /* shortcuts */ , "star"));
 
         for (final String result : results) {
             Log.d(TAG, result);
@@ -329,47 +355,41 @@
         return diff;
     }
 
-    private void runReadUnigramsAndBigramsBinary(final List<String> words,
-            final SparseArray<List<Integer>> bigrams) {
-
-        // making the dictionary from lists of words.
-        final FusionDictionary dict = new FusionDictionary(new Node(),
-                new FusionDictionary.DictionaryOptions(
-                        new HashMap<String, String>(), false, false));
-
+    private String runReadUnigramsAndBigramsBinary(final List<String> words,
+            final SparseArray<List<Integer>> bigrams, final String message) {
         File file = null;
         try {
             file = File.createTempFile("runReadUnigrams", ".dict");
         } catch (IOException e) {
             Log.e(TAG, "IOException: " + e);
         }
-
         assertNotNull(file);
 
-        addUnigrams(words.size(), dict, words);
+        // making the dictionary from lists of words.
+        final FusionDictionary dict = new FusionDictionary(new Node(),
+                new FusionDictionary.DictionaryOptions(
+                        new HashMap<String, String>(), false, false));
+        addUnigrams(words.size(), dict, words, null /* shortcutMap */);
         addBigrams(dict, words, bigrams);
+
         timeWritingDictToFile(file, dict);
 
         long wordMap = timeAndCheckReadUnigramsAndBigramsBinary(file, words, bigrams);
-        long fullReading = timeReadingAndCheckDict(file, words, bigrams);
+        long fullReading = timeReadingAndCheckDict(file, words, bigrams, null /* shortcutMap */);
 
-        Log.d(TAG, "read=" + fullReading + ", bytearray=" + wordMap);
+        return "readDictionaryBinary=" + fullReading + ", readUnigramsAndBigramsBinary=" + wordMap
+                + " : " + message;
     }
 
     public void testReadUnigramsAndBigramsBinary() {
         final List<String> results = new ArrayList<String>();
 
-        final Random random = new Random(123456);
-        final List<String> words = generateWords(MAX_UNIGRAMS, random);
-        final SparseArray<List<Integer>> emptyArray = CollectionUtils.newSparseArray();
+        results.add(runReadUnigramsAndBigramsBinary(sWords, sEmptyBigrams, "unigram"));
+        results.add(runReadUnigramsAndBigramsBinary(sWords, sChainBigrams, "chain"));
+        results.add(runReadUnigramsAndBigramsBinary(sWords, sStarBigrams, "star"));
 
-        runReadUnigramsAndBigramsBinary(words, emptyArray);
-
-        final SparseArray<List<Integer>> star = CollectionUtils.newSparseArray();
-        for (int i = 1; i < words.size(); ++i) {
-            star.put(i-1, new ArrayList<Integer>());
-            star.get(i-1).add(i);
+        for (final String result : results) {
+            Log.d(TAG, result);
         }
-        runReadUnigramsAndBigramsBinary(words, star);
     }
 }