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