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