1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
31b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * Copyright (c) 1997-2015, International Business Machines Corporation and
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*****************************************************************************
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File CLOCTST.C
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History:
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*        Name                     Description
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*     Madhu Katragadda            Ported for C API
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cloctst.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h>
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h>
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h>
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uparse.h"
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uresimp.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/putil.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ubrk.h"
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucol.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/udat.h"
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uloc.h"
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/umsg.h"
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ures.h"
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uset.h"
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ulocdata.h"
3659d709d503bab6e2b61931737e662dd293b40578ccornelius#include "unicode/uldnames.h"
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/parseerr.h" /* may not be included with some uconfig switches */
3827f654740f2a26ad62a5c155af9199af9e69b889claireho#include "udbgutil.h"
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNullDefault(void);
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNonexistentLanguageExemplars(void);
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestLocDataErrorCodeChaining(void);
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestLanguageExemplarsFallbacks(void);
4459d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void TestDisplayNameBrackets(void);
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4627f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestUnicodeDefines(void);
4727f654740f2a26ad62a5c155af9199af9e69b889claireho
48f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusstatic void TestIsRightToLeft(void);
49f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid PrintDataTable();
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*---------------------------------------------------
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  table of valid data
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru --------------------------------------------------- */
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LOCALE_SIZE 9
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LOCALE_INFO_SIZE 28
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* const rawData2[LOCALE_INFO_SIZE][LOCALE_SIZE] = {
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* language code */
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "en",   "fr",   "ca",   "el",   "no",   "zh",   "de",   "es",  "ja"    },
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* script code */
6250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {   "",     "",     "",     "",     "",     "", "", "", ""  },
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* country code */
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "US",   "FR",   "ES",   "GR",   "NO",   "CN", "DE", "", "JP"    },
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* variant code */
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "",     "",     "",     "",     "NY",   "", "", "", ""      },
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* full name */
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "en_US",    "fr_FR",    "ca_ES",
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "el_GR",    "no_NO_NY", "zh_Hans_CN",
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "de_DE@collation=phonebook", "es@collation=traditional",  "ja_JP@calendar=japanese" },
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* ISO-3 language */
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "eng",  "fra",  "cat",  "ell",  "nor",  "zho", "deu", "spa", "jpn"   },
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* ISO-3 country */
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "USA",  "FRA",  "ESP",  "GRC",  "NOR",  "CHN", "DEU", "", "JPN"   },
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* LCID */
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "409", "40c", "403", "408", "814",  "804", "10407", "40a", "411"     },
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display language (English) */
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "English",  "French",   "Catalan", "Greek",    "Norwegian", "Chinese", "German", "Spanish", "Japanese"    },
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display script code (English) */
81103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {   "",     "",     "",     "",     "",     "Simplified Han", "", "", ""       },
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display country (English) */
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "United States",    "France",   "Spain",  "Greece",   "Norway", "China", "Germany", "", "Japan"       },
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display variant (English) */
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "",     "",     "",     "",     "NY",  "", "", "", ""       },
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display name (English) */
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "English (United States)", "French (France)", "Catalan (Spain)",
88b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "Greek (Greece)", "Norwegian (Norway, NY)", "Chinese (Simplified, China)",
89b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "German (Germany, Sort Order=Phonebook Sort Order)", "Spanish (Sort Order=Traditional Sort Order)", "Japanese (Japan, Calendar=Japanese Calendar)" },
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display language (French) */
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "anglais",  "fran\\u00E7ais",   "catalan", "grec",    "norv\\u00E9gien",    "chinois", "allemand", "espagnol", "japonais"     },
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display script code (French) */
9459d709d503bab6e2b61931737e662dd293b40578ccornelius    {   "",     "",     "",     "",     "",     "sinogrammes simplifi\\u00e9s", "", "", ""         },
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display country (French) */
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "\\u00C9tats-Unis",    "France",   "Espagne",  "Gr\\u00E8ce",   "Norv\\u00E8ge",    "Chine", "Allemagne", "", "Japon"       },
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display variant (French) */
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "",     "",     "",     "",     "NY",   "", "", "", ""       },
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display name (French) */
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "anglais (\\u00C9tats-Unis)", "fran\\u00E7ais (France)", "catalan (Espagne)",
10154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        "grec (Gr\\u00E8ce)", "norv\\u00E9gien (Norv\\u00E8ge, NY)",  "chinois (simplifi\\u00e9, Chine)",
102f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        "allemand (Allemagne, ordre de tri=Ordre de l\\u2019annuaire)", "espagnol (ordre de tri=Ordre traditionnel)", "japonais (Japon, calendrier=calendrier japonais)" },
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display language (Catalan) */
105c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {   "angl\\u00E8s", "franc\\u00E8s", "catal\\u00E0", "grec",  "noruec", "xin\\u00E8s", "alemany", "espanyol", "japon\\u00E8s"    },
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display script code (Catalan) */
10759d709d503bab6e2b61931737e662dd293b40578ccornelius    {   "",     "",     "",     "",     "",     "han simplificat", "", "", ""         },
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display country (Catalan) */
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "Estats Units", "Fran\\u00E7a", "Espanya",  "Gr\\u00E8cia", "Noruega",  "Xina", "Alemanya", "", "Jap\\u00F3"    },
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display variant (Catalan) */
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "", "", "",                    "", "NY",    "", "", "", ""    },
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display name (Catalan) */
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "angl\\u00E8s (Estats Units)", "franc\\u00E8s (Fran\\u00E7a)", "catal\\u00E0 (Espanya)",
114b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    "grec (Gr\\u00E8cia)", "noruec (Noruega, NY)", "xin\\u00E8s (simplificat, Xina)",
11559d709d503bab6e2b61931737e662dd293b40578ccornelius    "alemany (Alemanya, ordenaci\\u00F3=ordre de la guia telef\\u00F2nica)", "espanyol (ordenaci\\u00F3=ordre tradicional)", "japon\\u00E8s (Jap\\u00F3, calendari=calendari japon\\u00e8s)" },
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display language (Greek) */
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac",
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u0393\\u03b1\\u03bb\\u03bb\\u03b9\\u03ba\\u03ac",
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u039a\\u03b1\\u03c4\\u03b1\\u03bb\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac",
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u0395\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac",
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac",
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u039A\\u03B9\\u03BD\\u03B5\\u03B6\\u03B9\\u03BA\\u03AC",
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u0393\\u03B5\\u03C1\\u03BC\\u03B1\\u03BD\\u03B9\\u03BA\\u03AC",
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u0399\\u03C3\\u03C0\\u03B1\\u03BD\\u03B9\\u03BA\\u03AC",
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u0399\\u03B1\\u03C0\\u03C9\\u03BD\\u03B9\\u03BA\\u03AC"
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display script code (Greek) */
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
13159d709d503bab6e2b61931737e662dd293b40578ccornelius    {   "",     "",     "",     "",     "", "\\u0391\\u03c0\\u03bb\\u03bf\\u03c0\\u03bf\\u03b9\\u03b7\\u03bc\\u03ad\\u03bd\\u03bf \\u03a7\\u03b1\\u03bd", "", "", "" },
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display country (Greek) */
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
13459d709d503bab6e2b61931737e662dd293b40578ccornelius        "\\u0397\\u03BD\\u03C9\\u03BC\\u03AD\\u03BD\\u03B5\\u03C2 \\u03A0\\u03BF\\u03BB\\u03B9\\u03C4\\u03B5\\u03AF\\u03B5\\u03C2",
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u0393\\u03b1\\u03bb\\u03bb\\u03af\\u03b1",
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03af\\u03b1",
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1",
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1",
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u039A\\u03AF\\u03BD\\u03B1",
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u0393\\u03B5\\u03C1\\u03BC\\u03B1\\u03BD\\u03AF\\u03B1",
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "",
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u0399\\u03B1\\u03C0\\u03C9\\u03BD\\u03AF\\u03B1"
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display variant (Greek) */
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "", "", "", "", "NY", "", "", "", ""    }, /* TODO: currently there is no translation for NY in Greek fix this test when we have it */
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* display name (Greek) */
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
14859d709d503bab6e2b61931737e662dd293b40578ccornelius        "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac (\\u0397\\u03BD\\u03C9\\u03BC\\u03AD\\u03BD\\u03B5\\u03C2 \\u03A0\\u03BF\\u03BB\\u03B9\\u03C4\\u03B5\\u03AF\\u03B5\\u03C2)",
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u0393\\u03b1\\u03bb\\u03bb\\u03b9\\u03ba\\u03ac (\\u0393\\u03b1\\u03bb\\u03bb\\u03af\\u03b1)",
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u039a\\u03b1\\u03c4\\u03b1\\u03bb\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac (\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03af\\u03b1)",
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u0395\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac (\\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1)",
15259d709d503bab6e2b61931737e662dd293b40578ccornelius        "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac (\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1, NY)",
15359d709d503bab6e2b61931737e662dd293b40578ccornelius        "\\u039A\\u03B9\\u03BD\\u03B5\\u03B6\\u03B9\\u03BA\\u03AC (\\u0391\\u03c0\\u03bb\\u03bf\\u03c0\\u03bf\\u03b9\\u03b7\\u03bc\\u03ad\\u03bd\\u03bf, \\u039A\\u03AF\\u03BD\\u03B1)",
15459d709d503bab6e2b61931737e662dd293b40578ccornelius        "\\u0393\\u03b5\\u03c1\\u03bc\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac (\\u0393\\u03b5\\u03c1\\u03bc\\u03b1\\u03bd\\u03af\\u03b1, \\u03a3\\u03b5\\u03b9\\u03c1\\u03ac \\u03c4\\u03b1\\u03be\\u03b9\\u03bd\\u03cc\\u03bc\\u03b7\\u03c3\\u03b7\\u03c2=\\u03a3\\u03b5\\u03b9\\u03c1\\u03ac \\u03c4\\u03b1\\u03be\\u03b9\\u03bd\\u03cc\\u03bc\\u03b7\\u03c3\\u03b7\\u03c2 \\u03c4\\u03b7\\u03bb\\u03b5\\u03c6\\u03c9\\u03bd\\u03b9\\u03ba\\u03bf\\u03cd \\u03ba\\u03b1\\u03c4\\u03b1\\u03bb\\u03cc\\u03b3\\u03bf\\u03c5)",
15554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        "\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac (\\u03a3\\u03b5\\u03b9\\u03c1\\u03ac \\u03c4\\u03b1\\u03be\\u03b9\\u03bd\\u03cc\\u03bc\\u03b7\\u03c3\\u03b7\\u03c2=\\u03a0\\u03b1\\u03c1\\u03b1\\u03b4\\u03bf\\u03c3\\u03b9\\u03b1\\u03ba\\u03ae \\u03c3\\u03b5\\u03b9\\u03c1\\u03ac \\u03c4\\u03b1\\u03be\\u03b9\\u03bd\\u03cc\\u03bc\\u03b7\\u03c3\\u03b7\\u03c2)",
15659d709d503bab6e2b61931737e662dd293b40578ccornelius        "\\u0399\\u03b1\\u03c0\\u03c9\\u03bd\\u03b9\\u03ba\\u03ac (\\u0399\\u03b1\\u03c0\\u03c9\\u03bd\\u03af\\u03b1, \\u0397\\u03bc\\u03b5\\u03c1\\u03bf\\u03bb\\u03cc\\u03b3\\u03b9\\u03bf=\\u0399\\u03b1\\u03c0\\u03c9\\u03bd\\u03b9\\u03ba\\u03cc \\u03b7\\u03bc\\u03b5\\u03c1\\u03bf\\u03bb\\u03cc\\u03b3\\u03b9\\u03bf)"
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UChar*** dataTable=0;
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum {
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ENGLISH = 0,
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FRENCH = 1,
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CATALAN = 2,
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GREEK = 3,
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NORWEGIAN = 4
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum {
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LANG = 0,
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SCRIPT = 1,
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CTRY = 2,
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VAR = 3,
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NAME = 4,
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LANG3 = 5,
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CTRY3 = 6,
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LCID = 7,
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DLANG_EN = 8,
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DSCRIPT_EN = 9,
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DCTRY_EN = 10,
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DVAR_EN = 11,
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DNAME_EN = 12,
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DLANG_FR = 13,
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DSCRIPT_FR = 14,
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DCTRY_FR = 15,
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DVAR_FR = 16,
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DNAME_FR = 17,
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DLANG_CA = 18,
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DSCRIPT_CA = 19,
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DCTRY_CA = 20,
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DVAR_CA = 21,
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DNAME_CA = 22,
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DLANG_EL = 23,
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DSCRIPT_EL = 24,
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DCTRY_EL = 25,
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DVAR_EL = 26,
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DNAME_EL = 27
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TESTCASE(name) addTest(root, &name, "tsutil/cloctst/" #name)
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addLocaleTest(TestNode** root);
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addLocaleTest(TestNode** root)
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestObsoleteNames); /* srl- move */
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestBasicGetters);
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestNullDefault);
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestPrefixes);
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestSimpleResourceInfo);
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestDisplayNames);
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestGetAvailableLocales);
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestDataDirectory);
21450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestISOFunctions);
21650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestISO3Fallback);
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestUninstalledISO3Names);
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestSimpleDisplayNames);
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestVariantParsing);
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestKeywordVariants);
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestKeywordVariantParsing);
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestCanonicalization);
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestKeywordSet);
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestKeywordSetError);
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestDisplayKeywords);
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestDisplayKeywordValues);
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestGetBaseName);
22950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FILE_IO
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestGetLocale);
23150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestDisplayNameWarning);
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestNonexistentLanguageExemplars);
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestLocDataErrorCodeChaining);
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestLanguageExemplarsFallbacks);
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestCalendar);
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestDateFormat);
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestCollation);
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestULocale);
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestUResourceBundle);
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestDisplayName);
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestAcceptLanguage);
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestGetLocaleForLCID);
244c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    TESTCASE(TestOrientation);
245c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    TESTCASE(TestLikelySubtags);
246b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    TESTCASE(TestToLanguageTag);
247b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    TESTCASE(TestForLanguageTag);
24850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    TESTCASE(TestTrailingNull);
24927f654740f2a26ad62a5c155af9199af9e69b889claireho    TESTCASE(TestUnicodeDefines);
2508393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    TESTCASE(TestEnglishExemplarCharacters);
25159d709d503bab6e2b61931737e662dd293b40578ccornelius    TESTCASE(TestDisplayNameBrackets);
252f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE(TestIsRightToLeft);
253f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE(TestToUnicodeLocaleKey);
254f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE(TestToLegacyKey);
255f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE(TestToUnicodeLocaleType);
256f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    TESTCASE(TestToLegacyType);
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* testing uloc(), uloc_getName(), uloc_getLanguage(), uloc_getVariant(), uloc_getCountry() */
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBasicGetters() {
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t cap;
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char *testLocale = 0;
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char *temp = 0, *name = 0;
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing Basic Getters\n");
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < LOCALE_SIZE; i++) {
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testLocale=(char*)malloc(sizeof(char) * (strlen(rawData2[NAME][i])+1));
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(testLocale,rawData2[NAME][i]);
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Testing   %s  .....\n", testLocale);
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cap=uloc_getLanguage(testLocale, NULL, 0, &status);
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status==U_BUFFER_OVERFLOW_ERROR){
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status=U_ZERO_ERROR;
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            temp=(char*)malloc(sizeof(char) * (cap+1));
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uloc_getLanguage(testLocale, temp, cap+1, &status);
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ERROR: in uloc_getLanguage  %s\n", myErrorName(status));
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 !=strcmp(temp,rawData2[LANG][i]))    {
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("  Language code mismatch: %s versus  %s\n", temp, rawData2[LANG][i]);
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cap=uloc_getCountry(testLocale, temp, cap, &status);
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status==U_BUFFER_OVERFLOW_ERROR){
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status=U_ZERO_ERROR;
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            temp=(char*)realloc(temp, sizeof(char) * (cap+1));
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uloc_getCountry(testLocale, temp, cap+1, &status);
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ERROR: in uloc_getCountry  %s\n", myErrorName(status));
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != strcmp(temp, rawData2[CTRY][i])) {
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err(" Country code mismatch:  %s  versus   %s\n", temp, rawData2[CTRY][i]);
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          }
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cap=uloc_getVariant(testLocale, temp, cap, &status);
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status==U_BUFFER_OVERFLOW_ERROR){
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status=U_ZERO_ERROR;
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            temp=(char*)realloc(temp, sizeof(char) * (cap+1));
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uloc_getVariant(testLocale, temp, cap+1, &status);
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ERROR: in uloc_getVariant  %s\n", myErrorName(status));
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != strcmp(temp, rawData2[VAR][i])) {
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Variant code mismatch:  %s  versus   %s\n", temp, rawData2[VAR][i]);
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cap=uloc_getName(testLocale, NULL, 0, &status);
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status==U_BUFFER_OVERFLOW_ERROR){
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status=U_ZERO_ERROR;
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name=(char*)malloc(sizeof(char) * (cap+1));
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uloc_getName(testLocale, name, cap+1, &status);
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if(status==U_ZERO_ERROR) {
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_err("ERROR: in uloc_getName(%s,NULL,0,..), expected U_BUFFER_OVERFLOW_ERROR!\n", testLocale);
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ERROR: in uloc_getName   %s\n", myErrorName(status));
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != strcmp(name, rawData2[NAME][i])){
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err(" Mismatch in getName:  %s  versus   %s\n", name, rawData2[NAME][i]);
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(temp);
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(name);
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(testLocale);
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNullDefault() {
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char original[ULOC_FULLNAME_CAPACITY];
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uprv_strcpy(original, uloc_getDefault());
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uloc_setDefault("qq_BLA", &status);
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (uprv_strcmp(uloc_getDefault(), "qq_BLA") != 0) {
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err(" Mismatch in uloc_setDefault:  qq_BLA  versus   %s\n", uloc_getDefault());
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uloc_setDefault(NULL, &status);
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (uprv_strcmp(uloc_getDefault(), original) != 0) {
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err(" uloc_setDefault(NULL, &status) didn't get the default locale back!\n");
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Test that set & get of default locale work, and that
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * default locales are cached and reused, and not overwritten.
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *n_en_US;
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *n_fr_FR;
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *n2_en_US;
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uloc_setDefault("en_US", &status);
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        n_en_US = uloc_getDefault();
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strcmp(n_en_US, "en_US") != 0) {
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Wrong result from uloc_getDefault().  Expected \"en_US\", got \"%s\"\n", n_en_US);
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uloc_setDefault("fr_FR", &status);
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        n_fr_FR = uloc_getDefault();
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strcmp(n_en_US, "en_US") != 0) {
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("uloc_setDefault altered previously default string."
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Expected \"en_US\", got \"%s\"\n",  n_en_US);
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strcmp(n_fr_FR, "fr_FR") != 0) {
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Wrong result from uloc_getDefault().  Expected \"fr_FR\", got %s\n",  n_fr_FR);
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uloc_setDefault("en_US", &status);
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        n2_en_US = uloc_getDefault();
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strcmp(n2_en_US, "en_US") != 0) {
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Wrong result from uloc_getDefault().  Expected \"en_US\", got \"%s\"\n", n_en_US);
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (n2_en_US != n_en_US) {
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Default locale cache failed to reuse en_US locale.\n");
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Failure returned from uloc_setDefault - \"%s\"\n", u_errorName(status));
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Test the i- and x- and @ and . functionality
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define PREFIXBUFSIZ 128
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestPrefixes() {
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int row = 0;
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int n;
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *loc, *expected;
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char * const testData[][7] =
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* NULL canonicalize() column means "expect same as getName()" */
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"sv", "", "FI", "AL", "sv-fi-al", "sv_FI_AL", NULL},
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"en", "", "GB", "", "en-gb", "en_GB", NULL},
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"i-hakka", "", "MT", "XEMXIJA", "i-hakka_MT_XEMXIJA", "i-hakka_MT_XEMXIJA", NULL},
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"i-hakka", "", "CN", "", "i-hakka_CN", "i-hakka_CN", NULL},
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"i-hakka", "", "MX", "", "I-hakka_MX", "i-hakka_MX", NULL},
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"x-klingon", "", "US", "SANJOSE", "X-KLINGON_us_SANJOSE", "x-klingon_US_SANJOSE", NULL},
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
41154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        {"zh", "Hans", "", "PINYIN", "zh-Hans-pinyin", "zh_Hans__PINYIN", "zh_Hans@collation=pinyin"},
41254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        {"hy", "", "", "AREVMDA", "hy_AREVMDA", "hy__AREVMDA", NULL},
41327f654740f2a26ad62a5c155af9199af9e69b889claireho
41454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        {"de", "", "", "1901", "de-1901", "de__1901", NULL},
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"mr", "", "", "", "mr.utf8", "mr.utf8", "mr"},
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"de", "", "TV", "", "de-tv.koi8r", "de_TV.koi8r", "de_TV"},
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"x-piglatin", "", "ML", "", "x-piglatin_ML.MBE", "x-piglatin_ML.MBE", "x-piglatin_ML"},  /* Multibyte English */
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"i-cherokee", "","US", "", "i-Cherokee_US.utf7", "i-cherokee_US.utf7", "i-cherokee_US"},
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"x-filfli", "", "MT", "FILFLA", "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA"},
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"no", "", "NO", "NY", "no-no-ny.utf32@B", "no_NO_NY.utf32@B", "no_NO_NY_B"},
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"no", "", "NO", "",  "no-no.utf32@B", "no_NO.utf32@B", "no_NO_B"},
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"no", "", "",   "NY", "no__ny", "no__NY", NULL},
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"no", "", "",   "", "no@ny", "no@ny", "no__NY"},
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"el", "Latn", "", "", "el-latn", "el_Latn", NULL},
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"en", "Cyrl", "RU", "", "en-cyrl-ru", "en_Cyrl_RU", NULL},
426c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"zh", "Hant", "TW", "STROKE", "zh-hant_TW_STROKE", "zh_Hant_TW_STROKE", "zh_Hant_TW@collation=stroke"},
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"qq", "Qqqq", "QQ", "QQ", "qq_Qqqq_QQ_QQ", "qq_Qqqq_QQ_QQ", NULL},
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"qq", "Qqqq", "", "QQ", "qq_Qqqq__QQ", "qq_Qqqq__QQ", NULL},
429103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        {"ab", "Cdef", "GH", "IJ", "ab_cdef_gh_ij", "ab_Cdef_GH_IJ", NULL}, /* total garbage */
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {NULL,NULL,NULL,NULL,NULL,NULL,NULL}
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char * const testTitles[] = {
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "uloc_getLanguage()",
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "uloc_getScript()",
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "uloc_getCountry()",
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "uloc_getVariant()",
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "name",
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "uloc_getName()",
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "uloc_canonicalize()"
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buf[PREFIXBUFSIZ];
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t len;
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode err;
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(row=0;testData[row][0] != NULL;row++) {
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        loc = testData[row][NAME];
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Test #%d: %s\n", row, loc);
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err = U_ZERO_ERROR;
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        len=0;
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buf[0]=0;
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(n=0;n<=(NAME+2);n++) {
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(n==NAME) continue;
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for(len=0;len<PREFIXBUFSIZ;len++) {
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                buf[len] = '%'; /* Set a tripwire.. */
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            len = 0;
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            switch(n) {
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            case LANG:
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                len = uloc_getLanguage(loc, buf, PREFIXBUFSIZ, &err);
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            case SCRIPT:
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                len = uloc_getScript(loc, buf, PREFIXBUFSIZ, &err);
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            case CTRY:
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                len = uloc_getCountry(loc, buf, PREFIXBUFSIZ, &err);
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            case VAR:
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                len = uloc_getVariant(loc, buf, PREFIXBUFSIZ, &err);
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            case NAME+1:
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                len = uloc_getName(loc, buf, PREFIXBUFSIZ, &err);
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            case NAME+2:
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                len = uloc_canonicalize(loc, buf, PREFIXBUFSIZ, &err);
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            default:
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                strcpy(buf, "**??");
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                len=4;
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_FAILURE(err)) {
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("#%d: %s on %s: err %s\n",
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    row, testTitles[n], loc, u_errorName(err));
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose("#%d: %s on %s: -> [%s] (length %d)\n",
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    row, testTitles[n], loc, buf, len);
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(len != (int32_t)strlen(buf)) {
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("#%d: %s on %s: -> [%s] (length returned %d, actual %d!)\n",
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        row, testTitles[n], loc, buf, len, strlen(buf)+1);
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                /* see if they smashed something */
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(buf[len+1] != '%') {
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("#%d: %s on %s: -> [%s] - wrote [%X] out ofbounds!\n",
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        row, testTitles[n], loc, buf, buf[len+1]);
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expected = testData[row][n];
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (expected == NULL && n == (NAME+2)) {
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    /* NULL expected canonicalize() means "expect same as getName()" */
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    expected = testData[row][NAME+1];
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(strcmp(buf, expected)) {
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("#%d: %s on %s: -> [%s] (expected '%s'!)\n",
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        row, testTitles[n], loc, buf, expected);
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* testing uloc_getISO3Language(), uloc_getISO3Country(),  */
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSimpleResourceInfo() {
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char* testLocale = 0;
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar* expected = 0;
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* temp;
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char            temp2[20];
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testLocale=(char*)malloc(sizeof(char) * 1);
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expected=(UChar*)malloc(sizeof(UChar) * 1);
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setUpDataTable();
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing getISO3Language and getISO3Country\n");
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < LOCALE_SIZE; i++) {
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testLocale=(char*)realloc(testLocale, sizeof(char) * (u_strlen(dataTable[NAME][i])+1));
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_austrcpy(testLocale, dataTable[NAME][i]);
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Testing   %s ......\n", testLocale);
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        temp=uloc_getISO3Language(testLocale);
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expected=(UChar*)realloc(expected, sizeof(UChar) * (strlen(temp) + 1));
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrcpy(expected,temp);
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != u_strcmp(expected, dataTable[LANG3][i])) {
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("  ISO-3 language code mismatch:  %s versus  %s\n",  austrdup(expected),
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                austrdup(dataTable[LANG3][i]));
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        temp=uloc_getISO3Country(testLocale);
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expected=(UChar*)realloc(expected, sizeof(UChar) * (strlen(temp) + 1));
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrcpy(expected,temp);
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != u_strcmp(expected, dataTable[CTRY3][i])) {
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("  ISO-3 Country code mismatch:  %s versus  %s\n",  austrdup(expected),
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                austrdup(dataTable[CTRY3][i]));
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        sprintf(temp2, "%x", (int)uloc_getLCID(testLocale));
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strcmp(temp2, rawData2[LCID][i]) != 0) {
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("LCID mismatch: %s versus %s\n", temp2 , rawData2[LCID][i]);
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(expected);
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(testLocale);
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cleanUpDataTable();
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
575b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* if len < 0, we convert until we hit UChar 0x0000, which is not output. will add trailing null
576b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * if there's room but won't be included in result.  result < 0 indicates an error.
577b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Returns the number of chars written (not those that would be written if there's enough room.*/
578b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic int32_t UCharsToEscapedAscii(const UChar* utext, int32_t len, char* resultChars, int32_t buflen) {
579b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static const struct {
580b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        char escapedChar;
581b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UChar sourceVal;
582b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } ESCAPE_MAP[] = {
583b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /*a*/ {'a', 0x07},
584b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /*b*/ {'b', 0x08},
585b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /*e*/ {'e', 0x1b},
586b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /*f*/ {'f', 0x0c},
587b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /*n*/ {'n', 0x0a},
588b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /*r*/ {'r', 0x0d},
589b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /*t*/ {'t', 0x09},
590b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /*v*/ {'v', 0x0b}
591b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    };
592b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static const int32_t ESCAPE_MAP_LENGTH = sizeof(ESCAPE_MAP)/sizeof(ESCAPE_MAP[0]);
593b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static const char HEX_DIGITS[] = {
594b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        '0', '1', '2', '3', '4', '5', '6', '7',
595b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
596b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    };
597b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t i, j;
598b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t resultLen = 0;
599b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const int32_t limit = len<0 ? buflen : len; /* buflen is long enough to hit the buffer limit */
600b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const int32_t escapeLimit1 = buflen-2;
601b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const int32_t escapeLimit2 = buflen-6;
602b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UChar uc;
603b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
604b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(utext==NULL || resultChars==NULL || buflen<0) {
605b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return -1;
606b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
607b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
608b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for(i=0;i<limit && resultLen<buflen;++i) {
609b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        uc=utext[i];
610b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(len<0 && uc==0) {
611b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            break;
612b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
613b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(uc<0x20) {
614b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            for(j=0;j<ESCAPE_MAP_LENGTH && uc!=ESCAPE_MAP[j].sourceVal;j++) {
615b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
616b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if(j<ESCAPE_MAP_LENGTH) {
617b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                if(resultLen>escapeLimit1) {
618b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    break;
619b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                }
620b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                resultChars[resultLen++]='\\';
621b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                resultChars[resultLen++]=ESCAPE_MAP[j].escapedChar;
622b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                continue;
623b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
624b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else if(uc<0x7f) {
625b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            u_austrncpy(resultChars + resultLen, &uc, 1);
626b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            resultLen++;
627b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            continue;
628b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
629b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
630b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(resultLen>escapeLimit2) {
631b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            break;
632b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
633b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
634b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /* have to escape the uchar */
635b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        resultChars[resultLen++]='\\';
636b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        resultChars[resultLen++]='u';
637b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        resultChars[resultLen++]=HEX_DIGITS[(uc>>12)&0xff];
638b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        resultChars[resultLen++]=HEX_DIGITS[(uc>>8)&0xff];
639b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        resultChars[resultLen++]=HEX_DIGITS[(uc>>4)&0xff];
640b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        resultChars[resultLen++]=HEX_DIGITS[uc&0xff];
641b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
642b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
643b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(resultLen<buflen) {
644b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        resultChars[resultLen] = 0;
645b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
646b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
647b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return resultLen;
648b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
649b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Jitterbug 2439 -- markus 20030425
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The lookup of display names must not fall back through the default
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * locale because that yields useless results.
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestDisplayNames()
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buffer[100];
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing getDisplayName for different locales\n");
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("  In locale = en_US...\n");
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTestDisplayNames("en_US", DLANG_EN);
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("  In locale = fr_FR....\n");
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTestDisplayNames("fr_FR", DLANG_FR);
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("  In locale = ca_ES...\n");
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTestDisplayNames("ca_ES", DLANG_CA);
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("  In locale = gr_EL..\n");
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTestDisplayNames("el_GR", DLANG_EL);
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test that the default locale has a display name for its own language */
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
674f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    length=uloc_getDisplayLanguage(NULL, NULL, buffer, UPRV_LENGTHOF(buffer), &errorCode);
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || (length<=3 && buffer[0]<=0x7f)) {
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* check <=3 to reject getting the language code as a display name */
6776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("unable to get a display string for the language of the default locale - %s (Are you missing data?)\n", u_errorName(errorCode));
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test that we get the language code itself for an unknown language, and a default warning */
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
682f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    length=uloc_getDisplayLanguage("qq", "rr", buffer, UPRV_LENGTHOF(buffer), &errorCode);
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_USING_DEFAULT_WARNING || length!=2 || buffer[0]!=0x71 || buffer[1]!=0x71) {
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error getting the display string for an unknown language - %s\n", u_errorName(errorCode));
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test that we get a default warning for a display name where one component is unknown (4255) */
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
689f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    length=uloc_getDisplayName("qq_US_POSIX", "en_US", buffer, UPRV_LENGTHOF(buffer), &errorCode);
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_USING_DEFAULT_WARNING) {
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error getting the display name for a locale with an unknown language - %s\n", u_errorName(errorCode));
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t i;
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char *aLocale = "es@collation=traditional;calendar=japanese";
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char *testL[] = { "en_US",
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "fr_FR",
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "ca_ES",
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "el_GR" };
701b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        static const char *expect[] = { "Spanish (Calendar=Japanese Calendar, Sort Order=Traditional Sort Order)", /* note sorted order of keywords */
702f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "espagnol (calendrier=calendrier japonais, ordre de tri=Ordre traditionnel)",
70359d709d503bab6e2b61931737e662dd293b40578ccornelius            "espanyol (calendari=calendari japon\\u00e8s, ordenaci\\u00f3=ordre tradicional)",
70459d709d503bab6e2b61931737e662dd293b40578ccornelius            "\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac (\\u0397\\u03bc\\u03b5\\u03c1\\u03bf\\u03bb\\u03cc\\u03b3\\u03b9\\u03bf=\\u0399\\u03b1\\u03c0\\u03c9\\u03bd\\u03b9\\u03ba\\u03cc \\u03b7\\u03bc\\u03b5\\u03c1\\u03bf\\u03bb\\u03cc\\u03b3\\u03b9\\u03bf, \\u03a3\\u03b5\\u03b9\\u03c1\\u03ac \\u03c4\\u03b1\\u03be\\u03b9\\u03bd\\u03cc\\u03bc\\u03b7\\u03c3\\u03b7\\u03c2=\\u03a0\\u03b1\\u03c1\\u03b1\\u03b4\\u03bf\\u03c3\\u03b9\\u03b1\\u03ba\\u03ae \\u03c3\\u03b5\\u03b9\\u03c1\\u03ac \\u03c4\\u03b1\\u03be\\u03b9\\u03bd\\u03cc\\u03bc\\u03b7\\u03c3\\u03b7\\u03c2)" };
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar *expectBuffer;
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
707f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        for(i=0;i<UPRV_LENGTHOF(testL);i++) {
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errorCode = U_ZERO_ERROR;
709f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            uloc_getDisplayName(aLocale, testL[i], buffer, UPRV_LENGTHOF(buffer), &errorCode);
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_FAILURE(errorCode)) {
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL in uloc_getDisplayName(%s,%s,..) -> %s\n", aLocale, testL[i], u_errorName(errorCode));
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expectBuffer = CharsToUChars(expect[i]);
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(u_strcmp(buffer,expectBuffer)) {
7156d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                    log_data_err("FAIL in uloc_getDisplayName(%s,%s,..) expected '%s' got '%s' (Are you missing data?)\n", aLocale, testL[i], expect[i], austrdup(buffer));
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else {
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_verbose("pass in uloc_getDisplayName(%s,%s,..) got '%s'\n", aLocale, testL[i], expect[i]);
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                free(expectBuffer);
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
723b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
724b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* test that we properly preflight and return data when there's a non-default pattern,
725b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho       see ticket #8262. */
726b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {
727b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t i;
728b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        static const char *locale="az_Cyrl";
729b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        static const char *displayLocale="ja";
730b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        static const char *expectedChars =
73159d709d503bab6e2b61931737e662dd293b40578ccornelius                "\\u30a2\\u30bc\\u30eb\\u30d0\\u30a4\\u30b8\\u30e3\\u30f3\\u8a9e "
732b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                "(\\u30ad\\u30ea\\u30eb\\u6587\\u5b57)";
733b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UErrorCode ec=U_ZERO_ERROR;
734b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UChar result[256];
735b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t len;
736b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t preflightLen=uloc_getDisplayName(locale, displayLocale, NULL, 0, &ec);
737b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /* inconvenient semantics when preflighting, this condition is expected... */
738b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(ec==U_BUFFER_OVERFLOW_ERROR) {
739b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            ec=U_ZERO_ERROR;
740b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
741f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        len=uloc_getDisplayName(locale, displayLocale, result, UPRV_LENGTHOF(result), &ec);
742b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(U_FAILURE(ec)) {
743b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("uloc_getDisplayName(%s, %s...) returned error: %s",
744b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    locale, displayLocale, u_errorName(ec));
745b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else {
746b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            UChar *expected=CharsToUChars(expectedChars);
747b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            int32_t expectedLen=u_strlen(expected);
748b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
749b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if(len!=expectedLen) {
750b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_data_err("uloc_getDisplayName(%s, %s...) returned string of length %d, expected length %d",
751b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        locale, displayLocale, len, expectedLen);
752b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            } else if(preflightLen!=expectedLen) {
753b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_err("uloc_getDisplayName(%s, %s...) returned preflight length %d, expected length %d",
754b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        locale, displayLocale, preflightLen, expectedLen);
755b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            } else if(u_strncmp(result, expected, len)) {
756b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                int32_t cap=len*6+1;  /* worst case + space for trailing null */
757b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                char* resultChars=(char*)malloc(cap);
758b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                int32_t resultCharsLen=UCharsToEscapedAscii(result, len, resultChars, cap);
759b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                if(resultCharsLen<0 || resultCharsLen<cap-1) {
760b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    log_err("uloc_getDisplayName(%s, %s...) mismatch", locale, displayLocale);
761b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                } else {
762b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    log_err("uloc_getDisplayName(%s, %s...) returned '%s' but expected '%s'",
763b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            locale, displayLocale, resultChars, expectedChars);
764b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                }
765b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                free(resultChars);
766b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                resultChars=NULL;
767b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            } else {
768b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                /* test all buffer sizes */
769b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                for(i=len+1;i>=0;--i) {
770b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    len=uloc_getDisplayName(locale, displayLocale, result, i, &ec);
771b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    if(ec==U_BUFFER_OVERFLOW_ERROR) {
772b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        ec=U_ZERO_ERROR;
773b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    }
774b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    if(U_FAILURE(ec)) {
775b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        log_err("using buffer of length %d returned error %s", i, u_errorName(ec));
776b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        break;
777b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    }
778b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    if(len!=expectedLen) {
779b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        log_err("with buffer of length %d, expected length %d but got %d", i, expectedLen, len);
780b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        break;
781b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    }
782b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    /* There's no guarantee about what's in the buffer if we've overflowed, in particular,
783b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                     * we don't know that it's been filled, so no point in checking. */
784b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                }
785b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
786b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
787b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            free(expected);
788b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
789b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test for uloc_getAvialable()  and uloc_countAvilable()*/
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestGetAvailableLocales()
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *locList;
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t locCount,i;
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing the no of avialable locales\n");
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    locCount=uloc_countAvailable();
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (locCount == 0)
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("countAvailable() returned an empty list!\n");
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* use something sensible w/o hardcoding the count */
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else if(locCount < 0){
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("countAvailable() returned a wrong value!= %d\n", locCount);
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else{
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_info("Number of locales returned = %d\n", locCount);
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;i<locCount;i++){
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        locList=uloc_getAvailable(i);
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose(" %s\n", locList);
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test for u_getDataDirectory, u_setDataDirectory, uloc_getISO3Language */
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestDataDirectory()
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char            oldDirectory[512];
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char     *temp,*testValue1,*testValue2,*testValue3;
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char path[40] ="d:\\icu\\source\\test\\intltest" U_FILE_SEP_STRING; /*give the required path */
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing getDataDirectory()\n");
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = u_getDataDirectory();
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcpy(oldDirectory, temp);
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testValue1=uloc_getISO3Language("en_US");
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("first fetch of language retrieved  %s\n", testValue1);
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 != strcmp(testValue1,"eng")){
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Initial check of ISO3 language failed: expected \"eng\", got  %s \n", testValue1);
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*defining the path for DataDirectory */
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing setDataDirectory\n");
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_setDataDirectory( path );
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(strcmp(path, u_getDataDirectory())==0)
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("setDataDirectory working fine\n");
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in setDataDirectory. Directory not set correctly - came back as [%s], expected [%s]\n", u_getDataDirectory(), path);
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testValue2=uloc_getISO3Language("en_US");
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("second fetch of language retrieved  %s \n", testValue2);
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_setDataDirectory(oldDirectory);
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testValue3=uloc_getISO3Language("en_US");
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("third fetch of language retrieved  %s \n", testValue3);
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 != strcmp(testValue3,"eng")) {
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       log_err("get/setDataDirectory() failed: expected \"eng\", got \" %s  \" \n", testValue3);
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*=========================================================== */
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UChar _NUL=0;
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doTestDisplayNames(const char* displayLocale, int32_t compareIndex)
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t maxresultsize;
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *testLocale;
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar  *testLang  = 0;
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar  *testScript  = 0;
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar  *testCtry = 0;
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar  *testVar = 0;
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar  *testName = 0;
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar*  expectedLang = 0;
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar*  expectedScript = 0;
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar*  expectedCtry = 0;
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar*  expectedVar = 0;
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar*  expectedName = 0;
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerusetUpDataTable();
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;i<LOCALE_SIZE; ++i)
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testLocale=rawData2[NAME][i];
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Testing.....  %s\n", testLocale);
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        maxresultsize=0;
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        maxresultsize=uloc_getDisplayLanguage(testLocale, displayLocale, NULL, maxresultsize, &status);
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status==U_BUFFER_OVERFLOW_ERROR)
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status=U_ZERO_ERROR;
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testLang=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1));
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uloc_getDisplayLanguage(testLocale, displayLocale, testLang, maxresultsize + 1, &status);
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testLang=&_NUL;
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error in getDisplayLanguage()  %s\n", myErrorName(status));
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        maxresultsize=0;
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        maxresultsize=uloc_getDisplayScript(testLocale, displayLocale, NULL, maxresultsize, &status);
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status==U_BUFFER_OVERFLOW_ERROR)
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status=U_ZERO_ERROR;
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testScript=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1));
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uloc_getDisplayScript(testLocale, displayLocale, testScript, maxresultsize + 1, &status);
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testScript=&_NUL;
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error in getDisplayScript()  %s\n", myErrorName(status));
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        maxresultsize=0;
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        maxresultsize=uloc_getDisplayCountry(testLocale, displayLocale, NULL, maxresultsize, &status);
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status==U_BUFFER_OVERFLOW_ERROR)
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status=U_ZERO_ERROR;
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testCtry=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1));
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uloc_getDisplayCountry(testLocale, displayLocale, testCtry, maxresultsize + 1, &status);
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testCtry=&_NUL;
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error in getDisplayCountry()  %s\n", myErrorName(status));
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        maxresultsize=0;
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        maxresultsize=uloc_getDisplayVariant(testLocale, displayLocale, NULL, maxresultsize, &status);
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status==U_BUFFER_OVERFLOW_ERROR)
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status=U_ZERO_ERROR;
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testVar=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1));
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uloc_getDisplayVariant(testLocale, displayLocale, testVar, maxresultsize + 1, &status);
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testVar=&_NUL;
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Error in getDisplayVariant()  %s\n", myErrorName(status));
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        maxresultsize=0;
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        maxresultsize=uloc_getDisplayName(testLocale, displayLocale, NULL, maxresultsize, &status);
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status==U_BUFFER_OVERFLOW_ERROR)
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status=U_ZERO_ERROR;
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testName=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1));
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uloc_getDisplayName(testLocale, displayLocale, testName, maxresultsize + 1, &status);
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testName=&_NUL;
969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error in getDisplayName()  %s\n", myErrorName(status));
972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedLang=dataTable[compareIndex][i];
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(u_strlen(expectedLang)== 0)
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectedLang=dataTable[DLANG_EN][i];
977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedScript=dataTable[compareIndex + 1][i];
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(u_strlen(expectedScript)== 0)
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectedScript=dataTable[DSCRIPT_EN][i];
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedCtry=dataTable[compareIndex + 2][i];
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(u_strlen(expectedCtry)== 0)
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectedCtry=dataTable[DCTRY_EN][i];
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedVar=dataTable[compareIndex + 3][i];
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(u_strlen(expectedVar)== 0)
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectedVar=dataTable[DVAR_EN][i];
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedName=dataTable[compareIndex + 4][i];
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(u_strlen(expectedName) == 0)
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectedName=dataTable[DNAME_EN][i];
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 !=u_strcmp(testLang,expectedLang))  {
9956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_data_err(" Display Language mismatch: got %s expected %s displayLocale=%s (Are you missing data?)\n", austrdup(testLang), austrdup(expectedLang), displayLocale);
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != u_strcmp(testScript,expectedScript))   {
9996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_data_err(" Display Script mismatch: got %s expected %s displayLocale=%s (Are you missing data?)\n", austrdup(testScript), austrdup(expectedScript), displayLocale);
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != u_strcmp(testCtry,expectedCtry))   {
10036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_data_err(" Display Country mismatch: got %s expected %s displayLocale=%s (Are you missing data?)\n", austrdup(testCtry), austrdup(expectedCtry), displayLocale);
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != u_strcmp(testVar,expectedVar))    {
10076d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_data_err(" Display Variant mismatch: got %s expected %s displayLocale=%s (Are you missing data?)\n", austrdup(testVar), austrdup(expectedVar), displayLocale);
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(0 != u_strcmp(testName, expectedName))    {
10116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_data_err(" Display Name mismatch: got %s expected %s displayLocale=%s (Are you missing data?)\n", austrdup(testName), austrdup(expectedName), displayLocale);
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(testName!=&_NUL) {
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            free(testName);
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(testLang!=&_NUL) {
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            free(testLang);
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(testScript!=&_NUL) {
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            free(testScript);
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(testCtry!=&_NUL) {
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            free(testCtry);
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(testVar!=&_NUL) {
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            free(testVar);
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerucleanUpDataTable();
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
103359d709d503bab6e2b61931737e662dd293b40578ccornelius/*------------------------------
103459d709d503bab6e2b61931737e662dd293b40578ccornelius * TestDisplayNameBrackets
103559d709d503bab6e2b61931737e662dd293b40578ccornelius */
103659d709d503bab6e2b61931737e662dd293b40578ccornelius
103759d709d503bab6e2b61931737e662dd293b40578ccorneliustypedef struct {
103859d709d503bab6e2b61931737e662dd293b40578ccornelius    const char * displayLocale;
103959d709d503bab6e2b61931737e662dd293b40578ccornelius    const char * namedRegion;
104059d709d503bab6e2b61931737e662dd293b40578ccornelius    const char * namedLocale;
104159d709d503bab6e2b61931737e662dd293b40578ccornelius    const char * regionName;
104259d709d503bab6e2b61931737e662dd293b40578ccornelius    const char * localeName;
104359d709d503bab6e2b61931737e662dd293b40578ccornelius} DisplayNameBracketsItem;
104459d709d503bab6e2b61931737e662dd293b40578ccornelius
104559d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const DisplayNameBracketsItem displayNameBracketsItems[] = {
104659d709d503bab6e2b61931737e662dd293b40578ccornelius    { "en", "CC", "en_CC",      "Cocos (Keeling) Islands",  "English (Cocos [Keeling] Islands)"  },
104759d709d503bab6e2b61931737e662dd293b40578ccornelius    { "en", "MM", "my_MM",      "Myanmar (Burma)",          "Burmese (Myanmar [Burma])"          },
104859d709d503bab6e2b61931737e662dd293b40578ccornelius    { "en", "MM", "my_Mymr_MM", "Myanmar (Burma)",          "Burmese (Myanmar, Myanmar [Burma])" },
104959d709d503bab6e2b61931737e662dd293b40578ccornelius    { "zh", "CC", "en_CC",      "\\u79D1\\u79D1\\u65AF\\uFF08\\u57FA\\u6797\\uFF09\\u7FA4\\u5C9B", "\\u82F1\\u6587\\uFF08\\u79D1\\u79D1\\u65AF\\uFF3B\\u57FA\\u6797\\uFF3D\\u7FA4\\u5C9B\\uFF09" },
105059d709d503bab6e2b61931737e662dd293b40578ccornelius    { "zh", "CG", "fr_CG",      "\\u521A\\u679C\\uFF08\\u5E03\\uFF09",                             "\\u6CD5\\u6587\\uFF08\\u521A\\u679C\\uFF3B\\u5E03\\uFF3D\\uFF09" },
105159d709d503bab6e2b61931737e662dd293b40578ccornelius    { NULL, NULL, NULL,         NULL,                       NULL                                 }
105259d709d503bab6e2b61931737e662dd293b40578ccornelius};
105359d709d503bab6e2b61931737e662dd293b40578ccornelius
105459d709d503bab6e2b61931737e662dd293b40578ccorneliusenum { kDisplayNameBracketsMax = 128 };
105559d709d503bab6e2b61931737e662dd293b40578ccornelius
105659d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void TestDisplayNameBrackets()
105759d709d503bab6e2b61931737e662dd293b40578ccornelius{
105859d709d503bab6e2b61931737e662dd293b40578ccornelius    const DisplayNameBracketsItem * itemPtr = displayNameBracketsItems;
105959d709d503bab6e2b61931737e662dd293b40578ccornelius    for (; itemPtr->displayLocale != NULL; itemPtr++) {
106059d709d503bab6e2b61931737e662dd293b40578ccornelius        ULocaleDisplayNames * uldn;
106159d709d503bab6e2b61931737e662dd293b40578ccornelius        UErrorCode status;
106259d709d503bab6e2b61931737e662dd293b40578ccornelius        UChar expectRegionName[kDisplayNameBracketsMax];
106359d709d503bab6e2b61931737e662dd293b40578ccornelius        UChar expectLocaleName[kDisplayNameBracketsMax];
106459d709d503bab6e2b61931737e662dd293b40578ccornelius        UChar getName[kDisplayNameBracketsMax];
106559d709d503bab6e2b61931737e662dd293b40578ccornelius        int32_t ulen;
106659d709d503bab6e2b61931737e662dd293b40578ccornelius
106759d709d503bab6e2b61931737e662dd293b40578ccornelius        (void) u_unescape(itemPtr->regionName, expectRegionName, kDisplayNameBracketsMax);
106859d709d503bab6e2b61931737e662dd293b40578ccornelius        (void) u_unescape(itemPtr->localeName, expectLocaleName, kDisplayNameBracketsMax);
106959d709d503bab6e2b61931737e662dd293b40578ccornelius
107059d709d503bab6e2b61931737e662dd293b40578ccornelius        status = U_ZERO_ERROR;
107159d709d503bab6e2b61931737e662dd293b40578ccornelius        ulen = uloc_getDisplayCountry(itemPtr->namedLocale, itemPtr->displayLocale, getName, kDisplayNameBracketsMax, &status);
107259d709d503bab6e2b61931737e662dd293b40578ccornelius        if ( U_FAILURE(status) || u_strcmp(getName, expectRegionName) != 0 ) {
107359d709d503bab6e2b61931737e662dd293b40578ccornelius            log_data_err("uloc_getDisplayCountry for displayLocale %s and namedLocale %s returns unexpected name or status %s\n", itemPtr->displayLocale, itemPtr->namedLocale, myErrorName(status));
107459d709d503bab6e2b61931737e662dd293b40578ccornelius        }
107559d709d503bab6e2b61931737e662dd293b40578ccornelius
107659d709d503bab6e2b61931737e662dd293b40578ccornelius        status = U_ZERO_ERROR;
107759d709d503bab6e2b61931737e662dd293b40578ccornelius        ulen = uloc_getDisplayName(itemPtr->namedLocale, itemPtr->displayLocale, getName, kDisplayNameBracketsMax, &status);
107859d709d503bab6e2b61931737e662dd293b40578ccornelius        if ( U_FAILURE(status) || u_strcmp(getName, expectLocaleName) != 0 ) {
107959d709d503bab6e2b61931737e662dd293b40578ccornelius            log_data_err("uloc_getDisplayName for displayLocale %s and namedLocale %s returns unexpected name or status %s\n", itemPtr->displayLocale, itemPtr->namedLocale, myErrorName(status));
108059d709d503bab6e2b61931737e662dd293b40578ccornelius        }
108159d709d503bab6e2b61931737e662dd293b40578ccornelius
108259d709d503bab6e2b61931737e662dd293b40578ccornelius#if !UCONFIG_NO_FORMATTING
108359d709d503bab6e2b61931737e662dd293b40578ccornelius        status = U_ZERO_ERROR;
108459d709d503bab6e2b61931737e662dd293b40578ccornelius        uldn = uldn_open(itemPtr->displayLocale, ULDN_STANDARD_NAMES, &status);
108559d709d503bab6e2b61931737e662dd293b40578ccornelius        if (U_SUCCESS(status)) {
108659d709d503bab6e2b61931737e662dd293b40578ccornelius            status = U_ZERO_ERROR;
108759d709d503bab6e2b61931737e662dd293b40578ccornelius            ulen = uldn_regionDisplayName(uldn, itemPtr->namedRegion, getName, kDisplayNameBracketsMax, &status);
108859d709d503bab6e2b61931737e662dd293b40578ccornelius            if ( U_FAILURE(status) || u_strcmp(getName, expectRegionName) != 0 ) {
108959d709d503bab6e2b61931737e662dd293b40578ccornelius                log_data_err("uldn_regionDisplayName for displayLocale %s and namedRegion %s returns unexpected name or status %s\n", itemPtr->displayLocale, itemPtr->namedRegion, myErrorName(status));
109059d709d503bab6e2b61931737e662dd293b40578ccornelius            }
109159d709d503bab6e2b61931737e662dd293b40578ccornelius
109259d709d503bab6e2b61931737e662dd293b40578ccornelius            status = U_ZERO_ERROR;
109359d709d503bab6e2b61931737e662dd293b40578ccornelius            ulen = uldn_localeDisplayName(uldn, itemPtr->namedLocale, getName, kDisplayNameBracketsMax, &status);
109459d709d503bab6e2b61931737e662dd293b40578ccornelius            if ( U_FAILURE(status) || u_strcmp(getName, expectLocaleName) != 0 ) {
109559d709d503bab6e2b61931737e662dd293b40578ccornelius                log_data_err("uldn_localeDisplayName for displayLocale %s and namedLocale %s returns unexpected name or status %s\n", itemPtr->displayLocale, itemPtr->namedLocale, myErrorName(status));
109659d709d503bab6e2b61931737e662dd293b40578ccornelius            }
109759d709d503bab6e2b61931737e662dd293b40578ccornelius
109859d709d503bab6e2b61931737e662dd293b40578ccornelius            uldn_close(uldn);
109959d709d503bab6e2b61931737e662dd293b40578ccornelius        } else {
110059d709d503bab6e2b61931737e662dd293b40578ccornelius            log_data_err("uldn_open fails for displayLocale %s, status=%s\n", itemPtr->displayLocale, u_errorName(status));
110159d709d503bab6e2b61931737e662dd293b40578ccornelius        }
110259d709d503bab6e2b61931737e662dd293b40578ccornelius#endif
1103fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    (void)ulen;   /* Suppress variable not used warning */
110459d709d503bab6e2b61931737e662dd293b40578ccornelius    }
110559d709d503bab6e2b61931737e662dd293b40578ccornelius}
110659d709d503bab6e2b61931737e662dd293b40578ccornelius
110759d709d503bab6e2b61931737e662dd293b40578ccornelius/*------------------------------
110859d709d503bab6e2b61931737e662dd293b40578ccornelius * TestISOFunctions
110959d709d503bab6e2b61931737e662dd293b40578ccornelius */
111059d709d503bab6e2b61931737e662dd293b40578ccornelius
111154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test for uloc_getISOLanguages, uloc_getISOCountries */
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestISOFunctions()
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* const* str=uloc_getISOLanguages();
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* const* str1=uloc_getISOCountries();
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* test;
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *key = NULL;
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t count = 0, skipped = 0;
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t expect;
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *res;
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *subRes;
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*  test getISOLanguages*/
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*str=uloc_getISOLanguages(); */
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing ISO Languages: \n");
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* use structLocale - this data is no longer in root */
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    res = ures_openDirect(loadTestData(&status), "structLocale", &status);
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    subRes = ures_getByKey(res, "Languages", NULL, &status);
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1133c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_data_err("There is an error in structLocale's ures_getByKey(\"Languages\"), status=%s\n", u_errorName(status));
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect = ures_getSize(subRes);
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(count = 0; *(str+count) != 0; count++)
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        key = NULL;
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        test = *(str+count);
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        do {
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* Skip over language tags. This API only returns language codes. */
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            skipped += (key != NULL);
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ures_getNextString(subRes, NULL, &key, &status);
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while (key != NULL && strchr(key, '_'));
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(key == NULL)
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* TODO: Consider removing sh, which is deprecated */
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strcmp(key,"root") == 0 || strcmp(key,"Fallback") == 0 || strcmp(key,"sh") == 0) {
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ures_getNextString(subRes, NULL, &key, &status);
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            skipped++;
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_CHARSET_FAMILY==U_ASCII_FAMILY
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* This code only works on ASCII machines where the keys are stored in ASCII order */
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strcmp(test,key)) {
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* The first difference usually implies the place where things get out of sync */
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL Language diff at offset %d, \"%s\" != \"%s\"\n", count, test, key);
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!strcmp(test,"in"))
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL getISOLanguages() has obsolete language code %s\n", test);
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!strcmp(test,"iw"))
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL getISOLanguages() has obsolete language code %s\n", test);
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!strcmp(test,"ji"))
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL getISOLanguages() has obsolete language code %s\n", test);
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!strcmp(test,"jw"))
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL getISOLanguages() has obsolete language code %s\n", test);
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!strcmp(test,"sh"))
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL getISOLanguages() has obsolete language code %s\n", test);
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect -= skipped; /* Ignore the skipped resources from structLocale */
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(count!=expect) {
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("There is an error in getISOLanguages, got %d, expected %d (as per structLocale)\n", count, expect);
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    subRes = ures_getByKey(res, "Countries", subRes, &status);
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing ISO Countries");
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    skipped = 0;
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect = ures_getSize(subRes) - 1; /* Skip ZZ */
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(count = 0; *(str1+count) != 0; count++)
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        key = NULL;
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        test = *(str1+count);
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        do {
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* Skip over numeric UN tags. This API only returns ISO-3166 codes. */
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            skipped += (key != NULL);
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ures_getNextString(subRes, NULL, &key, &status);
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while (key != NULL && strlen(key) != 2);
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(key == NULL)
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* TODO: Consider removing CS, which is deprecated */
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while(strcmp(key,"QO") == 0 || strcmp(key,"QU") == 0 || strcmp(key,"CS") == 0) {
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ures_getNextString(subRes, NULL, &key, &status);
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            skipped++;
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_CHARSET_FAMILY==U_ASCII_FAMILY
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* This code only works on ASCII machines where the keys are stored in ASCII order */
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strcmp(test,key)) {
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* The first difference usually implies the place where things get out of sync */
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL Country diff at offset %d, \"%s\" != \"%s\"\n", count, test, key);
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!strcmp(test,"FX"))
1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL getISOCountries() has obsolete country code %s\n", test);
1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!strcmp(test,"YU"))
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL getISOCountries() has obsolete country code %s\n", test);
1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!strcmp(test,"ZR"))
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL getISOCountries() has obsolete country code %s\n", test);
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_getNextString(subRes, NULL, &key, &status);
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(key, "ZZ") != 0) {
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ZZ was expected to be the last entry in structLocale, but got %s\n", key);
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_CHARSET_FAMILY==U_EBCDIC_FAMILY
1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* On EBCDIC machines, the numbers are sorted last. Account for those in the skipped value too. */
1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    key = NULL;
1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    do {
1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Skip over numeric UN tags. uloc_getISOCountries only returns ISO-3166 codes. */
1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        skipped += (key != NULL);
1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ures_getNextString(subRes, NULL, &key, &status);
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (U_SUCCESS(status) && key != NULL && strlen(key) != 2);
1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect -= skipped; /* Ignore the skipped resources from structLocale */
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(count!=expect)
1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("There is an error in getISOCountries, got %d, expected %d \n", count, expect);
1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(subRes);
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(res);
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
124354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void setUpDataTable()
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i,j;
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dataTable = (UChar***)(calloc(sizeof(UChar**),LOCALE_INFO_SIZE));
1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < LOCALE_INFO_SIZE; i++) {
1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataTable[i] = (UChar**)(calloc(sizeof(UChar*),LOCALE_SIZE));
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (j = 0; j < LOCALE_SIZE; j++){
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dataTable[i][j] = CharsToUChars(rawData2[i][j]);
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void cleanUpDataTable()
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i,j;
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(dataTable != NULL) {
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i=0; i<LOCALE_INFO_SIZE; i++) {
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for(j = 0; j < LOCALE_SIZE; j++) {
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                free(dataTable[i][j]);
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            free(dataTable[i]);
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(dataTable);
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dataTable = NULL;
1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4011756 4011380
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestISO3Fallback()
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* test="xx_YY";
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char * result;
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = uloc_getISO3Language(test);
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Conform to C API usage  */
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!result || (result[0] != 0))
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       log_err("getISO3Language() on xx_YY returned %s instead of \"\"");
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = uloc_getISO3Country(test);
1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!result || (result[0] != 0))
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("getISO3Country() on xx_YY returned %s instead of \"\"");
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4118587
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSimpleDisplayNames()
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /*
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     This test is different from TestDisplayNames because TestDisplayNames checks
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     fallback behavior, combination of language and country names to form locale
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     names, and other stuff like that.  This test just checks specific language
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     and country codes to make sure we have the correct names for them.
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  */
1306b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    char languageCodes[] [4] = { "he", "id", "iu", "ug", "yi", "za", "419" };
13078393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    const char* languageNames [] = { "Hebrew", "Indonesian", "Inuktitut", "Uyghur", "Yiddish",
1308b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                               "Zhuang", "419" };
1309b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char* inLocale [] = { "en_US", "zh_Hant"};
1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status=U_ZERO_ERROR;
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
1313b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t localeIndex = 0;
1314b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (i = 0; i < 7; i++) {
1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar *testLang=0;
1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar *expectedLang=0;
1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int size=0;
1318b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1319b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (i == 6) {
1320b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            localeIndex = 1; /* Use the second locale for the rest of the test. */
1321b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1322b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1323b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        size=uloc_getDisplayLanguage(languageCodes[i], inLocale[localeIndex], NULL, size, &status);
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status==U_BUFFER_OVERFLOW_ERROR) {
1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status=U_ZERO_ERROR;
1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testLang=(UChar*)malloc(sizeof(UChar) * (size + 1));
1327b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            uloc_getDisplayLanguage(languageCodes[i], inLocale[localeIndex], testLang, size + 1, &status);
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedLang=(UChar*)malloc(sizeof(UChar) * (strlen(languageNames[i])+1));
1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrcpy(expectedLang, languageNames[i]);
1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (u_strcmp(testLang, expectedLang) != 0)
1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_data_err("Got wrong display name for %s : Expected \"%s\", got \"%s\".\n",
1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    languageCodes[i], languageNames[i], austrdup(testLang));
1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(testLang);
1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(expectedLang);
1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4118595
1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestUninstalledISO3Names()
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* This test checks to make sure getISO3Language and getISO3Country work right
1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     even for locales that are not installed. */
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char iso2Languages [][4] = {     "am", "ba", "fy", "mr", "rn",
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                        "ss", "tw", "zu" };
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char iso3Languages [][5] = {     "amh", "bak", "fry", "mar", "run",
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                        "ssw", "twi", "zul" };
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char iso2Countries [][6] = {     "am_AF", "ba_BW", "fy_KZ", "mr_MO", "rn_MN",
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                        "ss_SB", "tw_TC", "zu_ZW" };
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char iso3Countries [][4] = {     "AFG", "BWA", "KAZ", "MAC", "MNG",
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                        "SLB", "TCA", "ZWE" };
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < 8; i++) {
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      UErrorCode err = U_ZERO_ERROR;
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      const char *test;
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      test = uloc_getISO3Language(iso2Languages[i]);
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(strcmp(test, iso3Languages[i]) !=0 || U_FAILURE(err))
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         log_err("Got wrong ISO3 code for %s : Expected \"%s\", got \"%s\". %s\n",
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     iso2Languages[i], iso3Languages[i], test, myErrorName(err));
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < 8; i++) {
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      UErrorCode err = U_ZERO_ERROR;
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      const char *test;
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      test = uloc_getISO3Country(iso2Countries[i]);
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(strcmp(test, iso3Countries[i]) !=0 || U_FAILURE(err))
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         log_err("Got wrong ISO3 code for %s : Expected \"%s\", got \"%s\". %s\n",
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     iso2Countries[i], iso3Countries[i], test, myErrorName(err));
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestVariantParsing()
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* en_US_custom="en_US_De Anza_Cupertino_California_United States_Earth";
1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* dispName="English (United States, DE ANZA_CUPERTINO_CALIFORNIA_UNITED STATES_EARTH)";
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* dispVar="DE ANZA_CUPERTINO_CALIFORNIA_UNITED STATES_EARTH";
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* shortVariant="fr_FR_foo";
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* bogusVariant="fr_FR__foo";
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* bogusVariant2="fr_FR_foo_";
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* bogusVariant3="fr_FR__foo_";
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar displayVar[100];
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar displayName[100];
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status=U_ZERO_ERROR;
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar* got=0;
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t size=0;
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size=uloc_getDisplayVariant(en_US_custom, "en_US", NULL, size, &status);
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR) {
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        got=(UChar*)realloc(got, sizeof(UChar) * (size+1));
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uloc_getDisplayVariant(en_US_custom, "en_US", got, size + 1, &status);
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Didn't get U_BUFFER_OVERFLOW_ERROR\n");
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(displayVar, dispVar);
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(got,displayVar)!=0) {
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: getDisplayVariant() Wanted %s, got %s\n", dispVar, austrdup(got));
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size=0;
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size=uloc_getDisplayName(en_US_custom, "en_US", NULL, size, &status);
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR) {
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        got=(UChar*)realloc(got, sizeof(UChar) * (size+1));
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uloc_getDisplayName(en_US_custom, "en_US", got, size + 1, &status);
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Didn't get U_BUFFER_OVERFLOW_ERROR\n");
1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(displayName, dispName);
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(got,displayName)!=0) {
14176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (status == U_USING_DEFAULT_WARNING) {
14186d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_data_err("FAIL: getDisplayName() got %s. Perhaps you are missing data?\n", u_errorName(status));
14196d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        } else {
14206d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err("FAIL: getDisplayName() Wanted %s, got %s\n", dispName, austrdup(got));
14216d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size=0;
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size=uloc_getDisplayVariant(shortVariant, NULL, NULL, size, &status);
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR) {
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        got=(UChar*)realloc(got, sizeof(UChar) * (size+1));
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uloc_getDisplayVariant(shortVariant, NULL, got, size + 1, &status);
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Didn't get U_BUFFER_OVERFLOW_ERROR\n");
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(strcmp(austrdup(got),"FOO")!=0) {
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: getDisplayVariant()  Wanted: foo  Got: %s\n", austrdup(got));
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size=0;
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size=uloc_getDisplayVariant(bogusVariant, NULL, NULL, size, &status);
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR) {
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        got=(UChar*)realloc(got, sizeof(UChar) * (size+1));
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uloc_getDisplayVariant(bogusVariant, NULL, got, size + 1, &status);
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Didn't get U_BUFFER_OVERFLOW_ERROR\n");
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(strcmp(austrdup(got),"_FOO")!=0) {
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: getDisplayVariant()  Wanted: _FOO  Got: %s\n", austrdup(got));
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size=0;
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size=uloc_getDisplayVariant(bogusVariant2, NULL, NULL, size, &status);
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR) {
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        got=(UChar*)realloc(got, sizeof(UChar) * (size+1));
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uloc_getDisplayVariant(bogusVariant2, NULL, got, size + 1, &status);
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Didn't get U_BUFFER_OVERFLOW_ERROR\n");
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(strcmp(austrdup(got),"FOO_")!=0) {
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: getDisplayVariant()  Wanted: FOO_  Got: %s\n", austrdup(got));
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size=0;
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size=uloc_getDisplayVariant(bogusVariant3, NULL, NULL, size, &status);
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR) {
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        got=(UChar*)realloc(got, sizeof(UChar) * (size+1));
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uloc_getDisplayVariant(bogusVariant3, NULL, got, size + 1, &status);
1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Didn't get U_BUFFER_OVERFLOW_ERROR\n");
1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(strcmp(austrdup(got),"_FOO_")!=0) {
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: getDisplayVariant()  Wanted: _FOO_  Got: %s\n", austrdup(got));
1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(got);
1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestObsoleteNames(void)
1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buff[256];
1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct
1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char locale[9];
1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char lang3[4];
1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char lang[4];
1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char ctry3[4];
1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char ctry[4];
1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } tests[] =
1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "eng_USA", "eng", "en", "USA", "US" },
1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "kok",  "kok", "kok", "", "" },
1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "in",  "ind", "in", "", "" },
1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "id",  "ind", "id", "", "" }, /* NO aliasing */
1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "sh",  "srp", "sh", "", "" },
1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zz_CS",  "", "zz", "SCG", "CS" },
1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zz_FX",  "", "zz", "FXX", "FX" },
1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zz_RO",  "", "zz", "ROU", "RO" },
1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zz_TP",  "", "zz", "TMP", "TP" },
1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zz_TL",  "", "zz", "TLS", "TL" },
1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zz_ZR",  "", "zz", "ZAR", "ZR" },
1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zz_FXX",  "", "zz", "FXX", "FX" }, /* no aliasing. Doesn't go to PS(PSE). */
1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zz_ROM",  "", "zz", "ROU", "RO" },
1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zz_ROU",  "", "zz", "ROU", "RO" },
1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zz_ZAR",  "", "zz", "ZAR", "ZR" },
1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zz_TMP",  "", "zz", "TMP", "TP" },
1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zz_TLS",  "", "zz", "TLS", "TL" },
1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zz_YUG",  "", "zz", "YUG", "YU" },
1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "mlt_PSE", "mlt", "mt", "PSE", "PS" },
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "iw", "heb", "iw", "", "" },
1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ji", "yid", "ji", "", "" },
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "jw", "jaw", "jw", "", "" },
1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "sh", "srp", "sh", "", "" },
1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "", "", "", "", "" }
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;tests[i].locale[0];i++)
1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *locale;
1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        locale = tests[i].locale;
1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("** %s:\n", locale);
1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strcmp(tests[i].lang3,uloc_getISO3Language(locale)))
1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: uloc_getISO3Language(%s)==\t\"%s\",\t expected \"%s\"\n",
1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                locale,  uloc_getISO3Language(locale), tests[i].lang3);
1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("   uloc_getISO3Language()==\t\"%s\"\n",
1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                uloc_getISO3Language(locale) );
1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uloc_getLanguage(locale, buff, 256, &status);
1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status))
1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: error getting language from %s\n", locale);
1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(strcmp(buff,tests[i].lang))
1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {
1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: uloc_getLanguage(%s)==\t\"%s\"\t expected \"%s\"\n",
1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    locale, buff, tests[i].lang);
1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else
1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {
1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose("  uloc_getLanguage(%s)==\t%s\n", locale, buff);
1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strcmp(tests[i].lang3,uloc_getISO3Language(locale)))
1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: uloc_getISO3Language(%s)==\t\"%s\",\t expected \"%s\"\n",
1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                locale,  uloc_getISO3Language(locale), tests[i].lang3);
1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("   uloc_getISO3Language()==\t\"%s\"\n",
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                uloc_getISO3Language(locale) );
1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strcmp(tests[i].ctry3,uloc_getISO3Country(locale)))
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: uloc_getISO3Country(%s)==\t\"%s\",\t expected \"%s\"\n",
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                locale,  uloc_getISO3Country(locale), tests[i].ctry3);
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("   uloc_getISO3Country()==\t\"%s\"\n",
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                uloc_getISO3Country(locale) );
1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uloc_getCountry(locale, buff, 256, &status);
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status))
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: error getting country from %s\n", locale);
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(strcmp(buff,tests[i].ctry))
1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {
1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: uloc_getCountry(%s)==\t\"%s\"\t expected \"%s\"\n",
1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    locale, buff, tests[i].ctry);
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose("  uloc_getCountry(%s)==\t%s\n", locale, buff);
1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (uloc_getLCID("iw_IL") != uloc_getLCID("he_IL")) {
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("he,iw LCID mismatch: %X versus %X\n", uloc_getLCID("iw_IL"), uloc_getLCID("he_IL"));
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (uloc_getLCID("iw") != uloc_getLCID("he")) {
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("he,iw LCID mismatch: %X versus %X\n", uloc_getLCID("iw"), uloc_getLCID("he"));
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = uloc_getLanguage("kok",NULL,0,&icu_err);
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(icu_err))
1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Got %s trying to do uloc_getLanguage(kok)\n", u_errorName(icu_err));
1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    icu_err = U_ZERO_ERROR;
1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uloc_getLanguage("kok",r1_buff,12,&icu_err);
1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(icu_err))
1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Got %s trying to do uloc_getLanguage(kok, buff)\n", u_errorName(icu_err));
1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    r1_addr = (char *)uloc_getISO3Language("kok");
1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    icu_err = U_ZERO_ERROR;
1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(r1_buff,"kok") != 0)
1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: uloc_getLanguage(kok)==%s not kok\n",r1_buff);
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        line--;
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    r1_addr = (char *)uloc_getISO3Language("in");
1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = uloc_getLanguage(r1_addr,r1_buff,12,&icu_err);
1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(r1_buff,"id") != 0)
1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        printf("uloc_getLanguage error (%s)\n",r1_buff);
1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        line--;
1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    r1_addr = (char *)uloc_getISO3Language("sh");
1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = uloc_getLanguage(r1_addr,r1_buff,12,&icu_err);
1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(r1_buff,"sr") != 0)
1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        printf("uloc_getLanguage error (%s)\n",r1_buff);
1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        line--;
1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    r1_addr = (char *)uloc_getISO3Country("zz_ZR");
1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcpy(p1_buff,"zz_");
1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcat(p1_buff,r1_addr);
1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = uloc_getCountry(p1_buff,r1_buff,12,&icu_err);
1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(r1_buff,"ZR") != 0)
1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        printf("uloc_getCountry error (%s)\n",r1_buff);
1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        line--;
1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    r1_addr = (char *)uloc_getISO3Country("zz_FX");
1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcpy(p1_buff,"zz_");
1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcat(p1_buff,r1_addr);
1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = uloc_getCountry(p1_buff,r1_buff,12,&icu_err);
1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(r1_buff,"FX") != 0)
1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        printf("uloc_getCountry error (%s)\n",r1_buff);
1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        line--;
1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestKeywordVariants(void)
1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *localeID;
1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *expectedLocaleID;
1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *expectedLocaleIDNoKeywords;
1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *expectedCanonicalID;
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *expectedKeywords[10];
1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t numKeywords;
1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode expectedStatus; /* from uloc_openKeywords */
1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } testCases[] = {
1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE@  currency = euro; C o ll A t i o n   = Phonebook   ; C alen dar = buddhist   ",
1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE@calendar=buddhist;collation=Phonebook;currency=euro",
1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE",
1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE@calendar=buddhist;collation=Phonebook;currency=euro",
1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {"calendar", "collation", "currency"},
1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            3,
1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            U_ZERO_ERROR
1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE@euro",
1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE@euro",
1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE",
1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE@currency=EUR",
1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {"","","","","","",""},
1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            0,
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            U_INVALID_FORMAT_ERROR /* must have '=' after '@' */
1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE@euro;collation=phonebook",
1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE", /* error result; bad format */
1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE", /* error result; bad format */
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "de_DE", /* error result; bad format */
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {"","","","","","",""},
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            0,
1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            U_INVALID_FORMAT_ERROR
1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0, j = 0;
1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultLen = 0;
1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[256];
1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UEnumeration *keywords;
1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t keyCount = 0;
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *keyword = NULL;
1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t keywordLen = 0;
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) {
1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *buffer = 0;
1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        keywords = uloc_openKeywords(testCases[i].localeID, &status);
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status != testCases[i].expectedStatus) {
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Expected to uloc_openKeywords(\"%s\") => status %s. Got %s instead\n",
1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    testCases[i].localeID,
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    u_errorName(testCases[i].expectedStatus), u_errorName(status));
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(keywords) {
1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if((keyCount = uenum_count(keywords, &status)) != testCases[i].numKeywords) {
1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Expected to get %i keywords, got %i\n", testCases[i].numKeywords, keyCount);
1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(keyCount) {
1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                j = 0;
1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                while((keyword = uenum_next(keywords, &keywordLen, &status))) {
1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if(strcmp(keyword, testCases[i].expectedKeywords[j]) != 0) {
1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        log_err("Expected to get keyword value %s, got %s\n", testCases[i].expectedKeywords[j], keyword);
1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    j++;
1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                j = 0;
1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                uenum_reset(keywords, &status);
1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                while((keyword = uenum_next(keywords, &keywordLen, &status))) {
1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if(strcmp(keyword, testCases[i].expectedKeywords[j]) != 0) {
1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        log_err("Expected to get keyword value %s, got %s\n", testCases[i].expectedKeywords[j], keyword);
1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    j++;
1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uenum_close(keywords);
1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultLen = uloc_getName(testCases[i].localeID, buffer, 256, &status);
175759d709d503bab6e2b61931737e662dd293b40578ccornelius        (void)resultLen;    /* Suppress set but not used warning. */
1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (uprv_strcmp(testCases[i].expectedLocaleID, buffer) != 0) {
1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Expected uloc_getName(\"%s\") => \"%s\"; got \"%s\"\n",
1760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    testCases[i].localeID, testCases[i].expectedLocaleID, buffer);
1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultLen = uloc_canonicalize(testCases[i].localeID, buffer, 256, &status);
1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (uprv_strcmp(testCases[i].expectedCanonicalID, buffer) != 0) {
1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Expected uloc_canonicalize(\"%s\") => \"%s\"; got \"%s\"\n",
1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    testCases[i].localeID, testCases[i].expectedCanonicalID, buffer);
1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestKeywordVariantParsing(void)
1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *localeID;
1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *keyword;
1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *expectedValue;
1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } testCases[] = {
1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_DE@  C o ll A t i o n   = Phonebook   ", "c o ll a t i o n", "Phonebook" },
1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_DE", "collation", ""},
1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_DE@collation=PHONEBOOK", "collation", "PHONEBOOK" },
1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_DE@currency = euro; CoLLaTion   = PHONEBOOk", "collatiON", "PHONEBOOk" },
1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0;
1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultLen = 0;
1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[256];
1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) {
1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *buffer = 0;
1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultLen = uloc_getKeywordValue(testCases[i].localeID, testCases[i].keyword, buffer, 256, &status);
179359d709d503bab6e2b61931737e662dd293b40578ccornelius        (void)resultLen;    /* Suppress set but not used warning. */
1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(uprv_strcmp(testCases[i].expectedValue, buffer) != 0) {
1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Expected to extract \"%s\" from \"%s\" for keyword \"%s\". Got \"%s\" instead\n",
1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                testCases[i].expectedValue, testCases[i].localeID, testCases[i].keyword, buffer);
1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const struct {
1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char *l; /* locale */
1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char *k; /* kw */
1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char *v; /* value */
1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char *x; /* expected */
1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} kwSetTestCases[] = {
1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 1
1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "en_US", "calendar", "japanese", "en_US@calendar=japanese" },
1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "en_US@", "calendar", "japanese", "en_US@calendar=japanese" },
1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "en_US@calendar=islamic", "calendar", "japanese", "en_US@calendar=japanese" },
1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "en_US@calendar=slovakian", "calendar", "gregorian", "en_US@calendar=gregorian" }, /* don't know what this means, but it has the same # of chars as gregorian */
1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "en_US@calendar=gregorian", "calendar", "japanese", "en_US@calendar=japanese" },
1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "de", "Currency", "CHF", "de@currency=CHF" },
1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "de", "Currency", "CHF", "de@currency=CHF" },
1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "en_US@collation=phonebook", "calendar", "japanese", "en_US@calendar=japanese;collation=phonebook" },
1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "en_US@calendar=japanese", "collation", "phonebook", "en_US@calendar=japanese;collation=phonebook" },
1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "de@collation=phonebook", "Currency", "CHF", "de@collation=phonebook;currency=CHF" },
1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "en_US@calendar=gregorian;collation=phonebook", "calendar", "japanese", "en_US@calendar=japanese;collation=phonebook" },
1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "en_US@calendar=slovakian;collation=phonebook", "calendar", "gregorian", "en_US@calendar=gregorian;collation=phonebook" }, /* don't know what this means, but it has the same # of chars as gregorian */
1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "en_US@calendar=slovakian;collation=videobook", "collation", "phonebook", "en_US@calendar=slovakian;collation=phonebook" }, /* don't know what this means, but it has the same # of chars as gregorian */
1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "en_US@calendar=islamic;collation=phonebook", "calendar", "japanese", "en_US@calendar=japanese;collation=phonebook" },
1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "de@collation=phonebook", "Currency", "CHF", "de@collation=phonebook;currency=CHF" },
1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 1
1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "mt@a=0;b=1;c=2;d=3", "c","j", "mt@a=0;b=1;c=j;d=3" },
1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "mt@a=0;b=1;c=2;d=3", "x","j", "mt@a=0;b=1;c=2;d=3;x=j" },
1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "mt@a=0;b=1;c=2;d=3", "a","f", "mt@a=f;b=1;c=2;d=3" },
1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "mt@a=0;aa=1;aaa=3", "a","x", "mt@a=x;aa=1;aaa=3" },
1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "mt@a=0;aa=1;aaa=3", "aa","x", "mt@a=0;aa=x;aaa=3" },
1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "mt@a=0;aa=1;aaa=3", "aaa","x", "mt@a=0;aa=1;aaa=x" },
1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "mt@a=0;aa=1;aaa=3", "a","yy", "mt@a=yy;aa=1;aaa=3" },
1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "mt@a=0;aa=1;aaa=3", "aa","yy", "mt@a=0;aa=yy;aaa=3" },
1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "mt@a=0;aa=1;aaa=3", "aaa","yy", "mt@a=0;aa=1;aaa=yy" },
1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 1
1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* removal tests */
1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* 1. removal of item at end */
1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "de@collation=phonebook;currency=CHF", "currency",   "", "de@collation=phonebook" },
1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "de@collation=phonebook;currency=CHF", "currency", NULL, "de@collation=phonebook" },
1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* 2. removal of item at beginning */
1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "de@collation=phonebook;currency=CHF", "collation", "", "de@currency=CHF" },
1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "de@collation=phonebook;currency=CHF", "collation", NULL, "de@currency=CHF" },
1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* 3. removal of an item not there */
1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "de@collation=phonebook;currency=CHF", "calendar", NULL, "de@collation=phonebook;currency=CHF" },
1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* 4. removal of only item */
1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "de@collation=phonebook", "collation", NULL, "de" },
1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { "de@collation=phonebook", "Currency", "CHF", "de@collation=phonebook;currency=CHF" }
1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestKeywordSet(void)
1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0;
1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultLen = 0;
1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[1024];
1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char cbuffer[1024];
1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < sizeof(kwSetTestCases)/sizeof(kwSetTestCases[0]); i++) {
1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memset(buffer,'%',1023);
1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(buffer, kwSetTestCases[i].l);
1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uloc_canonicalize(kwSetTestCases[i].l, cbuffer, 1023, &status);
1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strcmp(buffer,cbuffer)) {
1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_verbose("note: [%d] wasn't canonical, should be: '%s' not '%s'. Won't check for canonicity in output.\n", i, cbuffer, buffer);
1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          /* sanity check test case results for canonicity */
1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uloc_canonicalize(kwSetTestCases[i].x, cbuffer, 1023, &status);
1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strcmp(kwSetTestCases[i].x,cbuffer)) {
1873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_err("%s:%d: ERROR: kwSetTestCases[%d].x = '%s', should be %s (must be canonical)\n", __FILE__, __LINE__, i, kwSetTestCases[i].x, cbuffer);
1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultLen = uloc_setKeywordValue(kwSetTestCases[i].k, kwSetTestCases[i].v, buffer, 1023, &status);
1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)) {
1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_err("Err on test case %d: got error %s\n", i, u_errorName(status));
1879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          continue;
1880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strcmp(buffer,kwSetTestCases[i].x) || ((int32_t)strlen(buffer)!=resultLen)) {
1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_err("FAIL: #%d: %s + [%s=%s] -> %s (%d) expected %s (%d)\n", i, kwSetTestCases[i].l, kwSetTestCases[i].k,
1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  kwSetTestCases[i].v, buffer, resultLen, kwSetTestCases[i].x, strlen(buffer));
1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_verbose("pass: #%d: %s + [%s=%s] -> %s\n", i, kwSetTestCases[i].l, kwSetTestCases[i].k, kwSetTestCases[i].v,buffer);
1886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestKeywordSetError(void)
1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[1024];
1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status;
1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t res;
1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t blen;
1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* 0-test whether an error condition modifies the buffer at all */
1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    blen=0;
1900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i=0;
1901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(buffer,'%',1023);
1902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    res = uloc_setKeywordValue(kwSetTestCases[i].k, kwSetTestCases[i].v, buffer, blen, &status);
1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status != U_ILLEGAL_ARGUMENT_ERROR) {
1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("expected illegal err got %s\n", u_errorName(status));
1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*  if(res!=strlen(kwSetTestCases[i].x)) {
1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("expected result %d got %d\n", strlen(kwSetTestCases[i].x), res);
1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return;
1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } */
1912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(buffer[blen]!='%') {
1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Buffer byte %d was modified: now %c\n", blen, buffer[blen]);
1914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("0-buffer modify OK\n");
1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;i<=2;i++) {
1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* 1- test a short buffer with growing text */
1920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        blen=(int32_t)strlen(kwSetTestCases[i].l)+1;
1921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memset(buffer,'%',1023);
1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(buffer,kwSetTestCases[i].l);
1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        res = uloc_setKeywordValue(kwSetTestCases[i].k, kwSetTestCases[i].v, buffer, blen, &status);
1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status != U_BUFFER_OVERFLOW_ERROR) {
1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("expected buffer overflow on buffer %d got %s, len %d (%s + [%s=%s])\n", blen, u_errorName(status), res, kwSetTestCases[i].l, kwSetTestCases[i].k, kwSetTestCases[i].v);
1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(res!=(int32_t)strlen(kwSetTestCases[i].x)) {
1930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("expected result %d got %d\n", strlen(kwSetTestCases[i].x), res);
1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(buffer[blen]!='%') {
1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Buffer byte %d was modified: now %c\n", blen, buffer[blen]);
1935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("1/%d-buffer modify OK\n",i);
1938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=3;i<=4;i++) {
1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* 2- test a short buffer - text the same size or shrinking   */
1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        blen=(int32_t)strlen(kwSetTestCases[i].l)+1;
1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memset(buffer,'%',1023);
1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(buffer,kwSetTestCases[i].l);
1945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        res = uloc_setKeywordValue(kwSetTestCases[i].k, kwSetTestCases[i].v, buffer, blen, &status);
1947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status != U_ZERO_ERROR) {
1948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("expected zero error got %s\n", u_errorName(status));
1949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(buffer[blen+1]!='%') {
1952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Buffer byte %d was modified: now %c\n", blen+1, buffer[blen+1]);
1953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(res!=(int32_t)strlen(kwSetTestCases[i].x)) {
1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("expected result %d got %d\n", strlen(kwSetTestCases[i].x), res);
1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strcmp(buffer,kwSetTestCases[i].x) || ((int32_t)strlen(buffer)!=res)) {
1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: #%d: %s + [%s=%s] -> %s (%d) expected %s (%d)\n", i, kwSetTestCases[i].l, kwSetTestCases[i].k,
1961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                kwSetTestCases[i].v, buffer, res, kwSetTestCases[i].x, strlen(buffer));
1962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("pass: #%d: %s + [%s=%s] -> %s\n", i, kwSetTestCases[i].l, kwSetTestCases[i].k, kwSetTestCases[i].v,
1964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                buffer);
1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("2/%d-buffer modify OK\n",i);
1967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t _canonicalize(int32_t selector, /* 0==getName, 1==canonicalize */
1971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const char* localeID,
1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             char* result,
1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             int32_t resultCapacity,
1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             UErrorCode* ec) {
1975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* YOU can change this to use function pointers if you like */
1976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (selector) {
1977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 0:
1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return uloc_getName(localeID, result, resultCapacity, ec);
1979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 1:
1980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return uloc_canonicalize(localeID, result, resultCapacity, ec);
1981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
1982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return -1;
1983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCanonicalization(void)
1987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *localeID;    /* input */
1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *getNameID;   /* expected getName() result */
1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *canonicalID; /* expected canonicalize() result */
1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } testCases[] = {
1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ca_ES_PREEURO-with-extra-stuff-that really doesn't make any sense-unless-you're trying to increase code coverage",
1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          "ca_ES_PREEURO_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE",
1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          "ca_ES_PREEURO_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE"},
1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ca_ES_PREEURO", "ca_ES_PREEURO", "ca_ES@currency=ESP" },
1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_AT_PREEURO", "de_AT_PREEURO", "de_AT@currency=ATS" },
1998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_DE_PREEURO", "de_DE_PREEURO", "de_DE@currency=DEM" },
1999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_LU_PREEURO", "de_LU_PREEURO", "de_LU@currency=LUF" },
2000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "el_GR_PREEURO", "el_GR_PREEURO", "el_GR@currency=GRD" },
2001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "en_BE_PREEURO", "en_BE_PREEURO", "en_BE@currency=BEF" },
2002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "en_IE_PREEURO", "en_IE_PREEURO", "en_IE@currency=IEP" },
2003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "es_ES_PREEURO", "es_ES_PREEURO", "es_ES@currency=ESP" },
2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "eu_ES_PREEURO", "eu_ES_PREEURO", "eu_ES@currency=ESP" },
2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "fi_FI_PREEURO", "fi_FI_PREEURO", "fi_FI@currency=FIM" },
2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "fr_BE_PREEURO", "fr_BE_PREEURO", "fr_BE@currency=BEF" },
2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "fr_FR_PREEURO", "fr_FR_PREEURO", "fr_FR@currency=FRF" },
2008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "fr_LU_PREEURO", "fr_LU_PREEURO", "fr_LU@currency=LUF" },
2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ga_IE_PREEURO", "ga_IE_PREEURO", "ga_IE@currency=IEP" },
2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "gl_ES_PREEURO", "gl_ES_PREEURO", "gl_ES@currency=ESP" },
2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "it_IT_PREEURO", "it_IT_PREEURO", "it_IT@currency=ITL" },
2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "nl_BE_PREEURO", "nl_BE_PREEURO", "nl_BE@currency=BEF" },
2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "nl_NL_PREEURO", "nl_NL_PREEURO", "nl_NL@currency=NLG" },
2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "pt_PT_PREEURO", "pt_PT_PREEURO", "pt_PT@currency=PTE" },
2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de__PHONEBOOK", "de__PHONEBOOK", "de@collation=phonebook" },
2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "en_GB_EURO", "en_GB_EURO", "en_GB@currency=EUR" },
2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "en_GB@EURO", "en_GB@EURO", "en_GB@currency=EUR" }, /* POSIX ID */
2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "es__TRADITIONAL", "es__TRADITIONAL", "es@collation=traditional" },
2019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "hi__DIRECT", "hi__DIRECT", "hi@collation=direct" },
2020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ja_JP_TRADITIONAL", "ja_JP_TRADITIONAL", "ja_JP@calendar=japanese" },
2021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "th_TH_TRADITIONAL", "th_TH_TRADITIONAL", "th_TH@calendar=buddhist" },
2022c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "zh_TW_STROKE", "zh_TW_STROKE", "zh_TW@collation=stroke" },
2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zh__PINYIN", "zh__PINYIN", "zh@collation=pinyin" },
2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zh@collation=pinyin", "zh@collation=pinyin", "zh@collation=pinyin" },
2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zh_CN@collation=pinyin", "zh_CN@collation=pinyin", "zh_CN@collation=pinyin" },
2026c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "zh_CN_STROKE", "zh_CN_STROKE", "zh_CN@collation=stroke" },
2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zh_CN_CA@collation=pinyin", "zh_CN_CA@collation=pinyin", "zh_CN_CA@collation=pinyin" },
2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "en_US_POSIX", "en_US_POSIX", "en_US_POSIX" },
2029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "hy_AM_REVISED", "hy_AM_REVISED", "hy_AM_REVISED" },
2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "no_NO_NY", "no_NO_NY", "no_NO_NY" /* not: "nn_NO" [alan ICU3.0] */ },
2031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "no@ny", "no@ny", "no__NY" /* not: "nn" [alan ICU3.0] */ }, /* POSIX ID */
2032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "no-no.utf32@B", "no_NO.utf32@B", "no_NO_B" /* not: "nb_NO_B" [alan ICU3.0] */ }, /* POSIX ID */
2033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "qz-qz@Euro", "qz_QZ@Euro", "qz_QZ@currency=EUR" }, /* qz-qz uses private use iso codes */
203454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        { "en-BOONT", "en__BOONT", "en__BOONT" }, /* registered name */
203554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        { "de-1901", "de__1901", "de__1901" }, /* registered name */
203654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        { "de-1906", "de__1906", "de__1906" }, /* registered name */
2037c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "sr-SP-Cyrl", "sr_SP_CYRL", "sr_Cyrl_RS" }, /* .NET name */
2038c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "sr-SP-Latn", "sr_SP_LATN", "sr_Latn_RS" }, /* .NET name */
2039c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "sr_YU_CYRILLIC", "sr_YU_CYRILLIC", "sr_Cyrl_RS" }, /* Linux name */
2040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "uz-UZ-Cyrl", "uz_UZ_CYRL", "uz_Cyrl_UZ" }, /* .NET name */
2041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "uz-UZ-Latn", "uz_UZ_LATN", "uz_Latn_UZ" }, /* .NET name */
2042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zh-CHS", "zh_CHS", "zh_Hans" }, /* .NET name */
2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "zh-CHT", "zh_CHT", "zh_Hant" }, /* .NET name This may change back to zh_Hant */
2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* posix behavior that used to be performed by getName */
2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "mr.utf8", "mr.utf8", "mr" },
2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de-tv.koi8r", "de_TV.koi8r", "de_TV" },
2048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "x-piglatin_ML.MBE", "x-piglatin_ML.MBE", "x-piglatin_ML" },
2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "i-cherokee_US.utf7", "i-cherokee_US.utf7", "i-cherokee_US" },
2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA" },
2051b13da9df870a61b11249bf741347908dbea0edd8Jean-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 */
2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* fleshing out canonicalization */
2054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* trim space and sort keywords, ';' is separator so not present at end in canonical form */
2055b13da9df870a61b11249bf741347908dbea0edd8Jean-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" },
2056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* already-canonical ids are not changed */
2057b13da9df870a61b11249bf741347908dbea0edd8Jean-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" },
2058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* PRE_EURO and EURO conversions don't affect other keywords */
2059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "es_ES_PREEURO@CALendar=Japanese", "es_ES_PREEURO@calendar=Japanese", "es_ES@calendar=Japanese;currency=ESP" },
2060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "es_ES_EURO@SHOUT=zipeedeedoodah", "es_ES_EURO@shout=zipeedeedoodah", "es_ES@currency=EUR;shout=zipeedeedoodah" },
2061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* currency keyword overrides PRE_EURO and EURO currency */
2062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "es_ES_PREEURO@currency=EUR", "es_ES_PREEURO@currency=EUR", "es_ES@currency=EUR" },
2063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "es_ES_EURO@currency=ESP", "es_ES_EURO@currency=ESP", "es_ES@currency=ESP" },
2064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* norwegian is just too weird, if we handle things in their full generality */
2065b13da9df870a61b11249bf741347908dbea0edd8Jean-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] */ },
2066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* test cases reflecting internal resource bundle usage */
2068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "root@kw=foo", "root@kw=foo", "root@kw=foo" },
2069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "@calendar=gregorian", "@calendar=gregorian", "@calendar=gregorian" },
2070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ja_JP@calendar=Japanese", "ja_JP@calendar=Japanese", "ja_JP@calendar=Japanese" },
2071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ja_JP", "ja_JP", "ja_JP" },
2072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* test case for "i-default" */
2074b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        { "i-default", "en@x=i-default", "en@x=i-default" }
2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* label[] = { "getName", "canonicalize" };
2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, j, resultLen = 0, origResultLen;
2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[256];
2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i < sizeof(testCases)/sizeof(testCases[0]); i++) {
2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (j=0; j<2; ++j) {
2085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const char* expected = (j==0) ? testCases[i].getNameID : testCases[i].canonicalID;
2086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *buffer = 0;
2087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
2088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (expected == NULL) {
2090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expected = uloc_getDefault();
2091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* log_verbose("testing %s -> %s\n", testCases[i], testCases[i].canonicalID); */
2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            origResultLen = _canonicalize(j, testCases[i].localeID, NULL, 0, &status);
2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (status != U_BUFFER_OVERFLOW_ERROR) {
2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: uloc_%s(%s) => %s, expected U_BUFFER_OVERFLOW_ERROR\n",
2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        label[j], testCases[i].localeID, u_errorName(status));
2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                continue;
2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            resultLen = _canonicalize(j, testCases[i].localeID, buffer, sizeof(buffer), &status);
2102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: uloc_%s(%s) => %s, expected U_ZERO_ERROR\n",
2104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        label[j], testCases[i].localeID, u_errorName(status));
2105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                continue;
2106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(uprv_strcmp(expected, buffer) != 0) {
2108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: uloc_%s(%s) => \"%s\", expected \"%s\"\n",
2109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        label[j], testCases[i].localeID, buffer, expected);
2110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
2111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose("Ok: uloc_%s(%s) => \"%s\"\n",
2112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            label[j], testCases[i].localeID, buffer);
2113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (resultLen != (int32_t)strlen(buffer)) {
2115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: uloc_%s(%s) => len %d, expected len %d\n",
2116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        label[j], testCases[i].localeID, resultLen, strlen(buffer));
2117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (origResultLen != resultLen) {
2119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: uloc_%s(%s) => preflight len %d != actual len %d\n",
2120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        label[j], testCases[i].localeID, origResultLen, resultLen);
2121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestDisplayKeywords(void)
2127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
2129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
2131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *localeID;
2132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *displayLocale;
2133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar displayKeyword[200];
2134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } testCases[] = {
2135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "ca_ES@currency=ESP",         "de_AT",
2136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {0x0057, 0x00e4, 0x0068, 0x0072, 0x0075, 0x006e, 0x0067, 0x0000},
2137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
2138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "ja_JP@calendar=japanese",         "de",
2139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { 0x004b, 0x0061, 0x006c, 0x0065, 0x006e, 0x0064, 0x0065, 0x0072, 0x0000}
2140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
2141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "de_DE@collation=traditional",       "de_DE",
2142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {0x0053, 0x006f, 0x0072, 0x0074, 0x0069, 0x0065, 0x0072, 0x0075, 0x006e, 0x0067, 0x0000}
2143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
2144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) {
2146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
2147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* keyword =NULL;
2148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t keywordLen = 0;
2149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t keywordCount = 0;
2150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar *displayKeyword=NULL;
2151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t displayKeywordLen = 0;
2152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UEnumeration* keywordEnum = uloc_openKeywords(testCases[i].localeID, &status);
2153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(keywordCount = uenum_count(keywordEnum, &status); keywordCount > 0 ; keywordCount--){
2154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              if(U_FAILURE(status)){
2155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  log_err("uloc_getKeywords failed for locale id: %s with error : %s \n", testCases[i].localeID, u_errorName(status));
2156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  break;
2157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              }
2158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              /* the uenum_next returns NUL terminated string */
2159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              keyword = uenum_next(keywordEnum, &keywordLen, &status);
2160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              /* fetch the displayKeyword */
2161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              displayKeywordLen = uloc_getDisplayKeyword(keyword, testCases[i].displayLocale, displayKeyword, displayKeywordLen, &status);
2162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              if(status==U_BUFFER_OVERFLOW_ERROR){
2163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  status = U_ZERO_ERROR;
2164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  displayKeywordLen++; /* for null termination */
2165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  displayKeyword = (UChar*) malloc(displayKeywordLen * U_SIZEOF_UCHAR);
2166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  displayKeywordLen = uloc_getDisplayKeyword(keyword, testCases[i].displayLocale, displayKeyword, displayKeywordLen, &status);
2167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  if(U_FAILURE(status)){
2168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      log_err("uloc_getDisplayKeyword filed for keyword : %s in locale id: %s for display locale: %s \n", testCases[i].localeID, keyword, testCases[i].displayLocale, u_errorName(status));
2169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      break;
2170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  }
2171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  if(u_strncmp(displayKeyword, testCases[i].displayKeyword, displayKeywordLen)!=0){
21726d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                      if (status == U_USING_DEFAULT_WARNING) {
21736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                          log_data_err("uloc_getDisplayKeyword did not get the expected value for keyword : %s in locale id: %s for display locale: %s . Got error: %s. Perhaps you are missing data?\n", testCases[i].localeID, keyword, testCases[i].displayLocale, u_errorName(status));
21746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                      } else {
21756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                          log_err("uloc_getDisplayKeyword did not get the expected value for keyword : %s in locale id: %s for display locale: %s \n", testCases[i].localeID, keyword, testCases[i].displayLocale);
21766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                      }
2177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      break;
2178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  }
2179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              }else{
2180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  log_err("uloc_getDisplayKeyword did not return the expected error. Error: %s\n", u_errorName(status));
2181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              }
2182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              free(displayKeyword);
2184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uenum_close(keywordEnum);
2187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestDisplayKeywordValues(void){
2191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
2192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
2194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *localeID;
2195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *displayLocale;
2196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar displayKeywordValue[500];
2197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } testCases[] = {
2198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "ca_ES@currency=ESP",         "de_AT",
2199b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            {0x0053, 0x0070, 0x0061, 0x006e, 0x0069, 0x0073, 0x0063, 0x0068, 0x0065, 0x0020, 0x0050, 0x0065, 0x0073, 0x0065, 0x0074, 0x0061, 0x0000}
2200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
2201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "de_AT@currency=ATS",         "fr_FR",
2202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {0x0073, 0x0063, 0x0068, 0x0069, 0x006c, 0x006c, 0x0069, 0x006e, 0x0067, 0x0020, 0x0061, 0x0075, 0x0074, 0x0072, 0x0069, 0x0063, 0x0068, 0x0069, 0x0065, 0x006e, 0x0000}
2203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
22041b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        {   "de_DE@currency=DEM",         "it",
22051b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            {0x006d, 0x0061, 0x0072, 0x0063, 0x006f, 0x0020, 0x0074, 0x0065, 0x0064, 0x0065, 0x0073, 0x0063, 0x006f, 0x0000}
2206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
2207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "el_GR@currency=GRD",         "en",
2208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {0x0047, 0x0072, 0x0065, 0x0065, 0x006b, 0x0020, 0x0044, 0x0072, 0x0061, 0x0063, 0x0068, 0x006d, 0x0061, 0x0000}
2209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
2210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "eu_ES@currency=ESP",         "it_IT",
22111b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            {0x0070, 0x0065, 0x0073, 0x0065, 0x0074, 0x0061, 0x0020, 0x0073, 0x0070, 0x0061, 0x0067, 0x006e, 0x006f, 0x006c, 0x0061, 0x0000}
2212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
2213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "de@collation=phonebook",     "es",
2214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {0x006F, 0x0072, 0x0064, 0x0065, 0x006E, 0x0020, 0x0064, 0x0065, 0x0020, 0x006C, 0x0069, 0x0073, 0x0074, 0x00ED, 0x006E, 0x0020, 0x0074, 0x0065, 0x006C, 0x0065, 0x0066, 0x00F3, 0x006E, 0x0069, 0x0063, 0x006F, 0x0000}
2215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
2216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_DE@collation=phonebook",  "es",
2218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          {0x006F, 0x0072, 0x0064, 0x0065, 0x006E, 0x0020, 0x0064, 0x0065, 0x0020, 0x006C, 0x0069, 0x0073, 0x0074, 0x00ED, 0x006E, 0x0020, 0x0074, 0x0065, 0x006C, 0x0065, 0x0066, 0x00F3, 0x006E, 0x0069, 0x0063, 0x006F, 0x0000}
2219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
2220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "es_ES@collation=traditional","de",
2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          {0x0054, 0x0072, 0x0061, 0x0064, 0x0069, 0x0074, 0x0069, 0x006f, 0x006e, 0x0065, 0x006c, 0x006c, 0x0065, 0x0020, 0x0053, 0x006f, 0x0072, 0x0074, 0x0069, 0x0065, 0x0072, 0x0072, 0x0065, 0x0067, 0x0065, 0x006c, 0x006e, 0x0000}
2222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
2223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ja_JP@calendar=japanese",    "de",
2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           {0x004a, 0x0061, 0x0070, 0x0061, 0x006e, 0x0069, 0x0073, 0x0063, 0x0068, 0x0065, 0x0072, 0x0020, 0x004b, 0x0061, 0x006c, 0x0065, 0x006e, 0x0064, 0x0065, 0x0072, 0x0000}
2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) {
2228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
2229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* keyword =NULL;
2230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t keywordLen = 0;
2231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t keywordCount = 0;
2232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar *displayKeywordValue = NULL;
2233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t displayKeywordValueLen = 0;
2234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UEnumeration* keywordEnum = uloc_openKeywords(testCases[i].localeID, &status);
2235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(keywordCount = uenum_count(keywordEnum, &status); keywordCount > 0 ; keywordCount--){
2236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              if(U_FAILURE(status)){
2237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  log_err("uloc_getKeywords failed for locale id: %s in display locale: % with error : %s \n", testCases[i].localeID, testCases[i].displayLocale, u_errorName(status));
2238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  break;
2239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              }
2240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              /* the uenum_next returns NUL terminated string */
2241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              keyword = uenum_next(keywordEnum, &keywordLen, &status);
2242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              /* fetch the displayKeywordValue */
2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              displayKeywordValueLen = uloc_getDisplayKeywordValue(testCases[i].localeID, keyword, testCases[i].displayLocale, displayKeywordValue, displayKeywordValueLen, &status);
2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              if(status==U_BUFFER_OVERFLOW_ERROR){
2246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  status = U_ZERO_ERROR;
2247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  displayKeywordValueLen++; /* for null termination */
2248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  displayKeywordValue = (UChar*)malloc(displayKeywordValueLen * U_SIZEOF_UCHAR);
2249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  displayKeywordValueLen = uloc_getDisplayKeywordValue(testCases[i].localeID, keyword, testCases[i].displayLocale, displayKeywordValue, displayKeywordValueLen, &status);
2250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  if(U_FAILURE(status)){
2251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      log_err("uloc_getDisplayKeywordValue failed for keyword : %s in locale id: %s for display locale: %s with error : %s \n", testCases[i].localeID, keyword, testCases[i].displayLocale, u_errorName(status));
2252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      break;
2253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  }
2254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  if(u_strncmp(displayKeywordValue, testCases[i].displayKeywordValue, displayKeywordValueLen)!=0){
22556d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                      if (status == U_USING_DEFAULT_WARNING) {
22566d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                          log_data_err("uloc_getDisplayKeywordValue did not return the expected value keyword : %s in locale id: %s for display locale: %s with error : %s Perhaps you are missing data\n", testCases[i].localeID, keyword, testCases[i].displayLocale, u_errorName(status));
22576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                      } else {
22586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                          log_err("uloc_getDisplayKeywordValue did not return the expected value keyword : %s in locale id: %s for display locale: %s with error : %s \n", testCases[i].localeID, keyword, testCases[i].displayLocale, u_errorName(status));
22596d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                      }
2260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      break;
2261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  }
2262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              }else{
2263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  log_err("uloc_getDisplayKeywordValue did not return the expected error. Error: %s\n", u_errorName(status));
2264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              }
2265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              free(displayKeywordValue);
2266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uenum_close(keywordEnum);
2268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
2270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* test a multiple keywords */
2271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
2272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* keyword =NULL;
2273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t keywordLen = 0;
2274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t keywordCount = 0;
2275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* localeID = "es@collation=phonebook;calendar=buddhist;currency=DEM";
2276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* displayLocale = "de";
2277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const UChar expected[][50] = {
2278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {0x0042, 0x0075, 0x0064, 0x0064, 0x0068, 0x0069, 0x0073, 0x0074, 0x0069, 0x0073, 0x0063, 0x0068, 0x0065, 0x0072, 0x0020, 0x004b, 0x0061, 0x006c, 0x0065, 0x006e, 0x0064, 0x0065, 0x0072, 0x0000},
2279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
228054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            {0x0054, 0x0065, 0x006c, 0x0065, 0x0066, 0x006f, 0x006e, 0x0062, 0x0075, 0x0063, 0x0068, 0x002d, 0x0053, 0x006f, 0x0072, 0x0074, 0x0069, 0x0065, 0x0072, 0x0075, 0x006e, 0x0067, 0x0000},
2281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {0x0044, 0x0065, 0x0075, 0x0074, 0x0073, 0x0063, 0x0068, 0x0065, 0x0020, 0x004d, 0x0061, 0x0072, 0x006b, 0x0000},
2282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
2283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UEnumeration* keywordEnum = uloc_openKeywords(localeID, &status);
2285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(keywordCount = 0; keywordCount < uenum_count(keywordEnum, &status) ; keywordCount++){
2287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UChar *displayKeywordValue = NULL;
2288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              int32_t displayKeywordValueLen = 0;
2289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              if(U_FAILURE(status)){
2290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  log_err("uloc_getKeywords failed for locale id: %s in display locale: % with error : %s \n", localeID, displayLocale, u_errorName(status));
2291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  break;
2292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              }
2293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              /* the uenum_next returns NUL terminated string */
2294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              keyword = uenum_next(keywordEnum, &keywordLen, &status);
2295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              /* fetch the displayKeywordValue */
2297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              displayKeywordValueLen = uloc_getDisplayKeywordValue(localeID, keyword, displayLocale, displayKeywordValue, displayKeywordValueLen, &status);
2298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              if(status==U_BUFFER_OVERFLOW_ERROR){
2299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  status = U_ZERO_ERROR;
2300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  displayKeywordValueLen++; /* for null termination */
2301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  displayKeywordValue = (UChar*)malloc(displayKeywordValueLen * U_SIZEOF_UCHAR);
2302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  displayKeywordValueLen = uloc_getDisplayKeywordValue(localeID, keyword, displayLocale, displayKeywordValue, displayKeywordValueLen, &status);
2303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  if(U_FAILURE(status)){
2304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      log_err("uloc_getDisplayKeywordValue failed for keyword : %s in locale id: %s for display locale: %s with error : %s \n", localeID, keyword, displayLocale, u_errorName(status));
2305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      break;
2306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  }
2307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  if(u_strncmp(displayKeywordValue, expected[keywordCount], displayKeywordValueLen)!=0){
23086d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                      if (status == U_USING_DEFAULT_WARNING) {
23096d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                          log_data_err("uloc_getDisplayKeywordValue did not return the expected value keyword : %s in locale id: %s for display locale: %s  got error: %s. Perhaps you are missing data?\n", localeID, keyword, displayLocale, u_errorName(status));
23106d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                      } else {
23116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                          log_err("uloc_getDisplayKeywordValue did not return the expected value keyword : %s in locale id: %s for display locale: %s \n", localeID, keyword, displayLocale);
23126d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                      }
2313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      break;
2314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  }
2315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              }else{
2316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  log_err("uloc_getDisplayKeywordValue did not return the expected error. Error: %s\n", u_errorName(status));
2317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              }
2318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              free(displayKeywordValue);
2319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uenum_close(keywordEnum);
2321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
2324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Test non existent keywords */
2325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
2326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* localeID = "es";
2327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* displayLocale = "de";
2328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar *displayKeywordValue = NULL;
2329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t displayKeywordValueLen = 0;
2330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* fetch the displayKeywordValue */
2332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        displayKeywordValueLen = uloc_getDisplayKeywordValue(localeID, "calendar", displayLocale, displayKeywordValue, displayKeywordValueLen, &status);
2333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)) {
2334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_err("uloc_getDisplaykeywordValue returned error status %s\n", u_errorName(status));
2335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if(displayKeywordValueLen != 0) {
2336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_err("uloc_getDisplaykeywordValue returned %d should be 0 \n", displayKeywordValueLen);
2337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestGetBaseName(void) {
2343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
2344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *localeID;
2345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *baseName;
2346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } testCases[] = {
2347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de_DE@  C o ll A t i o n   = Phonebook   ", "de_DE" },
2348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "de@currency = euro; CoLLaTion   = PHONEBOOk", "de" },
2349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ja@calendar = buddhist", "ja" }
2350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0, baseNameLen = 0;
2353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char baseName[256];
2354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) {
2357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        baseNameLen = uloc_getBaseName(testCases[i].localeID, baseName, 256, &status);
235859d709d503bab6e2b61931737e662dd293b40578ccornelius        (void)baseNameLen;    /* Suppress set but not used warning. */
2359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strcmp(testCases[i].baseName, baseName)) {
2360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("For locale \"%s\" expected baseName \"%s\", but got \"%s\"\n",
2361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                testCases[i].localeID, testCases[i].baseName, baseName);
2362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
236750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestTrailingNull(void) {
236850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  const char* localeId = "zh_Hans";
236950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  UChar buffer[128]; /* sufficient for this test */
237050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  int32_t len;
237150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  UErrorCode status = U_ZERO_ERROR;
237250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  int i;
237350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
237450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  len = uloc_getDisplayName(localeId, localeId, buffer, 128, &status);
237550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  if (len > 128) {
237650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    log_err("buffer too small");
237750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return;
237850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  }
237950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
238050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  for (i = 0; i < len; ++i) {
238150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (buffer[i] == 0) {
238250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_err("name contained null");
238350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      return;
238450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
238550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  }
238650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
2387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Jitterbug 4115 */
2389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestDisplayNameWarning(void) {
2390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar name[256];
2391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t size;
2392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size = uloc_getDisplayLanguage("qqq", "kl", name, sizeof(name)/sizeof(name[0]), &status);
239559d709d503bab6e2b61931737e662dd293b40578ccornelius    (void)size;    /* Suppress set but not used warning. */
2396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (status != U_USING_DEFAULT_WARNING) {
2397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("For language \"qqq\" in locale \"kl\", expecting U_USING_DEFAULT_WARNING, but got %s\n",
2398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(status));
2399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Compare two locale IDs.  If they are equal, return 0.  If `string'
2405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * starts with `prefix' plus an additional element, that is, string ==
2406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * prefix + '_' + x, then return 1.  Otherwise return a value < 0.
2407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool _loccmp(const char* string, const char* prefix) {
2409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t slen = (int32_t)uprv_strlen(string),
2410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            plen = (int32_t)uprv_strlen(prefix);
2411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t c = uprv_strncmp(string, prefix, plen);
2412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* 'root' is less than everything */
2413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (uprv_strcmp(prefix, "root") == 0) {
2414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (uprv_strcmp(string, "root") == 0) ? 0 : 1;
2415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c) return -1; /* mismatch */
2417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (slen == plen) return 0;
2418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (string[plen] == '_') return 1;
2419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return -2; /* false match, e.g. "en_USX" cmp "en_US" */
2420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _checklocs(const char* label,
2423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       const char* req,
2424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       const char* valid,
2425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       const char* actual) {
2426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* We want the valid to be strictly > the bogus requested locale,
2427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       and the valid to be >= the actual. */
2428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (_loccmp(req, valid) > 0 &&
2429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        _loccmp(valid, actual) >= 0) {
2430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("%s; req=%s, valid=%s, actual=%s\n",
2431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    label, req, valid, actual);
2432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
2433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: %s; req=%s, valid=%s, actual=%s\n",
2434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                label, req, valid, actual);
2435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestGetLocale(void) {
2439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
2440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UParseError pe;
2441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar EMPTY[1] = {0};
2442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* === udat === */
2444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
2445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
2446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDateFormat *obj;
2447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *req = "en_US_REDWOODSHORES", *valid, *actual;
2448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        obj = udat_open(UDAT_DEFAULT, UDAT_DEFAULT,
2449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        req,
2450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        NULL, 0,
2451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        NULL, 0, &ec);
2452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
24536d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_data_err("udat_open failed.Error %s\n", u_errorName(ec));
2454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        valid = udat_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec);
2457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        actual = udat_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec);
2458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
2459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("udat_getLocaleByType() failed\n");
2460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        _checklocs("udat", req, valid, actual);
2463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        udat_close(obj);
2464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* === ucal === */
2468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
2469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
2470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCalendar *obj;
2471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *req = "fr_FR_PROVENCAL", *valid, *actual;
2472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        obj = ucal_open(NULL, 0,
2473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        req,
2474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UCAL_GREGORIAN,
2475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        &ec);
2476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
2477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucal_open failed with error: %s\n", u_errorName(ec));
2478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        valid = ucal_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec);
2481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        actual = ucal_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec);
2482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
2483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucal_getLocaleByType() failed\n");
2484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        _checklocs("ucal", req, valid, actual);
2487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucal_close(obj);
2488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* === unum === */
2492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
2493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
2494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UNumberFormat *obj;
2495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *req = "zh_Hant_TW_TAINAN", *valid, *actual;
2496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        obj = unum_open(UNUM_DECIMAL,
2497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        NULL, 0,
2498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        req,
2499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        &pe, &ec);
2500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
2501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("unum_open failed\n");
2502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        valid = unum_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec);
2505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        actual = unum_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec);
2506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
2507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("unum_getLocaleByType() failed\n");
2508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        _checklocs("unum", req, valid, actual);
2511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_close(obj);
2512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* === umsg === */
2516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
2517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* commented out by weiv 01/12/2005. umsg_getLocaleByType is to be removed */
2518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
2519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
2520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UMessageFormat *obj;
2521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *req = "ja_JP_TAKAYAMA", *valid, *actual;
2522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool test;
2523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        obj = umsg_open(EMPTY, 0,
2524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        req,
2525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        &pe, &ec);
2526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
2527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("umsg_open failed\n");
2528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        valid = umsg_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec);
2531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        actual = umsg_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec);
2532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
2533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("umsg_getLocaleByType() failed\n");
2534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* We want the valid to be strictly > the bogus requested locale,
2537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           and the valid to be >= the actual. */
2538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* TODO MessageFormat is currently just storing the locale it is given.
2539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           As a result, it will return whatever it was given, even if the
2540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           locale is invalid. */
2541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        test = (_cmpversion("3.2") <= 0) ?
2542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* Here is the weakened test for 3.0: */
2543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (_loccmp(req, valid) >= 0) :
2544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* Here is what the test line SHOULD be: */
2545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (_loccmp(req, valid) > 0);
2546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (test &&
2548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            _loccmp(valid, actual) >= 0) {
2549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("umsg; req=%s, valid=%s, actual=%s\n", req, valid, actual);
2550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
2551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: umsg; req=%s, valid=%s, actual=%s\n", req, valid, actual);
2552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        umsg_close(obj);
2554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* === ubrk === */
2559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
2560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
2561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBreakIterator *obj;
2562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *req = "ar_KW_ABDALI", *valid, *actual;
2563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        obj = ubrk_open(UBRK_WORD,
2564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        req,
2565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        EMPTY,
2566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        0,
2567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        &ec);
2568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
2569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubrk_open failed. Error: %s \n", u_errorName(ec));
2570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        valid = ubrk_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec);
2573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        actual = ubrk_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec);
2574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
2575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubrk_getLocaleByType() failed\n");
2576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        _checklocs("ubrk", req, valid, actual);
2579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubrk_close(obj);
2580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* === ucol === */
2584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
2585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
2586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCollator *obj;
2587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *req = "es_AR_BUENOSAIRES", *valid, *actual;
2588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        obj = ucol_open(req, &ec);
2589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
259050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_err("ucol_open failed - %s\n", u_errorName(ec));
2591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        valid = ucol_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec);
2594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        actual = ucol_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec);
2595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(ec)) {
2596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucol_getLocaleByType() failed\n");
2597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        _checklocs("ucol", req, valid, actual);
2600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(obj);
2601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
26048393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusstatic void TestEnglishExemplarCharacters(void) {
26058393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    UErrorCode status = U_ZERO_ERROR;
26068393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    int i;
26078393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    USet *exSet = NULL;
26088393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    UChar testChars[] = {
26098393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        0x61,   /* standard */
26108393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        0xE1,   /* auxiliary */
26118393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        0x41,   /* index */
26128393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        0x2D    /* punctuation */
26138393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    };
26148393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    ULocaleData *uld = ulocdata_open("en", &status);
26158393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (U_FAILURE(status)) {
26168393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        log_data_err("ulocdata_open() failed : %s - (Are you missing data?)\n", u_errorName(status));
26178393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        return;
26188393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    }
26198393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
26208393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    for (i = 0; i < ULOCDATA_ES_COUNT; i++) {
26218393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        exSet = ulocdata_getExemplarSet(uld, exSet, 0, (ULocaleDataExemplarSetType)i, &status);
26228393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        if (U_FAILURE(status)) {
26238393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            log_err_status(status, "ulocdata_getExemplarSet() for type %d failed\n", i);
26248393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            status = U_ZERO_ERROR;
26258393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            continue;
26268393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        }
26278393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        if (!uset_contains(exSet, (UChar32)testChars[i])) {
26288393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            log_err("Character U+%04X is not included in exemplar type %d\n", testChars[i], i);
26298393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        }
26308393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    }
26318393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
26328393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    uset_close(exSet);
26338393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    ulocdata_close(uld);
26348393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius}
2635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNonexistentLanguageExemplars(void) {
2637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* JB 4068 - Nonexistent language */
2638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
2639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ULocaleData *uld = ulocdata_open("qqq",&ec);
2640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ec != U_USING_DEFAULT_WARNING) {
26416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(ec, "Exemplar set for \"qqq\", expecting U_USING_DEFAULT_WARNING, but got %s\n",
2642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(ec));
2643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uset_close(ulocdata_getExemplarSet(uld, NULL, 0, ULOCDATA_ES_STANDARD, &ec));
2645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ulocdata_close(uld);
2646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestLocDataErrorCodeChaining(void) {
2649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_USELESS_COLLATOR_ERROR;
2650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ulocdata_open(NULL, &ec);
2651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ulocdata_getExemplarSet(NULL, NULL, 0, ULOCDATA_ES_STANDARD, &ec);
2652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ulocdata_getDelimiter(NULL, ULOCDATA_DELIMITER_COUNT, NULL, -1, &ec);
2653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ulocdata_getMeasurementSystem(NULL, &ec);
2654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ulocdata_getPaperSize(NULL, NULL, NULL, &ec);
2655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ec != U_USELESS_COLLATOR_ERROR) {
2656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ulocdata API changed the error code to %s\n", u_errorName(ec));
2657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestLanguageExemplarsFallbacks(void) {
2661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Test that en_US fallsback, but en doesn't fallback. */
2662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
2663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ULocaleData *uld = ulocdata_open("en_US",&ec);
2664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uset_close(ulocdata_getExemplarSet(uld, NULL, 0, ULOCDATA_ES_STANDARD, &ec));
2665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ec != U_USING_FALLBACK_WARNING) {
26666d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(ec, "Exemplar set for \"en_US\", expecting U_USING_FALLBACK_WARNING, but got %s\n",
2667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(ec));
2668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ulocdata_close(uld);
2670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ec = U_ZERO_ERROR;
2671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uld = ulocdata_open("en",&ec);
2672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uset_close(ulocdata_getExemplarSet(uld, NULL, 0, ULOCDATA_ES_STANDARD, &ec));
2673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ec != U_ZERO_ERROR) {
26746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(ec, "Exemplar set for \"en\", expecting U_ZERO_ERROR, but got %s\n",
2675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(ec));
2676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ulocdata_close(uld);
2678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2680b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const char *acceptResult(UAcceptResult uar) {
2681b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return  udbg_enumName(UDBG_UAcceptResult, uar);
2682b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
2683b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestAcceptLanguage(void) {
2685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UAcceptResult outResult;
2687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UEnumeration *available;
2688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char tmp[200];
2689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i;
2690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t rc = 0;
2691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    struct {
2693b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t httpSet;       /**< Which of http[] should be used? */
2694b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        const char *icuSet;    /**< ? */
2695b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        const char *expect;    /**< The expected locale result */
2696b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UAcceptResult res;     /**< The expected error code */
2697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } tests[] = {
2698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*0*/{ 0, NULL, "mt_MT", ULOC_ACCEPT_VALID },
2699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*1*/{ 1, NULL, "en", ULOC_ACCEPT_VALID },
2700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*2*/{ 2, NULL, "en", ULOC_ACCEPT_FALLBACK },
2701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*3*/{ 3, NULL, "", ULOC_ACCEPT_FAILED },
2702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*4*/{ 4, NULL, "es", ULOC_ACCEPT_VALID },
2703b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2704b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /*5*/{ 5, NULL, "en", ULOC_ACCEPT_VALID },  /* XF */
2705b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /*6*/{ 6, NULL, "ja", ULOC_ACCEPT_FALLBACK },  /* XF */
2706b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /*7*/{ 7, NULL, "zh", ULOC_ACCEPT_FALLBACK },  /* XF */
2707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t numTests = sizeof(tests)/sizeof(tests[0]);
2709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *http[] = {
2710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*0*/ "mt-mt, ja;q=0.76, en-us;q=0.95, en;q=0.92, en-gb;q=0.89, fr;q=0.87, iu-ca;q=0.84, iu;q=0.82, ja-jp;q=0.79, mt;q=0.97, de-de;q=0.74, de;q=0.71, es;q=0.68, it-it;q=0.66, it;q=0.63, vi-vn;q=0.61, vi;q=0.58, nl-nl;q=0.55, nl;q=0.53, th-th-traditional;q=.01",
2711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*1*/ "ja;q=0.5, en;q=0.8, tlh",
2712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*2*/ "en-wf, de-lx;q=0.8",
2713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*3*/ "mga-ie;q=0.9, tlh",
2714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*4*/ "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "
2715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "
2716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "
2717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "
2718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "
2719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "
2720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xx-yy;q=.1, "
2721b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              "es",
2722b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2723b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /*5*/ "zh-xx;q=0.9, en;q=0.6",
2724b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /*6*/ "ja-JA",
2725b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /*7*/ "zh-xx;q=0.9",
2726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;i<numTests;i++) {
2729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        outResult = -3;
2730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
2731b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_verbose("test #%d: http[%s], ICU[%s], expect %s, %s\n",
2732b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            i, http[tests[i].httpSet], tests[i].icuSet, tests[i].expect, acceptResult(tests[i].res));
2733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        available = ures_openAvailableLocales(tests[i].icuSet, &status);
2735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tmp[0]=0;
2736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rc = uloc_acceptLanguageFromHTTP(tmp, 199, &outResult, http[tests[i].httpSet], available, &status);
273759d709d503bab6e2b61931737e662dd293b40578ccornelius        (void)rc;    /* Suppress set but not used warning. */
2738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uenum_close(available);
2739b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_verbose(" got %s, %s [%s]\n", tmp[0]?tmp:"(EMPTY)", acceptResult(outResult), u_errorName(status));
2740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(outResult != tests[i].res) {
27416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err_status(status, "FAIL: #%d: expected outResult of %s but got %s\n", i,
2742b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                acceptResult( tests[i].res),
2743b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                acceptResult( outResult));
2744b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_info("test #%d: http[%s], ICU[%s], expect %s, %s\n",
2745b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                i, http[tests[i].httpSet], tests[i].icuSet, tests[i].expect,acceptResult(tests[i].res));
2746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if((outResult>0)&&uprv_strcmp(tmp, tests[i].expect)) {
27486d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err_status(status, "FAIL: #%d: expected %s but got %s\n", i, tests[i].expect, tmp);
2749b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_info("test #%d: http[%s], ICU[%s], expect %s, %s\n",
2750b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                i, http[tests[i].httpSet], tests[i].icuSet, tests[i].expect, acceptResult(tests[i].res));
2751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* LOCALE_ALIAS[][2] = {
2756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {"in", "id"},
2757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {"in_ID", "id_ID"},
2758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {"iw", "he"},
2759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {"iw_IL", "he_IL"},
2760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {"ji", "yi"},
2761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {"en_BU", "en_MM"},
2762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {"en_DY", "en_BJ"},
2763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {"en_HV", "en_BF"},
2764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {"en_NH", "en_VU"},
2765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {"en_RH", "en_ZW"},
2766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {"en_TP", "en_TL"},
2767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {"en_ZR", "en_CD"}
2768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
2769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool isLocaleAvailable(UResourceBundle* resIndex, const char* loc){
2770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t len = 0;
2772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_getStringByKey(resIndex, loc,&len, &status);
2773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
2774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
2775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
2777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCalendar() {
2780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
2781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i;
2782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *resIndex = ures_open(NULL,"res_index", &status);
2784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
27856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Could not open res_index.res. Exiting. Error: %s\n", u_errorName(status));
2786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2788f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    for (i=0; i<UPRV_LENGTHOF(LOCALE_ALIAS); i++) {
2789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* oldLoc = LOCALE_ALIAS[i][0];
2790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* newLoc = LOCALE_ALIAS[i][1];
2791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCalendar* c1 = NULL;
2792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCalendar* c2 = NULL;
2793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*Test function "getLocale(ULocale.VALID_LOCALE)"*/
2795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* l1 = ucal_getLocaleByType(c1, ULOC_VALID_LOCALE, &status);
2796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* l2 = ucal_getLocaleByType(c2, ULOC_VALID_LOCALE, &status);
2797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!isLocaleAvailable(resIndex, newLoc)){
2799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
2800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c1 = ucal_open(NULL, -1, oldLoc, UCAL_GREGORIAN, &status);
2802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c2 = ucal_open(NULL, -1, newLoc, UCAL_GREGORIAN, &status);
2803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strcmp(newLoc,l1)!=0 || strcmp(l1,l2)!=0 || status!=U_ZERO_ERROR) {
2805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("The locales are not equal!.Old: %s, New: %s \n", oldLoc, newLoc);
2806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("ucal_getLocaleByType old:%s   new:%s\n", l1, l2);
2808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucal_close(c1);
2809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucal_close(c2);
2810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(resIndex);
2812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestDateFormat() {
2816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
2817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i;
2818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *resIndex = ures_open(NULL,"res_index", &status);
2820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
28216d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Could not open res_index.res. Exiting. Error: %s\n", u_errorName(status));
2822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2824f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    for (i=0; i<UPRV_LENGTHOF(LOCALE_ALIAS); i++) {
2825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* oldLoc = LOCALE_ALIAS[i][0];
2826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* newLoc = LOCALE_ALIAS[i][1];
2827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDateFormat* df1 = NULL;
2828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDateFormat* df2 = NULL;
2829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* l1 = NULL;
2830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* l2 = NULL;
2831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!isLocaleAvailable(resIndex, newLoc)){
2833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
2834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df1 = udat_open(UDAT_FULL, UDAT_FULL,oldLoc, NULL, 0, NULL, -1, &status);
2836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df2 = udat_open(UDAT_FULL, UDAT_FULL,newLoc, NULL, 0, NULL, -1, &status);
2837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
2838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Creation of date format failed  %s\n", u_errorName(status));
2839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*Test function "getLocale"*/
2842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        l1 = udat_getLocaleByType(df1, ULOC_VALID_LOCALE, &status);
2843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        l2 = udat_getLocaleByType(df2, ULOC_VALID_LOCALE, &status);
2844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
2845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Fetching the locale by type failed.  %s\n", u_errorName(status));
2846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strcmp(newLoc,l1)!=0 || strcmp(l1,l2)!=0) {
2848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("The locales are not equal!.Old: %s, New: %s \n", oldLoc, newLoc);
2849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("udat_getLocaleByType old:%s   new:%s\n", l1, l2);
2851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        udat_close(df1);
2852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        udat_close(df2);
2853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(resIndex);
2855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCollation() {
2859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
2860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i;
2861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *resIndex = ures_open(NULL,"res_index", &status);
2863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
28646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Could not open res_index.res. Exiting. Error: %s\n", u_errorName(status));
2865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2867f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    for (i=0; i<UPRV_LENGTHOF(LOCALE_ALIAS); i++) {
2868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* oldLoc = LOCALE_ALIAS[i][0];
2869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* newLoc = LOCALE_ALIAS[i][1];
2870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCollator* c1 = NULL;
2871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCollator* c2 = NULL;
2872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* l1 = NULL;
2873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* l2 = NULL;
2874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
2876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!isLocaleAvailable(resIndex, newLoc)){
2877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
2878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
2880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Creation of collators failed  %s\n", u_errorName(status));
2881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c1 = ucol_open(oldLoc, &status);
2884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c2 = ucol_open(newLoc, &status);
2885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        l1 = ucol_getLocaleByType(c1, ULOC_VALID_LOCALE, &status);
2886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        l2 = ucol_getLocaleByType(c2, ULOC_VALID_LOCALE, &status);
2887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
2888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Fetching the locale names failed failed  %s\n", u_errorName(status));
2889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strcmp(newLoc,l1)!=0 || strcmp(l1,l2)!=0) {
2891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("The locales are not equal!.Old: %s, New: %s \n", oldLoc, newLoc);
2892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("ucol_getLocaleByType old:%s   new:%s\n", l1, l2);
2894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(c1);
2895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(c2);
2896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(resIndex);
2898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2901c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querutypedef struct OrientationStructTag {
2902c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    const char* localeId;
2903c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ULayoutType character;
2904c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ULayoutType line;
2905c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} OrientationStruct;
2906c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
290750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic const char* ULayoutTypeToString(ULayoutType type)
2908c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
2909c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    switch(type)
2910c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
2911c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    case ULOC_LAYOUT_LTR:
2912c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return "ULOC_LAYOUT_LTR";
2913c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        break;
2914c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    case ULOC_LAYOUT_RTL:
2915c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return "ULOC_LAYOUT_RTL";
2916c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        break;
2917c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    case ULOC_LAYOUT_TTB:
2918c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return "ULOC_LAYOUT_TTB";
2919c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        break;
2920c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    case ULOC_LAYOUT_BTT:
2921c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return "ULOC_LAYOUT_BTT";
2922c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        break;
2923c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    case ULOC_LAYOUT_UNKNOWN:
2924c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        break;
2925c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2926c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2927c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    return "Unknown enum value for ULayoutType!";
2928c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
2929c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2930c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic void  TestOrientation()
2931c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
2932c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    static const OrientationStruct toTest [] = {
2933c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "ar", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB },
2934c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "aR", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB },
2935c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "ar_Arab", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB },
2936c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "fa", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB },
2937c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "Fa", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB },
2938c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "he", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB },
2939c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "ps", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB },
2940c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "ur", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB },
2941c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "UR", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB },
2942c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        { "en", ULOC_LAYOUT_LTR, ULOC_LAYOUT_TTB }
2943c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    };
2944c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2945c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    size_t i = 0;
2946c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    for (; i < sizeof(toTest) / sizeof(toTest[0]); ++i) {
2947c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UErrorCode statusCO = U_ZERO_ERROR;
2948c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UErrorCode statusLO = U_ZERO_ERROR;
2949c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const char* const localeId = toTest[i].localeId;
2950c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const ULayoutType co = uloc_getCharacterOrientation(localeId, &statusCO);
2951c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const ULayoutType expectedCO = toTest[i].character;
2952c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const ULayoutType lo = uloc_getLineOrientation(localeId, &statusLO);
2953c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const ULayoutType expectedLO = toTest[i].line;
2954c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (U_FAILURE(statusCO)) {
29556d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err_status(statusCO,
2956c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                "  unexpected failure for uloc_getCharacterOrientation(), with localId \"%s\" and status %s\n",
2957c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                localeId,
2958c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                u_errorName(statusCO));
2959c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
2960c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        else if (co != expectedCO) {
2961c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_err(
2962c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                "  unexpected result for uloc_getCharacterOrientation(), with localeId \"%s\". Expected %s but got result %s\n",
2963c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                localeId,
2964c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                ULayoutTypeToString(expectedCO),
2965c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                ULayoutTypeToString(co));
2966c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
2967c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (U_FAILURE(statusLO)) {
29686d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err_status(statusLO,
2969c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                "  unexpected failure for uloc_getLineOrientation(), with localId \"%s\" and status %s\n",
2970c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                localeId,
2971c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                u_errorName(statusLO));
2972c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
2973c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        else if (lo != expectedLO) {
2974c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_err(
2975c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                "  unexpected result for uloc_getLineOrientation(), with localeId \"%s\". Expected %s but got result %s\n",
2976c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                localeId,
2977c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                ULayoutTypeToString(expectedLO),
2978c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                ULayoutTypeToString(lo));
2979c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
2980c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2981c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
2982c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void  TestULocale() {
2984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i;
2985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *resIndex = ures_open(NULL,"res_index", &status);
2987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
29886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Could not open res_index.res. Exiting. Error: %s\n", u_errorName(status));
2989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2991f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    for (i=0; i<UPRV_LENGTHOF(LOCALE_ALIAS); i++) {
2992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* oldLoc = LOCALE_ALIAS[i][0];
2993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* newLoc = LOCALE_ALIAS[i][1];
2994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar name1[256], name2[256];
2995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char names1[256], names2[256];
2996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t capacity = 256;
2997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
2999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!isLocaleAvailable(resIndex, newLoc)){
3000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
3001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uloc_getDisplayName(oldLoc, ULOC_US, name1, capacity, &status);
3003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
3004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("uloc_getDisplayName(%s) failed %s\n", oldLoc, u_errorName(status));
3005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uloc_getDisplayName(newLoc, ULOC_US, name2, capacity, &status);
3008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
3009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("uloc_getDisplayName(%s) failed %s\n", newLoc, u_errorName(status));
3010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (u_strcmp(name1, name2)!=0) {
3013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("The locales are not equal!.Old: %s, New: %s \n", oldLoc, newLoc);
3014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_austrcpy(names1, name1);
3016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_austrcpy(names2, name2);
3017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("uloc_getDisplayName old:%s   new:%s\n", names1, names2);
3018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(resIndex);
3020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestUResourceBundle() {
3024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* us1;
3025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* us2;
3026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle* rb1 = NULL;
3028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle* rb2 = NULL;
3029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
3030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i;
3031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *resIndex = NULL;
3032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
3033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Could not open res_index.res. Exiting. Error: %s\n", u_errorName(status));
3034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
3035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resIndex = ures_open(NULL,"res_index", &status);
3037f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    for (i=0; i<UPRV_LENGTHOF(LOCALE_ALIAS); i++) {
3038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* oldLoc = LOCALE_ALIAS[i][0];
3040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* newLoc = LOCALE_ALIAS[i][1];
3041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!isLocaleAvailable(resIndex, newLoc)){
3042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
3043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rb1 = ures_open(NULL, oldLoc, &status);
3045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
3046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ures_open(%s) failed %s\n", oldLoc, u_errorName(status));
3047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3049b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        us1 = ures_getLocaleByType(rb1, ULOC_ACTUAL_LOCALE, &status);
3050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
3052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rb2 = ures_open(NULL, newLoc, &status);
3053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
3054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ures_open(%s) failed %s\n", oldLoc, u_errorName(status));
3055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3056b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        us2 = ures_getLocaleByType(rb2, ULOC_ACTUAL_LOCALE, &status);
3057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strcmp(us1,newLoc)!=0 || strcmp(us1,us2)!=0 ) {
3059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("The locales are not equal!.Old: %s, New: %s \n", oldLoc, newLoc);
3060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("ures_getStringByKey old:%s   new:%s\n", us1, us2);
3063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ures_close(rb1);
3064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rb1 = NULL;
3065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ures_close(rb2);
3066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rb2 = NULL;
3067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(resIndex);
3069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestDisplayName() {
3072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar oldCountry[256] = {'\0'};
3074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar newCountry[256] = {'\0'};
3075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar oldLang[256] = {'\0'};
3076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar newLang[256] = {'\0'};
3077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char country[256] ={'\0'};
3078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char language[256] ={'\0'};
3079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t capacity = 256;
3080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i =0;
3081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int j=0;
3082f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    for (i=0; i<UPRV_LENGTHOF(LOCALE_ALIAS); i++) {
3083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* oldLoc = LOCALE_ALIAS[i][0];
3084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* newLoc = LOCALE_ALIAS[i][1];
3085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
3086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t available = uloc_countAvailable();
3087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(j=0; j<available; j++){
3089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const char* dispLoc = uloc_getAvailable(j);
3091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t oldCountryLen = uloc_getDisplayCountry(oldLoc,dispLoc, oldCountry, capacity, &status);
3092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t newCountryLen = uloc_getDisplayCountry(newLoc, dispLoc, newCountry, capacity, &status);
3093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t oldLangLen = uloc_getDisplayLanguage(oldLoc, dispLoc, oldLang, capacity, &status);
3094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t newLangLen = uloc_getDisplayLanguage(newLoc, dispLoc, newLang, capacity, &status );
3095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t countryLen = uloc_getCountry(newLoc, country, capacity, &status);
3097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t langLen  = uloc_getLanguage(newLoc, language, capacity, &status);
3098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* there is a display name for the current country ID */
3099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(countryLen != newCountryLen ){
3100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(u_strncmp(oldCountry,newCountry,oldCountryLen)!=0){
3101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("uloc_getDisplayCountry() failed for %s in display locale %s \n", oldLoc, dispLoc);
3102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
3103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
3104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* there is a display name for the current lang ID */
3105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(langLen!=newLangLen){
3106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(u_strncmp(oldLang,newLang,oldLangLen)){
3107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("uloc_getDisplayLanguage() failed for %s in display locale %s \n", oldLoc, dispLoc);                }
3108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
3109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestGetLocaleForLCID() {
3114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, length, lengthPre;
3115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* testLocale = 0;
3116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
3117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char            temp2[40], temp3[40];
3118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t lcid;
3119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    lcid = uloc_getLCID("en_US");
3121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (lcid != 0x0409) {
3122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("  uloc_getLCID(\"en_US\") = %d, expected 0x0409\n", lcid);
3123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    lengthPre = uloc_getLocaleForLCID(lcid, temp2, 4, &status);
3126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (status != U_BUFFER_OVERFLOW_ERROR) {
3127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("  unexpected result from uloc_getLocaleForLCID with small buffer: %s\n", u_errorName(status));
3128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
3130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
3131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length = uloc_getLocaleForLCID(lcid, temp2, sizeof(temp2)/sizeof(char), &status);
3134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
3135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("  unexpected result from uloc_getLocaleForLCID(0x0409): %s\n", u_errorName(status));
3136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
3137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (length != lengthPre) {
3140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("  uloc_getLocaleForLCID(0x0409): returned length %d does not match preflight length %d\n", length, lengthPre);
3141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length = uloc_getLocaleForLCID(0x12345, temp2, sizeof(temp2)/sizeof(char), &status);
3144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
3145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("  unexpected result from uloc_getLocaleForLCID(0x12345): %s, status %s\n", temp2, u_errorName(status));
3146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
3148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing getLocaleForLCID vs. locale data\n");
3150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < LOCALE_SIZE; i++) {
3151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testLocale=rawData2[NAME][i];
3153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Testing   %s ......\n", testLocale);
3155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        sscanf(rawData2[LCID][i], "%x", &lcid);
3157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length = uloc_getLocaleForLCID(lcid, temp2, sizeof(temp2)/sizeof(char), &status);
3158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
3159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("  unexpected failure of uloc_getLocaleForLCID(%#04x), status %s\n", lcid, u_errorName(status));
3160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
3161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
3162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (length != uprv_strlen(temp2)) {
3165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("  returned length %d not correct for uloc_getLocaleForLCID(%#04x), expected %d\n", length, lcid, uprv_strlen(temp2));
3166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Compare language, country, script */
3169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length = uloc_getLanguage(temp2, temp3, sizeof(temp3)/sizeof(char), &status);
3170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
3171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("  couldn't get language in uloc_getLocaleForLCID(%#04x) = %s, status %s\n", lcid, temp2, u_errorName(status));
3172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
3173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else if (uprv_strcmp(temp3, rawData2[LANG][i]) && !(uprv_strcmp(temp3, "nn") == 0 && uprv_strcmp(rawData2[VAR][i], "NY") == 0)) {
3175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("  language doesn't match expected %s in in uloc_getLocaleForLCID(%#04x) = %s\n", rawData2[LANG][i], lcid, temp2);
3176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length = uloc_getScript(temp2, temp3, sizeof(temp3)/sizeof(char), &status);
3179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
3180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("  couldn't get script in uloc_getLocaleForLCID(%#04x) = %s, status %s\n", lcid, temp2, u_errorName(status));
3181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
3182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else if (uprv_strcmp(temp3, rawData2[SCRIPT][i])) {
3184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("  script doesn't match expected %s in in uloc_getLocaleForLCID(%#04x) = %s\n", rawData2[SCRIPT][i], lcid, temp2);
3185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length = uloc_getCountry(temp2, temp3, sizeof(temp3)/sizeof(char), &status);
3188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
3189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("  couldn't get country in uloc_getLocaleForLCID(%#04x) = %s, status %s\n", lcid, temp2, u_errorName(status));
3190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
3191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else if (uprv_strlen(rawData2[CTRY][i]) && uprv_strcmp(temp3, rawData2[CTRY][i])) {
3193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("  country doesn't match expected %s in in uloc_getLocaleForLCID(%#04x) = %s\n", rawData2[CTRY][i], lcid, temp2);
3194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3199c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruconst char* const basic_maximize_data[][2] = {
3200c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  {
3201c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zu_Zzzz_Zz",
3202c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zu_Latn_ZA",
3203c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3204c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ZU_Zz",
3205c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zu_Latn_ZA"
3206c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3207c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zu_LATN",
3208c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zu_Latn_ZA"
3209c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3210c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Zz",
3211c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_US"
3212c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3213c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_us",
3214c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_US"
3215c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3216c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Kore",
3217c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Kore_US"
3218c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3219c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Kore_Zz",
3220c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Kore_US"
3221c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3222c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Kore_ZA",
3223c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Kore_ZA"
3224c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3225c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Kore_ZA_POSIX",
3226c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Kore_ZA_POSIX"
3227c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3228c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Gujr",
3229c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Gujr_US"
3230c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3231c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_ZA",
3232c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_ZA"
3233c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3234c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Gujr_Zz",
3235c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Gujr_US"
3236c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3237c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Gujr_ZA",
3238c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Gujr_ZA"
3239c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3240c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Gujr_ZA_POSIX",
3241c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Gujr_ZA_POSIX"
3242c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3243c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_US_POSIX_1901",
3244c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_US_POSIX_1901"
3245c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3246c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn__POSIX_1901",
3247c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_US_POSIX_1901"
3248c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3249c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en__POSIX_1901",
3250c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_US_POSIX_1901"
3251c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3252c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "de__POSIX_1901",
3253c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "de_Latn_DE_POSIX_1901"
3254c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3255c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_US_BOSTON",
3256c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_US_BOSTON"
3257c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3258c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "th@calendar=buddhist",
3259c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "th_Thai_TH@calendar=buddhist"
3260c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3261c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_ZZ",
3262c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_EG"
3263c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3264c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh",
3265c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_CN"
3266c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3267c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_TW",
3268c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_TW"
3269c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3270c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_HK",
3271c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_HK"
3272c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3273c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant",
3274c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_TW"
3275c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3276c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Zzzz_CN",
3277c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_CN"
3278c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3279c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_US",
3280c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_US"
3281c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3282c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_HK",
3283c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_HK"
3284c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3285c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zzz",
3286c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
3287b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  }, {
3288b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     "de_u_co_phonebk",
3289b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     "de_Latn_DE_U_CO_PHONEBK"
3290b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  }, {
3291b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     "de_Latn_u_co_phonebk",
3292b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     "de_Latn_DE_U_CO_PHONEBK"
3293b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  }, {
3294b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     "de_Latn_DE_u_co_phonebk",
3295b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     "de_Latn_DE_U_CO_PHONEBK"
3296c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }
3297c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru};
3298c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
3299c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruconst char* const basic_minimize_data[][2] = {
3300c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  {
3301c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_US",
3302c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en"
3303c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3304c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_US_POSIX_1901",
3305c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en__POSIX_1901"
3306c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3307c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "EN_Latn_US_POSIX_1901",
3308c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en__POSIX_1901"
3309c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3310c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Zzzz_US_POSIX_1901",
3311c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en__POSIX_1901"
3312c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3313c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "de_Latn_DE_POSIX_1901",
3314c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "de__POSIX_1901"
3315c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3316c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und",
3317c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
3318b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  }, {
3319b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    "en_Latn_US@calendar=gregorian",
3320b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    "en@calendar=gregorian"
3321c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }
3322c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru};
3323c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
3324c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruconst char* const full_data[][3] = {
3325c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  {
3326c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    /*   "FROM", */
3327c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    /*   "ADD-LIKELY", */
3328c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    /*   "REMOVE-LIKELY" */
3329c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    /* }, { */
3330c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "aa",
3331c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "aa_Latn_ET",
3332c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "aa"
3333c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3334c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "af",
3335c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "af_Latn_ZA",
3336c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "af"
3337c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3338c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ak",
3339c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ak_Latn_GH",
3340c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ak"
3341c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3342c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "am",
3343c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "am_Ethi_ET",
3344c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "am"
3345c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3346c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar",
3347c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_EG",
3348c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar"
3349c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3350c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "as",
3351c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "as_Beng_IN",
3352c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "as"
3353c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3354c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "az",
3355c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "az_Latn_AZ",
3356c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "az"
3357c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3358c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "be",
3359c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "be_Cyrl_BY",
3360c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "be"
3361c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3362c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bg",
3363c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bg_Cyrl_BG",
3364c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bg"
3365c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3366c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bn",
3367c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bn_Beng_BD",
3368c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bn"
3369c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3370c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bo",
3371c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bo_Tibt_CN",
3372c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bo"
3373c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3374c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bs",
3375c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bs_Latn_BA",
3376c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bs"
3377c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3378c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ca",
3379c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ca_Latn_ES",
3380c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ca"
3381c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3382c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ch",
3383c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ch_Latn_GU",
3384c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ch"
3385c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3386c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "chk",
3387c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "chk_Latn_FM",
3388c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "chk"
3389c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3390c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "cs",
3391c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "cs_Latn_CZ",
3392c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "cs"
3393c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3394c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "cy",
3395c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "cy_Latn_GB",
3396c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "cy"
3397c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3398c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "da",
3399c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "da_Latn_DK",
3400c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "da"
3401c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3402c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "de",
3403c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "de_Latn_DE",
3404c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "de"
3405c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3406c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "dv",
3407c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "dv_Thaa_MV",
3408c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "dv"
3409c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3410c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "dz",
3411c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "dz_Tibt_BT",
3412c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "dz"
3413c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3414c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ee",
3415c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ee_Latn_GH",
3416c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ee"
3417c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3418c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "el",
3419c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "el_Grek_GR",
3420c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "el"
3421c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3422c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en",
3423c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_US",
3424c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en"
3425c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3426c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es",
3427c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_ES",
3428c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es"
3429c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3430c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "et",
3431c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "et_Latn_EE",
3432c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "et"
3433c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3434c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "eu",
3435c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "eu_Latn_ES",
3436c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "eu"
3437c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3438c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fa",
3439c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fa_Arab_IR",
3440c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fa"
3441c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3442c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fi",
3443c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fi_Latn_FI",
3444c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fi"
3445c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3446c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fil",
3447c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fil_Latn_PH",
3448c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fil"
3449c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3450c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fo",
3451c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fo_Latn_FO",
3452c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fo"
3453c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3454c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr",
3455c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_Latn_FR",
3456c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr"
3457c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3458c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fur",
3459c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fur_Latn_IT",
3460c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fur"
3461c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3462c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ga",
3463c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ga_Latn_IE",
3464c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ga"
3465c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3466c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "gaa",
3467c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "gaa_Latn_GH",
3468c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "gaa"
3469c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3470c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "gl",
3471c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "gl_Latn_ES",
3472c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "gl"
3473c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3474c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "gn",
3475c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "gn_Latn_PY",
3476c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "gn"
3477c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3478c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "gu",
3479c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "gu_Gujr_IN",
3480c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "gu"
3481c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3482c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ha",
3483c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ha_Latn_NG",
3484c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ha"
3485c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3486c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "haw",
3487c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "haw_Latn_US",
3488c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "haw"
3489c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3490c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "he",
3491c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "he_Hebr_IL",
3492c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "he"
3493c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3494c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hi",
3495c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hi_Deva_IN",
3496c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hi"
3497c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3498c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hr",
3499c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hr_Latn_HR",
3500c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hr"
3501c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3502c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ht",
3503c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ht_Latn_HT",
3504c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ht"
3505c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3506c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hu",
3507c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hu_Latn_HU",
3508c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hu"
3509c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3510c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hy",
3511c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hy_Armn_AM",
3512c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hy"
3513c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3514c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "id",
3515c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "id_Latn_ID",
3516c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "id"
3517c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3518c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ig",
3519c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ig_Latn_NG",
3520c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ig"
3521c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3522c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ii",
3523b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "ii_Yiii_CN",
3524c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ii"
3525c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3526c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "is",
3527c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "is_Latn_IS",
3528c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "is"
3529c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3530c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "it",
3531c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "it_Latn_IT",
3532c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "it"
3533c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3534c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ja",
3535c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ja_Jpan_JP",
3536c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ja"
3537c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3538c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ka",
3539c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ka_Geor_GE",
3540c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ka"
3541c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3542c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kaj",
3543c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kaj_Latn_NG",
3544c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kaj"
3545c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3546c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kam",
3547c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kam_Latn_KE",
3548c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kam"
3549c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3550c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kk",
3551c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kk_Cyrl_KZ",
3552c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kk"
3553c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3554c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kl",
3555c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kl_Latn_GL",
3556c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kl"
3557c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3558c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "km",
3559c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "km_Khmr_KH",
3560c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "km"
3561c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3562c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kn",
3563c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kn_Knda_IN",
3564c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kn"
3565c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3566c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ko",
3567c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ko_Kore_KR",
3568c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ko"
3569c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3570c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kok",
3571c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kok_Deva_IN",
3572c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kok"
3573c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3574c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kpe",
3575c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kpe_Latn_LR",
3576c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kpe"
3577c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3578c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ku",
3579103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    "ku_Latn_TR",
3580c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ku"
3581c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3582c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ky",
3583c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ky_Cyrl_KG",
3584c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ky"
3585c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3586c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "la",
3587c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "la_Latn_VA",
3588c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "la"
3589c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3590c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ln",
3591c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ln_Latn_CD",
3592c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ln"
3593c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3594c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "lo",
3595c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "lo_Laoo_LA",
3596c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "lo"
3597c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3598c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "lt",
3599c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "lt_Latn_LT",
3600c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "lt"
3601c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3602c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "lv",
3603c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "lv_Latn_LV",
3604c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "lv"
3605c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3606c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mg",
3607c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mg_Latn_MG",
3608c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mg"
3609c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3610c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mh",
3611c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mh_Latn_MH",
3612c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mh"
3613c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3614c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mk",
3615c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mk_Cyrl_MK",
3616c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mk"
3617c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3618c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ml",
3619c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ml_Mlym_IN",
3620c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ml"
3621c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3622c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mn",
3623c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mn_Cyrl_MN",
3624c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mn"
3625c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3626c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mr",
3627c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mr_Deva_IN",
3628c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mr"
3629c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3630c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ms",
3631c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ms_Latn_MY",
3632c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ms"
3633c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3634c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mt",
3635c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mt_Latn_MT",
3636c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mt"
3637c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3638c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "my",
3639c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "my_Mymr_MM",
3640c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "my"
3641c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3642c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "na",
3643c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "na_Latn_NR",
3644c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "na"
3645c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3646c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ne",
3647c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ne_Deva_NP",
3648c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ne"
3649c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3650c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "niu",
3651c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "niu_Latn_NU",
3652c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "niu"
3653c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3654c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nl",
3655c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nl_Latn_NL",
3656c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nl"
3657c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3658c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nn",
3659c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nn_Latn_NO",
3660c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nn"
3661c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3662c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nr",
3663c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nr_Latn_ZA",
3664c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nr"
3665c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3666c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nso",
3667c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nso_Latn_ZA",
3668c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nso"
3669c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3670c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ny",
3671c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ny_Latn_MW",
3672c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ny"
3673c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3674c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "om",
3675c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "om_Latn_ET",
3676c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "om"
3677c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3678c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "or",
3679c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "or_Orya_IN",
3680c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "or"
3681c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3682c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pa",
3683c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pa_Guru_IN",
3684c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pa"
3685c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3686c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pa_Arab",
3687c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pa_Arab_PK",
3688c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pa_PK"
3689c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3690c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pa_PK",
3691c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pa_Arab_PK",
3692c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pa_PK"
3693c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3694c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pap",
369559d709d503bab6e2b61931737e662dd293b40578ccornelius    "pap_Latn_AW",
3696c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pap"
3697c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3698c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pau",
3699c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pau_Latn_PW",
3700c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pau"
3701c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3702c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pl",
3703c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pl_Latn_PL",
3704c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pl"
3705c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3706c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ps",
3707c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ps_Arab_AF",
3708c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ps"
3709c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3710c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pt",
3711c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pt_Latn_BR",
3712c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pt"
3713c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3714c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "rn",
3715c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "rn_Latn_BI",
3716c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "rn"
3717c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3718c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ro",
3719c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ro_Latn_RO",
3720c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ro"
3721c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3722c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ru",
3723c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ru_Cyrl_RU",
3724c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ru"
3725c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3726c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "rw",
3727c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "rw_Latn_RW",
3728c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "rw"
3729c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3730c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sa",
3731c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sa_Deva_IN",
3732c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sa"
3733c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3734c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "se",
3735c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "se_Latn_NO",
3736c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "se"
3737c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3738c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sg",
3739c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sg_Latn_CF",
3740c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sg"
3741c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3742c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "si",
3743c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "si_Sinh_LK",
3744c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "si"
3745c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3746c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sid",
3747c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sid_Latn_ET",
3748c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sid"
3749c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3750c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sk",
3751c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sk_Latn_SK",
3752c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sk"
3753c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3754c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sl",
3755c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sl_Latn_SI",
3756c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sl"
3757c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3758c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sm",
3759c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sm_Latn_WS",
3760c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sm"
3761c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3762c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "so",
3763c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "so_Latn_SO",
3764c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "so"
3765c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3766c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sq",
3767c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sq_Latn_AL",
3768c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sq"
3769c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3770c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sr",
3771c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sr_Cyrl_RS",
3772c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sr"
3773c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3774c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ss",
3775c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ss_Latn_ZA",
3776c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ss"
3777c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3778c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "st",
3779c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "st_Latn_ZA",
3780c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "st"
3781c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3782c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sv",
3783c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sv_Latn_SE",
3784c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sv"
3785c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3786c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sw",
3787c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sw_Latn_TZ",
3788c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sw"
3789c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3790c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ta",
3791c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ta_Taml_IN",
3792c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ta"
3793c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3794c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "te",
3795c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "te_Telu_IN",
3796c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "te"
3797c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3798c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tet",
3799c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tet_Latn_TL",
3800c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tet"
3801c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3802c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tg",
3803c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tg_Cyrl_TJ",
3804c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tg"
3805c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3806c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "th",
3807c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "th_Thai_TH",
3808c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "th"
3809c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3810c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ti",
3811c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ti_Ethi_ET",
3812c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ti"
3813c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3814c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tig",
3815c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tig_Ethi_ER",
3816c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tig"
3817c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3818c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tk",
3819c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tk_Latn_TM",
3820c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tk"
3821c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3822c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tkl",
3823c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tkl_Latn_TK",
3824c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tkl"
3825c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3826c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tn",
3827c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tn_Latn_ZA",
3828c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tn"
3829c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3830c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "to",
3831c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "to_Latn_TO",
3832c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "to"
3833c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3834c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tpi",
3835c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tpi_Latn_PG",
3836c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tpi"
3837c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3838c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tr",
3839c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tr_Latn_TR",
3840c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tr"
3841c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3842c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ts",
3843c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ts_Latn_ZA",
3844c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ts"
3845c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3846c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tt",
3847c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tt_Cyrl_RU",
3848c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tt"
3849c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3850c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tvl",
3851c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tvl_Latn_TV",
3852c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tvl"
3853c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3854c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ty",
3855c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ty_Latn_PF",
3856c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ty"
3857c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3858c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "uk",
3859c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "uk_Cyrl_UA",
3860c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "uk"
3861c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3862c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und",
3863c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_US",
3864c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en"
3865c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3866c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_AD",
3867c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ca_Latn_AD",
3868c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ca_AD"
3869c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3870c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_AE",
3871c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_AE",
3872c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_AE"
3873c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3874c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_AF",
3875c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fa_Arab_AF",
3876c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fa_AF"
3877c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3878c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_AL",
3879c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sq_Latn_AL",
3880c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sq"
3881c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3882c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_AM",
3883c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hy_Armn_AM",
3884c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hy"
3885c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3886c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_AO",
3887c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pt_Latn_AO",
3888c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pt_AO"
3889c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3890c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_AR",
3891c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_AR",
3892c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_AR"
3893c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3894c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_AS",
3895c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sm_Latn_AS",
3896c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sm_AS"
3897c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3898c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_AT",
3899c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "de_Latn_AT",
3900c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "de_AT"
3901c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3902c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_AW",
3903c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nl_Latn_AW",
3904c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nl_AW"
3905c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3906c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_AX",
3907c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sv_Latn_AX",
3908c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sv_AX"
3909c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3910c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_AZ",
3911c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "az_Latn_AZ",
3912c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "az"
3913c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3914c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Arab",
3915c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_EG",
3916c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar"
3917c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3918c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Arab_IN",
3919c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ur_Arab_IN",
3920c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ur_IN"
3921c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3922c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Arab_PK",
3923c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ur_Arab_PK",
3924c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ur"
3925c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3926c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Arab_SN",
39271258862d9ee0c6a08dd7bc77ebfd302c8e4f2a3bccornelius    "ar_Arab_SN",
39281258862d9ee0c6a08dd7bc77ebfd302c8e4f2a3bccornelius    "ar_SN"
3929c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3930c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Armn",
3931c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hy_Armn_AM",
3932c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hy"
3933c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3934c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_BA",
3935c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bs_Latn_BA",
3936c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bs"
3937c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3938c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_BD",
3939c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bn_Beng_BD",
3940c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bn"
3941c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3942c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_BE",
3943c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nl_Latn_BE",
3944c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nl_BE"
3945c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3946c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_BF",
3947c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_Latn_BF",
3948c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_BF"
3949c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3950c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_BG",
3951c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bg_Cyrl_BG",
3952c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bg"
3953c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3954c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_BH",
3955c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_BH",
3956c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_BH"
3957c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3958c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_BI",
3959c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "rn_Latn_BI",
3960c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "rn"
3961c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3962c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_BJ",
3963c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_Latn_BJ",
3964c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_BJ"
3965c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3966c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_BN",
3967c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ms_Latn_BN",
3968c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ms_BN"
3969c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3970c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_BO",
3971c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_BO",
3972c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_BO"
3973c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3974c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_BR",
3975c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pt_Latn_BR",
3976c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pt"
3977c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3978c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_BT",
3979c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "dz_Tibt_BT",
3980c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "dz"
3981c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3982c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_BY",
3983c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "be_Cyrl_BY",
3984c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "be"
3985c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3986c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Beng",
3987c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bn_Beng_BD",
3988c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bn"
3989c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3990c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Beng_IN",
3991c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bn_Beng_IN",
3992c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bn_IN"
3993c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3994c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_CD",
3995b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "sw_Latn_CD",
3996b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "sw_CD"
3997c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
3998c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_CF",
3999b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "fr_Latn_CF",
4000b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "fr_CF"
4001c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4002c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_CG",
4003b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "fr_Latn_CG",
4004b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "fr_CG"
4005c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4006c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_CH",
4007c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "de_Latn_CH",
4008c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "de_CH"
4009c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4010c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_CI",
4011c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_Latn_CI",
4012c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_CI"
4013c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4014c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_CL",
4015c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_CL",
4016c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_CL"
4017c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4018c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_CM",
4019c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_Latn_CM",
4020c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_CM"
4021c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4022c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_CN",
4023c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_CN",
4024c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh"
4025c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4026c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_CO",
4027c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_CO",
4028c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_CO"
4029c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4030c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_CR",
4031c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_CR",
4032c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_CR"
4033c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4034c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_CU",
4035c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_CU",
4036c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_CU"
4037c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4038c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_CV",
4039c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pt_Latn_CV",
4040c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pt_CV"
4041c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4042c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_CY",
4043c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "el_Grek_CY",
4044c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "el_CY"
4045c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4046c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_CZ",
4047c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "cs_Latn_CZ",
4048c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "cs"
4049c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
405050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "und_Cher",
405150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "chr_Cher_US",
405250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "chr"
4053c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4054c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Cyrl",
4055c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ru_Cyrl_RU",
4056c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ru"
4057c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4058c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Cyrl_KZ",
40591258862d9ee0c6a08dd7bc77ebfd302c8e4f2a3bccornelius    "ru_Cyrl_KZ",
40601258862d9ee0c6a08dd7bc77ebfd302c8e4f2a3bccornelius    "ru_KZ"
4061c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4062c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_DE",
4063c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "de_Latn_DE",
4064c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "de"
4065c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4066c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_DJ",
4067c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "aa_Latn_DJ",
4068c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "aa_DJ"
4069c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4070c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_DK",
4071c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "da_Latn_DK",
4072c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "da"
4073c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4074c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_DO",
4075c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_DO",
4076c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_DO"
4077c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4078c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_DZ",
4079c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_DZ",
4080c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_DZ"
4081c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4082c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Deva",
4083c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hi_Deva_IN",
4084c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hi"
4085c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4086c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_EC",
4087c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_EC",
4088c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_EC"
4089c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4090c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_EE",
4091c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "et_Latn_EE",
4092c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "et"
4093c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4094c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_EG",
4095c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_EG",
4096c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar"
4097c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4098c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_EH",
4099c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_EH",
4100c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_EH"
4101c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4102c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_ER",
4103c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ti_Ethi_ER",
4104c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ti_ER"
4105c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4106c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_ES",
4107c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_ES",
4108c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es"
4109c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4110c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_ET",
41118393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    "am_Ethi_ET",
41128393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    "am"
4113c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4114c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Ethi",
4115c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "am_Ethi_ET",
4116c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "am"
4117c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4118c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Ethi_ER",
41191258862d9ee0c6a08dd7bc77ebfd302c8e4f2a3bccornelius    "am_Ethi_ER",
41201258862d9ee0c6a08dd7bc77ebfd302c8e4f2a3bccornelius    "am_ER"
4121c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4122c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_FI",
4123c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fi_Latn_FI",
4124c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fi"
4125c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4126c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_FM",
41271b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    "en_Latn_FM",
41281b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    "en_FM"
4129c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4130c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_FO",
4131c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fo_Latn_FO",
4132c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fo"
4133c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4134c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_FR",
4135c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_Latn_FR",
4136c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr"
4137c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4138c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_GA",
4139c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_Latn_GA",
4140c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_GA"
4141c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4142c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_GE",
4143c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ka_Geor_GE",
4144c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ka"
4145c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4146c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_GF",
4147c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_Latn_GF",
4148c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_GF"
4149c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4150c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_GL",
4151c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kl_Latn_GL",
4152c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kl"
4153c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4154c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_GN",
4155c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_Latn_GN",
4156c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_GN"
4157c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4158c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_GP",
4159c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_Latn_GP",
4160c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_GP"
4161c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4162c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_GQ",
416350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "es_Latn_GQ",
416450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "es_GQ"
4165c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4166c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_GR",
4167c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "el_Grek_GR",
4168c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "el"
4169c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4170c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_GT",
4171c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_GT",
4172c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_GT"
4173c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4174c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_GU",
41751258862d9ee0c6a08dd7bc77ebfd302c8e4f2a3bccornelius    "en_Latn_GU",
41761258862d9ee0c6a08dd7bc77ebfd302c8e4f2a3bccornelius    "en_GU"
4177c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4178c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_GW",
4179c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pt_Latn_GW",
4180c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pt_GW"
4181c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4182c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Geor",
4183c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ka_Geor_GE",
4184c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ka"
4185c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4186c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Grek",
4187c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "el_Grek_GR",
4188c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "el"
4189c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4190c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Gujr",
4191c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "gu_Gujr_IN",
4192c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "gu"
4193c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4194c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Guru",
4195c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pa_Guru_IN",
4196c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pa"
4197c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4198c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_HK",
4199c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_HK",
4200c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_HK"
4201c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4202c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_HN",
4203c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_HN",
4204c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_HN"
4205c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4206c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_HR",
4207c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hr_Latn_HR",
4208c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hr"
4209c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4210c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_HT",
4211c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ht_Latn_HT",
4212c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ht"
4213c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4214c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_HU",
4215c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hu_Latn_HU",
4216c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hu"
4217c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4218c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Hani",
421959d709d503bab6e2b61931737e662dd293b40578ccornelius    "zh_Hani_CN",
422059d709d503bab6e2b61931737e662dd293b40578ccornelius    "zh_Hani"
4221c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4222c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Hans",
4223c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_CN",
4224c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh"
4225c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4226c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Hant",
4227c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_TW",
4228c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_TW"
4229c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4230c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Hebr",
4231c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "he_Hebr_IL",
4232c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "he"
4233c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4234c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_IL",
4235c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "he_Hebr_IL",
4236c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "he"
4237c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4238c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_IN",
4239c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hi_Deva_IN",
4240c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "hi"
4241c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4242c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_IQ",
4243c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_IQ",
4244c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_IQ"
4245c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4246c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_IR",
4247c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fa_Arab_IR",
4248c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fa"
4249c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4250c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_IS",
4251c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "is_Latn_IS",
4252c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "is"
4253c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4254c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_IT",
4255c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "it_Latn_IT",
4256c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "it"
4257c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4258c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_JO",
4259c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_JO",
4260c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_JO"
4261c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4262c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_JP",
4263c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ja_Jpan_JP",
4264c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ja"
4265c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4266c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Jpan",
4267c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ja_Jpan_JP",
4268c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ja"
4269c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4270c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_KG",
4271c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ky_Cyrl_KG",
4272c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ky"
4273c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4274c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_KH",
4275c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "km_Khmr_KH",
4276c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "km"
4277c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4278c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_KM",
4279c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_KM",
4280c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_KM"
4281c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4282c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_KP",
4283c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ko_Kore_KP",
4284c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ko_KP"
4285c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4286c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_KR",
4287c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ko_Kore_KR",
4288c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ko"
4289c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4290c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_KW",
4291c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_KW",
4292c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_KW"
4293c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4294c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_KZ",
4295c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ru_Cyrl_KZ",
4296c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ru_KZ"
4297c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4298c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Khmr",
4299c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "km_Khmr_KH",
4300c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "km"
4301c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4302c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Knda",
4303c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kn_Knda_IN",
4304c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "kn"
4305c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4306c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Kore",
4307c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ko_Kore_KR",
4308c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ko"
4309c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4310c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_LA",
4311c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "lo_Laoo_LA",
4312c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "lo"
4313c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4314c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_LB",
4315c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_LB",
4316c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_LB"
4317c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4318c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_LI",
4319c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "de_Latn_LI",
4320c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "de_LI"
4321c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4322c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_LK",
4323c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "si_Sinh_LK",
4324c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "si"
4325c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4326c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_LS",
4327c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "st_Latn_LS",
4328c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "st_LS"
4329c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4330c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_LT",
4331c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "lt_Latn_LT",
4332c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "lt"
4333c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4334c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_LU",
4335c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_Latn_LU",
4336c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_LU"
4337c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4338c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_LV",
4339c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "lv_Latn_LV",
4340c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "lv"
4341c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4342c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_LY",
4343c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_LY",
4344c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_LY"
4345c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4346c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Laoo",
4347c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "lo_Laoo_LA",
4348c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "lo"
4349c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4350c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Latn_ES",
4351c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_ES",
4352c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es"
4353c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4354c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Latn_ET",
435559d709d503bab6e2b61931737e662dd293b40578ccornelius    "en_Latn_ET",
435659d709d503bab6e2b61931737e662dd293b40578ccornelius    "en_ET"
4357c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4358c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Latn_GB",
4359c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_GB",
4360c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_GB"
4361c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4362c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Latn_GH",
4363c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ak_Latn_GH",
4364c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ak"
4365c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4366c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Latn_ID",
4367c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "id_Latn_ID",
4368c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "id"
4369c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4370c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Latn_IT",
4371c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "it_Latn_IT",
4372c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "it"
4373c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4374c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Latn_NG",
4375b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "en_Latn_NG",
4376b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "en_NG"
4377c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4378c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Latn_TR",
4379c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tr_Latn_TR",
4380c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tr"
4381c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4382c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Latn_ZA",
43831258862d9ee0c6a08dd7bc77ebfd302c8e4f2a3bccornelius    "en_Latn_ZA",
43841258862d9ee0c6a08dd7bc77ebfd302c8e4f2a3bccornelius    "en_ZA"
4385c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4386c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_MA",
4387c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_MA",
4388c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_MA"
4389c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4390c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_MC",
4391c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_Latn_MC",
4392c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_MC"
4393c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4394c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_MD",
4395c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ro_Latn_MD",
4396c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ro_MD"
4397c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4398c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_ME",
4399b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "sr_Latn_ME",
4400c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sr_ME"
4401c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4402c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_MG",
4403c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mg_Latn_MG",
4404c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mg"
4405c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4406c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_MH",
44071258862d9ee0c6a08dd7bc77ebfd302c8e4f2a3bccornelius    "en_Latn_MH",
44081258862d9ee0c6a08dd7bc77ebfd302c8e4f2a3bccornelius    "en_MH"
4409c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4410c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_MK",
4411c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mk_Cyrl_MK",
4412c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mk"
4413c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4414c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_ML",
441550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "bm_Latn_ML",
441650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "bm"
4417c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4418c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_MM",
4419c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "my_Mymr_MM",
4420c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "my"
4421c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4422c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_MN",
4423c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mn_Cyrl_MN",
4424c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mn"
4425c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4426c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_MO",
4427c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_MO",
4428c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_MO"
4429c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4430c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_MQ",
4431c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_Latn_MQ",
4432c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_MQ"
4433c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4434c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_MR",
4435c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_MR",
4436c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_MR"
4437c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4438c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_MT",
4439c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mt_Latn_MT",
4440c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "mt"
4441c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4442c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_MV",
4443c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "dv_Thaa_MV",
4444c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "dv"
4445c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4446c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_MW",
444750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "en_Latn_MW",
444850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "en_MW"
4449c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4450c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_MX",
4451c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_MX",
4452c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_MX"
4453c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4454c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_MY",
4455c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ms_Latn_MY",
4456c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ms"
4457c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4458c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_MZ",
4459c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pt_Latn_MZ",
4460c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pt_MZ"
4461c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4462c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Mlym",
4463c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ml_Mlym_IN",
4464c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ml"
4465c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4466c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Mymr",
4467c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "my_Mymr_MM",
4468c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "my"
4469c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4470c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_NC",
4471c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_Latn_NC",
4472c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_NC"
4473c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4474c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_NE",
4475c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ha_Latn_NE",
4476c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ha_NE"
4477c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4478c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_NG",
4479b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "en_Latn_NG",
4480b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "en_NG"
4481c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4482c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_NI",
4483c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_NI",
4484c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_NI"
4485c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4486c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_NL",
4487c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nl_Latn_NL",
4488c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nl"
4489c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4490c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_NO",
44914b05912059a8780b56c7b70160e6d27a8de6c3caFredrik Roubert    "no_Latn_NO",  /* Google patch */
44924b05912059a8780b56c7b70160e6d27a8de6c3caFredrik Roubert    "no"  /* Google patch */
4493c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4494c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_NP",
4495c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ne_Deva_NP",
4496c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ne"
4497c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4498c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_NR",
44991258862d9ee0c6a08dd7bc77ebfd302c8e4f2a3bccornelius    "en_Latn_NR",
45001258862d9ee0c6a08dd7bc77ebfd302c8e4f2a3bccornelius    "en_NR"
4501c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4502c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_NU",
45031258862d9ee0c6a08dd7bc77ebfd302c8e4f2a3bccornelius    "en_Latn_NU",
45041258862d9ee0c6a08dd7bc77ebfd302c8e4f2a3bccornelius    "en_NU"
4505c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4506c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_OM",
4507c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_OM",
4508c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_OM"
4509c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4510c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Orya",
4511c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "or_Orya_IN",
4512c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "or"
4513c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4514c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_PA",
4515c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_PA",
4516c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_PA"
4517c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4518c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_PE",
4519c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_PE",
4520c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_PE"
4521c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4522c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_PF",
4523b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "fr_Latn_PF",
4524b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "fr_PF"
4525c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4526c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_PG",
4527c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tpi_Latn_PG",
4528c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tpi"
4529c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4530c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_PH",
4531c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fil_Latn_PH",
4532c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fil"
4533c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4534c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_PL",
4535c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pl_Latn_PL",
4536c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pl"
4537c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4538c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_PM",
4539c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_Latn_PM",
4540c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_PM"
4541c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4542c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_PR",
4543c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_PR",
4544c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_PR"
4545c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4546c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_PS",
4547c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_PS",
4548c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_PS"
4549c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4550c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_PT",
4551c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pt_Latn_PT",
4552c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pt_PT"
4553c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4554c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_PW",
4555c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pau_Latn_PW",
4556c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pau"
4557c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4558c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_PY",
4559c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "gn_Latn_PY",
4560c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "gn"
4561c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4562c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_QA",
4563c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_QA",
4564c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_QA"
4565c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4566c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_RE",
4567c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_Latn_RE",
4568c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_RE"
4569c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4570c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_RO",
4571c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ro_Latn_RO",
4572c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ro"
4573c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4574c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_RS",
4575c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sr_Cyrl_RS",
4576c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sr"
4577c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4578c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_RU",
4579c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ru_Cyrl_RU",
4580c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ru"
4581c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4582c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_RW",
4583c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "rw_Latn_RW",
4584c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "rw"
4585c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4586c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_SA",
4587c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_SA",
4588c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_SA"
4589c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4590c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_SD",
4591c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_SD",
4592c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_SD"
4593c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4594c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_SE",
4595c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sv_Latn_SE",
4596c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sv"
4597c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4598c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_SG",
4599c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_SG",
4600c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_SG"
4601c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4602c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_SI",
4603c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sl_Latn_SI",
4604c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sl"
4605c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4606c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_SJ",
46074b05912059a8780b56c7b70160e6d27a8de6c3caFredrik Roubert    "no_Latn_SJ",  /* Google patch */
46084b05912059a8780b56c7b70160e6d27a8de6c3caFredrik Roubert    "no_SJ"  /* Google patch */
4609c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4610c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_SK",
4611c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sk_Latn_SK",
4612c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sk"
4613c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4614c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_SM",
4615c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "it_Latn_SM",
4616c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "it_SM"
4617c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4618c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_SN",
4619c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_Latn_SN",
4620c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_SN"
4621c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4622c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_SO",
4623c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "so_Latn_SO",
4624c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "so"
4625c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4626c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_SR",
4627c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nl_Latn_SR",
4628c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "nl_SR"
4629c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4630c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_ST",
4631c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pt_Latn_ST",
4632c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "pt_ST"
4633c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4634c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_SV",
4635c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_SV",
4636c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_SV"
4637c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4638c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_SY",
4639c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_SY",
4640c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_SY"
4641c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4642c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Sinh",
4643c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "si_Sinh_LK",
4644c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "si"
4645c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4646c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_TD",
4647b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "fr_Latn_TD",
4648b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "fr_TD"
4649c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4650c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_TG",
4651b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "fr_Latn_TG",
4652b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "fr_TG"
4653c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4654c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_TH",
4655c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "th_Thai_TH",
4656c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "th"
4657c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4658c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_TJ",
4659c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tg_Cyrl_TJ",
4660c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tg"
4661c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4662c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_TK",
466350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "tkl_Latn_TK",
466450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "tkl"
4665c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4666c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_TL",
4667b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "pt_Latn_TL",
4668b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "pt_TL"
4669c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4670c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_TM",
4671c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tk_Latn_TM",
4672c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tk"
4673c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4674c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_TN",
4675c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_TN",
4676c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_TN"
4677c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4678c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_TO",
4679c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "to_Latn_TO",
4680c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "to"
4681c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4682c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_TR",
4683c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tr_Latn_TR",
4684c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tr"
4685c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4686c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_TV",
4687c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tvl_Latn_TV",
4688c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "tvl"
4689c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4690c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_TW",
4691c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_TW",
4692c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_TW"
4693c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4694c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Taml",
4695c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ta_Taml_IN",
4696c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ta"
4697c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4698c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Telu",
4699c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "te_Telu_IN",
4700c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "te"
4701c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4702c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Thaa",
4703c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "dv_Thaa_MV",
4704c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "dv"
4705c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4706c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Thai",
4707c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "th_Thai_TH",
4708c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "th"
4709c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4710c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Tibt",
4711c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bo_Tibt_CN",
4712c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "bo"
4713c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4714c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_UA",
4715c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "uk_Cyrl_UA",
4716c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "uk"
4717c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4718c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_UY",
4719c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_UY",
4720c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_UY"
4721c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4722c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_UZ",
472359d709d503bab6e2b61931737e662dd293b40578ccornelius    "uz_Latn_UZ",
4724c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "uz"
4725c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4726c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_VA",
4727f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    "it_Latn_VA",
4728f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    "it_VA"
4729c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4730c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_VE",
4731c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_VE",
4732c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_VE"
4733c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4734c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_VN",
4735c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "vi_Latn_VN",
4736c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "vi"
4737c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4738c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_VU",
4739b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    "bi_Latn_VU",
4740b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    "bi"
4741c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4742c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_WF",
4743c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_Latn_WF",
4744c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_WF"
4745c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4746c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_WS",
4747c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sm_Latn_WS",
4748c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "sm"
4749c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4750c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_YE",
4751c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_Arab_YE",
4752c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ar_YE"
4753c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4754c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_YT",
4755c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_Latn_YT",
4756c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "fr_YT"
4757c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4758c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Yiii",
4759b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "ii_Yiii_CN",
4760b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "ii"
4761c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4762c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ur",
4763c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ur_Arab_PK",
4764c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ur"
4765c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4766c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "uz",
476759d709d503bab6e2b61931737e662dd293b40578ccornelius    "uz_Latn_UZ",
4768c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "uz"
4769c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4770c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "uz_AF",
4771c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "uz_Arab_AF",
4772c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "uz_AF"
4773c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4774c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "uz_Arab",
4775c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "uz_Arab_AF",
4776c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "uz_AF"
4777c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4778c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ve",
4779c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ve_Latn_ZA",
4780c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "ve"
4781c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4782c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "vi",
4783c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "vi_Latn_VN",
4784c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "vi"
4785c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4786c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "wal",
4787c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "wal_Ethi_ET",
4788c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "wal"
4789c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4790c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "wo",
4791c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "wo_Latn_SN",
4792c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "wo"
4793c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4794c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "xh",
4795c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "xh_Latn_ZA",
4796c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "xh"
4797c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4798c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "yo",
4799c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "yo_Latn_NG",
4800c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "yo"
4801c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4802c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh",
4803c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_CN",
4804c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh"
4805c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4806c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_HK",
4807c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_HK",
4808c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_HK"
4809c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4810c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hani",
481159d709d503bab6e2b61931737e662dd293b40578ccornelius    "zh_Hani_CN", /* changed due to cldrbug 6204, may be an error */
481259d709d503bab6e2b61931737e662dd293b40578ccornelius    "zh_Hani", /* changed due to cldrbug 6204, may be an error */
4813c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4814c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant",
4815c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_TW",
4816c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_TW"
4817c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4818c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_MO",
4819c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_MO",
4820c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_MO"
4821c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4822c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_TW",
4823c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_TW",
4824c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_TW"
4825c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4826c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zu",
4827c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zu_Latn_ZA",
4828c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zu"
4829c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4830c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und",
4831c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_US",
4832c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en"
4833c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4834c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_ZZ",
4835c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_US",
4836c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en"
4837c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4838c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_CN",
4839c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_CN",
4840c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh"
4841c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4842c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_TW",
4843c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_TW",
4844c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_TW"
4845c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4846c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_HK",
4847c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_HK",
4848c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_HK"
4849c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4850c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_AQ",
48518393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    "und_Latn_AQ",
48528393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    "und_AQ"
4853c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4854c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Zzzz",
4855c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_US",
4856c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en"
4857c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4858c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Zzzz_ZZ",
4859c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_US",
4860c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en"
4861c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4862c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Zzzz_CN",
4863c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_CN",
4864c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh"
4865c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4866c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Zzzz_TW",
4867c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_TW",
4868c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_TW"
4869c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4870c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Zzzz_HK",
4871c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_HK",
4872c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_HK"
4873c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4874c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Zzzz_AQ",
48758393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    "und_Latn_AQ",
48768393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    "und_AQ"
4877c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4878c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Latn",
4879c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_US",
4880c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en"
4881c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4882c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Latn_ZZ",
4883c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Latn_US",
4884c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en"
4885c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4886c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Latn_CN",
4887b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "za_Latn_CN",
4888b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    "za"
4889c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4890c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Latn_TW",
48918393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    "trv_Latn_TW",
48928393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    "trv"
4893c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4894c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Latn_HK",
4895c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn_HK",
4896c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn_HK"
4897c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4898c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Latn_AQ",
48998393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    "und_Latn_AQ",
49008393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    "und_AQ"
4901c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4902c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Hans",
4903c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_CN",
4904c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh"
4905c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4906c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Hans_ZZ",
4907c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_CN",
4908c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh"
4909c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4910c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Hans_CN",
4911c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_CN",
4912c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh"
4913c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4914c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Hans_TW",
4915c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_TW",
4916c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_TW"
4917c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4918c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Hans_HK",
4919c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_HK",
4920c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_HK"
4921c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4922c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Hans_AQ",
4923c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_AQ",
4924c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_AQ"
4925c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4926c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Hant",
4927c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_TW",
4928c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_TW"
4929c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4930c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Hant_ZZ",
4931c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_TW",
4932c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_TW"
4933c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4934c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Hant_CN",
4935c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_CN",
4936c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_CN"
4937c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4938c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Hant_TW",
4939c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_TW",
4940c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_TW"
4941c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4942c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Hant_HK",
4943c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_HK",
4944c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_HK"
4945c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4946c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Hant_AQ",
4947c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_AQ",
4948c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_AQ"
4949c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4950c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Moon",
4951c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Moon_US",
4952c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Moon"
4953c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4954c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Moon_ZZ",
4955c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Moon_US",
4956c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "en_Moon"
4957c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4958c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Moon_CN",
4959c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon_CN",
4960c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon"
4961c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4962c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Moon_TW",
4963c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon_TW",
4964c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon_TW"
4965c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4966c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Moon_HK",
4967c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon_HK",
4968c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon_HK"
4969c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4970c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "und_Moon_AQ",
49718393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    "und_Moon_AQ",
49728393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    "und_Moon_AQ"
4973c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4974c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es",
4975c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_ES",
4976c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es"
4977c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4978c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_ZZ",
4979c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_ES",
4980c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es"
4981c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4982c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_CN",
4983c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_CN",
4984c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_CN"
4985c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4986c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_TW",
4987c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_TW",
4988c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_TW"
4989c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4990c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_HK",
4991c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_HK",
4992c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_HK"
4993c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4994c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_AQ",
4995c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_AQ",
4996c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_AQ"
4997c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
4998c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Zzzz",
4999c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_ES",
5000c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es"
5001c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5002c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Zzzz_ZZ",
5003c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_ES",
5004c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es"
5005c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5006c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Zzzz_CN",
5007c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_CN",
5008c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_CN"
5009c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5010c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Zzzz_TW",
5011c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_TW",
5012c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_TW"
5013c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5014c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Zzzz_HK",
5015c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_HK",
5016c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_HK"
5017c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5018c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Zzzz_AQ",
5019c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_AQ",
5020c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_AQ"
5021c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5022c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn",
5023c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_ES",
5024c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es"
5025c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5026c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_ZZ",
5027c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_ES",
5028c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es"
5029c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5030c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_CN",
5031c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_CN",
5032c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_CN"
5033c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5034c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_TW",
5035c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_TW",
5036c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_TW"
5037c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5038c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_HK",
5039c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_HK",
5040c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_HK"
5041c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5042c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_AQ",
5043c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Latn_AQ",
5044c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_AQ"
5045c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5046c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hans",
5047c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hans_ES",
5048c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hans"
5049c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5050c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hans_ZZ",
5051c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hans_ES",
5052c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hans"
5053c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5054c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hans_CN",
5055c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hans_CN",
5056c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hans_CN"
5057c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5058c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hans_TW",
5059c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hans_TW",
5060c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hans_TW"
5061c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5062c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hans_HK",
5063c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hans_HK",
5064c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hans_HK"
5065c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5066c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hans_AQ",
5067c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hans_AQ",
5068c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hans_AQ"
5069c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5070c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hant",
5071c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hant_ES",
5072c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hant"
5073c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5074c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hant_ZZ",
5075c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hant_ES",
5076c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hant"
5077c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5078c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hant_CN",
5079c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hant_CN",
5080c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hant_CN"
5081c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5082c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hant_TW",
5083c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hant_TW",
5084c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hant_TW"
5085c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5086c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hant_HK",
5087c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hant_HK",
5088c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hant_HK"
5089c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5090c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hant_AQ",
5091c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hant_AQ",
5092c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Hant_AQ"
5093c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5094c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Moon",
5095c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Moon_ES",
5096c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Moon"
5097c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5098c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Moon_ZZ",
5099c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Moon_ES",
5100c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Moon"
5101c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5102c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Moon_CN",
5103c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Moon_CN",
5104c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Moon_CN"
5105c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5106c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Moon_TW",
5107c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Moon_TW",
5108c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Moon_TW"
5109c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5110c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Moon_HK",
5111c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Moon_HK",
5112c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Moon_HK"
5113c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5114c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Moon_AQ",
5115c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Moon_AQ",
5116c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "es_Moon_AQ"
5117c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5118c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh",
5119c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_CN",
5120c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh"
5121c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5122c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_ZZ",
5123c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_CN",
5124c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh"
5125c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5126c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_CN",
5127c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_CN",
5128c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh"
5129c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5130c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_TW",
5131c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_TW",
5132c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_TW"
5133c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5134c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_HK",
5135c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_HK",
5136c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_HK"
5137c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5138c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_AQ",
5139c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_AQ",
5140c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_AQ"
5141c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5142c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Zzzz",
5143c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_CN",
5144c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh"
5145c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5146c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Zzzz_ZZ",
5147c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_CN",
5148c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh"
5149c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5150c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Zzzz_CN",
5151c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_CN",
5152c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh"
5153c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5154c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Zzzz_TW",
5155c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_TW",
5156c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_TW"
5157c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5158c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Zzzz_HK",
5159c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_HK",
5160c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_HK"
5161c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5162c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Zzzz_AQ",
5163c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_AQ",
5164c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_AQ"
5165c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5166c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn",
5167c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn_CN",
5168c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn"
5169c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5170c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn_ZZ",
5171c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn_CN",
5172c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn"
5173c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5174c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn_CN",
5175c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn_CN",
5176c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn"
5177c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5178c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn_TW",
5179c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn_TW",
5180c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn_TW"
5181c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5182c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn_HK",
5183c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn_HK",
5184c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn_HK"
5185c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5186c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn_AQ",
5187c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn_AQ",
5188c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Latn_AQ"
5189c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5190c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans",
5191c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_CN",
5192c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh"
5193c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5194c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_ZZ",
5195c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_CN",
5196c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh"
5197c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5198c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_TW",
5199c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_TW",
5200c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_TW"
5201c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5202c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_HK",
5203c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_HK",
5204c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_HK"
5205c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5206c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_AQ",
5207c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hans_AQ",
5208c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_AQ"
5209c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5210c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant",
5211c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_TW",
5212c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_TW"
5213c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5214c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_ZZ",
5215c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_TW",
5216c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_TW"
5217c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5218c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_CN",
5219c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_CN",
5220c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_CN"
5221c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5222c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_AQ",
5223c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_AQ",
5224c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Hant_AQ"
5225c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5226c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon",
5227c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon_CN",
5228c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon"
5229c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5230c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon_ZZ",
5231c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon_CN",
5232c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon"
5233c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5234c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon_CN",
5235c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon_CN",
5236c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon"
5237c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5238c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon_TW",
5239c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon_TW",
5240c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon_TW"
5241c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5242c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon_HK",
5243c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon_HK",
5244c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon_HK"
5245c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5246c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon_AQ",
5247c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon_AQ",
5248c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "zh_Moon_AQ"
5249c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5250c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art",
5251c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5252c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5253c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5254c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_ZZ",
5255c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5256c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5257c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5258c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_CN",
5259c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5260c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5261c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5262c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_TW",
5263c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5264c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5265c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5266c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_HK",
5267c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5268c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5269c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5270c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_AQ",
5271c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5272c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5273c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5274c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Zzzz",
5275c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5276c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5277c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5278c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Zzzz_ZZ",
5279c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5280c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5281c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5282c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Zzzz_CN",
5283c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5284c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5285c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5286c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Zzzz_TW",
5287c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5288c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5289c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5290c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Zzzz_HK",
5291c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5292c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5293c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5294c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Zzzz_AQ",
5295c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5296c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5297c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5298c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Latn",
5299c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5300c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5301c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5302c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Latn_ZZ",
5303c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5304c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5305c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5306c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Latn_CN",
5307c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5308c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5309c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5310c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Latn_TW",
5311c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5312c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5313c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5314c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Latn_HK",
5315c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5316c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5317c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5318c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Latn_AQ",
5319c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5320c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5321c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5322c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Hans",
5323c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5324c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5325c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5326c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Hans_ZZ",
5327c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5328c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5329c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5330c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Hans_CN",
5331c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5332c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5333c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5334c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Hans_TW",
5335c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5336c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5337c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5338c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Hans_HK",
5339c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5340c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5341c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5342c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Hans_AQ",
5343c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5344c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5345c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5346c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Hant",
5347c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5348c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5349c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5350c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Hant_ZZ",
5351c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5352c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5353c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5354c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Hant_CN",
5355c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5356c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5357c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5358c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Hant_TW",
5359c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5360c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5361c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5362c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Hant_HK",
5363c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5364c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5365c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5366c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Hant_AQ",
5367c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5368c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5369c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5370c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Moon",
5371c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5372c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5373c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5374c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Moon_ZZ",
5375c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5376c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5377c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5378c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Moon_CN",
5379c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5380c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5381c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5382c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Moon_TW",
5383c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5384c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5385c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5386c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Moon_HK",
5387c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5388c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5389c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }, {
5390c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "art_Moon_AQ",
5391c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    "",
5392c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ""
5393b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  }, {
5394b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    "de@collation=phonebook",
5395b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    "de_Latn_DE@collation=phonebook",
5396b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    "de@collation=phonebook"
5397c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }
5398c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru};
5399c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5400c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querutypedef struct errorDataTag {
5401c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    const char* tag;
5402c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    const char* expected;
5403c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UErrorCode uerror;
5404c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t  bufferSize;
5405c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} errorData;
5406c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5407c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruconst errorData maximizeErrors[] = {
5408c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
5409c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        "enfueiujhytdf",
5410c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        NULL,
5411c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        U_ILLEGAL_ARGUMENT_ERROR,
5412c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        -1
5413c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    },
5414c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
5415c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        "en_THUJIOGIURJHGJFURYHFJGURYYYHHGJURHG",
5416c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        NULL,
5417c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        U_ILLEGAL_ARGUMENT_ERROR,
5418c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        -1
5419c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    },
5420c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
5421c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        "en_THUJIOGIURJHGJFURYHFJGURYYYHHGJURHG",
5422c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        NULL,
5423c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        U_ILLEGAL_ARGUMENT_ERROR,
5424c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        -1
5425c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    },
5426c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
5427c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        "en_Latn_US_POSIX@currency=EURO",
5428c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        "en_Latn_US_POSIX@currency=EURO",
5429c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        U_BUFFER_OVERFLOW_ERROR,
5430c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        29
5431c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    },
5432c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
5433c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        "en_Latn_US_POSIX@currency=EURO",
5434c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        "en_Latn_US_POSIX@currency=EURO",
5435c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        U_STRING_NOT_TERMINATED_WARNING,
5436c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        30
5437c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
5438c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru};
5439c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5440c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruconst errorData minimizeErrors[] = {
5441c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
5442c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        "enfueiujhytdf",
5443c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        NULL,
5444c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        U_ILLEGAL_ARGUMENT_ERROR,
5445c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        -1
5446c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    },
5447c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
5448c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        "en_THUJIOGIURJHGJFURYHFJGURYYYHHGJURHG",
5449c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        NULL,
5450c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        U_ILLEGAL_ARGUMENT_ERROR,
5451c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        -1
5452c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    },
5453c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
5454c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        "en_Latn_US_POSIX@currency=EURO",
5455c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        "en__POSIX@currency=EURO",
5456c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        U_BUFFER_OVERFLOW_ERROR,
5457c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        22
5458c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    },
5459c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
5460c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        "en_Latn_US_POSIX@currency=EURO",
5461c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        "en__POSIX@currency=EURO",
5462c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        U_STRING_NOT_TERMINATED_WARNING,
5463c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        23
5464c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
5465c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru};
5466c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5467c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic int32_t getExpectedReturnValue(const errorData* data)
5468c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
5469c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (data->uerror == U_BUFFER_OVERFLOW_ERROR ||
5470c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        data->uerror == U_STRING_NOT_TERMINATED_WARNING)
5471c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
5472c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return strlen(data->expected);
5473c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
5474c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    else
5475c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
5476c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return -1;
5477c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
5478c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
5479c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5480c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic int32_t getBufferSize(const errorData* data, int32_t actualSize)
5481c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
5482c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (data->expected == NULL)
5483c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
5484c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return actualSize;
5485c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
5486c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    else if (data->bufferSize < 0)
5487c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
5488c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return strlen(data->expected) + 1;
5489c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
5490c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    else
5491c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
5492c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return data->bufferSize;
5493c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
5494c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
5495c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5496c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic void TestLikelySubtags()
5497c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
5498c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    char buffer[ULOC_FULLNAME_CAPACITY + ULOC_KEYWORD_AND_VALUES_CAPACITY + 1];
5499c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t i = 0;
5500c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5501c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    for (; i < sizeof(basic_maximize_data) / sizeof(basic_maximize_data[0]); ++i)
5502c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
5503c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
5504c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const char* const minimal = basic_maximize_data[i][0];
5505c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const char* const maximal = basic_maximize_data[i][1];
5506c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
550750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* const int32_t length = */
5508c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            uloc_addLikelySubtags(
5509c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                minimal,
5510c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                buffer,
5511c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                sizeof(buffer),
5512c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                &status);
5513c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (U_FAILURE(status)) {
55146d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err_status(status, "  unexpected failure of uloc_addLikelySubtags(), minimal \"%s\" status %s\n", minimal, u_errorName(status));
5515c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            status = U_ZERO_ERROR;
5516c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5517c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        else if (uprv_strlen(maximal) == 0) {
5518c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            if (uprv_stricmp(minimal, buffer) != 0) {
5519c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                log_err("  unexpected maximal value \"%s\" in uloc_addLikelySubtags(), minimal \"%s\" = \"%s\"\n", maximal, minimal, buffer);
5520c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
5521c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5522c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        else if (uprv_stricmp(maximal, buffer) != 0) {
5523c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_err("  maximal doesn't match expected %s in uloc_addLikelySubtags(), minimal \"%s\" = %s\n", maximal, minimal, buffer);
5524c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5525c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
5526c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5527c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    for (i = 0; i < sizeof(basic_minimize_data) / sizeof(basic_minimize_data[0]); ++i) {
5528c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5529c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
5530c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const char* const maximal = basic_minimize_data[i][0];
5531c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const char* const minimal = basic_minimize_data[i][1];
5532c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
553350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* const int32_t length = */
5534c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            uloc_minimizeSubtags(
5535c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                maximal,
5536c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                buffer,
5537c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                sizeof(buffer),
5538c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                &status);
5539c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5540c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (U_FAILURE(status)) {
55416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err_status(status, "  unexpected failure of uloc_MinimizeSubtags(), maximal \"%s\" status %s\n", maximal, u_errorName(status));
5542c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            status = U_ZERO_ERROR;
5543c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5544c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        else if (uprv_strlen(minimal) == 0) {
5545c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            if (uprv_stricmp(maximal, buffer) != 0) {
5546c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                log_err("  unexpected minimal value \"%s\" in uloc_minimizeSubtags(), maximal \"%s\" = \"%s\"\n", minimal, maximal, buffer);
5547c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
5548c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5549c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        else if (uprv_stricmp(minimal, buffer) != 0) {
5550c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_err("  minimal doesn't match expected %s in uloc_MinimizeSubtags(), maximal \"%s\" = %s\n", minimal, maximal, buffer);
5551c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5552c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
5553c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5554c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    for (i = 0; i < sizeof(full_data) / sizeof(full_data[0]); ++i) {
5555c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5556c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
5557c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const char* const minimal = full_data[i][0];
5558c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const char* const maximal = full_data[i][1];
5559c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
556050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* const int32_t length = */
5561c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            uloc_addLikelySubtags(
5562c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                minimal,
5563c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                buffer,
5564c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                sizeof(buffer),
5565c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                &status);
5566c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (U_FAILURE(status)) {
55676d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err_status(status, "  unexpected failure of uloc_addLikelySubtags(), minimal \"%s\" status \"%s\"\n", minimal, u_errorName(status));
5568c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            status = U_ZERO_ERROR;
5569c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5570c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        else if (uprv_strlen(maximal) == 0) {
5571c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            if (uprv_stricmp(minimal, buffer) != 0) {
5572c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                log_err("  unexpected maximal value \"%s\" in uloc_addLikelySubtags(), minimal \"%s\" = \"%s\"\n", maximal, minimal, buffer);
5573c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
5574c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5575c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        else if (uprv_stricmp(maximal, buffer) != 0) {
5576c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_err("  maximal doesn't match expected \"%s\" in uloc_addLikelySubtags(), minimal \"%s\" = \"%s\"\n", maximal, minimal, buffer);
5577c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5578c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
5579c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5580c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    for (i = 0; i < sizeof(full_data) / sizeof(full_data[0]); ++i) {
5581c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5582c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
5583c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const char* const maximal = full_data[i][1];
5584c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const char* const minimal = full_data[i][2];
5585c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5586c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (strlen(maximal) > 0) {
5587c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
558850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            /* const int32_t length = */
5589c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                uloc_minimizeSubtags(
5590c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    maximal,
5591c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    buffer,
5592c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    sizeof(buffer),
5593c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    &status);
5594c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5595c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            if (U_FAILURE(status)) {
55966d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                log_err_status(status, "  unexpected failure of uloc_minimizeSubtags(), maximal \"%s\" status %s\n", maximal, u_errorName(status));
5597c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                status = U_ZERO_ERROR;
5598c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
5599c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            else if (uprv_strlen(minimal) == 0) {
5600c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                if (uprv_stricmp(maximal, buffer) != 0) {
5601c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    log_err("  unexpected minimal value \"%s\" in uloc_minimizeSubtags(), maximal \"%s\" = \"%s\"\n", minimal, maximal, buffer);
5602c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                }
5603c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
5604c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            else if (uprv_stricmp(minimal, buffer) != 0) {
5605c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                log_err("  minimal doesn't match expected %s in uloc_MinimizeSubtags(), maximal \"%s\" = %s\n", minimal, maximal, buffer);
5606c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
5607c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5608c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
5609c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5610c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    for (i = 0; i < sizeof(maximizeErrors) / sizeof(maximizeErrors[0]); ++i) {
5611c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5612c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
5613c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const char* const minimal = maximizeErrors[i].tag;
5614c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const char* const maximal = maximizeErrors[i].expected;
5615c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const UErrorCode expectedStatus = maximizeErrors[i].uerror;
5616c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const int32_t expectedLength = getExpectedReturnValue(&maximizeErrors[i]);
5617c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const int32_t bufferSize = getBufferSize(&maximizeErrors[i], sizeof(buffer));
5618c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5619c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const int32_t length =
5620c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            uloc_addLikelySubtags(
5621c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                minimal,
5622c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                buffer,
5623c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                bufferSize,
5624c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                &status);
5625c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5626c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (status == U_ZERO_ERROR) {
5627c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_err("  unexpected U_ZERO_ERROR for uloc_addLikelySubtags(), minimal \"%s\" expected status %s\n", minimal, u_errorName(expectedStatus));
5628c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            status = U_ZERO_ERROR;
5629c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5630c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        else if (status != expectedStatus) {
56316d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err_status(status, "  unexpected status for uloc_addLikelySubtags(), minimal \"%s\" expected status %s, but got %s\n", minimal, u_errorName(expectedStatus), u_errorName(status));
5632c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5633c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        else if (length != expectedLength) {
5634c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_err("  unexpected length for uloc_addLikelySubtags(), minimal \"%s\" expected length %d, but got %d\n", minimal, expectedLength, length);
5635c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5636c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        else if (status == U_BUFFER_OVERFLOW_ERROR || status == U_STRING_NOT_TERMINATED_WARNING) {
5637c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            if (uprv_strnicmp(maximal, buffer, bufferSize) != 0) {
5638c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                log_err("  maximal doesn't match expected %s in uloc_addLikelySubtags(), minimal \"%s\" = %*s\n",
5639c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    maximal, minimal, (int)sizeof(buffer), buffer);
5640c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
5641c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5642c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
5643c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5644c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    for (i = 0; i < sizeof(minimizeErrors) / sizeof(minimizeErrors[0]); ++i) {
5645c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5646c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
5647c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const char* const maximal = minimizeErrors[i].tag;
5648c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const char* const minimal = minimizeErrors[i].expected;
5649c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const UErrorCode expectedStatus = minimizeErrors[i].uerror;
5650c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const int32_t expectedLength = getExpectedReturnValue(&minimizeErrors[i]);
5651c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const int32_t bufferSize = getBufferSize(&minimizeErrors[i], sizeof(buffer));
5652c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5653c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const int32_t length =
5654c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            uloc_minimizeSubtags(
5655c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                maximal,
5656c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                buffer,
5657c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                bufferSize,
5658c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                &status);
5659c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
5660c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (status == U_ZERO_ERROR) {
5661c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_err("  unexpected U_ZERO_ERROR for uloc_minimizeSubtags(), maximal \"%s\" expected status %s\n", maximal, u_errorName(expectedStatus));
5662c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            status = U_ZERO_ERROR;
5663c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5664c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        else if (status != expectedStatus) {
56656d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err_status(status, "  unexpected status for uloc_minimizeSubtags(), maximal \"%s\" expected status %s, but got %s\n", maximal, u_errorName(expectedStatus), u_errorName(status));
5666c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5667c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        else if (length != expectedLength) {
5668c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_err("  unexpected length for uloc_minimizeSubtags(), maximal \"%s\" expected length %d, but got %d\n", maximal, expectedLength, length);
5669c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5670c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        else if (status == U_BUFFER_OVERFLOW_ERROR || status == U_STRING_NOT_TERMINATED_WARNING) {
5671c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            if (uprv_strnicmp(minimal, buffer, bufferSize) != 0) {
5672c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                log_err("  minimal doesn't match expected \"%s\" in uloc_minimizeSubtags(), minimal \"%s\" = \"%*s\"\n",
5673c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    minimal, maximal, (int)sizeof(buffer), buffer);
5674c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
5675c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5676c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
5677c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
5678b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
5679b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruconst char* const locale_to_langtag[][3] = {
5680b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"",            "und",          "und"},
5681b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"en",          "en",           "en"},
568250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {"en_US",       "en-US",        "en-US"},
568350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {"iw_IL",       "he-IL",        "he-IL"},
568450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {"sr_Latn_SR",  "sr-Latn-SR",   "sr-Latn-SR"},
568527f654740f2a26ad62a5c155af9199af9e69b889claireho    {"en__POSIX",   "en-u-va-posix", "en-u-va-posix"},
568627f654740f2a26ad62a5c155af9199af9e69b889claireho    {"en_POSIX",    "en-u-va-posix", "en-u-va-posix"},
5687b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {"en_US_POSIX_VAR", "en-US-posix-x-lvariant-var", NULL},  /* variant POSIX_VAR is processed as regular variant */
5688b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {"en_US_VAR_POSIX", "en-US-x-lvariant-var-posix", NULL},  /* variant VAR_POSIX is processed as regular variant */
5689b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {"en_US_POSIX@va=posix2",   "en-US-u-va-posix2",  "en-US-u-va-posix2"},           /* if keyword va=xxx already exists, variant POSIX is simply dropped */
569027f654740f2a26ad62a5c155af9199af9e69b889claireho    {"en_US_POSIX@ca=japanese",  "en-US-u-ca-japanese-va-posix", "en-US-u-ca-japanese-va-posix"},
5691b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"und_555",     "und-555",      "und-555"},
5692b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"123",         "und",          NULL},
5693b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"%$#&",        "und",          NULL},
569450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {"_Latn",       "und-Latn",     "und-Latn"},
569550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {"_DE",         "und-DE",       "und-DE"},
569650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {"und_FR",      "und-FR",       "und-FR"},
5697b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {"th_TH_TH",    "th-TH-x-lvariant-th", NULL},
5698b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"bogus",       "bogus",        "bogus"},
5699b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"foooobarrr",  "und",          NULL},
570050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {"az_AZ_CYRL",  "az-Cyrl-AZ",   "az-Cyrl-AZ"},
5701b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {"aa_BB_CYRL",  "aa-BB-x-lvariant-cyrl", NULL},
570250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {"en_US_1234",  "en-US-1234",   "en-US-1234"},
570350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {"en_US_VARIANTA_VARIANTB", "en-US-varianta-variantb",  "en-US-varianta-variantb"},
5704b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {"ja__9876_5432",   "ja-9876-5432", "ja-9876-5432"},
5705b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {"zh_Hant__VAR",    "zh-Hant-x-lvariant-var", NULL},
5706b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"es__BADVARIANT_GOODVAR",  "es-goodvar",   NULL},
5707b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"en@calendar=gregorian",   "en-u-ca-gregory",  "en-u-ca-gregory"},
5708b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"de@collation=phonebook;calendar=gregorian",   "de-u-ca-gregory-co-phonebk",   "de-u-ca-gregory-co-phonebk"},
5709b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"th@numbers=thai;z=extz;x=priv-use;a=exta",   "th-a-exta-u-nu-thai-z-extz-x-priv-use", "th-a-exta-u-nu-thai-z-extz-x-priv-use"},
5710b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"en@timezone=America/New_York;calendar=japanese",    "en-u-ca-japanese-tz-usnyc",    "en-u-ca-japanese-tz-usnyc"},
571150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {"en@timezone=US/Eastern",  "en-u-tz-usnyc",    "en-u-tz-usnyc"},
5712b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"en@x=x-y-z;a=a-b-c",  "en-x-x-y-z",   NULL},
5713f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    {"it@collation=badcollationtype;colStrength=identical;cu=usd-eur", "it-u-cu-usd-eur-ks-identic",  NULL},
571427f654740f2a26ad62a5c155af9199af9e69b889claireho    {"en_US_POSIX", "en-US-u-va-posix", "en-US-u-va-posix"},
5715f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    {"en_US_POSIX@calendar=japanese;currency=EUR","en-US-u-ca-japanese-cu-eur-va-posix", "en-US-u-ca-japanese-cu-eur-va-posix"},
5716b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {"@x=elmer",    "x-elmer",      "x-elmer"},
5717b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {"en@x=elmer",  "en-x-elmer",   "en-x-elmer"},
5718b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {"@x=elmer;a=exta", "und-a-exta-x-elmer",   "und-a-exta-x-elmer"},
5719b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {"en_US@attribute=attr1-attr2;calendar=gregorian", "en-US-u-attr1-attr2-ca-gregory", "en-US-u-attr1-attr2-ca-gregory"},
5720b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {NULL,          NULL,           NULL}
5721b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru};
5722b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
5723b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestToLanguageTag(void) {
5724b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    char langtag[256];
5725b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t i;
5726b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode status;
5727b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t len;
5728b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char *inloc;
5729b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char *expected;
5730b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
5731b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (i = 0; locale_to_langtag[i][0] != NULL; i++) {
5732b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        inloc = locale_to_langtag[i][0];
5733b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
5734b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /* testing non-strict mode */
5735b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        status = U_ZERO_ERROR;
5736b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        langtag[0] = 0;
5737b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        expected = locale_to_langtag[i][1];
5738b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
5739b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        len = uloc_toLanguageTag(inloc, langtag, sizeof(langtag), FALSE, &status);
574059d709d503bab6e2b61931737e662dd293b40578ccornelius        (void)len;    /* Suppress set but not used warning. */
5741b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (U_FAILURE(status)) {
5742b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (expected != NULL) {
5743b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_err("Error returned by uloc_toLanguageTag for locale id [%s] - error: %s\n",
5744b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    inloc, u_errorName(status));
5745b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
5746b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        } else {
5747b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (expected == NULL) {
5748b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_err("Error should be returned by uloc_toLanguageTag for locale id [%s], but [%s] is returned without errors\n",
5749b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    inloc, langtag);
5750b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            } else if (uprv_strcmp(langtag, expected) != 0) {
57516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                log_data_err("uloc_toLanguageTag returned language tag [%s] for input locale [%s] - expected: [%s]. Are you missing data?\n",
5752b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    langtag, inloc, expected);
5753b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
5754b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
5755b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
5756b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /* testing strict mode */
5757b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        status = U_ZERO_ERROR;
5758b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        langtag[0] = 0;
5759b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        expected = locale_to_langtag[i][2];
5760b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
5761b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        len = uloc_toLanguageTag(inloc, langtag, sizeof(langtag), TRUE, &status);
5762b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (U_FAILURE(status)) {
5763b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (expected != NULL) {
57646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                log_data_err("Error returned by uloc_toLanguageTag {strict} for locale id [%s] - error: %s Are you missing data?\n",
5765b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    inloc, u_errorName(status));
5766b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
5767b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        } else {
5768b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (expected == NULL) {
5769b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_err("Error should be returned by uloc_toLanguageTag {strict} for locale id [%s], but [%s] is returned without errors\n",
5770b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    inloc, langtag);
5771b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            } else if (uprv_strcmp(langtag, expected) != 0) {
5772b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_err("uloc_toLanguageTag {strict} returned language tag [%s] for input locale [%s] - expected: [%s]\n",
5773b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    langtag, inloc, expected);
5774b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
5775b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
5776b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
5777b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
5778b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
577954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#define FULL_LENGTH -1
5780b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const struct {
5781b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char  *bcpID;
5782b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char  *locID;
5783b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t     len;
5784b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} langtag_to_locale[] = {
5785f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    {"ja-u-ijkl-efgh-abcd-ca-japanese-xx-yyy-zzz-kn",   "ja@attribute=abcd-efgh-ijkl;calendar=japanese;colnumeric=yes;xx=yyy-zzz",  FULL_LENGTH},
578654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"en",                  "en",                   FULL_LENGTH},
578754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"en-us",               "en_US",                FULL_LENGTH},
578854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"und-US",              "_US",                  FULL_LENGTH},
578954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"und-latn",            "_Latn",                FULL_LENGTH},
579054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"en-US-posix",         "en_US_POSIX",          FULL_LENGTH},
5791b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"de-de_euro",          "de",                   2},
579254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"kok-IN",              "kok_IN",               FULL_LENGTH},
5793b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"123",                 "",                     0},
5794b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"en_us",               "",                     0},
5795b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"en-latn-x",           "en_Latn",              7},
579654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"art-lojban",          "jbo",                  FULL_LENGTH},
579754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"zh-hakka",            "hak",                  FULL_LENGTH},
579854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"zh-cmn-CH",           "cmn_CH",               FULL_LENGTH},
579954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"xxx-yy",              "xxx_YY",               FULL_LENGTH},
580054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"fr-234",              "fr_234",               FULL_LENGTH},
580154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"i-default",           "en@x=i-default",       FULL_LENGTH},
5802b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"i-test",              "",                     0},
5803b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"ja-jp-jp",            "ja_JP",                5},
580454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"bogus",               "bogus",                FULL_LENGTH},
5805b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"boguslang",           "",                     0},
580654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"EN-lATN-us",          "en_Latn_US",           FULL_LENGTH},
580754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"und-variant-1234",    "__VARIANT_1234",       FULL_LENGTH},
5808b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {"und-varzero-var1-vartwo", "__VARZERO",        11},
580954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"en-u-ca-gregory",     "en@calendar=gregorian",    FULL_LENGTH},
581054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"en-U-cu-USD",         "en@currency=usd",      FULL_LENGTH},
581154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"en-US-u-va-posix",    "en_US_POSIX",          FULL_LENGTH},
581254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"en-us-u-ca-gregory-va-posix", "en_US_POSIX@calendar=gregorian",   FULL_LENGTH},
581354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"en-us-posix-u-va-posix",   "en_US_POSIX@va=posix",    FULL_LENGTH},
581454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"en-us-u-va-posix2",        "en_US@va=posix2",         FULL_LENGTH},
581554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"en-us-vari1-u-va-posix",   "en_US_VARI1@va=posix",    FULL_LENGTH},
581654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"ar-x-1-2-3",          "ar@x=1-2-3",           FULL_LENGTH},
581754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"fr-u-nu-latn-cu-eur", "fr@currency=eur;numbers=latn", FULL_LENGTH},
581854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"de-k-kext-u-co-phonebk-nu-latn",  "de@collation=phonebook;k=kext;numbers=latn",   FULL_LENGTH},
581954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"ja-u-cu-jpy-ca-jp",   "ja@calendar=yes;currency=jpy;jp=yes",  FULL_LENGTH},
582054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"en-us-u-tz-usnyc",    "en_US@timezone=America/New_York",  FULL_LENGTH},
582154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"und-a-abc-def",       "und@a=abc-def",        FULL_LENGTH},
582254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"zh-u-ca-chinese-x-u-ca-chinese",  "zh@calendar=chinese;x=u-ca-chinese",   FULL_LENGTH},
582354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"x-elmer",             "@x=elmer",             FULL_LENGTH},
582454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"en-US-u-attr1-attr2-ca-gregory", "en_US@attribute=attr1-attr2;calendar=gregorian",    FULL_LENGTH},
582554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"sr-u-kn",             "sr@colnumeric=yes",    FULL_LENGTH},
582654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"de-u-kn-co-phonebk",  "de@collation=phonebook;colnumeric=yes",    FULL_LENGTH},
582754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"en-u-attr2-attr1-kn-kb",  "en@attribute=attr1-attr2;colbackwards=yes;colnumeric=yes", FULL_LENGTH},
582854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    {"ja-u-ijkl-efgh-abcd-ca-japanese-xx-yyy-zzz-kn",   "ja@attribute=abcd-efgh-ijkl;calendar=japanese;colnumeric=yes;xx=yyy-zzz",  FULL_LENGTH},
582954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
5830b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {"de-u-xc-xphonebk-co-phonebk-ca-buddhist-mo-very-lo-extensi-xd-that-de-should-vc-probably-xz-killthebuffer",
583154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     "de@calendar=buddhist;collation=phonebook;de=should;lo=extensi;mo=very;vc=probably;xc=xphonebk;xd=that;xz=yes", 91},
5832b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {NULL,          NULL,           0}
5833b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru};
5834b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
5835b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestForLanguageTag(void) {
5836b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    char locale[256];
5837b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t i;
5838b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode status;
5839b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t parsedLen;
584054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    int32_t expParsedLen;
5841b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
5842b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (i = 0; langtag_to_locale[i].bcpID != NULL; i++) {
5843b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        status = U_ZERO_ERROR;
584454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        locale[0] = 0;
584554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        expParsedLen = langtag_to_locale[i].len;
584654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        if (expParsedLen == FULL_LENGTH) {
584754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            expParsedLen = uprv_strlen(langtag_to_locale[i].bcpID);
584854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
5849b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        uloc_forLanguageTag(langtag_to_locale[i].bcpID, locale, sizeof(locale), &parsedLen, &status);
5850b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (U_FAILURE(status)) {
58516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err_status(status, "Error returned by uloc_forLanguageTag for language tag [%s] - error: %s\n",
5852b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                langtag_to_locale[i].bcpID, u_errorName(status));
5853b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        } else {
5854b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (uprv_strcmp(langtag_to_locale[i].locID, locale) != 0) {
5855f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                log_data_err("uloc_forLanguageTag returned locale [%s] for input language tag [%s] - expected: [%s]\n",
5856b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    locale, langtag_to_locale[i].bcpID, langtag_to_locale[i].locID);
5857b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
585854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            if (parsedLen != expParsedLen) {
5859b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_err("uloc_forLanguageTag parsed length of %d for input language tag [%s] - expected parsed length: %d\n",
586054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                    parsedLen, langtag_to_locale[i].bcpID, expParsedLen);
5861b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
5862b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
5863b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
5864b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
586527f654740f2a26ad62a5c155af9199af9e69b889claireho
5866f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusstatic void TestToUnicodeLocaleKey(void)
5867f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius{
5868f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    /* $IN specifies the result should be the input pointer itself */
5869f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    static const char* DATA[][2] = {
5870f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"calendar",    "ca"},
5871f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"CALEndar",    "ca"},  /* difference casing */
5872f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"ca",          "ca"},  /* bcp key itself */
5873f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"kv",          "kv"},  /* no difference between legacy and bcp */
5874f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"foo",         NULL},  /* unknown, bcp ill-formed */
5875f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"ZZ",          "$IN"}, /* unknown, bcp well-formed -  */
5876f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {NULL,          NULL}
5877f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    };
5878f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
5879f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    int32_t i;
5880f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    for (i = 0; DATA[i][0] != NULL; i++) {
5881f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        const char* keyword = DATA[i][0];
5882f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        const char* expected = DATA[i][1];
5883f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        const char* bcpKey = NULL;
5884f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
5885f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        bcpKey = uloc_toUnicodeLocaleKey(keyword);
5886f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        if (expected == NULL) {
5887f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            if (bcpKey != NULL) {
5888f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                log_err("toUnicodeLocaleKey: keyword=%s => %s, expected=NULL\n", keyword, bcpKey);
5889f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            }
5890f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        } else if (bcpKey == NULL) {
5891f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            log_data_err("toUnicodeLocaleKey: keyword=%s => NULL, expected=%s\n", keyword, expected);
5892f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        } else if (uprv_strcmp(expected, "$IN") == 0) {
5893f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            if (bcpKey != keyword) {
5894f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                log_err("toUnicodeLocaleKey: keyword=%s => %s, expected=%s(input pointer)\n", keyword, bcpKey, keyword);
5895f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            }
5896f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        } else if (uprv_strcmp(bcpKey, expected) != 0) {
5897f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            log_err("toUnicodeLocaleKey: keyword=%s => %s, expected=%s\n", keyword, bcpKey, expected);
5898f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        }
5899f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    }
5900f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius}
5901f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
5902f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusstatic void TestToLegacyKey(void)
5903f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius{
5904f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    /* $IN specifies the result should be the input pointer itself */
5905f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    static const char* DATA[][2] = {
5906f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"kb",          "colbackwards"},
5907f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"kB",          "colbackwards"},    /* different casing */
5908f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"Collation",   "collation"},   /* keyword itself with different casing */
5909f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"kv",          "kv"},  /* no difference between legacy and bcp */
5910f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"foo",         "$IN"}, /* unknown, bcp ill-formed */
5911f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"ZZ",          "$IN"}, /* unknown, bcp well-formed */
5912f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"e=mc2",       NULL},  /* unknown, bcp/legacy ill-formed */
5913f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {NULL,          NULL}
5914f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    };
5915f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
5916f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    int32_t i;
5917f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    for (i = 0; DATA[i][0] != NULL; i++) {
5918f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        const char* keyword = DATA[i][0];
5919f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        const char* expected = DATA[i][1];
5920f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        const char* legacyKey = NULL;
5921f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
5922f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        legacyKey = uloc_toLegacyKey(keyword);
5923f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        if (expected == NULL) {
5924f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            if (legacyKey != NULL) {
5925f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                log_err("toLegacyKey: keyword=%s => %s, expected=NULL\n", keyword, legacyKey);
5926f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            }
5927f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        } else if (legacyKey == NULL) {
5928f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            log_err("toLegacyKey: keyword=%s => NULL, expected=%s\n", keyword, expected);
5929f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        } else if (uprv_strcmp(expected, "$IN") == 0) {
5930f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            if (legacyKey != keyword) {
5931f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                log_err("toLegacyKey: keyword=%s => %s, expected=%s(input pointer)\n", keyword, legacyKey, keyword);
5932f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            }
5933f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        } else if (uprv_strcmp(legacyKey, expected) != 0) {
5934f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            log_data_err("toUnicodeLocaleKey: keyword=%s, %s, expected=%s\n", keyword, legacyKey, expected);
5935f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        }
5936f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    }
5937f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius}
5938f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
5939f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusstatic void TestToUnicodeLocaleType(void)
5940f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius{
5941f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    /* $IN specifies the result should be the input pointer itself */
5942f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    static const char* DATA[][3] = {
5943f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"tz",              "Asia/Kolkata",     "inccu"},
5944f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"calendar",        "gregorian",        "gregory"},
5945f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"ca",              "gregorian",        "gregory"},
5946f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"ca",              "Gregorian",        "gregory"},
5947f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"ca",              "buddhist",         "buddhist"},
5948f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"Calendar",        "Japanese",         "japanese"},
5949f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"calendar",        "Islamic-Civil",    "islamic-civil"},
5950f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"calendar",        "islamicc",         "islamic-civil"},   /* bcp type alias */
5951f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"colalternate",    "NON-IGNORABLE",    "noignore"},
5952f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"colcaselevel",    "yes",              "true"},
5953f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"tz",              "america/new_york", "usnyc"},
5954f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"tz",              "Asia/Kolkata",     "inccu"},
5955f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"timezone",        "navajo",           "usden"},
5956f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"ca",              "aaaa",             "$IN"},     /* unknown type, well-formed type */
5957f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"ca",              "gregory-japanese-islamic", "$IN"}, /* unknown type, well-formed type */
5958f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"zz",              "gregorian",        NULL},      /* unknown key, ill-formed type */
5959f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"co",              "foo-",             NULL},      /* unknown type, ill-formed type */
5960f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"variableTop",     "00A0",             "$IN"},     /* valid codepoints type */
5961f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"variableTop",     "wxyz",             "$IN"},     /* invalid codepoints type - return as is for now */
5962f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"kr",              "space-punct",      "space-punct"}, /* valid reordercode type */
5963f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"kr",              "digit-spacepunct", NULL},      /* invalid (bcp ill-formed) reordercode type */
5964f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {NULL,              NULL,               NULL}
5965f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    };
5966f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
5967f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    int32_t i;
5968f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    for (i = 0; DATA[i][0] != NULL; i++) {
5969f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        const char* keyword = DATA[i][0];
5970f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        const char* value = DATA[i][1];
5971f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        const char* expected = DATA[i][2];
5972f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        const char* bcpType = NULL;
5973f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
5974f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        bcpType = uloc_toUnicodeLocaleType(keyword, value);
5975f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        if (expected == NULL) {
5976f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            if (bcpType != NULL) {
5977f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                log_err("toUnicodeLocaleType: keyword=%s, value=%s => %s, expected=NULL\n", keyword, value, bcpType);
5978f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            }
5979f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        } else if (bcpType == NULL) {
5980f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            log_data_err("toUnicodeLocaleType: keyword=%s, value=%s => NULL, expected=%s\n", keyword, value, expected);
5981f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        } else if (uprv_strcmp(expected, "$IN") == 0) {
5982f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            if (bcpType != value) {
5983f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                log_err("toUnicodeLocaleType: keyword=%s, value=%s => %s, expected=%s(input pointer)\n", keyword, value, bcpType, value);
5984f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            }
5985f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        } else if (uprv_strcmp(bcpType, expected) != 0) {
5986f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            log_data_err("toUnicodeLocaleType: keyword=%s, value=%s => %s, expected=%s\n", keyword, value, bcpType, expected);
5987f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        }
5988f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    }
5989f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius}
5990f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
5991f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusstatic void TestToLegacyType(void)
5992f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius{
5993f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    /* $IN specifies the result should be the input pointer itself */
5994f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    static const char* DATA[][3] = {
5995f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"calendar",        "gregory",          "gregorian"},
5996f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"ca",              "gregory",          "gregorian"},
5997f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"ca",              "Gregory",          "gregorian"},
5998f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"ca",              "buddhist",         "buddhist"},
5999f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"Calendar",        "Japanese",         "japanese"},
6000f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"calendar",        "Islamic-Civil",    "islamic-civil"},
6001f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"calendar",        "islamicc",         "islamic-civil"},   /* bcp type alias */
6002f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"colalternate",    "noignore",         "non-ignorable"},
6003f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"colcaselevel",    "true",             "yes"},
6004f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"tz",              "usnyc",            "America/New_York"},
6005f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"tz",              "inccu",            "Asia/Calcutta"},
6006f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"timezone",        "usden",            "America/Denver"},
6007f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"timezone",        "usnavajo",         "America/Denver"},  /* bcp type alias */
6008f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"colstrength",     "quarternary",      "quaternary"},  /* type alias */
6009f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"ca",              "aaaa",             "$IN"}, /* unknown type */
6010f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"calendar",        "gregory-japanese-islamic", "$IN"}, /* unknown type, well-formed type */
6011f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"zz",              "gregorian",        "$IN"}, /* unknown key, bcp ill-formed type */
6012f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"ca",              "gregorian-calendar",   "$IN"}, /* known key, bcp ill-formed type */
6013f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"co",              "e=mc2",            NULL},  /* known key, ill-formed bcp/legacy type */
6014f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"variableTop",     "00A0",             "$IN"},     /* valid codepoints type */
6015f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"variableTop",     "wxyz",             "$IN"},    /* invalid codepoints type - return as is for now */
6016f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"kr",              "space-punct",      "space-punct"}, /* valid reordercode type */
6017f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {"kr",              "digit-spacepunct", "digit-spacepunct"},    /* invalid reordercode type, but ok for legacy syntax */
6018f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        {NULL,              NULL,               NULL}
6019f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    };
6020f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
6021f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    int32_t i;
6022f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    for (i = 0; DATA[i][0] != NULL; i++) {
6023f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        const char* keyword = DATA[i][0];
6024f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        const char* value = DATA[i][1];
6025f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        const char* expected = DATA[i][2];
6026f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        const char* legacyType = NULL;
6027f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
6028f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        legacyType = uloc_toLegacyType(keyword, value);
6029f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        if (expected == NULL) {
6030f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            if (legacyType != NULL) {
6031f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                log_err("toLegacyType: keyword=%s, value=%s => %s, expected=NULL\n", keyword, value, legacyType);
6032f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            }
6033f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        } else if (legacyType == NULL) {
6034f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            log_err("toLegacyType: keyword=%s, value=%s => NULL, expected=%s\n", keyword, value, expected);
6035f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        } else if (uprv_strcmp(expected, "$IN") == 0) {
6036f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            if (legacyType != value) {
6037f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                log_err("toLegacyType: keyword=%s, value=%s => %s, expected=%s(input pointer)\n", keyword, value, legacyType, value);
6038f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            }
6039f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        } else if (uprv_strcmp(legacyType, expected) != 0) {
6040f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            log_data_err("toLegacyType: keyword=%s, value=%s => %s, expected=%s\n", keyword, value, legacyType, expected);
6041f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        }
6042f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    }
6043f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius}
6044f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
6045f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
6046f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
604727f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void test_unicode_define(const char *namech, char ch, const char *nameu, UChar uch)
604827f654740f2a26ad62a5c155af9199af9e69b889claireho{
604927f654740f2a26ad62a5c155af9199af9e69b889claireho  UChar asUch[1];
605027f654740f2a26ad62a5c155af9199af9e69b889claireho  asUch[0]=0;
605127f654740f2a26ad62a5c155af9199af9e69b889claireho  log_verbose("Testing whether %s[\\x%02x,'%c'] == %s[U+%04X]\n", namech, ch,(int)ch, nameu, (int) uch);
605227f654740f2a26ad62a5c155af9199af9e69b889claireho  u_charsToUChars(&ch, asUch, 1);
605327f654740f2a26ad62a5c155af9199af9e69b889claireho  if(asUch[0] != uch) {
605427f654740f2a26ad62a5c155af9199af9e69b889claireho    log_err("FAIL:  %s[\\x%02x,'%c'] maps to U+%04X, but %s = U+%04X\n", namech, ch, (int)ch, (int)asUch[0], nameu, (int)uch);
605527f654740f2a26ad62a5c155af9199af9e69b889claireho  } else {
605627f654740f2a26ad62a5c155af9199af9e69b889claireho    log_verbose(" .. OK, == U+%04X\n", (int)asUch[0]);
605727f654740f2a26ad62a5c155af9199af9e69b889claireho  }
605827f654740f2a26ad62a5c155af9199af9e69b889claireho}
605927f654740f2a26ad62a5c155af9199af9e69b889claireho
606027f654740f2a26ad62a5c155af9199af9e69b889claireho#define TEST_UNICODE_DEFINE(x,y) test_unicode_define(#x, (char)(x), #y, (UChar)(y))
606127f654740f2a26ad62a5c155af9199af9e69b889claireho
606227f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestUnicodeDefines(void) {
606327f654740f2a26ad62a5c155af9199af9e69b889claireho  TEST_UNICODE_DEFINE(ULOC_KEYWORD_SEPARATOR, ULOC_KEYWORD_SEPARATOR_UNICODE);
606427f654740f2a26ad62a5c155af9199af9e69b889claireho  TEST_UNICODE_DEFINE(ULOC_KEYWORD_ASSIGN, ULOC_KEYWORD_ASSIGN_UNICODE);
606527f654740f2a26ad62a5c155af9199af9e69b889claireho  TEST_UNICODE_DEFINE(ULOC_KEYWORD_ITEM_SEPARATOR, ULOC_KEYWORD_ITEM_SEPARATOR_UNICODE);
606627f654740f2a26ad62a5c155af9199af9e69b889claireho}
6067f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
6068f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusstatic void TestIsRightToLeft() {
6069f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    // API test only. More test cases in intltest/LocaleTest.
6070f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if(uloc_isRightToLeft("root") || !uloc_isRightToLeft("EN-HEBR")) {
6071f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        log_err("uloc_isRightToLeft() failed");
6072f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    }
6073f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius}
6074