Usermode/utests - Fix DNS utest, update libc utests to new format (no more EXP files)
[tpg/acess2.git] / Usermode / Libraries / libc.so_src / TEST_strtoi.c
1 /*
2  * Acess2 C Library (Test)
3  * - By John Hodge (thePowersGang)
4  *
5  * TEST_strtoi.c
6  * - Tests for strtoi.c
7  */
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <errno.h>
11 #include <limits.h>
12 #include <string.h>     // strerror
13
14 #define STR_(v) #v
15 #define STR(v)  STR_(v)
16 #define TST(t, class, base, val, exp, fmt, ofs, exp_errno) do {\
17         const char *in = val;\
18         char *end;\
19         errno = 0;\
20         t ret = strto##class(in, &end, base); \
21         if( ret != exp ) { \
22                 fprintf(stderr, "FAIL strto"#class"('%s') != "#exp" (act "fmt")\n", in, ret);\
23                 exit(1); \
24         } \
25         if( end != in+ofs ) { \
26                 fprintf(stderr, "FAIL strto"#class"('%s') returned wrong end: %p (+%zi) instead of %p (+%zi)\n",\
27                         in,end,end-in,in+ofs,(size_t)ofs);\
28                 exit(1); \
29         } \
30         if( exp_errno != errno ) { \
31                 fprintf(stderr, "FAIL strto"#class"('%s') returned wrong errno, exp '%s', got '%s'\n",\
32                         in, strerror(exp_errno), strerror(errno));\
33                 exit(1); \
34         } \
35 }while(0)
36
37 #define PRIMEBUF(fmt, val)      buf_len = snprintf(buf, sizeof(buf), fmt, val)
38
39 int main(int argc, char *argv[])
40 {
41         char buf[64];
42         size_t  buf_len;
43         
44         // Success cases
45         TST(unsigned long, ul, 0, "0x10ec", 0x10ec, "%lx", 2+4, 0);
46         TST(unsigned long long, ull, 0, "0xffeed10ec", 0xffeed10ec, "%llx", 2+9, 0);
47         TST(unsigned long long, ull, 0, "01234567", 01234567, "%llo", 8, 0);
48         TST(unsigned long long, ull, 0, "1234567", 1234567, "%lld", 7, 0);
49         TST(long long, ll, 0, "-1", -1, "%lld", 2, 0);  // -1
50         TST(long long, ll, 0, "100113", 100113, "%lld", strlen(in), 0);
51         TST(long long, ll, 0, "0x101", 0x101, "0x%llx", strlen(in), 0);
52         
53         // Invalid strings
54         TST(unsigned long long, ull, 0, "0x",  0, "%llx", 1, 0);        // Single 0
55         TST(unsigned long long, ull, 0, "0xg", 0, "%llx", 1, 0);        // Single 0
56         TST(unsigned long long, ull, 0, "-a", 0, "%llx", 0, 0); // Nothing
57         TST(long long, ll, 0, "-a", 0, "%lld", 0, 0);   // Nothing
58         TST(long long, ll, 0, "-1aaatg", -1, "%lld", 2, 0);     // -1 (with traling junk)
59         TST(long long, ll, 0, "-+1aaatg", 0, "%lld", 0, 0);     // Nothing
60         TST(long long, ll, 0, "-  1", 0, "%lld", 0, 0); // Nothing
61         TST(long long, ll, 0, "01278  1", 0127, "%lld", 4, 0);  // 0127 with junk
62         
63         // Range edges
64         PRIMEBUF("0x%llx", ULLONG_MAX);
65         TST(unsigned long long, ull, 0, buf, ULLONG_MAX, "0x%llx", buf_len, 0);
66         PRIMEBUF("%llu", ULLONG_MAX);
67         TST(unsigned long long, ull, 0, buf, ULLONG_MAX, "%llu", buf_len, 0);
68         PRIMEBUF("-%llu", (long long)LONG_MAX);
69         TST(long, l, 0, buf, -LONG_MAX, "%ld", buf_len, 0);
70         
71         // Out of range
72         // - When the range limit is hit, valid characters should still be consumed (just not used)
73         TST(unsigned long long, ull, 0, "0x10000FFFF0000FFFF", ULLONG_MAX, "%llx", strlen(in), ERANGE);
74         TST(unsigned long, ul, 0, "0x10000FFFF0000FFFF", ULONG_MAX, "%lx", strlen(in), ERANGE);
75         TST(long, l, 0, "0x10000FFFF0000FFFF", LONG_MAX, "%ld", strlen(in), ERANGE);
76         TST(long, l, 0, "-0x10000FFFF0000FFFF", LONG_MIN, "%ld", strlen(in), ERANGE);
77         if( LONG_MIN < -LONG_MAX )
78         {
79                 // Ensure that if -LONG_MIN is greater than LONG_MAX, that converting it leaves a range error
80                 PRIMEBUF("%ld", LONG_MIN);
81                 TST(long, l, 0, buf+1, LONG_MAX, "%ld", buf_len-1, ERANGE);
82         }
83 }

UCC git Repository :: git.ucc.asn.au