Branch data Line data Source code
1 : : #include "sute.h"
2 : : #include <errno.h>
3 : :
4 : 15 : static void test_conversion(
5 : : int value,
6 : : unsigned int base,
7 : : const char *string)
8 : : {
9 : : char buffer[66]; /* 64 bits + sign + null terminator */
10 : 15 : itoa(value,buffer,base);
11 : :
12 : : /* Print original value in decimal and result in specified base */
13 : 15 : printf("Value: %d (decimal)\n",value);
14 : 15 : printf("Base %2u result: %s, %s\n",base,buffer,string);
15 : 15 : printf("-------------------\n");
16 : 15 : }
17 : :
18 : : /**
19 : : * @brief Test program for itoa function
20 : : *
21 : : * @note Tests edge cases and different bases with special focus on
22 : : * negative numbers and MIN/MAX integer values
23 : : */
24 : 1 : static void test_itoa(void)
25 : : {
26 : : /* Test extreme values */
27 : 1 : printf("=== Testing extreme values ===\n");
28 : 1 : test_conversion(INT_MAX,10,"2147483647");
29 : 1 : test_conversion(INT_MIN,10,"-2147483648");
30 : 1 : test_conversion(INT_MIN,16,"Should show in hex");
31 : :
32 : : /* Test regular cases */
33 : 1 : printf("\n=== Testing regular values ===\n");
34 : 1 : test_conversion(255,16,"FF");
35 : 1 : test_conversion(255,2,"11111111");
36 : 1 : test_conversion(-255,10,"-255");
37 : :
38 : : /* Test zero handling */
39 : 1 : printf("\n=== Testing zero ===\n");
40 : 1 : test_conversion(0,10,"0");
41 : 1 : test_conversion(0,16,"0");
42 : 1 : test_conversion(0,2,"0");
43 : :
44 : : /* Test larger bases */
45 : 1 : printf("\n=== Testing different bases ===\n");
46 : 1 : test_conversion(12345,36,"Maximum supported base");
47 : 1 : test_conversion(12345,16,"Common hex value");
48 : 1 : test_conversion(12345,8,"Octal");
49 : :
50 : : /* Test negative values in different bases */
51 : 1 : printf("\n=== Testing negative values ===\n");
52 : 1 : test_conversion(-12345,10,"Only base 10 shows negative sign");
53 : 1 : test_conversion(-12345,16,"Should show unsigned hex");
54 : 1 : test_conversion(-1,2,"All bits set");
55 : :
56 : 1 : printf("\n=== Few more examples ===\n");
57 : : char buffer[33]; /* Buffer for 32-bit integer */
58 : :
59 : : /* Decimal conversion */
60 : 1 : itoa(12345,buffer,10);
61 : 1 : puts(buffer);
62 : :
63 : : /* Hexadecimal conversion */
64 : 1 : itoa(255,buffer,16);
65 : 1 : puts(buffer);
66 : :
67 : : /* Binary conversion */
68 : 1 : itoa(15,buffer,2);
69 : 1 : puts(buffer);
70 : :
71 : : /* Negative number */
72 : 1 : itoa(-789,buffer,10);
73 : 1 : puts(buffer);
74 : :
75 : : /* Zero case */
76 : 1 : itoa(0,buffer,10);
77 : 1 : puts(buffer);
78 : :
79 : : char str[100];
80 : 1 : printf("Number: %d\nBase: %d\tConverted String: %s\n",1567,10,itoa(1567,str,10));
81 : 1 : printf("Base: %d\t\tConverted String: %s\n",2,itoa(1567,str,2));
82 : 1 : printf("Base: %d\t\tConverted String: %s\n",8,itoa(1567,str,8));
83 : 1 : printf("Base: %d\tConverted String: %s\n",16,itoa(1567,str,16));
84 : :
85 : 1 : printf("\n=== Invalid base handling ===\n");
86 : : char errbuf[4];
87 : 1 : char *ret = NULL;
88 : :
89 : 1 : errno = 0;
90 : 1 : ret = itoa(123,errbuf,0);
91 [ + - ]: 1 : printf("Base 0 result: '%s', errno: %d\n",ret ? ret : "NULL",errno);
92 : :
93 : 1 : errno = 0;
94 : 1 : ret = itoa(123,errbuf,1);
95 [ + - ]: 1 : printf("Base 1 result: '%s', errno: %d\n",ret ? ret : "NULL",errno);
96 : :
97 : 1 : errno = 0;
98 : 1 : ret = itoa(123,errbuf,37);
99 [ + - ]: 1 : printf("Base 37 result: '%s', errno: %d\n",ret ? ret : "NULL",errno);
100 : :
101 : 1 : printf("\n=== NULL buffer handling ===\n");
102 : 1 : errno = 0;
103 : 1 : ret = itoa(123,NULL,10);
104 [ - + ]: 1 : printf("NULL buffer result: %s, errno: %d\n",ret ? "non-NULL" : "NULL",errno);
105 : 1 : }
106 : :
107 : : /**
108 : : * @brief Test program for itoa function
109 : : *
110 : : */
111 : 1 : Return test0017(void)
112 : : {
113 : 1 : INITTEST;
114 : :
115 : 1 : create(char,captured_stdout);
116 : 1 : create(char,captured_stderr);
117 : :
118 : 1 : create(char,pattern);
119 : :
120 : 1 : ASSERT(SUCCESS == function_capture(test_itoa,captured_stdout,captured_stderr));
121 : :
122 : 1 : ASSERT(captured_stderr->length == 0);
123 : : #if 0
124 : : echo(STDOUT,"%s\n",getcstring(captured_stderr));
125 : : #endif
126 : :
127 : 1 : const char *template_name = "templates/0017.txt";
128 : 1 : ASSERT(SUCCESS == get_file_content(template_name,pattern));
129 : :
130 : : // Match the result against the pattern
131 : 1 : ASSERT(SUCCESS == match_pattern(captured_stdout,pattern,template_name));
132 : :
133 : : char buffer[8];
134 : 1 : char *result = NULL;
135 : :
136 : 1 : errno = 0;
137 : 1 : buffer[0] = 'X';
138 : 1 : result = itoa(123,buffer,0);
139 : 1 : ASSERT(result == buffer);
140 : 1 : ASSERT(errno == EINVAL);
141 : 1 : ASSERT(buffer[0] == '\0');
142 : :
143 : 1 : errno = 0;
144 : 1 : buffer[0] = 'Y';
145 : 1 : result = itoa(123,buffer,1);
146 : 1 : ASSERT(result == buffer);
147 : 1 : ASSERT(errno == EINVAL);
148 : 1 : ASSERT(buffer[0] == '\0');
149 : :
150 : 1 : errno = 0;
151 : 1 : buffer[0] = 'Z';
152 : 1 : result = itoa(123,buffer,37);
153 : 1 : ASSERT(result == buffer);
154 : 1 : ASSERT(errno == EINVAL);
155 : 1 : ASSERT(buffer[0] == '\0');
156 : :
157 : 1 : errno = 0;
158 : 1 : result = itoa(123,NULL,10);
159 : 1 : ASSERT(result == NULL);
160 : 1 : ASSERT(errno == EINVAL);
161 : :
162 : 1 : del(pattern);
163 : :
164 : 1 : del(captured_stdout);
165 : 1 : del(captured_stderr);
166 : :
167 : 1 : RETURN_STATUS;
168 : : }
|