| /* |
| * Copyright (C) 2010 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 android.test.AndroidTestCase; |
| import android.util.Log; |
| import com.android.inputmethod.latin.tests.R; |
| import java.io.InputStreamReader; |
| import java.io.InputStream; |
| import java.io.BufferedReader; |
| import java.util.StringTokenizer; |
| |
| public class SuggestPerformanceTests extends AndroidTestCase { |
| private static final String TAG = "SuggestPerformanceTests"; |
| |
| private String mTestText; |
| private SuggestHelper sh; |
| |
| @Override |
| protected void setUp() { |
| // TODO Figure out a way to directly using the dictionary rather than copying it over |
| |
| // For testing with real dictionary, TEMPORARILY COPY main dictionary into test directory. |
| // DO NOT SUBMIT real dictionary under test directory. |
| //int[] resId = new int[] { R.raw.main0, R.raw.main1, R.raw.main2 }; |
| |
| int[] resId = new int[] { R.raw.test }; |
| |
| sh = new SuggestHelper(TAG, getTestContext(), resId); |
| loadString(); |
| } |
| |
| private void loadString() { |
| try { |
| InputStream is = getTestContext().getResources().openRawResource(R.raw.testtext); |
| BufferedReader reader = new BufferedReader(new InputStreamReader(is)); |
| StringBuilder sb = new StringBuilder(); |
| String line = reader.readLine(); |
| while (line != null) { |
| sb.append(line + " "); |
| line = reader.readLine(); |
| } |
| mTestText = sb.toString(); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| } |
| } |
| |
| /************************** Helper functions ************************/ |
| private int lookForSuggestion(String prevWord, String currentWord) { |
| for (int i = 1; i < currentWord.length(); i++) { |
| if (i == 1) { |
| if (sh.isDefaultNextSuggestion(prevWord, currentWord.substring(0, i), |
| currentWord)) { |
| return i; |
| } |
| } else { |
| if (sh.isDefaultNextCorrection(prevWord, currentWord.substring(0, i), |
| currentWord)) { |
| return i; |
| } |
| } |
| } |
| return currentWord.length(); |
| } |
| |
| private double runText(boolean withBigrams) { |
| StringTokenizer st = new StringTokenizer(mTestText); |
| String prevWord = null; |
| int typeCount = 0; |
| int characterCount = 0; // without space |
| int wordCount = 0; |
| while (st.hasMoreTokens()) { |
| String currentWord = st.nextToken(); |
| boolean endCheck = false; |
| if (currentWord.matches("[\\w]*[\\.|?|!|*|@|&|/|:|;]")) { |
| currentWord = currentWord.substring(0, currentWord.length() - 1); |
| endCheck = true; |
| } |
| if (withBigrams && prevWord != null) { |
| typeCount += lookForSuggestion(prevWord, currentWord); |
| } else { |
| typeCount += lookForSuggestion(null, currentWord); |
| } |
| characterCount += currentWord.length(); |
| if (!endCheck) prevWord = currentWord; |
| wordCount++; |
| } |
| |
| double result = (double) (characterCount - typeCount) / characterCount * 100; |
| if (withBigrams) { |
| Log.i(TAG, "with bigrams -> " + result + " % saved!"); |
| } else { |
| Log.i(TAG, "without bigrams -> " + result + " % saved!"); |
| } |
| Log.i(TAG, "\ttotal number of words: " + wordCount); |
| Log.i(TAG, "\ttotal number of characters: " + mTestText.length()); |
| Log.i(TAG, "\ttotal number of characters without space: " + characterCount); |
| Log.i(TAG, "\ttotal number of characters typed: " + typeCount); |
| return result; |
| } |
| |
| |
| /************************** Performance Tests ************************/ |
| /** |
| * Compare the Suggest with and without bigram |
| * Check the log for detail |
| */ |
| public void testSuggestPerformance() { |
| assertTrue(runText(false) <= runText(true)); |
| } |
| } |