1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * Copyright (c) 2008-2014, International Business Machines Corporation and
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h>
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h>
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "dtptngts.h"
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/calendar.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/smpdtfmt.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/dtfmtsym.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/dtptngen.h"
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "loctest.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This is an API test, not a unit test.  It doesn't test very many cases, and doesn't
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// try to test the full functionality.  It just calls each function in the class and
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// verifies that it works on a basic level.
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestDateTimePatternGeneratorAPI::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (exec) logln("TestSuite DateTimePatternGeneratorAPI");
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (index) {
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(0, testAPI);
3150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TESTCASE(1, testOptions);
3259d709d503bab6e2b61931737e662dd293b40578ccornelius        TESTCASE(2, testAllFieldPatterns);
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default: name = ""; break;
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
37103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define MAX_LOCALE   11
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test various generic API methods of DateTimePatternGenerator for API coverage.
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/)
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString patternData[] = {
4527f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("yM"),        // 00
4627f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("yMMM"),      // 01
4727f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("yMd"),       // 02
4827f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("yMMMd"),     // 03
4927f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("Md"),        // 04
5027f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("MMMd"),      // 05
51103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("MMMMd"),     // 06
52103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("yQQQ"),      // 07
53103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("hhmm"),      // 08
54103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("HHmm"),      // 09
55103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("jjmm"),      // 10
56103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("mmss"),      // 11
57103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("yyyyMMMM"),  // 12
58103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("MMMEd"),     // 13
59103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("Ed"),        // 14
60103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("jmmssSSS"),  // 15
6159d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("JJmm"),      // 16
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString(),
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     };
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
65b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char* testLocale[MAX_LOCALE][4] = {
6627f654740f2a26ad62a5c155af9199af9e69b889claireho        {"en", "US", "", ""},                   // 0
6727f654740f2a26ad62a5c155af9199af9e69b889claireho        {"en", "US", "", "calendar=japanese"},  // 1
6827f654740f2a26ad62a5c155af9199af9e69b889claireho        {"de", "DE", "", ""},                   // 2
6927f654740f2a26ad62a5c155af9199af9e69b889claireho        {"fi", "", "", ""},                     // 3
70103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        {"es", "", "", ""},                     // 4
71103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        {"ja", "", "", ""},                     // 5
72103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        {"ja", "", "", "calendar=japanese"},    // 6
73103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        {"zh", "Hans", "CN", ""},               // 7
74103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        {"zh", "TW", "", "calendar=roc"},       // 8
75103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        {"ru", "", "", ""},                     // 9
76103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        {"zh", "", "", "calendar=chinese"},    // 10
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     };
7827f654740f2a26ad62a5c155af9199af9e69b889claireho
7927f654740f2a26ad62a5c155af9199af9e69b889claireho    // For Weds, Jan 13, 1999, 23:58:59
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString patternResults[] = {
8127f654740f2a26ad62a5c155af9199af9e69b889claireho        // en_US                                              // 0 en_US
8227f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1/1999"),                              // 00: yM
8327f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("Jan 1999"),                            // 01: yMMM
8427f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1/13/1999"),                           // 02: yMd
8527f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("Jan 13, 1999"),                        // 03: yMMMd
8627f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1/13"),                                // 04: Md
8727f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("Jan 13"),                              // 05: MMMd
88103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("January 13"),                          // 06: MMMMd
89103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("Q1 1999"),                             // 07: yQQQ
90103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("11:58 PM"),                            // 08: hhmm
91103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                               // 09: HHmm
92103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("11:58 PM"),                            // 10: jjmm
93103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58:59"),                               // 11: mmss
94103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("January 1999"),                        // 12: yyyyMMMM
95103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("Wed, Jan 13"),                         // 13: MMMEd -> EEE, MMM d
96103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("13 Wed"),                              // 14: Ed    -> d EEE
97103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("11:58:59.123 PM"),                     // 15: jmmssSSS -> "h:mm:ss.SSS a"
9859d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("11:58"),                               // 16: JJmm
9927f654740f2a26ad62a5c155af9199af9e69b889claireho
10027f654740f2a26ad62a5c155af9199af9e69b889claireho        // en_US@calendar=japanese                            // 1 en_US@calendar=japanese
101b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UnicodeString("1/11 H"),                              //  0: yM
10227f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("Jan 11 Heisei"),                       //  1: yMMM
103b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UnicodeString("1/13/11 H"),                           //  2: yMd
104b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UnicodeString("Jan 13, 11 Heisei"),                   //  3: yMMMd
10527f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1/13"),                                //  4: Md
10627f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("Jan 13"),                              //  5: MMMd
107103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("January 13"),                          //  6: MMMMd
108103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("Q1 11 Heisei"),                        //  7: yQQQ
109103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("11:58 PM"),                            //  8: hhmm
110103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                               //  9: HHmm
111103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("11:58 PM"),                            // 10: jjmm
112103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58:59"),                               // 11: mmss
113103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("January 11 Heisei"),                   // 12: yyyyMMMM
114103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("Wed, Jan 13"),                         // 13: MMMEd -> EEE, MMM d"
115103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("13 Wed"),                              // 14: Ed    -> d EEE
116103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("11:58:59.123 PM"),                     // 15: jmmssSSS -> "h:mm:ss.SSS a"
11759d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("11:58"),                               // 16: JJmm
118b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
11927f654740f2a26ad62a5c155af9199af9e69b889claireho        // de_DE                                              // 2 de_DE
12027f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1.1999"),                              // 00: yM
12154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("Jan. 1999"),                           // 01: yMMM
12227f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("13.1.1999"),                           // 02: yMd
12354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("13. Jan. 1999"),                       // 03: yMMMd
12427f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("13.1."),                               // 04: Md
12554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("13. Jan."),                            // 05: MMMd
126103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("13. Januar"),                          // 06: MMMMd
127103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("Q1 1999"),                             // 07: yQQQ
128103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("11:58 nachm."),                        // 08: hhmm
129103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                               // 09: HHmm
130103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                               // 10: jjmm
131103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58:59"),                               // 11: mmss
132103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("Januar 1999"),                         // 12: yyyyMMMM
13354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("Mi., 13. Jan."),                       // 13: MMMEd -> EEE, d. MMM
134103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("Mi., 13."),                            // 14: Ed   -> EEE d.
135103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58:59,123"),                        // 15: jmmssSSS -> "HH:mm:ss,SSS"
13659d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("23:58"),                               // 16: JJmm
137b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
13827f654740f2a26ad62a5c155af9199af9e69b889claireho        // fi                                                 // 3 fi
13927f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1.1999"),                              // 00: yM (fixed expected result per ticket:6626:)
14027f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("tammi 1999"),                          // 01: yMMM
14127f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("13.1.1999"),                           // 02: yMd
14227f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("13. tammikuuta 1999"),                 // 03: yMMMd
14327f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("13.1."),                               // 04: Md
14427f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("13. tammikuuta"),                      // 05: MMMd
145103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("13. tammikuuta"),                      // 06: MMMMd
146103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("1. nelj. 1999"),                       // 07: yQQQ
147103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("11.58 ip."),                           // 08: hhmm
148103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23.58"),                               // 09: HHmm
149103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23.58"),                               // 10: jjmm
150103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58.59"),                               // 11: mmss
151103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("tammikuu 1999"),                       // 12: yyyyMMMM
152103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("ke 13. tammikuuta"),                   // 13: MMMEd -> EEE d. MMM
153103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("ke 13."),                              // 14: Ed    -> ccc d.
154103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23.58.59,123"),                        // 15: jmmssSSS -> "H.mm.ss,SSS"
15559d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("23.58"),                               // 16: JJmm
156103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
157103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        // es                                                 // 4 es
158103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("1/1999"),                              // 00: yM    -> "M/y"
15959d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("ene. de 1999"),                        // 01: yMMM  -> "MMM 'de' y"
160103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("13/1/1999"),                           // 02: yMd   -> "d/M/y"
16159d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("13 de ene. de 1999"),                  // 03: yMMMd -> "d 'de' MMM 'de' y"
162103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("13/1"),                                // 04: Md    -> "d/M"
16359d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("13 de ene."),                          // 05: MMMd  -> "d 'de' MMM"
164103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("13 de enero"),                         // 06: MMMMd -> "d 'de' MMMM"
165103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("T1 1999"),                             // 07: yQQQ  -> "QQQ y"
16659d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("11:58 p. m."),                         // 08: hhmm  -> "hh:mm a"
167103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                               // 09: HHmm  -> "HH:mm"
168103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                               // 10: jjmm  -> "HH:mm"
169103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58:59"),                               // 11: mmss  -> "mm:ss"
170103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("enero de 1999"),                       // 12: yyyyMMMM -> "MMMM 'de' yyyy"
17159d709d503bab6e2b61931737e662dd293b40578ccornelius        CharsToUnicodeString("mi\\u00E9. 13 de ene."),        // 13: MMMEd -> "E d 'de' MMM"
17259d709d503bab6e2b61931737e662dd293b40578ccornelius        CharsToUnicodeString("mi\\u00E9. 13"),                // 14: Ed    -> "EEE d"
173103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58:59,123"),                        // 15: jmmssSSS -> "H:mm:ss,SSS"
17459d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("23:58"),                               // 16: JJmm
175103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
176103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        // ja                                                             // 5 ja
17727f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1999/1"),                                          // 00: yM    -> y/M
17827f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("1999\\u5E741\\u6708"),                      // 01: yMMM  -> y\u5E74M\u6708
17927f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1999/1/13"),                                       // 02: yMd   -> y/M/d
18027f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("1999\\u5E741\\u670813\\u65E5"),             // 03: yMMMd -> y\u5E74M\u6708d\u65E5
18127f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1/13"),                                            // 04: Md    -> M/d
18227f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("1\\u670813\\u65E5"),                        // 05: MMMd  -> M\u6708d\u65E5
183103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1\\u670813\\u65E5"),                        // 06: MMMMd  -> M\u6708d\u65E5
18459d709d503bab6e2b61931737e662dd293b40578ccornelius        CharsToUnicodeString("1999/Q1"),                                  // 07: yQQQ  -> y/QQQ
185103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u5348\\u5F8C11:58"),                      // 08: hhmm
186103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                                           // 09: HHmm  -> HH:mm
187103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                                           // 10: jjmm
188103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58:59"),                                           // 11: mmss  -> mm:ss
189103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1999\\u5E741\\u6708"),                      // 12: yyyyMMMM  -> y\u5E74M\u6708
190103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1\\u670813\\u65E5(\\u6C34)"),               // 13: MMMEd -> M\u6708d\u65E5(EEE)
191103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("13\\u65E5(\\u6C34)"),                       // 14: Ed    -> d\u65E5(EEE)
192103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58:59.123"),                                    // 15: jmmssSSS -> "H:mm:ss.SSS"
19359d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("23:58"),                                           // 16: JJmm
194103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
195103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        // ja@calendar=japanese                                           // 6 ja@calendar=japanese
19627f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("\\u5E73\\u621011/1"),                       // 00: yM    -> Gy/m
19727f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("\\u5E73\\u621011\\u5E741\\u6708"),          // 01: yMMM  -> Gy\u5E74M\u6708
19827f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("\\u5E73\\u621011/1/13"),                    // 02: yMd   -> Gy/m/d
19927f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("\\u5E73\\u621011\\u5E741\\u670813\\u65E5"), // 03: yMMMd -> Gy\u5E74M\u6708d\u65E5
20027f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1/13"),                                            // 04: Md    -> M/d
20127f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("1\\u670813\\u65E5"),                        // 05: MMMd  -> M\u6708d\u65E5
202103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1\\u670813\\u65E5"),                        // 06: MMMMd  -> M\u6708d\u65E5
20359d709d503bab6e2b61931737e662dd293b40578ccornelius        CharsToUnicodeString("\\u5E73\\u6210 11 Q1"),                     // 07: yQQQ  -> G y QQQ
204103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u5348\\u5F8C11:58"),                      // 08: hhmm  ->
205103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                                           // 09: HHmm  -> HH:mm          (as for ja)
206103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                                           // 10: jjmm
207103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58:59"),                                           // 11: mmss  -> mm:ss          (as for ja)
208103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u5E73\\u621011\\u5E741\\u6708"),          // 12: yyyyMMMM  -> Gyyyy\u5E74M\u6708
209103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1\\u670813\\u65E5(\\u6C34)"),               // 13: MMMEd -> M\u6708d\u65E5(EEE)
210103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("13\\u65E5(\\u6C34)"),                       // 14: Ed    -> d\u65E5(EEE)
211103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58:59.123"),                                    // 15: jmmssSSS -> "H:mm:ss.SSS"
21259d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("23:58"),                                           // 16: JJmm
213103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
214103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        // zh_Hans_CN                                                     // 7 zh_Hans_CN
21554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("1999/1", -1, US_INV),                              // 00: yM
21627f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("1999\\u5E741\\u6708"),                      // 01: yMMM  -> yyyy\u5E74MMM (fixed expected result per ticket:6626:)
21754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        CharsToUnicodeString("1999/1/13"),                                // 02: yMd
21827f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("1999\\u5E741\\u670813\\u65E5"),             // 03: yMMMd -> yyyy\u5E74MMMd\u65E5 (fixed expected result per ticket:6626:)
21954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("1/13"),                                            // 04: Md
220103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1\\u670813\\u65E5"),                        // 05: MMMd  -> M\u6708d\u65E5 (fixed expected result per ticket:6626:)
221103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1\\u670813\\u65E5"),                        // 06: MMMMd  -> M\u6708d\u65E5
22254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        CharsToUnicodeString("1999\\u5E74\\u7B2C1\\u5B63\\u5EA6"),        // 07: yQQQ
223103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u4E0B\\u534811:58"),                      // 08: hhmm
224103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                                           // 09: HHmm
225103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u4E0B\\u534811:58"),                      // 10: jjmm
226103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58:59"),                                           // 11: mmss
227103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1999\\u5E741\\u6708"),                      // 12: yyyyMMMM  -> yyyy\u5E74MMM
228103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1\\u670813\\u65E5\\u5468\\u4E09"),          // 13: MMMEd -> MMMd\u65E5EEE
229103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("13\\u65E5\\u5468\\u4E09"),                  // 14: Ed    -> d\u65E5EEE
230103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u4E0B\\u534811:58:59.123"),               // 15: jmmssSSS -> "ah:mm:ss.SSS"
23159d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("11:58"),                                           // 16: JJmm
232103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
233103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        // zh_TW@calendar=roc                                             // 8 zh_TW@calendar=roc
23427f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("\\u6C11\\u570B88/1"),                       // 00: yM    -> Gy/M
23527f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("\\u6C11\\u570B88\\u5E741\\u6708"),          // 01: yMMM  -> Gy\u5E74M\u6708
23627f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("\\u6C11\\u570B88/1/13"),                    // 02: yMd   -> Gy/M/d
23727f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("\\u6C11\\u570B88\\u5E741\\u670813\\u65E5"), // 03: yMMMd -> Gy\u5E74M\u6708d\u65E5
23827f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString("1/13"),                                            // 04: Md    -> M/d
23927f654740f2a26ad62a5c155af9199af9e69b889claireho        CharsToUnicodeString("1\\u670813\\u65E5"),                        // 05: MMMd  ->M\u6708d\u65E5
240103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1\\u670813\\u65E5"),                        // 06: MMMMd  ->M\u6708d\u65E5
2418393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        CharsToUnicodeString("\\u6C11\\u570B88\\u5E741\\u5B63"),          // 07: yQQQ  -> Gy QQQ
242103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u4E0B\\u534811:58"),                      // 08: hhmm  ->
243103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                                           // 09: HHmm  ->
244103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u4E0B\\u534811:58"),                      // 10: jjmm
245103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58:59"),                                           // 11: mmss  ->
246103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u6C11\\u570B88\\u5E741\\u6708"),          // 12: yyyyMMMM  -> Gy\u5E74M\u670
247103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("1\\u670813\\u65E5\\u9031\\u4E09"),          // 13: MMMEd -> M\u6708d\u65E5EEE
248103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("13\\u65E5\\uff08\\u9031\\u4E09\\uff09"),    // 14: Ed    -> d\u65E5\\uff08EEEi\\uff09
249103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u4E0B\\u534811:58:59.123"),               // 15: jmmssSSS -> "ah:mm:ss.SSS"
25059d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("11:58"),                                           // 16: JJmm
251103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
252103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        // ru                                                             // 9 ru
253103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("01.1999"),                                         // 00: yM    -> MM.y
254b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        CharsToUnicodeString("\\u042F\\u043D\\u0432. 1999"),              // 01: yMMM  -> LLL y
2558393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        UnicodeString("13.01.1999"),                                      // 02: yMd   -> dd.MM.y
25654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        CharsToUnicodeString("13 \\u044F\\u043D\\u0432. 1999 \\u0433."),  // 03: yMMMd -> d MMM y
2578393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        UnicodeString("13.01"),                                           // 04: Md    -> dd.MM
258103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("13 \\u044F\\u043D\\u0432."),                // 05: MMMd  -> d MMM
259103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("13 \\u044F\\u043D\\u0432\\u0430\\u0440\\u044F"), // 06: MMMMd  -> d MMMM
26054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        CharsToUnicodeString("1-\\u0439 \\u043A\\u0432. 1999 \\u0433."),  // 07: yQQQ  -> y QQQ
261fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UnicodeString("11:58 PM"),                                        // 07: hhmm  -> hh:mm a
262103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                                           // 09: HHmm  -> HH:mm
263103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                                           // 10: jjmm  -> HH:mm
264103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58:59"),                                           // 11: mmss  -> mm:ss
265103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u042F\\u043D\\u0432\\u0430\\u0440\\u044C 1999"), // 12: yyyyMMMM -> LLLL y
266103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u0421\\u0440, 13 \\u044F\\u043D\\u0432."), // 13: MMMEd -> ccc, d MMM
267103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u0421\\u0440, 13"),                       // 14: Ed    -> EEE, d
268103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58:59,123"),                                    // 15: jmmssSSS -> "H:mm:ss,SSS"
26959d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("23:58"),                                           // 16: JJmm
270103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
271103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        // zh@calendar=chinese                                            // 10 zh@calendar=chinese
272fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        CharsToUnicodeString("\\u620A\\u5BC5\\u5E74\\u51AC\\u6708"),      // 00: yMMM
273fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        CharsToUnicodeString("\\u620A\\u5BC5\\u5E74\\u51AC\\u6708"),      // 01: yMMM
274fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        CharsToUnicodeString("\\u620A\\u5BC5\\u5E74\\u51AC\\u670826\\u65E5"), // 02: yMMMd
275fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        CharsToUnicodeString("\\u620A\\u5BC5\\u5E74\\u51AC\\u670826\\u65E5"), // 03: yMMMd
276103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("11-26"),                                           // 04: Md
277fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        CharsToUnicodeString("\\u51AC\\u670826\\u65E5"),                  // 05: MMMd
278fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        CharsToUnicodeString("\\u51AC\\u670826\\u65E5"),                  // 06: MMMMd
27954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        CharsToUnicodeString("\\u620A\\u5BC5\\u5E74\\u7b2c\\u56db\\u5B63\\u5EA6"),    // 07: yQQQ
280103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u4E0B\\u534811:58"),                      // 08: hhmm
281103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("23:58"),                                           // 09: HHmm
282103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u4E0B\\u534811:58"),                      // 10: jjmm
283103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("58:59"),                                           // 11: mmss
284fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        CharsToUnicodeString("\\u620A\\u5BC5\\u5E74\\u51AC\\u6708"),      // 12: yyyyMMMM
285fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        CharsToUnicodeString("\\u51AC\\u670826\\u65E5\\u5468\\u4E09"),    // 13: MMMEd
286103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("26\\u65E5\\u5468\\u4E09"),                  // 14: Ed    -> d\u65E5EEE
287103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CharsToUnicodeString("\\u4E0B\\u534811:58:59.123"),               // 15: jmmssSS
28859d709d503bab6e2b61931737e662dd293b40578ccornelius        UnicodeString("11:58"),                                           // 16: JJmm
289b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString(),
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
293c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UnicodeString patternTests2[] = {
294c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("yyyyMMMdd"),
295b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString("yyyyqqqq"),
296b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString("yMMMdd"),
297c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("EyyyyMMMdd"),
298c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("yyyyMMdd"),
299c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("yyyyMMM"),
300c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("yyyyMM"),
301c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("yyMM"),
302c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("yMMMMMd"),
303c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("EEEEEMMMMMd"),
304c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("MMMd"),
305c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("MMMdhmm"),
306c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("EMMMdhmms"),
307c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("MMdhmm"),
308c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("EEEEMMMdhmms"),
309c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("yyyyMMMddhhmmss"),
310c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("EyyyyMMMddhhmmss"),
311c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("hmm"),
312c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("hhmm"),
313b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString("hhmmVVVV"),
314c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString(""),
315c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    };
316c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UnicodeString patternResults2[] = {
317c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("Oct 14, 1999"),
318b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString("4th quarter 1999"),
319b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString("Oct 14, 1999"),
320c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("Thu, Oct 14, 1999"),
321c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("10/14/1999"),
322c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("Oct 1999"),
323c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("10/1999"),
324c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("10/99"),
325b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString("O 14, 1999"),
326c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("T, O 14"),
327c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("Oct 14"),
32854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("Oct 14, 6:58 AM"),
32954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("Thu, Oct 14, 6:58:59 AM"),
33054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("10/14, 6:58 AM"),
33154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("Thursday, Oct 14, 6:58:59 AM"),
33254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("Oct 14, 1999, 6:58:59 AM"),
33354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString("Thu, Oct 14, 1999, 6:58:59 AM"),
334c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString("6:58 AM"),
33550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UnicodeString("6:58 AM"),
336b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UnicodeString("6:58 AM GMT"),
337c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString(""),
338c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    };
339c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // results for getSkeletons() and getPatternForSkeleton()
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UnicodeString testSkeletonsResults[] = {
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString("HH:mm"),
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString("MMMMd"),
344103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("MMMMMdd"),
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UnicodeString testBaseSkeletonsResults[] = {
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString("Hm"),
349103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("MMMMd"),
350103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UnicodeString("MMMMMd"),
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString newDecimal(" "); // space
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString newAppendItemName("hrs.");
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString newAppendItemFormat("{1} {0}");
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString newDateTimeFormat("{1} {0}");
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString conflictingPattern;
35959d709d503bab6e2b61931737e662dd293b40578ccornelius    UDateTimePatternConflict conflictingStatus = UDATPG_NO_CONFLICT;
36059d709d503bab6e2b61931737e662dd293b40578ccornelius    (void)conflictingStatus;   // Suppress set but not used warning.
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ======= Test CreateInstance with default locale
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing DateTimePatternGenerator createInstance from default locale");
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateTimePatternGenerator *instFromDefaultLocale=DateTimePatternGenerator::createInstance(status);
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataerrln("ERROR: Could not create DateTimePatternGenerator (default) - exitting");
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete instFromDefaultLocale;
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ======= Test CreateInstance with given locale
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing DateTimePatternGenerator createInstance from French locale");
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateTimePatternGenerator *instFromLocale=DateTimePatternGenerator::createInstance(Locale::getFrench(), status);
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataerrln("ERROR: Could not create DateTimePatternGenerator (Locale::getFrench()) - exitting");
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ======= Test clone DateTimePatternGenerator
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing DateTimePatternGenerator::clone()");
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString decimalSymbol = instFromLocale->getDecimal();
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString newDecimalSymbol = UnicodeString("*");
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    decimalSymbol = instFromLocale->getDecimal();
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    instFromLocale->setDecimal(newDecimalSymbol);
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateTimePatternGenerator *cloneDTPatternGen=instFromLocale->clone();
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    decimalSymbol = cloneDTPatternGen->getDecimal();
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (decimalSymbol != newDecimalSymbol) {
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: inconsistency is found in cloned object.");
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( !(*cloneDTPatternGen == *instFromLocale) ) {
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: inconsistency is found in cloned object.");
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( *cloneDTPatternGen != *instFromLocale ) {
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: inconsistency is found in cloned object.");
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete instFromLocale;
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cloneDTPatternGen;
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ======= Test simple use cases
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing simple use cases");
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale deLocale=Locale::getGermany();
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate sampleDate=LocaleTest::date(99, 9, 13, 23, 58, 59);
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateTimePatternGenerator *gen = DateTimePatternGenerator::createInstance(deLocale, status);
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataerrln("ERROR: Could not create DateTimePatternGenerator (Locale::getGermany()) - exitting");
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString findPattern = gen->getBestPattern(UnicodeString("MMMddHmm"), status);
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat *format = new SimpleDateFormat(findPattern, deLocale, status);
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataerrln("ERROR: Could not create SimpleDateFormat (Locale::getGermany())");
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete gen;
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *zone = TimeZone::createTimeZone(UnicodeString("ECT"));
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (zone==NULL) {
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataerrln("ERROR: Could not create TimeZone ECT");
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete gen;
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete format;
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    format->setTimeZone(*zone);
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString dateReturned, expectedResult;
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dateReturned.remove();
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dateReturned = format->format(sampleDate, dateReturned, status);
43654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    expectedResult=UnicodeString("14. Okt. 08:58", -1, US_INV);
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( dateReturned != expectedResult ) {
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: Simple test in getBestPattern with Locale::getGermany()).");
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // add new pattern
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
442c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    conflictingStatus = gen->addPattern(UnicodeString("d'. von' MMMM", -1, US_INV), true, conflictingPattern, status);
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: Could not addPattern - d\'. von\' MMMM");
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString testPattern=gen->getBestPattern(UnicodeString("MMMMdd"), status);
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testPattern=gen->getBestPattern(UnicodeString("MMMddHmm"), status);
44950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    format->applyPattern(gen->getBestPattern(UnicodeString("MMMMdHmm"), status));
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dateReturned.remove();
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dateReturned = format->format(sampleDate, dateReturned, status);
45250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    expectedResult=UnicodeString("14. von Oktober 08:58", -1, US_INV);
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( dateReturned != expectedResult ) {
45450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errln(UnicodeString("ERROR: Simple test addPattern failed!: d\'. von\' MMMM   Got: ") + dateReturned + UnicodeString(" Expected: ") + expectedResult);
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete format;
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // get a pattern and modify it
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    format = (SimpleDateFormat *)DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull,
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                                  deLocale);
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    format->setTimeZone(*zone);
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pattern;
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern = format->toPattern(pattern);
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dateReturned.remove();
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dateReturned = format->format(sampleDate, dateReturned, status);
466b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    expectedResult=CharsToUnicodeString("Donnerstag, 14. Oktober 1999 08:58:59 Mitteleurop\\u00E4ische Sommerzeit");
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( dateReturned != expectedResult ) {
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: Simple test uses full date format.");
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString(" Got: ") + dateReturned + UnicodeString(" Expected: ") + expectedResult);
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // modify it to change the zone.
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString newPattern = gen->replaceFieldTypes(pattern, UnicodeString("vvvv"), status);
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    format->applyPattern(newPattern);
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dateReturned.remove();
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dateReturned = format->format(sampleDate, dateReturned, status);
477103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    expectedResult=CharsToUnicodeString("Donnerstag, 14. Oktober 1999 08:58:59 Mitteleurop\\u00E4ische Zeit");
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( dateReturned != expectedResult ) {
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: Simple test modify the timezone!");
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString(" Got: ")+ dateReturned + UnicodeString(" Expected: ") + expectedResult);
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // setDeciaml(), getDeciaml()
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gen->setDecimal(newDecimal);
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (newDecimal != gen->getDecimal()) {
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: unexpected result from setDecimal() and getDecimal()!.\n");
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // setAppenItemName() , getAppendItemName()
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gen->setAppendItemName(UDATPG_HOUR_FIELD, newAppendItemName);
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (newAppendItemName != gen->getAppendItemName(UDATPG_HOUR_FIELD)) {
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: unexpected result from setAppendItemName() and getAppendItemName()!.\n");
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // setAppenItemFormat() , getAppendItemFormat()
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gen->setAppendItemFormat(UDATPG_HOUR_FIELD, newAppendItemFormat);
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (newAppendItemFormat != gen->getAppendItemFormat(UDATPG_HOUR_FIELD)) {
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: unexpected result from setAppendItemFormat() and getAppendItemFormat()!.\n");
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // setDateTimeFormat() , getDateTimeFormat()
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gen->setDateTimeFormat(newDateTimeFormat);
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (newDateTimeFormat != gen->getDateTimeFormat()) {
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: unexpected result from setDateTimeFormat() and getDateTimeFormat()!.\n");
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ======== Test getSkeleton and getBaseSkeleton
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern = UnicodeString("dd-MMM");
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString expectedSkeleton = UnicodeString("MMMdd");
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString expectedBaseSkeleton = UnicodeString("MMMd");
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString retSkeleton = gen->getSkeleton(pattern, status);
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status) || retSkeleton != expectedSkeleton ) {
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln("ERROR: Unexpected result from getSkeleton().\n");
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln(UnicodeString(" Got: ") + retSkeleton + UnicodeString(" Expected: ") + expectedSkeleton );
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    retSkeleton = gen->getBaseSkeleton(pattern, status);
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status) || retSkeleton !=  expectedBaseSkeleton) {
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln("ERROR: Unexpected result from getBaseSkeleton().\n");
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln(UnicodeString(" Got: ") + retSkeleton + UnicodeString(" Expected:")+ expectedBaseSkeleton);
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern = UnicodeString("dd/MMMM/yy");
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectedSkeleton = UnicodeString("yyMMMMdd");
525103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    expectedBaseSkeleton = UnicodeString("yMMMMd");
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    retSkeleton = gen->getSkeleton(pattern, status);
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status) || retSkeleton != expectedSkeleton ) {
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln("ERROR: Unexpected result from getSkeleton().\n");
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln(UnicodeString(" Got: ") + retSkeleton + UnicodeString(" Expected: ") + expectedSkeleton );
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    retSkeleton = gen->getBaseSkeleton(pattern, status);
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status) || retSkeleton !=  expectedBaseSkeleton) {
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln("ERROR: Unexpected result from getBaseSkeleton().\n");
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln(UnicodeString(" Got: ") + retSkeleton + UnicodeString(" Expected:")+ expectedBaseSkeleton);
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete format;
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zone;
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete gen;
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
540c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
541c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        // Trac# 6104
542c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        status = U_ZERO_ERROR;
543c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        pattern = UnicodeString("YYYYMMM");
544b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString expR = CharsToUnicodeString("1999\\u5E741\\u6708"); // fixed expected result per ticket:6626:
545c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        Locale loc("ja");
546c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UDate testDate1= LocaleTest::date(99, 0, 13, 23, 58, 59);
547c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        DateTimePatternGenerator *patGen=DateTimePatternGenerator::createInstance(loc, status);
548c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if(U_FAILURE(status)) {
549c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            dataerrln("ERROR: Could not create DateTimePatternGenerator");
550c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            return;
551c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
552c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString bPattern = patGen->getBestPattern(pattern, status);
553c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString rDate;
554c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        SimpleDateFormat sdf(bPattern, loc, status);
555c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        rDate.remove();
556c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        rDate = sdf.format(testDate1, rDate);
557c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
558c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        logln(UnicodeString(" ja locale with skeleton: YYYYMMM  Best Pattern:") + bPattern);
559c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        logln(UnicodeString("  Formatted date:") + rDate);
560c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
561c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if ( expR!= rDate ) {
562c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            errln(UnicodeString("\nERROR: Test Japanese month hack Got: ") + rDate +
563c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                  UnicodeString(" Expected: ") + expR );
564c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
565c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
566c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        delete patGen;
567c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
568c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {   // Trac# 6104
569c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        Locale loc("zh");
570b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UnicodeString expR = CharsToUnicodeString("1999\\u5E741\\u6708"); // fixed expected result per ticket:6626:
571c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UDate testDate1= LocaleTest::date(99, 0, 13, 23, 58, 59);
572c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        DateTimePatternGenerator *patGen=DateTimePatternGenerator::createInstance(loc, status);
573c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if(U_FAILURE(status)) {
574c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            dataerrln("ERROR: Could not create DateTimePatternGenerator");
575c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            return;
576c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
577c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString bPattern = patGen->getBestPattern(pattern, status);
578c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString rDate;
579c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        SimpleDateFormat sdf(bPattern, loc, status);
580c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        rDate.remove();
581c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        rDate = sdf.format(testDate1, rDate);
582c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
583c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        logln(UnicodeString(" zh locale with skeleton: YYYYMMM  Best Pattern:") + bPattern);
584c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        logln(UnicodeString("  Formatted date:") + rDate);
585c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if ( expR!= rDate ) {
586c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            errln(UnicodeString("\nERROR: Test Chinese month hack Got: ") + rDate +
587c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                  UnicodeString(" Expected: ") + expR );
588c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
589c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        delete patGen;
590c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
591c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
592c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
593c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         // Trac# 6172 duplicate time pattern
594c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         status = U_ZERO_ERROR;
595c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         pattern = UnicodeString("hmv");
596b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru         UnicodeString expR = UnicodeString("h:mm a v"); // avail formats has hm -> "h:mm a" (fixed expected result per ticket:6626:)
597c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         Locale loc("en");
598c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         DateTimePatternGenerator *patGen=DateTimePatternGenerator::createInstance(loc, status);
599c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         if(U_FAILURE(status)) {
600c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru             dataerrln("ERROR: Could not create DateTimePatternGenerator");
601c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru             return;
602c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         }
603c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         UnicodeString bPattern = patGen->getBestPattern(pattern, status);
604c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         logln(UnicodeString(" en locale with skeleton: hmv  Best Pattern:") + bPattern);
605c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
606c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         if ( expR!= bPattern ) {
607c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru             errln(UnicodeString("\nERROR: Test EN time format Got: ") + bPattern +
608c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                   UnicodeString(" Expected: ") + expR );
609c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         }
610c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
611c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         delete patGen;
612c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     }
613c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
614c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ======= Test various skeletons.
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing DateTimePatternGenerator with various skeleton");
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t localeIndex=0;
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultIndex=0;
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString resultDate;
622b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UDate testDate= LocaleTest::date(99, 0, 13, 23, 58, 59) + 123.0;
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (localeIndex < MAX_LOCALE )
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t dataIndex=0;
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString bestPattern;
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
628b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        Locale loc(testLocale[localeIndex][0], testLocale[localeIndex][1], testLocale[localeIndex][2], testLocale[localeIndex][3]);
629b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        logln("\n\n Locale: %s_%s_%s@%s", testLocale[localeIndex][0], testLocale[localeIndex][1], testLocale[localeIndex][2], testLocale[localeIndex][3]);
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        DateTimePatternGenerator *patGen=DateTimePatternGenerator::createInstance(loc, status);
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)) {
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dataerrln("ERROR: Could not create DateTimePatternGenerator with locale index:%d . - exitting\n", localeIndex);
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while (patternData[dataIndex].length() > 0) {
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log(patternData[dataIndex]);
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            bestPattern = patGen->getBestPattern(patternData[dataIndex++], status);
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(UnicodeString(" -> ") + bestPattern);
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            SimpleDateFormat sdf(bestPattern, loc, status);
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            resultDate.remove();
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            resultDate = sdf.format(testDate, resultDate);
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if ( resultDate != patternResults[resultIndex] ) {
644b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                errln(UnicodeString("\nERROR: Test various skeletons[") + (dataIndex-1) + UnicodeString("], localeIndex ") + localeIndex +
64527f654740f2a26ad62a5c155af9199af9e69b889claireho                      UnicodeString(". Got: \"") + resultDate + UnicodeString("\" Expected: \"") + patternResults[resultIndex] + "\"" );
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            resultIndex++;
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete patGen;
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        localeIndex++;
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
653c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
654c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // ======= More tests ticket#6110
655c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    logln("Testing DateTimePatternGenerator with various skeleton");
656c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
657c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
658c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    localeIndex=0;
659c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    resultIndex=0;
660c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    testDate= LocaleTest::date(99, 9, 13, 23, 58, 59);
661c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
662c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        int32_t dataIndex=0;
663c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString bestPattern;
664c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        logln("\n\n Test various skeletons for English locale...");
665c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        DateTimePatternGenerator *patGen=DateTimePatternGenerator::createInstance(Locale::getEnglish(), status);
666c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if(U_FAILURE(status)) {
667c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            dataerrln("ERROR: Could not create DateTimePatternGenerator with locale English . - exitting\n");
668c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            return;
669c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
670c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TimeZone *enZone = TimeZone::createTimeZone(UnicodeString("ECT/GMT"));
671c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (enZone==NULL) {
672c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            dataerrln("ERROR: Could not create TimeZone ECT");
673c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            delete patGen;
674c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            return;
675c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
676c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        SimpleDateFormat *enFormat = (SimpleDateFormat *)DateFormat::createDateTimeInstance(DateFormat::kFull,
677c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                         DateFormat::kFull, Locale::getEnglish());
678c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        enFormat->setTimeZone(*enZone);
679c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        while (patternTests2[dataIndex].length() > 0) {
680c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            logln(patternTests2[dataIndex]);
681c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            bestPattern = patGen->getBestPattern(patternTests2[dataIndex], status);
682c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            logln(UnicodeString(" -> ") + bestPattern);
683c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            enFormat->applyPattern(bestPattern);
684c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            resultDate.remove();
685c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            resultDate = enFormat->format(testDate, resultDate);
686c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            if ( resultDate != patternResults2[resultIndex] ) {
687c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                errln(UnicodeString("\nERROR: Test various skeletons[") + dataIndex
688c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    + UnicodeString("]. Got: ") + resultDate + UnicodeString(" Expected: ") +
689c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    patternResults2[resultIndex] );
690c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
691c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            dataIndex++;
692c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            resultIndex++;
693c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
694c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        delete patGen;
695c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        delete enZone;
696c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        delete enFormat;
697c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ======= Test random skeleton
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateTimePatternGenerator *randDTGen= DateTimePatternGenerator::createInstance(status);
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataerrln("ERROR: Could not create DateTimePatternGenerator (Locale::getFrench()) - exitting");
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar newChar;
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<10; ++i) {
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString randomSkeleton;
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t len = rand() % 20;
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int32_t j=0; j<len; ++j ) {
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            while ((newChar = (UChar)(rand()%0x7f))>=(UChar)0x20) {
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                randomSkeleton += newChar;
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString bestPattern = randDTGen->getBestPattern(randomSkeleton, status);
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete randDTGen;
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // UnicodeString randomString=Unicode
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ======= Test getStaticClassID()
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing getStaticClassID()");
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateTimePatternGenerator *test= DateTimePatternGenerator::createInstance(status);
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(test->getDynamicClassID() != DateTimePatternGenerator::getStaticClassID()) {
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: getDynamicClassID() didn't return the expected value");
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete test;
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ====== Test createEmptyInstance()
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing createEmptyInstance()");
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test = DateTimePatternGenerator::createEmptyInstance(status);
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln("ERROR: Fail to create an empty instance ! - exitting.\n");
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         delete test;
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         return;
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    conflictingStatus = test->addPattern(UnicodeString("MMMMd"), true, conflictingPattern, status);
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testPattern=test->getBestPattern(UnicodeString("MMMMdd"), status);
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    conflictingStatus = test->addPattern(UnicodeString("HH:mm"), true, conflictingPattern, status);
749103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    conflictingStatus = test->addPattern(UnicodeString("MMMMMdd"), true, conflictingPattern, status); //duplicate pattern
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringEnumeration *output=NULL;
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    output = test->getRedundants(status);
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectedResult=UnicodeString("MMMMd");
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (output != NULL) {
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        output->reset(status);
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UnicodeString *dupPattern=output->snext(status);
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( (dupPattern==NULL) || (*dupPattern != expectedResult) ) {
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("ERROR: Fail in getRedundants !\n");
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ======== Test getSkeletons and getBaseSkeletons
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringEnumeration* ptrSkeletonEnum = test->getSkeletons(status);
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: Fail to get skeletons !\n");
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString returnPattern, *ptrSkeleton;
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ptrSkeletonEnum->reset(status);
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t count=ptrSkeletonEnum->count(status);
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<count; ++i) {
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ptrSkeleton = (UnicodeString *)ptrSkeletonEnum->snext(status);
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        returnPattern = test->getPatternForSkeleton(*ptrSkeleton);
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( returnPattern != testSkeletonsResults[i] ) {
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("ERROR: Unexpected result from getSkeletons and getPatternForSkeleton\nGot: ") + returnPattern
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               + UnicodeString("\nExpected: ") + testSkeletonsResults[i]
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               + UnicodeString("\n"));
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringEnumeration* ptrBaseSkeletonEnum = test->getBaseSkeletons(status);
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR: Fail to get base skeletons !\n");
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count=ptrBaseSkeletonEnum->count(status);
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<count; ++i) {
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ptrSkeleton = (UnicodeString *)ptrBaseSkeletonEnum->snext(status);
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( *ptrSkeleton != testBaseSkeletonsResults[i] ) {
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("ERROR: Unexpected result from getBaseSkeletons() !\n");
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
790c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // ========= DateTimePatternGenerator sample code in Userguide
791c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // set up the generator
792c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    Locale locale = Locale::getFrench();
793c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR;
794c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    DateTimePatternGenerator *generator = DateTimePatternGenerator::createInstance( locale, status);
795c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
796c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // get a pattern for an abbreviated month and day
797c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    pattern = generator->getBestPattern(UnicodeString("MMMd"), status);
798c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    SimpleDateFormat formatter(pattern, locale, status);
799c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
800c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    zone = TimeZone::createTimeZone(UnicodeString("GMT"));
801c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    formatter.setTimeZone(*zone);
802c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // use it to format (or parse)
803c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UnicodeString formatted;
804c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    formatted = formatter.format(Calendar::getNow(), formatted, status);
805c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // for French, the result is "13 sept."
806c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    formatted.remove();
807c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // cannot use the result from getNow() because the value change evreyday.
808c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    testDate= LocaleTest::date(99, 0, 13, 23, 58, 59);
809c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    formatted = formatter.format(testDate, formatted, status);
810c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    expectedResult=UnicodeString("14 janv.");
811c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if ( formatted != expectedResult ) {
812c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        errln("ERROR: Userguide sample code result!");
813c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        errln(UnicodeString(" Got: ")+ formatted + UnicodeString(" Expected: ") + expectedResult);
814c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
815c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
816c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    delete zone;
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete output;
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete ptrSkeletonEnum;
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete ptrBaseSkeletonEnum;
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete test;
821c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    delete generator;
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
82450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/**
82550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Test handling of options
82650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
82750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * For reference, as of ICU 4.3.3,
82850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *  root/gregorian has
82950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      Hm{"H:mm"}
83050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      Hms{"H:mm:ss"}
83150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      hm{"h:mm a"}
83250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      hms{"h:mm:ss a"}
83350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *  en/gregorian has
83450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      Hm{"H:mm"}
83550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      Hms{"H:mm:ss"}
83650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      hm{"h:mm a"}
83750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *  be/gregorian has
83850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      HHmmss{"HH.mm.ss"}
83950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      Hm{"HH.mm"}
84050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      hm{"h.mm a"}
84150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *      hms{"h.mm.ss a"}
84250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */
84350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehotypedef struct DTPtnGenOptionsData {
84450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *locale;
84550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *skel;
84650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *expectedPattern;
84750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UDateTimePatternMatchOptions    options;
84850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} DTPtnGenOptionsData;
84950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid IntlTestDateTimePatternGeneratorAPI::testOptions(/*char *par*/)
85050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
85150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    DTPtnGenOptionsData testData[] = {
85250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    //   locale  skel   expectedPattern     options
85350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "en", "Hmm",  "HH:mm",   UDATPG_MATCH_NO_OPTIONS        },
85450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "en", "HHmm", "HH:mm",   UDATPG_MATCH_NO_OPTIONS        },
85550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "en", "hhmm", "h:mm a",  UDATPG_MATCH_NO_OPTIONS        },
85650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "en", "Hmm",  "HH:mm",   UDATPG_MATCH_HOUR_FIELD_LENGTH },
85750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "en", "HHmm", "HH:mm",   UDATPG_MATCH_HOUR_FIELD_LENGTH },
85850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "en", "hhmm", "hh:mm a", UDATPG_MATCH_HOUR_FIELD_LENGTH },
85950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "be", "Hmm",  "HH.mm",   UDATPG_MATCH_NO_OPTIONS        },
86050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "be", "HHmm", "HH.mm",   UDATPG_MATCH_NO_OPTIONS        },
86150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "be", "hhmm", "h.mm a",  UDATPG_MATCH_NO_OPTIONS        },
86250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "be", "Hmm",  "H.mm",    UDATPG_MATCH_HOUR_FIELD_LENGTH },
86350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "be", "HHmm", "HH.mm",   UDATPG_MATCH_HOUR_FIELD_LENGTH },
86450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { "be", "hhmm", "hh.mm a", UDATPG_MATCH_HOUR_FIELD_LENGTH },
86559d709d503bab6e2b61931737e662dd293b40578ccornelius        //
866fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en",                   "yyyy",  "yyyy",  UDATPG_MATCH_NO_OPTIONS },
867fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en",                   "YYYY",  "YYYY",  UDATPG_MATCH_NO_OPTIONS },
868fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en",                   "U",     "y",     UDATPG_MATCH_NO_OPTIONS },
869fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en@calendar=japanese", "yyyy",  "y G",   UDATPG_MATCH_NO_OPTIONS },
870fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en@calendar=japanese", "YYYY",  "Y G",   UDATPG_MATCH_NO_OPTIONS },
871fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en@calendar=japanese", "U",     "y G",   UDATPG_MATCH_NO_OPTIONS },
872fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en@calendar=chinese",  "yyyy",  "U",     UDATPG_MATCH_NO_OPTIONS },
873fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en@calendar=chinese",  "YYYY",  "Y",     UDATPG_MATCH_NO_OPTIONS },
874fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en@calendar=chinese",  "U",     "U",     UDATPG_MATCH_NO_OPTIONS },
875fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en@calendar=chinese",  "Gy",    "U",     UDATPG_MATCH_NO_OPTIONS },
876fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en@calendar=chinese",  "GU",    "U",     UDATPG_MATCH_NO_OPTIONS },
877fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en@calendar=chinese",  "ULLL",  "MMM U", UDATPG_MATCH_NO_OPTIONS },
878fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en@calendar=chinese",  "yMMM",  "MMM U", UDATPG_MATCH_NO_OPTIONS },
879fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "en@calendar=chinese",  "GUMMM", "MMM U", UDATPG_MATCH_NO_OPTIONS },
880fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "zh@calendar=chinese",  "yyyy",  "U\\u5E74",    UDATPG_MATCH_NO_OPTIONS },
881fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "zh@calendar=chinese",  "YYYY",  "Y\\u5E74",    UDATPG_MATCH_NO_OPTIONS },
882fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "zh@calendar=chinese",  "U",     "U\\u5E74",    UDATPG_MATCH_NO_OPTIONS },
883fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "zh@calendar=chinese",  "Gy",    "U\\u5E74",    UDATPG_MATCH_NO_OPTIONS },
884fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "zh@calendar=chinese",  "GU",    "U\\u5E74",    UDATPG_MATCH_NO_OPTIONS },
885fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "zh@calendar=chinese",  "ULLL",  "U\\u5E74MMM", UDATPG_MATCH_NO_OPTIONS },
886fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "zh@calendar=chinese",  "yMMM",  "U\\u5E74MMM", UDATPG_MATCH_NO_OPTIONS },
887fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        { "zh@calendar=chinese",  "GUMMM", "U\\u5E74MMM", UDATPG_MATCH_NO_OPTIONS },
88850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    };
88950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
89050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int count = sizeof(testData) / sizeof(testData[0]);
89150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const DTPtnGenOptionsData * testDataPtr = testData;
89250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
89350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    for (; count-- > 0; ++testDataPtr) {
89450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UErrorCode status = U_ZERO_ERROR;
89550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
89650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        Locale locale(testDataPtr->locale);
89750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UnicodeString skel(testDataPtr->skel);
898fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UnicodeString expectedPattern(UnicodeString(testDataPtr->expectedPattern).unescape());
89950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UDateTimePatternMatchOptions options = testDataPtr->options;
90050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
90150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        DateTimePatternGenerator * dtpgen = DateTimePatternGenerator::createInstance(locale, status);
90250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (U_FAILURE(status)) {
90350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            dataerrln("Unable to create DateTimePatternGenerator instance for locale(%s): %s", locale.getName(), u_errorName(status));
90450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            delete dtpgen;
90550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            continue;
90650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
90750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UnicodeString pattern = dtpgen->getBestPattern(skel, options, status);
90850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (pattern.compare(expectedPattern) != 0) {
90950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            errln( UnicodeString("ERROR in getBestPattern, locale ") + UnicodeString(testDataPtr->locale) +
91050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   UnicodeString(", skeleton ") + skel +
91150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   ((options)?UnicodeString(", options!=0"):UnicodeString(", options==0")) +
91250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   UnicodeString(", expected pattern ") + expectedPattern +
91350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   UnicodeString(", got ") + pattern );
91450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
91550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        delete dtpgen;
91650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
91750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
91850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
91959d709d503bab6e2b61931737e662dd293b40578ccornelius/**
92059d709d503bab6e2b61931737e662dd293b40578ccornelius * Test that DTPG can handle all valid pattern character / length combinations
92159d709d503bab6e2b61931737e662dd293b40578ccornelius *
92259d709d503bab6e2b61931737e662dd293b40578ccornelius */
92359d709d503bab6e2b61931737e662dd293b40578ccornelius#define FIELD_LENGTHS_COUNT 6
92459d709d503bab6e2b61931737e662dd293b40578ccornelius#define FIELD_LENGTH_MAX 8
92559d709d503bab6e2b61931737e662dd293b40578ccornelius#define MUST_INCLUDE_COUNT 5
92659d709d503bab6e2b61931737e662dd293b40578ccornelius
92759d709d503bab6e2b61931737e662dd293b40578ccorneliustypedef struct AllFieldsTestItem {
92859d709d503bab6e2b61931737e662dd293b40578ccornelius    char patternChar;
92959d709d503bab6e2b61931737e662dd293b40578ccornelius    int8_t fieldLengths[FIELD_LENGTHS_COUNT+1]; // up to FIELD_LENGTHS_COUNT lengths to try
93059d709d503bab6e2b61931737e662dd293b40578ccornelius                                                // (length <=FIELD_LENGTH_MAX) plus 0 terminator
93159d709d503bab6e2b61931737e662dd293b40578ccornelius    char mustIncludeOneOf[MUST_INCLUDE_COUNT+1];// resulting pattern must include at least one of
93259d709d503bab6e2b61931737e662dd293b40578ccornelius                                                // these as a pattern char (0-terminated list)
93359d709d503bab6e2b61931737e662dd293b40578ccornelius} AllFieldsTestItem;
93459d709d503bab6e2b61931737e662dd293b40578ccornelius
93559d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid IntlTestDateTimePatternGeneratorAPI::testAllFieldPatterns(/*char *par*/)
93659d709d503bab6e2b61931737e662dd293b40578ccornelius{
93759d709d503bab6e2b61931737e662dd293b40578ccornelius    const char * localeNames[] = {
93859d709d503bab6e2b61931737e662dd293b40578ccornelius        "root",
93959d709d503bab6e2b61931737e662dd293b40578ccornelius        "root@calendar=japanese",
94059d709d503bab6e2b61931737e662dd293b40578ccornelius        "root@calendar=chinese",
94159d709d503bab6e2b61931737e662dd293b40578ccornelius        "en",
94259d709d503bab6e2b61931737e662dd293b40578ccornelius        "en@calendar=japanese",
94359d709d503bab6e2b61931737e662dd293b40578ccornelius        "en@calendar=chinese",
94459d709d503bab6e2b61931737e662dd293b40578ccornelius        NULL // terminator
94559d709d503bab6e2b61931737e662dd293b40578ccornelius    };
94659d709d503bab6e2b61931737e662dd293b40578ccornelius    AllFieldsTestItem testData[] = {
94759d709d503bab6e2b61931737e662dd293b40578ccornelius        //pat   fieldLengths    generated pattern must
94859d709d503bab6e2b61931737e662dd293b40578ccornelius        //chr   to test         include one of these
94959d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'G',  {1,2,3,4,5,0},  "G"    }, // era
95059d709d503bab6e2b61931737e662dd293b40578ccornelius        // year
95159d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'y',  {1,2,3,4,0},    "yU"   }, // year
95259d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'Y',  {1,2,3,4,0},    "Y"    }, // year for week of year
95359d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'u',  {1,2,3,4,5,0},  "yuU"  }, // extended year
95459d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'U',  {1,2,3,4,5,0},  "yU"   }, // cyclic year name
95559d709d503bab6e2b61931737e662dd293b40578ccornelius        // quarter
95659d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'Q',  {1,2,3,4,0},    "Qq"   }, // x
95759d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'q',  {1,2,3,4,0},    "Qq"   }, // standalone
95859d709d503bab6e2b61931737e662dd293b40578ccornelius        // month
95959d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'M',  {1,2,3,4,5,0},  "ML"   }, // x
96059d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'L',  {1,2,3,4,5,0},  "ML"   }, // standalone
96159d709d503bab6e2b61931737e662dd293b40578ccornelius        // week
96259d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'w',  {1,2,0},        "w"    }, // week of year
96359d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'W',  {1,0},          "W"    }, // week of month
96459d709d503bab6e2b61931737e662dd293b40578ccornelius        // day
96559d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'd',  {1,2,0},        "d"    }, // day of month
96659d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'D',  {1,2,3,0},      "D"    }, // day of year
96759d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'F',  {1,0},          "F"    }, // day of week in month
96859d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'g',  {7,0},          "g"    }, // modified julian day
96959d709d503bab6e2b61931737e662dd293b40578ccornelius        // weekday
97059d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'E',  {1,2,3,4,5,6},  "Eec"  }, // day of week
97159d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'e',  {1,2,3,4,5,6},  "Eec"  }, // local day of week
97259d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'c',  {1,2,3,4,5,6},  "Eec"  }, // standalone local day of week
97359d709d503bab6e2b61931737e662dd293b40578ccornelius        // day period
97459d709d503bab6e2b61931737e662dd293b40578ccornelius    //  { 'a',  {1,0},          "a"    }, // am or pm   // not clear this one is supposed to work (it doesn't)
97559d709d503bab6e2b61931737e662dd293b40578ccornelius        // hour
97659d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'h',  {1,2,0},        "hK"   }, // 12 (1-12)
97759d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'H',  {1,2,0},        "Hk"   }, // 24 (0-23)
97859d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'K',  {1,2,0},        "hK"   }, // 12 (0-11)
97959d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'k',  {1,2,0},        "Hk"   }, // 24 (1-24)
98059d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'j',  {1,2,0},        "hHKk" }, // locale default
98159d709d503bab6e2b61931737e662dd293b40578ccornelius        // minute
98259d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'm',  {1,2,0},        "m"    }, // x
98359d709d503bab6e2b61931737e662dd293b40578ccornelius        // second & fractions
98459d709d503bab6e2b61931737e662dd293b40578ccornelius        { 's',  {1,2,0},        "s"    }, // x
98559d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'S',  {1,2,3,4,0},    "S"    }, // fractional second
98659d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'A',  {8,0},          "A"    }, // milliseconds in day
98759d709d503bab6e2b61931737e662dd293b40578ccornelius        // zone
98859d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'z',  {1,2,3,4,0},    "z"    }, // x
98959d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'Z',  {1,2,3,4,5,0},  "Z"    }, // x
99059d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'O',  {1,4,0},        "O"    }, // x
99159d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'v',  {1,4,0},        "v"    }, // x
99259d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'V',  {1,2,3,4,0},    "V"    }, // x
99359d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'X',  {1,2,3,4,5,0},  "X"    }, // x
99459d709d503bab6e2b61931737e662dd293b40578ccornelius        { 'x',  {1,2,3,4,5,0},  "x"    }, // x
99559d709d503bab6e2b61931737e662dd293b40578ccornelius    };
99659d709d503bab6e2b61931737e662dd293b40578ccornelius
99759d709d503bab6e2b61931737e662dd293b40578ccornelius    const char ** localeNamesPtr = localeNames;
99859d709d503bab6e2b61931737e662dd293b40578ccornelius    const char * localeName;
99959d709d503bab6e2b61931737e662dd293b40578ccornelius    while ( (localeName = *localeNamesPtr++) != NULL) {
100059d709d503bab6e2b61931737e662dd293b40578ccornelius        UErrorCode status = U_ZERO_ERROR;
100159d709d503bab6e2b61931737e662dd293b40578ccornelius        Locale locale = Locale::createFromName(localeName);
100259d709d503bab6e2b61931737e662dd293b40578ccornelius        DateTimePatternGenerator * dtpg = DateTimePatternGenerator::createInstance(locale, status);
100359d709d503bab6e2b61931737e662dd293b40578ccornelius        if (U_SUCCESS(status)) {
100459d709d503bab6e2b61931737e662dd293b40578ccornelius            const AllFieldsTestItem * testDataPtr = testData;
100559d709d503bab6e2b61931737e662dd293b40578ccornelius            int itemCount = sizeof(testData) / sizeof(testData[0]);
100659d709d503bab6e2b61931737e662dd293b40578ccornelius            for (; itemCount-- > 0; ++testDataPtr) {
100759d709d503bab6e2b61931737e662dd293b40578ccornelius                char skelBuf[FIELD_LENGTH_MAX];
100859d709d503bab6e2b61931737e662dd293b40578ccornelius                int32_t chrIndx, lenIndx;
100959d709d503bab6e2b61931737e662dd293b40578ccornelius                for (chrIndx = 0; chrIndx < FIELD_LENGTH_MAX; chrIndx++) {
101059d709d503bab6e2b61931737e662dd293b40578ccornelius                    skelBuf[chrIndx] = testDataPtr->patternChar;
101159d709d503bab6e2b61931737e662dd293b40578ccornelius                }
101259d709d503bab6e2b61931737e662dd293b40578ccornelius                for (lenIndx = 0; lenIndx < FIELD_LENGTHS_COUNT; lenIndx++) {
101359d709d503bab6e2b61931737e662dd293b40578ccornelius                    int32_t skelLen = testDataPtr->fieldLengths[lenIndx];
101459d709d503bab6e2b61931737e662dd293b40578ccornelius                    if (skelLen <= 0) {
101559d709d503bab6e2b61931737e662dd293b40578ccornelius                        break;
101659d709d503bab6e2b61931737e662dd293b40578ccornelius                    }
101759d709d503bab6e2b61931737e662dd293b40578ccornelius                    if (skelLen > FIELD_LENGTH_MAX) {
101859d709d503bab6e2b61931737e662dd293b40578ccornelius                        continue;
101959d709d503bab6e2b61931737e662dd293b40578ccornelius                    }
102059d709d503bab6e2b61931737e662dd293b40578ccornelius                    UnicodeString skeleton(skelBuf, skelLen, US_INV);
102159d709d503bab6e2b61931737e662dd293b40578ccornelius                    UnicodeString pattern = dtpg->getBestPattern(skeleton, status);
102259d709d503bab6e2b61931737e662dd293b40578ccornelius                    if (U_FAILURE(status)) {
102359d709d503bab6e2b61931737e662dd293b40578ccornelius                        errln("DateTimePatternGenerator getBestPattern for locale %s, skelChar %c skelLength %d fails: %s",
102459d709d503bab6e2b61931737e662dd293b40578ccornelius                              locale.getName(), testDataPtr->patternChar, skelLen, u_errorName(status));
102559d709d503bab6e2b61931737e662dd293b40578ccornelius                    } else if (pattern.length() <= 0) {
102659d709d503bab6e2b61931737e662dd293b40578ccornelius                        errln("DateTimePatternGenerator getBestPattern for locale %s, skelChar %c skelLength %d produces 0-length pattern",
102759d709d503bab6e2b61931737e662dd293b40578ccornelius                              locale.getName(), testDataPtr->patternChar, skelLen);
102859d709d503bab6e2b61931737e662dd293b40578ccornelius                    } else {
102959d709d503bab6e2b61931737e662dd293b40578ccornelius                        // test that resulting pattern has at least one char in mustIncludeOneOf
103059d709d503bab6e2b61931737e662dd293b40578ccornelius                        UnicodeString mustIncludeOneOf(testDataPtr->mustIncludeOneOf, -1, US_INV);
103159d709d503bab6e2b61931737e662dd293b40578ccornelius                        int32_t patIndx, patLen = pattern.length();
103259d709d503bab6e2b61931737e662dd293b40578ccornelius                        UBool inQuoted = FALSE;
103359d709d503bab6e2b61931737e662dd293b40578ccornelius                        for (patIndx = 0; patIndx < patLen; patIndx++) {
103459d709d503bab6e2b61931737e662dd293b40578ccornelius                            UChar c = pattern.charAt(patIndx);
103559d709d503bab6e2b61931737e662dd293b40578ccornelius                            if (c == 0x27) {
103659d709d503bab6e2b61931737e662dd293b40578ccornelius                                inQuoted = !inQuoted;
103759d709d503bab6e2b61931737e662dd293b40578ccornelius                            } else if (!inQuoted && c <= 0x007A && c >= 0x0041) {
103859d709d503bab6e2b61931737e662dd293b40578ccornelius                                if (mustIncludeOneOf.indexOf(c) >= 0) {
103959d709d503bab6e2b61931737e662dd293b40578ccornelius                                    break;
104059d709d503bab6e2b61931737e662dd293b40578ccornelius                                }
104159d709d503bab6e2b61931737e662dd293b40578ccornelius                            }
104259d709d503bab6e2b61931737e662dd293b40578ccornelius                        }
104359d709d503bab6e2b61931737e662dd293b40578ccornelius                        if (patIndx >= patLen) {
104459d709d503bab6e2b61931737e662dd293b40578ccornelius                            errln(UnicodeString("DateTimePatternGenerator getBestPattern for locale ") +
104559d709d503bab6e2b61931737e662dd293b40578ccornelius                                    UnicodeString(locale.getName(),-1,US_INV) +
104659d709d503bab6e2b61931737e662dd293b40578ccornelius                                    ", skeleton " + skeleton +
104759d709d503bab6e2b61931737e662dd293b40578ccornelius                                    ", produces pattern without required chars: " + pattern);
104859d709d503bab6e2b61931737e662dd293b40578ccornelius                        }
104959d709d503bab6e2b61931737e662dd293b40578ccornelius
105059d709d503bab6e2b61931737e662dd293b40578ccornelius                    }
105159d709d503bab6e2b61931737e662dd293b40578ccornelius                }
105259d709d503bab6e2b61931737e662dd293b40578ccornelius            }
105359d709d503bab6e2b61931737e662dd293b40578ccornelius            delete dtpg;
105459d709d503bab6e2b61931737e662dd293b40578ccornelius        } else {
105559d709d503bab6e2b61931737e662dd293b40578ccornelius            dataerrln("Create DateTimePatternGenerator instance for locale(%s) fails: %s",
105659d709d503bab6e2b61931737e662dd293b40578ccornelius                      locale.getName(), u_errorName(status));
105759d709d503bab6e2b61931737e662dd293b40578ccornelius        }
105859d709d503bab6e2b61931737e662dd293b40578ccornelius    }
105959d709d503bab6e2b61931737e662dd293b40578ccornelius}
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
1061