| /* |
| * Copyright (C) 2014 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.tools.lint.checks; |
| |
| import static com.android.tools.lint.checks.LocaleFolderDetector.suggestBcp47Correction; |
| |
| import com.android.tools.lint.detector.api.Detector; |
| |
| @SuppressWarnings("javadoc") |
| public class LocaleFolderDetectorTest extends AbstractCheckTest { |
| @Override |
| protected Detector getDetector() { |
| return new LocaleFolderDetector(); |
| } |
| |
| public void testDeprecated() throws Exception { |
| assertEquals("" |
| + "res/values-he: Warning: The locale folder \"he\" should be called \"iw\" instead; see the java.util.Locale documentation [LocaleFolder]\n" |
| + "res/values-id: Warning: The locale folder \"id\" should be called \"in\" instead; see the java.util.Locale documentation [LocaleFolder]\n" |
| + "res/values-yi: Warning: The locale folder \"yi\" should be called \"ji\" instead; see the java.util.Locale documentation [LocaleFolder]\n" |
| + "0 errors, 3 warnings\n", |
| |
| lintProject( |
| "res/values/strings.xml", |
| "res/values/strings.xml=>res/values-no/strings.xml", |
| "res/values/strings.xml=>res/values-he/strings.xml", |
| "res/values/strings.xml=>res/values-id/strings.xml", |
| "res/values/strings.xml=>res/values-yi/strings.xml") |
| ); |
| } |
| |
| public void testSuspiciousRegion() throws Exception { |
| assertEquals("" |
| + "res/values-ff-rNO: Warning: Suspicious language and region combination ff (Fulah) with NO (Norway): language ff is usually paired with: SN (Senegal), CM (Cameroon), GN (Guinea), MR (Mauritania) [WrongRegion]\n" |
| + "res/values-nb-rSE: Warning: Suspicious language and region combination nb (Norwegian Bokm\u00e5l) with SE (Sweden): language nb is usually paired with: NO (Norway), SJ (Svalbard & Jan Mayen) [WrongRegion]\n" |
| + "res/values-sv-rSV: Warning: Suspicious language and region combination sv (Swedish) with SV (El Salvador): language sv is usually paired with: SE (Sweden), AX (Ă…land Islands), FI (Finland) [WrongRegion]\n" |
| + "0 errors, 3 warnings\n", |
| |
| lintProject( |
| "res/values/strings.xml", |
| "res/values/strings.xml=>res/values-no/strings.xml", |
| "res/values/strings.xml=>res/values-nb-rNO/strings.xml", |
| "res/values/strings.xml=>res/values-nb-rSJ/strings.xml", |
| "res/values/strings.xml=>res/values-nb-rSE/strings.xml", |
| "res/values/strings.xml=>res/values-sv-rSV/strings.xml", |
| "res/values/strings.xml=>res/values-ff-rNO/strings.xml" |
| ) |
| ); |
| } |
| |
| public void testAlpha3() throws Exception { |
| assertEquals("" |
| + "res/values-b+nor+NOR: Warning: For compatibility, should use 2-letter language codes when available; use no instead of nor [UseAlpha2]\n" |
| + "res/values-b+nor+NOR: Warning: For compatibility, should use 2-letter region codes when available; use NO instead of nor [UseAlpha2]\n" |
| + "0 errors, 2 warnings\n", |
| |
| lintProject( |
| "res/values/strings.xml", |
| "res/values/strings.xml=>res/values-no/strings.xml", |
| "res/values/strings.xml=>res/values-b+kok+IN//strings.xml", // OK |
| "res/values/strings.xml=>res/values-b+nor+NOR/strings.xml" // Not OK |
| ) |
| ); |
| } |
| |
| public void testInvalidFolder() throws Exception { |
| assertEquals("" |
| + "res/values-ldtrl-mnc123: Error: Invalid resource folder: make sure qualifiers appear in the correct order, are spelled correctly, etc. [InvalidResourceFolder]\n" |
| + "res/values-no-rNOR: Error: Invalid resource folder; did you mean b+no+NO ? [InvalidResourceFolder]\n" |
| + "2 errors, 0 warnings\n", |
| |
| lintProject( |
| "res/values/strings.xml", |
| "res/values/strings.xml=>res/values-ldtrl-mnc123/strings.xml", |
| "res/values/strings.xml=>res/values-kok-rIN//strings.xml", |
| "res/values/strings.xml=>res/values-no-rNOR/strings.xml" |
| ) |
| ); |
| } |
| |
| public void testConflictingScripts() throws Exception { |
| assertEquals("" |
| + "res/values-b+en+Scr1: Error: Multiple locale folders for language en map to a single folder in versions < API 21: values-b+en+Scr2, values-b+en+Scr1 [InvalidResourceFolder]\n" |
| + " res/values-b+en+Scr2: <No location-specific message\n" |
| + "1 errors, 0 warnings\n", |
| |
| lintProject( |
| "res/values/strings.xml", |
| "res/values/strings.xml=>res/values-b+en+Scr1/strings.xml", |
| "res/values/strings.xml=>res/values-b+en+Scr2/strings.xml", |
| "res/values/strings.xml=>res/values-b+en+Scr3-v21/strings.xml", |
| "res/values/strings.xml=>res/values-b+fr+Scr1-v21/strings.xml", |
| "res/values/strings.xml=>res/values-b+fr+Scr2-v21/strings.xml", |
| "res/values/strings.xml=>res/values-b+no+Scr1/strings.xml", |
| "res/values/strings.xml=>res/values-b+no+Scr2-v21/strings.xml", |
| "res/values/strings.xml=>res/values-b+se+Scr1/strings.xml", |
| "res/values/strings.xml=>res/values-b+de+Scr1+DE/strings.xml", |
| "res/values/strings.xml=>res/values-b+de+Scr2+AT/strings.xml" |
| ) |
| ); |
| } |
| |
| public void testBcpReplacement() { |
| assertEquals("b+no+NO", suggestBcp47Correction("values-nor-rNO")); |
| assertEquals("b+no+NO", suggestBcp47Correction("values-nor-rNOR")); |
| assertEquals("b+es+419", suggestBcp47Correction("values-es-419")); |
| assertNull(suggestBcp47Correction("values-car")); |
| assertNull(suggestBcp47Correction("values-b+foo+bar")); |
| } |
| } |