1 /*
2  * Japanese Calendar Testcase
3  *
4  * Copyright 2019 Katayama Hirofumi MZ
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 #include "precomp.h"
22 
23 #ifndef CAL_SABBREVERASTRING
24     #define CAL_SABBREVERASTRING 0x00000039
25 #endif
26 
START_TEST(JapaneseCalendar)27 START_TEST(JapaneseCalendar)
28 {
29     CHAR szTextA[64];
30     WCHAR szTextW[64];
31     SYSTEMTIME st;
32     DWORD langid = MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT);
33     LCID lcid = MAKELCID(langid, SORT_DEFAULT);
34     DWORD dwValue;
35     CALTYPE type;
36     int ret;
37     static const WCHAR s_szSeireki19[] = {0x897F, 0x66A6, '1', '9', 0}; // L"\u897F\u66A6" L"19"
38     static const WCHAR s_szHeisei[] = {0x5E73, 0x6210, 0};  // L"\u5E73\u6210"
39     static const WCHAR s_szHeisei31[] = {0x5E73, 0x6210, '3', '1', 0};  // L"\u5E73\u6210" L"31"
40     static const WCHAR s_szReiwa[] = {0x4EE4, 0x548C, 0};   // L"\u4EE4\u548C"
41     static const WCHAR s_szOneCharHeisei1[] = {0x337B, 0};  // L"\u337B"
42     static const WCHAR s_szOneCharHeisei2[] = {0x5E73, 0};  // L"\u5E73"
43     static const WCHAR s_szOneCharReiwa1[] = {0x32FF, 0};   // L"\u32FF"
44     static const WCHAR s_szOneCharReiwa2[] = {0x4EE4, 0};   // L"\u4EE4"
45     static const WCHAR s_szOneCharReiwa3[] = {0xF9A8, 0};   // L"\uF9A8"
46     static const WCHAR s_szWareki[] = {0x548C, 0x66A6, 0};  // L"\u548C\u66A6"
47     static const WCHAR s_szNen[] = {0x5E74, 0};             // L"\u5E74"
48 
49     trace("lcid: 0x%08lX\n", lcid);
50     trace("langid: 0x%04lX\n", langid);
51 
52     ZeroMemory(&st, sizeof(st));
53     st.wYear = 2019;
54     st.wMonth = 4;
55     st.wDayOfWeek = 4;
56     st.wDay = 4;
57 
58     /* Standard Date Formatting */
59     {
60         DWORD dwFlags = 0;
61 
62         szTextA[0] = 0x7F;
63         szTextA[1] = 0;
64         ret = GetDateFormatA(lcid, dwFlags, &st, "gyy", szTextA, ARRAYSIZE(szTextA));
65         ok(ret != 0, "ret: %d\n", ret);
66         ok(/* WinXP */ lstrcmpiA(szTextA, "19") == 0 ||
67            /* Win10 */ lstrcmpiA(szTextA, "\x90\xBC\x97\xEF" "19") == 0, "szTextA: %s\n", szTextA);
68 
69         szTextA[0] = 0x7F;
70         szTextA[1] = 0;
71         ret = GetDateFormatA(lcid, dwFlags, &st, "ggyy", szTextA, ARRAYSIZE(szTextA));
72         ok(ret != 0, "ret: %d\n", ret);
73         ok(/* WinXP */ lstrcmpiA(szTextA, "19") == 0 ||
74            /* Win10 */ lstrcmpiA(szTextA, "\x90\xBC\x97\xEF" "19") == 0, "szTextA: %s\n", szTextA);
75 
76         szTextW[0] = 0x7F;
77         szTextW[1] = 0;
78         ret = GetDateFormatW(lcid, dwFlags, &st, L"gyy", szTextW, ARRAYSIZE(szTextW));
79         ok(ret != 0, "ret: %d\n", ret);
80         ok(/* WinXP */ lstrcmpiW(szTextW, L"19") == 0 ||
81            /* Win10 */ lstrcmpiW(szTextW, s_szSeireki19) == 0,
82            "szTextW: %04X %04X %04X\n", szTextW[0], szTextW[1], szTextW[2]);
83 
84         szTextW[0] = 0x7F;
85         szTextW[1] = 0;
86         ret = GetDateFormatW(lcid, dwFlags, &st, L"ggyy", szTextW, ARRAYSIZE(szTextW));
87         ok(ret != 0, "ret: %d\n", ret);
88         ok(/* WinXP */ lstrcmpiW(szTextW, L"19") == 0 ||
89            /* Win10 */ lstrcmpiW(szTextW, s_szSeireki19) == 0,
90            "szTextW: %04X %04X %04X\n", szTextW[0], szTextW[1], szTextW[2]);
91     }
92 
93     /* Alternative Date Formatting (Wareki) */
94     {
95         DWORD dwFlags = DATE_USE_ALT_CALENDAR;
96 
97         szTextA[0] = 0x7F;
98         szTextA[1] = 0;
99         ret = GetDateFormatA(lcid, dwFlags, &st, "gyy", szTextA, ARRAYSIZE(szTextA));
100         ok(ret != 0, "ret: %d\n", ret);
101         ok(lstrcmpiA(szTextA, "\x95\xBD\x90\xAC" "31") == 0, "szTextA: %s\n", szTextA);
102 
103         szTextA[0] = 0x7F;
104         szTextA[1] = 0;
105         ret = GetDateFormatA(lcid, dwFlags, &st, "ggyy", szTextA, ARRAYSIZE(szTextA));
106         ok(ret != 0, "ret: %d\n", ret);
107         ok(lstrcmpiA(szTextA, "\x95\xBD\x90\xAC" "31") == 0, "szTextA: %s\n", szTextA);
108 
109         szTextW[0] = 0x7F;
110         szTextW[1] = 0;
111         ret = GetDateFormatW(lcid, dwFlags, &st, L"gyy", szTextW, ARRAYSIZE(szTextW));
112         ok(ret != 0, "ret: %d\n", ret);
113         ok(lstrcmpiW(szTextW, s_szHeisei31) == 0,
114            "szTextW: %04X %04X %04X\n", szTextW[0], szTextW[1], szTextW[2]);
115 
116         szTextW[0] = 0x7F;
117         szTextW[1] = 0;
118         ret = GetDateFormatW(lcid, dwFlags, &st, L"ggyy", szTextW, ARRAYSIZE(szTextW));
119         ok(ret != 0, "ret: %d\n", ret);
120         ok(lstrcmpiW(szTextW, s_szHeisei31) == 0,
121            "szTextW: %04X %04X %04X\n", szTextW[0], szTextW[1], szTextW[2]);
122     }
123 
124     /* Japanese calendar-related locale info (MBCS) */
125     {
126         type = CAL_ICALINTVALUE | CAL_RETURN_NUMBER;
127         ret = GetCalendarInfoA(lcid, CAL_JAPAN, type, NULL, 0, &dwValue);
128         ok(ret != 0, "ret: %d\n", ret);
129         ok_long(dwValue, 3);
130 
131         type = CAL_ITWODIGITYEARMAX | CAL_RETURN_NUMBER;
132         ret = GetCalendarInfoA(lcid, CAL_JAPAN, type, NULL, 0, &dwValue);
133         ok(ret != 0, "ret: %d\n", ret);
134         ok_long(dwValue, 99);
135 
136         type = CAL_IYEAROFFSETRANGE | CAL_RETURN_NUMBER;
137         ret = GetCalendarInfoA(lcid, CAL_JAPAN, type, NULL, 0, &dwValue);
138         ok(ret != 0, "ret: %d\n", ret);
139         ok(dwValue == 1989 || dwValue == 2019, "dwValue was %ld\n", dwValue);
140 
141         szTextA[0] = 0x7F;
142         szTextA[1] = 0;
143         type = CAL_SABBREVERASTRING;
144         ret = GetCalendarInfoA(lcid, CAL_JAPAN, type, szTextA, ARRAYSIZE(szTextA), NULL);
145         ok_int(ret, FALSE);
146         ok(lstrcmpiA(szTextA, "\x7F") == 0, "szTextA: %s\n", szTextA);
147 
148         szTextA[0] = 0x7F;
149         szTextA[1] = 0;
150         type = CAL_SCALNAME;
151         ret = GetCalendarInfoA(lcid, CAL_JAPAN, type, szTextA, ARRAYSIZE(szTextA), NULL);
152         ok(ret != 0, "ret: %d\n", ret);
153         ok(lstrcmpiA(szTextA, "\x98\x61\x97\xEF") == 0, "szTextA: %s\n", szTextA);
154 
155         szTextA[0] = 0x7F;
156         szTextA[1] = 0;
157         type = CAL_SERASTRING;
158         ret = GetCalendarInfoA(lcid, CAL_JAPAN, type, szTextA, ARRAYSIZE(szTextA), NULL);
159         ok(ret != 0, "ret: %d\n", ret);
160         ok(lstrcmpiA(szTextA, "\x95\xBD\x90\xAC") == 0, "szTextA: %s\n", szTextA);
161 
162         szTextA[0] = 0x7F;
163         szTextA[1] = 0;
164         type = CAL_SLONGDATE;
165         ret = GetCalendarInfoA(lcid, CAL_JAPAN, type, szTextA, ARRAYSIZE(szTextA), NULL);
166         ok(ret != 0, "ret: %d\n", ret);
167         ok(strstr(szTextA, "\x94\x4E") != NULL, "szTextA: %s\n", szTextA);
168 
169         szTextA[0] = 0x7F;
170         szTextA[1] = 0;
171         type = CAL_SSHORTDATE;
172         ret = GetCalendarInfoA(lcid, CAL_JAPAN, type, szTextA, ARRAYSIZE(szTextA), NULL);
173         ok(ret != 0, "ret: %d\n", ret);
174         ok(strstr(szTextA, "/") != NULL, "szTextA: %s\n", szTextA);
175     }
176 
177     /* Japanese calendar-related locale info (Unicode) */
178     {
179         type = CAL_ICALINTVALUE | CAL_RETURN_NUMBER;
180         ret = GetCalendarInfoW(lcid, CAL_JAPAN, type, NULL, 0, &dwValue);
181         ok(ret != 0, "ret: %d\n", ret);
182         ok_long(dwValue, 3);
183 
184         type = CAL_ITWODIGITYEARMAX | CAL_RETURN_NUMBER;
185         ret = GetCalendarInfoW(lcid, CAL_JAPAN, type, NULL, 0, &dwValue);
186         ok(ret != 0, "ret: %d\n", ret);
187         ok_long(dwValue, 99);
188 
189         type = CAL_IYEAROFFSETRANGE | CAL_RETURN_NUMBER;
190         ret = GetCalendarInfoW(lcid, CAL_JAPAN, type, NULL, 0, &dwValue);
191         ok(ret != 0, "ret: %d\n", ret);
192         ok(dwValue == 1989 || dwValue == 2019, "dwValue was %ld\n", dwValue);
193 
194         szTextW[0] = 0x7F;
195         szTextW[1] = 0;
196         type = CAL_SABBREVERASTRING;
197         ret = GetCalendarInfoW(lcid, CAL_JAPAN, type, szTextW, ARRAYSIZE(szTextW), NULL);
198         ok(/* WinXP */ ret == 0 || /* Win10 */ ret != 0, "ret: %d\n", ret);
199         ok(/* WinXP */ (szTextW[0] == 0x7F && szTextW[1] == 0) ||
200            /* Win10? */ lstrcmpiW(szTextW, s_szOneCharHeisei1) == 0 ||
201            /* Win10? */ lstrcmpiW(szTextW, s_szOneCharHeisei2) == 0 ||
202            /* Win10? */ lstrcmpiW(szTextW, s_szOneCharReiwa1) == 0 ||
203            /* Win10? */ lstrcmpiW(szTextW, s_szOneCharReiwa2) == 0 ||
204            /* Win10? */ lstrcmpiW(szTextW, s_szOneCharReiwa3) == 0,
205            "szTextW: %04X %04X %04X\n", szTextW[0], szTextW[1], szTextW[2]);
206 
207         szTextW[0] = 0x7F;
208         szTextW[1] = 0;
209         type = CAL_SCALNAME;
210         ret = GetCalendarInfoW(lcid, CAL_JAPAN, type, szTextW, ARRAYSIZE(szTextW), NULL);
211         ok(ret != 0, "ret: %d\n", ret);
212         ok(lstrcmpiW(szTextW, s_szWareki) == 0, "szTextW: %04X %04X %04X\n", szTextW[0], szTextW[1], szTextW[2]);
213 
214         szTextW[0] = 0x7F;
215         szTextW[1] = 0;
216         type = CAL_SERASTRING;
217         ret = GetCalendarInfoW(lcid, CAL_JAPAN, type, szTextW, ARRAYSIZE(szTextW), NULL);
218         ok(ret != 0, "ret: %d\n", ret);
219         ok(wcsstr(szTextW, s_szHeisei) != NULL ||
220            wcsstr(szTextW, s_szReiwa) != NULL, "szTextW: %04X %04X %04X\n", szTextW[0], szTextW[1], szTextW[2]);
221 
222         szTextW[0] = 0x7F;
223         szTextW[1] = 0;
224         type = CAL_SLONGDATE;
225         ret = GetCalendarInfoW(lcid, CAL_JAPAN, type, szTextW, ARRAYSIZE(szTextW), NULL);
226         ok(ret != 0, "ret: %d\n", ret);
227         ok(wcsstr(szTextW, s_szNen) != NULL, "\n");
228 
229         szTextW[0] = 0x7F;
230         szTextW[1] = 0;
231         type = CAL_SSHORTDATE;
232         ret = GetCalendarInfoW(lcid, CAL_JAPAN, type, szTextW, ARRAYSIZE(szTextW), NULL);
233         ok(ret != 0, "ret: %d\n", ret);
234         ok(wcsstr(szTextW, L"/") != NULL, "\n");
235     }
236 }
237