1a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden/*
2a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * Copyright (C) 2012 The Android Open Source Project
3a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden *
4a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * Licensed under the Apache License, Version 2.0 (the "License");
5a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * you may not use this file except in compliance with the License.
6a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * You may obtain a copy of the License at
7a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden *
8a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden *      http://www.apache.org/licenses/LICENSE-2.0
9a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden *
10a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * Unless required by applicable law or agreed to in writing, software
11a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * distributed under the License is distributed on an "AS IS" BASIS,
12a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * See the License for the specific language governing permissions and
14a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * limitations under the License.
15a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden */
16a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
17a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFaddenimport java.text.DateFormat;
18a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFaddenimport java.text.DateFormatSymbols;
19a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFaddenimport java.text.Normalizer;
20a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFaddenimport java.util.Arrays;
21a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFaddenimport java.util.Calendar;
22a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFaddenimport java.util.Currency;
23a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFaddenimport java.util.Date;
24a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFaddenimport java.util.Locale;
250a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFaddenimport java.util.MissingResourceException;
26a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFaddenimport java.util.TimeZone;
27a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
28a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden/**
29a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * Exercise some locale-table-driven stuff.
30a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden */
31a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFaddenpublic class Main {
32a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
33a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    public static void main(String[] args) {
34a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        try {
35a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            testCalendar();
36a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        } catch (Exception ex) {
37a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            ex.printStackTrace();
38a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        }
39a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
40a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        try {
41a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            testDateFormatSymbols();
42a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        } catch (Exception ex) {
43a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            ex.printStackTrace();
44a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        }
45a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
46a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        try {
47a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            testCurrency();
48a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        } catch (Exception ex) {
49a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            ex.printStackTrace();
50a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        }
51a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
52a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        try {
53a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            testNormalizer();
54a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        } catch (Exception ex) {
55a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            ex.printStackTrace();
56a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        }
57a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
58a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        try {
590a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden            testIso3();
60a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        } catch (Exception ex) {
61a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            ex.printStackTrace();
62a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        }
63a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    }
64a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
65a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    static void testCalendar() {
66a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        TimeZone tz = TimeZone.getTimeZone("GMT");
67a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
68a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        Locale usa = new Locale("en", "US");
69a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        Calendar usaCal = Calendar.getInstance(tz, usa);
700a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        usaCal.clear();     // don't want current date/time
71a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        usaCal.set(2012, Calendar.JANUARY, 1);
72a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
73a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        Date when = usaCal.getTime();
74a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        DateFormat fmt = DateFormat.getDateInstance(DateFormat.FULL, usa);
750a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        fmt.setTimeZone(tz);    // defaults to local TZ; force GMT
760a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        System.out.println("USA(" + fmt.getTimeZone().getID() + "): "
770a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden            + fmt.format(when));
78a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
79a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        System.out.println("USA: first="
80a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            + usaCal.getFirstDayOfWeek() + ", name="
81a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            + usaCal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, usa));
82a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
83a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
84a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        Locale france = new Locale("fr", "FR");
85a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        Calendar franceCal = Calendar.getInstance(tz, france);
860a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        franceCal.clear();
87a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        franceCal.set(2012, Calendar.JANUARY, 2);
88a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
89a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        when = franceCal.getTime();
90a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        fmt = DateFormat.getDateInstance(DateFormat.FULL, usa);
910a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        fmt.setTimeZone(tz);    // defaults to local TZ; force GMT
920a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        System.out.println("France(" + fmt.getTimeZone().getID() + "): "
930a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden            + fmt.format(when));
94a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
95a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        System.out.println("France: first="
96a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            + franceCal.getFirstDayOfWeek() + ", name="
97a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            + franceCal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, france));
98a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    }
99a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
100a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    static void testDateFormatSymbols() {
101a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        Locale usa = new Locale("en", "US");
102a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        DateFormatSymbols syms = DateFormatSymbols.getInstance(usa);
103a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        String[] list = syms.getAmPmStrings();
104a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        System.out.println("USA dfs: " + Arrays.deepToString(list));
105a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    }
106a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
107a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    static void testCurrency() {
108a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        Locale usa = new Locale("en", "US");
109a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        Currency dollars = Currency.getInstance(usa);
110a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
111a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        System.out.println(usa.toString() + ": " + dollars.toString()
112a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            + " " + dollars.getSymbol() + dollars.getDefaultFractionDigits());
113a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
114a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        Locale japan = new Locale("jp", "JP");
115a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        Currency yen = Currency.getInstance(japan);
116a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
117a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        System.out.println(japan.toString() + ": " + yen.toString()
118a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            + " " + yen.getSymbol() + yen.getDefaultFractionDigits());
119a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    }
120a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
121a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    static void testNormalizer() {
122a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        String composed = "Bl\u00c1ah";
123a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        String decomposed = "Bl\u0041\u0301ah";
124a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        String res;
125a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
126a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        res = Normalizer.normalize(composed, Normalizer.Form.NFD);
127a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        if (!decomposed.equals(res)) {
128a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            System.err.println("Bad decompose: '" + composed + "' --> '"
129a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden                + res + "'");
130a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        }
131a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
132a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        res = Normalizer.normalize(decomposed, Normalizer.Form.NFC);
133a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        if (!composed.equals(res)) {
134a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            System.err.println("Bad compose: '" + decomposed + "' --> '"
135a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden                + res + "'");
136a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        }
137a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
138a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        System.out.println("Normalizer passed");
139a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    }
140a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
1410a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden    /*
1420a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden     * Test that we can set and get an ISO3 language code.  Support for this
1430a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden     * is expected by the Android framework.
1440a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden     */
1450a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden    static void testIso3() {
1460a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        Locale loc;
1470a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        loc = new Locale("en", "US");
1480a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        System.out.println("loc: " + loc);
1490a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        System.out.println(" iso3=" + loc.getISO3Language());
1500a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden
1510a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        loc = new Locale("eng", "USA");
1520a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        System.out.println("loc: " + loc);
1530a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        try {
1540a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden            System.out.println(" iso3=" + loc.getISO3Language());
1550a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        } catch (MissingResourceException mre) {
1560a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden            System.err.println("couldn't get iso3 language");
1570a6a598b7bcb38a4ca86d6585ae2e3b4933f3a08Andy McFadden        }
158a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    }
159a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden}
160