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 17 package com.android.inputmethod.latin.utils; 18 19 import android.content.res.Resources; 20 import android.test.AndroidTestCase; 21 import android.test.suitebuilder.annotation.SmallTest; 22 import android.text.TextUtils; 23 24 import com.android.inputmethod.latin.common.LocaleUtils; 25 import com.android.inputmethod.latin.settings.SpacingAndPunctuations; 26 27 import java.util.Locale; 28 29 @SmallTest 30 public class CapsModeUtilsTests extends AndroidTestCase { onePathForCaps(final CharSequence cs, final int expectedResult, final int mask, final SpacingAndPunctuations sp, final boolean hasSpaceBefore)31 private static void onePathForCaps(final CharSequence cs, final int expectedResult, 32 final int mask, final SpacingAndPunctuations sp, final boolean hasSpaceBefore) { 33 final int oneTimeResult = expectedResult & mask; 34 assertEquals("After >" + cs + "<", oneTimeResult, 35 CapsModeUtils.getCapsMode(cs, mask, sp, hasSpaceBefore)); 36 } 37 allPathsForCaps(final CharSequence cs, final int expectedResult, final SpacingAndPunctuations sp, final boolean hasSpaceBefore)38 private static void allPathsForCaps(final CharSequence cs, final int expectedResult, 39 final SpacingAndPunctuations sp, final boolean hasSpaceBefore) { 40 final int c = TextUtils.CAP_MODE_CHARACTERS; 41 final int w = TextUtils.CAP_MODE_WORDS; 42 final int s = TextUtils.CAP_MODE_SENTENCES; 43 onePathForCaps(cs, expectedResult, c | w | s, sp, hasSpaceBefore); 44 onePathForCaps(cs, expectedResult, w | s, sp, hasSpaceBefore); 45 onePathForCaps(cs, expectedResult, c | s, sp, hasSpaceBefore); 46 onePathForCaps(cs, expectedResult, c | w, sp, hasSpaceBefore); 47 onePathForCaps(cs, expectedResult, c, sp, hasSpaceBefore); 48 onePathForCaps(cs, expectedResult, w, sp, hasSpaceBefore); 49 onePathForCaps(cs, expectedResult, s, sp, hasSpaceBefore); 50 } 51 testGetCapsMode()52 public void testGetCapsMode() { 53 final int c = TextUtils.CAP_MODE_CHARACTERS; 54 final int w = TextUtils.CAP_MODE_WORDS; 55 final int s = TextUtils.CAP_MODE_SENTENCES; 56 final RunInLocale<SpacingAndPunctuations> job = new RunInLocale<SpacingAndPunctuations>() { 57 @Override 58 protected SpacingAndPunctuations job(final Resources res) { 59 return new SpacingAndPunctuations(res); 60 } 61 }; 62 final Resources res = getContext().getResources(); 63 SpacingAndPunctuations sp = job.runInLocale(res, Locale.ENGLISH); 64 allPathsForCaps("", c | w | s, sp, false); 65 allPathsForCaps("Word", c, sp, false); 66 allPathsForCaps("Word.", c, sp, false); 67 allPathsForCaps("Word ", c | w, sp, false); 68 allPathsForCaps("Word. ", c | w | s, sp, false); 69 allPathsForCaps("Word..", c, sp, false); 70 allPathsForCaps("Word.. ", c | w | s, sp, false); 71 allPathsForCaps("Word... ", c | w | s, sp, false); 72 allPathsForCaps("Word ... ", c | w | s, sp, false); 73 allPathsForCaps("Word . ", c | w, sp, false); 74 allPathsForCaps("In the U.S ", c | w, sp, false); 75 allPathsForCaps("In the U.S. ", c | w, sp, false); 76 allPathsForCaps("Some stuff (e.g. ", c | w, sp, false); 77 allPathsForCaps("In the U.S.. ", c | w | s, sp, false); 78 allPathsForCaps("\"Word.\" ", c | w | s, sp, false); 79 allPathsForCaps("\"Word\". ", c | w | s, sp, false); 80 allPathsForCaps("\"Word\" ", c | w, sp, false); 81 82 // Test for phantom space 83 allPathsForCaps("Word", c | w, sp, true); 84 allPathsForCaps("Word.", c | w | s, sp, true); 85 86 // Tests after some whitespace 87 allPathsForCaps("Word\n", c | w | s, sp, false); 88 allPathsForCaps("Word\n", c | w | s, sp, true); 89 allPathsForCaps("Word\n ", c | w | s, sp, true); 90 allPathsForCaps("Word.\n", c | w | s, sp, false); 91 allPathsForCaps("Word.\n", c | w | s, sp, true); 92 allPathsForCaps("Word.\n ", c | w | s, sp, true); 93 94 sp = job.runInLocale(res, Locale.FRENCH); 95 allPathsForCaps("\"Word.\" ", c | w, sp, false); 96 allPathsForCaps("\"Word\". ", c | w | s, sp, false); 97 allPathsForCaps("\"Word\" ", c | w, sp, false); 98 99 // Test special case for German. German does not capitalize at the start of a 100 // line when the previous line starts with a comma. It does in other cases. 101 sp = job.runInLocale(res, Locale.GERMAN); 102 allPathsForCaps("Liebe Sara,\n", c | w, sp, false); 103 allPathsForCaps("Liebe Sara,\n", c | w, sp, true); 104 allPathsForCaps("Liebe Sara, \n ", c | w, sp, false); 105 allPathsForCaps("Liebe Sara \n ", c | w | s, sp, false); 106 allPathsForCaps("Liebe Sara.\n ", c | w | s, sp, false); 107 sp = job.runInLocale(res, Locale.ENGLISH); 108 allPathsForCaps("Liebe Sara,\n", c | w | s, sp, false); 109 allPathsForCaps("Liebe Sara,\n", c | w | s, sp, true); 110 allPathsForCaps("Liebe Sara, \n ", c | w | s, sp, false); 111 allPathsForCaps("Liebe Sara \n ", c | w | s, sp, false); 112 allPathsForCaps("Liebe Sara.\n ", c | w | s, sp, false); 113 114 // Test armenian period 115 sp = job.runInLocale(res, LocaleUtils.constructLocaleFromString("hy_AM")); 116 assertTrue("Period is not sentence separator in Armenian", 117 !sp.isSentenceSeparator('.')); 118 assertTrue("Sentence separator is Armenian period in Armenian", 119 sp.isSentenceSeparator(0x589)); 120 // No space : capitalize only if MODE_CHARACTERS 121 allPathsForCaps("Word", c, sp, false); 122 allPathsForCaps("Word.", c, sp, false); 123 // Space, but no armenian period : capitalize if MODE_WORDS but not SENTENCES 124 allPathsForCaps("Word. ", c | w, sp, false); 125 // Armenian period : capitalize if MODE_SENTENCES 126 allPathsForCaps("Word\u0589 ", c | w | s, sp, false); 127 128 // Test for sentence terminators 129 sp = job.runInLocale(res, Locale.ENGLISH); 130 allPathsForCaps("Word? ", c | w | s, sp, false); 131 allPathsForCaps("Word?", c | w | s, sp, true); 132 allPathsForCaps("Word?", c, sp, false); 133 allPathsForCaps("Word! ", c | w | s, sp, false); 134 allPathsForCaps("Word!", c | w | s, sp, true); 135 allPathsForCaps("Word!", c, sp, false); 136 allPathsForCaps("Word; ", c | w, sp, false); 137 allPathsForCaps("Word;", c | w, sp, true); 138 allPathsForCaps("Word;", c, sp, false); 139 // Test for sentence terminators in Greek 140 sp = job.runInLocale(res, LocaleUtils.constructLocaleFromString("el")); 141 allPathsForCaps("Word? ", c | w | s, sp, false); 142 allPathsForCaps("Word?", c | w | s, sp, true); 143 allPathsForCaps("Word?", c, sp, false); 144 allPathsForCaps("Word! ", c | w | s, sp, false); 145 allPathsForCaps("Word!", c | w | s, sp, true); 146 allPathsForCaps("Word!", c, sp, false); 147 // In Greek ";" is the question mark and it terminates the sentence 148 allPathsForCaps("Word; ", c | w | s, sp, false); 149 allPathsForCaps("Word;", c | w | s, sp, true); 150 allPathsForCaps("Word;", c, sp, false); 151 } 152 } 153