ReactOS  0.4.14-dev-358-gbef841c
JapaneseCalendar.c
Go to the documentation of this file.
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 
27 START_TEST(JapaneseCalendar)
28 {
29  CHAR szTextA[64];
30  WCHAR szTextW[64];
31  SYSTEMTIME st;
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  {
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;
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;
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;
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;
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;
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;
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;
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;
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 }
#define CAL_SCALNAME
Definition: winnls.h:395
START_TEST(JapaneseCalendar)
#define MAKELCID(lgid, srtid)
int WINAPI lstrcmpiA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:42
WORD wMonth
Definition: winbase.h:878
INT WINAPI GetDateFormatA(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCSTR lpFormat, LPSTR lpDateStr, INT cchOut)
Definition: lcformat.c:922
_CONST_RETURN wchar_t *__cdecl wcsstr(_In_z_ const wchar_t *_Str, _In_z_ const wchar_t *_SubStr)
char * strstr(char *String1, char *String2)
Definition: utclib.c:653
WORD wDayOfWeek
Definition: winbase.h:879
char CHAR
Definition: xmlstorage.h:175
#define SUBLANG_DEFAULT
Definition: nls.h:168
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
#define ZeroMemory
Definition: winbase.h:1642
DWORD LCID
Definition: nls.h:13
#define CAL_SERASTRING
Definition: winnls.h:397
#define ok_long(expression, result)
Definition: atltest.h:133
LANGID langid
Definition: msctf.idl:605
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
WORD wYear
Definition: winbase.h:877
#define LANG_JAPANESE
Definition: nls.h:76
int WINAPI GetCalendarInfoA(LCID lcid, CALID Calendar, CALTYPE CalType, LPSTR lpCalData, int cchData, LPDWORD lpValue)
Definition: lcformat.c:2428
#define CAL_SSHORTDATE
Definition: winnls.h:398
#define CAL_JAPAN
Definition: winnls.h:442
smooth NULL
Definition: ftsmooth.c:416
#define ok_int(expression, result)
Definition: atltest.h:134
#define trace
Definition: atltest.h:70
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define CAL_ICALINTVALUE
Definition: winnls.h:394
#define SORT_DEFAULT
#define CAL_SLONGDATE
Definition: winnls.h:399
unsigned long DWORD
Definition: ntddk_ex.h:95
#define CAL_IYEAROFFSETRANGE
Definition: winnls.h:396
DWORD CALTYPE
Definition: winnls.h:515
#define DATE_USE_ALT_CALENDAR
Definition: winnls.h:195
int ret
static const WCHAR L[]
Definition: oid.c:1250
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
INT WINAPI GetDateFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpDateStr, INT cchOut)
Definition: lcformat.c:979
WORD wDay
Definition: winbase.h:880
#define ok(value,...)
Definition: atltest.h:57
#define CAL_SABBREVERASTRING
#define MAKELANGID(p, s)
Definition: nls.h:15
int WINAPI GetCalendarInfoW(LCID Locale, CALID Calendar, CALTYPE CalType, LPWSTR lpCalData, int cchData, LPDWORD lpValue)
Definition: lcformat.c:2483