10596faeddefbf198de137d5e893708495ab1584cFredrik Roubert// © 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"
13ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert#include "unicode/strenum.h"
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/dtfmtsym.h"
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/brkiter.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/coll.h"
17ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert#include "charstr.h"
188de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "cmemory.h"
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h>
21b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include <string.h>
22c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "putilimp.h"
23c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "unicode/ustring.h"
241b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#include "hash.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* const rawData[33][8] = {
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // language code
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "en",   "fr",   "ca",   "el",   "no",   "it",   "xx",   "zh"  },
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // script code
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "",     "",     "",     "",     "",     "",     "",     "Hans" },
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // country code
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "US",   "FR",   "ES",   "GR",   "NO",   "",     "YY",   "CN"  },
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // variant code
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "",     "",     "",     "",     "NY",   "",     "",   ""    },
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // full name
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "en_US",    "fr_FR",    "ca_ES",    "el_GR",    "no_NO_NY", "it",   "xx_YY",   "zh_Hans_CN" },
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // ISO-3 language
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "eng",  "fra",  "cat",  "ell",  "nor",  "ita",  "",   "zho"   },
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // ISO-3 country
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "USA",  "FRA",  "ESP",  "GRC",  "NOR",  "",     "",   "CHN"   },
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // LCID
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "409", "40c", "403", "408", "814", "10",     "0",   "804"  },
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display langage (English)
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "English",  "French",   "Catalan", "Greek",    "Norwegian",    "Italian",  "xx",   "Chinese" },
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display script (English)
48103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        {   "",     "",     "",     "",     "",   "",     "",   "Simplified Han" },
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display country (English)
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "United States",    "France",   "Spain",  "Greece",   "Norway",   "",     "YY",   "China" },
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display variant (English)
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "",     "",     "",     "",     "NY",   "",     "",   ""},
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display name (English)
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Updated no_NO_NY English display name for new pattern-based algorithm
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // (part of Euro support).
56b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {   "English (United States)", "French (France)", "Catalan (Spain)", "Greek (Greece)", "Norwegian (Norway, NY)", "Italian", "xx (YY)", "Chinese (Simplified, China)" },
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display langage (French)
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "anglais",  "fran\\u00E7ais",   "catalan", "grec",    "norv\\u00E9gien",    "italien", "xx", "chinois" },
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display script (French)
6159d709d503bab6e2b61931737e662dd293b40578ccornelius        {   "",     "",     "",     "",     "",     "",     "",   "sinogrammes simplifi\\u00E9s" },
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display country (French)
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "\\u00C9tats-Unis",    "France",   "Espagne",  "Gr\\u00E8ce",   "Norv\\u00E8ge", "", "YY", "Chine" },
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display variant (French)
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "",     "",     "",     "",     "NY",     "",     "",   "" },
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display name (French)
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //{   "anglais (Etats-Unis)", "francais (France)", "catalan (Espagne)", "grec (Grece)", "norvegien (Norvege,Nynorsk)", "italien", "xx (YY)" },
6859d709d503bab6e2b61931737e662dd293b40578ccornelius        {   "anglais (\\u00C9tats-Unis)", "fran\\u00E7ais (France)", "catalan (Espagne)", "grec (Gr\\u00E8ce)", "norv\\u00E9gien (Norv\\u00E8ge, NY)", "italien", "xx (YY)", "chinois (simplifi\\u00E9, Chine)" },
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* display language (Catalan) */
72c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {   "angl\\u00E8s", "franc\\u00E8s", "catal\\u00E0", "grec",  "noruec", "itali\\u00E0", "", "xin\\u00E8s" },
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* display script (Catalan) */
7459d709d503bab6e2b61931737e662dd293b40578ccornelius        {   "", "", "",                    "", "", "", "", "han simplificat" },
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* display country (Catalan) */
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "Estats Units", "Fran\\u00E7a", "Espanya",  "Gr\\u00E8cia", "Noruega", "", "", "Xina" },
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* display variant (Catalan) */
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "", "", "",                    "", "NY", "", "" },
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* display name (Catalan) */
80b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {   "angl\\u00E8s (Estats Units)", "franc\\u00E8s (Fran\\u00E7a)", "catal\\u00E0 (Espanya)", "grec (Gr\\u00E8cia)", "noruec (Noruega, NY)", "itali\\u00E0", "", "xin\\u00E8s (simplificat, Xina)" },
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display langage (Greek)[actual values listed below]
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac",
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u0393\\u03b1\\u03bb\\u03bb\\u03b9\\u03ba\\u03ac",
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u039a\\u03b1\\u03c4\\u03b1\\u03bb\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac",
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u0395\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac",
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac",
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u0399\\u03c4\\u03b1\\u03bb\\u03b9\\u03ba\\u03ac",
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "",
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u039A\\u03B9\\u03BD\\u03B5\\u03B6\\u03B9\\u03BA\\u03AC"
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display script (Greek)
9359d709d503bab6e2b61931737e662dd293b40578ccornelius        {   "", "", "", "", "", "", "", "\\u0391\\u03c0\\u03bb\\u03bf\\u03c0\\u03bf\\u03b9\\u03b7\\u03bc\\u03ad\\u03bd\\u03bf \\u03a7\\u03b1\\u03bd" },
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display country (Greek)[actual values listed below]
9559d709d503bab6e2b61931737e662dd293b40578ccornelius        {   "\\u0397\\u03BD\\u03C9\\u03BC\\u03AD\\u03BD\\u03B5\\u03C2 \\u03A0\\u03BF\\u03BB\\u03B9\\u03C4\\u03B5\\u03AF\\u03B5\\u03C2",
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u0393\\u03b1\\u03bb\\u03bb\\u03af\\u03b1",
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03af\\u03b1",
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1",
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1",
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "",
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "",
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u039A\\u03AF\\u03BD\\u03B1"
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display variant (Greek)
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "", "", "", "", "NY", "", "" },
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display name (Greek)[actual values listed below]
10759d709d503bab6e2b61931737e662dd293b40578ccornelius        {   "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac (\\u0397\\u03BD\\u03C9\\u03BC\\u03AD\\u03BD\\u03B5\\u03C2 \\u03A0\\u03BF\\u03BB\\u03B9\\u03C4\\u03B5\\u03AF\\u03B5\\u03C2)",
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u0393\\u03b1\\u03bb\\u03bb\\u03b9\\u03ba\\u03ac (\\u0393\\u03b1\\u03bb\\u03bb\\u03af\\u03b1)",
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u039a\\u03b1\\u03c4\\u03b1\\u03bb\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac (\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03af\\u03b1)",
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u0395\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac (\\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1)",
11159d709d503bab6e2b61931737e662dd293b40578ccornelius            "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac (\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1, NY)",
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u0399\\u03c4\\u03b1\\u03bb\\u03b9\\u03ba\\u03ac",
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "",
11459d709d503bab6e2b61931737e662dd293b40578ccornelius            "\\u039A\\u03B9\\u03BD\\u03B5\\u03B6\\u03B9\\u03BA\\u03AC (\\u0391\\u03c0\\u03bb\\u03bf\\u03c0\\u03bf\\u03b9\\u03b7\\u03bc\\u03ad\\u03bd\\u03bf, \\u039A\\u03AF\\u03BD\\u03B1)"
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display langage (<root>)
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "English",  "French",   "Catalan", "Greek",    "Norwegian",    "Italian",  "xx", "" },
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display script (<root>)
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "",     "",     "",     "",     "",   "",     "", ""},
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display country (<root>)
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "United States",    "France",   "Spain",  "Greece",   "Norway",   "",     "YY", "" },
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display variant (<root>)
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "",     "",     "",     "",     "Nynorsk",   "",     "", ""},
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // display name (<root>)
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //{   "English (United States)", "French (France)", "Catalan (Spain)", "Greek (Greece)", "Norwegian (Norway,Nynorsk)", "Italian", "xx (YY)" },
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "English (United States)", "French (France)", "Catalan (Spain)", "Greek (Greece)", "Norwegian (Norway,NY)", "Italian", "xx (YY)", "" }
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Usage:
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(    Test (should be TRUE)  )
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   Example:
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       test_assert(i==3);
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   the macro is ugly but makes the tests pretty.
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define test_assert(test) \
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { \
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!(test)) \
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("FAIL: " #test " was not true. In " __FILE__ " on line %d", __LINE__ ); \
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else \
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("PASS: asserted " #test); \
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Usage:
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert_print(    Test (should be TRUE),  printable  )
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   Example:
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       test_assert(i==3, toString(i));
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   the macro is ugly but makes the tests pretty.
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define test_assert_print(test,print) \
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { \
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!(test)) \
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("FAIL: " #test " was not true. " + UnicodeString(print) ); \
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else \
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("PASS: asserted " #test "-> " + UnicodeString(print)); \
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define test_dumpLocale(l) { logln(#l " = " + UnicodeString(l.getName(), "")); }
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::LocaleTest()
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru: dataTable(NULL)
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setUpDataTable();
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::~LocaleTest()
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (dataTable != 0) {
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int32_t i = 0; i < 33; i++) {
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete []dataTable[i];
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete []dataTable;
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataTable = 0;
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
189f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO_BEGIN;
1901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    TESTCASE_AUTO(TestBug11421);         // Must run early in list to trigger failure.
191f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestBasicGetters);
192f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestSimpleResourceInfo);
193f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestDisplayNames);
194f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestSimpleObjectStuff);
195f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestPOSIXParsing);
196f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestGetAvailableLocales);
197f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestDataDirectory);
198f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestISO3Fallback);
199f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestGetLangsAndCountries);
200f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestSimpleDisplayNames);
201f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestUninstalledISO3Names);
202f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestAtypicalLocales);
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
204f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestThaiCurrencyFormat);
205f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestEuroSupport);
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
207f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestToString);
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
209f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(Test4139940);
210f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(Test4143951);
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
212f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(Test4147315);
213f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(Test4147317);
214f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(Test4147552);
215f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestVariantParsing);
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
217f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(Test4105828);
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
219f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestSetIsBogus);
220f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestParallelAPIValues);
221f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestKeywordVariants);
222f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestKeywordVariantParsing);
223f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestSetKeywordValue);
224f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestGetBaseName);
22550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FILE_IO
226f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestGetLocale);
22750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
228f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestVariantWithOutCountry);
229f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestCanonicalization);
230f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestCurrencyByDate);
231f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestGetVariantWithKeywords);
232f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO(TestIsRightToLeft);
233ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    TESTCASE_AUTO(TestBug13277);
234f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE_AUTO_END;
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestBasicGetters() {
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString   temp;
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i <= MAX_LOCALES; i++) {
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale testLocale("");
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (rawData[SCRIPT][i] && rawData[SCRIPT][i][0] != 0) {
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testLocale = Locale(rawData[LANG][i], rawData[SCRIPT][i], rawData[CTRY][i], rawData[VAR][i]);
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testLocale = Locale(rawData[LANG][i], rawData[CTRY][i], rawData[VAR][i]);
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Testing " + (UnicodeString)testLocale.getName() + "...");
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getLanguage()) != (dataTable[LANG][i]))
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("  Language code mismatch: " + temp + " versus "
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + dataTable[LANG][i]);
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getScript()) != (dataTable[SCRIPT][i]))
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("  Script code mismatch: " + temp + " versus "
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + dataTable[SCRIPT][i]);
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getCountry()) != (dataTable[CTRY][i]))
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("  Country code mismatch: " + temp + " versus "
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + dataTable[CTRY][i]);
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getVariant()) != (dataTable[VAR][i]))
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("  Variant code mismatch: " + temp + " versus "
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + dataTable[VAR][i]);
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getName()) != (dataTable[NAME][i]))
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("  Locale name mismatch: " + temp + " versus "
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + dataTable[NAME][i]);
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Same thing without variant codes...");
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i <= MAX_LOCALES; i++) {
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale testLocale("");
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (rawData[SCRIPT][i] && rawData[SCRIPT][i][0] != 0) {
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testLocale = Locale(rawData[LANG][i], rawData[SCRIPT][i], rawData[CTRY][i]);
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testLocale = Locale(rawData[LANG][i], rawData[CTRY][i]);
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Testing " + (temp=testLocale.getName()) + "...");
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getLanguage()) != (dataTable[LANG][i]))
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Language code mismatch: " + temp + " versus "
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + dataTable[LANG][i]);
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getScript()) != (dataTable[SCRIPT][i]))
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Script code mismatch: " + temp + " versus "
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + dataTable[SCRIPT][i]);
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getCountry()) != (dataTable[CTRY][i]))
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Country code mismatch: " + temp + " versus "
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + dataTable[CTRY][i]);
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testLocale.getVariant()[0] != 0)
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Variant code mismatch: something versus \"\"");
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing long language names and getters");
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test8 = Locale::createFromName("x-klingon-latn-zx.utf32be@special");
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = test8.getLanguage();
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (temp != UnicodeString("x-klingon") )
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Language code mismatch: " + temp + "  versus \"x-klingon\"");
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = test8.getScript();
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (temp != UnicodeString("Latn") )
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Script code mismatch: " + temp + "  versus \"Latn\"");
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = test8.getCountry();
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (temp != UnicodeString("ZX") )
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Country code mismatch: " + temp + "  versus \"ZX\"");
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = test8.getVariant();
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //if (temp != UnicodeString("SPECIAL") )
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //    errln("Variant code mismatch: " + temp + "  versus \"SPECIAL\"");
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // As of 3.0, the "@special" will *not* be parsed by uloc_getName()
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (temp != UnicodeString("") )
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Variant code mismatch: " + temp + "  versus \"\"");
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (Locale::getDefault() != Locale::createFromName(NULL))
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Locale::getDefault() == Locale::createFromName(NULL)");
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*----------*/
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // NOTE: There used to be a special test for locale names that had language or
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // country codes that were longer than two letters.  The new version of Locale
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // doesn't support anything that isn't an officially recognized language or
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // country code, so we no longer support this feature.
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale bogusLang("THISISABOGUSLANGUAGE"); // Jitterbug 2864: language code too long
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!bogusLang.isBogus()) {
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Locale(\"THISISABOGUSLANGUAGE\").isBogus()==FALSE");
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bogusLang=Locale("eo");
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( bogusLang.isBogus() ||
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcmp(bogusLang.getLanguage(), "eo")!=0 ||
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *bogusLang.getCountry()!=0 ||
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *bogusLang.getVariant()!=0 ||
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcmp(bogusLang.getName(), "eo")!=0
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("assignment to bogus Locale does not unbogus it or sets bad data");
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale a("eo_DE@currency=DEM");
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale *pb=a.clone();
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pb==&a || *pb!=a) {
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Locale.clone() failed");
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete pb;
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestParallelAPIValues() {
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Test synchronization between C and C++ API");
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getChinese().getName(), ULOC_CHINESE) != 0) {
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_CHINESE Locale");
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getEnglish().getName(), ULOC_ENGLISH) != 0) {
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_ENGLISH Locale");
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getFrench().getName(), ULOC_FRENCH) != 0) {
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_FRENCH Locale");
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getGerman().getName(), ULOC_GERMAN) != 0) {
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_GERMAN Locale");
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getItalian().getName(), ULOC_ITALIAN) != 0) {
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_ITALIAN Locale");
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getJapanese().getName(), ULOC_JAPANESE) != 0) {
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_JAPANESE Locale");
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getKorean().getName(), ULOC_KOREAN) != 0) {
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_KOREAN Locale");
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getSimplifiedChinese().getName(), ULOC_SIMPLIFIED_CHINESE) != 0) {
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_SIMPLIFIED_CHINESE Locale");
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getTraditionalChinese().getName(), ULOC_TRADITIONAL_CHINESE) != 0) {
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_TRADITIONAL_CHINESE Locale");
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getCanada().getName(), ULOC_CANADA) != 0) {
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_CANADA Locale");
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getCanadaFrench().getName(), ULOC_CANADA_FRENCH) != 0) {
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_CANADA_FRENCH Locale");
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getChina().getName(), ULOC_CHINA) != 0) {
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_CHINA Locale");
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getPRC().getName(), ULOC_PRC) != 0) {
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_PRC Locale");
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getFrance().getName(), ULOC_FRANCE) != 0) {
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_FRANCE Locale");
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getGermany().getName(), ULOC_GERMANY) != 0) {
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_GERMANY Locale");
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getItaly().getName(), ULOC_ITALY) != 0) {
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_ITALY Locale");
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getJapan().getName(), ULOC_JAPAN) != 0) {
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_JAPAN Locale");
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getKorea().getName(), ULOC_KOREA) != 0) {
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_KOREA Locale");
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getTaiwan().getName(), ULOC_TAIWAN) != 0) {
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_TAIWAN Locale");
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getUK().getName(), ULOC_UK) != 0) {
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_UK Locale");
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(Locale::getUS().getName(), ULOC_US) != 0) {
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Differences for ULOC_US Locale");
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestSimpleResourceInfo() {
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString   temp;
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char            temp2[20];
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0;
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i <= MAX_LOCALES; i++) {
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale testLocale(rawData[LANG][i], rawData[CTRY][i], rawData[VAR][i]);
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Testing " + (temp=testLocale.getName()) + "...");
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getISO3Language()) != (dataTable[LANG3][i]))
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("  ISO-3 language code mismatch: " + temp
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                + " versus " + dataTable[LANG3][i]);
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (temp=testLocale.getISO3Country()) != (dataTable[CTRY3][i]))
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("  ISO-3 country code mismatch: " + temp
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                + " versus " + dataTable[CTRY3][i]);
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        sprintf(temp2, "%x", (int)testLocale.getLCID());
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (UnicodeString(temp2) != dataTable[LCID][i])
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln((UnicodeString)"  LCID mismatch: " + temp2 + " versus "
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                + dataTable[LCID][i]);
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err))
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln((UnicodeString)"Some error on number " + i + u_errorName(err));
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err = U_ZERO_ERROR;
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale locale("en");
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(strcmp(locale.getName(), "en") != 0||
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcmp(locale.getLanguage(), "en") != 0) {
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("construction of Locale(en) failed\n");
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*-----*/
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Jitterbug 2439 -- markus 20030425
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The lookup of display names must not fall back through the default
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * locale because that yields useless results.
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestDisplayNames()
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  english("en", "US");
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  french("fr", "FR");
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  croatian("ca", "ES");
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  greek("el", "GR");
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("  In locale = en_US...");
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTestDisplayNames(english, DLANG_EN);
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("  In locale = fr_FR...");
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTestDisplayNames(french, DLANG_FR);
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("  In locale = ca_ES...");
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTestDisplayNames(croatian, DLANG_CA);
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("  In locale = el_GR...");
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTestDisplayNames(greek, DLANG_EL);
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s;
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols symb(status);
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Check to see if ICU supports this locale */
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (symb.getLocale(ULOC_VALID_LOCALE, status) != Locale("root")) {
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* test that the default locale has a display name for its own language */
48527f654740f2a26ad62a5c155af9199af9e69b889claireho        /* Currently, there is no language information in the "tl" data file so this test will fail if default locale is "tl" */
48627f654740f2a26ad62a5c155af9199af9e69b889claireho        if (uprv_strcmp(Locale().getLanguage(), "tl") != 0) {
48727f654740f2a26ad62a5c155af9199af9e69b889claireho            Locale().getDisplayLanguage(Locale(), s);
48827f654740f2a26ad62a5c155af9199af9e69b889claireho            if(s.length()<=3 && s.charAt(0)<=0x7f) {
48927f654740f2a26ad62a5c155af9199af9e69b889claireho                /* check <=3 to reject getting the language code as a display name */
49027f654740f2a26ad62a5c155af9199af9e69b889claireho                dataerrln("unable to get a display string for the language of the default locale: " + s);
49127f654740f2a26ad62a5c155af9199af9e69b889claireho            }
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
49327f654740f2a26ad62a5c155af9199af9e69b889claireho            /*
49427f654740f2a26ad62a5c155af9199af9e69b889claireho             * API coverage improvements: call
49527f654740f2a26ad62a5c155af9199af9e69b889claireho             * Locale::getDisplayLanguage(UnicodeString &) and
49627f654740f2a26ad62a5c155af9199af9e69b889claireho             * Locale::getDisplayCountry(UnicodeString &)
49727f654740f2a26ad62a5c155af9199af9e69b889claireho             */
49827f654740f2a26ad62a5c155af9199af9e69b889claireho            s.remove();
49927f654740f2a26ad62a5c155af9199af9e69b889claireho            Locale().getDisplayLanguage(s);
50027f654740f2a26ad62a5c155af9199af9e69b889claireho            if(s.length()<=3 && s.charAt(0)<=0x7f) {
50127f654740f2a26ad62a5c155af9199af9e69b889claireho                dataerrln("unable to get a display string for the language of the default locale [2]: " + s);
50227f654740f2a26ad62a5c155af9199af9e69b889claireho            }
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Default locale %s is unsupported by ICU\n", Locale().getName());
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.remove();
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    french.getDisplayCountry(s);
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(s.isEmpty()) {
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("unable to get any default-locale display string for the country of fr_FR\n");
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.remove();
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale("zh", "Hant").getDisplayScript(s);
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(s.isEmpty()) {
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("unable to get any default-locale display string for the country of zh_Hant\n");
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestSimpleObjectStuff() {
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test1("aa", "AA");
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test2("aa", "AA");
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test3(test1);
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test4("zz", "ZZ");
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test5("aa", "AA", "");
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test6("aa", "AA", "ANTARES");
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test7("aa", "AA", "JUPITER");
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test8 = Locale::createFromName("aa-aa-jupiTER"); // was "aa-aa.utf8@jupiter" but in 3.0 getName won't normalize that
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // now list them all for debugging usage.
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test1);
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test2);
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test3);
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test4);
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test5);
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test6);
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test7);
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test8);
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Make sure things compare to themselves!
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test1 == test1);
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test2 == test2);
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test3 == test3);
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test4 == test4);
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test5 == test5);
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test6 == test6);
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test7 == test7);
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test8 == test8);
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // make sure things are not equal to themselves.
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test1 != test1));
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test2 != test2));
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test3 != test3));
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test4 != test4));
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test5 != test5));
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test6 != test6));
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test7 != test7));
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test8 != test8));
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // make sure things that are equal to each other don't show up as unequal.
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test1 != test2));
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test2 != test1));
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test1 != test3));
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test2 != test3));
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test5 == test1);
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test6 != test2);
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test6 != test5);
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test6 != test7);
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // test for things that shouldn't compare equal.
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test1 == test4));
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test2 == test4));
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test3 == test4));
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test7 == test8);
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // test for hash codes to be the same.
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t hash1 = test1.hashCode();
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t hash2 = test2.hashCode();
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t hash3 = test3.hashCode();
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(hash1 == hash2);
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(hash1 == hash3);
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(hash2 == hash3);
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // test that the assignment operator works.
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test4 = test1;
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("test4=test1;");
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test4);
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test4 == test4);
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test1 != test4));
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test2 != test4));
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(!(test3 != test4));
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test1 == test4);
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test4 == test1);
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // test assignments with a variant
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("test7 = test6");
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test7 = test6;
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test7);
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test7 == test7);
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test7 == test6);
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test7 != test5);
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("test6 = test1");
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test6=test1;
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test6);
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test6 != test7);
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test6 == test1);
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test6 == test6);
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// A class which exposes constructors that are implemented in terms of the POSIX parsing code.
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass POSIXLocale : public Locale
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    POSIXLocale(const UnicodeString& l)
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        :Locale()
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      char *ch;
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ch = new char[l.length() + 1];
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ch[l.extract(0, 0x7fffffff, ch, "")] = 0;
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      setFromPOSIXID(ch);
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete [] ch;
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    POSIXLocale(const char *l)
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        :Locale()
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setFromPOSIXID(l);
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestPOSIXParsing()
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    POSIXLocale  test1("ab_AB");
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    POSIXLocale  test2(UnicodeString("ab_AB"));
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test3("ab","AB");
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    POSIXLocale test4("ab_AB_Antares");
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    POSIXLocale test5(UnicodeString("ab_AB_Antares"));
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test6("ab", "AB", "Antares");
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test1);
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test2);
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test3);
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test4);
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test5);
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_dumpLocale(test6);
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test1 == test1);
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test1 == test2);
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test2 == test3);
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test3 == test1);
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test4 == test5);
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test5 == test6);
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test6 == test4);
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test1 != test4);
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test5 != test3);
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(test5 != test2);
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t hash1 = test1.hashCode();
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t hash2 = test2.hashCode();
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t hash3 = test3.hashCode();
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(hash1 == hash2);
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(hash2 == hash3);
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test_assert(hash3 == hash1);
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestGetAvailableLocales()
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t locCount = 0;
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const Locale* locList = Locale::getAvailableLocales(locCount);
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (locCount == 0)
6836d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("getAvailableLocales() returned an empty list!");
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString("Number of locales returned = ") + locCount);
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString temp;
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(int32_t i = 0; i < locCount; ++i)
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(locList[i].getName());
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // I have no idea how to test this function...
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This test isn't applicable anymore - getISO3Language is
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// independent of the data directory
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestDataDirectory()
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char            oldDirectory[80];
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char*     temp;
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode       err = U_ZERO_ERROR;
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString   testValue;
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = Locale::getDataDirectory();
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcpy(oldDirectory, temp);
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("oldDirectory = ") + oldDirectory);
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale  test(Locale::US);
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test.getISO3Language(testValue);
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("first fetch of language retrieved " + testValue);
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (testValue != "eng")
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Initial check of ISO3 language failed: expected \"eng\", got \"" + testValue + "\"");
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char *path;
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        path=IntlTest::getTestDirectory();
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale::setDataDirectory( path );
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test.getISO3Language(testValue);
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("second fetch of language retrieved " + testValue);
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (testValue != "xxx")
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("setDataDirectory() failed: expected \"xxx\", got \"" + testValue + "\"");
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale::setDataDirectory(oldDirectory);
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test.getISO3Language(testValue);
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("third fetch of language retrieved " + testValue);
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (testValue != "eng")
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("get/setDataDirectory() failed: expected \"eng\", got \"" + testValue + "\"");
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//===========================================================
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::doTestDisplayNames(Locale& displayLocale, int32_t compareIndex) {
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString   temp;
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i = 0; i <= MAX_LOCALES; i++) {
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale testLocale("");
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (rawData[SCRIPT][i] && rawData[SCRIPT][i][0] != 0) {
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testLocale = Locale(rawData[LANG][i], rawData[SCRIPT][i], rawData[CTRY][i], rawData[VAR][i]);
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testLocale = Locale(rawData[LANG][i], rawData[CTRY][i], rawData[VAR][i]);
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("  Testing " + (temp=testLocale.getName()) + "...");
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  testLang;
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  testScript;
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  testCtry;
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  testVar;
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  testName;
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testLocale.getDisplayLanguage(displayLocale, testLang);
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testLocale.getDisplayScript(displayLocale, testScript);
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testLocale.getDisplayCountry(displayLocale, testCtry);
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testLocale.getDisplayVariant(displayLocale, testVar);
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testLocale.getDisplayName(displayLocale, testName);
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  expectedLang;
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  expectedScript;
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  expectedCtry;
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  expectedVar;
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString  expectedName;
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedLang = dataTable[compareIndex][i];
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (expectedLang.length() == 0)
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectedLang = dataTable[DLANG_EN][i];
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedScript = dataTable[compareIndex + 1][i];
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (expectedScript.length() == 0)
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectedScript = dataTable[DSCRIPT_EN][i];
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedCtry = dataTable[compareIndex + 2][i];
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (expectedCtry.length() == 0)
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectedCtry = dataTable[DCTRY_EN][i];
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedVar = dataTable[compareIndex + 3][i];
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (expectedVar.length() == 0)
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectedVar = dataTable[DVAR_EN][i];
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedName = dataTable[compareIndex + 4][i];
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (expectedName.length() == 0)
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectedName = dataTable[DNAME_EN][i];
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testLang != expectedLang)
7866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Display language (" + UnicodeString(displayLocale.getName()) + ") of (" + UnicodeString(testLocale.getName()) + ") got " + testLang + " expected " + expectedLang);
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testScript != expectedScript)
7886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Display script (" + UnicodeString(displayLocale.getName()) + ") of (" + UnicodeString(testLocale.getName()) + ") got " + testScript + " expected " + expectedScript);
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testCtry != expectedCtry)
7906d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Display country (" + UnicodeString(displayLocale.getName()) + ") of (" + UnicodeString(testLocale.getName()) + ") got " + testCtry + " expected " + expectedCtry);
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testVar != expectedVar)
7926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Display variant (" + UnicodeString(displayLocale.getName()) + ") of (" + UnicodeString(testLocale.getName()) + ") got " + testVar + " expected " + expectedVar);
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testName != expectedName)
7946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Display name (" + UnicodeString(displayLocale.getName()) + ") of (" + UnicodeString(testLocale.getName()) + ") got " + testName + " expected " + expectedName);
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------------
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// table of valid data
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------------
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::setUpDataTable()
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (dataTable == 0) {
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataTable = new UnicodeString*[33];
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int32_t i = 0; i < 33; i++) {
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dataTable[i] = new UnicodeString[8];
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (int32_t j = 0; j < 8; j++) {
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                dataTable[i][j] = CharsToUnicodeString(rawData[i][j]);
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ====================
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4011756 4011380
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestISO3Fallback()
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale test("xx", "YY");
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char * result;
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = test.getISO3Language();
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Conform to C API usage
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!result || (result[0] != 0))
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("getISO3Language() on xx_YY returned " + UnicodeString(result) + " instead of \"\"");
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = test.getISO3Country();
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!result || (result[0] != 0))
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("getISO3Country() on xx_YY returned " + UnicodeString(result) + " instead of \"\"");
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4106155 4118587
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestGetLangsAndCountries()
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // It didn't seem right to just do an exhaustive test of everything here, so I check
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // for the following things:
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // 1) Does each list have the right total number of entries?
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // 2) Does each list contain certain language and country codes we think are important
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //     (the G7 countries, plus a couple others)?
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // 3) Does each list have every entry formatted correctly? (i.e., two characters,
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //     all lower case for the language codes, all upper case for the country codes)
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // 4) Is each list in sorted order?
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t testCount = 0;
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char * const * test = Locale::getISOLanguages();
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char spotCheck1[ ][4] = { "en", "es", "fr", "de", "it",
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "ja", "ko", "zh", "th", "he",
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "id", "iu", "ug", "yi", "za" };
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(testCount = 0;test[testCount];testCount++)
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ;
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* TODO: Change this test to be more like the cloctst version? */
870ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    if (testCount != 595)
871ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        errln("Expected getISOLanguages() to return 595 languages; it returned %d", testCount);
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0; i < 15; i++) {
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t j;
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (j = 0; j < testCount; j++)
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              if (uprv_strcmp(test[j],spotCheck1[i])== 0)
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    break;
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (j == testCount || (uprv_strcmp(test[j],spotCheck1[i])!=0))
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("Couldn't find " + (UnicodeString)spotCheck1[i] + " in language list.");
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < testCount; i++) {
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString testee(test[i],"");
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString lc(test[i],"");
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testee != lc.toLower())
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(lc + " is not all lower case.");
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (testee.length() != 2) && (testee.length() != 3))
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(testee + " is not two or three characters long.");
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (i > 0 && testee.compare(test[i - 1]) <= 0)
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(testee + " appears in an out-of-order position in the list.");
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test = Locale::getISOCountries();
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString spotCheck2 [] = { "US", "CA", "GB", "FR", "DE",
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "IT", "JP", "KR", "CN", "TW",
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "TH" };
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t spot2Len = 11;
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(testCount=0;test[testCount];testCount++)
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ;
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
9018393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (testCount != 249){
9028393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        errln("Expected getISOCountries to return 249 countries; it returned %d", testCount);
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else {
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0; i < spot2Len; i++) {
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t j;
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (j = 0; j < testCount; j++)
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              {
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UnicodeString testee(test[j],"");
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (testee == spotCheck2[i])
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    break;
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              }
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UnicodeString testee(test[j],"");
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (j == testCount || testee != spotCheck2[i])
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("Couldn't find " + spotCheck2[i] + " in country list.");
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
918b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (i = 0; i < testCount; i++) {
919b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UnicodeString testee(test[i],"");
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString uc(test[i],"");
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testee != uc.toUpper())
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(testee + " is not all upper case.");
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testee.length() != 2)
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(testee + " is not two characters long.");
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (i > 0 && testee.compare(test[i - 1]) <= 0)
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(testee + " appears in an out-of-order position in the list.");
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
928b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
929b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // This getAvailableLocales and getISO3Language
930b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {
931b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t numOfLocales;
932b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        Locale  enLoc ("en");
933b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        const Locale *pLocales = Locale::getAvailableLocales(numOfLocales);
934b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
935b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        for (int i = 0; i < numOfLocales; i++) {
936b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            const Locale    &loc(pLocales[i]);
937b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            UnicodeString   name;
938b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            char        szName[200];
939b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
940b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            loc.getDisplayName (enLoc, name);
941b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            name.extract (0, 200, szName, sizeof(szName));
942b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
943b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (strlen(loc.getISO3Language()) == 0) {
944b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                errln("getISO3Language() returned an empty string for: " + name);
945b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
946b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
947b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4118587
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestSimpleDisplayNames()
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // This test is different from TestDisplayNames because TestDisplayNames checks
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // fallback behavior, combination of language and country names to form locale
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // names, and other stuff like that.  This test just checks specific language
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // and country codes to make sure we have the correct names for them.
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char languageCodes[] [4] = { "he", "id", "iu", "ug", "yi", "za" };
9618393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    UnicodeString languageNames [] = { "Hebrew", "Indonesian", "Inuktitut", "Uyghur", "Yiddish",
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               "Zhuang" };
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i = 0; i < 6; i++) {
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString test;
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale l(languageCodes[i], "", "");
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        l.getDisplayLanguage(Locale::getUS(), test);
968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (test != languageNames[i])
9696d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Got wrong display name for " + UnicodeString(languageCodes[i]) + ": Expected \"" +
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  languageNames[i] + "\", got \"" + test + "\".");
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4118595
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestUninstalledISO3Names()
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // This test checks to make sure getISO3Language and getISO3Country work right
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // even for locales that are not installed.
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char iso2Languages [][4] = {     "am", "ba", "fy", "mr", "rn",
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                        "ss", "tw", "zu" };
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char iso3Languages [][5] = {     "amh", "bak", "fry", "mar", "run",
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                        "ssw", "twi", "zul" };
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < 8; i++) {
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      UErrorCode err = U_ZERO_ERROR;
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      UnicodeString test;
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale l(iso2Languages[i], "", "");
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        test = l.getISO3Language();
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if((test != iso3Languages[i]) || U_FAILURE(err))
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Got wrong ISO3 code for " + UnicodeString(iso2Languages[i]) + ": Expected \"" +
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    iso3Languages[i] + "\", got \"" + test + "\"." + UnicodeString(u_errorName(err)));
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char iso2Countries [][4] = {     "AF", "BW", "KZ", "MO", "MN",
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                        "SB", "TC", "ZW" };
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char iso3Countries [][4] = {     "AFG", "BWA", "KAZ", "MAC", "MNG",
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                        "SLB", "TCA", "ZWE" };
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < 8; i++) {
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      UErrorCode err = U_ZERO_ERROR;
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale l("", iso2Countries[i], "");
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString test(l.getISO3Country(), "");
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (test != iso3Countries[i])
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Got wrong ISO3 code for " + UnicodeString(iso2Countries[i]) + ": Expected \"" +
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UnicodeString(iso3Countries[i]) + "\", got \"" + test + "\"." + u_errorName(err));
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4092475
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * I could not reproduce this bug.  I'm pretty convinced it was fixed with the
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * big locale-data reorg of 10/28/97.  The lookup logic for language and country
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * display names was also changed at that time in that check-in.    --rtg 3/20/98
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestAtypicalLocales()
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale localesToTest [] = { Locale("de", "CA"),
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  Locale("ja", "ZA"),
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   Locale("ru", "MX"),
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   Locale("en", "FR"),
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   Locale("es", "DE"),
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   Locale("", "HR"),
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   Locale("", "SE"),
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   Locale("", "DO"),
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   Locale("", "BE") };
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString englishDisplayNames [] = { "German (Canada)",
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Japanese (South Africa)",
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Russian (Mexico)",
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "English (France)",
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Spanish (Germany)",
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Croatia",
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Sweden",
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Dominican Republic",
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Belgium" };
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString frenchDisplayNames []= { "allemand (Canada)",
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "japonais (Afrique du Sud)",
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "russe (Mexique)",
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "anglais (France)",
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "espagnol (Allemagne)",
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "Croatie",
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    CharsToUnicodeString("Su\\u00E8de"),
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    CharsToUnicodeString("R\\u00E9publique dominicaine"),
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "Belgique" };
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString spanishDisplayNames [] = {
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     CharsToUnicodeString("alem\\u00E1n (Canad\\u00E1)"),
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     CharsToUnicodeString("japon\\u00E9s (Sud\\u00E1frica)"),
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     CharsToUnicodeString("ruso (M\\u00E9xico)"),
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     CharsToUnicodeString("ingl\\u00E9s (Francia)"),
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     CharsToUnicodeString("espa\\u00F1ol (Alemania)"),
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Croacia",
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Suecia",
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     CharsToUnicodeString("Rep\\u00FAblica Dominicana"),
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     CharsToUnicodeString("B\\u00E9lgica") };
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // De-Anglicizing root required the change from
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // English display names to ISO Codes - ram 2003/09/26
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString invDisplayNames [] = { "German (Canada)",
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Japanese (South Africa)",
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Russian (Mexico)",
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "English (France)",
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Spanish (Germany)",
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Croatia",
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Sweden",
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Dominican Republic",
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "Belgium" };
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale saveLocale;
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale::setDefault(Locale::getUS(), status);
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < 9; ++i) {
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString name;
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        localesToTest[i].getDisplayName(Locale::getUS(), name);
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(name);
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (name != englishDisplayNames[i])
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
10846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Lookup in English failed: expected \"" + englishDisplayNames[i]
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + "\", got \"" + name + "\"");
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("Locale name was-> " + (name=localesToTest[i].getName()));
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < 9; i++) {
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString name;
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        localesToTest[i].getDisplayName(Locale("es", "ES"), name);
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(name);
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (name != spanishDisplayNames[i])
10956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Lookup in Spanish failed: expected \"" + spanishDisplayNames[i]
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + "\", got \"" + name + "\"");
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < 9; i++) {
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString name;
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        localesToTest[i].getDisplayName(Locale::getFrance(), name);
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(name);
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (name != frenchDisplayNames[i])
11046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Lookup in French failed: expected \"" + frenchDisplayNames[i]
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + "\", got \"" + name + "\"");
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < 9; i++) {
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString name;
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        localesToTest[i].getDisplayName(Locale("inv", "IN"), name);
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(name + " Locale fallback to be, and data fallback to root");
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (name != invDisplayNames[i])
11136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Lookup in INV failed: expected \"" + prettify(invDisplayNames[i])
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + "\", got \"" + prettify(name) + "\"");
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        localesToTest[i].getDisplayName(Locale("inv", "BD"), name);
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(name + " Data fallback to root");
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (name != invDisplayNames[i])
11186d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Lookup in INV failed: expected \"" + prettify(invDisplayNames[i])
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        + "\", got \"" + prettify(name )+ "\"");
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale::setDefault(saveLocale, status);
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4135752
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This would be better tested by the LocaleDataTest.  Will move it when I
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * get the LocaleDataTest working again.
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestThaiCurrencyFormat()
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *thaiCurrency = (DecimalFormat*)NumberFormat::createCurrencyInstance(
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    Locale("th", "TH"), status);
1137f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    UnicodeString posPrefix("THB", 3, US_INV);  // per cldrbug 7618
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString temp;
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status) || !thaiCurrency)
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
11426d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("Couldn't get th_TH currency -> " + UnicodeString(u_errorName(status)));
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1145f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if (thaiCurrency->getPositivePrefix(temp) != posPrefix)
1146f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        errln("Thai currency prefix wrong: expected THB, got \"" +
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        thaiCurrency->getPositivePrefix(temp) + "\"");
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (thaiCurrency->getPositiveSuffix(temp) != "")
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Thai currency suffix wrong: expected \"\", got \"" +
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        thaiCurrency->getPositiveSuffix(temp) + "\"");
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete thaiCurrency;
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4122371
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Confirm that Euro support works.  This test is pretty rudimentary; all it does
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * is check that any locales with the EURO variant format a number using the
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Euro currency symbol.
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ASSUME: All locales encode the Euro character "\u20AC".
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * If this is changed to use the single-character Euro symbol, this
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * test must be updated.
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestEuroSupport()
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar euro = 0x20ac;
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UnicodeString EURO_CURRENCY(&euro, 1, 1); // Look for this UnicodeString in formatted Euro currency
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* localeArr[] = {
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "ca_ES",
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "de_AT",
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "de_DE",
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "de_LU",
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "el_GR",
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "en_BE",
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "en_IE",
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "en_GB_EURO",
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "en_US_EURO",
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "es_ES",
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "eu_ES",
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "fi_FI",
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "fr_BE",
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "fr_FR",
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "fr_LU",
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "ga_IE",
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "gl_ES",
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "it_IT",
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "nl_BE",
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "nl_NL",
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "pt_PT",
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            NULL
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        };
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char** locales = localeArr;
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString temp;
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (;*locales!=NULL;locales++) {
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale loc (*locales);
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString temp;
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        NumberFormat *nf = NumberFormat::createCurrencyInstance(loc, status);
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString pos;
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dataerrln("Error calling NumberFormat::createCurrencyInstance(%s)", *locales);
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        nf->format(271828.182845, pos);
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString neg;
1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        nf->format(-271828.182845, neg);
1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (pos.indexOf(EURO_CURRENCY) >= 0 &&
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            neg.indexOf(EURO_CURRENCY) >= 0) {
1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("Ok: " + (temp=loc.getName()) +
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ": " + pos + " / " + neg);
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Fail: " + (temp=loc.getName()) +
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                " formats without " + EURO_CURRENCY +
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ": " + pos + " / " + neg +
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "\n*** THIS FAILURE MAY ONLY MEAN THAT LOCALE DATA HAS CHANGED ***");
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete nf;
1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString dollarStr("USD", ""), euroStr("EUR", ""), genericStr((UChar)0x00a4), resultStr;
1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar tmp[4];
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_forLocale("en_US", tmp, 4, &status);
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultStr.setTo(tmp);
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (dollarStr != resultStr) {
12376d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail: en_US didn't return USD - %s", u_errorName(status));
1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_forLocale("en_US_EURO", tmp, 4, &status);
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultStr.setTo(tmp);
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (euroStr != resultStr) {
12426d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail: en_US_EURO didn't return EUR - %s", u_errorName(status));
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_forLocale("en_GB_EURO", tmp, 4, &status);
1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultStr.setTo(tmp);
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (euroStr != resultStr) {
12476d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail: en_GB_EURO didn't return EUR - %s", u_errorName(status));
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_forLocale("en_US_PREEURO", tmp, 4, &status);
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultStr.setTo(tmp);
1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (dollarStr != resultStr) {
12526d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail: en_US_PREEURO didn't fallback to en_US - %s", u_errorName(status));
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucurr_forLocale("en_US_Q", tmp, 4, &status);
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultStr.setTo(tmp);
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (dollarStr != resultStr) {
12576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail: en_US_Q didn't fallback to en_US - %s", u_errorName(status));
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t invalidLen = ucurr_forLocale("en_QQ", tmp, 4, &status);
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (invalidLen || U_SUCCESS(status)) {
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: en_QQ didn't return NULL");
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1263ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert
1264ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    // The currency keyword value is as long as the destination buffer.
1265ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    // It should detect the overflow internally, and default to the locale's currency.
1266ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    tmp[0] = u'¤';
1267ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    status = U_ZERO_ERROR;
1268ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    int32_t length = ucurr_forLocale("en_US@currency=euro", tmp, 4, &status);
1269ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    if (U_FAILURE(status) || dollarStr != UnicodeString(tmp, length)) {
1270ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        if (U_SUCCESS(status) && tmp[0] == u'¤') {
1271ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert            errln("Fail: ucurr_forLocale(en_US@currency=euro) succeeded without writing output");
1272ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        } else {
1273ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert            errln("Fail: ucurr_forLocale(en_US@currency=euro) != USD - %s", u_errorName(status));
1274ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        }
1275ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4139504
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * toString() doesn't work with language_VARIANT.
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestToString() {
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale DATA [] = {
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale("xx", "", ""),
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale("", "YY", ""),
1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale("", "", "ZZ"),
1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale("xx", "YY", ""),
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale("xx", "", "ZZ"),
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale("", "YY", "ZZ"),
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale("xx", "YY", "ZZ"),
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char DATA_S [][20] = {
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "xx",
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "_YY",
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "__ZZ",
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "xx_YY",
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "xx__ZZ",
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "_YY_ZZ",
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "xx_YY_ZZ",
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i=0; i < 7; ++i) {
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      const char *name;
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      name = DATA[i].getName();
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if (strcmp(name, DATA_S[i]) != 0)
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Fail: Locale.getName(), got:" + UnicodeString(name) + ", expected: " + DATA_S[i]);
1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("Pass: Locale.getName(), got:" + UnicodeString(name) );
1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4139940
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Couldn't reproduce this bug -- probably was fixed earlier.
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ORIGINAL BUG REPORT:
1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * -- basically, hungarian for monday shouldn't have an \u00f4
1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (o circumflex)in it instead it should be an o with 2 inclined
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (right) lines over it..
1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * You may wonder -- why do all this -- why not just add a line to
1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * LocaleData?  Well, I could see by inspection that the locale file had the
1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * right character in it, so I wanted to check the rest of the pipeline -- a
1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * very remote possibility, but I wanted to be sure.  The other possibility
1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * is that something is wrong with the font mapping subsystem, but we can't
1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * test that here.
1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::Test4139940()
1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale mylocale("hu", "", "");
1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate mydate = date(98,3,13); // A Monday
1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat df_full("EEEE", mylocale, status);
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
134550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        dataerrln(UnicodeString("Could not create SimpleDateFormat object for locale hu. Error: ") + UnicodeString(u_errorName(status)));
1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str;
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos(FieldPosition::DONT_CARE);
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df_full.format(mydate, str, pos);
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Make sure that o circumflex (\u00F4) is NOT there, and
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // o double acute (\u0151) IS.
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar ocf = 0x00f4;
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar oda = 0x0151;
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (str.indexOf(oda) < 0 || str.indexOf(ocf) >= 0) {
135627f654740f2a26ad62a5c155af9199af9e69b889claireho      /* If the default locale is "th" this test will fail because of the buddhist calendar. */
135727f654740f2a26ad62a5c155af9199af9e69b889claireho      if (strcmp(Locale::getDefault().getLanguage(), "th") != 0) {
135827f654740f2a26ad62a5c155af9199af9e69b889claireho        errln("Fail: Monday in Hungarian is wrong - oda's index is %d and ocf's is %d",
135927f654740f2a26ad62a5c155af9199af9e69b889claireho              str.indexOf(oda), str.indexOf(ocf));
136027f654740f2a26ad62a5c155af9199af9e69b889claireho      } else {
136127f654740f2a26ad62a5c155af9199af9e69b889claireho        logln(UnicodeString("An error is produce in buddhist calendar."));
136227f654740f2a26ad62a5c155af9199af9e69b889claireho      }
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      logln(UnicodeString("String is: ") + str );
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUDate
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::date(int32_t y, int32_t m, int32_t d, int32_t hr, int32_t min, int32_t sec)
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal = Calendar::createInstance(status);
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (cal == 0)
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0.0;
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->clear();
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->set(1900 + y, m, d, hr, min, sec); // Add 1900 to follow java.util.Date protocol
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate dt = cal->getTime(status);
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status))
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0.0;
1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return dt;
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4143951
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Russian first day of week should be Monday. Confirmed.
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::Test4143951()
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal = Calendar::createInstance(Locale("ru", "", ""), status);
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)) {
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if (cal->getFirstDayOfWeek(status) != UCAL_MONDAY) {
13956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru          dataerrln("Fail: First day of week in Russia should be Monday");
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4147315
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * java.util.Locale.getISO3Country() works wrong for non ISO-3166 codes.
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Should throw an exception for unknown locales
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::Test4147315()
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UnicodeString temp;
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Try with codes that are the wrong length but happen to match text
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // at a valid offset in the mapping table
14148393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    Locale locale("xxx", "CCC");
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *result = locale.getISO3Country();
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Change to conform to C api usage
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if((result==NULL)||(result[0] != 0))
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("ERROR: getISO3Country() returns: " + UnicodeString(result,"") +
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                " for locale '" + (temp=locale.getName()) + "' rather than exception" );
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4147317
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * java.util.Locale.getISO3Language() works wrong for non ISO-3166 codes.
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Should throw an exception for unknown locales
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::Test4147317()
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString temp;
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Try with codes that are the wrong length but happen to match text
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // at a valid offset in the mapping table
14358393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    Locale locale("xxx", "CCC");
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *result = locale.getISO3Language();
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Change to conform to C api usage
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if((result==NULL)||(result[0] != 0))
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("ERROR: getISO3Language() returns: " + UnicodeString(result,"") +
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                " for locale '" + (temp=locale.getName()) + "' rather than exception" );
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4147552
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::Test4147552()
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale locales [] = {     Locale("no", "NO"),
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            Locale("no", "NO", "B"),
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             Locale("no", "NO", "NY")
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString edn("Norwegian (Norway, B)");
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString englishDisplayNames [] = {
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                "Norwegian (Norway)",
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                 edn,
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                 // "Norwegian (Norway,B)",
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                 //"Norwegian (Norway,NY)"
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                 "Norwegian (Norway, NY)"
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString ndn("norsk (Norge, B");
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString norwegianDisplayNames [] = {
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                "norsk (Norge)",
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                "norsk (Norge, B)",
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                //ndn,
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                 "norsk (Noreg, NY)"
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                 //"Norsk (Noreg, Nynorsk)"
1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale saveLocale;
1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale::setDefault(Locale::getEnglish(), status);
1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i = 0; i < 3; ++i) {
1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale loc = locales[i];
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString temp;
1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (loc.getDisplayName(temp) != englishDisplayNames[i])
14806d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru           dataerrln("English display-name mismatch: expected " +
1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   englishDisplayNames[i] + ", got " + loc.getDisplayName(temp));
1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (loc.getDisplayName(loc, temp) != norwegianDisplayNames[i])
14836d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Norwegian display-name mismatch: expected " +
1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   norwegianDisplayNames[i] + ", got " +
1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   loc.getDisplayName(loc, temp));
1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale::setDefault(saveLocale, status);
1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestVariantParsing()
1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale en_US_custom("en", "US", "De Anza_Cupertino_California_United States_Earth");
1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString dispName("English (United States, DE ANZA_CUPERTINO_CALIFORNIA_UNITED STATES_EARTH)");
1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString dispVar("DE ANZA_CUPERTINO_CALIFORNIA_UNITED STATES_EARTH");
1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString got;
1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    en_US_custom.getDisplayVariant(Locale::getUS(), got);
1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(got != dispVar) {
1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: getDisplayVariant()");
1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Wanted: " + dispVar);
1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Got   : " + got);
1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    en_US_custom.getDisplayName(Locale::getUS(), got);
1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(got != dispName) {
15096d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("FAIL: getDisplayName()");
15106d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("Wanted: " + dispName);
15116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("Got   : " + got);
1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale shortVariant("fr", "FR", "foo");
1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    shortVariant.getDisplayVariant(got);
1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(got != "FOO") {
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: getDisplayVariant()");
1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Wanted: foo");
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Got   : " + got);
1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale bogusVariant("fr", "FR", "_foo");
1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bogusVariant.getDisplayVariant(got);
1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(got != "FOO") {
1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: getDisplayVariant()");
1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Wanted: foo");
1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Got   : " + got);
1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale bogusVariant2("fr", "FR", "foo_");
1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bogusVariant2.getDisplayVariant(got);
1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(got != "FOO") {
1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: getDisplayVariant()");
1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Wanted: foo");
1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Got   : " + got);
1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale bogusVariant3("fr", "FR", "_foo_");
1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bogusVariant3.getDisplayVariant(got);
1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(got != "FOO") {
1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: getDisplayVariant()");
1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Wanted: foo");
1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Got   : " + got);
1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4105828
1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Currency symbol in zh is wrong.  We will test this at the NumberFormat
1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * end to test the whole pipe.
1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::Test4105828()
1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale LOC [] = { Locale::getChinese(),  Locale("zh", "CN", ""),
1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     Locale("zh", "TW", ""), Locale("zh", "HK", "") };
1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i = 0; i < 4; ++i) {
1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        NumberFormat *fmt = NumberFormat::createPercentInstance(LOC[i], status);
1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)) {
15676d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Couldn't create NumberFormat - %s", u_errorName(status));
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString result;
157164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        FieldPosition pos(FieldPosition::DONT_CARE);
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt->format((int32_t)1, result, pos);
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString temp;
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(result != "100%") {
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("Percent for ") + LOC[i].getDisplayName(temp) + " should be 100%, got " + result);
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fmt;
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Tests setBogus and isBogus APIs for Locale
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Jitterbug 1735
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestSetIsBogus() {
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale l("en_US");
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    l.setToBogus();
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(l.isBogus() != TRUE) {
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("After setting bogus, didn't return TRUE");
1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    l = "en_US"; // This should reset bogus
1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(l.isBogus() != FALSE) {
1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("After resetting bogus, didn't return FALSE");
1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestKeywordVariants(void) {
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *localeID;
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *expectedLocaleID;
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //const char *expectedLocaleIDNoKeywords;
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //const char *expectedCanonicalID;
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *expectedKeywords[10];
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t numKeywords;
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode expectedStatus;
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } testCases[] = {
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE@  currency = euro; C o ll A t i o n   = Phonebook   ; C alen dar = buddhist   ",
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE@calendar=buddhist;collation=Phonebook;currency=euro",
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //"de_DE",
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //"de_DE@calendar=buddhist;collation=Phonebook;currency=euro",
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {"calendar", "collation", "currency"},
1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            3,
1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            U_ZERO_ERROR
1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE@euro",
1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE@euro",
1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //"de_DE",
1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //"de_DE@currency=EUR",
1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {"","","","","","",""},
1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            0,
1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            U_INVALID_FORMAT_ERROR /* must have '=' after '@' */
1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0, j = 0;
1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *result = NULL;
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringEnumeration *keywords;
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t keyCount = 0;
1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *keyword = NULL;
1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UnicodeString *keywordString;
1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t keywordLen = 0;
1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
16398de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for(i = 0; i < UPRV_LENGTHOF(testCases); i++) {
1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale l(testCases[i].localeID);
1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        keywords = l.createKeywords(status);
1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status != testCases[i].expectedStatus) {
1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err("Expected to get status %s. Got %s instead\n",
1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_errorName(testCases[i].expectedStatus), u_errorName(status));
1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(keywords) {
1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if((keyCount = keywords->count(status)) != testCases[i].numKeywords) {
1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                err("Expected to get %i keywords, got %i\n", testCases[i].numKeywords, keyCount);
1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(keyCount) {
1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                for(j = 0;;) {
1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if((j&1)==0) {
1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        if((keyword = keywords->next(&keywordLen, status)) == NULL) {
1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            break;
1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        }
1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        if(strcmp(keyword, testCases[i].expectedKeywords[j]) != 0) {
1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            err("Expected to get keyword value %s, got %s\n", testCases[i].expectedKeywords[j], keyword);
1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        }
1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    } else {
1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        if((keywordString = keywords->snext(status)) == NULL) {
1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            break;
1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        }
1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        if(*keywordString != UnicodeString(testCases[i].expectedKeywords[j], "")) {
1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            err("Expected to get keyword UnicodeString %s, got %s\n", testCases[i].expectedKeywords[j], keyword);
1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        }
1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    j++;
1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if(j == keyCount / 2) {
1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        // replace keywords with a clone of itself
1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        StringEnumeration *k2 = keywords->clone();
1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        if(k2 == NULL || keyCount != k2->count(status)) {
1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            errln("KeywordEnumeration.clone() failed");
1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        } else {
1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            delete keywords;
1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            keywords = k2;
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        }
1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                keywords->reset(status); // Make sure that reset works.
1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                for(j = 0;;) {
1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if((keyword = keywords->next(&keywordLen, status)) == NULL) {
1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        break;
1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if(strcmp(keyword, testCases[i].expectedKeywords[j]) != 0) {
1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        err("Expected to get keyword value %s, got %s\n", testCases[i].expectedKeywords[j], keyword);
1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    j++;
1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete keywords;
1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = l.getName();
1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(uprv_strcmp(testCases[i].expectedLocaleID, result) != 0) {
1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err("Expected to get \"%s\" from \"%s\". Got \"%s\" instead\n",
1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                testCases[i].expectedLocaleID, testCases[i].localeID, result);
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestKeywordVariantParsing(void) {
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *localeID;
1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *keyword;
1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *expectedValue;
1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } testCases[] = {
1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_DE@  C o ll A t i o n   = Phonebook   ", "collation", "Phonebook" },
1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_DE", "collation", ""},
1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_DE@collation= PHONEBOOK", "collation", "PHONEBOOK" },
1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_DE@ currency = euro   ; CoLLaTion   = PHONEBOOk   ", "collation", "PHONEBOOk" },
1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0;
1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultLen = 0;
1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[256];
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17258de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for(i = 0; i < UPRV_LENGTHOF(testCases); i++) {
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *buffer = 0;
1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale l(testCases[i].localeID);
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultLen = l.getKeywordValue(testCases[i].keyword, buffer, 256, status);
172959d709d503bab6e2b61931737e662dd293b40578ccornelius        (void)resultLen;  // Suppress unused variable warning.
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(uprv_strcmp(testCases[i].expectedValue, buffer) != 0) {
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err("Expected to extract \"%s\" from \"%s\" for keyword \"%s\". Got \"%s\" instead\n",
1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                testCases[i].expectedValue, testCases[i].localeID, testCases[i].keyword, buffer);
1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
173850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoLocaleTest::TestSetKeywordValue(void) {
173950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    static const struct {
174050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char *keyword;
174150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char *value;
174250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    } testCases[] = {
174350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "collation", "phonebook" },
174450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "currency", "euro" },
174550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "calendar", "buddhist" }
174650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    };
174750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
174850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UErrorCode status = U_ZERO_ERROR;
174950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
175050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t i = 0;
175150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t resultLen = 0;
175250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    char buffer[256];
175350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
175450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    Locale l(Locale::getGerman());
175550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
17568de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for(i = 0; i < UPRV_LENGTHOF(testCases); i++) {
175750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        l.setKeywordValue(testCases[i].keyword, testCases[i].value, status);
175850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(U_FAILURE(status)) {
175950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            err("FAIL: Locale::setKeywordValue failed - %s\n", u_errorName(status));
176050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
176150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
176250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        *buffer = 0;
176350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        resultLen = l.getKeywordValue(testCases[i].keyword, buffer, 256, status);
176459d709d503bab6e2b61931737e662dd293b40578ccornelius        (void)resultLen;  // Suppress unused variable warning.
176550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(uprv_strcmp(testCases[i].value, buffer) != 0) {
176650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            err("Expected to extract \"%s\" for keyword \"%s\". Got \"%s\" instead\n",
176750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                testCases[i].value, testCases[i].keyword, buffer);
176850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
176950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
177050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
177150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
177250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid
1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocaleTest::TestGetBaseName(void) {
1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *localeID;
1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *baseName;
1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } testCases[] = {
1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_DE@  C o ll A t i o n   = Phonebook   ", "de_DE" },
1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de@currency = euro; CoLLaTion   = PHONEBOOk", "de" },
17801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "ja@calendar = buddhist", "ja" },
17811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "de-u-co-phonebk", "de"}
1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0;
1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    for(i = 0; i < UPRV_LENGTHOF(testCases); i++) {
1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale loc(testCases[i].localeID);
1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strcmp(testCases[i].baseName, loc.getBaseName())) {
1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("For locale \"%s\" expected baseName \"%s\", but got \"%s\"",
1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                testCases[i].localeID, testCases[i].baseName, loc.getBaseName());
1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
17941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
17951b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // Verify that adding a keyword to an existing Locale doesn't change the base name.
17961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    UErrorCode status = U_ZERO_ERROR;
17971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    Locale loc2("en-US");
17981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if (strcmp("en_US", loc2.getBaseName())) {
17991b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        errln("%s:%d Expected \"en_US\", got \"%s\"", __FILE__, __LINE__, loc2.getBaseName());
18001b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
18011b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    loc2.setKeywordValue("key", "value", status);
18021b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if (strcmp("en_US@key=value", loc2.getName())) {
18031b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        errln("%s:%d Expected \"en_US@key=value\", got \"%s\"", __FILE__, __LINE__, loc2.getName());
18041b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
18051b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if (strcmp("en_US", loc2.getBaseName())) {
18061b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        errln("%s:%d Expected \"en_US\", got \"%s\"", __FILE__, __LINE__, loc2.getBaseName());
18071b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Compare two locale IDs.  If they are equal, return 0.  If `string'
1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * starts with `prefix' plus an additional element, that is, string ==
1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * prefix + '_' + x, then return 1.  Otherwise return a value < 0.
1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool _loccmp(const char* string, const char* prefix) {
1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t slen = (int32_t)strlen(string),
1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            plen = (int32_t)strlen(prefix);
1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t c = uprv_strncmp(string, prefix, plen);
1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* 'root' is "less than" everything */
1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (uprv_strcmp(prefix, "root") == 0) {
1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (uprv_strcmp(string, "root") == 0) ? 0 : 1;
1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c) return -1; /* mismatch */
1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (slen == plen) return 0;
1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (string[plen] == '_') return 1;
1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return -2; /* false match, e.g. "en_USX" cmp "en_US" */
1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Check the relationship between requested locales, and report problems.
1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The caller specifies the expected relationships between requested
1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and valid (expReqValid) and between valid and actual (expValidActual).
1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Possible values are:
1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * "gt" strictly greater than, e.g., en_US > en
1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * "ge" greater or equal,      e.g., en >= en
1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * "eq" equal,                 e.g., en == en
1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::_checklocs(const char* label,
1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            const char* req,
1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            const Locale& validLoc,
1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            const Locale& actualLoc,
1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            const char* expReqValid,
1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            const char* expValidActual) {
1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* valid = validLoc.getName();
1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* actual = actualLoc.getName();
1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t reqValid = _loccmp(req, valid);
1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t validActual = _loccmp(valid, actual);
1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (((0 == uprv_strcmp(expReqValid, "gt") && reqValid > 0) ||
1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         (0 == uprv_strcmp(expReqValid, "ge") && reqValid >= 0) ||
1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         (0 == uprv_strcmp(expReqValid, "eq") && reqValid == 0)) &&
1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ((0 == uprv_strcmp(expValidActual, "gt") && validActual > 0) ||
1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         (0 == uprv_strcmp(expValidActual, "ge") && validActual >= 0) ||
1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         (0 == uprv_strcmp(expValidActual, "eq") && validActual == 0))) {
1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("%s; req=%s, valid=%s, actual=%s",
1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              label, req, valid, actual);
1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
18576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("FAIL: %s; req=%s, valid=%s, actual=%s.  Require (R %s V) and (V %s A)",
1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              label, req, valid, actual,
1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              expReqValid, expValidActual);
1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestGetLocale(void) {
1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE
1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *req;
1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale valid, actual, reqLoc;
1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Calendar
1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
18701b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    {
18711b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        UErrorCode ec = U_ZERO_ERROR;  // give each resource type its own error code
18721b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        req = "en_US_BROOKLYN";
18731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        Calendar* cal = Calendar::createInstance(Locale::createFromName(req), ec);
1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
18751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            dataerrln("FAIL: Calendar::createInstance failed - %s", u_errorName(ec));
1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
18771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            valid = cal->getLocale(ULOC_VALID_LOCALE, ec);
18781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            actual = cal->getLocale(ULOC_ACTUAL_LOCALE, ec);
18791b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (U_FAILURE(ec)) {
18801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: Calendar::getLocale() failed");
18811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            } else {
18821b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                _checklocs("Calendar", req, valid, actual);
18831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
18841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            /* Make sure that it fails correctly */
18851b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            ec = U_FILE_ACCESS_ERROR;
18861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (cal->getLocale(ULOC_VALID_LOCALE, ec).getName()[0] != 0) {
18871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: Calendar::getLocale() failed to fail correctly. It should have returned \"\"");
18881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
18891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            ec = U_ZERO_ERROR;
1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
18911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        delete cal;
1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // DecimalFormat, DecimalFormatSymbols
1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
18971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    {
18981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        UErrorCode ec = U_ZERO_ERROR;  // give each resource type its own error code
18991b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        req = "fr_FR_NICE";
19001b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        NumberFormat* nf = NumberFormat::createInstance(Locale::createFromName(req), ec);
1901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
19021b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            dataerrln("FAIL: NumberFormat::createInstance failed - %s", u_errorName(ec));
1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
19041b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            DecimalFormat* dec = dynamic_cast<DecimalFormat*>(nf);
19051b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (dec == NULL) {
19061b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: NumberFormat::createInstance does not return a DecimalFormat");
19071b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                return;
19081b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
19091b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            valid = dec->getLocale(ULOC_VALID_LOCALE, ec);
19101b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            actual = dec->getLocale(ULOC_ACTUAL_LOCALE, ec);
19111b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (U_FAILURE(ec)) {
19121b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: DecimalFormat::getLocale() failed");
19131b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            } else {
19141b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                _checklocs("DecimalFormat", req, valid, actual);
19151b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19171b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            const DecimalFormatSymbols* sym = dec->getDecimalFormatSymbols();
19181b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (sym == NULL) {
19191b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: getDecimalFormatSymbols returned NULL");
19201b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                return;
19211b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
19221b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            valid = sym->getLocale(ULOC_VALID_LOCALE, ec);
19231b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            actual = sym->getLocale(ULOC_ACTUAL_LOCALE, ec);
19241b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (U_FAILURE(ec)) {
19251b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: DecimalFormatSymbols::getLocale() failed");
19261b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            } else {
19271b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                _checklocs("DecimalFormatSymbols", req, valid, actual);
19281b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
19301b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        delete nf;
1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // DateFormat, DateFormatSymbols
1935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
19361b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    {
19371b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        UErrorCode ec = U_ZERO_ERROR;  // give each resource type its own error code
19381b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        req = "de_CH_LUCERNE";
19391b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        DateFormat* df =
19401b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            DateFormat::createDateInstance(DateFormat::kDefault,
19411b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                                           Locale::createFromName(req));
19421b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        if (df == 0){
19431b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            dataerrln("Error calling DateFormat::createDateInstance()");
1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
19451b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            SimpleDateFormat* dat = dynamic_cast<SimpleDateFormat*>(df);
19461b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (dat == NULL) {
19471b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: DateFormat::createInstance does not return a SimpleDateFormat");
19481b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                return;
19491b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
19501b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            valid = dat->getLocale(ULOC_VALID_LOCALE, ec);
19511b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            actual = dat->getLocale(ULOC_ACTUAL_LOCALE, ec);
19521b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (U_FAILURE(ec)) {
19531b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: SimpleDateFormat::getLocale() failed");
19541b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            } else {
19551b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                _checklocs("SimpleDateFormat", req, valid, actual);
19561b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19581b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            const DateFormatSymbols* sym = dat->getDateFormatSymbols();
19591b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (sym == NULL) {
19601b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: getDateFormatSymbols returned NULL");
19611b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                return;
19621b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
19631b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            valid = sym->getLocale(ULOC_VALID_LOCALE, ec);
19641b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            actual = sym->getLocale(ULOC_ACTUAL_LOCALE, ec);
19651b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (U_FAILURE(ec)) {
19661b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: DateFormatSymbols::getLocale() failed");
19671b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            } else {
19681b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                _checklocs("DateFormatSymbols", req, valid, actual);
19691b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
1970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
19711b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        delete df;
1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // BreakIterator
1976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
19771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    {
19781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        UErrorCode ec = U_ZERO_ERROR;  // give each resource type its own error code
19791b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        req = "es_ES_BARCELONA";
19801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        reqLoc = Locale::createFromName(req);
19811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        BreakIterator* brk = BreakIterator::createWordInstance(reqLoc, ec);
1982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
19831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            dataerrln("FAIL: BreakIterator::createWordInstance failed - %s", u_errorName(ec));
1984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
19851b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            valid = brk->getLocale(ULOC_VALID_LOCALE, ec);
19861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            actual = brk->getLocale(ULOC_ACTUAL_LOCALE, ec);
19871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (U_FAILURE(ec)) {
19881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: BreakIterator::getLocale() failed");
19891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            } else {
19901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                _checklocs("BreakIterator", req, valid, actual);
19911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19931b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            // After registering something, the behavior should be different
19941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            URegistryKey key = BreakIterator::registerInstance(brk, reqLoc, UBRK_WORD, ec);
19951b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            brk = 0; // registerInstance adopts
19961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (U_FAILURE(ec)) {
19971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: BreakIterator::registerInstance() failed");
19981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            } else {
19991b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                brk = BreakIterator::createWordInstance(reqLoc, ec);
20001b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                if (U_FAILURE(ec)) {
20011b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    errln("FAIL: BreakIterator::createWordInstance failed");
20021b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                } else {
20031b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    valid = brk->getLocale(ULOC_VALID_LOCALE, ec);
20041b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    actual = brk->getLocale(ULOC_ACTUAL_LOCALE, ec);
20051b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    if (U_FAILURE(ec)) {
20061b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                        errln("FAIL: BreakIterator::getLocale() failed");
20071b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    } else {
20081b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                        // N.B.: now expect valid==actual==req
20091b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                        _checklocs("BreakIterator(registered)",
20101b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                                   req, valid, actual, "eq", "eq");
20111b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    }
20121b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                }
20131b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                // No matter what, unregister
20141b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                BreakIterator::unregister(key, ec);
20151b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                if (U_FAILURE(ec)) {
20161b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    errln("FAIL: BreakIterator::unregister() failed");
20171b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                }
20181b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                delete brk;
20191b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                brk = 0;
20201b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
20211b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
20221b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            // After unregistering, should behave normally again
2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            brk = BreakIterator::createWordInstance(reqLoc, ec);
2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(ec)) {
2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("FAIL: BreakIterator::createWordInstance failed");
2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                valid = brk->getLocale(ULOC_VALID_LOCALE, ec);
2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                actual = brk->getLocale(ULOC_ACTUAL_LOCALE, ec);
2029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (U_FAILURE(ec)) {
2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln("FAIL: BreakIterator::getLocale() failed");
2031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else {
20321b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    _checklocs("BreakIterator(unregistered)", req, valid, actual);
2033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
20361b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        delete brk;
2037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Collator
2041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
20421b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    {
20431b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        UErrorCode ec = U_ZERO_ERROR;  // give each resource type its own error code
2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20451b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        checkRegisteredCollators(NULL); // Don't expect any extras
20461b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
20471b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        req = "hi_IN_BHOPAL";
20481b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        reqLoc = Locale::createFromName(req);
20491b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        Collator* coll = Collator::createInstance(reqLoc, ec);
2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
20511b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            dataerrln("FAIL: Collator::createInstance failed - %s", u_errorName(ec));
2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
20531b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            valid = coll->getLocale(ULOC_VALID_LOCALE, ec);
20541b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            actual = coll->getLocale(ULOC_ACTUAL_LOCALE, ec);
20551b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (U_FAILURE(ec)) {
20561b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: Collator::getLocale() failed");
20571b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            } else {
20581b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                _checklocs("Collator", req, valid, actual);
20591b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
20601b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
20611b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            // After registering something, the behavior should be different
20621b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            URegistryKey key = Collator::registerInstance(coll, reqLoc, ec);
20631b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            coll = 0; // registerInstance adopts
20641b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if (U_FAILURE(ec)) {
20651b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: Collator::registerInstance() failed");
20661b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            } else {
20671b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                coll = Collator::createInstance(reqLoc, ec);
20681b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                if (U_FAILURE(ec)) {
20691b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    errln("FAIL: Collator::createWordInstance failed");
20701b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                } else {
20711b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    valid = coll->getLocale(ULOC_VALID_LOCALE, ec);
20721b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    actual = coll->getLocale(ULOC_ACTUAL_LOCALE, ec);
20731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    if (U_FAILURE(ec)) {
20741b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                        errln("FAIL: Collator::getLocale() failed");
20751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    } else {
20761b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                        // N.B.: now expect valid==actual==req
20771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                        _checklocs("Collator(registered)",
20781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                                   req, valid, actual, "eq", "eq");
20791b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    }
20801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                }
20811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                checkRegisteredCollators(req); // include hi_IN_BHOPAL
20821b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
20831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                // No matter what, unregister
20841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                Collator::unregister(key, ec);
20851b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                if (U_FAILURE(ec)) {
20861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    errln("FAIL: Collator::unregister() failed");
20871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                }
20881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                delete coll;
20891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                coll = 0;
20901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            }
20911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
20921b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            // After unregistering, should behave normally again
2093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            coll = Collator::createInstance(reqLoc, ec);
2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(ec)) {
20951b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln("FAIL: Collator::createInstance failed");
2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                valid = coll->getLocale(ULOC_VALID_LOCALE, ec);
2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                actual = coll->getLocale(ULOC_ACTUAL_LOCALE, ec);
2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (U_FAILURE(ec)) {
2100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln("FAIL: Collator::getLocale() failed");
2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else {
21021b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    _checklocs("Collator(unregistered)", req, valid, actual);
2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
21061b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        delete coll;
2107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21081b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        checkRegisteredCollators(NULL); // extra should be gone again
21091b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
21101b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#endif
21111b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#endif
21121b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert}
21131b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21141b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#if !UCONFIG_NO_COLLATION
21151b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert/**
21161b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * Compare Collator::getAvailableLocales(int) [ "old", returning an array ]
21171b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert *   with  Collator::getAvailableLocales()    [ "new", returning a StringEnumeration ]
21181b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * These should be identical (check their API docs) EXCEPT that
21191b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * if expectExtra is non-NULL, it will be in the "new" array but not "old".
21201b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * Does not return any status but calls errln on error.
21211b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * @param expectExtra an extra locale, will be in "new" but not "old". Or NULL.
21221b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert */
21231b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertvoid LocaleTest::checkRegisteredCollators(const char *expectExtra) {
21241b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    UErrorCode status = U_ZERO_ERROR;
21251b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    int32_t count1=0,count2=0;
21261b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    Hashtable oldHash(status);
21271b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    Hashtable newHash(status);
21281b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    TEST_ASSERT_STATUS(status);
21291b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21301b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    UnicodeString expectStr(expectExtra?expectExtra:"n/a", "");
21311b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21321b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // the 'old' list (non enumeration)
21331b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    const Locale*  oldList = Collator::getAvailableLocales(count1);
21341b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if(oldList == NULL) {
21351b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        dataerrln("Error: Collator::getAvailableLocales(count) returned NULL");
21361b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        return;
21371b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
21381b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21391b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // the 'new' list (enumeration)
21401b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    LocalPointer<StringEnumeration> newEnum(Collator::getAvailableLocales());
21411b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if(newEnum.isNull()) {
21421b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert       errln("Error: collator::getAvailableLocales() returned NULL");
21431b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert       return;
21441b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
21451b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21461b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // OK. Let's add all of the OLD
21471b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // then check for any in the NEW not in OLD
21481b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // then check for any in OLD not in NEW.
21491b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21501b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // 1. add all of OLD
21511b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    for(int32_t i=0;i<count1;i++) {
21521b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        const UnicodeString key(oldList[i].getName(), "");
21531b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        int32_t oldI = oldHash.puti(key, 1, status);
21541b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        if( oldI == 1 ){
21551b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            errln("Error: duplicate key %s in Collator::getAvailableLocales(count) list.\n",
21561b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                oldList[i].getName());
21571b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            return;
21581b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        }
21591b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        if(expectExtra != NULL && !strcmp(expectExtra, oldList[i].getName())) {
21601b7d32f919554dda9c193b32188251337bc756f1Fredrik 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);
21611b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        }
21621b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
21631b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21641b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // 2. add all of NEW
21651b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    const UnicodeString *locStr;
21661b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    UBool foundExpected = FALSE;
21671b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    while((locStr = newEnum->snext(status)) && U_SUCCESS(status)) {
21681b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        count2++;
21691b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21701b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        if(expectExtra != NULL && expectStr == *locStr) {
21711b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            foundExpected = TRUE;
21721b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            logln(UnicodeString("Found expected registered collator: ","") + expectStr);
21731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        }
21741b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        (void)foundExpected;    // Hush unused variable compiler warning.
21751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21761b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        if( oldHash.geti(*locStr) == 0 ) {
21771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            if(expectExtra != NULL && expectStr==*locStr) {
21781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                logln(UnicodeString("As expected, Collator::getAvailableLocales(count) is missing registered collator ") + expectStr);
2179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
21801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                errln(UnicodeString("Error: Collator::getAvailableLocales(count) is missing: ","")
21811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    + *locStr);
2182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
21841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        newHash.puti(*locStr, 1, status);
2185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
21861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // 3. check all of OLD again
21881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    for(int32_t i=0;i<count1;i++) {
21891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        const UnicodeString key(oldList[i].getName(), "");
21901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        int32_t newI = newHash.geti(key);
21911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        if(newI == 0) {
21921b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            errln(UnicodeString("Error: Collator::getAvailableLocales() is missing: ","")
21931b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                + key);
21941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        }
21951b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
21961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
21971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    int32_t expectCount2 = count1;
21981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if(expectExtra != NULL) {
21991b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        expectCount2 ++; // if an extra item registered, bump the expect count
22001b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
22011b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
22021b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    assertEquals("Collator::getAvail() count", expectCount2, count2);
2203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
22041b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#endif
22051b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
22061b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
2207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestVariantWithOutCountry(void) {
2209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale loc("en","","POSIX");
2210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 != strcmp(loc.getVariant(), "POSIX")) {
2211103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("FAIL: en__POSIX didn't get parsed correctly - name is %s - expected %s got %s", loc.getName(), "POSIX", loc.getVariant());
2212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale loc2("en","","FOUR");
2214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 != strcmp(loc2.getVariant(), "FOUR")) {
2215103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("FAIL: en__FOUR didn't get parsed correctly - name is %s - expected %s got %s", loc2.getName(), "FOUR", loc2.getVariant());
2216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale loc3("en","Latn","","FOUR");
2218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 != strcmp(loc3.getVariant(), "FOUR")) {
2219103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("FAIL: en_Latn__FOUR didn't get parsed correctly - name is %s - expected %s got %s", loc3.getName(), "FOUR", loc3.getVariant());
2220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale loc4("","Latn","","FOUR");
2222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 != strcmp(loc4.getVariant(), "FOUR")) {
2223103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("FAIL: _Latn__FOUR didn't get parsed correctly - name is %s - expected %s got %s", loc4.getName(), "FOUR", loc4.getVariant());
2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale loc5("","Latn","US","FOUR");
2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 != strcmp(loc5.getVariant(), "FOUR")) {
2227103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("FAIL: _Latn_US_FOUR didn't get parsed correctly - name is %s - expected %s got %s", loc5.getName(), "FOUR", loc5.getVariant());
2228103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2229103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    Locale loc6("de-1901");
2230103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (0 != strcmp(loc6.getVariant(), "1901")) {
2231103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("FAIL: de-1901 didn't get parsed correctly - name is %s - expected %s got %s", loc6.getName(), "1901", loc6.getVariant());
2232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic Locale _canonicalize(int32_t selector, /* 0==createFromName, 1==createCanonical, 2==Locale ct */
2236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            const char* localeID) {
2237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (selector) {
2238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 0:
2239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return Locale::createFromName(localeID);
2240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 1:
2241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return Locale::createCanonical(localeID);
2242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 2:
2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return Locale(localeID);
2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return Locale("");
2246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid LocaleTest::TestCanonicalization(void)
2250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
2252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *localeID;    /* input */
2253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *getNameID;   /* expected getName() result */
2254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *canonicalID; /* expected canonicalize() result */
2255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } testCases[] = {
225627f654740f2a26ad62a5c155af9199af9e69b889claireho        { "", "", "en_US_POSIX" },
225727f654740f2a26ad62a5c155af9199af9e69b889claireho        { "C", "c", "en_US_POSIX" },
225827f654740f2a26ad62a5c155af9199af9e69b889claireho        { "POSIX", "posix", "en_US_POSIX" },
2259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ca_ES_PREEURO-with-extra-stuff-that really doesn't make any sense-unless-you're trying to increase code coverage",
2260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          "ca_ES_PREEURO_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE",
2261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          "ca_ES_PREEURO_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE"},
2262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ca_ES_PREEURO", "ca_ES_PREEURO", "ca_ES@currency=ESP" },
2263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_AT_PREEURO", "de_AT_PREEURO", "de_AT@currency=ATS" },
2264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_DE_PREEURO", "de_DE_PREEURO", "de_DE@currency=DEM" },
2265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_LU_PREEURO", "de_LU_PREEURO", "de_LU@currency=LUF" },
2266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "el_GR_PREEURO", "el_GR_PREEURO", "el_GR@currency=GRD" },
2267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "en_BE_PREEURO", "en_BE_PREEURO", "en_BE@currency=BEF" },
2268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "en_IE_PREEURO", "en_IE_PREEURO", "en_IE@currency=IEP" },
2269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "es_ES_PREEURO", "es_ES_PREEURO", "es_ES@currency=ESP" },
2270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "eu_ES_PREEURO", "eu_ES_PREEURO", "eu_ES@currency=ESP" },
2271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "fi_FI_PREEURO", "fi_FI_PREEURO", "fi_FI@currency=FIM" },
2272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "fr_BE_PREEURO", "fr_BE_PREEURO", "fr_BE@currency=BEF" },
2273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "fr_FR_PREEURO", "fr_FR_PREEURO", "fr_FR@currency=FRF" },
2274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "fr_LU_PREEURO", "fr_LU_PREEURO", "fr_LU@currency=LUF" },
2275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ga_IE_PREEURO", "ga_IE_PREEURO", "ga_IE@currency=IEP" },
2276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "gl_ES_PREEURO", "gl_ES_PREEURO", "gl_ES@currency=ESP" },
2277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "it_IT_PREEURO", "it_IT_PREEURO", "it_IT@currency=ITL" },
2278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "nl_BE_PREEURO", "nl_BE_PREEURO", "nl_BE@currency=BEF" },
2279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "nl_NL_PREEURO", "nl_NL_PREEURO", "nl_NL@currency=NLG" },
2280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "pt_PT_PREEURO", "pt_PT_PREEURO", "pt_PT@currency=PTE" },
2281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de__PHONEBOOK", "de__PHONEBOOK", "de@collation=phonebook" },
2282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "en_GB_EURO", "en_GB_EURO", "en_GB@currency=EUR" },
2283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "en_GB@EURO", "en_GB@EURO", "en_GB@currency=EUR" }, /* POSIX ID */
2284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "es__TRADITIONAL", "es__TRADITIONAL", "es@collation=traditional" },
2285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "hi__DIRECT", "hi__DIRECT", "hi@collation=direct" },
2286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ja_JP_TRADITIONAL", "ja_JP_TRADITIONAL", "ja_JP@calendar=japanese" },
2287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "th_TH_TRADITIONAL", "th_TH_TRADITIONAL", "th_TH@calendar=buddhist" },
2288c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "zh_TW_STROKE", "zh_TW_STROKE", "zh_TW@collation=stroke" },
2289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zh__PINYIN", "zh__PINYIN", "zh@collation=pinyin" },
2290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zh@collation=pinyin", "zh@collation=pinyin", "zh@collation=pinyin" },
2291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zh_CN@collation=pinyin", "zh_CN@collation=pinyin", "zh_CN@collation=pinyin" },
2292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zh_CN_CA@collation=pinyin", "zh_CN_CA@collation=pinyin", "zh_CN_CA@collation=pinyin" },
2293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "en_US_POSIX", "en_US_POSIX", "en_US_POSIX" },
2294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "hy_AM_REVISED", "hy_AM_REVISED", "hy_AM_REVISED" },
2295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "no_NO_NY", "no_NO_NY", "no_NO_NY" /* not: "nn_NO" [alan ICU3.0] */ },
2296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "no@ny", "no@ny", "no__NY" /* not: "nn" [alan ICU3.0] */ }, /* POSIX ID */
2297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "no-no.utf32@B", "no_NO.utf32@B", "no_NO_B" /* not: "nb_NO_B" [alan ICU3.0] */ }, /* POSIX ID */
2298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "qz-qz@Euro", "qz_QZ@Euro", "qz_QZ@currency=EUR" }, /* qz-qz uses private use iso codes */
2299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // NOTE: uloc_getName() works on en-BOONT, but Locale() parser considers it BOGUS
2300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // TODO: unify this behavior
230154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        { "en-BOONT", "en__BOONT", "en__BOONT" }, /* registered name */
230254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        { "de-1901", "de__1901", "de__1901" }, /* registered name */
230354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        { "de-1906", "de__1906", "de__1906" }, /* registered name */
2304c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "sr-SP-Cyrl", "sr_SP_CYRL", "sr_Cyrl_RS" }, /* .NET name */
2305c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "sr-SP-Latn", "sr_SP_LATN", "sr_Latn_RS" }, /* .NET name */
2306c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "sr_YU_CYRILLIC", "sr_YU_CYRILLIC", "sr_Cyrl_RS" }, /* Linux name */
2307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "uz-UZ-Cyrl", "uz_UZ_CYRL", "uz_Cyrl_UZ" }, /* .NET name */
2308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "uz-UZ-Latn", "uz_UZ_LATN", "uz_Latn_UZ" }, /* .NET name */
2309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zh-CHS", "zh_CHS", "zh_Hans" }, /* .NET name */
2310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zh-CHT", "zh_CHT", "zh_Hant" }, /* .NET name This may change back to zh_Hant */
2311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* posix behavior that used to be performed by getName */
2313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "mr.utf8", "mr.utf8", "mr" },
2314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de-tv.koi8r", "de_TV.koi8r", "de_TV" },
2315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "x-piglatin_ML.MBE", "x-piglatin_ML.MBE", "x-piglatin_ML" },
2316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "i-cherokee_US.utf7", "i-cherokee_US.utf7", "i-cherokee_US" },
2317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA" },
2318b13da9df870a61b11249bf741347908dbea0edd8Jean-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 */
2319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* fleshing out canonicalization */
2321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* trim space and sort keywords, ';' is separator so not present at end in canonical form */
2322b13da9df870a61b11249bf741347908dbea0edd8Jean-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" },
2323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* already-canonical ids are not changed */
2324b13da9df870a61b11249bf741347908dbea0edd8Jean-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" },
2325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* PRE_EURO and EURO conversions don't affect other keywords */
2326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "es_ES_PREEURO@CALendar=Japanese", "es_ES_PREEURO@calendar=Japanese", "es_ES@calendar=Japanese;currency=ESP" },
2327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "es_ES_EURO@SHOUT=zipeedeedoodah", "es_ES_EURO@shout=zipeedeedoodah", "es_ES@currency=EUR;shout=zipeedeedoodah" },
2328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* currency keyword overrides PRE_EURO and EURO currency */
2329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "es_ES_PREEURO@currency=EUR", "es_ES_PREEURO@currency=EUR", "es_ES@currency=EUR" },
2330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "es_ES_EURO@currency=ESP", "es_ES_EURO@currency=ESP", "es_ES@currency=ESP" },
2331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* norwegian is just too weird, if we handle things in their full generality */
2332b13da9df870a61b11249bf741347908dbea0edd8Jean-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] */ },
2333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* test cases reflecting internal resource bundle usage */
2335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "root@kw=foo", "root@kw=foo", "root@kw=foo" },
2336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "@calendar=gregorian", "@calendar=gregorian", "@calendar=gregorian" },
2337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ja_JP@calendar=Japanese", "ja_JP@calendar=Japanese", "ja_JP@calendar=Japanese" }
2338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* label[] = { "createFromName", "createCanonical", "Locale" };
2341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, j;
2343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
23448de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for (i=0; i < UPRV_LENGTHOF(testCases); i++) {
2345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (j=0; j<3; ++j) {
2346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const char* expected = (j==1) ? testCases[i].canonicalID : testCases[i].getNameID;
2347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            Locale loc = _canonicalize(j, testCases[i].localeID);
2348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const char* getName = loc.isBogus() ? "BOGUS" : loc.getName();
2349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(uprv_strcmp(expected, getName) != 0) {
2350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("FAIL: %s(%s).getName() => \"%s\", expected \"%s\"",
2351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      label[j], testCases[i].localeID, getName, expected);
2352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
2353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("Ok: %s(%s) => \"%s\"",
2354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      label[j], testCases[i].localeID, getName);
2355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2359c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2360c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid LocaleTest::TestCurrencyByDate(void)
2361c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
2362c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
2363c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2364c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UDate date = uprv_getUTCtime();
2365c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	UChar TMP[4];
2366c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	int32_t index = 0;
2367c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	int32_t resLen = 0;
2368c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UnicodeString tempStr, resultStr;
2369c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2370c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	// Cycle through historical currencies
2371c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    date = (UDate)-630720000000.0; // pre 1961 - no currency defined
23726d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    index = ucurr_countCurrencies("eo_AM", date, &status);
2373c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 0)
2374c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
23756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 0 for eo_AM - %s", u_errorName(status));
2376c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2377c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AM", date, index, TMP, 4, &status);
2378c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resLen != 0) {
23796d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: eo_AM didn't return NULL - %s", u_errorName(status));
2380c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2381c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
2382c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2383c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    date = (UDate)0.0; // 1970 - one currency defined
23846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    index = ucurr_countCurrencies("eo_AM", date, &status);
2385c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 1)
2386c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
23876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 1 for eo_AM - %s", u_errorName(status));
2388c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2389c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AM", date, index, TMP, 4, &status);
2390c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2391c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("SUR");
2392c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
23936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return SUR for eo_AM - %s", u_errorName(status));
2394c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2395c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2396c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    date = (UDate)693792000000.0; // 1992 - one currency defined
2397c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AM", date, &status);
2398c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 1)
2399c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
24006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 1 for eo_AM - %s", u_errorName(status));
2401c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2402c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AM", date, index, TMP, 4, &status);
2403c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2404c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("RUR");
2405c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24066d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return RUR for eo_AM - %s", u_errorName(status));
2407c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2408c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2409c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)977616000000.0; // post 1993 - one currency defined
2410c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AM", date, &status);
2411c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 1)
2412c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
24136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 1 for eo_AM - %s", u_errorName(status));
2414c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2415c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AM", date, index, TMP, 4, &status);
2416c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2417c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("AMD");
2418c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24196d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return AMD for eo_AM - %s", u_errorName(status));
2420c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2421c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2422c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // Locale AD has multiple currencies at once
2423c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)977616000000.0; // year 2001
2424c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AD", date, &status);
2425c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 4)
2426c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
24276d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 4 for eo_AD - %s", u_errorName(status));
2428c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2429c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 1, TMP, 4, &status);
2430c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2431c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("EUR");
2432c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return EUR for eo_AD - %s", u_errorName(status));
2434c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2435c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 2, TMP, 4, &status);
2436c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2437c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("ESP");
2438c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24396d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return ESP for eo_AD - %s", u_errorName(status));
2440c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2441c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 3, TMP, 4, &status);
2442c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2443c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("FRF");
2444c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24456d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return FRF for eo_AD - %s", u_errorName(status));
2446c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2447c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 4, TMP, 4, &status);
2448c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2449c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("ADP");
2450c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return ADP for eo_AD - %s", u_errorName(status));
2452c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2453c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2454c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)0.0; // year 1970
2455c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AD", date, &status);
2456c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 3)
2457c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
24586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 3 for eo_AD - %s", u_errorName(status));
2459c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2460c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 1, TMP, 4, &status);
2461c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2462c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("ESP");
2463c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return ESP for eo_AD - %s", u_errorName(status));
2465c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2466c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 2, TMP, 4, &status);
2467c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2468c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("FRF");
2469c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return FRF for eo_AD - %s", u_errorName(status));
2471c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2472c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 3, TMP, 4, &status);
2473c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2474c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("ADP");
2475c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return ADP for eo_AD - %s", u_errorName(status));
2477c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2478c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2479c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)-630720000000.0; // year 1950
2480c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AD", date, &status);
2481c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 2)
2482c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
24836d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 2 for eo_AD - %s", u_errorName(status));
2484c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2485c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 1, TMP, 4, &status);
2486c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2487c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("ESP");
2488c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return ESP for eo_AD - %s", u_errorName(status));
2490c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2491c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 2, TMP, 4, &status);
2492c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2493c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("ADP");
2494c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
24956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return ADP for eo_AD - %s", u_errorName(status));
2496c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2497c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2498c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)-2207520000000.0; // year 1900
2499c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AD", date, &status);
2500c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 1)
2501c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
25026d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 1 for eo_AD - %s", u_errorName(status));
2503c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2504c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AD", date, 1, TMP, 4, &status);
2505c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2506c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("ESP");
2507c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
25086d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return ESP for eo_AD - %s", u_errorName(status));
2509c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2510c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2511c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	// Locale UA has gap between years 1994 - 1996
2512c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)788400000000.0;
2513c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_UA", date, &status);
2514c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 0)
2515c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
25166d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 0 for eo_UA - %s", u_errorName(status));
2517c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2518c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_UA", date, index, TMP, 4, &status);
2519c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resLen != 0) {
25206d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: eo_UA didn't return NULL - %s", u_errorName(status));
2521c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2522c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
2523c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2524c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	// Test index bounds
2525c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_UA", date, 100, TMP, 4, &status);
2526c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resLen != 0) {
25276d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: eo_UA didn't return NULL - %s", u_errorName(status));
2528c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2529c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
2530c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2531c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_UA", date, 0, TMP, 4, &status);
2532c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resLen != 0) {
25336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: eo_UA didn't return NULL - %s", u_errorName(status));
2534c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2535c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
2536c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2537c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	// Test for bogus locale
2538c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_QQ", date, &status);
2539c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 0)
2540c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
25416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 0 for eo_QQ - %s", u_errorName(status));
2542c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2543c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
2544c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_QQ", date, 1, TMP, 4, &status);
2545c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resLen != 0) {
25466d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: eo_QQ didn't return NULL - %s", u_errorName(status));
2547c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2548c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
2549c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_QQ", date, 0, TMP, 4, &status);
2550c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resLen != 0) {
25516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: eo_QQ didn't return NULL - %s", u_errorName(status));
2552c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2553c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
2554c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2555c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // Cycle through histrocial currencies
2556c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)977616000000.0; // 2001 - one currency
2557c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AO", date, &status);
2558c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 1)
2559c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
25606d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 1 for eo_AO - %s", u_errorName(status));
2561c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2562c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AO", date, 1, TMP, 4, &status);
2563c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2564c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("AOA");
2565c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
25666d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return AOA for eo_AO - %s", u_errorName(status));
2567c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2568c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2569c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)819936000000.0; // 1996 - 2 currencies
2570c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AO", date, &status);
2571c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 2)
2572c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
25736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 1 for eo_AO - %s", u_errorName(status));
2574c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2575c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AO", date, 1, TMP, 4, &status);
2576c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2577c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("AOR");
2578c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
25796d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return AOR for eo_AO - %s", u_errorName(status));
2580c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2581c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AO", date, 2, TMP, 4, &status);
2582c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2583c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("AON");
2584c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
25856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return AON for eo_AO - %s", u_errorName(status));
2586c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2587c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2588c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)662256000000.0; // 1991 - 2 currencies
2589c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AO", date, &status);
2590c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 2)
2591c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
25926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 1 for eo_AO - %s", u_errorName(status));
2593c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2594c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AO", date, 1, TMP, 4, &status);
2595c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2596c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("AON");
2597c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
25986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return AON for eo_AO - %s", u_errorName(status));
2599c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2600c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AO", date, 2, TMP, 4, &status);
2601c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2602c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("AOK");
2603c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
26046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return AOK for eo_AO - %s", u_errorName(status));
2605c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2606c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2607c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)315360000000.0; // 1980 - one currency
2608c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AO", date, &status);
2609c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 1)
2610c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
26116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 1 for eo_AO - %s", u_errorName(status));
2612c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2613c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AO", date, 1, TMP, 4, &status);
2614c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2615c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("AOK");
2616c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
26176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return AOK for eo_AO - %s", u_errorName(status));
2618c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2619c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2620c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)0.0; // 1970 - no currencies
2621c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_AO", date, &status);
2622c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 0)
2623c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
26246d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 1 for eo_AO - %s", u_errorName(status));
2625c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2626c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_AO", date, 1, TMP, 4, &status);
2627c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resLen != 0) {
26286d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: eo_AO didn't return NULL - %s", u_errorName(status));
2629c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2630c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
2631c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2632c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // Test with currency keyword override
2633c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	date = (UDate)977616000000.0; // 2001 - two currencies
2634c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	index = ucurr_countCurrencies("eo_DE@currency=DEM", date, &status);
2635c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (index != 2)
2636c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	{
26376d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		errcheckln(status, "FAIL: didn't return 2 for eo_DE@currency=DEM - %s", u_errorName(status));
2638c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	}
2639c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_DE@currency=DEM", date, 1, TMP, 4, &status);
2640c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2641c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("EUR");
2642c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
26436d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return EUR for eo_DE@currency=DEM - %s", u_errorName(status));
2644c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2645c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resLen = ucurr_forLocaleAndDate("eo_DE@currency=DEM", date, 2, TMP, 4, &status);
2646c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	tempStr.setTo(TMP);
2647c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultStr.setTo("DEM");
2648c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (resultStr != tempStr) {
26496d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: didn't return DEM for eo_DE@currency=DEM - %s", u_errorName(status));
2650c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2651c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2652c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // Test Euro Support
2653c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	status = U_ZERO_ERROR; // reset
2654c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    date = uprv_getUTCtime();
2655c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2656c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UChar USD[4];
2657c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucurr_forLocaleAndDate("en_US", date, 1, USD, 4, &status);
2658c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2659c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	UChar YEN[4];
2660c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucurr_forLocaleAndDate("ja_JP", date, 1, YEN, 4, &status);
2661c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2662c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucurr_forLocaleAndDate("en_US", date, 1, TMP, 4, &status);
2663c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (u_strcmp(USD, TMP) != 0) {
26646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail: en_US didn't return USD - %s", u_errorName(status));
2665c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2666c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucurr_forLocaleAndDate("en_US_PREEURO", date, 1, TMP, 4, &status);
2667c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (u_strcmp(USD, TMP) != 0) {
26686d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail: en_US_PREEURO didn't fallback to en_US - %s", u_errorName(status));
2669c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2670c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucurr_forLocaleAndDate("en_US_Q", date, 1, TMP, 4, &status);
2671c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (u_strcmp(USD, TMP) != 0) {
26726d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail: en_US_Q didn't fallback to en_US - %s", u_errorName(status));
2673c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2674c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR; // reset
2675c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#endif
2676c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
267750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
267850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid LocaleTest::TestGetVariantWithKeywords(void)
267950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
268050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  Locale l("en_US_VALLEY@foo=value");
268150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  const char *variant = l.getVariant();
268250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  logln(variant);
268350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  test_assert(strcmp("VALLEY", variant) == 0);
268450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
268550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  UErrorCode status = U_ZERO_ERROR;
268650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  char buffer[50];
268750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  int32_t len = l.getKeywordValue("foo", buffer, 50, status);
268850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  buffer[len] = '\0';
268950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  test_assert(strcmp("value", buffer) == 0);
269050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
2691f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
2692f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusvoid LocaleTest::TestIsRightToLeft() {
2693f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    assertFalse("root LTR", Locale::getRoot().isRightToLeft());
2694f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    assertFalse("zh LTR", Locale::getChinese().isRightToLeft());
2695f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    assertTrue("ar RTL", Locale("ar").isRightToLeft());
2696f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    assertTrue("und-EG RTL", Locale("und-EG").isRightToLeft(), FALSE, TRUE);
2697f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    assertFalse("fa-Cyrl LTR", Locale("fa-Cyrl").isRightToLeft());
2698f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    assertTrue("en-Hebr RTL", Locale("en-Hebr").isRightToLeft());
2699f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    assertTrue("ckb RTL", Locale("ckb").isRightToLeft(), FALSE, TRUE);  // Sorani Kurdish
2700f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    assertFalse("fil LTR", Locale("fil").isRightToLeft());
2701f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    assertFalse("he-Zyxw LTR", Locale("he-Zyxw").isRightToLeft());
2702f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius}
27031b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
27041b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertvoid LocaleTest::TestBug11421() {
27051b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    Locale::getDefault().getBaseName();
27061b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    int32_t numLocales;
27071b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    const Locale *localeList = Locale::getAvailableLocales(numLocales);
27081b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    for (int localeIndex = 0; localeIndex < numLocales; localeIndex++) {
27091b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        const Locale &loc = localeList[localeIndex];
27101b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        if (strncmp(loc.getName(), loc.getBaseName(), strlen(loc.getBaseName()))) {
27111b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            errln("%s:%d loc.getName=\"%s\"; loc.getBaseName=\"%s\"",
27121b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                __FILE__, __LINE__, loc.getName(), loc.getBaseName());
27131b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            break;
27141b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        }
27151b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
27161b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert}
2717ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert
2718ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert//  TestBug13277. The failure manifests as valgrind errors.
2719ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert//                See the trac ticket for details.
2720ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert//
2721ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert
2722ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubertvoid LocaleTest::TestBug13277() {
2723ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    UErrorCode status = U_ZERO_ERROR;
2724ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    CharString name("en-us-x-foo", -1, status);
2725ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    while (name.length() < 152) {
2726ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        name.append("-x-foo", -1, status);
2727ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
2728ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert
2729ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    while (name.length() < 160) {
2730ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        name.append('z', status);
2731ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        Locale loc(name.data(), nullptr, nullptr, nullptr);
2732ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
2733ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert}
2734ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert
2735