]> git.sur5r.net Git - cc65/blob - test/val/add3.c
All regression-tests subdirectories are cleaned before the first test starts, so...
[cc65] / test / val / add3.c
1 /*
2   !!DESCRIPTION!! Addition tests - mostly int's
3   !!ORIGIN!!      SDCC regression tests
4   !!LICENCE!!     GPL, read COPYING.GPL
5 */
6
7 #include "common.h"
8
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <limits.h>
12
13 unsigned char failures=0;
14
15 char char0 = 0;
16 char char1 = 0;
17 char char2 = 0;
18
19 /*
20   this test assumes:
21   sizeof(char) == 1
22   sizeof(int)  == 2
23   sizeof(long) == 4
24 */
25
26 #ifdef REFERENCE
27
28 /*
29    make sure the reference output uses types with
30    proper size
31 */
32
33 #include <stdint.h>
34
35 #ifdef SIZEOF_INT_16BIT
36 int16_t int0 = 0;
37 int16_t int1 = 0;
38 #else
39 int32_t int0 = 0;
40 int32_t int1 = 0;
41 #endif
42 int32_t long0 = 0;
43 int32_t long1 = 0;
44 uint32_t ulong0 = 0;
45 uint32_t ulong1 = 0;
46
47 #else
48
49 int int0 = 0;
50 int int1 = 0;
51 long long0 = 0;
52 long long1 = 0;
53 unsigned long ulong0 = 0;
54 unsigned long ulong1 = 0;
55
56 #endif
57
58 #ifdef SUPPORT_BIT_TYPES
59
60 bit bit0 = 0;
61 bit bit1 = 0;
62 bit bit2 = 0;
63 bit bit3 = 0;
64 bit bit4 = 0;
65 bit bit5 = 0;
66 bit bit6 = 0;
67 bit bit7 = 0;
68 bit bit8 = 0;
69 bit bit9 = 0;
70 bit bit10 = 0;
71 bit bit11 = 0;
72
73 #endif
74
75 void done(char *name)
76 {
77   printf("%s done - failures: %d\n", name, failures);
78
79   if(failures)
80     exit(failures);
81 }
82
83 void add_char2char(void)
84 {
85   if(char0 != 4)
86     failures++;
87   if(char1 != 5)
88     failures++;
89
90   char0 = char0 + char1;
91
92   if(char0 != 9)
93     failures++;
94
95   char0 += 127;
96
97 #if (!defined(REFCC) && defined(UNSIGNED_CHARS)) || (defined(REFCC) && defined(REFCC_UNSIGNED_CHARS))
98   if(char0 < 0)
99     failures++;
100
101   if(char0 != (127+9))
102     failures++;
103 #else
104   if(char0 > 0)
105     failures++;
106
107   if(char0 != -0x78)
108     failures++;
109 #endif
110
111   done("add_char2char");
112 }
113
114 void add_compound_char(void)
115 {
116   char0 = char1+5;
117
118   if(char0 != 9)
119     failures++;
120
121   if((char0+char1) != 13)
122     failures++;
123
124   done("add_compound_char");
125 }
126
127 void add_int2int(void)
128 {
129   if(int0 != 4)
130     failures++;
131   if(int1 != 5)
132     failures++;
133
134   int0 += int1;
135   if(int0 != 9)
136     failures++;
137
138   int0 += 0x7fff;
139   if(int0 != -0x7ff8)
140     failures++;
141
142   done("add_int2int");
143 }
144
145 void add_compound_int(void)
146 {
147   int0 = int1+5;
148
149   if(int0 != 9)
150     failures++;
151
152   if((int0+int1) != 13)
153     failures++;
154
155   done("add_compound_int");
156 }
157
158 void add_lit2long(void)
159 {
160   if(long0 != 0)
161     failures++;
162
163   long0++;
164
165   if(long0 != 1)
166     failures++;
167
168   long0 = long0 + 0xff;
169
170   if(long0 != 0x100)
171     failures++;
172
173   long0 = long0 + 0x100;
174   if(long0 != 0x200)
175     failures++;
176
177   long0 = long0 + 0xfe00;
178   if(long0 != 0x10000)
179     failures++;
180
181   long0 = long0 + 0xff0000;
182   if(long0 != 0x1000000)
183     failures++;
184
185   long0 = long0 + 0x7e000000;
186   if(long0 != 0x7f000000)
187     failures++;
188
189   /* wrap around zero */
190   long0 = long0 + 0x2000000;
191   if(long0 != -0x7f000000)
192     failures++;
193
194   long0 = long0 + 0x7f000000;
195   if(long0 != 0)
196     failures++;
197
198   done("add_lit2long");
199 }
200
201 void add_lit2ulong(void)
202 {
203   if(ulong0 != 0)
204     failures++;
205
206   ulong0++;
207
208   if(ulong0 != 1)
209     failures++;
210
211   ulong0 = ulong0 + 0xff;
212
213   if(ulong0 != 0x100)
214     failures++;
215
216   ulong0 = ulong0 + 0x100;
217   if(ulong0 != 0x200)
218     failures++;
219
220   ulong0 = ulong0 + 0xfe00;
221   if(ulong0 != 0x10000)
222     failures++;
223
224   ulong0 = ulong0 + 0xff0000;
225   if(ulong0 != 0x1000000)
226     failures++;
227
228   ulong0 = ulong0 + 0x7e000000;
229   if(ulong0 != 0x7f000000)
230     failures++;
231
232   ulong0 = ulong0 + 0x2000000;
233   if(ulong0 != 0x81000000)
234     failures++;
235
236   /* wrap around zero */
237   ulong0 = ulong0 + 0x7f000000;
238   if(ulong0)
239     failures++;
240
241   done("add_lit2ulong");
242 }
243
244 int main(void)
245 {
246   char0=4;
247   char1 = char0 + 1;
248   add_char2char();
249
250   char1=4;
251   add_compound_char();
252
253   int0 = 4;
254   int1 = int0 + 1;
255   add_int2int();
256
257   int1=4;
258   add_compound_int();
259
260   add_lit2long();
261   add_lit2ulong();
262
263   /* if not exit() */
264   return 0;
265 }