164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// Copyright (C) 2016 and later: Unicode, Inc. and others.
264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
48de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * COPYRIGHT:
58de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * Copyright (c) 2008-2016, International Business Machines Corporation and
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h>
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h>
158de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "dtptngts.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/calendar.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/smpdtfmt.h"
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/dtfmtsym.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/dtptngen.h"
218de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "cmemory.h"
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "loctest.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This is an API test, not a unit test.  It doesn't test very many cases, and doesn't
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// try to test the full functionality.  It just calls each function in the class and
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// verifies that it works on a basic level.
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestDateTimePatternGeneratorAPI::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (exec) logln("TestSuite DateTimePatternGeneratorAPI");
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (index) {
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(0, testAPI);
3450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TESTCASE(1, testOptions);
3559d709d503bab6e2b61931737e662dd293b40578ccornelius        TESTCASE(2, testAllFieldPatterns);
368de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        TESTCASE(3, testStaticGetSkeleton);
378de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        TESTCASE(4, testC);
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default: name = ""; break;
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
428de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#define MAX_LOCALE   11
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test various generic API methods of DateTimePatternGenerator for API coverage.
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/)
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString patternData[] = {
5027f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("yM"),        // 00
5127f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("yMMM"),      // 01
5227f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("yMd"),       // 02
5327f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("yMMMd"),     // 03
5427f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("Md"),        // 04
5527f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("MMMd"),      // 05
56103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("MMMMd"),     // 06
57103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("yQQQ"),      // 07
58103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("hhmm"),      // 08
59103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("HHmm"),      // 09
60103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("jjmm"),      // 10
61103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("mmss"),      // 11
62103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("yyyyMMMM"),  // 12
63103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("MMMEd"),     // 13
64103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("Ed"),        // 14
65103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("jmmssSSS"),  // 15
6659d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("JJmm"),      // 16
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString(),
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     };
698de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
70b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char* testLocale[MAX_LOCALE][4] = {
7127f654740f2a26ad62a5c155af9199af9e69b889claireho        {"en", "US", "", ""},                   // 0
7227f654740f2a26ad62a5c155af9199af9e69b889claireho        {"en", "US", "", "calendar=japanese"},  // 1
7327f654740f2a26ad62a5c155af9199af9e69b889claireho        {"de", "DE", "", ""},                   // 2
7427f654740f2a26ad62a5c155af9199af9e69b889claireho        {"fi", "", "", ""},                     // 3
75103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        {"es", "", "", ""},                     // 4
76103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        {"ja", "", "", ""},                     // 5
77103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        {"ja", "", "", "calendar=japanese"},    // 6
78103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        {"zh", "Hans", "CN", ""},               // 7
79103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        {"zh", "TW", "", "calendar=roc"},       // 8
80103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        {"ru", "", "", ""},                     // 9
81103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        {"zh", "", "", "calendar=chinese"},    // 10
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     };
838de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
8427f654740f2a26ad62a5c155af9199af9e69b889claireho    // For Weds, Jan 13, 1999, 23:58:59
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString patternResults[] = {
8627f654740f2a26ad62a5c155af9199af9e69b889claireho        // en_US                                              // 0 en_US
8727f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1/1999"),                              // 00: yM
8827f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("Jan 1999"),                            // 01: yMMM
8927f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1/13/1999"),                           // 02: yMd
9027f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("Jan 13, 1999"),                        // 03: yMMMd
9127f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1/13"),                                // 04: Md
9227f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("Jan 13"),                              // 05: MMMd
93103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("January 13"),                          // 06: MMMMd
94103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("Q1 1999"),                             // 07: yQQQ
95103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("11:58 PM"),                            // 08: hhmm
96103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                               // 09: HHmm
97103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("11:58 PM"),                            // 10: jjmm
98103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58:59"),                               // 11: mmss
99103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("January 1999"),                        // 12: yyyyMMMM
100103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("Wed, Jan 13"),                         // 13: MMMEd -> EEE, MMM d
101103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("13 Wed"),                              // 14: Ed    -> d EEE
102103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("11:58:59.123 PM"),                     // 15: jmmssSSS -> "h:mm:ss.SSS a"
10359d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("11:58"),                               // 16: JJmm
10427f654740f2a26ad62a5c155af9199af9e69b889claireho
10527f654740f2a26ad62a5c155af9199af9e69b889claireho        // en_US@calendar=japanese                            // 1 en_US@calendar=japanese
106b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UnicodeString("1/11 H"),                              //  0: yM
10727f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("Jan 11 Heisei"),                       //  1: yMMM
108b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UnicodeString("1/13/11 H"),                           //  2: yMd
109b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UnicodeString("Jan 13, 11 Heisei"),                   //  3: yMMMd
11027f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1/13"),                                //  4: Md
11127f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("Jan 13"),                              //  5: MMMd
112103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("January 13"),                          //  6: MMMMd
113103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("Q1 11 Heisei"),                        //  7: yQQQ
114103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("11:58 PM"),                            //  8: hhmm
115103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                               //  9: HHmm
116103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("11:58 PM"),                            // 10: jjmm
117103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58:59"),                               // 11: mmss
118103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("January 11 Heisei"),                   // 12: yyyyMMMM
119103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("Wed, Jan 13"),                         // 13: MMMEd -> EEE, MMM d"
120103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("13 Wed"),                              // 14: Ed    -> d EEE
121103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("11:58:59.123 PM"),                     // 15: jmmssSSS -> "h:mm:ss.SSS a"
12259d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("11:58"),                               // 16: JJmm
123b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
12427f654740f2a26ad62a5c155af9199af9e69b889claireho        // de_DE                                              // 2 de_DE
12527f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1.1999"),                              // 00: yM
12654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("Jan. 1999"),                           // 01: yMMM
12727f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("13.1.1999"),                           // 02: yMd
12854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("13. Jan. 1999"),                       // 03: yMMMd
12927f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("13.1."),                               // 04: Md
13054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("13. Jan."),                            // 05: MMMd
131103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("13. Januar"),                          // 06: MMMMd
132103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("Q1 1999"),                             // 07: yQQQ
133103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("11:58 nachm."),                        // 08: hhmm
134103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                               // 09: HHmm
135103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                               // 10: jjmm
136103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58:59"),                               // 11: mmss
137103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("Januar 1999"),                         // 12: yyyyMMMM
13854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("Mi., 13. Jan."),                       // 13: MMMEd -> EEE, d. MMM
139103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("Mi., 13."),                            // 14: Ed   -> EEE d.
140103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58:59,123"),                        // 15: jmmssSSS -> "HH:mm:ss,SSS"
14159d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("23:58"),                               // 16: JJmm
142b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
14327f654740f2a26ad62a5c155af9199af9e69b889claireho        // fi                                                 // 3 fi
14427f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1.1999"),                              // 00: yM (fixed expected result per ticket:6626:)
14527f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("tammi 1999"),                          // 01: yMMM
14627f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("13.1.1999"),                           // 02: yMd
14764339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        UnicodeString("13. tammik. 1999"),                    // 03: yMMMd
14827f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("13.1."),                               // 04: Md
14964339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        UnicodeString("13. tammik."),                         // 05: MMMd
150103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("13. tammikuuta"),                      // 06: MMMMd
151103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("1. nelj. 1999"),                       // 07: yQQQ
152103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("11.58 ip."),                           // 08: hhmm
153103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23.58"),                               // 09: HHmm
154103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23.58"),                               // 10: jjmm
155103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58.59"),                               // 11: mmss
156103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("tammikuu 1999"),                       // 12: yyyyMMMM
15764339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        UnicodeString("ke 13. tammik."),                      // 13: MMMEd -> EEE d. MMM
158103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("ke 13."),                              // 14: Ed    -> ccc d.
159103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23.58.59,123"),                        // 15: jmmssSSS -> "H.mm.ss,SSS"
16059d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("23.58"),                               // 16: JJmm
161103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
162103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        // es                                                 // 4 es
163103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("1/1999"),                              // 00: yM    -> "M/y"
1641b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        UnicodeString("ene. 1999"),                           // 01: yMMM  -> "MMM y"
165103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("13/1/1999"),                           // 02: yMd   -> "d/M/y"
1661b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        UnicodeString("13 ene. 1999"),                        // 03: yMMMd -> "d MMM y"
167103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("13/1"),                                // 04: Md    -> "d/M"
1681b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        UnicodeString("13 ene."),                             // 05: MMMd  -> "d 'de' MMM"
169103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("13 de enero"),                         // 06: MMMMd -> "d 'de' MMMM"
170103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("T1 1999"),                             // 07: yQQQ  -> "QQQ y"
17159d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("11:58 p. m."),                         // 08: hhmm  -> "hh:mm a"
172103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                               // 09: HHmm  -> "HH:mm"
173103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                               // 10: jjmm  -> "HH:mm"
174103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58:59"),                               // 11: mmss  -> "mm:ss"
175103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("enero de 1999"),                       // 12: yyyyMMMM -> "MMMM 'de' yyyy"
1761b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        CharsToUnicodeString("mi\\u00E9., 13 ene."),          // 13: MMMEd -> "E, d MMM"
17759d709d503bab6e2b61931737e662dd293b40578ccornelius        CharsToUnicodeString("mi\\u00E9. 13"),                // 14: Ed    -> "EEE d"
178103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58:59,123"),                        // 15: jmmssSSS -> "H:mm:ss,SSS"
17959d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("23:58"),                               // 16: JJmm
180103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
181103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        // ja                                                             // 5 ja
18227f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1999/1"),                                          // 00: yM    -> y/M
18327f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("1999\\u5E741\\u6708"),                      // 01: yMMM  -> y\u5E74M\u6708
18427f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1999/1/13"),                                       // 02: yMd   -> y/M/d
18527f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("1999\\u5E741\\u670813\\u65E5"),             // 03: yMMMd -> y\u5E74M\u6708d\u65E5
18627f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1/13"),                                            // 04: Md    -> M/d
18727f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("1\\u670813\\u65E5"),                        // 05: MMMd  -> M\u6708d\u65E5
188103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1\\u670813\\u65E5"),                        // 06: MMMMd  -> M\u6708d\u65E5
18959d709d503bab6e2b61931737e662dd293b40578ccornelius        CharsToUnicodeString("1999/Q1"),                                  // 07: yQQQ  -> y/QQQ
190103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u5348\\u5F8C11:58"),                      // 08: hhmm
191103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                                           // 09: HHmm  -> HH:mm
192103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                                           // 10: jjmm
193103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58:59"),                                           // 11: mmss  -> mm:ss
194103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1999\\u5E741\\u6708"),                      // 12: yyyyMMMM  -> y\u5E74M\u6708
195103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1\\u670813\\u65E5(\\u6C34)"),               // 13: MMMEd -> M\u6708d\u65E5(EEE)
196103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("13\\u65E5(\\u6C34)"),                       // 14: Ed    -> d\u65E5(EEE)
197103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58:59.123"),                                    // 15: jmmssSSS -> "H:mm:ss.SSS"
19859d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("23:58"),                                           // 16: JJmm
199103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
200103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        // ja@calendar=japanese                                           // 6 ja@calendar=japanese
20127f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("\\u5E73\\u621011/1"),                       // 00: yM    -> Gy/m
20227f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("\\u5E73\\u621011\\u5E741\\u6708"),          // 01: yMMM  -> Gy\u5E74M\u6708
20327f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("\\u5E73\\u621011/1/13"),                    // 02: yMd   -> Gy/m/d
20427f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("\\u5E73\\u621011\\u5E741\\u670813\\u65E5"), // 03: yMMMd -> Gy\u5E74M\u6708d\u65E5
20527f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1/13"),                                            // 04: Md    -> M/d
20627f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("1\\u670813\\u65E5"),                        // 05: MMMd  -> M\u6708d\u65E5
207103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1\\u670813\\u65E5"),                        // 06: MMMMd  -> M\u6708d\u65E5
208f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        CharsToUnicodeString("\\u5E73\\u621011/Q1"),                     // 07: yQQQ  -> Gy/QQQ
209103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u5348\\u5F8C11:58"),                      // 08: hhmm  ->
210103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                                           // 09: HHmm  -> HH:mm          (as for ja)
211103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                                           // 10: jjmm
212103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58:59"),                                           // 11: mmss  -> mm:ss          (as for ja)
213103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u5E73\\u621011\\u5E741\\u6708"),          // 12: yyyyMMMM  -> Gyyyy\u5E74M\u6708
214103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1\\u670813\\u65E5(\\u6C34)"),               // 13: MMMEd -> M\u6708d\u65E5(EEE)
215103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("13\\u65E5(\\u6C34)"),                       // 14: Ed    -> d\u65E5(EEE)
216103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58:59.123"),                                    // 15: jmmssSSS -> "H:mm:ss.SSS"
21759d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("23:58"),                                           // 16: JJmm
218103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
219103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        // zh_Hans_CN                                                     // 7 zh_Hans_CN
220f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        CharsToUnicodeString("1999\\u5E741\\u6708"),                      // 00: yM -> y\u5E74M\u6708
22127f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("1999\\u5E741\\u6708"),                      // 01: yMMM  -> yyyy\u5E74MMM (fixed expected result per ticket:6626:)
22254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        CharsToUnicodeString("1999/1/13"),                                // 02: yMd
22327f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("1999\\u5E741\\u670813\\u65E5"),             // 03: yMMMd -> yyyy\u5E74MMMd\u65E5 (fixed expected result per ticket:6626:)
22454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("1/13"),                                            // 04: Md
225103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1\\u670813\\u65E5"),                        // 05: MMMd  -> M\u6708d\u65E5 (fixed expected result per ticket:6626:)
226103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1\\u670813\\u65E5"),                        // 06: MMMMd  -> M\u6708d\u65E5
22754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        CharsToUnicodeString("1999\\u5E74\\u7B2C1\\u5B63\\u5EA6"),        // 07: yQQQ
228103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u4E0B\\u534811:58"),                      // 08: hhmm
229103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                                           // 09: HHmm
230103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u4E0B\\u534811:58"),                      // 10: jjmm
231103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58:59"),                                           // 11: mmss
232103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1999\\u5E741\\u6708"),                      // 12: yyyyMMMM  -> yyyy\u5E74MMM
233103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1\\u670813\\u65E5\\u5468\\u4E09"),          // 13: MMMEd -> MMMd\u65E5EEE
234103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("13\\u65E5\\u5468\\u4E09"),                  // 14: Ed    -> d\u65E5EEE
235103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u4E0B\\u534811:58:59.123"),               // 15: jmmssSSS -> "ah:mm:ss.SSS"
23659d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("11:58"),                                           // 16: JJmm
237103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2388de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        // zh_TW@calendar=roc                                             // 8 zh_TW@calendar=roc
23927f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("\\u6C11\\u570B88/1"),                       // 00: yM    -> Gy/M
24027f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("\\u6C11\\u570B88\\u5E741\\u6708"),          // 01: yMMM  -> Gy\u5E74M\u6708
24127f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("\\u6C11\\u570B88/1/13"),                    // 02: yMd   -> Gy/M/d
24227f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("\\u6C11\\u570B88\\u5E741\\u670813\\u65E5"), // 03: yMMMd -> Gy\u5E74M\u6708d\u65E5
24327f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1/13"),                                            // 04: Md    -> M/d
24427f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("1\\u670813\\u65E5"),                        // 05: MMMd  ->M\u6708d\u65E5
245103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1\\u670813\\u65E5"),                        // 06: MMMMd  ->M\u6708d\u65E5
2468393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        CharsToUnicodeString("\\u6C11\\u570B88\\u5E741\\u5B63"),          // 07: yQQQ  -> Gy QQQ
247103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u4E0B\\u534811:58"),                      // 08: hhmm  ->
248103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                                           // 09: HHmm  ->
249103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u4E0B\\u534811:58"),                      // 10: jjmm
250103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58:59"),                                           // 11: mmss  ->
251103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u6C11\\u570B88\\u5E741\\u6708"),          // 12: yyyyMMMM  -> Gy\u5E74M\u670
252103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1\\u670813\\u65E5\\u9031\\u4E09"),          // 13: MMMEd -> M\u6708d\u65E5EEE
25364339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        CharsToUnicodeString("13 \\u9031\\u4E09"),                        // 14: Ed    -> d E
254103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u4E0B\\u534811:58:59.123"),               // 15: jmmssSSS -> "ah:mm:ss.SSS"
25559d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("11:58"),                                           // 16: JJmm
256103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
257103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        // ru                                                             // 9 ru
258103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("01.1999"),                                         // 00: yM    -> MM.y
259c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        CharsToUnicodeString("\\u044F\\u043D\\u0432. 1999 \\u0433."),     // 01: yMMM  -> LLL y
2608393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        UnicodeString("13.01.1999"),                                      // 02: yMd   -> dd.MM.y
26154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        CharsToUnicodeString("13 \\u044F\\u043D\\u0432. 1999 \\u0433."),  // 03: yMMMd -> d MMM y
2628393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        UnicodeString("13.01"),                                           // 04: Md    -> dd.MM
263103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("13 \\u044F\\u043D\\u0432."),                // 05: MMMd  -> d MMM
264103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("13 \\u044F\\u043D\\u0432\\u0430\\u0440\\u044F"), // 06: MMMMd  -> d MMMM
26554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        CharsToUnicodeString("1-\\u0439 \\u043A\\u0432. 1999 \\u0433."),  // 07: yQQQ  -> y QQQ
266c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        CharsToUnicodeString("11:58 \\u041F\\u041F"),                     // 08: hhmm  -> hh:mm a
267103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                                           // 09: HHmm  -> HH:mm
268103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                                           // 10: jjmm  -> HH:mm
269103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58:59"),                                           // 11: mmss  -> mm:ss
270c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        CharsToUnicodeString("\\u044F\\u043D\\u0432\\u0430\\u0440\\u044C 1999 \\u0433."), // 12: yyyyMMMM -> LLLL y
271c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        CharsToUnicodeString("\\u0441\\u0440, 13 \\u044F\\u043D\\u0432."), // 13: MMMEd -> ccc, d MMM
272c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        CharsToUnicodeString("\\u0441\\u0440, 13"),                       // 14: Ed    -> EEE, d
273103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58:59,123"),                                    // 15: jmmssSSS -> "H:mm:ss,SSS"
27459d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("23:58"),                                           // 16: JJmm
275103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
276103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        // zh@calendar=chinese                                            // 10 zh@calendar=chinese
27764339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        CharsToUnicodeString("1998\\u620A\\u5BC5\\u5E74\\u5341\\u4E00\\u6708"), // 00: yMMM
27864339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        CharsToUnicodeString("1998\\u620A\\u5BC5\\u5E74\\u5341\\u4E00\\u6708"), // 01: yMMM
27964339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        CharsToUnicodeString("1998\\u5E74\\u5341\\u4E00\\u670826"),             // 02: yMMMd
28064339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        CharsToUnicodeString("1998\\u5E74\\u5341\\u4E00\\u670826"),             // 03: yMMMd
28164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        UnicodeString("11-26"),                                                 // 04: Md
28264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        CharsToUnicodeString("\\u5341\\u4E00\\u670826\\u65E5"),                 // 05: MMMd
28364339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        CharsToUnicodeString("\\u5341\\u4E00\\u670826\\u65E5"),                 // 06: MMMMd
2841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        CharsToUnicodeString("1998\\u620A\\u5BC5\\u5E74\\u7b2c\\u56db\\u5B63\\u5EA6"),  // 07: yQQQ
28564339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        CharsToUnicodeString("\\u4E0B\\u534811:58"),                            // 08: hhmm
28664339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        UnicodeString("23:58"),                                                 // 09: HHmm
28764339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        CharsToUnicodeString("\\u4E0B\\u534811:58"),                            // 10: jjmm
28864339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        UnicodeString("58:59"),                                                 // 11: mmss
28964339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        CharsToUnicodeString("1998\\u620A\\u5BC5\\u5E74\\u5341\\u4E00\\u6708"), // 12: yyyyMMMM
29064339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        CharsToUnicodeString("\\u5341\\u4E00\\u670826\\u65E5\\u5468\\u4E09"),   // 13: MMMEd
29164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        CharsToUnicodeString("26\\u65E5\\u5468\\u4E09"),                        // 14: Ed    -> d\u65E5EEE
29264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        CharsToUnicodeString("\\u4E0B\\u534811:58:59.123"),                     // 15: jmmssSS
29364339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        UnicodeString("11:58"),                                                 // 16: JJmm
294b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString(),
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
298c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UnicodeString patternTests2[] = {
299c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("yyyyMMMdd"),
300b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString("yyyyqqqq"),
301b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString("yMMMdd"),
302c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("EyyyyMMMdd"),
303c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("yyyyMMdd"),
304c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("yyyyMMM"),
305c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("yyyyMM"),
306c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("yyMM"),
307c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("yMMMMMd"),
308c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("EEEEEMMMMMd"),
309c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("MMMd"),
310c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("MMMdhmm"),
311c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("EMMMdhmms"),
312c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("MMdhmm"),
313c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("EEEEMMMdhmms"),
314c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("yyyyMMMddhhmmss"),
315c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("EyyyyMMMddhhmmss"),
316c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("hmm"),
317c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("hhmm"),
318b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString("hhmmVVVV"),
319c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString(""),
320c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    };
321c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UnicodeString patternResults2[] = {
322c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("Oct 14, 1999"),
323b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString("4th quarter 1999"),
324b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString("Oct 14, 1999"),
325c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("Thu, Oct 14, 1999"),
326c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("10/14/1999"),
327c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("Oct 1999"),
328c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("10/1999"),
329c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("10/99"),
330b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString("O 14, 1999"),
331c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("T, O 14"),
332c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("Oct 14"),
33354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("Oct 14, 6:58 AM"),
33454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("Thu, Oct 14, 6:58:59 AM"),
33554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("10/14, 6:58 AM"),
33654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("Thursday, Oct 14, 6:58:59 AM"),
33754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("Oct 14, 1999, 6:58:59 AM"),
33854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("Thu, Oct 14, 1999, 6:58:59 AM"),
339c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("6:58 AM"),
34050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UnicodeString("6:58 AM"),
341b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UnicodeString("6:58 AM GMT"),
342c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString(""),
343c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    };
3448de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // results for getSkeletons() and getPatternForSkeleton()
3468de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    const UnicodeString testSkeletonsResults[] = {
3478de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        UnicodeString("HH:mm"),
3488de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        UnicodeString("MMMMd"),
3498de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        UnicodeString("MMMMMdd"),
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
3518de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
3528de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    const UnicodeString testBaseSkeletonsResults[] = {
3538de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        UnicodeString("Hm"),
3548de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        UnicodeString("MMMMd"),
355103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("MMMMMd"),
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString newDecimal(" "); // space
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString newAppendItemName("hrs.");
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString newAppendItemFormat("{1} {0}");
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString newDateTimeFormat("{1} {0}");
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString conflictingPattern;
36459d709d503bab6e2b61931737e662dd293b40578ccornelius    UDateTimePatternConflict conflictingStatus = UDATPG_NO_CONFLICT;
36559d709d503bab6e2b61931737e662dd293b40578ccornelius    (void)conflictingStatus;   // Suppress set but not used warning.
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ======= Test CreateInstance with default locale
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing DateTimePatternGenerator createInstance from default locale");
3698de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateTimePatternGenerator *instFromDefaultLocale=DateTimePatternGenerator::createInstance(status);
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataerrln("ERROR: Could not create DateTimePatternGenerator (default) - exitting");
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete instFromDefaultLocale;
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3798de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    // ======= Test CreateInstance with given locale
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing DateTimePatternGenerator createInstance from French locale");
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateTimePatternGenerator *instFromLocale=DateTimePatternGenerator::createInstance(Locale::getFrench(), status);
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataerrln("ERROR: Could not create DateTimePatternGenerator (Locale::getFrench()) - exitting");
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3888de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    // ======= Test clone DateTimePatternGenerator
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing DateTimePatternGenerator::clone()");
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
3918de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString decimalSymbol = instFromLocale->getDecimal();
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString newDecimalSymbol = UnicodeString("*");
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    decimalSymbol = instFromLocale->getDecimal();
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    instFromLocale->setDecimal(newDecimalSymbol);
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateTimePatternGenerator *cloneDTPatternGen=instFromLocale->clone();
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    decimalSymbol = cloneDTPatternGen->getDecimal();
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (decimalSymbol != newDecimalSymbol) {
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: inconsistency is found in cloned object.");
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( !(*cloneDTPatternGen == *instFromLocale) ) {
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: inconsistency is found in cloned object.");
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4058de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( *cloneDTPatternGen != *instFromLocale ) {
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: inconsistency is found in cloned object.");
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4098de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete instFromLocale;
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cloneDTPatternGen;
4128de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
4138de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    // ======= Test simple use cases
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing simple use cases");
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale deLocale=Locale::getGermany();
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate sampleDate=LocaleTest::date(99, 9, 13, 23, 58, 59);
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateTimePatternGenerator *gen = DateTimePatternGenerator::createInstance(deLocale, status);
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataerrln("ERROR: Could not create DateTimePatternGenerator (Locale::getGermany()) - exitting");
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString findPattern = gen->getBestPattern(UnicodeString("MMMddHmm"), status);
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat *format = new SimpleDateFormat(findPattern, deLocale, status);
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataerrln("ERROR: Could not create SimpleDateFormat (Locale::getGermany())");
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete gen;
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *zone = TimeZone::createTimeZone(UnicodeString("ECT"));
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (zone==NULL) {
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataerrln("ERROR: Could not create TimeZone ECT");
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete gen;
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete format;
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    format->setTimeZone(*zone);
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString dateReturned, expectedResult;
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dateReturned.remove();
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dateReturned = format->format(sampleDate, dateReturned, status);
441f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    expectedResult=UnicodeString("14. Okt., 08:58", -1, US_INV);
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( dateReturned != expectedResult ) {
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: Simple test in getBestPattern with Locale::getGermany()).");
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // add new pattern
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
4478de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    conflictingStatus = gen->addPattern(UnicodeString("d'. von' MMMM", -1, US_INV), true, conflictingPattern, status);
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: Could not addPattern - d\'. von\' MMMM");
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString testPattern=gen->getBestPattern(UnicodeString("MMMMdd"), status);
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testPattern=gen->getBestPattern(UnicodeString("MMMddHmm"), status);
45450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    format->applyPattern(gen->getBestPattern(UnicodeString("MMMMdHmm"), status));
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dateReturned.remove();
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dateReturned = format->format(sampleDate, dateReturned, status);
457f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    expectedResult=UnicodeString("14. von Oktober, 08:58", -1, US_INV);
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( dateReturned != expectedResult ) {
45950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errln(UnicodeString("ERROR: Simple test addPattern failed!: d\'. von\' MMMM   Got: ") + dateReturned + UnicodeString(" Expected: ") + expectedResult);
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete format;
4628de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // get a pattern and modify it
4648de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    format = (SimpleDateFormat *)DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull,
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                                  deLocale);
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    format->setTimeZone(*zone);
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pattern;
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern = format->toPattern(pattern);
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dateReturned.remove();
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dateReturned = format->format(sampleDate, dateReturned, status);
471f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    expectedResult=CharsToUnicodeString("Donnerstag, 14. Oktober 1999 um 08:58:59 Mitteleurop\\u00E4ische Sommerzeit");
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( dateReturned != expectedResult ) {
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: Simple test uses full date format.");
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString(" Got: ") + dateReturned + UnicodeString(" Expected: ") + expectedResult);
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4768de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
4778de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    // modify it to change the zone.
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString newPattern = gen->replaceFieldTypes(pattern, UnicodeString("vvvv"), status);
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    format->applyPattern(newPattern);
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dateReturned.remove();
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dateReturned = format->format(sampleDate, dateReturned, status);
482f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    expectedResult=CharsToUnicodeString("Donnerstag, 14. Oktober 1999 um 08:58:59 Mitteleurop\\u00E4ische Zeit");
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( dateReturned != expectedResult ) {
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: Simple test modify the timezone!");
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString(" Got: ")+ dateReturned + UnicodeString(" Expected: ") + expectedResult);
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4878de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // setDeciaml(), getDeciaml()
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gen->setDecimal(newDecimal);
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (newDecimal != gen->getDecimal()) {
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: unexpected result from setDecimal() and getDecimal()!.\n");
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4938de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // setAppenItemName() , getAppendItemName()
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gen->setAppendItemName(UDATPG_HOUR_FIELD, newAppendItemName);
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (newAppendItemName != gen->getAppendItemName(UDATPG_HOUR_FIELD)) {
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: unexpected result from setAppendItemName() and getAppendItemName()!.\n");
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4998de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // setAppenItemFormat() , getAppendItemFormat()
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gen->setAppendItemFormat(UDATPG_HOUR_FIELD, newAppendItemFormat);
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (newAppendItemFormat != gen->getAppendItemFormat(UDATPG_HOUR_FIELD)) {
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: unexpected result from setAppendItemFormat() and getAppendItemFormat()!.\n");
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
5058de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // setDateTimeFormat() , getDateTimeFormat()
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gen->setDateTimeFormat(newDateTimeFormat);
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (newDateTimeFormat != gen->getDateTimeFormat()) {
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: unexpected result from setDateTimeFormat() and getDateTimeFormat()!.\n");
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
5118de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ======== Test getSkeleton and getBaseSkeleton
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern = UnicodeString("dd-MMM");
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString expectedSkeleton = UnicodeString("MMMdd");
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString expectedBaseSkeleton = UnicodeString("MMMd");
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString retSkeleton = gen->getSkeleton(pattern, status);
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status) || retSkeleton != expectedSkeleton ) {
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln("ERROR: Unexpected result from getSkeleton().\n");
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln(UnicodeString(" Got: ") + retSkeleton + UnicodeString(" Expected: ") + expectedSkeleton );
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    retSkeleton = gen->getBaseSkeleton(pattern, status);
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status) || retSkeleton !=  expectedBaseSkeleton) {
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln("ERROR: Unexpected result from getBaseSkeleton().\n");
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln(UnicodeString(" Got: ") + retSkeleton + UnicodeString(" Expected:")+ expectedBaseSkeleton);
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern = UnicodeString("dd/MMMM/yy");
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectedSkeleton = UnicodeString("yyMMMMdd");
530103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    expectedBaseSkeleton = UnicodeString("yMMMMd");
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    retSkeleton = gen->getSkeleton(pattern, status);
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status) || retSkeleton != expectedSkeleton ) {
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln("ERROR: Unexpected result from getSkeleton().\n");
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln(UnicodeString(" Got: ") + retSkeleton + UnicodeString(" Expected: ") + expectedSkeleton );
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    retSkeleton = gen->getBaseSkeleton(pattern, status);
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status) || retSkeleton !=  expectedBaseSkeleton) {
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln("ERROR: Unexpected result from getBaseSkeleton().\n");
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln(UnicodeString(" Got: ") + retSkeleton + UnicodeString(" Expected:")+ expectedBaseSkeleton);
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete format;
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zone;
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete gen;
5448de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
545c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
546c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        // Trac# 6104
547c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        status = U_ZERO_ERROR;
548c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        pattern = UnicodeString("YYYYMMM");
549b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString expR = CharsToUnicodeString("1999\\u5E741\\u6708"); // fixed expected result per ticket:6626:
550c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        Locale loc("ja");
551c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UDate testDate1= LocaleTest::date(99, 0, 13, 23, 58, 59);
552c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        DateTimePatternGenerator *patGen=DateTimePatternGenerator::createInstance(loc, status);
553c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if(U_FAILURE(status)) {
554c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            dataerrln("ERROR: Could not create DateTimePatternGenerator");
555c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            return;
556c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
557c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString bPattern = patGen->getBestPattern(pattern, status);
558c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString rDate;
559c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        SimpleDateFormat sdf(bPattern, loc, status);
560c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        rDate.remove();
561c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        rDate = sdf.format(testDate1, rDate);
562c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
563c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        logln(UnicodeString(" ja locale with skeleton: YYYYMMM  Best Pattern:") + bPattern);
564c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        logln(UnicodeString("  Formatted date:") + rDate);
565c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
566c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if ( expR!= rDate ) {
5678de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert            errln(UnicodeString("\nERROR: Test Japanese month hack Got: ") + rDate +
568c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                  UnicodeString(" Expected: ") + expR );
569c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5708de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
571c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        delete patGen;
572c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
573c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {   // Trac# 6104
574c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        Locale loc("zh");
575b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString expR = CharsToUnicodeString("1999\\u5E741\\u6708"); // fixed expected result per ticket:6626:
576c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UDate testDate1= LocaleTest::date(99, 0, 13, 23, 58, 59);
577c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        DateTimePatternGenerator *patGen=DateTimePatternGenerator::createInstance(loc, status);
578c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if(U_FAILURE(status)) {
579c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            dataerrln("ERROR: Could not create DateTimePatternGenerator");
580c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            return;
581c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
582c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString bPattern = patGen->getBestPattern(pattern, status);
583c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString rDate;
584c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        SimpleDateFormat sdf(bPattern, loc, status);
585c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        rDate.remove();
586c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        rDate = sdf.format(testDate1, rDate);
587c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
588c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        logln(UnicodeString(" zh locale with skeleton: YYYYMMM  Best Pattern:") + bPattern);
589c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        logln(UnicodeString("  Formatted date:") + rDate);
590c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if ( expR!= rDate ) {
5918de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert            errln(UnicodeString("\nERROR: Test Chinese month hack Got: ") + rDate +
592c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                  UnicodeString(" Expected: ") + expR );
593c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
5948de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        delete patGen;
595c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
596c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
597c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
598c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         // Trac# 6172 duplicate time pattern
599c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         status = U_ZERO_ERROR;
600c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         pattern = UnicodeString("hmv");
601b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru         UnicodeString expR = UnicodeString("h:mm a v"); // avail formats has hm -> "h:mm a" (fixed expected result per ticket:6626:)
602c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         Locale loc("en");
603c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         DateTimePatternGenerator *patGen=DateTimePatternGenerator::createInstance(loc, status);
604c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         if(U_FAILURE(status)) {
605c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru             dataerrln("ERROR: Could not create DateTimePatternGenerator");
606c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru             return;
607c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         }
608c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         UnicodeString bPattern = patGen->getBestPattern(pattern, status);
609c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         logln(UnicodeString(" en locale with skeleton: hmv  Best Pattern:") + bPattern);
610c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
611c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         if ( expR!= bPattern ) {
6128de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert             errln(UnicodeString("\nERROR: Test EN time format Got: ") + bPattern +
613c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                   UnicodeString(" Expected: ") + expR );
614c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         }
6158de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
616c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         delete patGen;
617c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     }
6188de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
6198de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ======= Test various skeletons.
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing DateTimePatternGenerator with various skeleton");
6228de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t localeIndex=0;
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultIndex=0;
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString resultDate;
627b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UDate testDate= LocaleTest::date(99, 0, 13, 23, 58, 59) + 123.0;
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (localeIndex < MAX_LOCALE )
6298de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    {
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t dataIndex=0;
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString bestPattern;
6328de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
633b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        Locale loc(testLocale[localeIndex][0], testLocale[localeIndex][1], testLocale[localeIndex][2], testLocale[localeIndex][3]);
634b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        logln("\n\n Locale: %s_%s_%s@%s", testLocale[localeIndex][0], testLocale[localeIndex][1], testLocale[localeIndex][2], testLocale[localeIndex][3]);
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        DateTimePatternGenerator *patGen=DateTimePatternGenerator::createInstance(loc, status);
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)) {
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dataerrln("ERROR: Could not create DateTimePatternGenerator with locale index:%d . - exitting\n", localeIndex);
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while (patternData[dataIndex].length() > 0) {
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log(patternData[dataIndex]);
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            bestPattern = patGen->getBestPattern(patternData[dataIndex++], status);
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(UnicodeString(" -> ") + bestPattern);
6448de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            SimpleDateFormat sdf(bestPattern, loc, status);
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            resultDate.remove();
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            resultDate = sdf.format(testDate, resultDate);
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if ( resultDate != patternResults[resultIndex] ) {
649b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                errln(UnicodeString("\nERROR: Test various skeletons[") + (dataIndex-1) + UnicodeString("], localeIndex ") + localeIndex +
65027f654740f2a26ad62a5c155af9199af9e69b889claireho                      UnicodeString(". Got: \"") + resultDate + UnicodeString("\" Expected: \"") + patternResults[resultIndex] + "\"" );
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
6528de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            resultIndex++;
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete patGen;
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        localeIndex++;
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
6588de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
659c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // ======= More tests ticket#6110
660c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    logln("Testing DateTimePatternGenerator with various skeleton");
6618de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
662c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
663c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    localeIndex=0;
664c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultIndex=0;
665c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    testDate= LocaleTest::date(99, 9, 13, 23, 58, 59);
6668de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    {
667c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        int32_t dataIndex=0;
668c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString bestPattern;
669c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        logln("\n\n Test various skeletons for English locale...");
670c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        DateTimePatternGenerator *patGen=DateTimePatternGenerator::createInstance(Locale::getEnglish(), status);
671c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if(U_FAILURE(status)) {
672c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            dataerrln("ERROR: Could not create DateTimePatternGenerator with locale English . - exitting\n");
673c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            return;
674c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
675c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TimeZone *enZone = TimeZone::createTimeZone(UnicodeString("ECT/GMT"));
676c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (enZone==NULL) {
677c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            dataerrln("ERROR: Could not create TimeZone ECT");
678c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            delete patGen;
679c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            return;
680c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
6818de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        SimpleDateFormat *enFormat = (SimpleDateFormat *)DateFormat::createDateTimeInstance(DateFormat::kFull,
682c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                         DateFormat::kFull, Locale::getEnglish());
683c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        enFormat->setTimeZone(*enZone);
684c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        while (patternTests2[dataIndex].length() > 0) {
685c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            logln(patternTests2[dataIndex]);
686c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            bestPattern = patGen->getBestPattern(patternTests2[dataIndex], status);
687c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            logln(UnicodeString(" -> ") + bestPattern);
688c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            enFormat->applyPattern(bestPattern);
689c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            resultDate.remove();
690c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            resultDate = enFormat->format(testDate, resultDate);
691c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            if ( resultDate != patternResults2[resultIndex] ) {
692c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                errln(UnicodeString("\nERROR: Test various skeletons[") + dataIndex
6938de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert                    + UnicodeString("]. Got: ") + resultDate + UnicodeString(" Expected: ") +
694c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    patternResults2[resultIndex] );
695c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
696c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            dataIndex++;
697c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            resultIndex++;
698c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
699c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        delete patGen;
700c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        delete enZone;
701c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        delete enFormat;
702c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7068de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    // ======= Test random skeleton
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateTimePatternGenerator *randDTGen= DateTimePatternGenerator::createInstance(status);
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataerrln("ERROR: Could not create DateTimePatternGenerator (Locale::getFrench()) - exitting");
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar newChar;
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<10; ++i) {
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString randomSkeleton;
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t len = rand() % 20;
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int32_t j=0; j<len; ++j ) {
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            while ((newChar = (UChar)(rand()%0x7f))>=(UChar)0x20) {
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                randomSkeleton += newChar;
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString bestPattern = randDTGen->getBestPattern(randomSkeleton, status);
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete randDTGen;
7258de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // UnicodeString randomString=Unicode
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ======= Test getStaticClassID()
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing getStaticClassID()");
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateTimePatternGenerator *test= DateTimePatternGenerator::createInstance(status);
7328de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(test->getDynamicClassID() != DateTimePatternGenerator::getStaticClassID()) {
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: getDynamicClassID() didn't return the expected value");
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete test;
7378de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ====== Test createEmptyInstance()
7398de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing createEmptyInstance()");
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
7428de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test = DateTimePatternGenerator::createEmptyInstance(status);
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln("ERROR: Fail to create an empty instance ! - exitting.\n");
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         delete test;
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         return;
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
7498de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
7508de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    conflictingStatus = test->addPattern(UnicodeString("MMMMd"), true, conflictingPattern, status);
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testPattern=test->getBestPattern(UnicodeString("MMMMdd"), status);
7538de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    conflictingStatus = test->addPattern(UnicodeString("HH:mm"), true, conflictingPattern, status);
754103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    conflictingStatus = test->addPattern(UnicodeString("MMMMMdd"), true, conflictingPattern, status); //duplicate pattern
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringEnumeration *output=NULL;
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    output = test->getRedundants(status);
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectedResult=UnicodeString("MMMMd");
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (output != NULL) {
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        output->reset(status);
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UnicodeString *dupPattern=output->snext(status);
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (dupPattern==NULL) || (*dupPattern != expectedResult) ) {
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("ERROR: Fail in getRedundants !\n");
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
7658de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ======== Test getSkeletons and getBaseSkeletons
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringEnumeration* ptrSkeletonEnum = test->getSkeletons(status);
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: Fail to get skeletons !\n");
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString returnPattern, *ptrSkeleton;
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ptrSkeletonEnum->reset(status);
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t count=ptrSkeletonEnum->count(status);
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<count; ++i) {
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ptrSkeleton = (UnicodeString *)ptrSkeletonEnum->snext(status);
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        returnPattern = test->getPatternForSkeleton(*ptrSkeleton);
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( returnPattern != testSkeletonsResults[i] ) {
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("ERROR: Unexpected result from getSkeletons and getPatternForSkeleton\nGot: ") + returnPattern
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               + UnicodeString("\nExpected: ") + testSkeletonsResults[i]
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               + UnicodeString("\n"));
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringEnumeration* ptrBaseSkeletonEnum = test->getBaseSkeletons(status);
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: Fail to get base skeletons !\n");
7868de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    }
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count=ptrBaseSkeletonEnum->count(status);
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<count; ++i) {
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ptrSkeleton = (UnicodeString *)ptrBaseSkeletonEnum->snext(status);
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( *ptrSkeleton != testBaseSkeletonsResults[i] ) {
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("ERROR: Unexpected result from getBaseSkeletons() !\n");
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
795c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // ========= DateTimePatternGenerator sample code in Userguide
796c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // set up the generator
797c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    Locale locale = Locale::getFrench();
798c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
799c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    DateTimePatternGenerator *generator = DateTimePatternGenerator::createInstance( locale, status);
8008de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
801c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // get a pattern for an abbreviated month and day
8028de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    pattern = generator->getBestPattern(UnicodeString("MMMd"), status);
8038de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    SimpleDateFormat formatter(pattern, locale, status);
804c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
805c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    zone = TimeZone::createTimeZone(UnicodeString("GMT"));
806c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    formatter.setTimeZone(*zone);
807c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // use it to format (or parse)
808c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UnicodeString formatted;
8098de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    formatted = formatter.format(Calendar::getNow(), formatted, status);
810c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // for French, the result is "13 sept."
811c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    formatted.remove();
812c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // cannot use the result from getNow() because the value change evreyday.
813c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    testDate= LocaleTest::date(99, 0, 13, 23, 58, 59);
814c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    formatted = formatter.format(testDate, formatted, status);
815c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    expectedResult=UnicodeString("14 janv.");
816c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if ( formatted != expectedResult ) {
817c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        errln("ERROR: Userguide sample code result!");
818c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        errln(UnicodeString(" Got: ")+ formatted + UnicodeString(" Expected: ") + expectedResult);
819c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
820c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
821c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    delete zone;
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete output;
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete ptrSkeletonEnum;
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete ptrBaseSkeletonEnum;
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete test;
826c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    delete generator;
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
82950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/**
83050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Test handling of options
83150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
83250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * For reference, as of ICU 4.3.3,
83350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *  root/gregorian has
83450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      Hm{"H:mm"}
83550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      Hms{"H:mm:ss"}
83650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      hm{"h:mm a"}
83750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      hms{"h:mm:ss a"}
83850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *  en/gregorian has
83950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      Hm{"H:mm"}
84050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      Hms{"H:mm:ss"}
84150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      hm{"h:mm a"}
84250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *  be/gregorian has
84350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      HHmmss{"HH.mm.ss"}
84450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      Hm{"HH.mm"}
84550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      hm{"h.mm a"}
84650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      hms{"h.mm.ss a"}
84750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */
84850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehotypedef struct DTPtnGenOptionsData {
84950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *locale;
85050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *skel;
85150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *expectedPattern;
85250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UDateTimePatternMatchOptions    options;
85350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} DTPtnGenOptionsData;
85450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid IntlTestDateTimePatternGeneratorAPI::testOptions(/*char *par*/)
85550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
85650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    DTPtnGenOptionsData testData[] = {
85750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    //   locale  skel   expectedPattern     options
85850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "en", "Hmm",  "HH:mm",   UDATPG_MATCH_NO_OPTIONS        },
85950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "en", "HHmm", "HH:mm",   UDATPG_MATCH_NO_OPTIONS        },
86050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "en", "hhmm", "h:mm a",  UDATPG_MATCH_NO_OPTIONS        },
86150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "en", "Hmm",  "HH:mm",   UDATPG_MATCH_HOUR_FIELD_LENGTH },
86250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "en", "HHmm", "HH:mm",   UDATPG_MATCH_HOUR_FIELD_LENGTH },
86350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "en", "hhmm", "hh:mm a", UDATPG_MATCH_HOUR_FIELD_LENGTH },
864c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        { "da", "Hmm",  "HH.mm",   UDATPG_MATCH_NO_OPTIONS        },
865c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        { "da", "HHmm", "HH.mm",   UDATPG_MATCH_NO_OPTIONS        },
866c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        { "da", "hhmm", "h.mm a",  UDATPG_MATCH_NO_OPTIONS        },
867c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        { "da", "Hmm",  "H.mm",    UDATPG_MATCH_HOUR_FIELD_LENGTH },
868c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        { "da", "HHmm", "HH.mm",   UDATPG_MATCH_HOUR_FIELD_LENGTH },
869c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        { "da", "hhmm", "hh.mm a", UDATPG_MATCH_HOUR_FIELD_LENGTH },
87059d709d503bab6e2b61931737e662dd293b40578ccornelius        //
871fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en",                   "yyyy",  "yyyy",  UDATPG_MATCH_NO_OPTIONS },
872fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en",                   "YYYY",  "YYYY",  UDATPG_MATCH_NO_OPTIONS },
873fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en",                   "U",     "y",     UDATPG_MATCH_NO_OPTIONS },
874fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en@calendar=japanese", "yyyy",  "y G",   UDATPG_MATCH_NO_OPTIONS },
875fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en@calendar=japanese", "YYYY",  "Y G",   UDATPG_MATCH_NO_OPTIONS },
876fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en@calendar=japanese", "U",     "y G",   UDATPG_MATCH_NO_OPTIONS },
8771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "en@calendar=chinese",  "yyyy",  "r(U)",  UDATPG_MATCH_NO_OPTIONS },
8781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "en@calendar=chinese",  "YYYY",  "Y(Y)",  UDATPG_MATCH_NO_OPTIONS }, // not a good result, want r(Y) or r(U)
8791b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "en@calendar=chinese",  "U",     "r(U)",     UDATPG_MATCH_NO_OPTIONS },
8801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "en@calendar=chinese",  "Gy",    "r(U)",     UDATPG_MATCH_NO_OPTIONS },
8811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "en@calendar=chinese",  "GU",    "r(U)",     UDATPG_MATCH_NO_OPTIONS },
8821b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "en@calendar=chinese",  "ULLL",  "MMM U",    UDATPG_MATCH_NO_OPTIONS },
8831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "en@calendar=chinese",  "yMMM",  "MMM r(U)", UDATPG_MATCH_NO_OPTIONS },
8841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "en@calendar=chinese",  "GUMMM", "MMM r(U)", UDATPG_MATCH_NO_OPTIONS },
8851b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "zh@calendar=chinese",  "yyyy",  "rU\\u5E74",    UDATPG_MATCH_NO_OPTIONS },
8861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "zh@calendar=chinese",  "YYYY",  "YY\\u5E74",    UDATPG_MATCH_NO_OPTIONS }, // not a good result, may want r(Y) or r(U)
8871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "zh@calendar=chinese",  "U",     "rU\\u5E74",    UDATPG_MATCH_NO_OPTIONS },
8881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "zh@calendar=chinese",  "Gy",    "rU\\u5E74",    UDATPG_MATCH_NO_OPTIONS },
8891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "zh@calendar=chinese",  "GU",    "rU\\u5E74",    UDATPG_MATCH_NO_OPTIONS },
8901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "zh@calendar=chinese",  "ULLL",  "U\\u5E74MMM",  UDATPG_MATCH_NO_OPTIONS },
8911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "zh@calendar=chinese",  "yMMM",  "rU\\u5E74MMM", UDATPG_MATCH_NO_OPTIONS },
8921b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        { "zh@calendar=chinese",  "GUMMM", "rU\\u5E74MMM", UDATPG_MATCH_NO_OPTIONS },
89350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    };
8948de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
8958de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    int count = UPRV_LENGTHOF(testData);
89650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const DTPtnGenOptionsData * testDataPtr = testData;
8978de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
89850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    for (; count-- > 0; ++testDataPtr) {
89950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UErrorCode status = U_ZERO_ERROR;
90050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
90150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        Locale locale(testDataPtr->locale);
90250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UnicodeString skel(testDataPtr->skel);
903fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UnicodeString expectedPattern(UnicodeString(testDataPtr->expectedPattern).unescape());
90450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UDateTimePatternMatchOptions options = testDataPtr->options;
90550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
90650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        DateTimePatternGenerator * dtpgen = DateTimePatternGenerator::createInstance(locale, status);
90750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (U_FAILURE(status)) {
90850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            dataerrln("Unable to create DateTimePatternGenerator instance for locale(%s): %s", locale.getName(), u_errorName(status));
90950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            delete dtpgen;
91050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            continue;
91150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
91250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UnicodeString pattern = dtpgen->getBestPattern(skel, options, status);
91350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (pattern.compare(expectedPattern) != 0) {
91450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            errln( UnicodeString("ERROR in getBestPattern, locale ") + UnicodeString(testDataPtr->locale) +
91550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   UnicodeString(", skeleton ") + skel +
91650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   ((options)?UnicodeString(", options!=0"):UnicodeString(", options==0")) +
91750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   UnicodeString(", expected pattern ") + expectedPattern +
91850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   UnicodeString(", got ") + pattern );
91950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
92050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        delete dtpgen;
92150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
92250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
92350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
92459d709d503bab6e2b61931737e662dd293b40578ccornelius/**
92559d709d503bab6e2b61931737e662dd293b40578ccornelius * Test that DTPG can handle all valid pattern character / length combinations
92659d709d503bab6e2b61931737e662dd293b40578ccornelius *
92759d709d503bab6e2b61931737e662dd293b40578ccornelius */
92859d709d503bab6e2b61931737e662dd293b40578ccornelius#define FIELD_LENGTHS_COUNT 6
92959d709d503bab6e2b61931737e662dd293b40578ccornelius#define FIELD_LENGTH_MAX 8
93059d709d503bab6e2b61931737e662dd293b40578ccornelius#define MUST_INCLUDE_COUNT 5
93159d709d503bab6e2b61931737e662dd293b40578ccornelius
93259d709d503bab6e2b61931737e662dd293b40578ccorneliustypedef struct AllFieldsTestItem {
93359d709d503bab6e2b61931737e662dd293b40578ccornelius    char patternChar;
93459d709d503bab6e2b61931737e662dd293b40578ccornelius    int8_t fieldLengths[FIELD_LENGTHS_COUNT+1]; // up to FIELD_LENGTHS_COUNT lengths to try
93559d709d503bab6e2b61931737e662dd293b40578ccornelius                                                // (length <=FIELD_LENGTH_MAX) plus 0 terminator
93659d709d503bab6e2b61931737e662dd293b40578ccornelius    char mustIncludeOneOf[MUST_INCLUDE_COUNT+1];// resulting pattern must include at least one of
93759d709d503bab6e2b61931737e662dd293b40578ccornelius                                                // these as a pattern char (0-terminated list)
93859d709d503bab6e2b61931737e662dd293b40578ccornelius} AllFieldsTestItem;
93959d709d503bab6e2b61931737e662dd293b40578ccornelius
94059d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid IntlTestDateTimePatternGeneratorAPI::testAllFieldPatterns(/*char *par*/)
94159d709d503bab6e2b61931737e662dd293b40578ccornelius{
94259d709d503bab6e2b61931737e662dd293b40578ccornelius    const char * localeNames[] = {
94359d709d503bab6e2b61931737e662dd293b40578ccornelius        "root",
94459d709d503bab6e2b61931737e662dd293b40578ccornelius        "root@calendar=japanese",
94559d709d503bab6e2b61931737e662dd293b40578ccornelius        "root@calendar=chinese",
94659d709d503bab6e2b61931737e662dd293b40578ccornelius        "en",
94759d709d503bab6e2b61931737e662dd293b40578ccornelius        "en@calendar=japanese",
94859d709d503bab6e2b61931737e662dd293b40578ccornelius        "en@calendar=chinese",
94959d709d503bab6e2b61931737e662dd293b40578ccornelius        NULL // terminator
95059d709d503bab6e2b61931737e662dd293b40578ccornelius    };
95159d709d503bab6e2b61931737e662dd293b40578ccornelius    AllFieldsTestItem testData[] = {
95259d709d503bab6e2b61931737e662dd293b40578ccornelius        //pat   fieldLengths    generated pattern must
95359d709d503bab6e2b61931737e662dd293b40578ccornelius        //chr   to test         include one of these
95459d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'G',  {1,2,3,4,5,0},  "G"    }, // era
95559d709d503bab6e2b61931737e662dd293b40578ccornelius        // year
95659d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'y',  {1,2,3,4,0},    "yU"   }, // year
95759d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'Y',  {1,2,3,4,0},    "Y"    }, // year for week of year
95859d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'u',  {1,2,3,4,5,0},  "yuU"  }, // extended year
95959d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'U',  {1,2,3,4,5,0},  "yU"   }, // cyclic year name
96059d709d503bab6e2b61931737e662dd293b40578ccornelius        // quarter
96159d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'Q',  {1,2,3,4,0},    "Qq"   }, // x
96259d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'q',  {1,2,3,4,0},    "Qq"   }, // standalone
96359d709d503bab6e2b61931737e662dd293b40578ccornelius        // month
96459d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'M',  {1,2,3,4,5,0},  "ML"   }, // x
96559d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'L',  {1,2,3,4,5,0},  "ML"   }, // standalone
96659d709d503bab6e2b61931737e662dd293b40578ccornelius        // week
96759d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'w',  {1,2,0},        "w"    }, // week of year
96859d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'W',  {1,0},          "W"    }, // week of month
96959d709d503bab6e2b61931737e662dd293b40578ccornelius        // day
97059d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'd',  {1,2,0},        "d"    }, // day of month
97159d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'D',  {1,2,3,0},      "D"    }, // day of year
97259d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'F',  {1,0},          "F"    }, // day of week in month
97359d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'g',  {7,0},          "g"    }, // modified julian day
97459d709d503bab6e2b61931737e662dd293b40578ccornelius        // weekday
97559d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'E',  {1,2,3,4,5,6},  "Eec"  }, // day of week
97659d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'e',  {1,2,3,4,5,6},  "Eec"  }, // local day of week
97759d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'c',  {1,2,3,4,5,6},  "Eec"  }, // standalone local day of week
97859d709d503bab6e2b61931737e662dd293b40578ccornelius        // day period
97959d709d503bab6e2b61931737e662dd293b40578ccornelius    //  { 'a',  {1,0},          "a"    }, // am or pm   // not clear this one is supposed to work (it doesn't)
98059d709d503bab6e2b61931737e662dd293b40578ccornelius        // hour
98159d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'h',  {1,2,0},        "hK"   }, // 12 (1-12)
98259d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'H',  {1,2,0},        "Hk"   }, // 24 (0-23)
98359d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'K',  {1,2,0},        "hK"   }, // 12 (0-11)
98459d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'k',  {1,2,0},        "Hk"   }, // 24 (1-24)
98559d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'j',  {1,2,0},        "hHKk" }, // locale default
98659d709d503bab6e2b61931737e662dd293b40578ccornelius        // minute
98759d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'm',  {1,2,0},        "m"    }, // x
98859d709d503bab6e2b61931737e662dd293b40578ccornelius        // second & fractions
98959d709d503bab6e2b61931737e662dd293b40578ccornelius        { 's',  {1,2,0},        "s"    }, // x
99059d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'S',  {1,2,3,4,0},    "S"    }, // fractional second
99159d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'A',  {8,0},          "A"    }, // milliseconds in day
99259d709d503bab6e2b61931737e662dd293b40578ccornelius        // zone
99359d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'z',  {1,2,3,4,0},    "z"    }, // x
99459d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'Z',  {1,2,3,4,5,0},  "Z"    }, // x
99559d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'O',  {1,4,0},        "O"    }, // x
99659d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'v',  {1,4,0},        "v"    }, // x
99759d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'V',  {1,2,3,4,0},    "V"    }, // x
99859d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'X',  {1,2,3,4,5,0},  "X"    }, // x
99959d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'x',  {1,2,3,4,5,0},  "x"    }, // x
100059d709d503bab6e2b61931737e662dd293b40578ccornelius    };
10018de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
100259d709d503bab6e2b61931737e662dd293b40578ccornelius    const char ** localeNamesPtr = localeNames;
100359d709d503bab6e2b61931737e662dd293b40578ccornelius    const char * localeName;
100459d709d503bab6e2b61931737e662dd293b40578ccornelius    while ( (localeName = *localeNamesPtr++) != NULL) {
100559d709d503bab6e2b61931737e662dd293b40578ccornelius        UErrorCode status = U_ZERO_ERROR;
100659d709d503bab6e2b61931737e662dd293b40578ccornelius        Locale locale = Locale::createFromName(localeName);
100759d709d503bab6e2b61931737e662dd293b40578ccornelius        DateTimePatternGenerator * dtpg = DateTimePatternGenerator::createInstance(locale, status);
100859d709d503bab6e2b61931737e662dd293b40578ccornelius        if (U_SUCCESS(status)) {
100959d709d503bab6e2b61931737e662dd293b40578ccornelius            const AllFieldsTestItem * testDataPtr = testData;
10108de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert            int itemCount = UPRV_LENGTHOF(testData);
101159d709d503bab6e2b61931737e662dd293b40578ccornelius            for (; itemCount-- > 0; ++testDataPtr) {
101259d709d503bab6e2b61931737e662dd293b40578ccornelius                char skelBuf[FIELD_LENGTH_MAX];
101359d709d503bab6e2b61931737e662dd293b40578ccornelius                int32_t chrIndx, lenIndx;
101459d709d503bab6e2b61931737e662dd293b40578ccornelius                for (chrIndx = 0; chrIndx < FIELD_LENGTH_MAX; chrIndx++) {
101559d709d503bab6e2b61931737e662dd293b40578ccornelius                    skelBuf[chrIndx] = testDataPtr->patternChar;
101659d709d503bab6e2b61931737e662dd293b40578ccornelius                }
101759d709d503bab6e2b61931737e662dd293b40578ccornelius                for (lenIndx = 0; lenIndx < FIELD_LENGTHS_COUNT; lenIndx++) {
101859d709d503bab6e2b61931737e662dd293b40578ccornelius                    int32_t skelLen = testDataPtr->fieldLengths[lenIndx];
101959d709d503bab6e2b61931737e662dd293b40578ccornelius                    if (skelLen <= 0) {
102059d709d503bab6e2b61931737e662dd293b40578ccornelius                        break;
102159d709d503bab6e2b61931737e662dd293b40578ccornelius                    }
102259d709d503bab6e2b61931737e662dd293b40578ccornelius                    if (skelLen > FIELD_LENGTH_MAX) {
102359d709d503bab6e2b61931737e662dd293b40578ccornelius                        continue;
102459d709d503bab6e2b61931737e662dd293b40578ccornelius                    }
102559d709d503bab6e2b61931737e662dd293b40578ccornelius                    UnicodeString skeleton(skelBuf, skelLen, US_INV);
102659d709d503bab6e2b61931737e662dd293b40578ccornelius                    UnicodeString pattern = dtpg->getBestPattern(skeleton, status);
102759d709d503bab6e2b61931737e662dd293b40578ccornelius                    if (U_FAILURE(status)) {
102859d709d503bab6e2b61931737e662dd293b40578ccornelius                        errln("DateTimePatternGenerator getBestPattern for locale %s, skelChar %c skelLength %d fails: %s",
102959d709d503bab6e2b61931737e662dd293b40578ccornelius                              locale.getName(), testDataPtr->patternChar, skelLen, u_errorName(status));
103059d709d503bab6e2b61931737e662dd293b40578ccornelius                    } else if (pattern.length() <= 0) {
103159d709d503bab6e2b61931737e662dd293b40578ccornelius                        errln("DateTimePatternGenerator getBestPattern for locale %s, skelChar %c skelLength %d produces 0-length pattern",
103259d709d503bab6e2b61931737e662dd293b40578ccornelius                              locale.getName(), testDataPtr->patternChar, skelLen);
103359d709d503bab6e2b61931737e662dd293b40578ccornelius                    } else {
103459d709d503bab6e2b61931737e662dd293b40578ccornelius                        // test that resulting pattern has at least one char in mustIncludeOneOf
103559d709d503bab6e2b61931737e662dd293b40578ccornelius                        UnicodeString mustIncludeOneOf(testDataPtr->mustIncludeOneOf, -1, US_INV);
103659d709d503bab6e2b61931737e662dd293b40578ccornelius                        int32_t patIndx, patLen = pattern.length();
103759d709d503bab6e2b61931737e662dd293b40578ccornelius                        UBool inQuoted = FALSE;
103859d709d503bab6e2b61931737e662dd293b40578ccornelius                        for (patIndx = 0; patIndx < patLen; patIndx++) {
103959d709d503bab6e2b61931737e662dd293b40578ccornelius                            UChar c = pattern.charAt(patIndx);
104059d709d503bab6e2b61931737e662dd293b40578ccornelius                            if (c == 0x27) {
104159d709d503bab6e2b61931737e662dd293b40578ccornelius                                inQuoted = !inQuoted;
104259d709d503bab6e2b61931737e662dd293b40578ccornelius                            } else if (!inQuoted && c <= 0x007A && c >= 0x0041) {
104359d709d503bab6e2b61931737e662dd293b40578ccornelius                                if (mustIncludeOneOf.indexOf(c) >= 0) {
104459d709d503bab6e2b61931737e662dd293b40578ccornelius                                    break;
104559d709d503bab6e2b61931737e662dd293b40578ccornelius                                }
104659d709d503bab6e2b61931737e662dd293b40578ccornelius                            }
104759d709d503bab6e2b61931737e662dd293b40578ccornelius                        }
104859d709d503bab6e2b61931737e662dd293b40578ccornelius                        if (patIndx >= patLen) {
104959d709d503bab6e2b61931737e662dd293b40578ccornelius                            errln(UnicodeString("DateTimePatternGenerator getBestPattern for locale ") +
105059d709d503bab6e2b61931737e662dd293b40578ccornelius                                    UnicodeString(locale.getName(),-1,US_INV) +
105159d709d503bab6e2b61931737e662dd293b40578ccornelius                                    ", skeleton " + skeleton +
105259d709d503bab6e2b61931737e662dd293b40578ccornelius                                    ", produces pattern without required chars: " + pattern);
105359d709d503bab6e2b61931737e662dd293b40578ccornelius                        }
10548de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
105559d709d503bab6e2b61931737e662dd293b40578ccornelius                    }
105659d709d503bab6e2b61931737e662dd293b40578ccornelius                }
105759d709d503bab6e2b61931737e662dd293b40578ccornelius            }
105859d709d503bab6e2b61931737e662dd293b40578ccornelius            delete dtpg;
105959d709d503bab6e2b61931737e662dd293b40578ccornelius        } else {
106059d709d503bab6e2b61931737e662dd293b40578ccornelius            dataerrln("Create DateTimePatternGenerator instance for locale(%s) fails: %s",
106159d709d503bab6e2b61931737e662dd293b40578ccornelius                      locale.getName(), u_errorName(status));
106259d709d503bab6e2b61931737e662dd293b40578ccornelius        }
106359d709d503bab6e2b61931737e662dd293b40578ccornelius    }
106459d709d503bab6e2b61931737e662dd293b40578ccornelius}
10658de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
10668de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubertvoid IntlTestDateTimePatternGeneratorAPI::testStaticGetSkeleton(/*char *par*/)
10678de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert{
10688de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    // Verify that staticGetSkeleton() doesn't mangle skeletons. (Ticket #11985)
10698de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    static const char* const testData[] = {
10708de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        "jmm",
10718de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        "jjmm",
10728de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        "Jmm",
10738de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        "JJmm"
10748de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    };
10758de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
10768de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for (size_t i = 0; i < UPRV_LENGTHOF(testData); i++) {
10778de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        UErrorCode status = U_ZERO_ERROR;
10788de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        UnicodeString skeleton = DateTimePatternGenerator::staticGetSkeleton(testData[i], status);
10798de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        if (!assertSuccess("staticGetSkeleton", status)) {
10808de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert            return;
10818de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        }
10828de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        assertEquals("Skeleton", testData[i], skeleton);
10838de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    }
10848de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert}
10858de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
10868de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubertvoid IntlTestDateTimePatternGeneratorAPI::testC() {
10878de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    UErrorCode status = U_ZERO_ERROR;
10888de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    const int32_t numLocales = 6;
10898de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
10908de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    const char* tests[numLocales][3] = {
10918de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert            {"zh", "Cm", "Bh:mm"},
10928de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert            {"de", "Cm", "HH:mm"},
10938de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert            {"en", "Cm", "h:mm a"},
10948de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert            {"en-BN", "Cm", "h:mm b"},
10958de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert            {"gu-IN", "Cm", "h:mm B"},
10968de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert            {"und-IN", "Cm", "h:mm a"},
10978de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    };
10988de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
10998de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    for (int32_t i = 0; i < numLocales; ++i) {
11008de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        DateTimePatternGenerator *gen = DateTimePatternGenerator::createInstance(Locale(tests[i][0]), status);
11018de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        UnicodeString pattern = gen->getBestPattern(tests[i][1], status);
11028de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        UnicodeString expectedPattern = tests[i][2];
11038de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
11048de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        char message[100] = "\0";
11058de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        strcat(message, tests[i][0]);
11068de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        strcat(message, "/");
11078de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        strcat(message, tests[i][1]);
11088de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        assertEquals(message, expectedPattern, pattern);
11098de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        delete gen;
11108de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    }
11118de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert}
11128de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
1114