1 /*
2  * Copyright (C) 2014 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.settings;
18 
19 import android.content.res.Resources;
20 import android.test.AndroidTestCase;
21 import android.test.suitebuilder.annotation.SmallTest;
22 
23 import com.android.inputmethod.latin.Constants;
24 import com.android.inputmethod.latin.R;
25 import com.android.inputmethod.latin.SuggestedWords;
26 import com.android.inputmethod.latin.utils.RunInLocale;
27 
28 import junit.framework.AssertionFailedError;
29 
30 import java.util.Locale;
31 
32 @SmallTest
33 public class SpacingAndPunctuationsTests extends AndroidTestCase {
34     private static final int ARMENIAN_FULL_STOP = '\u0589';
35     private static final int ARMENIAN_COMMA = '\u055D';
36 
37     private int mScreenMetrics;
38 
isPhone()39     private boolean isPhone() {
40         return mScreenMetrics == Constants.SCREEN_METRICS_SMALL_PHONE
41                 || mScreenMetrics == Constants.SCREEN_METRICS_LARGE_PHONE;
42     }
43 
isTablet()44     private boolean isTablet() {
45         return mScreenMetrics == Constants.SCREEN_METRICS_SMALL_TABLET
46                 || mScreenMetrics == Constants.SCREEN_METRICS_LARGE_TABLET;
47     }
48 
49     private SpacingAndPunctuations ENGLISH;
50     private SpacingAndPunctuations FRENCH;
51     private SpacingAndPunctuations GERMAN;
52     private SpacingAndPunctuations ARMENIAN;
53     private SpacingAndPunctuations THAI;
54     private SpacingAndPunctuations KHMER;
55     private SpacingAndPunctuations LAO;
56     private SpacingAndPunctuations ARABIC;
57     private SpacingAndPunctuations PERSIAN;
58     private SpacingAndPunctuations HEBREW;
59 
60     private SpacingAndPunctuations UNITED_STATES;
61     private SpacingAndPunctuations UNITED_KINGDOM;
62     private SpacingAndPunctuations CANADA_FRENCH;
63     private SpacingAndPunctuations SWISS_GERMAN;
64     private SpacingAndPunctuations INDIA_ENGLISH;
65     private SpacingAndPunctuations ARMENIA_ARMENIAN;
66     private SpacingAndPunctuations CAMBODIA_KHMER;
67     private SpacingAndPunctuations LAOS_LAO;
68 
69     @Override
setUp()70     protected void setUp() throws Exception {
71         super.setUp();
72 
73         mScreenMetrics = mContext.getResources().getInteger(R.integer.config_screen_metrics);
74 
75         // Language only
76         ENGLISH = getSpacingAndPunctuations(Locale.ENGLISH);
77         FRENCH = getSpacingAndPunctuations(Locale.FRENCH);
78         GERMAN = getSpacingAndPunctuations(Locale.GERMAN);
79         THAI = getSpacingAndPunctuations(new Locale("th"));
80         ARMENIAN = getSpacingAndPunctuations(new Locale("hy"));
81         KHMER = getSpacingAndPunctuations(new Locale("km"));
82         LAO = getSpacingAndPunctuations(new Locale("lo"));
83         ARABIC = getSpacingAndPunctuations(new Locale("ar"));
84         PERSIAN = getSpacingAndPunctuations(new Locale("fa"));
85         HEBREW = getSpacingAndPunctuations(new Locale("iw"));
86 
87         // Language and Country
88         UNITED_STATES = getSpacingAndPunctuations(Locale.US);
89         UNITED_KINGDOM = getSpacingAndPunctuations(Locale.UK);
90         CANADA_FRENCH = getSpacingAndPunctuations(Locale.CANADA_FRENCH);
91         SWISS_GERMAN = getSpacingAndPunctuations(new Locale("de", "CH"));
92         INDIA_ENGLISH = getSpacingAndPunctuations(new Locale("en", "IN"));
93         ARMENIA_ARMENIAN = getSpacingAndPunctuations(new Locale("hy", "AM"));
94         CAMBODIA_KHMER = getSpacingAndPunctuations(new Locale("km", "KH"));
95         LAOS_LAO = getSpacingAndPunctuations(new Locale("lo", "LA"));
96     }
97 
getSpacingAndPunctuations(final Locale locale)98     private SpacingAndPunctuations getSpacingAndPunctuations(final Locale locale) {
99         final RunInLocale<SpacingAndPunctuations> job = new RunInLocale<SpacingAndPunctuations>() {
100             @Override
101             protected SpacingAndPunctuations job(Resources res) {
102                 return new SpacingAndPunctuations(res);
103             }
104         };
105         return job.runInLocale(getContext().getResources(), locale);
106     }
107 
testingStandardWordSeparator(final SpacingAndPunctuations sp)108     private static void testingStandardWordSeparator(final SpacingAndPunctuations sp) {
109         assertTrue("Tab",         sp.isWordSeparator('\t'));
110         assertTrue("Newline",     sp.isWordSeparator('\n'));
111         assertTrue("Space",       sp.isWordSeparator(' '));
112         assertTrue("Exclamation", sp.isWordSeparator('!'));
113         assertTrue("Quotation",   sp.isWordSeparator('"'));
114         assertFalse("Number",     sp.isWordSeparator('#'));
115         assertFalse("Dollar",     sp.isWordSeparator('$'));
116         assertFalse("Percent",    sp.isWordSeparator('%'));
117         assertTrue("Ampersand",   sp.isWordSeparator('&'));
118         assertFalse("Apostrophe", sp.isWordSeparator('\''));
119         assertTrue("L Paren",     sp.isWordSeparator('('));
120         assertTrue("R Paren",     sp.isWordSeparator(')'));
121         assertTrue("Asterisk",    sp.isWordSeparator('*'));
122         assertTrue("Plus",        sp.isWordSeparator('+'));
123         assertTrue("Comma",       sp.isWordSeparator(','));
124         assertFalse("Minus",      sp.isWordSeparator('-'));
125         assertTrue("Period",      sp.isWordSeparator('.'));
126         assertTrue("Slash",       sp.isWordSeparator('/'));
127         assertTrue("Colon",       sp.isWordSeparator(':'));
128         assertTrue("Semicolon",   sp.isWordSeparator(';'));
129         assertTrue("L Angle",     sp.isWordSeparator('<'));
130         assertTrue("Equal",       sp.isWordSeparator('='));
131         assertTrue("R Angle",     sp.isWordSeparator('>'));
132         assertTrue("Question",    sp.isWordSeparator('?'));
133         assertFalse("Atmark",     sp.isWordSeparator('@'));
134         assertTrue("L S Bracket", sp.isWordSeparator('['));
135         assertFalse("B Slash",    sp.isWordSeparator('\\'));
136         assertTrue("R S Bracket", sp.isWordSeparator(']'));
137         assertFalse("Circumflex", sp.isWordSeparator('^'));
138         assertTrue("Underscore",  sp.isWordSeparator('_'));
139         assertFalse("Grave",      sp.isWordSeparator('`'));
140         assertTrue("L C Brace",   sp.isWordSeparator('{'));
141         assertTrue("V Line",      sp.isWordSeparator('|'));
142         assertTrue("R C Brace",   sp.isWordSeparator('}'));
143         assertFalse("Tilde",      sp.isWordSeparator('~'));
144     }
145 
testWordSeparator()146     public void testWordSeparator() {
147         testingStandardWordSeparator(ENGLISH);
148         testingStandardWordSeparator(FRENCH);
149         testingStandardWordSeparator(CANADA_FRENCH);
150         testingStandardWordSeparator(ARMENIA_ARMENIAN);
151         assertTrue(ARMENIA_ARMENIAN.isWordSeparator(ARMENIAN_FULL_STOP));
152         assertTrue(ARMENIA_ARMENIAN.isWordSeparator(ARMENIAN_COMMA));
153         // TODO: We should fix these.
154         testingStandardWordSeparator(ARMENIAN);
155         assertFalse(ARMENIAN.isWordSeparator(ARMENIAN_FULL_STOP));
156         assertFalse(ARMENIAN.isWordSeparator(ARMENIAN_COMMA));
157     }
158 
testingStandardWordConnector(final SpacingAndPunctuations sp)159     private static void testingStandardWordConnector(final SpacingAndPunctuations sp) {
160         assertFalse("Tab",         sp.isWordConnector('\t'));
161         assertFalse("Newline",     sp.isWordConnector('\n'));
162         assertFalse("Space",       sp.isWordConnector(' '));
163         assertFalse("Exclamation", sp.isWordConnector('!'));
164         assertFalse("Quotation",   sp.isWordConnector('"'));
165         assertFalse("Number",      sp.isWordConnector('#'));
166         assertFalse("Dollar",      sp.isWordConnector('$'));
167         assertFalse("Percent",     sp.isWordConnector('%'));
168         assertFalse("Ampersand",   sp.isWordConnector('&'));
169         assertTrue("Apostrophe",   sp.isWordConnector('\''));
170         assertFalse("L Paren",     sp.isWordConnector('('));
171         assertFalse("R Paren",     sp.isWordConnector(')'));
172         assertFalse("Asterisk",    sp.isWordConnector('*'));
173         assertFalse("Plus",        sp.isWordConnector('+'));
174         assertFalse("Comma",       sp.isWordConnector(','));
175         assertTrue("Minus",        sp.isWordConnector('-'));
176         assertFalse("Period",      sp.isWordConnector('.'));
177         assertFalse("Slash",       sp.isWordConnector('/'));
178         assertFalse("Colon",       sp.isWordConnector(':'));
179         assertFalse("Semicolon",   sp.isWordConnector(';'));
180         assertFalse("L Angle",     sp.isWordConnector('<'));
181         assertFalse("Equal",       sp.isWordConnector('='));
182         assertFalse("R Angle",     sp.isWordConnector('>'));
183         assertFalse("Question",    sp.isWordConnector('?'));
184         assertFalse("Atmark",      sp.isWordConnector('@'));
185         assertFalse("L S Bracket", sp.isWordConnector('['));
186         assertFalse("B Slash",     sp.isWordConnector('\\'));
187         assertFalse("R S Bracket", sp.isWordConnector(']'));
188         assertFalse("Circumflex",  sp.isWordConnector('^'));
189         assertFalse("Underscore",  sp.isWordConnector('_'));
190         assertFalse("Grave",       sp.isWordConnector('`'));
191         assertFalse("L C Brace",   sp.isWordConnector('{'));
192         assertFalse("V Line",      sp.isWordConnector('|'));
193         assertFalse("R C Brace",   sp.isWordConnector('}'));
194         assertFalse("Tilde",       sp.isWordConnector('~'));
195 
196     }
197 
testWordConnector()198     public void testWordConnector() {
199         testingStandardWordConnector(ENGLISH);
200         testingStandardWordConnector(FRENCH);
201         testingStandardWordConnector(CANADA_FRENCH);
202         testingStandardWordConnector(ARMENIA_ARMENIAN);
203     }
204 
testingCommonPrecededBySpace(final SpacingAndPunctuations sp)205     private static void testingCommonPrecededBySpace(final SpacingAndPunctuations sp) {
206         assertFalse("Tab",         sp.isUsuallyPrecededBySpace('\t'));
207         assertFalse("Newline",     sp.isUsuallyPrecededBySpace('\n'));
208         assertFalse("Space",       sp.isUsuallyPrecededBySpace(' '));
209         //assertFalse("Exclamation", sp.isUsuallyPrecededBySpace('!'));
210         assertFalse("Quotation",   sp.isUsuallyPrecededBySpace('"'));
211         assertFalse("Number",      sp.isUsuallyPrecededBySpace('#'));
212         assertFalse("Dollar",      sp.isUsuallyPrecededBySpace('$'));
213         assertFalse("Percent",     sp.isUsuallyPrecededBySpace('%'));
214         assertTrue("Ampersand",    sp.isUsuallyPrecededBySpace('&'));
215         assertFalse("Apostrophe",  sp.isUsuallyPrecededBySpace('\''));
216         assertTrue("L Paren",      sp.isUsuallyPrecededBySpace('('));
217         assertFalse("R Paren",     sp.isUsuallyPrecededBySpace(')'));
218         assertFalse("Asterisk",    sp.isUsuallyPrecededBySpace('*'));
219         assertFalse("Plus",        sp.isUsuallyPrecededBySpace('+'));
220         assertFalse("Comma",       sp.isUsuallyPrecededBySpace(','));
221         assertFalse("Minus",       sp.isUsuallyPrecededBySpace('-'));
222         assertFalse("Period",      sp.isUsuallyPrecededBySpace('.'));
223         assertFalse("Slash",       sp.isUsuallyPrecededBySpace('/'));
224         //assertFalse("Colon",       sp.isUsuallyPrecededBySpace(':'));
225         //assertFalse("Semicolon",   sp.isUsuallyPrecededBySpace(';'));
226         assertFalse("L Angle",     sp.isUsuallyPrecededBySpace('<'));
227         assertFalse("Equal",       sp.isUsuallyPrecededBySpace('='));
228         assertFalse("R Angle",     sp.isUsuallyPrecededBySpace('>'));
229         //assertFalse("Question",    sp.isUsuallyPrecededBySpace('?'));
230         assertFalse("Atmark",      sp.isUsuallyPrecededBySpace('@'));
231         assertTrue("L S Bracket",  sp.isUsuallyPrecededBySpace('['));
232         assertFalse("B Slash",     sp.isUsuallyPrecededBySpace('\\'));
233         assertFalse("R S Bracket", sp.isUsuallyPrecededBySpace(']'));
234         assertFalse("Circumflex",  sp.isUsuallyPrecededBySpace('^'));
235         assertFalse("Underscore",  sp.isUsuallyPrecededBySpace('_'));
236         assertFalse("Grave",       sp.isUsuallyPrecededBySpace('`'));
237         assertTrue("L C Brace",    sp.isUsuallyPrecededBySpace('{'));
238         assertFalse("V Line",      sp.isUsuallyPrecededBySpace('|'));
239         assertFalse("R C Brace",   sp.isUsuallyPrecededBySpace('}'));
240         assertFalse("Tilde",       sp.isUsuallyPrecededBySpace('~'));
241     }
242 
testingStandardPrecededBySpace(final SpacingAndPunctuations sp)243     private static void testingStandardPrecededBySpace(final SpacingAndPunctuations sp) {
244         testingCommonPrecededBySpace(sp);
245         assertFalse("Exclamation", sp.isUsuallyPrecededBySpace('!'));
246         assertFalse("Colon",       sp.isUsuallyPrecededBySpace(':'));
247         assertFalse("Semicolon",   sp.isUsuallyPrecededBySpace(';'));
248         assertFalse("Question",    sp.isUsuallyPrecededBySpace('?'));
249     }
250 
testIsUsuallyPrecededBySpace()251     public void testIsUsuallyPrecededBySpace() {
252         testingStandardPrecededBySpace(ENGLISH);
253         testingCommonPrecededBySpace(FRENCH);
254         assertTrue("Exclamation", FRENCH.isUsuallyPrecededBySpace('!'));
255         assertTrue("Colon",       FRENCH.isUsuallyPrecededBySpace(':'));
256         assertTrue("Semicolon",   FRENCH.isUsuallyPrecededBySpace(';'));
257         assertTrue("Question",    FRENCH.isUsuallyPrecededBySpace('?'));
258         testingCommonPrecededBySpace(CANADA_FRENCH);
259         assertFalse("Exclamation", CANADA_FRENCH.isUsuallyPrecededBySpace('!'));
260         assertTrue("Colon",        CANADA_FRENCH.isUsuallyPrecededBySpace(':'));
261         assertFalse("Semicolon",   CANADA_FRENCH.isUsuallyPrecededBySpace(';'));
262         assertFalse("Question",    CANADA_FRENCH.isUsuallyPrecededBySpace('?'));
263         testingStandardPrecededBySpace(ARMENIA_ARMENIAN);
264     }
265 
testingStandardFollowedBySpace(final SpacingAndPunctuations sp)266     private static void testingStandardFollowedBySpace(final SpacingAndPunctuations sp) {
267         assertFalse("Tab",         sp.isUsuallyFollowedBySpace('\t'));
268         assertFalse("Newline",     sp.isUsuallyFollowedBySpace('\n'));
269         assertFalse("Space",       sp.isUsuallyFollowedBySpace(' '));
270         assertTrue("Exclamation",  sp.isUsuallyFollowedBySpace('!'));
271         assertFalse("Quotation",   sp.isUsuallyFollowedBySpace('"'));
272         assertFalse("Number",      sp.isUsuallyFollowedBySpace('#'));
273         assertFalse("Dollar",      sp.isUsuallyFollowedBySpace('$'));
274         assertFalse("Percent",     sp.isUsuallyFollowedBySpace('%'));
275         assertTrue("Ampersand",    sp.isUsuallyFollowedBySpace('&'));
276         assertFalse("Apostrophe",  sp.isUsuallyFollowedBySpace('\''));
277         assertFalse("L Paren",     sp.isUsuallyFollowedBySpace('('));
278         assertTrue("R Paren",      sp.isUsuallyFollowedBySpace(')'));
279         assertFalse("Asterisk",    sp.isUsuallyFollowedBySpace('*'));
280         assertFalse("Plus",        sp.isUsuallyFollowedBySpace('+'));
281         assertTrue("Comma",        sp.isUsuallyFollowedBySpace(','));
282         assertFalse("Minus",       sp.isUsuallyFollowedBySpace('-'));
283         assertTrue("Period",       sp.isUsuallyFollowedBySpace('.'));
284         assertFalse("Slash",       sp.isUsuallyFollowedBySpace('/'));
285         assertTrue("Colon",        sp.isUsuallyFollowedBySpace(':'));
286         assertTrue("Semicolon",    sp.isUsuallyFollowedBySpace(';'));
287         assertFalse("L Angle",     sp.isUsuallyFollowedBySpace('<'));
288         assertFalse("Equal",       sp.isUsuallyFollowedBySpace('='));
289         assertFalse("R Angle",     sp.isUsuallyFollowedBySpace('>'));
290         assertTrue("Question",     sp.isUsuallyFollowedBySpace('?'));
291         assertFalse("Atmark",      sp.isUsuallyFollowedBySpace('@'));
292         assertFalse("L S Bracket", sp.isUsuallyFollowedBySpace('['));
293         assertFalse("B Slash",     sp.isUsuallyFollowedBySpace('\\'));
294         assertTrue("R S Bracket",  sp.isUsuallyFollowedBySpace(']'));
295         assertFalse("Circumflex",  sp.isUsuallyFollowedBySpace('^'));
296         assertFalse("Underscore",  sp.isUsuallyFollowedBySpace('_'));
297         assertFalse("Grave",       sp.isUsuallyFollowedBySpace('`'));
298         assertFalse("L C Brace",   sp.isUsuallyFollowedBySpace('{'));
299         assertFalse("V Line",      sp.isUsuallyFollowedBySpace('|'));
300         assertTrue("R C Brace",    sp.isUsuallyFollowedBySpace('}'));
301         assertFalse("Tilde",       sp.isUsuallyFollowedBySpace('~'));
302     }
303 
testIsUsuallyFollowedBySpace()304     public void testIsUsuallyFollowedBySpace() {
305         testingStandardFollowedBySpace(ENGLISH);
306         testingStandardFollowedBySpace(FRENCH);
307         testingStandardFollowedBySpace(CANADA_FRENCH);
308         testingStandardFollowedBySpace(ARMENIA_ARMENIAN);
309         assertTrue(ARMENIA_ARMENIAN.isUsuallyFollowedBySpace(ARMENIAN_FULL_STOP));
310         assertTrue(ARMENIA_ARMENIAN.isUsuallyFollowedBySpace(ARMENIAN_COMMA));
311     }
312 
testingStandardSentenceSeparator(final SpacingAndPunctuations sp)313     private static void testingStandardSentenceSeparator(final SpacingAndPunctuations sp) {
314         assertFalse("Tab",         sp.isUsuallyFollowedBySpace('\t'));
315         assertFalse("Newline",     sp.isUsuallyFollowedBySpace('\n'));
316         assertFalse("Space",       sp.isUsuallyFollowedBySpace(' '));
317         assertFalse("Exclamation", sp.isUsuallyFollowedBySpace('!'));
318         assertFalse("Quotation",   sp.isUsuallyFollowedBySpace('"'));
319         assertFalse("Number",      sp.isUsuallyFollowedBySpace('#'));
320         assertFalse("Dollar",      sp.isUsuallyFollowedBySpace('$'));
321         assertFalse("Percent",     sp.isUsuallyFollowedBySpace('%'));
322         assertFalse("Ampersand",   sp.isUsuallyFollowedBySpace('&'));
323         assertFalse("Apostrophe",  sp.isUsuallyFollowedBySpace('\''));
324         assertFalse("L Paren",     sp.isUsuallyFollowedBySpace('('));
325         assertFalse("R Paren",     sp.isUsuallyFollowedBySpace(')'));
326         assertFalse("Asterisk",    sp.isUsuallyFollowedBySpace('*'));
327         assertFalse("Plus",        sp.isUsuallyFollowedBySpace('+'));
328         assertFalse("Comma",       sp.isUsuallyFollowedBySpace(','));
329         assertFalse("Minus",       sp.isUsuallyFollowedBySpace('-'));
330         assertTrue("Period",       sp.isUsuallyFollowedBySpace('.'));
331         assertFalse("Slash",       sp.isUsuallyFollowedBySpace('/'));
332         assertFalse("Colon",       sp.isUsuallyFollowedBySpace(':'));
333         assertFalse("Semicolon",   sp.isUsuallyFollowedBySpace(';'));
334         assertFalse("L Angle",     sp.isUsuallyFollowedBySpace('<'));
335         assertFalse("Equal",       sp.isUsuallyFollowedBySpace('='));
336         assertFalse("R Angle",     sp.isUsuallyFollowedBySpace('>'));
337         assertFalse("Question",    sp.isUsuallyFollowedBySpace('?'));
338         assertFalse("Atmark",      sp.isUsuallyFollowedBySpace('@'));
339         assertFalse("L S Bracket", sp.isUsuallyFollowedBySpace('['));
340         assertFalse("B Slash",     sp.isUsuallyFollowedBySpace('\\'));
341         assertFalse("R S Bracket", sp.isUsuallyFollowedBySpace(']'));
342         assertFalse("Circumflex",  sp.isUsuallyFollowedBySpace('^'));
343         assertFalse("Underscore",  sp.isUsuallyFollowedBySpace('_'));
344         assertFalse("Grave",       sp.isUsuallyFollowedBySpace('`'));
345         assertFalse("L C Brace",   sp.isUsuallyFollowedBySpace('{'));
346         assertFalse("V Line",      sp.isUsuallyFollowedBySpace('|'));
347         assertFalse("R C Brace",   sp.isUsuallyFollowedBySpace('}'));
348         assertFalse("Tilde",       sp.isUsuallyFollowedBySpace('~'));
349     }
350 
isSentenceSeparator()351     public void isSentenceSeparator() {
352         testingStandardSentenceSeparator(ENGLISH);
353         try {
354             testingStandardSentenceSeparator(ARMENIA_ARMENIAN);
355             fail("Armenian Sentence Separator");
356         } catch (final AssertionFailedError e) {
357             assertEquals("Period", e.getMessage());
358         }
359         assertTrue(ARMENIA_ARMENIAN.isSentenceSeparator(ARMENIAN_FULL_STOP));
360         assertFalse(ARMENIA_ARMENIAN.isSentenceSeparator(ARMENIAN_COMMA));
361     }
362 
testLanguageHasSpace()363     public void testLanguageHasSpace() {
364         assertTrue(ENGLISH.mCurrentLanguageHasSpaces);
365         assertTrue(FRENCH.mCurrentLanguageHasSpaces);
366         assertTrue(GERMAN.mCurrentLanguageHasSpaces);
367         assertFalse(THAI.mCurrentLanguageHasSpaces);
368         assertFalse(CAMBODIA_KHMER.mCurrentLanguageHasSpaces);
369         assertFalse(LAOS_LAO.mCurrentLanguageHasSpaces);
370         // TODO: We should fix these.
371         assertTrue(KHMER.mCurrentLanguageHasSpaces);
372         assertTrue(LAO.mCurrentLanguageHasSpaces);
373     }
374 
testUsesAmericanTypography()375     public void testUsesAmericanTypography() {
376         assertTrue(ENGLISH.mUsesAmericanTypography);
377         assertTrue(UNITED_STATES.mUsesAmericanTypography);
378         assertTrue(UNITED_KINGDOM.mUsesAmericanTypography);
379         assertTrue(INDIA_ENGLISH.mUsesAmericanTypography);
380         assertFalse(FRENCH.mUsesAmericanTypography);
381         assertFalse(GERMAN.mUsesAmericanTypography);
382         assertFalse(SWISS_GERMAN.mUsesAmericanTypography);
383     }
384 
testUsesGermanRules()385     public void testUsesGermanRules() {
386         assertFalse(ENGLISH.mUsesGermanRules);
387         assertFalse(FRENCH.mUsesGermanRules);
388         assertTrue(GERMAN.mUsesGermanRules);
389         assertTrue(SWISS_GERMAN.mUsesGermanRules);
390     }
391 
392     // Punctuations for phone.
393     private static final String[] PUNCTUATION_LABELS_PHONE = {
394         "!", "?", ",", ":", ";", "\"", "(", ")", "'", "-", "/", "@", "_"
395     };
396     private static final String[] PUNCTUATION_WORDS_PHONE_LTR = PUNCTUATION_LABELS_PHONE;
397     private static final String[] PUNCTUATION_WORDS_PHONE_HEBREW = {
398         "!", "?", ",", ":", ";", "\"", ")", "(", "'", "-", "/", "@", "_"
399     };
400     // U+061F: "؟" ARABIC QUESTION MARK
401     // U+060C: "،" ARABIC COMMA
402     // U+061B: "؛" ARABIC SEMICOLON
403     private static final String[] PUNCTUATION_LABELS_PHONE_ARABIC_PERSIAN = {
404         "!", "\u061F", "\u060C", ":", "\u061B", "\"", "(", ")", "'", "-", "/", "@", "_"
405     };
406     private static final String[] PUNCTUATION_WORDS_PHONE_ARABIC_PERSIAN = {
407         "!", "\u061F", "\u060C", ":", "\u061B", "\"", ")", "(", "'", "-", "/", "@", "_"
408     };
409 
410     // Punctuations for tablet.
411     private static final String[] PUNCTUATION_LABELS_TABLET = {
412         ":", ";", "\"", "(", ")", "'", "-", "/", "@", "_"
413     };
414     private static final String[] PUNCTUATION_WORDS_TABLET_LTR = PUNCTUATION_LABELS_TABLET;
415     private static final String[] PUNCTUATION_WORDS_TABLET_HEBREW = {
416         ":", ";", "\"", ")", "(", "'", "-", "/", "@", "_"
417     };
418     private static final String[] PUNCTUATION_LABELS_TABLET_ARABIC_PERSIAN = {
419         "!", "\u061F", ":", "\u061B", "\"", "'", "(", ")",  "-", "/", "@", "_"
420     };
421     private static final String[] PUNCTUATION_WORDS_TABLET_ARABIC_PERSIAN = {
422         "!", "\u061F", ":", "\u061B", "\"", "'", ")", "(",  "-", "/", "@", "_"
423     };
424 
testingStandardPunctuationSuggestions(final SpacingAndPunctuations sp, final String[] punctuationLabels, final String[] punctuationWords)425     private static void testingStandardPunctuationSuggestions(final SpacingAndPunctuations sp,
426             final String[] punctuationLabels, final String[] punctuationWords) {
427         final SuggestedWords suggestedWords = sp.mSuggestPuncList;
428         assertFalse("typedWordValid", suggestedWords.mTypedWordValid);
429         assertFalse("willAutoCorrect", suggestedWords.mWillAutoCorrect);
430         assertTrue("isPunctuationSuggestions", suggestedWords.isPunctuationSuggestions());
431         assertFalse("isObsoleteSuggestions", suggestedWords.mIsObsoleteSuggestions);
432         assertFalse("isPrediction", suggestedWords.isPrediction());
433         assertEquals("size", punctuationLabels.length, suggestedWords.size());
434         for (int index = 0; index < suggestedWords.size(); index++) {
435             assertEquals("punctuation label at " + index,
436                     punctuationLabels[index], suggestedWords.getLabel(index));
437             assertEquals("punctuation word at " + index,
438                     punctuationWords[index], suggestedWords.getWord(index));
439         }
440     }
441 
testPhonePunctuationSuggestions()442     public void testPhonePunctuationSuggestions() {
443         if (!isPhone()) {
444             return;
445         }
446         testingStandardPunctuationSuggestions(ENGLISH,
447                 PUNCTUATION_LABELS_PHONE, PUNCTUATION_WORDS_PHONE_LTR);
448         testingStandardPunctuationSuggestions(FRENCH,
449                 PUNCTUATION_LABELS_PHONE, PUNCTUATION_WORDS_PHONE_LTR);
450         testingStandardPunctuationSuggestions(GERMAN,
451                 PUNCTUATION_LABELS_PHONE, PUNCTUATION_WORDS_PHONE_LTR);
452         testingStandardPunctuationSuggestions(ARABIC,
453                 PUNCTUATION_LABELS_PHONE_ARABIC_PERSIAN, PUNCTUATION_WORDS_PHONE_ARABIC_PERSIAN);
454         testingStandardPunctuationSuggestions(PERSIAN,
455                 PUNCTUATION_LABELS_PHONE_ARABIC_PERSIAN, PUNCTUATION_WORDS_PHONE_ARABIC_PERSIAN);
456         testingStandardPunctuationSuggestions(HEBREW,
457                 PUNCTUATION_LABELS_PHONE, PUNCTUATION_WORDS_PHONE_HEBREW);
458     }
459 
testTabletPunctuationSuggestions()460     public void testTabletPunctuationSuggestions() {
461         if (!isTablet()) {
462             return;
463         }
464         testingStandardPunctuationSuggestions(ENGLISH,
465                 PUNCTUATION_LABELS_TABLET, PUNCTUATION_WORDS_TABLET_LTR);
466         testingStandardPunctuationSuggestions(FRENCH,
467                 PUNCTUATION_LABELS_TABLET, PUNCTUATION_WORDS_TABLET_LTR);
468         testingStandardPunctuationSuggestions(GERMAN,
469                 PUNCTUATION_LABELS_TABLET, PUNCTUATION_WORDS_TABLET_LTR);
470         testingStandardPunctuationSuggestions(ARABIC,
471                 PUNCTUATION_LABELS_TABLET_ARABIC_PERSIAN, PUNCTUATION_WORDS_TABLET_ARABIC_PERSIAN);
472         testingStandardPunctuationSuggestions(PERSIAN,
473                 PUNCTUATION_LABELS_TABLET_ARABIC_PERSIAN, PUNCTUATION_WORDS_TABLET_ARABIC_PERSIAN);
474         testingStandardPunctuationSuggestions(HEBREW,
475                 PUNCTUATION_LABELS_TABLET, PUNCTUATION_WORDS_TABLET_HEBREW);
476     }
477 }
478