]> git.sur5r.net Git - glabels/blob - bc-backends/qrencode-3.1.0/tests/test_monkey.c
Relocated barcode backends.
[glabels] / bc-backends / qrencode-3.1.0 / tests / test_monkey.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <errno.h>
4 #include "common.h"
5 #include "../qrinput.h"
6 #include "../split.h"
7 #include "../qrspec.h"
8 #include "../rscode.h"
9
10 #define MAX_LENGTH 7091
11 static char data[MAX_LENGTH];
12 static char check[MAX_LENGTH];
13
14 static const char *AN = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:";
15
16 #define drand(__scale__) ((__scale__) * (double)rand() / ((double)RAND_MAX + 1.0))
17
18 int fill8bitData(void)
19 {
20         int len, i;
21
22         len = 1 + (int)drand((MAX_LENGTH - 2));
23         for(i=0; i<len; i++) {
24                 data[i] = (unsigned char)drand(255) + 1;
25         }
26         data[len] = '\0';
27
28         return len;
29 }
30
31 void test_split_an(int num)
32 {
33         QRinput *input;
34         QRinput_List *list;
35         int len, i, ret;
36
37         len = 1 + (int)drand((MAX_LENGTH - 2));
38         for(i=0; i<len; i++) {
39                 data[i] = AN[(int)drand(45)];
40         }
41         data[len] = '\0';
42
43         input = QRinput_new2(0, QR_ECLEVEL_L);
44         if(input == NULL) {
45                 perror("test_split_an aborted at QRinput_new2():");
46                 return;
47         }
48         ret = Split_splitStringToQRinput(data, input, QR_MODE_8, 1);
49         if(ret < 0) {
50                 perror("test_split_an aborted at Split_splitStringToQRinput():");
51                 QRinput_free(input);
52                 return;
53         }
54         list = input->head;
55         i = 0;
56         while(list != NULL) {
57                 memcpy(check + i, list->data, list->size);
58                 i += list->size;
59                 list = list->next;
60         }
61         if(i != len) {
62                 printf("#%d: length is not correct. (%d should be %d)\n", num, i, len);
63         }
64
65         check[i] = '\0';
66         ret = memcmp(data, check, len);
67         if(ret != 0) {
68                 printf("#%d: data mismatched.\n", num);
69                 list = input->head;
70                 i = 0;
71                 while(list != NULL) {
72                         ret = memcmp(data + i, list->data, list->size);
73                         printf("wrong chunk:\n");
74                         printf(" position: %d\n", i);
75                         printf(" mode    : %d\n", list->mode);
76                         printf(" size    : %d\n", list->size);
77                         printf(" data    : %.*s\n", list->size, list->data);
78                         i += list->size;
79                         list = list->next;
80                 }
81                 exit(1);
82         }
83         QRinput_free(input);
84 }
85
86 void monkey_split_an(int loop)
87 {
88         int i;
89
90         puts("Monkey test: Split_splitStringToQRinput() - AlphaNumeric string.");
91         srand(0);
92         for(i=0; i<loop; i++) {
93                 test_split_an(i);
94         }
95 }
96
97 void test_split_8(int num)
98 {
99         QRinput *input;
100         QRinput_List *list;
101         int len, i, ret;
102
103         len = fill8bitData();
104
105         input = QRinput_new2(0, QR_ECLEVEL_L);
106         if(input == NULL) {
107                 perror("test_split_8 aborted at QRinput_new2():");
108                 return;
109         }
110         ret = Split_splitStringToQRinput(data, input, QR_MODE_8, 1);
111         if(ret < 0) {
112                 perror("test_split_8 aborted at Split_splitStringToQRinput():");
113                 QRinput_free(input);
114                 return;
115         }
116         list = input->head;
117         i = 0;
118         while(list != NULL) {
119                 memcpy(check + i, list->data, list->size);
120                 i += list->size;
121                 list = list->next;
122         }
123         if(i != len) {
124                 printf("#%d: length is not correct. (%d should be %d)\n", num, i, len);
125         }
126
127         check[i] = '\0';
128         ret = memcmp(data, check, len);
129         if(ret != 0) {
130                 printf("#%d: data mismatched.\n", num);
131                 list = input->head;
132                 i = 0;
133                 while(list != NULL) {
134                         ret = memcmp(data + i, list->data, list->size);
135                         printf("wrong chunk:\n");
136                         printf(" position: %d\n", i);
137                         printf(" mode    : %d\n", list->mode);
138                         printf(" size    : %d\n", list->size);
139                         printf(" data    : %.*s\n", list->size, list->data);
140                         i += list->size;
141                         list = list->next;
142                 }
143                 exit(1);
144         }
145         QRinput_free(input);
146 }
147
148 void monkey_split_8(int loop)
149 {
150         int i;
151
152         puts("Monkey test: Split_splitStringToQRinput() - 8bit char string.");
153         srand(0);
154         for(i=0; i<loop; i++) {
155                 test_split_8(i);
156         }
157 }
158
159 void test_split_kanji(int num)
160 {
161         QRinput *input;
162         QRinput_List *list;
163         int len, i, ret;
164
165         len = fill8bitData();
166
167         input = QRinput_new2(0, QR_ECLEVEL_L);
168         if(input == NULL) {
169                 perror("test_split_kanji aborted at QRinput_new2():");
170                 return;
171         }
172         ret = Split_splitStringToQRinput(data, input, QR_MODE_KANJI, 1);
173         if(ret < 0) {
174                 perror("test_split_kanji aborted at Split_splitStringToQRinput():");
175                 QRinput_free(input);
176                 return;
177         }
178         list = input->head;
179         i = 0;
180         while(list != NULL) {
181                 memcpy(check + i, list->data, list->size);
182                 i += list->size;
183                 list = list->next;
184         }
185         if(i != len) {
186                 printf("#%d: length is not correct. (%d should be %d)\n", num, i, len);
187         }
188
189         check[i] = '\0';
190         ret = memcmp(data, check, len);
191         if(ret != 0) {
192                 printf("#%d: data mismatched.\n", num);
193                 list = input->head;
194                 i = 0;
195                 while(list != NULL) {
196                         ret = memcmp(data + i, list->data, list->size);
197                         printf("wrong chunk:\n");
198                         printf(" position: %d\n", i);
199                         printf(" mode    : %d\n", list->mode);
200                         printf(" size    : %d\n", list->size);
201                         printf(" data    : %.*s\n", list->size, list->data);
202                         i += list->size;
203                         list = list->next;
204                 }
205                 exit(1);
206         }
207         QRinput_free(input);
208 }
209
210 void monkey_split_kanji(int loop)
211 {
212         int i;
213
214         puts("Monkey test: Split_splitStringToQRinput() - kanji string.");
215         srand(0);
216         for(i=0; i<loop; i++) {
217                 test_split_kanji(i);
218         }
219 }
220
221 void test_split_structure(int num)
222 {
223         QRinput *input;
224         QRinput_Struct *s;
225         QRcode_List *codes, *list;
226         QRinput_InputList *il;
227         int version;
228         QRecLevel level;
229         int len, c, i, ret;
230
231         version = (int)drand(40) + 1;
232         level = (QRecLevel)drand(4);
233
234         len = fill8bitData();
235
236         input = QRinput_new2(version, level);
237         if(input == NULL) {
238                 perror("test_split_structure aborted at QRinput_new2():");
239                 return;
240         }
241         ret = Split_splitStringToQRinput(data, input, QR_MODE_KANJI, 1);
242         if(ret < 0) {
243                 perror("test_split_structure aborted at Split_splitStringToQRinput():");
244                 QRinput_free(input);
245                 return;
246         }
247         s = QRinput_splitQRinputToStruct(input);
248         if(s == NULL) {
249                 if(errno != 0 && errno != ERANGE) {
250                         perror("test_split_structure aborted at QRinput_splitQRinputToStruct():");
251                 }
252                 QRinput_free(input);
253                 return;
254         }
255         il = s->head;
256         i = 0;
257         while(il != NULL) {
258                 if(il->input->version != version) {
259                         printf("Test: version %d, level %c\n", version, levelChar[level]);
260                         printf("wrong version number.\n");
261                         printQRinputInfo(il->input);
262                         exit(1);
263                 }
264                 i++;
265                 il = il->next;
266         }
267         codes = QRcode_encodeInputStructured(s);
268         if(codes == NULL) {
269                 perror("test_split_structure aborted at QRcode_encodeInputStructured():");
270                 QRinput_free(input);
271                 QRinput_Struct_free(s);
272                 return;
273         }
274         list = codes;
275         il = s->head;
276         c = 0;
277         while(list != NULL) {
278                 if(list->code->version != version) {
279                         printf("#%d: data mismatched.\n", num);
280                         printf("Test: version %d, level %c\n", version, levelChar[level]);
281                         printf("code #%d\n", c);
282                         printf("Version mismatch: %d should be %d\n", list->code->version, version);
283                         printf("max bits: %d\n", QRspec_getDataLength(version, level) * 8 - 20);
284                         printQRinputInfo(il->input);
285                         printQRinput(input);
286                         exit(1);
287                 }
288                 list = list->next;
289                 il = il->next;
290                 c++;
291         }
292
293         QRinput_free(input);
294         QRinput_Struct_free(s);
295         QRcode_List_free(codes);
296 }
297
298 void monkey_split_structure(int loop)
299 {
300         int i;
301
302         puts("Monkey test: QRinput_splitQRinputToStruct.");
303         srand(0);
304         for(i=0; i<loop; i++) {
305                 test_split_structure(i);
306         }
307 }
308
309 int main(int argc, char **argv)
310 {
311         int loop = 1000;
312         if(argc == 2) {
313                 loop = atoi(argv[1]);
314         }
315         monkey_split_an(loop);
316         monkey_split_8(loop);
317         monkey_split_kanji(loop);
318         monkey_split_structure(loop);
319
320         QRspec_clearCache();
321         free_rs_cache();
322
323         report();
324
325         return 0;
326 }