1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for _tcstoul
5 * PROGRAMMER: Thomas Faber <thfabba@gmx.de>
6 */
7
8 #define WIN32_NO_STATUS
9 #include <wine/test.h>
10 #include <tchar.h>
11 #include <pseh/pseh2.h>
12 #include <ndk/mmfuncs.h>
13 #include <ndk/rtlfuncs.h>
14
15 #define StartSeh() ExceptionStatus = STATUS_SUCCESS; _SEH2_TRY {
16 #define EndSeh(ExpectedStatus) } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { ExceptionStatus = _SEH2_GetExceptionCode(); } _SEH2_END; ok(ExceptionStatus == ExpectedStatus, "Exception %lx, expected %lx\n", ExceptionStatus, ExpectedStatus)
17
18 #define ok_ulong(expression, result) \
19 do { \
20 unsigned long _value = (expression); \
21 ok(_value == (result), "Wrong value for '%s', expected: " #result " (%lu), got: %lu\n", \
22 #expression, (unsigned long)(result), _value); \
23 } while (0)
24
START_TEST(tcstoul)25 START_TEST(tcstoul)
26 {
27 NTSTATUS ExceptionStatus;
28 ULONG Result;
29 _TCHAR Dummy;
30 _TCHAR *End;
31 struct
32 {
33 const _TCHAR *Input;
34 int ExpectedLength0;
35 ULONG Expected0;
36 int ExpectedLength10;
37 ULONG Expected10;
38 } Tests[] =
39 {
40 { _T(""), 0, 0, 0, 0 },
41 { _T(" "), 0, 0, 0, 0 },
42 { _T(" 0"), 2, 0, 2, 0 },
43 { _T("0 "), 1, 0, 1, 0 },
44 { _T("0"), 1, 0, 1, 0 },
45 { _T("1"), 1, 1, 1, 1 },
46 { _T("10"), 2, 10, 2, 10 },
47 { _T("01"), 2, 1, 2, 1 },
48 { _T("010"), 3, 8, 3, 10 },
49 { _T("08"), 1, 0, 2, 8 },
50 { _T("008"), 2, 0, 3, 8 },
51 { _T("-1"), 2, -1, 2, -1 },
52 { _T("+1"), 2, 1, 2, 1 },
53 { _T("--1"), 0, 0, 0, 0 },
54 { _T("++1"), 0, 0, 0, 0 },
55 { _T("0a"), 1, 0, 1, 0 },
56 { _T("0x"), 0, 0, 1, 0 },
57 { _T("0x0"), 3, 0, 1, 0 },
58 { _T("0xFFFFFFFF"), 10, -1, 1, 0 },
59 { _T("0xFFFFFFFFF"),11, -1, 1, 0 },
60 { _T("4294967295"), 10, -1, 10, -1 },
61 { _T("4294967296"), 10, -1, 10, -1 },
62 { _T("4294967297"), 10, -1, 10, -1 },
63 { _T("42949672951"),11, -1, 11, -1 },
64 };
65 const INT TestCount = sizeof(Tests) / sizeof(Tests[0]);
66 INT i;
67
68 StartSeh()
69 Result = _tcstoul(NULL, NULL, 0);
70 EndSeh(STATUS_ACCESS_VIOLATION);
71
72 StartSeh()
73 Result = _tcstoul(_T(""), NULL, 0);
74 ok_ulong(Result, 0);
75 EndSeh(STATUS_SUCCESS);
76
77 StartSeh()
78 Result = _tcstoul(_T("1"), NULL, 0);
79 ok_ulong(Result, 1);
80 EndSeh(STATUS_SUCCESS);
81
82 Result = _tcstoul(_T("1"), &End, 0);
83 ok_ulong(Result, 1);
84
85 for (i = 0; i < TestCount; i++)
86 {
87 #ifdef _UNICODE
88 trace("%d: '%ls'\n", i, Tests[i].Input);
89 #else
90 trace("%d: '%s'\n", i, Tests[i].Input);
91 #endif
92 End = &Dummy;
93 Result = _tcstoul(Tests[i].Input, &End, 0);
94 ok_ulong(Result, Tests[i].Expected0);
95 ok_ptr(End, Tests[i].Input + Tests[i].ExpectedLength0);
96
97 End = &Dummy;
98 Result = _tcstoul(Tests[i].Input, &End, 10);
99 ok_ulong(Result, Tests[i].Expected10);
100 ok_ptr(End, Tests[i].Input + Tests[i].ExpectedLength10);
101 }
102 }
103