CapsModeUtilsTests.java revision 5b91b551e5ffaf2c2e691dfbd434f21c82293986
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.utils;
18
19import android.content.res.Resources;
20import android.test.AndroidTestCase;
21import android.test.suitebuilder.annotation.SmallTest;
22import android.text.TextUtils;
23
24import com.android.inputmethod.latin.common.LocaleUtils;
25import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
26
27import java.util.Locale;
28
29@SmallTest
30public class CapsModeUtilsTests extends AndroidTestCase {
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
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
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