164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// Copyright (C) 2016 and later: Unicode, Inc. and others.
264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
58de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * Copyright (c) 1997-2016, International Business Machines Corporation and
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "loctest.h"
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/decimfmt.h"
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucurr.h"
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/smpdtfmt.h"
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/dtfmtsym.h"
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/brkiter.h"
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/coll.h"
168de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "cmemory.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h>
19b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include <string.h>
20c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "putilimp.h"
21c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "unicode/ustring.h"
221b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#include "hash.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* const rawData[33][8] = {
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // language code
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "en",   "fr",   "ca",   "el",   "no",   "it",   "xx",   "zh"  },
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // script code
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "",     "",     "",     "",     "",     "",     "",     "Hans" },
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // country code
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "US",   "FR",   "ES",   "GR",   "NO",   "",     "YY",   "CN"  },
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // variant code
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "",     "",     "",     "",     "NY",   "",     "",   ""    },
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // full name
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "en_US",    "fr_FR",    "ca_ES",    "el_GR",    "no_NO_NY", "it",   "xx_YY",   "zh_Hans_CN" },
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // ISO-3 language
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "eng",  "fra",  "cat",  "ell",  "nor",  "ita",  "",   "zho"   },
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // ISO-3 country
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "USA",  "FRA",  "ESP",  "GRC",  "NOR",  "",     "",   "CHN"   },
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // LCID
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "409", "40c", "403", "408", "814", "10",     "0",   "804"  },
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display langage (English)
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "English",  "French",   "Catalan", "Greek",    "Norwegian",    "Italian",  "xx",   "Chinese" },
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display script (English)
46103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        {   "",     "",     "",     "",     "",   "",     "",   "Simplified Han" },
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display country (English)
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "United States",    "France",   "Spain",  "Greece",   "Norway",   "",     "YY",   "China" },
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display variant (English)
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "",     "",     "",     "",     "NY",   "",     "",   ""},
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display name (English)
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Updated no_NO_NY English display name for new pattern-based algorithm
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // (part of Euro support).
54b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {   "English (United States)", "French (France)", "Catalan (Spain)", "Greek (Greece)", "Norwegian (Norway, NY)", "Italian", "xx (YY)", "Chinese (Simplified, China)" },
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display langage (French)
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "anglais",  "fran\\u00E7ais",   "catalan", "grec",    "norv\\u00E9gien",    "italien", "xx", "chinois" },
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display script (French)
5959d709d503bab6e2b61931737e662dd293b40578ccornelius        {   "",     "",     "",     "",     "",     "",     "",   "sinogrammes simplifi\\u00E9s" },
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display country (French)
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "\\u00C9tats-Unis",    "France",   "Espagne",  "Gr\\u00E8ce",   "Norv\\u00E8ge", "", "YY", "Chine" },
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display variant (French)
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "",     "",     "",     "",     "NY",     "",     "",   "" },
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display name (French)
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //{   "anglais (Etats-Unis)", "francais (France)", "catalan (Espagne)", "grec (Grece)", "norvegien (Norvege,Nynorsk)", "italien", "xx (YY)" },
6659d709d503bab6e2b61931737e662dd293b40578ccornelius        {   "anglais (\\u00C9tats-Unis)", "fran\\u00E7ais (France)", "catalan (Espagne)", "grec (Gr\\u00E8ce)", "norv\\u00E9gien (Norv\\u00E8ge, NY)", "italien", "xx (YY)", "chinois (simplifi\\u00E9, Chine)" },
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* display language (Catalan) */
70c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {   "angl\\u00E8s", "franc\\u00E8s", "catal\\u00E0", "grec",  "noruec", "itali\\u00E0", "", "xin\\u00E8s" },
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* display script (Catalan) */
7259d709d503bab6e2b61931737e662dd293b40578ccornelius        {   "", "", "",                    "", "", "", "", "han simplificat" },
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* display country (Catalan) */
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "Estats Units", "Fran\\u00E7a", "Espanya",  "Gr\\u00E8cia", "Noruega", "", "", "Xina" },
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* display variant (Catalan) */
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "", "", "",                    "", "NY", "", "" },
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* display name (Catalan) */
78b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {   "angl\\u00E8s (Estats Units)", "franc\\u00E8s (Fran\\u00E7a)", "catal\\u00E0 (Espanya)", "grec (Gr\\u00E8cia)", "noruec (Noruega, NY)", "itali\\u00E0", "", "xin\\u00E8s (simplificat, Xina)" },
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display langage (Greek)[actual values listed below]
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac",
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u0393\\u03b1\\u03bb\\u03bb\\u03b9\\u03ba\\u03ac",
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u039a\\u03b1\\u03c4\\u03b1\\u03bb\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac",
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u0395\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac",
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac",
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u0399\\u03c4\\u03b1\\u03bb\\u03b9\\u03ba\\u03ac",
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "",
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u039A\\u03B9\\u03BD\\u03B5\\u03B6\\u03B9\\u03BA\\u03AC"
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display script (Greek)
9159d709d503bab6e2b61931737e662dd293b40578ccornelius        {   "", "", "", "", "", "", "", "\\u0391\\u03c0\\u03bb\\u03bf\\u03c0\\u03bf\\u03b9\\u03b7\\u03bc\\u03ad\\u03bd\\u03bf \\u03a7\\u03b1\\u03bd" },
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display country (Greek)[actual values listed below]
9359d709d503bab6e2b61931737e662dd293b40578ccornelius        {   "\\u0397\\u03BD\\u03C9\\u03BC\\u03AD\\u03BD\\u03B5\\u03C2 \\u03A0\\u03BF\\u03BB\\u03B9\\u03C4\\u03B5\\u03AF\\u03B5\\u03C2",
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u0393\\u03b1\\u03bb\\u03bb\\u03af\\u03b1",
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03af\\u03b1",
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1",
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1",
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "",
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "",
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u039A\\u03AF\\u03BD\\u03B1"
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display variant (Greek)
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "", "", "", "", "NY", "", "" },
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display name (Greek)[actual values listed below]
10559d709d503bab6e2b61931737e662dd293b40578ccornelius        {   "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac (\\u0397\\u03BD\\u03C9\\u03BC\\u03AD\\u03BD\\u03B5\\u03C2 \\u03A0\\u03BF\\u03BB\\u03B9\\u03C4\\u03B5\\u03AF\\u03B5\\u03C2)",
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u0393\\u03b1\\u03bb\\u03bb\\u03b9\\u03ba\\u03ac (\\u0393\\u03b1\\u03bb\\u03bb\\u03af\\u03b1)",
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u039a\\u03b1\\u03c4\\u03b1\\u03bb\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac (\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03af\\u03b1)",
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u0395\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac (\\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1)",
10959d709d503bab6e2b61931737e662dd293b40578ccornelius            "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac (\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1, NY)",
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u0399\\u03c4\\u03b1\\u03bb\\u03b9\\u03ba\\u03ac",
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "",
11259d709d503bab6e2b61931737e662dd293b40578ccornelius            "\\u039A\\u03B9\\u03BD\\u03B5\\u03B6\\u03B9\\u03BA\\u03AC (\\u0391\\u03c0\\u03bb\\u03bf\\u03c0\\u03bf\\u03b9\\u03b7\\u03bc\\u03ad\\u03bd\\u03bf, \\u039A\\u03AF\\u03BD\\u03B1)"
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display langage (<root>)
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "English",  "French",   "Catalan", "Greek",    "Norwegian",    "Italian",  "xx", "" },
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display script (<root>)
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "",     "",     "",     "",     "",   "",     "", ""},
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display country (<root>)
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "United States",    "France",   "Spain",  "Greece",   "Norway",   "",     "YY", "" },
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display variant (<root>)
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "",     "",     "",     "",     "Nynorsk",   "",     "", ""},
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display name (<root>)
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //{   "English (United States)", "French (France)", "Catalan (Spain)", "Greek (Greece)", "Norwegian (Norway,Nynorsk)", "Italian", "xx (YY)" },
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "English (United States)", "French (France)", "Catalan (Spain)", "Greek (Greece)", "Norwegian (Norway,NY)", "Italian", "xx (YY)", "" }
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Usage:
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(    Test (should be TRUE)  )
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   Example:
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       test_assert(i==3);
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   the macro is ugly but makes the tests pretty.
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define test_assert(test) \
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { \
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!(test)) \
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("FAIL: " #test " was not true. In " __FILE__ " on line %d", __LINE__ ); \
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else \
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("PASS: asserted " #test); \
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Usage:
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert_print(    Test (should be TRUE),  printable  )
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   Example:
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       test_assert(i==3, toString(i));
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   the macro is ugly but makes the tests pretty.
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define test_assert_print(test,print) \
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { \
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!(test)) \
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("FAIL: " #test " was not true. " + UnicodeString(print) ); \
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else \
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("PASS: asserted " #test "-> " + UnicodeString(print)); \
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define test_dumpLocale(l) { logln(#l " = " + UnicodeString(l.getName(), "")); }
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::LocaleTest()
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru: dataTable(NULL)
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setUpDataTable();
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::~LocaleTest()
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (dataTable != 0) {
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int32_t i = 0; i < 33; i++) {
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete []dataTable[i];
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete []dataTable;
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataTable = 0;
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
187f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO_BEGIN;
1881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    TESTCASE_AUTO(TestBug11421);         // Must run early in list to trigger failure.
189f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestBasicGetters);
190f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestSimpleResourceInfo);
191f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestDisplayNames);
192f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestSimpleObjectStuff);
193f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestPOSIXParsing);
194f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestGetAvailableLocales);
195f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestDataDirectory);
196f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestISO3Fallback);
197f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestGetLangsAndCountries);
198f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestSimpleDisplayNames);
199f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestUninstalledISO3Names);
200f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestAtypicalLocales);
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
202f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestThaiCurrencyFormat);
203f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestEuroSupport);
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
205f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestToString);
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
207f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(Test4139940);
208f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(Test4143951);
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
210f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(Test4147315);
211f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(Test4147317);
212f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(Test4147552);
213f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestVariantParsing);
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
215f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(Test4105828);
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
217f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestSetIsBogus);
218f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestParallelAPIValues);
219f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestKeywordVariants);
220f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestKeywordVariantParsing);
221f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestSetKeywordValue);
222f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestGetBaseName);
22350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FILE_IO
224f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestGetLocale);
22550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
226f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestVariantWithOutCountry);
227f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestCanonicalization);
228f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestCurrencyByDate);
229f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestGetVariantWithKeywords);
230f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestIsRightToLeft);
231f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO_END;
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestBasicGetters() {
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString   temp;
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i <= MAX_LOCALES; i++) {
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale testLocale("");
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (rawData[SCRIPT][i] && rawData[SCRIPT][i][0] != 0) {
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testLocale = Locale(rawData[LANG][i], rawData[SCRIPT][i], rawData[CTRY][i], rawData[VAR][i]);
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testLocale = Locale(rawData[LANG][i], rawData[CTRY][i], rawData[VAR][i]);
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Testing " + (UnicodeString)testLocale.getName() + "...");
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getLanguage()) != (dataTable[LANG][i]))
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("  Language code mismatch: " + temp + " versus "
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + dataTable[LANG][i]);
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getScript()) != (dataTable[SCRIPT][i]))
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("  Script code mismatch: " + temp + " versus "
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + dataTable[SCRIPT][i]);
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getCountry()) != (dataTable[CTRY][i]))
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("  Country code mismatch: " + temp + " versus "
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + dataTable[CTRY][i]);
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getVariant()) != (dataTable[VAR][i]))
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("  Variant code mismatch: " + temp + " versus "
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + dataTable[VAR][i]);
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getName()) != (dataTable[NAME][i]))
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("  Locale name mismatch: " + temp + " versus "
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + dataTable[NAME][i]);
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Same thing without variant codes...");
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i <= MAX_LOCALES; i++) {
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale testLocale("");
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (rawData[SCRIPT][i] && rawData[SCRIPT][i][0] != 0) {
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testLocale = Locale(rawData[LANG][i], rawData[SCRIPT][i], rawData[CTRY][i]);
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testLocale = Locale(rawData[LANG][i], rawData[CTRY][i]);
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Testing " + (temp=testLocale.getName()) + "...");
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getLanguage()) != (dataTable[LANG][i]))
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Language code mismatch: " + temp + " versus "
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + dataTable[LANG][i]);
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getScript()) != (dataTable[SCRIPT][i]))
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Script code mismatch: " + temp + " versus "
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + dataTable[SCRIPT][i]);
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getCountry()) != (dataTable[CTRY][i]))
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Country code mismatch: " + temp + " versus "
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + dataTable[CTRY][i]);
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testLocale.getVariant()[0] != 0)
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Variant code mismatch: something versus \"\"");
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing long language names and getters");
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test8 = Locale::createFromName("x-klingon-latn-zx.utf32be@special");
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = test8.getLanguage();
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (temp != UnicodeString("x-klingon") )
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Language code mismatch: " + temp + "  versus \"x-klingon\"");
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = test8.getScript();
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (temp != UnicodeString("Latn") )
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Script code mismatch: " + temp + "  versus \"Latn\"");
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = test8.getCountry();
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (temp != UnicodeString("ZX") )
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Country code mismatch: " + temp + "  versus \"ZX\"");
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = test8.getVariant();
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //if (temp != UnicodeString("SPECIAL") )
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //    errln("Variant code mismatch: " + temp + "  versus \"SPECIAL\"");
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // As of 3.0, the "@special" will *not* be parsed by uloc_getName()
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (temp != UnicodeString("") )
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Variant code mismatch: " + temp + "  versus \"\"");
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (Locale::getDefault() != Locale::createFromName(NULL))
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Locale::getDefault() == Locale::createFromName(NULL)");
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*----------*/
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // NOTE: There used to be a special test for locale names that had language or
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // country codes that were longer than two letters.  The new version of Locale
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // doesn't support anything that isn't an officially recognized language or
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // country code, so we no longer support this feature.
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale bogusLang("THISISABOGUSLANGUAGE"); // Jitterbug 2864: language code too long
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!bogusLang.isBogus()) {
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Locale(\"THISISABOGUSLANGUAGE\").isBogus()==FALSE");
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bogusLang=Locale("eo");
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( bogusLang.isBogus() ||
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcmp(bogusLang.getLanguage(), "eo")!=0 ||
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *bogusLang.getCountry()!=0 ||
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *bogusLang.getVariant()!=0 ||
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcmp(bogusLang.getName(), "eo")!=0
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("assignment to bogus Locale does not unbogus it or sets bad data");
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale a("eo_DE@currency=DEM");
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale *pb=a.clone();
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pb==&a || *pb!=a) {
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Locale.clone() failed");
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete pb;
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestParallelAPIValues() {
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Test synchronization between C and C++ API");
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getChinese().getName(), ULOC_CHINESE) != 0) {
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_CHINESE Locale");
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getEnglish().getName(), ULOC_ENGLISH) != 0) {
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_ENGLISH Locale");
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getFrench().getName(), ULOC_FRENCH) != 0) {
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_FRENCH Locale");
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getGerman().getName(), ULOC_GERMAN) != 0) {
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_GERMAN Locale");
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getItalian().getName(), ULOC_ITALIAN) != 0) {
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_ITALIAN Locale");
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getJapanese().getName(), ULOC_JAPANESE) != 0) {
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_JAPANESE Locale");
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getKorean().getName(), ULOC_KOREAN) != 0) {
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_KOREAN Locale");
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getSimplifiedChinese().getName(), ULOC_SIMPLIFIED_CHINESE) != 0) {
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_SIMPLIFIED_CHINESE Locale");
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getTraditionalChinese().getName(), ULOC_TRADITIONAL_CHINESE) != 0) {
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_TRADITIONAL_CHINESE Locale");
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getCanada().getName(), ULOC_CANADA) != 0) {
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_CANADA Locale");
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getCanadaFrench().getName(), ULOC_CANADA_FRENCH) != 0) {
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_CANADA_FRENCH Locale");
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getChina().getName(), ULOC_CHINA) != 0) {
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_CHINA Locale");
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getPRC().getName(), ULOC_PRC) != 0) {
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_PRC Locale");
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getFrance().getName(), ULOC_FRANCE) != 0) {
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_FRANCE Locale");
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getGermany().getName(), ULOC_GERMANY) != 0) {
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_GERMANY Locale");
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getItaly().getName(), ULOC_ITALY) != 0) {
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_ITALY Locale");
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getJapan().getName(), ULOC_JAPAN) != 0) {
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_JAPAN Locale");
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getKorea().getName(), ULOC_KOREA) != 0) {
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_KOREA Locale");
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getTaiwan().getName(), ULOC_TAIWAN) != 0) {
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_TAIWAN Locale");
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getUK().getName(), ULOC_UK) != 0) {
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_UK Locale");
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getUS().getName(), ULOC_US) != 0) {
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_US Locale");
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestSimpleResourceInfo() {
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString   temp;
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char            temp2[20];
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0;
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i <= MAX_LOCALES; i++) {
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale testLocale(rawData[LANG][i], rawData[CTRY][i], rawData[VAR][i]);
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Testing " + (temp=testLocale.getName()) + "...");
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getISO3Language()) != (dataTable[LANG3][i]))
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("  ISO-3 language code mismatch: " + temp
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                + " versus " + dataTable[LANG3][i]);
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getISO3Country()) != (dataTable[CTRY3][i]))
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("  ISO-3 country code mismatch: " + temp
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                + " versus " + dataTable[CTRY3][i]);
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        sprintf(temp2, "%x", (int)testLocale.getLCID());
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (UnicodeString(temp2) != dataTable[LCID][i])
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln((UnicodeString)"  LCID mismatch: " + temp2 + " versus "
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                + dataTable[LCID][i]);
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err))
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln((UnicodeString)"Some error on number " + i + u_errorName(err));
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err = U_ZERO_ERROR;
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale locale("en");
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(strcmp(locale.getName(), "en") != 0||
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcmp(locale.getLanguage(), "en") != 0) {
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("construction of Locale(en) failed\n");
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*-----*/
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Jitterbug 2439 -- markus 20030425
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The lookup of display names must not fall back through the default
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * locale because that yields useless results.
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestDisplayNames()
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  english("en", "US");
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  french("fr", "FR");
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  croatian("ca", "ES");
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  greek("el", "GR");
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("  In locale = en_US...");
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTestDisplayNames(english, DLANG_EN);
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("  In locale = fr_FR...");
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTestDisplayNames(french, DLANG_FR);
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("  In locale = ca_ES...");
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTestDisplayNames(croatian, DLANG_CA);
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("  In locale = el_GR...");
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTestDisplayNames(greek, DLANG_EL);
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s;
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols symb(status);
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Check to see if ICU supports this locale */
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (symb.getLocale(ULOC_VALID_LOCALE, status) != Locale("root")) {
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* test that the default locale has a display name for its own language */
48227f654740f2a26ad62a5c155af9199af9e69b889claireho        /* Currently, there is no language information in the "tl" data file so this test will fail if default locale is "tl" */
48327f654740f2a26ad62a5c155af9199af9e69b889claireho        if (uprv_strcmp(Locale().getLanguage(), "tl") != 0) {
48427f654740f2a26ad62a5c155af9199af9e69b889claireho            Locale().getDisplayLanguage(Locale(), s);
48527f654740f2a26ad62a5c155af9199af9e69b889claireho            if(s.length()<=3 && s.charAt(0)<=0x7f) {
48627f654740f2a26ad62a5c155af9199af9e69b889claireho                /* check <=3 to reject getting the language code as a display name */
48727f654740f2a26ad62a5c155af9199af9e69b889claireho                dataerrln("unable to get a display string for the language of the default locale: " + s);
48827f654740f2a26ad62a5c155af9199af9e69b889claireho            }
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
49027f654740f2a26ad62a5c155af9199af9e69b889claireho            /*
49127f654740f2a26ad62a5c155af9199af9e69b889claireho             * API coverage improvements: call
49227f654740f2a26ad62a5c155af9199af9e69b889claireho             * Locale::getDisplayLanguage(UnicodeString &) and
49327f654740f2a26ad62a5c155af9199af9e69b889claireho             * Locale::getDisplayCountry(UnicodeString &)
49427f654740f2a26ad62a5c155af9199af9e69b889claireho             */
49527f654740f2a26ad62a5c155af9199af9e69b889claireho            s.remove();
49627f654740f2a26ad62a5c155af9199af9e69b889claireho            Locale().getDisplayLanguage(s);
49727f654740f2a26ad62a5c155af9199af9e69b889claireho            if(s.length()<=3 && s.charAt(0)<=0x7f) {
49827f654740f2a26ad62a5c155af9199af9e69b889claireho                dataerrln("unable to get a display string for the language of the default locale [2]: " + s);
49927f654740f2a26ad62a5c155af9199af9e69b889claireho            }
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Default locale %s is unsupported by ICU\n", Locale().getName());
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.remove();
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    french.getDisplayCountry(s);
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(s.isEmpty()) {
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("unable to get any default-locale display string for the country of fr_FR\n");
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.remove();
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale("zh", "Hant").getDisplayScript(s);
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(s.isEmpty()) {
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("unable to get any default-locale display string for the country of zh_Hant\n");
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestSimpleObjectStuff() {
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test1("aa", "AA");
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test2("aa", "AA");
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test3(test1);
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test4("zz", "ZZ");
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test5("aa", "AA", "");
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test6("aa", "AA", "ANTARES");
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test7("aa", "AA", "JUPITER");
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test8 = Locale::createFromName("aa-aa-jupiTER"); // was "aa-aa.utf8@jupiter" but in 3.0 getName won't normalize that
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // now list them all for debugging usage.
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test1);
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test2);
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test3);
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test4);
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test5);
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test6);
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test7);
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test8);
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Make sure things compare to themselves!
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test1 == test1);
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test2 == test2);
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test3 == test3);
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test4 == test4);
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test5 == test5);
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test6 == test6);
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test7 == test7);
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test8 == test8);
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // make sure things are not equal to themselves.
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test1 != test1));
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test2 != test2));
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test3 != test3));
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test4 != test4));
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test5 != test5));
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test6 != test6));
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test7 != test7));
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test8 != test8));
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // make sure things that are equal to each other don't show up as unequal.
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test1 != test2));
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test2 != test1));
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test1 != test3));
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test2 != test3));
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test5 == test1);
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test6 != test2);
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test6 != test5);
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test6 != test7);
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // test for things that shouldn't compare equal.
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test1 == test4));
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test2 == test4));
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test3 == test4));
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test7 == test8);
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // test for hash codes to be the same.
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t hash1 = test1.hashCode();
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t hash2 = test2.hashCode();
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t hash3 = test3.hashCode();
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(hash1 == hash2);
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(hash1 == hash3);
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(hash2 == hash3);
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // test that the assignment operator works.
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test4 = test1;
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("test4=test1;");
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test4);
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test4 == test4);
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test1 != test4));
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test2 != test4));
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test3 != test4));
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test1 == test4);
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test4 == test1);
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // test assignments with a variant
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("test7 = test6");
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test7 = test6;
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test7);
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test7 == test7);
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test7 == test6);
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test7 != test5);
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("test6 = test1");
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test6=test1;
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test6);
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test6 != test7);
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test6 == test1);
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test6 == test6);
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// A class which exposes constructors that are implemented in terms of the POSIX parsing code.
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass POSIXLocale : public Locale
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    POSIXLocale(const UnicodeString& l)
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        :Locale()
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      char *ch;
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ch = new char[l.length() + 1];
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ch[l.extract(0, 0x7fffffff, ch, "")] = 0;
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      setFromPOSIXID(ch);
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete [] ch;
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    POSIXLocale(const char *l)
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        :Locale()
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setFromPOSIXID(l);
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestPOSIXParsing()
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    POSIXLocale  test1("ab_AB");
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    POSIXLocale  test2(UnicodeString("ab_AB"));
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test3("ab","AB");
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    POSIXLocale test4("ab_AB_Antares");
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    POSIXLocale test5(UnicodeString("ab_AB_Antares"));
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test6("ab", "AB", "Antares");
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test1);
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test2);
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test3);
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test4);
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test5);
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test6);
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test1 == test1);
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test1 == test2);
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test2 == test3);
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test3 == test1);
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test4 == test5);
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test5 == test6);
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test6 == test4);
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test1 != test4);
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test5 != test3);
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test5 != test2);
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t hash1 = test1.hashCode();
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t hash2 = test2.hashCode();
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t hash3 = test3.hashCode();
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(hash1 == hash2);
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(hash2 == hash3);
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(hash3 == hash1);
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestGetAvailableLocales()
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t locCount = 0;
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const Locale* locList = Locale::getAvailableLocales(locCount);
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (locCount == 0)
6806d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("getAvailableLocales() returned an empty list!");
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString("Number of locales returned = ") + locCount);
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString temp;
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(int32_t i = 0; i < locCount; ++i)
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(locList[i].getName());
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // I have no idea how to test this function...
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This test isn't applicable anymore - getISO3Language is
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// independent of the data directory
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestDataDirectory()
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char            oldDirectory[80];
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char*     temp;
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode       err = U_ZERO_ERROR;
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString   testValue;
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = Locale::getDataDirectory();
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcpy(oldDirectory, temp);
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("oldDirectory = ") + oldDirectory);
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test(Locale::US);
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test.getISO3Language(testValue);
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("first fetch of language retrieved " + testValue);
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (testValue != "eng")
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Initial check of ISO3 language failed: expected \"eng\", got \"" + testValue + "\"");
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char *path;
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        path=IntlTest::getTestDirectory();
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale::setDataDirectory( path );
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test.getISO3Language(testValue);
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("second fetch of language retrieved " + testValue);
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (testValue != "xxx")
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("setDataDirectory() failed: expected \"xxx\", got \"" + testValue + "\"");
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale::setDataDirectory(oldDirectory);
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test.getISO3Language(testValue);
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("third fetch of language retrieved " + testValue);
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (testValue != "eng")
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("get/setDataDirectory() failed: expected \"eng\", got \"" + testValue + "\"");
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//===========================================================
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::doTestDisplayNames(Locale& displayLocale, int32_t compareIndex) {
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString   temp;
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i = 0; i <= MAX_LOCALES; i++) {
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale testLocale("");
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (rawData[SCRIPT][i] && rawData[SCRIPT][i][0] != 0) {
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testLocale = Locale(rawData[LANG][i], rawData[SCRIPT][i], rawData[CTRY][i], rawData[VAR][i]);
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testLocale = Locale(rawData[LANG][i], rawData[CTRY][i], rawData[VAR][i]);
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("  Testing " + (temp=testLocale.getName()) + "...");
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  testLang;
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  testScript;
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  testCtry;
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  testVar;
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  testName;
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testLocale.getDisplayLanguage(displayLocale, testLang);
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testLocale.getDisplayScript(displayLocale, testScript);
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testLocale.getDisplayCountry(displayLocale, testCtry);
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testLocale.getDisplayVariant(displayLocale, testVar);
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testLocale.getDisplayName(displayLocale, testName);
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  expectedLang;
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  expectedScript;
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  expectedCtry;
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  expectedVar;
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  expectedName;
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedLang = dataTable[compareIndex][i];
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (expectedLang.length() == 0)
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectedLang = dataTable[DLANG_EN][i];
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedScript = dataTable[compareIndex + 1][i];
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (expectedScript.length() == 0)
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectedScript = dataTable[DSCRIPT_EN][i];
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedCtry = dataTable[compareIndex + 2][i];
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (expectedCtry.length() == 0)
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectedCtry = dataTable[DCTRY_EN][i];
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedVar = dataTable[compareIndex + 3][i];
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (expectedVar.length() == 0)
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectedVar = dataTable[DVAR_EN][i];
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedName = dataTable[compareIndex + 4][i];
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (expectedName.length() == 0)
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectedName = dataTable[DNAME_EN][i];
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testLang != expectedLang)
7836d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Display language (" + UnicodeString(displayLocale.getName()) + ") of (" + UnicodeString(testLocale.getName()) + ") got " + testLang + " expected " + expectedLang);
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testScript != expectedScript)
7856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Display script (" + UnicodeString(displayLocale.getName()) + ") of (" + UnicodeString(testLocale.getName()) + ") got " + testScript + " expected " + expectedScript);
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testCtry != expectedCtry)
7876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Display country (" + UnicodeString(displayLocale.getName()) + ") of (" + UnicodeString(testLocale.getName()) + ") got " + testCtry + " expected " + expectedCtry);
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testVar != expectedVar)
7896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Display variant (" + UnicodeString(displayLocale.getName()) + ") of (" + UnicodeString(testLocale.getName()) + ") got " + testVar + " expected " + expectedVar);
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testName != expectedName)
7916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Display name (" + UnicodeString(displayLocale.getName()) + ") of (" + UnicodeString(testLocale.getName()) + ") got " + testName + " expected " + expectedName);
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------------
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// table of valid data
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------------
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::setUpDataTable()
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (dataTable == 0) {
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataTable = new UnicodeString*[33];
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int32_t i = 0; i < 33; i++) {
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dataTable[i] = new UnicodeString[8];
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (int32_t j = 0; j < 8; j++) {
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                dataTable[i][j] = CharsToUnicodeString(rawData[i][j]);
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ====================
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4011756 4011380
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestISO3Fallback()
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale test("xx", "YY");
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char * result;
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = test.getISO3Language();
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Conform to C API usage
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!result || (result[0] != 0))
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("getISO3Language() on xx_YY returned " + UnicodeString(result) + " instead of \"\"");
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = test.getISO3Country();
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!result || (result[0] != 0))
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("getISO3Country() on xx_YY returned " + UnicodeString(result) + " instead of \"\"");
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4106155 4118587
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestGetLangsAndCountries()
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // It didn't seem right to just do an exhaustive test of everything here, so I check
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // for the following things:
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // 1) Does each list have the right total number of entries?
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // 2) Does each list contain certain language and country codes we think are important
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //     (the G7 countries, plus a couple others)?
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // 3) Does each list have every entry formatted correctly? (i.e., two characters,
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //     all lower case for the language codes, all upper case for the country codes)
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // 4) Is each list in sorted order?
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t testCount = 0;
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char * const * test = Locale::getISOLanguages();
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char spotCheck1[ ][4] = { "en", "es", "fr", "de", "it",
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "ja", "ko", "zh", "th", "he",
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "id", "iu", "ug", "yi", "za" };
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(testCount = 0;test[testCount];testCount++)
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ;
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* TODO: Change this test to be more like the cloctst version? */
867c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (testCount != 593)
868c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        errln("Expected getISOLanguages() to return 593 languages; it returned %d", testCount);
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0; i < 15; i++) {
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t j;
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (j = 0; j < testCount; j++)
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              if (uprv_strcmp(test[j],spotCheck1[i])== 0)
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    break;
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (j == testCount || (uprv_strcmp(test[j],spotCheck1[i])!=0))
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("Couldn't find " + (UnicodeString)spotCheck1[i] + " in language list.");
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < testCount; i++) {
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString testee(test[i],"");
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString lc(test[i],"");
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testee != lc.toLower())
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(lc + " is not all lower case.");
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (testee.length() != 2) && (testee.length() != 3))
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(testee + " is not two or three characters long.");
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (i > 0 && testee.compare(test[i - 1]) <= 0)
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(testee + " appears in an out-of-order position in the list.");
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test = Locale::getISOCountries();
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString spotCheck2 [] = { "US", "CA", "GB", "FR", "DE",
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "IT", "JP", "KR", "CN", "TW",
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "TH" };
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t spot2Len = 11;
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(testCount=0;test[testCount];testCount++)
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ;
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
8988393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (testCount != 249){
8998393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        errln("Expected getISOCountries to return 249 countries; it returned %d", testCount);
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else {
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0; i < spot2Len; i++) {
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t j;
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (j = 0; j < testCount; j++)
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              {
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UnicodeString testee(test[j],"");
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (testee == spotCheck2[i])
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    break;
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              }
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UnicodeString testee(test[j],"");
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (j == testCount || testee != spotCheck2[i])
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("Couldn't find " + spotCheck2[i] + " in country list.");
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
915b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (i = 0; i < testCount; i++) {
916b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UnicodeString testee(test[i],"");
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString uc(test[i],"");
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testee != uc.toUpper())
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(testee + " is not all upper case.");
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testee.length() != 2)
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(testee + " is not two characters long.");
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (i > 0 && testee.compare(test[i - 1]) <= 0)
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(testee + " appears in an out-of-order position in the list.");
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
925b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
926b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // This getAvailableLocales and getISO3Language
927b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {
928b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t numOfLocales;
929b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        Locale  enLoc ("en");
930b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        const Locale *pLocales = Locale::getAvailableLocales(numOfLocales);
931b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
932b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        for (int i = 0; i < numOfLocales; i++) {
933b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            const Locale    &loc(pLocales[i]);
934b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            UnicodeString   name;
935b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            char        szName[200];
936b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
937b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            loc.getDisplayName (enLoc, name);
938b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            name.extract (0, 200, szName, sizeof(szName));
939b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
940b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (strlen(loc.getISO3Language()) == 0) {
941b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                errln("getISO3Language() returned an empty string for: " + name);
942b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
943b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
944b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4118587
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestSimpleDisplayNames()
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // This test is different from TestDisplayNames because TestDisplayNames checks
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // fallback behavior, combination of language and country names to form locale
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // names, and other stuff like that.  This test just checks specific language
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // and country codes to make sure we have the correct names for them.
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char languageCodes[] [4] = { "he", "id", "iu", "ug", "yi", "za" };
9588393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    UnicodeString languageNames [] = { "Hebrew", "Indonesian", "Inuktitut", "Uyghur", "Yiddish",
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               "Zhuang" };
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i = 0; i < 6; i++) {
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString test;
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale l(languageCodes[i], "", "");
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        l.getDisplayLanguage(Locale::getUS(), test);
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (test != languageNames[i])
9666d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Got wrong display name for " + UnicodeString(languageCodes[i]) + ": Expected \"" +
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  languageNames[i] + "\", got \"" + test + "\".");
968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4118595
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestUninstalledISO3Names()
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // This test checks to make sure getISO3Language and getISO3Country work right
978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // even for locales that are not installed.
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char iso2Languages [][4] = {     "am", "ba", "fy", "mr", "rn",
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                        "ss", "tw", "zu" };
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char iso3Languages [][5] = {     "amh", "bak", "fry", "mar", "run",
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                        "ssw", "twi", "zul" };
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < 8; i++) {
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      UErrorCode err = U_ZERO_ERROR;
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      UnicodeString test;
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale l(iso2Languages[i], "", "");
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        test = l.getISO3Language();
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if((test != iso3Languages[i]) || U_FAILURE(err))
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Got wrong ISO3 code for " + UnicodeString(iso2Languages[i]) + ": Expected \"" +
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    iso3Languages[i] + "\", got \"" + test + "\"." + UnicodeString(u_errorName(err)));
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char iso2Countries [][4] = {     "AF", "BW", "KZ", "MO", "MN",
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                        "SB", "TC", "ZW" };
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char iso3Countries [][4] = {     "AFG", "BWA", "KAZ", "MAC", "MNG",
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                        "SLB", "TCA", "ZWE" };
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < 8; i++) {
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      UErrorCode err = U_ZERO_ERROR;
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale l("", iso2Countries[i], "");
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString test(l.getISO3Country(), "");
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (test != iso3Countries[i])
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Got wrong ISO3 code for " + UnicodeString(iso2Countries[i]) + ": Expected \"" +
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UnicodeString(iso3Countries[i]) + "\", got \"" + test + "\"." + u_errorName(err));
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4092475
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * I could not reproduce this bug.  I'm pretty convinced it was fixed with the
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * big locale-data reorg of 10/28/97.  The lookup logic for language and country
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * display names was also changed at that time in that check-in.    --rtg 3/20/98
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestAtypicalLocales()
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale localesToTest [] = { Locale("de", "CA"),
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  Locale("ja", "ZA"),
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   Locale("ru", "MX"),
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   Locale("en", "FR"),
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   Locale("es", "DE"),
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   Locale("", "HR"),
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   Locale("", "SE"),
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   Locale("", "DO"),
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   Locale("", "BE") };
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString englishDisplayNames [] = { "German (Canada)",
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Japanese (South Africa)",
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Russian (Mexico)",
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "English (France)",
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Spanish (Germany)",
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Croatia",
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Sweden",
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Dominican Republic",
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Belgium" };
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString frenchDisplayNames []= { "allemand (Canada)",
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "japonais (Afrique du Sud)",
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "russe (Mexique)",
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "anglais (France)",
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "espagnol (Allemagne)",
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "Croatie",
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    CharsToUnicodeString("Su\\u00E8de"),
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    CharsToUnicodeString("R\\u00E9publique dominicaine"),
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "Belgique" };
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString spanishDisplayNames [] = {
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     CharsToUnicodeString("alem\\u00E1n (Canad\\u00E1)"),
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     CharsToUnicodeString("japon\\u00E9s (Sud\\u00E1frica)"),
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     CharsToUnicodeString("ruso (M\\u00E9xico)"),
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     CharsToUnicodeString("ingl\\u00E9s (Francia)"),
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     CharsToUnicodeString("espa\\u00F1ol (Alemania)"),
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Croacia",
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Suecia",
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     CharsToUnicodeString("Rep\\u00FAblica Dominicana"),
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     CharsToUnicodeString("B\\u00E9lgica") };
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // De-Anglicizing root required the change from
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // English display names to ISO Codes - ram 2003/09/26
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString invDisplayNames [] = { "German (Canada)",
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Japanese (South Africa)",
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Russian (Mexico)",
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "English (France)",
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Spanish (Germany)",
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Croatia",
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Sweden",
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Dominican Republic",
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Belgium" };
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale saveLocale;
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale::setDefault(Locale::getUS(), status);
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < 9; ++i) {
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString name;
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        localesToTest[i].getDisplayName(Locale::getUS(), name);
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(name);
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (name != englishDisplayNames[i])
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
10816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Lookup in English failed: expected \"" + englishDisplayNames[i]
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + "\", got \"" + name + "\"");
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("Locale name was-> " + (name=localesToTest[i].getName()));
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < 9; i++) {
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString name;
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        localesToTest[i].getDisplayName(Locale("es", "ES"), name);
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(name);
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (name != spanishDisplayNames[i])
10926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Lookup in Spanish failed: expected \"" + spanishDisplayNames[i]
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + "\", got \"" + name + "\"");
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < 9; i++) {
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString name;
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        localesToTest[i].getDisplayName(Locale::getFrance(), name);
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(name);
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (name != frenchDisplayNames[i])
11016d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Lookup in French failed: expected \"" + frenchDisplayNames[i]
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + "\", got \"" + name + "\"");
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < 9; i++) {
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString name;
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        localesToTest[i].getDisplayName(Locale("inv", "IN"), name);
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(name + " Locale fallback to be, and data fallback to root");
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (name != invDisplayNames[i])
11106d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Lookup in INV failed: expected \"" + prettify(invDisplayNames[i])
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + "\", got \"" + prettify(name) + "\"");
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        localesToTest[i].getDisplayName(Locale("inv", "BD"), name);
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(name + " Data fallback to root");
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (name != invDisplayNames[i])
11156d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Lookup in INV failed: expected \"" + prettify(invDisplayNames[i])
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + "\", got \"" + prettify(name )+ "\"");
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale::setDefault(saveLocale, status);
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4135752
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This would be better tested by the LocaleDataTest.  Will move it when I
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * get the LocaleDataTest working again.
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestThaiCurrencyFormat()
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *thaiCurrency = (DecimalFormat*)NumberFormat::createCurrencyInstance(
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    Locale("th", "TH"), status);
1134f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    UnicodeString posPrefix("THB", 3, US_INV);  // per cldrbug 7618
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString temp;
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status) || !thaiCurrency)
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
11396d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("Couldn't get th_TH currency -> " + UnicodeString(u_errorName(status)));
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1142f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if (thaiCurrency->getPositivePrefix(temp) != posPrefix)
1143f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        errln("Thai currency prefix wrong: expected THB, got \"" +
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        thaiCurrency->getPositivePrefix(temp) + "\"");
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (thaiCurrency->getPositiveSuffix(temp) != "")
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Thai currency suffix wrong: expected \"\", got \"" +
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        thaiCurrency->getPositiveSuffix(temp) + "\"");
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete thaiCurrency;
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4122371
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Confirm that Euro support works.  This test is pretty rudimentary; all it does
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * is check that any locales with the EURO variant format a number using the
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Euro currency symbol.
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ASSUME: All locales encode the Euro character "\u20AC".
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * If this is changed to use the single-character Euro symbol, this
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * test must be updated.
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestEuroSupport()
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar euro = 0x20ac;
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UnicodeString EURO_CURRENCY(&euro, 1, 1); // Look for this UnicodeString in formatted Euro currency
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* localeArr[] = {
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "ca_ES",
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "de_AT",
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "de_DE",
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "de_LU",
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "el_GR",
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "en_BE",
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "en_IE",
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "en_GB_EURO",
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "en_US_EURO",
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "es_ES",
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "eu_ES",
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "fi_FI",
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "fr_BE",
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "fr_FR",
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "fr_LU",
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "ga_IE",
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "gl_ES",
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "it_IT",
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "nl_BE",
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "nl_NL",
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "pt_PT",
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            NULL
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        };
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char** locales = localeArr;
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString temp;
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (;*locales!=NULL;locales++) {
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale loc (*locales);
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString temp;
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        NumberFormat *nf = NumberFormat::createCurrencyInstance(loc, status);
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString pos;
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dataerrln("Error calling NumberFormat::createCurrencyInstance(%s)", *locales);
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        nf->format(271828.182845, pos);
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString neg;
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        nf->format(-271828.182845, neg);
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (pos.indexOf(EURO_CURRENCY) >= 0 &&
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            neg.indexOf(EURO_CURRENCY) >= 0) {
1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("Ok: " + (temp=loc.getName()) +
1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ": " + pos + " / " + neg);
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Fail: " + (temp=loc.getName()) +
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                " formats without " + EURO_CURRENCY +
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ": " + pos + " / " + neg +
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "\n*** THIS FAILURE MAY ONLY MEAN THAT LOCALE DATA HAS CHANGED ***");
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete nf;
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString dollarStr("USD", ""), euroStr("EUR", ""), genericStr((UChar)0x00a4), resultStr;
1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar tmp[4];
1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_forLocale("en_US", tmp, 4, &status);
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultStr.setTo(tmp);
1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (dollarStr != resultStr) {
12346d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail: en_US didn't return USD - %s", u_errorName(status));
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_forLocale("en_US_EURO", tmp, 4, &status);
1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultStr.setTo(tmp);
1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (euroStr != resultStr) {
12396d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail: en_US_EURO didn't return EUR - %s", u_errorName(status));
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_forLocale("en_GB_EURO", tmp, 4, &status);
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultStr.setTo(tmp);
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (euroStr != resultStr) {
12446d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail: en_GB_EURO didn't return EUR - %s", u_errorName(status));
1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_forLocale("en_US_PREEURO", tmp, 4, &status);
1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultStr.setTo(tmp);
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (dollarStr != resultStr) {
12496d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail: en_US_PREEURO didn't fallback to en_US - %s", u_errorName(status));
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_forLocale("en_US_Q", tmp, 4, &status);
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultStr.setTo(tmp);
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (dollarStr != resultStr) {
12546d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail: en_US_Q didn't fallback to en_US - %s", u_errorName(status));
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t invalidLen = ucurr_forLocale("en_QQ", tmp, 4, &status);
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (invalidLen || U_SUCCESS(status)) {
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: en_QQ didn't return NULL");
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4139504
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * toString() doesn't work with language_VARIANT.
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestToString() {
1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale DATA [] = {
1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale("xx", "", ""),
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale("", "YY", ""),
1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale("", "", "ZZ"),
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale("xx", "YY", ""),
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale("xx", "", "ZZ"),
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale("", "YY", "ZZ"),
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale("xx", "YY", "ZZ"),
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char DATA_S [][20] = {
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "xx",
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "_YY",
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "__ZZ",
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "xx_YY",
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "xx__ZZ",
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "_YY_ZZ",
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "xx_YY_ZZ",
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i=0; i < 7; ++i) {
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      const char *name;
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      name = DATA[i].getName();
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if (strcmp(name, DATA_S[i]) != 0)
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Fail: Locale.getName(), got:" + UnicodeString(name) + ", expected: " + DATA_S[i]);
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("Pass: Locale.getName(), got:" + UnicodeString(name) );
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4139940
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Couldn't reproduce this bug -- probably was fixed earlier.
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ORIGINAL BUG REPORT:
1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * -- basically, hungarian for monday shouldn't have an \u00f4
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (o circumflex)in it instead it should be an o with 2 inclined
1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (right) lines over it..
1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * You may wonder -- why do all this -- why not just add a line to
1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * LocaleData?  Well, I could see by inspection that the locale file had the
1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * right character in it, so I wanted to check the rest of the pipeline -- a
1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * very remote possibility, but I wanted to be sure.  The other possibility
1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * is that something is wrong with the font mapping subsystem, but we can't
1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * test that here.
1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::Test4139940()
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale mylocale("hu", "", "");
1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate mydate = date(98,3,13); // A Monday
1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat df_full("EEEE", mylocale, status);
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
132950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        dataerrln(UnicodeString("Could not create SimpleDateFormat object for locale hu. Error: ") + UnicodeString(u_errorName(status)));
1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str;
1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos(FieldPosition::DONT_CARE);
1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df_full.format(mydate, str, pos);
1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Make sure that o circumflex (\u00F4) is NOT there, and
1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // o double acute (\u0151) IS.
1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar ocf = 0x00f4;
1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar oda = 0x0151;
1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (str.indexOf(oda) < 0 || str.indexOf(ocf) >= 0) {
134027f654740f2a26ad62a5c155af9199af9e69b889claireho      /* If the default locale is "th" this test will fail because of the buddhist calendar. */
134127f654740f2a26ad62a5c155af9199af9e69b889claireho      if (strcmp(Locale::getDefault().getLanguage(), "th") != 0) {
134227f654740f2a26ad62a5c155af9199af9e69b889claireho        errln("Fail: Monday in Hungarian is wrong - oda's index is %d and ocf's is %d",
134327f654740f2a26ad62a5c155af9199af9e69b889claireho              str.indexOf(oda), str.indexOf(ocf));
134427f654740f2a26ad62a5c155af9199af9e69b889claireho      } else {
134527f654740f2a26ad62a5c155af9199af9e69b889claireho        logln(UnicodeString("An error is produce in buddhist calendar."));
134627f654740f2a26ad62a5c155af9199af9e69b889claireho      }
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      logln(UnicodeString("String is: ") + str );
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUDate
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::date(int32_t y, int32_t m, int32_t d, int32_t hr, int32_t min, int32_t sec)
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal = Calendar::createInstance(status);
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (cal == 0)
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0.0;
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->clear();
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->set(1900 + y, m, d, hr, min, sec); // Add 1900 to follow java.util.Date protocol
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate dt = cal->getTime(status);
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status))
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0.0;
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return dt;
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4143951
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Russian first day of week should be Monday. Confirmed.
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::Test4143951()
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal = Calendar::createInstance(Locale("ru", "", ""), status);
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)) {
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if (cal->getFirstDayOfWeek(status) != UCAL_MONDAY) {
13796d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru          dataerrln("Fail: First day of week in Russia should be Monday");
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4147315
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * java.util.Locale.getISO3Country() works wrong for non ISO-3166 codes.
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Should throw an exception for unknown locales
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::Test4147315()
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UnicodeString temp;
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Try with codes that are the wrong length but happen to match text
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // at a valid offset in the mapping table
13988393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    Locale locale("xxx", "CCC");
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *result = locale.getISO3Country();
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Change to conform to C api usage
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if((result==NULL)||(result[0] != 0))
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("ERROR: getISO3Country() returns: " + UnicodeString(result,"") +
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                " for locale '" + (temp=locale.getName()) + "' rather than exception" );
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4147317
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * java.util.Locale.getISO3Language() works wrong for non ISO-3166 codes.
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Should throw an exception for unknown locales
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::Test4147317()
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString temp;
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Try with codes that are the wrong length but happen to match text
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // at a valid offset in the mapping table
14198393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    Locale locale("xxx", "CCC");
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *result = locale.getISO3Language();
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Change to conform to C api usage
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if((result==NULL)||(result[0] != 0))
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("ERROR: getISO3Language() returns: " + UnicodeString(result,"") +
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                " for locale '" + (temp=locale.getName()) + "' rather than exception" );
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4147552
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::Test4147552()
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale locales [] = {     Locale("no", "NO"),
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            Locale("no", "NO", "B"),
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             Locale("no", "NO", "NY")
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString edn("Norwegian (Norway, B)");
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString englishDisplayNames [] = {
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                "Norwegian (Norway)",
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                 edn,
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                 // "Norwegian (Norway,B)",
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                 //"Norwegian (Norway,NY)"
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                 "Norwegian (Norway, NY)"
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString ndn("norsk (Norge, B");
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString norwegianDisplayNames [] = {
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                "norsk (Norge)",
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                "norsk (Norge, B)",
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                //ndn,
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                 "norsk (Noreg, NY)"
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                 //"Norsk (Noreg, Nynorsk)"
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale saveLocale;
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale::setDefault(Locale::getEnglish(), status);
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i = 0; i < 3; ++i) {
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale loc = locales[i];
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString temp;
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (loc.getDisplayName(temp) != englishDisplayNames[i])
14646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru           dataerrln("English display-name mismatch: expected " +
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   englishDisplayNames[i] + ", got " + loc.getDisplayName(temp));
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (loc.getDisplayName(loc, temp) != norwegianDisplayNames[i])
14676d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Norwegian display-name mismatch: expected " +
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   norwegianDisplayNames[i] + ", got " +
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   loc.getDisplayName(loc, temp));
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale::setDefault(saveLocale, status);
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestVariantParsing()
1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale en_US_custom("en", "US", "De Anza_Cupertino_California_United States_Earth");
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString dispName("English (United States, DE ANZA_CUPERTINO_CALIFORNIA_UNITED STATES_EARTH)");
1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString dispVar("DE ANZA_CUPERTINO_CALIFORNIA_UNITED STATES_EARTH");
1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString got;
1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    en_US_custom.getDisplayVariant(Locale::getUS(), got);
1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(got != dispVar) {
1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: getDisplayVariant()");
1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Wanted: " + dispVar);
1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Got   : " + got);
1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    en_US_custom.getDisplayName(Locale::getUS(), got);
1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(got != dispName) {
14936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("FAIL: getDisplayName()");
14946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("Wanted: " + dispName);
14956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("Got   : " + got);
1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale shortVariant("fr", "FR", "foo");
1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    shortVariant.getDisplayVariant(got);
1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(got != "FOO") {
1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: getDisplayVariant()");
1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Wanted: foo");
1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Got   : " + got);
1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale bogusVariant("fr", "FR", "_foo");
1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bogusVariant.getDisplayVariant(got);
1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(got != "FOO") {
1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: getDisplayVariant()");
1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Wanted: foo");
1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Got   : " + got);
1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale bogusVariant2("fr", "FR", "foo_");
1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bogusVariant2.getDisplayVariant(got);
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(got != "FOO") {
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: getDisplayVariant()");
1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Wanted: foo");
1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Got   : " + got);
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale bogusVariant3("fr", "FR", "_foo_");
1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bogusVariant3.getDisplayVariant(got);
1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(got != "FOO") {
1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: getDisplayVariant()");
1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Wanted: foo");
1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Got   : " + got);
1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4105828
1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Currency symbol in zh is wrong.  We will test this at the NumberFormat
1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * end to test the whole pipe.
1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::Test4105828()
1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale LOC [] = { Locale::getChinese(),  Locale("zh", "CN", ""),
1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     Locale("zh", "TW", ""), Locale("zh", "HK", "") };
1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i = 0; i < 4; ++i) {
1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        NumberFormat *fmt = NumberFormat::createPercentInstance(LOC[i], status);
1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)) {
15516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Couldn't create NumberFormat - %s", u_errorName(status));
1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString result;
155564339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        FieldPosition pos(FieldPosition::DONT_CARE);
1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt->format((int32_t)1, result, pos);
1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString temp;
1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(result != "100%") {
1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("Percent for ") + LOC[i].getDisplayName(temp) + " should be 100%, got " + result);
1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fmt;
1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Tests setBogus and isBogus APIs for Locale
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Jitterbug 1735
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestSetIsBogus() {
1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale l("en_US");
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    l.setToBogus();
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(l.isBogus() != TRUE) {
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("After setting bogus, didn't return TRUE");
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    l = "en_US"; // This should reset bogus
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(l.isBogus() != FALSE) {
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("After resetting bogus, didn't return FALSE");
1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestKeywordVariants(void) {
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *localeID;
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *expectedLocaleID;
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //const char *expectedLocaleIDNoKeywords;
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //const char *expectedCanonicalID;
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *expectedKeywords[10];
1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t numKeywords;
1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode expectedStatus;
1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } testCases[] = {
1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE@  currency = euro; C o ll A t i o n   = Phonebook   ; C alen dar = buddhist   ",
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE@calendar=buddhist;collation=Phonebook;currency=euro",
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //"de_DE",
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //"de_DE@calendar=buddhist;collation=Phonebook;currency=euro",
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {"calendar", "collation", "currency"},
1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            3,
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            U_ZERO_ERROR
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE@euro",
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE@euro",
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //"de_DE",
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //"de_DE@currency=EUR",
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {"","","","","","",""},
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            0,
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            U_INVALID_FORMAT_ERROR /* must have '=' after '@' */
1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0, j = 0;
1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *result = NULL;
1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringEnumeration *keywords;
1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t keyCount = 0;
1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *keyword = NULL;
1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UnicodeString *keywordString;
1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t keywordLen = 0;
1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
16238de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for(i = 0; i < UPRV_LENGTHOF(testCases); i++) {
1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale l(testCases[i].localeID);
1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        keywords = l.createKeywords(status);
1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status != testCases[i].expectedStatus) {
1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err("Expected to get status %s. Got %s instead\n",
1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_errorName(testCases[i].expectedStatus), u_errorName(status));
1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(keywords) {
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if((keyCount = keywords->count(status)) != testCases[i].numKeywords) {
1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                err("Expected to get %i keywords, got %i\n", testCases[i].numKeywords, keyCount);
1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(keyCount) {
1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                for(j = 0;;) {
1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if((j&1)==0) {
1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        if((keyword = keywords->next(&keywordLen, status)) == NULL) {
1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            break;
1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        }
1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        if(strcmp(keyword, testCases[i].expectedKeywords[j]) != 0) {
1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            err("Expected to get keyword value %s, got %s\n", testCases[i].expectedKeywords[j], keyword);
1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        }
1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    } else {
1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        if((keywordString = keywords->snext(status)) == NULL) {
1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            break;
1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        }
1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        if(*keywordString != UnicodeString(testCases[i].expectedKeywords[j], "")) {
1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            err("Expected to get keyword UnicodeString %s, got %s\n", testCases[i].expectedKeywords[j], keyword);
1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        }
1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    j++;
1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if(j == keyCount / 2) {
1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        // replace keywords with a clone of itself
1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        StringEnumeration *k2 = keywords->clone();
1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        if(k2 == NULL || keyCount != k2->count(status)) {
1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            errln("KeywordEnumeration.clone() failed");
1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        } else {
1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            delete keywords;
1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            keywords = k2;
1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        }
1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                keywords->reset(status); // Make sure that reset works.
1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                for(j = 0;;) {
1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if((keyword = keywords->next(&keywordLen, status)) == NULL) {
1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        break;
1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if(strcmp(keyword, testCases[i].expectedKeywords[j]) != 0) {
1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        err("Expected to get keyword value %s, got %s\n", testCases[i].expectedKeywords[j], keyword);
1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    j++;
1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete keywords;
1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = l.getName();
1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(uprv_strcmp(testCases[i].expectedLocaleID, result) != 0) {
1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err("Expected to get \"%s\" from \"%s\". Got \"%s\" instead\n",
1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                testCases[i].expectedLocaleID, testCases[i].localeID, result);
1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestKeywordVariantParsing(void) {
1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *localeID;
1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *keyword;
1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *expectedValue;
1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } testCases[] = {
1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_DE@  C o ll A t i o n   = Phonebook   ", "collation", "Phonebook" },
1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_DE", "collation", ""},
1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_DE@collation= PHONEBOOK", "collation", "PHONEBOOK" },
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_DE@ currency = euro   ; CoLLaTion   = PHONEBOOk   ", "collation", "PHONEBOOk" },
1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0;
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultLen = 0;
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[256];
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17098de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for(i = 0; i < UPRV_LENGTHOF(testCases); i++) {
1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *buffer = 0;
1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale l(testCases[i].localeID);
1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultLen = l.getKeywordValue(testCases[i].keyword, buffer, 256, status);
171359d709d503bab6e2b61931737e662dd293b40578ccornelius        (void)resultLen;  // Suppress unused variable warning.
1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(uprv_strcmp(testCases[i].expectedValue, buffer) != 0) {
1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err("Expected to extract \"%s\" from \"%s\" for keyword \"%s\". Got \"%s\" instead\n",
1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                testCases[i].expectedValue, testCases[i].localeID, testCases[i].keyword, buffer);
1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
172250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoLocaleTest::TestSetKeywordValue(void) {
172350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    static const struct {
172450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char *keyword;
172550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char *value;
172650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    } testCases[] = {
172750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "collation", "phonebook" },
172850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "currency", "euro" },
172950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "calendar", "buddhist" }
173050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    };
173150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
173250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UErrorCode status = U_ZERO_ERROR;
173350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
173450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t i = 0;
173550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t resultLen = 0;
173650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    char buffer[256];
173750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
173850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    Locale l(Locale::getGerman());
173950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
17408de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for(i = 0; i < UPRV_LENGTHOF(testCases); i++) {
174150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        l.setKeywordValue(testCases[i].keyword, testCases[i].value, status);
174250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(U_FAILURE(status)) {
174350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            err("FAIL: Locale::setKeywordValue failed - %s\n", u_errorName(status));
174450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
174550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
174650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        *buffer = 0;
174750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        resultLen = l.getKeywordValue(testCases[i].keyword, buffer, 256, status);
174859d709d503bab6e2b61931737e662dd293b40578ccornelius        (void)resultLen;  // Suppress unused variable warning.
174950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(uprv_strcmp(testCases[i].value, buffer) != 0) {
175050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            err("Expected to extract \"%s\" for keyword \"%s\". Got \"%s\" instead\n",
175150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                testCases[i].value, testCases[i].keyword, buffer);
175250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
175350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
175450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
175550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
175650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid
1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestGetBaseName(void) {
1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *localeID;
1760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *baseName;
1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } testCases[] = {
1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_DE@  C o ll A t i o n   = Phonebook   ", "de_DE" },
1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de@currency = euro; CoLLaTion   = PHONEBOOk", "de" },
17641b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "ja@calendar = buddhist", "ja" },
17651b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "de-u-co-phonebk", "de"}
1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0;
1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17701b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    for(i = 0; i < UPRV_LENGTHOF(testCases); i++) {
1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale loc(testCases[i].localeID);
1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strcmp(testCases[i].baseName, loc.getBaseName())) {
1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("For locale \"%s\" expected baseName \"%s\", but got \"%s\"",
1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                testCases[i].localeID, testCases[i].baseName, loc.getBaseName());
1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
17781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
17791b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // Verify that adding a keyword to an existing Locale doesn't change the base name.
17801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    UErrorCode status = U_ZERO_ERROR;
17811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    Locale loc2("en-US");
17821b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if (strcmp("en_US", loc2.getBaseName())) {
17831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        errln("%s:%d Expected \"en_US\", got \"%s\"", __FILE__, __LINE__, loc2.getBaseName());
17841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
17851b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    loc2.setKeywordValue("key", "value", status);
17861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if (strcmp("en_US@key=value", loc2.getName())) {
17871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        errln("%s:%d Expected \"en_US@key=value\", got \"%s\"", __FILE__, __LINE__, loc2.getName());
17881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
17891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if (strcmp("en_US", loc2.getBaseName())) {
17901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        errln("%s:%d Expected \"en_US\", got \"%s\"", __FILE__, __LINE__, loc2.getBaseName());
17911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Compare two locale IDs.  If they are equal, return 0.  If `string'
1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * starts with `prefix' plus an additional element, that is, string ==
1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * prefix + '_' + x, then return 1.  Otherwise return a value < 0.
1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool _loccmp(const char* string, const char* prefix) {
1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t slen = (int32_t)strlen(string),
1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            plen = (int32_t)strlen(prefix);
1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t c = uprv_strncmp(string, prefix, plen);
1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* 'root' is "less than" everything */
1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (uprv_strcmp(prefix, "root") == 0) {
1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (uprv_strcmp(string, "root") == 0) ? 0 : 1;
1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c) return -1; /* mismatch */
1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (slen == plen) return 0;
1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (string[plen] == '_') return 1;
1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return -2; /* false match, e.g. "en_USX" cmp "en_US" */
1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Check the relationship between requested locales, and report problems.
1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The caller specifies the expected relationships between requested
1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and valid (expReqValid) and between valid and actual (expValidActual).
1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Possible values are:
1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * "gt" strictly greater than, e.g., en_US > en
1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * "ge" greater or equal,      e.g., en >= en
1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * "eq" equal,                 e.g., en == en
1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::_checklocs(const char* label,
1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            const char* req,
1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            const Locale& validLoc,
1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            const Locale& actualLoc,
1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            const char* expReqValid,
1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            const char* expValidActual) {
1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* valid = validLoc.getName();
1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* actual = actualLoc.getName();
1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t reqValid = _loccmp(req, valid);
1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t validActual = _loccmp(valid, actual);
1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (((0 == uprv_strcmp(expReqValid, "gt") && reqValid > 0) ||
1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         (0 == uprv_strcmp(expReqValid, "ge") && reqValid >= 0) ||
1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         (0 == uprv_strcmp(expReqValid, "eq") && reqValid == 0)) &&
1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ((0 == uprv_strcmp(expValidActual, "gt") && validActual > 0) ||
1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         (0 == uprv_strcmp(expValidActual, "ge") && validActual >= 0) ||
1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         (0 == uprv_strcmp(expValidActual, "eq") && validActual == 0))) {
1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("%s; req=%s, valid=%s, actual=%s",
1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              label, req, valid, actual);
1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
18416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("FAIL: %s; req=%s, valid=%s, actual=%s.  Require (R %s V) and (V %s A)",
1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              label, req, valid, actual,
1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              expReqValid, expValidActual);
1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestGetLocale(void) {
1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE
1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *req;
1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale valid, actual, reqLoc;
1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Calendar
1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
18541b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    {
18551b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        UErrorCode ec = U_ZERO_ERROR;  // give each resource type its own error code
18561b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        req = "en_US_BROOKLYN";
18571b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        Calendar* cal = Calendar::createInstance(Locale::createFromName(req), ec);
1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
18591b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            dataerrln("FAIL: Calendar::createInstance failed - %s", u_errorName(ec));
1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
18611b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            valid = cal->getLocale(ULOC_VALID_LOCALE, ec);
18621b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            actual = cal->getLocale(ULOC_ACTUAL_LOCALE, ec);
18631b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (U_FAILURE(ec)) {
18641b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: Calendar::getLocale() failed");
18651b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            } else {
18661b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                _checklocs("Calendar", req, valid, actual);
18671b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
18681b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            /* Make sure that it fails correctly */
18691b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            ec = U_FILE_ACCESS_ERROR;
18701b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (cal->getLocale(ULOC_VALID_LOCALE, ec).getName()[0] != 0) {
18711b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: Calendar::getLocale() failed to fail correctly. It should have returned \"\"");
18721b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
18731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            ec = U_ZERO_ERROR;
1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
18751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        delete cal;
1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // DecimalFormat, DecimalFormatSymbols
1880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
18811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    {
18821b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        UErrorCode ec = U_ZERO_ERROR;  // give each resource type its own error code
18831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        req = "fr_FR_NICE";
18841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        NumberFormat* nf = NumberFormat::createInstance(Locale::createFromName(req), ec);
1885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
18861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            dataerrln("FAIL: NumberFormat::createInstance failed - %s", u_errorName(ec));
1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
18881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            DecimalFormat* dec = dynamic_cast<DecimalFormat*>(nf);
18891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (dec == NULL) {
18901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: NumberFormat::createInstance does not return a DecimalFormat");
18911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                return;
18921b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
18931b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            valid = dec->getLocale(ULOC_VALID_LOCALE, ec);
18941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            actual = dec->getLocale(ULOC_ACTUAL_LOCALE, ec);
18951b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (U_FAILURE(ec)) {
18961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: DecimalFormat::getLocale() failed");
18971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            } else {
18981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                _checklocs("DecimalFormat", req, valid, actual);
18991b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
1900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19011b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            const DecimalFormatSymbols* sym = dec->getDecimalFormatSymbols();
19021b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (sym == NULL) {
19031b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: getDecimalFormatSymbols returned NULL");
19041b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                return;
19051b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
19061b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            valid = sym->getLocale(ULOC_VALID_LOCALE, ec);
19071b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            actual = sym->getLocale(ULOC_ACTUAL_LOCALE, ec);
19081b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (U_FAILURE(ec)) {
19091b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: DecimalFormatSymbols::getLocale() failed");
19101b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            } else {
19111b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                _checklocs("DecimalFormatSymbols", req, valid, actual);
19121b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
19141b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        delete nf;
1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // DateFormat, DateFormatSymbols
1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
19201b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    {
19211b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        UErrorCode ec = U_ZERO_ERROR;  // give each resource type its own error code
19221b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        req = "de_CH_LUCERNE";
19231b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        DateFormat* df =
19241b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            DateFormat::createDateInstance(DateFormat::kDefault,
19251b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                                           Locale::createFromName(req));
19261b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        if (df == 0){
19271b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            dataerrln("Error calling DateFormat::createDateInstance()");
1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
19291b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            SimpleDateFormat* dat = dynamic_cast<SimpleDateFormat*>(df);
19301b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (dat == NULL) {
19311b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: DateFormat::createInstance does not return a SimpleDateFormat");
19321b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                return;
19331b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
19341b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            valid = dat->getLocale(ULOC_VALID_LOCALE, ec);
19351b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            actual = dat->getLocale(ULOC_ACTUAL_LOCALE, ec);
19361b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (U_FAILURE(ec)) {
19371b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: SimpleDateFormat::getLocale() failed");
19381b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            } else {
19391b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                _checklocs("SimpleDateFormat", req, valid, actual);
19401b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19421b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            const DateFormatSymbols* sym = dat->getDateFormatSymbols();
19431b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (sym == NULL) {
19441b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: getDateFormatSymbols returned NULL");
19451b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                return;
19461b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
19471b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            valid = sym->getLocale(ULOC_VALID_LOCALE, ec);
19481b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            actual = sym->getLocale(ULOC_ACTUAL_LOCALE, ec);
19491b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (U_FAILURE(ec)) {
19501b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: DateFormatSymbols::getLocale() failed");
19511b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            } else {
19521b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                _checklocs("DateFormatSymbols", req, valid, actual);
19531b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
1954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
19551b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        delete df;
1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // BreakIterator
1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
19611b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    {
19621b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        UErrorCode ec = U_ZERO_ERROR;  // give each resource type its own error code
19631b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        req = "es_ES_BARCELONA";
19641b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        reqLoc = Locale::createFromName(req);
19651b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        BreakIterator* brk = BreakIterator::createWordInstance(reqLoc, ec);
1966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
19671b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            dataerrln("FAIL: BreakIterator::createWordInstance failed - %s", u_errorName(ec));
1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
19691b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            valid = brk->getLocale(ULOC_VALID_LOCALE, ec);
19701b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            actual = brk->getLocale(ULOC_ACTUAL_LOCALE, ec);
19711b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (U_FAILURE(ec)) {
19721b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: BreakIterator::getLocale() failed");
19731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            } else {
19741b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                _checklocs("BreakIterator", req, valid, actual);
19751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
1976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            // After registering something, the behavior should be different
19781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            URegistryKey key = BreakIterator::registerInstance(brk, reqLoc, UBRK_WORD, ec);
19791b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            brk = 0; // registerInstance adopts
19801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (U_FAILURE(ec)) {
19811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: BreakIterator::registerInstance() failed");
19821b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            } else {
19831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                brk = BreakIterator::createWordInstance(reqLoc, ec);
19841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                if (U_FAILURE(ec)) {
19851b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    errln("FAIL: BreakIterator::createWordInstance failed");
19861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                } else {
19871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    valid = brk->getLocale(ULOC_VALID_LOCALE, ec);
19881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    actual = brk->getLocale(ULOC_ACTUAL_LOCALE, ec);
19891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    if (U_FAILURE(ec)) {
19901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                        errln("FAIL: BreakIterator::getLocale() failed");
19911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    } else {
19921b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                        // N.B.: now expect valid==actual==req
19931b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                        _checklocs("BreakIterator(registered)",
19941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                                   req, valid, actual, "eq", "eq");
19951b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    }
19961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                }
19971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                // No matter what, unregister
19981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                BreakIterator::unregister(key, ec);
19991b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                if (U_FAILURE(ec)) {
20001b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    errln("FAIL: BreakIterator::unregister() failed");
20011b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                }
20021b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                delete brk;
20031b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                brk = 0;
20041b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
20051b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
20061b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            // After unregistering, should behave normally again
2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            brk = BreakIterator::createWordInstance(reqLoc, ec);
2008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(ec)) {
2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("FAIL: BreakIterator::createWordInstance failed");
2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                valid = brk->getLocale(ULOC_VALID_LOCALE, ec);
2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                actual = brk->getLocale(ULOC_ACTUAL_LOCALE, ec);
2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (U_FAILURE(ec)) {
2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln("FAIL: BreakIterator::getLocale() failed");
2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else {
20161b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    _checklocs("BreakIterator(unregistered)", req, valid, actual);
2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
20201b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        delete brk;
2021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Collator
2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
20261b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    {
20271b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        UErrorCode ec = U_ZERO_ERROR;  // give each resource type its own error code
2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20291b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        checkRegisteredCollators(NULL); // Don't expect any extras
20301b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
20311b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        req = "hi_IN_BHOPAL";
20321b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        reqLoc = Locale::createFromName(req);
20331b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        Collator* coll = Collator::createInstance(reqLoc, ec);
2034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
20351b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            dataerrln("FAIL: Collator::createInstance failed - %s", u_errorName(ec));
2036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
20371b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            valid = coll->getLocale(ULOC_VALID_LOCALE, ec);
20381b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            actual = coll->getLocale(ULOC_ACTUAL_LOCALE, ec);
20391b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (U_FAILURE(ec)) {
20401b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: Collator::getLocale() failed");
20411b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            } else {
20421b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                _checklocs("Collator", req, valid, actual);
20431b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
20441b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
20451b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            // After registering something, the behavior should be different
20461b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            URegistryKey key = Collator::registerInstance(coll, reqLoc, ec);
20471b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            coll = 0; // registerInstance adopts
20481b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (U_FAILURE(ec)) {
20491b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: Collator::registerInstance() failed");
20501b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            } else {
20511b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                coll = Collator::createInstance(reqLoc, ec);
20521b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                if (U_FAILURE(ec)) {
20531b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    errln("FAIL: Collator::createWordInstance failed");
20541b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                } else {
20551b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    valid = coll->getLocale(ULOC_VALID_LOCALE, ec);
20561b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    actual = coll->getLocale(ULOC_ACTUAL_LOCALE, ec);
20571b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    if (U_FAILURE(ec)) {
20581b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                        errln("FAIL: Collator::getLocale() failed");
20591b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    } else {
20601b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                        // N.B.: now expect valid==actual==req
20611b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                        _checklocs("Collator(registered)",
20621b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                                   req, valid, actual, "eq", "eq");
20631b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    }
20641b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                }
20651b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                checkRegisteredCollators(req); // include hi_IN_BHOPAL
20661b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
20671b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                // No matter what, unregister
20681b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                Collator::unregister(key, ec);
20691b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                if (U_FAILURE(ec)) {
20701b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    errln("FAIL: Collator::unregister() failed");
20711b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                }
20721b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                delete coll;
20731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                coll = 0;
20741b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
20751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
20761b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            // After unregistering, should behave normally again
2077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            coll = Collator::createInstance(reqLoc, ec);
2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(ec)) {
20791b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: Collator::createInstance failed");
2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                valid = coll->getLocale(ULOC_VALID_LOCALE, ec);
2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                actual = coll->getLocale(ULOC_ACTUAL_LOCALE, ec);
2083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (U_FAILURE(ec)) {
2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln("FAIL: Collator::getLocale() failed");
2085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else {
20861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    _checklocs("Collator(unregistered)", req, valid, actual);
2087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
20901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        delete coll;
2091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20921b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        checkRegisteredCollators(NULL); // extra should be gone again
20931b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
20941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#endif
20951b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#endif
20961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert}
20971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
20981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#if !UCONFIG_NO_COLLATION
20991b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert/**
21001b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * Compare Collator::getAvailableLocales(int) [ "old", returning an array ]
21011b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert *   with  Collator::getAvailableLocales()    [ "new", returning a StringEnumeration ]
21021b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * These should be identical (check their API docs) EXCEPT that
21031b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * if expectExtra is non-NULL, it will be in the "new" array but not "old".
21041b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * Does not return any status but calls errln on error.
21051b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * @param expectExtra an extra locale, will be in "new" but not "old". Or NULL.
21061b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert */
21071b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertvoid LocaleTest::checkRegisteredCollators(const char *expectExtra) {
21081b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    UErrorCode status = U_ZERO_ERROR;
21091b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    int32_t count1=0,count2=0;
21101b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    Hashtable oldHash(status);
21111b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    Hashtable newHash(status);
21121b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    TEST_ASSERT_STATUS(status);
21131b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21141b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    UnicodeString expectStr(expectExtra?expectExtra:"n/a", "");
21151b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21161b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // the 'old' list (non enumeration)
21171b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    const Locale*  oldList = Collator::getAvailableLocales(count1);
21181b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if(oldList == NULL) {
21191b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        dataerrln("Error: Collator::getAvailableLocales(count) returned NULL");
21201b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        return;
21211b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
21221b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21231b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // the 'new' list (enumeration)
21241b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    LocalPointer<StringEnumeration> newEnum(Collator::getAvailableLocales());
21251b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if(newEnum.isNull()) {
21261b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert       errln("Error: collator::getAvailableLocales() returned NULL");
21271b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert       return;
21281b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
21291b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21301b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // OK. Let's add all of the OLD
21311b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // then check for any in the NEW not in OLD
21321b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // then check for any in OLD not in NEW.
21331b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21341b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // 1. add all of OLD
21351b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    for(int32_t i=0;i<count1;i++) {
21361b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        const UnicodeString key(oldList[i].getName(), "");
21371b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        int32_t oldI = oldHash.puti(key, 1, status);
21381b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        if( oldI == 1 ){
21391b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            errln("Error: duplicate key %s in Collator::getAvailableLocales(count) list.\n",
21401b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                oldList[i].getName());
21411b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            return;
21421b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        }
21431b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        if(expectExtra != NULL && !strcmp(expectExtra, oldList[i].getName())) {
21441b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            errln("Inexplicably, Collator::getAvailableCollators(count) had registered collator %s. This shouldn't happen, so I am going to consider it an error.\n", expectExtra);
21451b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        }
21461b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
21471b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21481b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // 2. add all of NEW
21491b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    const UnicodeString *locStr;
21501b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    UBool foundExpected = FALSE;
21511b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    while((locStr = newEnum->snext(status)) && U_SUCCESS(status)) {
21521b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        count2++;
21531b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21541b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        if(expectExtra != NULL && expectStr == *locStr) {
21551b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            foundExpected = TRUE;
21561b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            logln(UnicodeString("Found expected registered collator: ","") + expectStr);
21571b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        }
21581b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        (void)foundExpected;    // Hush unused variable compiler warning.
21591b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21601b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        if( oldHash.geti(*locStr) == 0 ) {
21611b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if(expectExtra != NULL && expectStr==*locStr) {
21621b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                logln(UnicodeString("As expected, Collator::getAvailableLocales(count) is missing registered collator ") + expectStr);
2163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
21641b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln(UnicodeString("Error: Collator::getAvailableLocales(count) is missing: ","")
21651b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    + *locStr);
2166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
21681b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        newHash.puti(*locStr, 1, status);
2169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
21701b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21711b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // 3. check all of OLD again
21721b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    for(int32_t i=0;i<count1;i++) {
21731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        const UnicodeString key(oldList[i].getName(), "");
21741b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        int32_t newI = newHash.geti(key);
21751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        if(newI == 0) {
21761b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            errln(UnicodeString("Error: Collator::getAvailableLocales() is missing: ","")
21771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                + key);
21781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        }
21791b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
21801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    int32_t expectCount2 = count1;
21821b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if(expectExtra != NULL) {
21831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        expectCount2 ++; // if an extra item registered, bump the expect count
21841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
21851b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    assertEquals("Collator::getAvail() count", expectCount2, count2);
2187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
21881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#endif
21891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
2191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestVariantWithOutCountry(void) {
2193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale loc("en","","POSIX");
2194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 != strcmp(loc.getVariant(), "POSIX")) {
2195103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("FAIL: en__POSIX didn't get parsed correctly - name is %s - expected %s got %s", loc.getName(), "POSIX", loc.getVariant());
2196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale loc2("en","","FOUR");
2198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 != strcmp(loc2.getVariant(), "FOUR")) {
2199103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("FAIL: en__FOUR didn't get parsed correctly - name is %s - expected %s got %s", loc2.getName(), "FOUR", loc2.getVariant());
2200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale loc3("en","Latn","","FOUR");
2202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 != strcmp(loc3.getVariant(), "FOUR")) {
2203103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("FAIL: en_Latn__FOUR didn't get parsed correctly - name is %s - expected %s got %s", loc3.getName(), "FOUR", loc3.getVariant());
2204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale loc4("","Latn","","FOUR");
2206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 != strcmp(loc4.getVariant(), "FOUR")) {
2207103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("FAIL: _Latn__FOUR didn't get parsed correctly - name is %s - expected %s got %s", loc4.getName(), "FOUR", loc4.getVariant());
2208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale loc5("","Latn","US","FOUR");
2210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 != strcmp(loc5.getVariant(), "FOUR")) {
2211103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("FAIL: _Latn_US_FOUR didn't get parsed correctly - name is %s - expected %s got %s", loc5.getName(), "FOUR", loc5.getVariant());
2212103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2213103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    Locale loc6("de-1901");
2214103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (0 != strcmp(loc6.getVariant(), "1901")) {
2215103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("FAIL: de-1901 didn't get parsed correctly - name is %s - expected %s got %s", loc6.getName(), "1901", loc6.getVariant());
2216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic Locale _canonicalize(int32_t selector, /* 0==createFromName, 1==createCanonical, 2==Locale ct */
2220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            const char* localeID) {
2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (selector) {
2222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 0:
2223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return Locale::createFromName(localeID);
2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 1:
2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return Locale::createCanonical(localeID);
2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 2:
2227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return Locale(localeID);
2228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
2229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return Locale("");
2230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestCanonicalization(void)
2234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
2236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *localeID;    /* input */
2237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *getNameID;   /* expected getName() result */
2238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *canonicalID; /* expected canonicalize() result */
2239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } testCases[] = {
224027f654740f2a26ad62a5c155af9199af9e69b889claireho        { "", "", "en_US_POSIX" },
224127f654740f2a26ad62a5c155af9199af9e69b889claireho        { "C", "c", "en_US_POSIX" },
224227f654740f2a26ad62a5c155af9199af9e69b889claireho        { "POSIX", "posix", "en_US_POSIX" },
2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ca_ES_PREEURO-with-extra-stuff-that really doesn't make any sense-unless-you're trying to increase code coverage",
2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          "ca_ES_PREEURO_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE",
2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          "ca_ES_PREEURO_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE"},
2246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ca_ES_PREEURO", "ca_ES_PREEURO", "ca_ES@currency=ESP" },
2247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_AT_PREEURO", "de_AT_PREEURO", "de_AT@currency=ATS" },
2248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_DE_PREEURO", "de_DE_PREEURO", "de_DE@currency=DEM" },
2249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_LU_PREEURO", "de_LU_PREEURO", "de_LU@currency=LUF" },
2250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "el_GR_PREEURO", "el_GR_PREEURO", "el_GR@currency=GRD" },
2251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "en_BE_PREEURO", "en_BE_PREEURO", "en_BE@currency=BEF" },
2252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "en_IE_PREEURO", "en_IE_PREEURO", "en_IE@currency=IEP" },
2253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "es_ES_PREEURO", "es_ES_PREEURO", "es_ES@currency=ESP" },
2254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "eu_ES_PREEURO", "eu_ES_PREEURO", "eu_ES@currency=ESP" },
2255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "fi_FI_PREEURO", "fi_FI_PREEURO", "fi_FI@currency=FIM" },
2256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "fr_BE_PREEURO", "fr_BE_PREEURO", "fr_BE@currency=BEF" },
2257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "fr_FR_PREEURO", "fr_FR_PREEURO", "fr_FR@currency=FRF" },
2258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "fr_LU_PREEURO", "fr_LU_PREEURO", "fr_LU@currency=LUF" },
2259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ga_IE_PREEURO", "ga_IE_PREEURO", "ga_IE@currency=IEP" },
2260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "gl_ES_PREEURO", "gl_ES_PREEURO", "gl_ES@currency=ESP" },
2261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "it_IT_PREEURO", "it_IT_PREEURO", "it_IT@currency=ITL" },
2262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "nl_BE_PREEURO", "nl_BE_PREEURO", "nl_BE@currency=BEF" },
2263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "nl_NL_PREEURO", "nl_NL_PREEURO", "nl_NL@currency=NLG" },
2264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "pt_PT_PREEURO", "pt_PT_PREEURO", "pt_PT@currency=PTE" },
2265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de__PHONEBOOK", "de__PHONEBOOK", "de@collation=phonebook" },
2266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "en_GB_EURO", "en_GB_EURO", "en_GB@currency=EUR" },
2267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "en_GB@EURO", "en_GB@EURO", "en_GB@currency=EUR" }, /* POSIX ID */
2268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "es__TRADITIONAL", "es__TRADITIONAL", "es@collation=traditional" },
2269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "hi__DIRECT", "hi__DIRECT", "hi@collation=direct" },
2270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ja_JP_TRADITIONAL", "ja_JP_TRADITIONAL", "ja_JP@calendar=japanese" },
2271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "th_TH_TRADITIONAL", "th_TH_TRADITIONAL", "th_TH@calendar=buddhist" },
2272c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "zh_TW_STROKE", "zh_TW_STROKE", "zh_TW@collation=stroke" },
2273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zh__PINYIN", "zh__PINYIN", "zh@collation=pinyin" },
2274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zh@collation=pinyin", "zh@collation=pinyin", "zh@collation=pinyin" },
2275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zh_CN@collation=pinyin", "zh_CN@collation=pinyin", "zh_CN@collation=pinyin" },
2276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zh_CN_CA@collation=pinyin", "zh_CN_CA@collation=pinyin", "zh_CN_CA@collation=pinyin" },
2277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "en_US_POSIX", "en_US_POSIX", "en_US_POSIX" },
2278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "hy_AM_REVISED", "hy_AM_REVISED", "hy_AM_REVISED" },
2279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "no_NO_NY", "no_NO_NY", "no_NO_NY" /* not: "nn_NO" [alan ICU3.0] */ },
2280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "no@ny", "no@ny", "no__NY" /* not: "nn" [alan ICU3.0] */ }, /* POSIX ID */
2281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "no-no.utf32@B", "no_NO.utf32@B", "no_NO_B" /* not: "nb_NO_B" [alan ICU3.0] */ }, /* POSIX ID */
2282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "qz-qz@Euro", "qz_QZ@Euro", "qz_QZ@currency=EUR" }, /* qz-qz uses private use iso codes */
2283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // NOTE: uloc_getName() works on en-BOONT, but Locale() parser considers it BOGUS
2284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // TODO: unify this behavior
228554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        { "en-BOONT", "en__BOONT", "en__BOONT" }, /* registered name */
228654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        { "de-1901", "de__1901", "de__1901" }, /* registered name */
228754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        { "de-1906", "de__1906", "de__1906" }, /* registered name */
2288c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "sr-SP-Cyrl", "sr_SP_CYRL", "sr_Cyrl_RS" }, /* .NET name */
2289c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "sr-SP-Latn", "sr_SP_LATN", "sr_Latn_RS" }, /* .NET name */
2290c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "sr_YU_CYRILLIC", "sr_YU_CYRILLIC", "sr_Cyrl_RS" }, /* Linux name */
2291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "uz-UZ-Cyrl", "uz_UZ_CYRL", "uz_Cyrl_UZ" }, /* .NET name */
2292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "uz-UZ-Latn", "uz_UZ_LATN", "uz_Latn_UZ" }, /* .NET name */
2293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zh-CHS", "zh_CHS", "zh_Hans" }, /* .NET name */
2294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zh-CHT", "zh_CHT", "zh_Hant" }, /* .NET name This may change back to zh_Hant */
2295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* posix behavior that used to be performed by getName */
2297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "mr.utf8", "mr.utf8", "mr" },
2298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de-tv.koi8r", "de_TV.koi8r", "de_TV" },
2299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "x-piglatin_ML.MBE", "x-piglatin_ML.MBE", "x-piglatin_ML" },
2300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "i-cherokee_US.utf7", "i-cherokee_US.utf7", "i-cherokee_US" },
2301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA" },
2302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "no-no-ny.utf8@B", "no_NO_NY.utf8@B", "no_NO_NY_B" /* not: "nn_NO" [alan ICU3.0] */ }, /* @ ignored unless variant is empty */
2303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* fleshing out canonicalization */
2305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* trim space and sort keywords, ';' is separator so not present at end in canonical form */
2306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "en_Hant_IL_VALLEY_GIRL@ currency = EUR; calendar = Japanese ;", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR" },
2307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* already-canonical ids are not changed */
2308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR" },
2309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* PRE_EURO and EURO conversions don't affect other keywords */
2310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "es_ES_PREEURO@CALendar=Japanese", "es_ES_PREEURO@calendar=Japanese", "es_ES@calendar=Japanese;currency=ESP" },
2311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "es_ES_EURO@SHOUT=zipeedeedoodah", "es_ES_EURO@shout=zipeedeedoodah", "es_ES@currency=EUR;shout=zipeedeedoodah" },
2312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* currency keyword overrides PRE_EURO and EURO currency */
2313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "es_ES_PREEURO@currency=EUR", "es_ES_PREEURO@currency=EUR", "es_ES@currency=EUR" },
2314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "es_ES_EURO@currency=ESP", "es_ES_EURO@currency=ESP", "es_ES@currency=ESP" },
2315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* norwegian is just too weird, if we handle things in their full generality */
2316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "no-Hant-GB_NY@currency=$$$", "no_Hant_GB_NY@currency=$$$", "no_Hant_GB_NY@currency=$$$" /* not: "nn_Hant_GB@currency=$$$" [alan ICU3.0] */ },
2317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* test cases reflecting internal resource bundle usage */
2319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "root@kw=foo", "root@kw=foo", "root@kw=foo" },
2320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "@calendar=gregorian", "@calendar=gregorian", "@calendar=gregorian" },
2321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ja_JP@calendar=Japanese", "ja_JP@calendar=Japanese", "ja_JP@calendar=Japanese" }
2322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* label[] = { "createFromName", "createCanonical", "Locale" };
2325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, j;
2327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
23288de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for (i=0; i < UPRV_LENGTHOF(testCases); i++) {
2329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (j=0; j<3; ++j) {
2330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const char* expected = (j==1) ? testCases[i].canonicalID : testCases[i].getNameID;
2331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            Locale loc = _canonicalize(j, testCases[i].localeID);
2332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const char* getName = loc.isBogus() ? "BOGUS" : loc.getName();
2333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(uprv_strcmp(expected, getName) != 0) {
2334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("FAIL: %s(%s).getName() => \"%s\", expected \"%s\"",
2335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      label[j], testCases[i].localeID, getName, expected);
2336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
2337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("Ok: %s(%s) => \"%s\"",
2338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      label[j], testCases[i].localeID, getName);
2339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2343c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2344c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid LocaleTest::TestCurrencyByDate(void)
2345c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
2346c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
2347c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2348c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UDate date = uprv_getUTCtime();
2349c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	UChar TMP[4];
2350c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	int32_t index = 0;
2351c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	int32_t resLen = 0;
2352c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UnicodeString tempStr, resultStr;
2353c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2354c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	// Cycle through historical currencies
2355c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    date = (UDate)-630720000000.0; // pre 1961 - no currency defined
23566d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    index = ucurr_countCurrencies("eo_AM", date, &status);
2357c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 0)
2358c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
23596d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 0 for eo_AM - %s", u_errorName(status));
2360c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2361c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AM", date, index, TMP, 4, &status);
2362c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resLen != 0) {
23636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: eo_AM didn't return NULL - %s", u_errorName(status));
2364c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2365c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
2366c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2367c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    date = (UDate)0.0; // 1970 - one currency defined
23686d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    index = ucurr_countCurrencies("eo_AM", date, &status);
2369c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 1)
2370c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
23716d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 1 for eo_AM - %s", u_errorName(status));
2372c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2373c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AM", date, index, TMP, 4, &status);
2374c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2375c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("SUR");
2376c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
23776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return SUR for eo_AM - %s", u_errorName(status));
2378c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2379c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2380c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    date = (UDate)693792000000.0; // 1992 - one currency defined
2381c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AM", date, &status);
2382c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 1)
2383c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
23846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 1 for eo_AM - %s", u_errorName(status));
2385c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2386c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AM", date, index, TMP, 4, &status);
2387c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2388c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("RUR");
2389c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
23906d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return RUR for eo_AM - %s", u_errorName(status));
2391c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2392c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2393c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)977616000000.0; // post 1993 - one currency defined
2394c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AM", date, &status);
2395c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 1)
2396c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
23976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 1 for eo_AM - %s", u_errorName(status));
2398c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2399c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AM", date, index, TMP, 4, &status);
2400c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2401c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("AMD");
2402c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return AMD for eo_AM - %s", u_errorName(status));
2404c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2405c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2406c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // Locale AD has multiple currencies at once
2407c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)977616000000.0; // year 2001
2408c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AD", date, &status);
2409c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 4)
2410c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
24116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 4 for eo_AD - %s", u_errorName(status));
2412c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2413c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 1, TMP, 4, &status);
2414c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2415c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("EUR");
2416c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return EUR for eo_AD - %s", u_errorName(status));
2418c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2419c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 2, TMP, 4, &status);
2420c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2421c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("ESP");
2422c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return ESP for eo_AD - %s", u_errorName(status));
2424c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2425c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 3, TMP, 4, &status);
2426c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2427c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("FRF");
2428c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24296d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return FRF for eo_AD - %s", u_errorName(status));
2430c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2431c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 4, TMP, 4, &status);
2432c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2433c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("ADP");
2434c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24356d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return ADP for eo_AD - %s", u_errorName(status));
2436c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2437c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2438c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)0.0; // year 1970
2439c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AD", date, &status);
2440c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 3)
2441c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
24426d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 3 for eo_AD - %s", u_errorName(status));
2443c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2444c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 1, TMP, 4, &status);
2445c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2446c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("ESP");
2447c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24486d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return ESP for eo_AD - %s", u_errorName(status));
2449c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2450c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 2, TMP, 4, &status);
2451c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2452c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("FRF");
2453c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24546d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return FRF for eo_AD - %s", u_errorName(status));
2455c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2456c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 3, TMP, 4, &status);
2457c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2458c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("ADP");
2459c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24606d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return ADP for eo_AD - %s", u_errorName(status));
2461c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2462c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2463c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)-630720000000.0; // year 1950
2464c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AD", date, &status);
2465c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 2)
2466c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
24676d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 2 for eo_AD - %s", u_errorName(status));
2468c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2469c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 1, TMP, 4, &status);
2470c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2471c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("ESP");
2472c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return ESP for eo_AD - %s", u_errorName(status));
2474c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2475c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 2, TMP, 4, &status);
2476c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2477c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("ADP");
2478c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24796d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return ADP for eo_AD - %s", u_errorName(status));
2480c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2481c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2482c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)-2207520000000.0; // year 1900
2483c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AD", date, &status);
2484c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 1)
2485c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
24866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 1 for eo_AD - %s", u_errorName(status));
2487c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2488c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 1, TMP, 4, &status);
2489c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2490c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("ESP");
2491c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return ESP for eo_AD - %s", u_errorName(status));
2493c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2494c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2495c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	// Locale UA has gap between years 1994 - 1996
2496c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)788400000000.0;
2497c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_UA", date, &status);
2498c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 0)
2499c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
25006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 0 for eo_UA - %s", u_errorName(status));
2501c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2502c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_UA", date, index, TMP, 4, &status);
2503c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resLen != 0) {
25046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: eo_UA didn't return NULL - %s", u_errorName(status));
2505c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2506c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
2507c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2508c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	// Test index bounds
2509c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_UA", date, 100, TMP, 4, &status);
2510c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resLen != 0) {
25116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: eo_UA didn't return NULL - %s", u_errorName(status));
2512c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2513c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
2514c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2515c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_UA", date, 0, TMP, 4, &status);
2516c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resLen != 0) {
25176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: eo_UA didn't return NULL - %s", u_errorName(status));
2518c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2519c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
2520c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2521c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	// Test for bogus locale
2522c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_QQ", date, &status);
2523c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 0)
2524c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
25256d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 0 for eo_QQ - %s", u_errorName(status));
2526c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2527c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
2528c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_QQ", date, 1, TMP, 4, &status);
2529c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resLen != 0) {
25306d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: eo_QQ didn't return NULL - %s", u_errorName(status));
2531c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2532c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
2533c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_QQ", date, 0, TMP, 4, &status);
2534c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resLen != 0) {
25356d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: eo_QQ didn't return NULL - %s", u_errorName(status));
2536c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2537c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
2538c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2539c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // Cycle through histrocial currencies
2540c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)977616000000.0; // 2001 - one currency
2541c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AO", date, &status);
2542c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 1)
2543c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
25446d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 1 for eo_AO - %s", u_errorName(status));
2545c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2546c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AO", date, 1, TMP, 4, &status);
2547c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2548c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("AOA");
2549c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
25506d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return AOA for eo_AO - %s", u_errorName(status));
2551c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2552c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2553c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)819936000000.0; // 1996 - 2 currencies
2554c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AO", date, &status);
2555c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 2)
2556c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
25576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 1 for eo_AO - %s", u_errorName(status));
2558c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2559c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AO", date, 1, TMP, 4, &status);
2560c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2561c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("AOR");
2562c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
25636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return AOR for eo_AO - %s", u_errorName(status));
2564c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2565c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AO", date, 2, TMP, 4, &status);
2566c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2567c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("AON");
2568c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
25696d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return AON for eo_AO - %s", u_errorName(status));
2570c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2571c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2572c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)662256000000.0; // 1991 - 2 currencies
2573c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AO", date, &status);
2574c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 2)
2575c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
25766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 1 for eo_AO - %s", u_errorName(status));
2577c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2578c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AO", date, 1, TMP, 4, &status);
2579c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2580c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("AON");
2581c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
25826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return AON for eo_AO - %s", u_errorName(status));
2583c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2584c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AO", date, 2, TMP, 4, &status);
2585c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2586c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("AOK");
2587c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
25886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return AOK for eo_AO - %s", u_errorName(status));
2589c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2590c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2591c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)315360000000.0; // 1980 - one currency
2592c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AO", date, &status);
2593c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 1)
2594c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
25956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 1 for eo_AO - %s", u_errorName(status));
2596c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2597c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AO", date, 1, TMP, 4, &status);
2598c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2599c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("AOK");
2600c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
26016d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return AOK for eo_AO - %s", u_errorName(status));
2602c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2603c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2604c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)0.0; // 1970 - no currencies
2605c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AO", date, &status);
2606c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 0)
2607c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
26086d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 1 for eo_AO - %s", u_errorName(status));
2609c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2610c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AO", date, 1, TMP, 4, &status);
2611c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resLen != 0) {
26126d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: eo_AO didn't return NULL - %s", u_errorName(status));
2613c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2614c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
2615c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2616c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // Test with currency keyword override
2617c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)977616000000.0; // 2001 - two currencies
2618c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_DE@currency=DEM", date, &status);
2619c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 2)
2620c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
26216d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 2 for eo_DE@currency=DEM - %s", u_errorName(status));
2622c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2623c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_DE@currency=DEM", date, 1, TMP, 4, &status);
2624c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2625c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("EUR");
2626c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
26276d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return EUR for eo_DE@currency=DEM - %s", u_errorName(status));
2628c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2629c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_DE@currency=DEM", date, 2, TMP, 4, &status);
2630c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2631c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("DEM");
2632c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
26336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return DEM for eo_DE@currency=DEM - %s", u_errorName(status));
2634c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2635c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2636c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // Test Euro Support
2637c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	status = U_ZERO_ERROR; // reset
2638c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    date = uprv_getUTCtime();
2639c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2640c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UChar USD[4];
2641c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucurr_forLocaleAndDate("en_US", date, 1, USD, 4, &status);
2642c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2643c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	UChar YEN[4];
2644c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucurr_forLocaleAndDate("ja_JP", date, 1, YEN, 4, &status);
2645c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2646c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucurr_forLocaleAndDate("en_US", date, 1, TMP, 4, &status);
2647c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (u_strcmp(USD, TMP) != 0) {
26486d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail: en_US didn't return USD - %s", u_errorName(status));
2649c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2650c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucurr_forLocaleAndDate("en_US_PREEURO", date, 1, TMP, 4, &status);
2651c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (u_strcmp(USD, TMP) != 0) {
26526d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail: en_US_PREEURO didn't fallback to en_US - %s", u_errorName(status));
2653c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2654c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucurr_forLocaleAndDate("en_US_Q", date, 1, TMP, 4, &status);
2655c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (u_strcmp(USD, TMP) != 0) {
26566d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail: en_US_Q didn't fallback to en_US - %s", u_errorName(status));
2657c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2658c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR; // reset
2659c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#endif
2660c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
266150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
266250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid LocaleTest::TestGetVariantWithKeywords(void)
266350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
266450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  Locale l("en_US_VALLEY@foo=value");
266550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  const char *variant = l.getVariant();
266650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  logln(variant);
266750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  test_assert(strcmp("VALLEY", variant) == 0);
266850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
266950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  UErrorCode status = U_ZERO_ERROR;
267050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  char buffer[50];
267150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  int32_t len = l.getKeywordValue("foo", buffer, 50, status);
267250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  buffer[len] = '\0';
267350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  test_assert(strcmp("value", buffer) == 0);
267450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
2675f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
2676f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusvoid LocaleTest::TestIsRightToLeft() {
2677f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    assertFalse("root LTR", Locale::getRoot().isRightToLeft());
2678f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    assertFalse("zh LTR", Locale::getChinese().isRightToLeft());
2679f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    assertTrue("ar RTL", Locale("ar").isRightToLeft());
2680f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    assertTrue("und-EG RTL", Locale("und-EG").isRightToLeft(), FALSE, TRUE);
2681f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    assertFalse("fa-Cyrl LTR", Locale("fa-Cyrl").isRightToLeft());
2682f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    assertTrue("en-Hebr RTL", Locale("en-Hebr").isRightToLeft());
2683f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    assertTrue("ckb RTL", Locale("ckb").isRightToLeft(), FALSE, TRUE);  // Sorani Kurdish
2684f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    assertFalse("fil LTR", Locale("fil").isRightToLeft());
2685f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    assertFalse("he-Zyxw LTR", Locale("he-Zyxw").isRightToLeft());
2686f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius}
26871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
26881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertvoid LocaleTest::TestBug11421() {
26891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    Locale::getDefault().getBaseName();
26901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    int32_t numLocales;
26911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    const Locale *localeList = Locale::getAvailableLocales(numLocales);
26921b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    for (int localeIndex = 0; localeIndex < numLocales; localeIndex++) {
26931b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        const Locale &loc = localeList[localeIndex];
26941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        if (strncmp(loc.getName(), loc.getBaseName(), strlen(loc.getBaseName()))) {
26951b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            errln("%s:%d loc.getName=\"%s\"; loc.getBaseName=\"%s\"",
26961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                __FILE__, __LINE__, loc.getName(), loc.getBaseName());
26971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            break;
26981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        }
26991b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
27001b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert}
2701