ReactOS  0.4.12-dev-914-g71f84a3
datetime.c
Go to the documentation of this file.
1 /* Unit test suite for datetime control.
2 *
3 * Copyright 2007 Kanit Therdsteerasukdi
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 */
19 
20 #include <windows.h>
21 #include <commctrl.h>
22 
23 #include "wine/test.h"
24 #include "msg.h"
25 #include "v6util.h"
26 
27 #define expect(EXPECTED, GOT) ok((GOT)==(EXPECTED), "Expected %d, got %ld\n", (EXPECTED), (GOT))
28 
29 #define expect_unsuccess(EXPECTED, GOT) ok((GOT)==(EXPECTED), "Expected %d(unsuccessful), got %ld(successful)\n", (EXPECTED), (GOT))
30 
31 #define NUM_MSG_SEQUENCES 1
32 #define DATETIME_SEQ_INDEX 0
33 
34 static BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*);
35 
37 
38 static const struct message test_dtm_set_format_seq[] = {
39  { DTM_SETFORMATA, sent|wparam|lparam, 0, 0 },
40  { DTM_SETFORMATA, sent|wparam, 0 },
41  { 0 }
42 };
43 
44 static const struct message test_dtm_set_and_get_mccolor_seq[] = {
46  { DTM_SETMCCOLOR, sent|wparam|lparam, MCSC_BACKGROUND, RGB(255, 255, 255) },
47  { DTM_SETMCCOLOR, sent|wparam|lparam, MCSC_BACKGROUND, RGB(100, 180, 220) },
50  { DTM_SETMCCOLOR, sent|wparam|lparam, MCSC_MONTHBK, RGB(255, 255, 255) },
51  { DTM_SETMCCOLOR, sent|wparam|lparam, MCSC_MONTHBK, RGB(100, 180, 220) },
54  { DTM_SETMCCOLOR, sent|wparam|lparam, MCSC_TEXT, RGB(255, 255, 255) },
55  { DTM_SETMCCOLOR, sent|wparam|lparam, MCSC_TEXT, RGB(100, 180, 220) },
58  { DTM_SETMCCOLOR, sent|wparam|lparam, MCSC_TITLEBK, RGB(255, 255, 255) },
59  { DTM_SETMCCOLOR, sent|wparam|lparam, MCSC_TITLEBK, RGB(100, 180, 220) },
62  { DTM_SETMCCOLOR, sent|wparam|lparam, MCSC_TITLETEXT, RGB(255, 255, 255) },
63  { DTM_SETMCCOLOR, sent|wparam|lparam, MCSC_TITLETEXT, RGB(100, 180, 220) },
66  { DTM_SETMCCOLOR, sent|wparam|lparam, MCSC_TRAILINGTEXT, RGB(255, 255, 255) },
67  { DTM_SETMCCOLOR, sent|wparam|lparam, MCSC_TRAILINGTEXT, RGB(100, 180, 220) },
69  { 0 }
70 };
71 
72 static const struct message test_dtm_set_and_get_mcfont_seq[] = {
73  { DTM_SETMCFONT, sent|lparam, 0, 1 },
74  { DTM_GETMCFONT, sent|wparam|lparam, 0, 0 },
75  { 0 }
76 };
77 
78 static const struct message test_dtm_get_monthcal_seq[] = {
79  { DTM_GETMONTHCAL, sent|wparam|lparam, 0, 0 },
80  { 0 }
81 };
82 
83 static const struct message test_dtm_set_and_get_range_seq[] = {
85  { DTM_GETRANGE, sent|wparam, 0 },
88  { DTM_GETRANGE, sent|wparam, 0 },
92  { DTM_GETRANGE, sent|wparam, 0 },
94  { DTM_GETRANGE, sent|wparam, 0 },
96  { DTM_GETRANGE, sent|wparam, 0 },
97  { 0 }
98 };
99 
101  { DTM_SETSYSTEMTIME, sent|wparam, 0 },
102  { DTM_GETSYSTEMTIME, sent|wparam, 0 },
104  { DTM_GETRANGE, sent|wparam, 0 },
105  { DTM_SETSYSTEMTIME, sent|wparam, 0 },
106  { DTM_GETSYSTEMTIME, sent|wparam, 0 },
108  { DTM_GETRANGE, sent|wparam, 0 },
110  { DTM_GETRANGE, sent|wparam, 0 },
112  { DTM_GETRANGE, sent|wparam, 0 },
113  { 0 }
114 };
115 
118  { DTM_GETSYSTEMTIME, sent|wparam, 0 },
119  { DTM_SETSYSTEMTIME, sent|wparam, 0 },
120  { DTM_SETSYSTEMTIME, sent|wparam, 0 },
121  { DTM_SETSYSTEMTIME, sent|wparam, 0 },
122  { DTM_GETSYSTEMTIME, sent|wparam, 0 },
123  { DTM_SETSYSTEMTIME, sent|wparam, 0 },
124  { 0 }
125 };
126 
129  { DTM_GETRANGE, sent|wparam, 0 },
130  { DTM_SETSYSTEMTIME, sent|wparam, 0 },
131  { DTM_GETSYSTEMTIME, sent|wparam, 0 },
132  { DTM_SETSYSTEMTIME, sent|wparam, 0 },
133  { DTM_GETSYSTEMTIME, sent|wparam, 0 },
134  { DTM_SETSYSTEMTIME, sent|wparam, 0 },
135  { DTM_GETSYSTEMTIME, sent|wparam, 0 },
136  { 0 }
137 };
138 
140 {
142  static LONG defwndproc_counter = 0;
143  struct message msg = { 0 };
144  LRESULT ret;
145 
146  msg.message = message;
147  msg.flags = sent|wparam|lparam;
148  if (defwndproc_counter) msg.flags |= defwinproc;
149  msg.wParam = wParam;
150  msg.lParam = lParam;
152 
153  defwndproc_counter++;
154  ret = CallWindowProcA(oldproc, hwnd, message, wParam, lParam);
155  defwndproc_counter--;
156 
157  return ret;
158 }
159 
161 {
162  WNDPROC oldproc;
163  HWND hWndDateTime = NULL;
164 
165  hWndDateTime = CreateWindowExA(0,
167  NULL,
168  style,
169  0,50,300,120,
170  NULL,
171  NULL,
172  NULL,
173  NULL);
174 
175  if (!hWndDateTime) return NULL;
176 
177  oldproc = (WNDPROC)SetWindowLongPtrA(hWndDateTime, GWLP_WNDPROC,
179  SetWindowLongPtrA(hWndDateTime, GWLP_USERDATA, (LONG_PTR)oldproc);
180 
181  return hWndDateTime;
182 }
183 
184 static void test_dtm_set_format(void)
185 {
186  HWND hWnd;
187  CHAR txt[256];
188  SYSTEMTIME systime;
189  LRESULT r;
190 
192 
194 
195  r = SendMessageA(hWnd, DTM_SETFORMATA, 0, 0);
196  expect(1, r);
197 
199  (LPARAM)"'Today is: 'hh':'m':'s dddd MMM dd', 'yyyy");
200  expect(1, r);
201 
203 
204  r = SendMessageA(hWnd, DTM_SETFORMATA, 0, (LPARAM)"'hh' hh");
205  expect(1, r);
206  ZeroMemory(&systime, sizeof(systime));
207  systime.wYear = 2000;
208  systime.wMonth = systime.wDay = 1;
209  r = SendMessageA(hWnd, DTM_SETSYSTEMTIME, 0, (LPARAM)&systime);
210  expect(1, r);
211  GetWindowTextA(hWnd, txt, 256);
212  ok(strcmp(txt, "hh 12") == 0, "String mismatch (\"%s\" vs \"hh 12\")\n", txt);
213 
215 }
216 
217 static void test_mccolor_types(HWND hWndDateTime, int mccolor_type, const char* mccolor_name)
218 {
219  COLORREF theColor, prevColor, crColor;
220 
221  theColor=RGB(0,0,0);
222  crColor = SendMessageA(hWndDateTime, DTM_SETMCCOLOR, mccolor_type, theColor);
223  ok(crColor != ~0u, "%s: Set RGB(0,0,0): Expected COLORREF of previous value, got %d\n", mccolor_name, crColor);
224  prevColor=theColor;
225  theColor=RGB(255,255,255);
226  crColor = SendMessageA(hWndDateTime, DTM_SETMCCOLOR, mccolor_type, theColor);
227  ok(crColor==prevColor, "%s: Set RGB(255,255,255): Expected COLORREF of previous value, got %d\n", mccolor_name, crColor);
228  prevColor=theColor;
229  theColor=RGB(100,180,220);
230  crColor = SendMessageA(hWndDateTime, DTM_SETMCCOLOR, mccolor_type, theColor);
231  ok(crColor==prevColor, "%s: Set RGB(100,180,220): Expected COLORREF of previous value, got %d\n", mccolor_name, crColor);
232  crColor = SendMessageA(hWndDateTime, DTM_GETMCCOLOR, mccolor_type, 0);
233  ok(crColor==theColor, "%s: GETMCCOLOR: Expected %d, got %d\n", mccolor_name, theColor, crColor);
234 }
235 
237 {
238  HWND hWnd;
239 
241 
243 
244  test_mccolor_types(hWnd, MCSC_BACKGROUND, "MCSC_BACKGROUND");
245  test_mccolor_types(hWnd, MCSC_MONTHBK, "MCSC_MONTHBK");
246  test_mccolor_types(hWnd, MCSC_TEXT, "MCSC_TEXT");
247  test_mccolor_types(hWnd, MCSC_TITLEBK, "MCSC_TITLEBK");
248  test_mccolor_types(hWnd, MCSC_TITLETEXT, "MCSC_TITLETEXT");
249  test_mccolor_types(hWnd, MCSC_TRAILINGTEXT, "MCSC_TRAILINGTEXT");
250 
252 
254 }
255 
257 {
258  HFONT hFontOrig, hFontNew;
259  HWND hWnd;
260 
262 
264 
265  hFontOrig = GetStockObject(DEFAULT_GUI_FONT);
266  SendMessageA(hWnd, DTM_SETMCFONT, (WPARAM)hFontOrig, TRUE);
267  hFontNew = (HFONT)SendMessageA(hWnd, DTM_GETMCFONT, 0, 0);
268  ok(hFontOrig == hFontNew, "Expected hFontOrig==hFontNew, hFontOrig=%p, hFontNew=%p\n", hFontOrig, hFontNew);
269 
272 }
273 
274 static void test_dtm_get_monthcal(void)
275 {
276  LRESULT r;
277  HWND hWnd;
278 
280 
282 
283  todo_wine {
285  ok(r == 0, "Expected NULL(no child month calendar control), got %ld\n", r);
286  }
287 
290 }
291 
292 static void fill_systime_struct(SYSTEMTIME *st, int year, int month, int dayofweek, int day, int hour, int minute, int second, int milliseconds)
293 {
294  st->wYear = year;
295  st->wMonth = month;
296  st->wDayOfWeek = dayofweek;
297  st->wDay = day;
298  st->wHour = hour;
299  st->wMinute = minute;
300  st->wSecond = second;
301  st->wMilliseconds = milliseconds;
302 }
303 
305 {
306  return (st1->wYear == st2->wYear)
307  && (st1->wMonth == st2->wMonth)
308  && (st1->wDayOfWeek == st2->wDayOfWeek)
309  && (st1->wDay == st2->wDay);
310 }
311 
313 {
314  return (st1->wHour == st2->wHour)
315  && (st1->wMinute == st2->wMinute)
316  && (st1->wSecond == st2->wSecond)
317  && (st1->wMilliseconds == st2->wMilliseconds);
318 }
319 
321 {
322  if(!compare_systime_date(st1, st2))
323  return 0;
324 
325  return compare_systime_time(st1, st2);
326 }
327 
328 #define expect_systime(ST1, ST2) ok(compare_systime((ST1), (ST2))==1, "ST1 != ST2\n")
329 #define expect_systime_date(ST1, ST2) ok(compare_systime_date((ST1), (ST2))==1, "ST1.date != ST2.date\n")
330 #define expect_systime_time(ST1, ST2) ok(compare_systime_time((ST1), (ST2))==1, "ST1.time != ST2.time\n")
331 
332 static void test_dtm_set_and_get_range(void)
333 {
334  LRESULT r;
335  SYSTEMTIME st[2];
336  SYSTEMTIME getSt[2];
337  HWND hWnd;
338 
340 
342 
343  /* initialize st[0] to lowest possible value */
344  fill_systime_struct(&st[0], 1601, 1, 0, 1, 0, 0, 0, 0);
345  /* initialize st[1] to all invalid numbers */
346  fill_systime_struct(&st[1], 0, 0, 7, 0, 24, 60, 60, 1000);
347 
349  expect(1, r);
350  r = SendMessageA(hWnd, DTM_GETRANGE, 0, (LPARAM)getSt);
351  ok(r == GDTR_MIN, "Expected %x, not %x(GDTR_MAX) or %x(GDTR_MIN | GDTR_MAX), got %lx\n", GDTR_MIN, GDTR_MAX, GDTR_MIN | GDTR_MAX, r);
352  expect_systime(&st[0], &getSt[0]);
353 
355  expect_unsuccess(0, r);
356 
357  /* set st[0] to all invalid numbers */
358  fill_systime_struct(&st[0], 0, 0, 7, 0, 24, 60, 60, 1000);
359  /* set st[1] to highest possible value */
360  fill_systime_struct(&st[1], 30827, 12, 6, 31, 23, 59, 59, 999);
361 
363  expect(1, r);
364  r = SendMessageA(hWnd, DTM_GETRANGE, 0, (LPARAM)getSt);
365  ok(r == GDTR_MAX, "Expected %x, not %x(GDTR_MIN) or %x(GDTR_MIN | GDTR_MAX), got %lx\n", GDTR_MAX, GDTR_MIN, GDTR_MIN | GDTR_MAX, r);
366  expect_systime(&st[1], &getSt[1]);
367 
369  expect_unsuccess(0, r);
371  expect_unsuccess(0, r);
372 
373  /* set st[0] to highest possible value */
374  fill_systime_struct(&st[0], 30827, 12, 6, 31, 23, 59, 59, 999);
375 
377  expect(1, r);
378  r = SendMessageA(hWnd, DTM_GETRANGE, 0, (LPARAM)getSt);
379  ok(r == (GDTR_MIN | GDTR_MAX), "Expected %x, not %x(GDTR_MIN) or %x(GDTR_MAX), got %lx\n", (GDTR_MIN | GDTR_MAX), GDTR_MIN, GDTR_MAX, r);
380  expect_systime(&st[0], &getSt[0]);
381  expect_systime(&st[1], &getSt[1]);
382 
383  /* initialize st[0] to lowest possible value */
384  fill_systime_struct(&st[0], 1601, 1, 0, 1, 0, 0, 0, 0);
385  /* set st[1] to highest possible value */
386  fill_systime_struct(&st[1], 30827, 12, 6, 31, 23, 59, 59, 999);
387 
389  expect(1, r);
390  r = SendMessageA(hWnd, DTM_GETRANGE, 0, (LPARAM)getSt);
391  ok(r == (GDTR_MIN | GDTR_MAX), "Expected %x, not %x(GDTR_MIN) or %x(GDTR_MAX), got %lx\n", (GDTR_MIN | GDTR_MAX), GDTR_MIN, GDTR_MAX, r);
392  expect_systime(&st[0], &getSt[0]);
393  expect_systime(&st[1], &getSt[1]);
394 
395  /* set st[0] to value higher than minimum */
396  fill_systime_struct(&st[0], 1980, 1, 3, 23, 14, 34, 37, 465);
397  /* set st[1] to value lower than maximum */
398  fill_systime_struct(&st[1], 2007, 3, 2, 31, 23, 59, 59, 999);
399 
401  expect(1, r);
402  r = SendMessageA(hWnd, DTM_GETRANGE, 0, (LPARAM)getSt);
403  ok(r == (GDTR_MIN | GDTR_MAX), "Expected %x, not %x(GDTR_MIN) or %x(GDTR_MAX), got %lx\n", (GDTR_MIN | GDTR_MAX), GDTR_MIN, GDTR_MAX, r);
404  expect_systime(&st[0], &getSt[0]);
405  expect_systime(&st[1], &getSt[1]);
406 
408 
409  /* DTM_SETRANGE with 0 flags */
410  r = SendMessageA(hWnd, DTM_SETRANGE, 0, (LPARAM)st);
411  ok(r, "got %lu\n", r);
412  r = SendMessageA(hWnd, DTM_GETRANGE, 0, (LPARAM)getSt);
413  ok(r == 0, "got %lu\n", r);
414  ok(getSt[0].wYear == 0 && getSt[1].wYear == 0, "got %u, %u\n", getSt[0].wYear, getSt[1].wYear);
415 
417 }
418 
419 /* when max<min for DTM_SETRANGE, Windows seems to swap the min and max values,
420 although that's undocumented. However, it doesn't seem to be implemented
421 correctly, causing some strange side effects */
423 {
424  LRESULT r;
425  SYSTEMTIME st[2];
426  SYSTEMTIME getSt[2];
427  SYSTEMTIME origSt;
428  HWND hWnd;
429 
432 
433  fill_systime_struct(&st[0], 2007, 2, 4, 15, 2, 2, 2, 2);
434 
436  expect(1, r);
437  r = SendMessageA(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&origSt);
438  ok(r == GDT_VALID, "Expected %d, not %d(GDT_NONE) or %d(GDT_ERROR), got %ld\n", GDT_VALID, GDT_NONE, GDT_ERROR, r);
439  expect_systime(&st[0], &origSt);
440 
441  /* set st[0] to value higher than st[1] */
442  fill_systime_struct(&st[0], 2007, 3, 2, 31, 23, 59, 59, 999);
443  fill_systime_struct(&st[1], 1980, 1, 3, 23, 14, 34, 37, 465);
444 
445  /* since min>max, min and max values should be swapped by DTM_SETRANGE
446  automatically */
448  expect(1, r);
449  r = SendMessageA(hWnd, DTM_GETRANGE, 0, (LPARAM)getSt);
450  ok(r == (GDTR_MIN | GDTR_MAX), "Expected %x, not %x(GDTR_MIN) or %x(GDTR_MAX), got %lx\n", (GDTR_MIN | GDTR_MAX), GDTR_MIN, GDTR_MAX, r);
451  todo_wine {
452  ok(compare_systime(&st[0], &getSt[0]) == 1 ||
453  broken(compare_systime(&st[0], &getSt[1]) == 1), /* comctl32 version <= 5.80 */
454  "ST1 != ST2\n");
455 
456  ok(compare_systime(&st[1], &getSt[1]) == 1 ||
457  broken(compare_systime(&st[1], &getSt[0]) == 1), /* comctl32 version <= 5.80 */
458  "ST1 != ST2\n");
459  }
460 
461  fill_systime_struct(&st[0], 1980, 1, 3, 23, 14, 34, 37, 465);
462 
464  expect(1, r);
465  r = SendMessageA(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&getSt[0]);
466  ok(r == GDT_VALID, "Expected %d, not %d(GDT_NONE) or %d(GDT_ERROR), got %ld\n", GDT_VALID, GDT_NONE, GDT_ERROR, r);
467  /* the time part seems to not change after swapping the min and max values
468  and doing DTM_SETSYSTEMTIME */
469  expect_systime_date(&st[0], &getSt[0]);
470  todo_wine {
471  ok(compare_systime_time(&origSt, &getSt[0]) == 1 ||
472  broken(compare_systime_time(&st[0], &getSt[0]) == 1), /* comctl32 version <= 5.80 */
473  "ST1.time != ST2.time\n");
474  }
475 
476  /* set st[0] to value higher than minimum */
477  fill_systime_struct(&st[0], 1980, 1, 3, 23, 14, 34, 37, 465);
478  /* set st[1] to value lower than maximum */
479  fill_systime_struct(&st[1], 2007, 3, 2, 31, 23, 59, 59, 999);
480 
482  expect(1, r);
483  /* for some reason after we swapped the min and max values before,
484  whenever we do a DTM_SETRANGE, the DTM_GETRANGE will return the values
485  swapped*/
486  r = SendMessageA(hWnd, DTM_GETRANGE, 0, (LPARAM)getSt);
487  ok(r == (GDTR_MIN | GDTR_MAX), "Expected %x, not %x(GDTR_MIN) or %x(GDTR_MAX), got %lx\n", (GDTR_MIN | GDTR_MAX), GDTR_MIN, GDTR_MAX, r);
488  todo_wine {
489  ok(compare_systime(&st[0], &getSt[1]) == 1 ||
490  broken(compare_systime(&st[0], &getSt[0]) == 1), /* comctl32 version <= 5.80 */
491  "ST1 != ST2\n");
492 
493  ok(compare_systime(&st[1], &getSt[0]) == 1 ||
494  broken(compare_systime(&st[1], &getSt[1]) == 1), /* comctl32 version <= 5.80 */
495  "ST1 != ST2\n");
496  }
497 
498  /* set st[0] to value higher than st[1] */
499  fill_systime_struct(&st[0], 2007, 3, 2, 31, 23, 59, 59, 999);
500  fill_systime_struct(&st[1], 1980, 1, 3, 23, 14, 34, 37, 465);
501 
502  /* set min>max again, so that the return values of DTM_GETRANGE are no
503  longer swapped the next time we do a DTM SETRANGE and DTM_GETRANGE*/
505  expect(1, r);
506  r = SendMessageA(hWnd, DTM_GETRANGE, 0, (LPARAM)getSt);
507  ok(r == (GDTR_MIN | GDTR_MAX), "Expected %x, not %x(GDTR_MIN) or %x(GDTR_MAX), got %lx\n", (GDTR_MIN | GDTR_MAX), GDTR_MIN, GDTR_MAX, r);
508  expect_systime(&st[0], &getSt[1]);
509  expect_systime(&st[1], &getSt[0]);
510 
511  /* initialize st[0] to lowest possible value */
512  fill_systime_struct(&st[0], 1601, 1, 0, 1, 0, 0, 0, 0);
513  /* set st[1] to highest possible value */
514  fill_systime_struct(&st[1], 30827, 12, 6, 31, 23, 59, 59, 999);
515 
517  expect(1, r);
518  r = SendMessageA(hWnd, DTM_GETRANGE, 0, (LPARAM)getSt);
519  ok(r == (GDTR_MIN | GDTR_MAX), "Expected %x, not %x(GDTR_MIN) or %x(GDTR_MAX), got %lx\n", (GDTR_MIN | GDTR_MAX), GDTR_MIN, GDTR_MAX, r);
520  expect_systime(&st[0], &getSt[0]);
521  expect_systime(&st[1], &getSt[1]);
522 
524 
526 }
527 
529 {
530  LRESULT r;
531  SYSTEMTIME st, getSt, ref;
532  HWND hWnd;
533 
535  ok(hWnd !=NULL, "Expected non NULL, got %p\n", hWnd);
537  expect(0, r);
538 
540 
543 
545  expect(1, r);
546  r = SendMessageA(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&getSt);
547  ok(r == GDT_NONE, "Expected %d, not %d(GDT_VALID) or %d(GDT_ERROR), got %ld\n", GDT_NONE, GDT_VALID, GDT_ERROR, r);
548 
549  /* set st to lowest possible value */
550  fill_systime_struct(&st, 1601, 1, 0, 1, 0, 0, 0, 0);
551 
553  expect(1, r);
554 
555  /* set st to highest possible value */
556  fill_systime_struct(&st, 30827, 12, 6, 31, 23, 59, 59, 999);
557 
559  expect(1, r);
560 
561  /* set st to value between min and max */
562  fill_systime_struct(&st, 1980, 1, 3, 23, 14, 34, 37, 465);
563 
565  expect(1, r);
566  r = SendMessageA(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&getSt);
567  ok(r == GDT_VALID, "Expected %d, not %d(GDT_NONE) or %d(GDT_ERROR), got %ld\n", GDT_VALID, GDT_NONE, GDT_ERROR, r);
568  expect_systime(&st, &getSt);
569 
570  /* set st to invalid value */
571  fill_systime_struct(&st, 0, 0, 7, 0, 24, 60, 60, 1000);
572 
574  expect_unsuccess(0, r);
575 
577 
578  /* set to some valid value */
579  GetSystemTime(&ref);
581  expect(1, r);
582  r = SendMessageA(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&getSt);
583  expect(GDT_VALID, r);
584  expect_systime(&ref, &getSt);
585 
586  /* year invalid */
587  st = ref;
588  st.wYear = 0;
590  todo_wine expect(1, r);
591  r = SendMessageA(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&getSt);
592  expect(GDT_VALID, r);
593  expect_systime(&ref, &getSt);
594  /* month invalid */
595  st = ref;
596  st.wMonth = 13;
598  expect(0, r);
599  r = SendMessageA(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&getSt);
600  expect(GDT_VALID, r);
601  expect_systime(&ref, &getSt);
602  /* day invalid */
603  st = ref;
604  st.wDay = 32;
606  expect(0, r);
607  r = SendMessageA(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&getSt);
608  expect(GDT_VALID, r);
609  expect_systime(&ref, &getSt);
610  /* day invalid for current month */
611  st = ref;
612  st.wDay = 30;
613  st.wMonth = 2;
615  expect(0, r);
616  r = SendMessageA(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&getSt);
617  expect(GDT_VALID, r);
618  expect_systime(&ref, &getSt);
619  /* day of week isn't validated */
620  st = ref;
621  st.wDayOfWeek = 10;
623  expect(1, r);
624  r = SendMessageA(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&getSt);
625  expect(GDT_VALID, r);
626  expect_systime(&ref, &getSt);
627  /* hour invalid */
628  st = ref;
629  st.wHour = 25;
631  expect(0, r);
632  r = SendMessageA(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&getSt);
633  expect(GDT_VALID, r);
634  expect_systime(&ref, &getSt);
635  /* minute invalid */
636  st = ref;
637  st.wMinute = 60;
639  expect(0, r);
640  r = SendMessageA(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&getSt);
641  expect(GDT_VALID, r);
642  expect_systime(&ref, &getSt);
643  /* sec invalid */
644  st = ref;
645  st.wSecond = 60;
647  expect(0, r);
648  r = SendMessageA(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&getSt);
649  expect(GDT_VALID, r);
650  expect_systime(&ref, &getSt);
651  /* msec invalid */
652  st = ref;
653  st.wMilliseconds = 1000;
655  expect(0, r);
656  r = SendMessageA(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&getSt);
657  expect(GDT_VALID, r);
658  expect_systime(&ref, &getSt);
659 
660  /* day of week should be calculated automatically,
661  actual day of week for this date is 4 */
662  fill_systime_struct(&st, 2009, 10, 1, 1, 0, 0, 10, 200);
664  expect(1, r);
665  r = SendMessageA(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&getSt);
666  expect(GDT_VALID, r);
667  /* 01.10.2009 is Thursday */
668  expect(4, (LRESULT)getSt.wDayOfWeek);
669  st.wDayOfWeek = 4;
670  expect_systime(&st, &getSt);
671 }
672 
674 {
675  LRESULT r;
676  SYSTEMTIME st[2], getSt[2], refSt;
677  HWND hWnd;
678 
680 
682 
683  /* set range */
684  fill_systime_struct(&st[0], 1980, 1, 3, 23, 14, 34, 37, 465);
685  fill_systime_struct(&st[1], 2007, 3, 2, 31, 23, 59, 59, 999);
686 
688  expect(1, r);
689  r = SendMessageA(hWnd, DTM_GETRANGE, 0, (LPARAM)getSt);
690  ok(r == (GDTR_MIN | GDTR_MAX), "Expected %x, not %x(GDTR_MIN) or %x(GDTR_MAX), got %lx\n", (GDTR_MIN | GDTR_MAX), GDTR_MIN, GDTR_MAX, r);
691  expect_systime(&st[0], &getSt[0]);
692  expect_systime(&st[1], &getSt[1]);
693 
694  /* Initially set a valid time */
695  fill_systime_struct(&refSt, 1999, 9, 4, 9, 19, 9, 9, 999);
697  expect(1, r);
698  r = SendMessageA(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&getSt[0]);
699  ok(r == GDT_VALID, "Expected %d, not %d(GDT_NONE) or %d(GDT_ERROR), got %ld\n", GDT_VALID, GDT_NONE, GDT_ERROR, r);
700  expect_systime(&refSt, &getSt[0]);
701 
702  /* Now set an out-of-bounds time */
703  fill_systime_struct(&st[0], 2010, 1, 0, 1, 0, 0, 0, 0);
704 
706  expect(1, r);
707  r = SendMessageA(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&getSt[0]);
708  ok(r == GDT_VALID, "Expected %d, not %d(GDT_NONE) or %d(GDT_ERROR), got %ld\n", GDT_VALID, GDT_NONE, GDT_ERROR, r);
709  expect_systime(&refSt, &getSt[0]);
710 
711  fill_systime_struct(&st[0], 1977, 1, 0, 1, 0, 0, 0, 0);
712 
714  expect(1, r);
715  r = SendMessageA(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&getSt[0]);
716  ok(r == GDT_VALID, "Expected %d, not %d(GDT_NONE) or %d(GDT_ERROR), got %ld\n", GDT_VALID, GDT_NONE, GDT_ERROR, r);
717  expect_systime(&refSt, &getSt[0]);
718 
719  ok_sequence(sequences, DATETIME_SEQ_INDEX, test_dtm_set_and_get_systime_with_limits, "test_dtm_set_and_get_systime_with_limits", FALSE);
720 
722 }
723 
724 static void test_dtm_get_ideal_size(void)
725 {
726  HWND hwnd;
727  HDC hdc;
728  HFONT hfont;
729  LOGFONTA lf;
730  TEXTMETRICA tm;
731  SIZE size;
732  BOOL r;
733 
736  if (!r)
737  {
738  win_skip("DTM_GETIDEALSIZE is not available\n");
740  return;
741  }
742 
743  /* Set font so that the test is consistent on Wine and Windows */
744  ZeroMemory(&lf, sizeof(lf));
745  lf.lfWeight = FW_NORMAL;
746  lf.lfHeight = 20;
747  lstrcpyA(lf.lfFaceName, "Tahoma");
748  hfont = CreateFontIndirectA(&lf);
750 
751  hdc = GetDC(hwnd);
753  ReleaseDC(hwnd, hdc);
754 
756  ok(r, "Expect DTM_GETIDEALSIZE message to return true\n");
757  ok(size.cx > 0 && size.cy >= tm.tmHeight,
758  "Expect size.cx > 0 and size.cy >= %d, got cx:%d cy:%d\n", tm.tmHeight, size.cx, size.cy);
759 
762 }
763 
764 static void test_wm_set_get_text(void)
765 {
766  static const CHAR a_str[] = "a";
767  CHAR buff[16], time[16], caltype[3];
768  HWND hWnd;
769  LRESULT ret;
770 
772 
773  ret = SendMessageA(hWnd, WM_SETTEXT, 0, (LPARAM)a_str);
774  ok(CB_ERR == ret ||
775  broken(0 == ret) || /* comctl32 <= 4.72 */
776  broken(1 == ret), /* comctl32 <= 4.70 */
777  "Expected CB_ERR, got %ld\n", ret);
778 
779  buff[0] = 0;
780  ret = SendMessageA(hWnd, WM_GETTEXT, sizeof(buff), (LPARAM)buff);
781  ok(strcmp(buff, a_str) != 0, "Expected text to change, got %s\n", buff);
782  ok(ret != 0, "Expected non-zero return value\n");
783 
784  SetLastError(0xdeadbeef);
786  if (ret == 0)
787  skip("Must know local calendar type (%x)\n", GetLastError());
788  else if (atoi(caltype) != CAL_GREGORIAN)
789  skip("DateTimePicker Control only supports Gregorian calendar (type: %s)\n", caltype);
790  else {
791  SetLastError(0xdeadbeef);
793  if (ret == 0)
794  skip("GetDateFormat failed, returned %ld, error %d\n", ret, GetLastError());
795  else
796  ok(!strcmp(buff, time), "Expected %s, got %s\n", time, buff);
797  }
798 
800 }
801 
802 static void test_dts_shownone(void)
803 {
804  HWND hwnd;
805  DWORD style;
806 
807  /* it isn't allowed to change DTS_SHOWNONE after creation */
812  ok(!(style & DTS_SHOWNONE), "Expected DTS_SHOWNONE not to be set\n");
814 
819  ok(style & DTS_SHOWNONE, "Expected DTS_SHOWNONE to be set\n");
821 }
822 
823 static void init_functions(void)
824 {
825  HMODULE hComCtl32 = LoadLibraryA("comctl32.dll");
826 
827 #define X(f) p##f = (void*)GetProcAddress(hComCtl32, #f);
829 #undef X
830 }
831 
832 START_TEST(datetime)
833 {
834  INITCOMMONCONTROLSEX iccex;
835  ULONG_PTR cookie;
836  HANDLE ctxt;
837 
838  init_functions();
839 
840  iccex.dwSize = sizeof(iccex);
841  iccex.dwICC = ICC_DATE_CLASSES;
842  pInitCommonControlsEx(&iccex);
843 
845 
856 
857  if (!load_v6_module(&cookie, &ctxt))
858  return;
859 
867 
868  unload_v6_module(cookie, ctxt);
869 }
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
HGDIOBJ WINAPI GetStockObject(_In_ int)
#define DTM_GETRANGE
Definition: commctrl.h:4305
#define MCSC_MONTHBK
Definition: commctrl.h:4183
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
#define DTM_SETRANGE
Definition: commctrl.h:4307
Definition: tftpd.h:59
#define TRUE
Definition: types.h:120
int WINAPI GetWindowTextA(HWND hWnd, LPSTR lpString, int nMaxCount)
Definition: window.c:1296
static const struct message test_dtm_set_and_get_mccolor_seq[]
Definition: datetime.c:44
WORD wMonth
Definition: winbase.h:871
HDC WINAPI GetDC(_In_opt_ HWND)
#define MCSC_TEXT
Definition: commctrl.h:4180
HFONT WINAPI CreateFontIndirectA(_In_ const LOGFONTA *)
static void fill_systime_struct(SYSTEMTIME *st, int year, int month, int dayofweek, int day, int hour, int minute, int second, int milliseconds)
Definition: datetime.c:292
INT WINAPI GetDateFormatA(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCSTR lpFormat, LPSTR lpDateStr, INT cchOut)
Definition: lcformat.c:859
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
static HWND create_datetime_control(DWORD style)
Definition: datetime.c:160
INT WINAPI GetLocaleInfoA(LCID lcid, LCTYPE lctype, LPSTR buffer, INT len)
Definition: lang.c:1015
#define LOCALE_USER_DEFAULT
WORD wDayOfWeek
Definition: winbase.h:872
static DOUBLE day(DOUBLE time)
Definition: date.c:115
char CHAR
Definition: xmlstorage.h:175
static BOOL(WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX *)
#define WM_GETTEXT
Definition: winuser.h:1600
Definition: msg.h:39
GLenum GLuint GLenum GLsizei const GLchar * message
Definition: glext.h:5579
static HDC
Definition: imagelist.c:92
HWND hWnd
Definition: settings.c:17
#define LOCALE_ICALENDARTYPE
Definition: winnls.h:73
static LRESULT WINAPI datetime_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
Definition: datetime.c:139
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
#define ZeroMemory
Definition: winbase.h:1635
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
static const struct message test_dtm_set_and_get_range_seq[]
Definition: datetime.c:83
static void unload_v6_module(ULONG_PTR cookie, HANDLE hCtx)
Definition: v6util.h:63
#define expect(EXPECTED, GOT)
Definition: datetime.c:27
UINT_PTR WPARAM
Definition: windef.h:207
static LPARAM compare_systime_time(SYSTEMTIME *st1, SYSTEMTIME *st2)
Definition: datetime.c:312
__u16 time
Definition: mkdosfs.c:366
#define expect_systime_date(ST1, ST2)
Definition: datetime.c:329
#define expect_unsuccess(EXPECTED, GOT)
Definition: datetime.c:29
#define X(f)
BOOL WINAPI DestroyWindow(_In_ HWND)
Definition: send.c:47
WPARAM wParam
Definition: combotst.c:138
LRESULT WINAPI CallWindowProcA(_In_ WNDPROC, _In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
static void test_dtm_set_and_get_system_time(void)
Definition: datetime.c:528
uint32_t ULONG_PTR
Definition: typedefs.h:63
#define DTM_GETMCFONT
Definition: commctrl.h:4324
#define DTM_SETMCFONT
Definition: commctrl.h:4322
#define MCSC_TITLETEXT
Definition: commctrl.h:4182
WORD wYear
Definition: winbase.h:870
static void test_dtm_set_range_swap_min_max(void)
Definition: datetime.c:422
static void test_dtm_set_format(void)
Definition: datetime.c:184
LONG WINAPI GetWindowLongA(_In_ HWND, _In_ int)
static BOOL load_v6_module(ULONG_PTR *pcookie, HANDLE *hCtx)
Definition: v6util.h:71
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
static LPARAM compare_systime(SYSTEMTIME *st1, SYSTEMTIME *st2)
Definition: datetime.c:320
LONG lfHeight
Definition: dimm.idl:42
static UINT WPARAM LPARAM lparam
Definition: combo.c:716
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
Definition: loader.c:111
static LPARAM compare_systime_date(SYSTEMTIME *st1, SYSTEMTIME *st2)
Definition: datetime.c:304
GLenum GLint ref
Definition: glext.h:6028
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
static void init_msg_sequences(struct msg_sequence **seq, int n)
Definition: msg.h:391
#define GWLP_USERDATA
Definition: treelist.c:63
WORD wMinute
Definition: winbase.h:875
LONG lfWeight
Definition: dimm.idl:46
static void test_dtm_set_and_get_systemtime_with_limits(void)
Definition: datetime.c:673
smooth NULL
Definition: ftsmooth.c:416
static void test_dtm_set_and_get_mcfont(void)
Definition: datetime.c:256
#define DATETIMEPICK_CLASSA
Definition: commctrl.h:4295
LONG_PTR LPARAM
Definition: windef.h:208
#define DTM_GETMCCOLOR
Definition: commctrl.h:4318
BOOL WINAPI GetTextMetricsA(_In_ HDC, _Out_ LPTEXTMETRICA)
Definition: text.c:200
#define WM_SETTEXT
Definition: winuser.h:1599
static HFONT hfont
#define CB_ERR
Definition: winuser.h:2389
static const struct message test_dtm_set_and_get_system_time_seq[]
Definition: datetime.c:116
START_TEST(datetime)
Definition: datetime.c:832
#define ok(value,...)
Definition: CComObject.cpp:34
#define GetWindowLongPtrA
Definition: winuser.h:4697
#define DATETIME_SEQ_INDEX
Definition: datetime.c:32
#define ICC_DATE_CLASSES
Definition: commctrl.h:67
VOID WINAPI GetSystemTime(OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:317
GLsizeiptr size
Definition: glext.h:5919
static void test_dts_shownone(void)
Definition: datetime.c:802
static void test_dtm_get_monthcal(void)
Definition: datetime.c:274
DWORD COLORREF
Definition: windef.h:285
static void test_wm_set_get_text(void)
Definition: datetime.c:764
#define NUM_MSG_SEQUENCES
Definition: datetime.c:31
#define CAL_GREGORIAN
Definition: winnls.h:440
static const struct message test_dtm_set_and_get_systime_with_limits[]
Definition: datetime.c:127
#define RGB(r, g, b)
Definition: wingdi.h:2918
#define WINAPI
Definition: msvc.h:8
#define ok_sequence(seq, index, exp, contx, todo)
Definition: msg.h:387
static void test_dtm_get_ideal_size(void)
Definition: datetime.c:724
unsigned long DWORD
Definition: ntddk_ex.h:95
#define DTM_SETFORMATA
Definition: commctrl.h:4309
#define SetLastError(x)
Definition: compat.h:409
LPSTR WINAPI lstrcpyA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:100
static struct msg_sequence * sequences[NUM_MSG_SEQUENCES]
Definition: datetime.c:36
#define DTM_GETSYSTEMTIME
Definition: commctrl.h:4301
#define DEFAULT_GUI_FONT
Definition: wingdi.h:908
WORD wSecond
Definition: winbase.h:876
WORD wMilliseconds
Definition: winbase.h:877
#define GDTR_MAX
Definition: commctrl.h:4429
static const struct message test_dtm_get_monthcal_seq[]
Definition: datetime.c:78
#define DTM_GETMONTHCAL
Definition: commctrl.h:4320
#define DTM_SETSYSTEMTIME
Definition: commctrl.h:4303
int ret
Definition: msg.h:34
#define todo_wine
Definition: test.h:154
HDC hdc
Definition: main.c:9
BOOL WINAPI InitCommonControlsEx(const INITCOMMONCONTROLSEX *lpInitCtrls)
Definition: commctrl.c:893
static const struct message test_dtm_set_range_swap_min_max_seq[]
Definition: datetime.c:100
#define MCSC_BACKGROUND
Definition: commctrl.h:4179
#define GDTR_MIN
Definition: commctrl.h:4428
#define GDT_NONE
Definition: commctrl.h:4433
#define SetWindowLongPtrA
Definition: winuser.h:5214
Definition: time.h:76
#define GWLP_WNDPROC
Definition: treelist.c:66
#define broken(x)
Definition: _sntprintf.h:21
static void init_functions(void)
Definition: datetime.c:823
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
Definition: winuser.h:2859
#define GWL_STYLE
Definition: winuser.h:846
#define MCSC_TITLEBK
Definition: commctrl.h:4181
WORD wDay
Definition: winbase.h:873
#define GDT_ERROR
Definition: commctrl.h:4431
#define GDT_VALID
Definition: commctrl.h:4432
#define add_message(msg)
Definition: msg.c:2142
#define skip(...)
Definition: CString.cpp:57
WORD wHour
Definition: winbase.h:874
static void flush_sequences(struct msg_sequence **seq, int n)
Definition: msg.h:97
#define DTS_SHOWNONE
Definition: commctrl.h:4330
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
unsigned int UINT
Definition: ndis.h:50
LONG WINAPI SetWindowLongA(_In_ HWND, _In_ int, _In_ LONG)
#define MCSC_TRAILINGTEXT
Definition: commctrl.h:4184
#define WM_SETFONT
Definition: winuser.h:1632
#define FW_NORMAL
Definition: wingdi.h:372
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
#define msg(x)
Definition: auth_time.c:54
_Check_return_ int __cdecl atoi(_In_z_ const char *_Str)
#define expect_systime(ST1, ST2)
Definition: datetime.c:328
HWND WINAPI CreateWindowExA(_In_ DWORD dwExStyle, _In_opt_ LPCSTR lpClassName, _In_opt_ LPCSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
CHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:55
#define DTM_SETMCCOLOR
Definition: commctrl.h:4316
int month[12]
Definition: systime.c:13
LONG_PTR LRESULT
Definition: windef.h:209
Arabic default style
Definition: afstyles.h:93
#define win_skip
Definition: test.h:141
LPARAM lParam
Definition: combotst.c:139
#define DTM_GETIDEALSIZE
Definition: commctrl.h:4327
static unsigned char buff[32768]
Definition: fatten.c:17
static void test_mccolor_types(HWND hWndDateTime, int mccolor_type, const char *mccolor_name)
Definition: datetime.c:217
static const struct message test_dtm_set_and_get_mcfont_seq[]
Definition: datetime.c:72
static void test_dtm_set_and_get_range(void)
Definition: datetime.c:332
static UINT WPARAM wparam
Definition: combo.c:716
static void test_dtm_set_and_get_mccolor(void)
Definition: datetime.c:236
static const struct message test_dtm_set_format_seq[]
Definition: datetime.c:38