BinaryDictionaryTests.java revision cd6a0430c7db5322f9ae680dfffe3d744395298c
1/* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.inputmethod.latin; 18 19import android.test.AndroidTestCase; 20import android.test.suitebuilder.annotation.LargeTest; 21 22import com.android.inputmethod.latin.makedict.DictEncoder; 23import com.android.inputmethod.latin.makedict.FormatSpec; 24import com.android.inputmethod.latin.makedict.FusionDictionary; 25import com.android.inputmethod.latin.makedict.FusionDictionary.PtNodeArray; 26import com.android.inputmethod.latin.makedict.UnsupportedFormatException; 27import com.android.inputmethod.latin.makedict.Ver3DictEncoder; 28 29import java.io.File; 30import java.io.IOException; 31import java.util.HashMap; 32import java.util.Locale; 33 34@LargeTest 35public class BinaryDictionaryTests extends AndroidTestCase { 36 private static final FormatSpec.FormatOptions FORMAT_OPTIONS = 37 new FormatSpec.FormatOptions(3 /* version */, true /* supportsDynamicUpdate */); 38 private static final String TEST_DICT_FILE_EXTENSION = ".testDict"; 39 private static final String TEST_LOCALE = "test"; 40 41 @Override 42 protected void setUp() throws Exception { 43 super.setUp(); 44 } 45 46 @Override 47 protected void tearDown() throws Exception { 48 super.tearDown(); 49 } 50 51 private File createEmptyDictionaryAndGetFile(final String filename) throws IOException, 52 UnsupportedFormatException { 53 final FusionDictionary dict = new FusionDictionary(new PtNodeArray(), 54 new FusionDictionary.DictionaryOptions(new HashMap<String,String>(), false, false)); 55 final File file = File.createTempFile(filename, TEST_DICT_FILE_EXTENSION, 56 getContext().getCacheDir()); 57 final DictEncoder dictEncoder = new Ver3DictEncoder(file); 58 dictEncoder.writeDictionary(dict, FORMAT_OPTIONS); 59 return file; 60 } 61 62 public void testIsValidDictionary() { 63 File dictFile = null; 64 try { 65 dictFile = createEmptyDictionaryAndGetFile("TestBinaryDictionary"); 66 } catch (IOException e) { 67 fail("IOException while writing an initial dictionary : " + e); 68 } catch (UnsupportedFormatException e) { 69 fail("UnsupportedFormatException while writing an initial dictionary : " + e); 70 } 71 BinaryDictionary binaryDictionary = new BinaryDictionary(dictFile.getAbsolutePath(), 72 0 /* offset */, dictFile.length(), true /* useFullEditDistance */, 73 Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */); 74 assertTrue("binaryDictionary must be valid for existing valid dictionary file.", 75 binaryDictionary.isValidDictionary()); 76 binaryDictionary.close(); 77 assertFalse("binaryDictionary must be invalid after closing.", 78 binaryDictionary.isValidDictionary()); 79 dictFile.delete(); 80 binaryDictionary = new BinaryDictionary(dictFile.getAbsolutePath(), 0 /* offset */, 81 dictFile.length(), true /* useFullEditDistance */, Locale.getDefault(), 82 TEST_LOCALE, true /* isUpdatable */); 83 assertFalse("binaryDictionary must be invalid for not existing dictionary file.", 84 binaryDictionary.isValidDictionary()); 85 binaryDictionary.close(); 86 } 87 88 public void testAddUnigramWord() { 89 File dictFile = null; 90 try { 91 dictFile = createEmptyDictionaryAndGetFile("TestBinaryDictionary"); 92 } catch (IOException e) { 93 fail("IOException while writing an initial dictionary : " + e); 94 } catch (UnsupportedFormatException e) { 95 fail("UnsupportedFormatException while writing an initial dictionary : " + e); 96 } 97 BinaryDictionary binaryDictionary = new BinaryDictionary(dictFile.getAbsolutePath(), 98 0 /* offset */, dictFile.length(), true /* useFullEditDistance */, 99 Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */); 100 101 final int probability = 100; 102 binaryDictionary.addUnigramWord("aaa", probability); 103 // Reallocate and create. 104 binaryDictionary.addUnigramWord("aab", probability); 105 // Insert into children. 106 binaryDictionary.addUnigramWord("aac", probability); 107 // Make terminal. 108 binaryDictionary.addUnigramWord("aa", probability); 109 // Create children. 110 binaryDictionary.addUnigramWord("aaaa", probability); 111 // Reallocate and make termianl. 112 binaryDictionary.addUnigramWord("a", probability); 113 114 final int updatedProbability = 200; 115 // Update. 116 binaryDictionary.addUnigramWord("aaa", updatedProbability); 117 118 assertEquals(probability, binaryDictionary.getFrequency("aab")); 119 assertEquals(probability, binaryDictionary.getFrequency("aac")); 120 assertEquals(probability, binaryDictionary.getFrequency("aac")); 121 assertEquals(probability, binaryDictionary.getFrequency("aaaa")); 122 assertEquals(probability, binaryDictionary.getFrequency("a")); 123 assertEquals(updatedProbability, binaryDictionary.getFrequency("aaa")); 124 } 125 126 public void testAddBigramWords() { 127 // TODO: Add a test to check the frequency of the bigram score which uses current value 128 // calculated in the native code 129 File dictFile = null; 130 try { 131 dictFile = createEmptyDictionaryAndGetFile("TestBinaryDictionary"); 132 } catch (IOException e) { 133 fail("IOException while writing an initial dictionary : " + e); 134 } catch (UnsupportedFormatException e) { 135 fail("UnsupportedFormatException while writing an initial dictionary : " + e); 136 } 137 BinaryDictionary binaryDictionary = new BinaryDictionary(dictFile.getAbsolutePath(), 138 0 /* offset */, dictFile.length(), true /* useFullEditDistance */, 139 Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */); 140 141 final int unigramProbability = 100; 142 final int bigramProbability = 10; 143 binaryDictionary.addUnigramWord("aaa", unigramProbability); 144 binaryDictionary.addUnigramWord("abb", unigramProbability); 145 binaryDictionary.addUnigramWord("bcc", unigramProbability); 146 binaryDictionary.addBigramWords("aaa", "abb", bigramProbability); 147 binaryDictionary.addBigramWords("aaa", "bcc", bigramProbability); 148 binaryDictionary.addBigramWords("abb", "aaa", bigramProbability); 149 binaryDictionary.addBigramWords("abb", "bcc", bigramProbability); 150 151 assertEquals(true, binaryDictionary.isValidBigram("aaa", "abb")); 152 assertEquals(true, binaryDictionary.isValidBigram("aaa", "bcc")); 153 assertEquals(true, binaryDictionary.isValidBigram("abb", "aaa")); 154 assertEquals(true, binaryDictionary.isValidBigram("abb", "bcc")); 155 156 assertEquals(false, binaryDictionary.isValidBigram("bcc", "aaa")); 157 assertEquals(false, binaryDictionary.isValidBigram("bcc", "bbc")); 158 assertEquals(false, binaryDictionary.isValidBigram("aaa", "aaa")); 159 160 dictFile.delete(); 161 } 162} 163