1// © 2016 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html
3/********************************************************************
4 * COPYRIGHT:
5 * Copyright (c) 1997-2016, International Business Machines Corporation and
6 * others. All Rights Reserved.
7 ********************************************************************/
8
9#ifndef _DATEFORMATTEST_
10#define _DATEFORMATTEST_
11
12#include "unicode/utypes.h"
13
14#if !UCONFIG_NO_FORMATTING
15
16#include "unicode/datefmt.h"
17#include "unicode/smpdtfmt.h"
18#include "caltztst.h"
19
20/**
21 * Performs many different tests for DateFormat and SimpleDateFormat
22 **/
23class DateFormatTest: public CalendarTimeZoneTest {
24    // IntlTest override
25    void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par );
26public:
27    /**
28     * Verify that patterns have the correct values and could produce
29     * the DateFormat instances that contain the correct localized patterns.
30     */
31    void TestPatterns();
32    /**
33     *  "Test written by Wally Wedel and emailed to me."
34     *  Test handling of timezone offsets
35     **/
36    virtual void TestWallyWedel(void);
37    /**
38     * Test operator==
39     */
40    virtual void TestEquals(void);
41    /**
42     * Test the parsing of 2-digit years.
43     */
44    virtual void TestTwoDigitYearDSTParse(void);
45
46public: // package
47    // internal utility routine (genrates escape sequences for characters)
48    static UnicodeString& escape(UnicodeString& s);
49
50public:
51    /**
52     * Verify that returned field position indices are correct.
53     */
54    void TestFieldPosition(void);
55
56    void TestGeneral();
57
58public: // package
59    // internal utility function
60    static void getFieldText(DateFormat* df, int32_t field, UDate date, UnicodeString& str);
61
62public:
63    /**
64     * Verify that strings which contain incomplete specifications are parsed
65     * correctly.  In some instances, this means not being parsed at all, and
66     * returning an appropriate error.
67     */
68    virtual void TestPartialParse994(void);
69
70public: // package
71    // internal test subroutine, used by TestPartialParse994
72    virtual void tryPat994(SimpleDateFormat* format, const char* pat, const char* str, UDate expected);
73
74public:
75    /**
76     * Verify the behavior of patterns in which digits for different fields run together
77     * without intervening separators.
78     */
79    virtual void TestRunTogetherPattern985(void);
80    /**
81     * Verify the behavior of patterns in which digits for different fields run together
82     * without intervening separators.
83     */
84    virtual void TestRunTogetherPattern917(void);
85
86public: // package
87    // internal test subroutine, used by TestRunTogetherPattern917
88    virtual void testIt917(SimpleDateFormat* fmt, UnicodeString& str, UDate expected);
89
90public:
91    /**
92     * Verify the handling of Czech June and July, which have the unique attribute that
93     * one is a proper prefix substring of the other.
94     */
95    virtual void TestCzechMonths459(void);
96    /**
97     * Test the handling of 'D' in patterns.
98     */
99    virtual void TestLetterDPattern212(void);
100    /**
101     * Test the day of year pattern.
102     */
103    virtual void TestDayOfYearPattern195(void);
104
105public: // package
106    // interl test subroutine, used by TestDayOfYearPattern195
107    virtual void tryPattern(SimpleDateFormat& sdf, UDate d, const char* pattern, UDate expected);
108
109public:
110    /**
111     * Test the handling of single quotes in patterns.
112     */
113    virtual void TestQuotePattern161(void);
114    /**
115     * Verify the correct behavior when handling invalid input strings.
116     */
117    virtual void TestBadInput135(void);
118
119public:
120    /**
121     * Verify the correct behavior when parsing an array of inputs against an
122     * array of patterns, with known results.  The results are encoded after
123     * the input strings in each row.
124     */
125    virtual void TestBadInput135a(void);
126    /**
127     * Test the parsing of two-digit years.
128     */
129    virtual void TestTwoDigitYear(void);
130
131public: // package
132    // internal test subroutine, used by TestTwoDigitYear
133    virtual void parse2DigitYear(DateFormat& fmt, const char* str, UDate expected);
134
135public:
136    /**
137     * Test the formatting of time zones.
138     */
139    virtual void TestDateFormatZone061(void);
140    /**
141     * Further test the formatting of time zones.
142     */
143    virtual void TestDateFormatZone146(void);
144
145    void TestTimeZoneStringsAPI(void);
146
147    void TestGMTParsing(void);
148
149public: // package
150    /**
151     * Test the formatting of dates in different locales.
152     */
153    virtual void TestLocaleDateFormat(void);
154
155    virtual void TestFormattingLocaleTimeSeparator(void);
156
157    virtual void TestDateFormatCalendar(void);
158
159    virtual void TestSpaceParsing(void);
160
161    void TestExactCountFormat(void);
162
163    void TestWhiteSpaceParsing(void);
164
165    void TestInvalidPattern(void);
166
167    void TestGreekMay(void);
168
169    void TestGenericTime(void);
170
171    void TestGenericTimeZoneOrder(void);
172
173    void Test6338(void);
174
175    void Test6726(void);
176
177    void Test6880(void);
178
179    void TestISOEra(void);
180
181    void TestFormalChineseDate(void);
182
183    void TestStandAloneGMTParse(void);
184
185    void TestParsePosition(void);
186
187    void TestMonthPatterns(void);
188
189    void TestContext(void);
190
191    void TestNonGregoFmtParse(void);
192
193    void TestFormatsWithNumberSystems(void);
194
195public:
196    /**
197     * Test host-specific formatting.
198     */
199    void TestHost(void);
200
201public:
202    /**
203     * Test patterns added in CLDR 1.4, CLDR 23
204     */
205    void TestEras(void);
206
207    void TestNarrowNames(void);
208
209    void TestShortDays(void);
210
211    void TestStandAloneDays(void);
212
213    void TestStandAloneMonths(void);
214
215    void TestQuarters(void);
216
217    void TestZTimeZoneParsing(void);
218
219    void TestRelativeClone(void);
220
221    void TestHostClone(void);
222
223    void TestHebrewClone(void);
224
225    void TestDateFormatSymbolsClone(void);
226
227    void TestTimeZoneDisplayName(void);
228
229    void TestRoundtripWithCalendar(void);
230
231public:
232    /***
233     * Test Relative Dates
234     */
235     void TestRelative(void);
236/*   void TestRelativeError(void);
237     void TestRelativeOther(void);
238*/
239
240    void TestDotAndAtLeniency();
241
242    void TestDateFormatLeniency();
243
244    void TestParseMultiPatternMatch();
245
246    void TestParseLeniencyAPIs();
247
248    // test override NumberFormat
249    void TestNumberFormatOverride();
250    void TestCreateInstanceForSkeleton();
251    void TestCreateInstanceForSkeletonDefault();
252    void TestCreateInstanceForSkeletonWithCalendar();
253    void TestDFSCreateForLocaleNonGregorianLocale();
254    void TestDFSCreateForLocaleWithCalendarInLocale();
255    void TestChangeCalendar();
256
257    void TestPatternFromSkeleton();
258
259    void TestAmPmMidnightNoon();
260    void TestFlexibleDayPeriod();
261    void TestDayPeriodWithLocales();
262    void TestMinuteSecondFieldsInOddPlaces();
263    void TestDayPeriodParsing();
264
265private:
266    UBool showParse(DateFormat &format, const UnicodeString &formattedString);
267
268public:
269    /**
270     * Test parsing a number as a string
271     */
272    void TestNumberAsStringParsing(void);
273
274 private:
275      void TestRelative(int daysdelta,
276                                  const Locale& loc,
277                                  const char *expectChars);
278
279 private:
280    void expectParse(const char** data, int32_t data_length,
281                     const Locale& locale);
282
283    void expect(const char** data, int32_t data_length,
284                const Locale& loc);
285
286    void expectFormat(const char **data, int32_t data_length,
287                      const Locale &locale);
288
289};
290
291#endif /* #if !UCONFIG_NO_FORMATTING */
292
293#endif // _DATEFORMATTEST_
294//eof
295