/* * Copyright (c) 2013 Menny Even-Danan * * 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.anysoftkeyboard.dictionaries; import com.anysoftkeyboard.RobolectricAPI18TestRunner; import com.anysoftkeyboard.ui.settings.MainSettingsActivity; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @RunWith(RobolectricAPI18TestRunner.class) public class BTreeDictionaryTest { TestableBTreeDictionary mDictionaryUnderTest; @Before public void setup() throws Exception { MainSettingsActivity activity = Robolectric.buildActivity(MainSettingsActivity.class).create().resume().get(); mDictionaryUnderTest = new TestableBTreeDictionary("TEST", activity); } @Test public void testLoadDictionary() throws Exception { //no words now Assert.assertFalse(mDictionaryUnderTest.isValidWord((String) TestableBTreeDictionary.STORAGE[0][1])); //ok, now yes words mDictionaryUnderTest.loadDictionary(); for(int row=0; row<TestableBTreeDictionary.STORAGE.length; row++) { final String word = (String)TestableBTreeDictionary.STORAGE[row][1]; final int freq = ((Integer)TestableBTreeDictionary.STORAGE[row][2]).intValue(); assertTrue("Word at row " + row + " (" + word + ") should be valid.", mDictionaryUnderTest.isValidWord(word)); Assert.assertEquals(mDictionaryUnderTest.getWordFrequency(word), freq); } //checking validity of the internal structure assetNodeArrayIsValid(mDictionaryUnderTest.getRoot()); } @Test public void testAddWord() throws Exception { mDictionaryUnderTest.loadDictionary(); assertTrue(mDictionaryUnderTest.addWord("new", 23)); Assert.assertEquals("new", mDictionaryUnderTest.wordRequestedToAddedToStorage); Assert.assertEquals(23, mDictionaryUnderTest.wordFrequencyRequestedToAddedToStorage); assertTrue(mDictionaryUnderTest.isValidWord("new")); Assert.assertEquals(mDictionaryUnderTest.getWordFrequency("new"), 23); //checking validity of the internal structure assetNodeArrayIsValid(mDictionaryUnderTest.getRoot()); assertTrue(mDictionaryUnderTest.addWord("new", 34)); Assert.assertEquals("new", mDictionaryUnderTest.wordRequestedToAddedToStorage); Assert.assertEquals(34, mDictionaryUnderTest.wordFrequencyRequestedToAddedToStorage); assertTrue(mDictionaryUnderTest.isValidWord("new")); Assert.assertEquals(mDictionaryUnderTest.getWordFrequency("new"), 34); //checking validity of the internal structure assetNodeArrayIsValid(mDictionaryUnderTest.getRoot()); assertTrue(mDictionaryUnderTest.addWord("newa", 45)); assertTrue(mDictionaryUnderTest.isValidWord("newa")); Assert.assertEquals(mDictionaryUnderTest.getWordFrequency("new"), 34); Assert.assertEquals(mDictionaryUnderTest.getWordFrequency("newa"), 45); //checking validity of the internal structure assetNodeArrayIsValid(mDictionaryUnderTest.getRoot()); assertTrue(mDictionaryUnderTest.addWord("nea", 47)); Assert.assertEquals("nea", mDictionaryUnderTest.wordRequestedToAddedToStorage); Assert.assertEquals(47, mDictionaryUnderTest.wordFrequencyRequestedToAddedToStorage); assertTrue(mDictionaryUnderTest.isValidWord("nea")); Assert.assertEquals(mDictionaryUnderTest.getWordFrequency("new"), 34); Assert.assertEquals(mDictionaryUnderTest.getWordFrequency("newa"), 45); Assert.assertEquals(mDictionaryUnderTest.getWordFrequency("nea"), 47); //checking validity of the internal structure assetNodeArrayIsValid(mDictionaryUnderTest.getRoot()); assertTrue(mDictionaryUnderTest.addWord("neabb", 50)); Assert.assertEquals("neabb", mDictionaryUnderTest.wordRequestedToAddedToStorage); Assert.assertEquals(50, mDictionaryUnderTest.wordFrequencyRequestedToAddedToStorage); assertTrue(mDictionaryUnderTest.isValidWord("neabb")); Assert.assertFalse(mDictionaryUnderTest.isValidWord("neab")); Assert.assertEquals(mDictionaryUnderTest.getWordFrequency("new"), 34); Assert.assertEquals(mDictionaryUnderTest.getWordFrequency("newa"), 45); Assert.assertEquals(mDictionaryUnderTest.getWordFrequency("nea"), 47); Assert.assertEquals(mDictionaryUnderTest.getWordFrequency("neabb"), 50); Assert.assertEquals(mDictionaryUnderTest.getWordFrequency("neab"), 0); //checking validity of the internal structure assetNodeArrayIsValid(mDictionaryUnderTest.getRoot()); } @Test public void testOnStorageChanged() throws Exception { } @Test public void testDeleteWord() throws Exception { mDictionaryUnderTest.loadDictionary(); //from read storage String word = (String)TestableBTreeDictionary.STORAGE[0][1]; int wordFreq = ((Integer)TestableBTreeDictionary.STORAGE[0][2]).intValue(); assertTrue(mDictionaryUnderTest.isValidWord(word)); mDictionaryUnderTest.deleteWord(word); Assert.assertFalse(mDictionaryUnderTest.isValidWord(word)); Assert.assertEquals(mDictionaryUnderTest.wordRequestedToBeDeletedFromStorage, word); //checking validity of the internal structure assetNodeArrayIsValid(mDictionaryUnderTest.getRoot()); //re-adding assertTrue(mDictionaryUnderTest.addWord(word, wordFreq + 1)); assertTrue(mDictionaryUnderTest.isValidWord(word)); Assert.assertEquals(wordFreq+1, mDictionaryUnderTest.getWordFrequency(word)); mDictionaryUnderTest.wordRequestedToBeDeletedFromStorage = null; mDictionaryUnderTest.deleteWord(word); Assert.assertFalse(mDictionaryUnderTest.isValidWord(word)); Assert.assertEquals(mDictionaryUnderTest.wordRequestedToBeDeletedFromStorage, word); //checking validity of the internal structure assetNodeArrayIsValid(mDictionaryUnderTest.getRoot()); //a new one word = "new"; assertTrue(mDictionaryUnderTest.addWord(word, wordFreq)); assertTrue(mDictionaryUnderTest.isValidWord(word)); Assert.assertEquals(wordFreq, mDictionaryUnderTest.getWordFrequency(word)); mDictionaryUnderTest.wordRequestedToBeDeletedFromStorage = null; mDictionaryUnderTest.deleteWord(word); Assert.assertFalse(mDictionaryUnderTest.isValidWord(word)); Assert.assertEquals(mDictionaryUnderTest.wordRequestedToBeDeletedFromStorage, word); //checking validity of the internal structure assetNodeArrayIsValid(mDictionaryUnderTest.getRoot()); //none existing Assert.assertFalse(mDictionaryUnderTest.isValidWord("fail")); mDictionaryUnderTest.deleteWord("fail"); Assert.assertFalse(mDictionaryUnderTest.isValidWord("fail")); //checking validity of the internal structure assetNodeArrayIsValid(mDictionaryUnderTest.getRoot()); //deleting part of the root mDictionaryUnderTest.addWord("root", 1); mDictionaryUnderTest.addWord("rooting", 2); mDictionaryUnderTest.addWord("rootina", 2); Assert.assertFalse(mDictionaryUnderTest.isValidWord("roo")); Assert.assertFalse(mDictionaryUnderTest.isValidWord("rooti")); //checking validity of the internal structure assetNodeArrayIsValid(mDictionaryUnderTest.getRoot()); mDictionaryUnderTest.deleteWord("root"); Assert.assertFalse(mDictionaryUnderTest.isValidWord("roo")); Assert.assertFalse(mDictionaryUnderTest.isValidWord("root")); Assert.assertFalse(mDictionaryUnderTest.isValidWord("rooti")); assertTrue(mDictionaryUnderTest.isValidWord("rooting")); assertTrue(mDictionaryUnderTest.isValidWord("rootina")); //checking validity of the internal structure assetNodeArrayIsValid(mDictionaryUnderTest.getRoot()); mDictionaryUnderTest.deleteWord("rooting"); Assert.assertFalse(mDictionaryUnderTest.isValidWord("root")); Assert.assertFalse(mDictionaryUnderTest.isValidWord("rooti")); Assert.assertFalse(mDictionaryUnderTest.isValidWord("rooting")); assertTrue(mDictionaryUnderTest.isValidWord("rootina")); //checking validity of the internal structure assetNodeArrayIsValid(mDictionaryUnderTest.getRoot()); mDictionaryUnderTest.addWord("root", 1); assertTrue(mDictionaryUnderTest.isValidWord("root")); Assert.assertFalse(mDictionaryUnderTest.isValidWord("rooting")); Assert.assertFalse(mDictionaryUnderTest.isValidWord("rooti")); assertTrue(mDictionaryUnderTest.isValidWord("rootina")); //checking validity of the internal structure assetNodeArrayIsValid(mDictionaryUnderTest.getRoot()); mDictionaryUnderTest.deleteWord("rootina"); assertTrue(mDictionaryUnderTest.isValidWord("root")); Assert.assertFalse(mDictionaryUnderTest.isValidWord("rooting")); Assert.assertFalse(mDictionaryUnderTest.isValidWord("rooti")); Assert.assertFalse(mDictionaryUnderTest.isValidWord("rootina")); //checking validity of the internal structure assetNodeArrayIsValid(mDictionaryUnderTest.getRoot()); } private void assetNodeArrayIsValid(BTreeDictionary.NodeArray root) { assertTrue(root.length >=0); assertTrue(root.length <= root.data.length); for (int i=0;i<root.length;i++) { assertNotNull(root.data[i]); if (root.data[i].children != null)//it may be null. assetNodeArrayIsValid(root.data[i].children); } } @Test public void testClose() throws Exception { mDictionaryUnderTest.loadDictionary(); assertTrue(mDictionaryUnderTest.isValidWord((String) TestableBTreeDictionary.STORAGE[0][1])); mDictionaryUnderTest.close(); assertTrue(mDictionaryUnderTest.storageIsClosed); Assert.assertFalse(mDictionaryUnderTest.isValidWord((String)TestableBTreeDictionary.STORAGE[0][1])); Assert.assertEquals(mDictionaryUnderTest.getWordFrequency((String)TestableBTreeDictionary.STORAGE[0][1]), 0); Assert.assertFalse(mDictionaryUnderTest.addWord("fail", 1)); } }