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 : if(captured_stderr->length > 0)
123 : : {
124 : 0 : echo(STDERR,"ERROR: Stderr buffer is not empty. It contains characters: %zu\n",captured_stderr->length);
125 : 0 : status = FAILURE;
126 : : #if 0
127 : : echo(STDOUT,"%s\n",getcstring(captured_stderr));
128 : : #endif
129 : : }
130 : :
131 : 1 : const char *template_name = "templates/0017.txt";
132 [ + - + - ]: 1 : ASSERT(SUCCESS == get_file_content(template_name,pattern));
133 : :
134 : : // Match the result against the pattern
135 [ + - + - ]: 1 : ASSERT(SUCCESS == match_pattern(captured_stdout,pattern,template_name));
136 : :
137 : : char buffer[8];
138 : 1 : char *result = NULL;
139 : :
140 : 1 : errno = 0;
141 : 1 : buffer[0] = 'X';
142 : 1 : result = itoa(123,buffer,0);
143 [ + - + - ]: 1 : ASSERT(result == buffer);
144 [ + - + - ]: 1 : ASSERT(errno == EINVAL);
145 [ + - + - ]: 1 : ASSERT(buffer[0] == '\0');
146 : :
147 : 1 : errno = 0;
148 : 1 : buffer[0] = 'Y';
149 : 1 : result = itoa(123,buffer,1);
150 [ + - + - ]: 1 : ASSERT(result == buffer);
151 [ + - + - ]: 1 : ASSERT(errno == EINVAL);
152 [ + - + - ]: 1 : ASSERT(buffer[0] == '\0');
153 : :
154 : 1 : errno = 0;
155 : 1 : buffer[0] = 'Z';
156 : 1 : result = itoa(123,buffer,37);
157 [ + - + - ]: 1 : ASSERT(result == buffer);
158 [ + - + - ]: 1 : ASSERT(errno == EINVAL);
159 [ + - + - ]: 1 : ASSERT(buffer[0] == '\0');
160 : :
161 : 1 : errno = 0;
162 : 1 : result = itoa(123,NULL,10);
163 [ + - + - ]: 1 : ASSERT(result == NULL);
164 [ + - + - ]: 1 : ASSERT(errno == EINVAL);
165 : :
166 : 1 : del(pattern);
167 : :
168 : 1 : del(captured_stdout);
169 : 1 : del(captured_stderr);
170 : :
171 [ + - - + : 1 : RETURN_STATUS;
- - - + +
- ]
172 : : }
|