1 #include "test.h"
2 
3 #include "../src/tlf.h"
4 #include "../src/addmult.h"
5 #include "../src/globalvars.h"
6 #include "../src/bands.h"
7 #include <stdio.h>
8 #include <unistd.h>
9 
10 // OBJECT ../src/addmult.o
11 // OBJECT ../src/bands.o
12 
13 extern struct mults_t multis[MAX_MULTS];
14 extern int nr_multis;
15 
16 extern char multsfile[];	/* name of file with a list of allowed
17 				   multipliers */
18 
19 char *testfile = "mults";
20 
21 /* export internal definition */
22 GSList *get_aliases(int n);
23 
24 /* helpers for writing a temporary multsfile for testing */
write_testfile(char * name,char * content)25 void write_testfile(char *name, char *content) {
26     FILE *fp;
27     fp = fopen(name, "w");
28     if (fp != NULL) {
29 	fputs(content, fp);
30 	fclose(fp);
31     }
32 }
33 
setup_multis(char * multstring)34 void setup_multis(char *multstring) {
35     write_testfile(testfile, multstring);
36     strcpy(multsfile, testfile);
37     init_and_load_multipliers();
38 }
39 
40 
setup_default(void ** state)41 int setup_default(void **state) {
42     bandinx = BANDINDEX_80;
43 
44     arrlss = 0;
45     shownewmult = -1;
46     wysiwyg_once = 0;
47     wysiwyg_multi = 0;
48     arrlss = 0;
49     serial_section_mult = 0;
50     sectn_mult = 0;
51     serial_grid4_mult = 0;
52     dx_arrlsections = 0;
53     ve_cty = 77;	/* random numbers just for test */
54     w_cty = 78;
55 
56     strcpy(comment, "");
57     strcpy(section, "");
58 
59     strcpy(multsfile, "");
60 
61     init_mults();
62 
63     unlink(testfile);
64 
65     return 0;
66 }
67 
68 /* tewst initialization of 'multis' */
test_init_mults(void ** state)69 void test_init_mults(void **state) {
70     nr_multis = 2;
71     strcpy(multis[0].name, "abc");
72     strcpy(multis[1].name, "abd");
73     multis[0].band = inxes[BANDINDEX_160];
74     multis[1].band = inxes[BANDINDEX_80];
75     init_mults();
76     assert_int_equal(nr_multis, 0);
77 
78     assert_string_equal(multis[0].name, "");
79     assert_int_equal(multis[0].band, 0);
80 }
81 
82 
83 /* tests for remember_multi */
test_remember_mult_empty(void ** state)84 void test_remember_mult_empty(void **state) {
85     assert_int_equal(remember_multi("", BANDINDEX_80, 0), -1);
86 }
87 
test_remember_mult_one(void ** state)88 void test_remember_mult_one(void **state) {
89     assert_int_equal(remember_multi("abc", BANDINDEX_80, 0), 0);
90     assert_int_equal(nr_multis, 1);
91     assert_string_equal(multis[0].name, "abc");
92     assert_int_equal(multis[0].band, inxes[BANDINDEX_80]);
93 }
94 
test_remember_mult_two(void ** state)95 void test_remember_mult_two(void **state) {
96     assert_int_equal(remember_multi("abc", BANDINDEX_80, 0), 0);
97     assert_int_equal(remember_multi("def", BANDINDEX_80, 0), 1);
98     assert_int_equal(nr_multis, 2);
99     assert_string_equal(multis[0].name, "abc");
100     assert_string_equal(multis[1].name, "def");
101     assert_int_equal(multis[0].band, inxes[BANDINDEX_80]);
102     assert_int_equal(multis[1].band, inxes[BANDINDEX_80]);
103 }
104 
test_remember_mult_same_2x(void ** state)105 void test_remember_mult_same_2x(void **state) {
106     assert_int_equal(remember_multi("abc", BANDINDEX_80, 0), 0);
107     assert_int_equal(remember_multi("abc", BANDINDEX_160, 0), -1);
108     assert_int_equal(nr_multis, 1);
109     assert_string_equal(multis[0].name, "abc");
110     assert_int_equal(multis[0].band, inxes[BANDINDEX_80] | inxes[BANDINDEX_160]);
111 }
112 
test_remember_mult_same_2x_newband(void ** state)113 void test_remember_mult_same_2x_newband(void **state) {
114     assert_int_equal(remember_multi("abc", BANDINDEX_80, 0), 0);
115     assert_int_equal(remember_multi("abc", BANDINDEX_160, 1), 0);
116     assert_int_equal(nr_multis, 1);
117     assert_string_equal(multis[0].name, "abc");
118     assert_int_equal(multis[0].band, inxes[BANDINDEX_80] | inxes[BANDINDEX_160]);
119 }
120 
121 
122 /* helpers for check of loading of possible mults */
test_write_mult(void ** state)123 void test_write_mult(void **state) {
124     FILE *fp;
125     char buffer[100];
126 
127     buffer[0] = '\0';
128     write_testfile(testfile, "Hallo");
129     fp = fopen(testfile, "r");
130     assert_non_null(fp);
131     char *p = fgets(buffer, sizeof(buffer), fp);
132     assert_ptr_equal(p, buffer);
133     assert_string_equal(buffer, "Hallo");
134 }
135 
136 
137 /* helper for checking content of mults_possible array */
check_multi(int pos,char * str)138 void check_multi(int pos, char * str) {
139     assert_string_equal(get_mult(pos), str);
140 }
141 
142 /* tests for load_multipliers */
test_load_multi_no_file(void ** state)143 void test_load_multi_no_file(void **state) {
144     assert_int_equal(init_and_load_multipliers(), 0);
145     assert_int_equal(get_mult_count(), 0);
146 }
147 
148 /** \todo better would be to return -1 if multsfile could not be found */
test_load_multi_file_not_found(void ** state)149 void test_load_multi_file_not_found(void **state) {
150     strcpy(multsfile, "nonsense");
151     assert_int_equal(init_and_load_multipliers(), 0);
152 }
153 
test_load_multi(void ** state)154 void test_load_multi(void **state) {
155     setup_multis("AB\n#LZ is not active\nKL\n 	\nZH\n");
156     assert_int_equal(get_mult_count(), 3);
157     check_multi(0, "AB");
158     check_multi(2, "ZH");
159 }
160 
test_load_multi_dos(void ** state)161 void test_load_multi_dos(void **state) {
162     setup_multis("AB\r\n#LZ is not active\r\nKL\r\n 	\r\nZH\r\n");
163     assert_int_equal(get_mult_count(), 3);
164     check_multi(0, "AB");
165     check_multi(2, "ZH");
166 }
167 
168 // leading space both on comment and data lines
test_load_multi_leading_space(void ** state)169 void test_load_multi_leading_space(void **state) {
170     setup_multis(" AB\n   #LZ is not active\nKL\n 	\nZH\n");
171     assert_int_equal(get_mult_count(), 3);
172     check_multi(0, "AB");
173     check_multi(2, "ZH");
174 }
175 
test_load_multi_sorted(void ** state)176 void test_load_multi_sorted(void **state) {
177     setup_multis("AB\n#LZ is not active\nZH\n 	\nKL\n");
178     assert_int_equal(get_mult_count(), 3);
179     check_multi(0, "AB");
180     check_multi(2, "ZH");
181 }
182 
test_load_multi_redefined(void ** state)183 void test_load_multi_redefined(void **state) {
184     setup_multis("AB\nKL\nZH\nKL\n");
185     assert_int_equal(get_mult_count(), 3);
186     check_multi(0, "AB");
187     check_multi(2, "ZH");
188 }
189 
190 
test_load_multi_with_emptyalias(void ** state)191 void test_load_multi_with_emptyalias(void **state) {
192     setup_multis("AB\nZH :\nZH\nKL\n");
193     assert_int_equal(get_mult_count(), 3);
194     check_multi(0, "AB");
195     check_multi(2, "ZH");
196     assert_int_equal(g_slist_length(get_aliases(2)), 0);
197 }
198 
test_load_multi_with_alias(void ** state)199 void test_load_multi_with_alias(void **state) {
200     setup_multis("AB\nZH: NH, ZD,AA\nZH\nKL\n");
201     assert_int_equal(get_mult_count(), 3);
202     check_multi(0, "AB");
203     check_multi(2, "ZH");
204     assert_int_equal(g_slist_length(get_aliases(2)), 3);
205 }
206 
207 /* test matching of mults and aliases */
test_match_length_no_match(void ** state)208 void test_match_length_no_match(void **state) {
209     setup_multis("ZH:NHA,ZDL,AA,AAC\n");
210     assert_int_equal(get_matching_length("ABC",0), 0);
211 }
212 
test_match_length_match_mult(void ** state)213 void test_match_length_match_mult(void **state) {
214     setup_multis("ZH:NHA,ZDL,AA,AAC\n");
215     assert_int_equal(get_matching_length("12aZHXc",0), 2);
216 }
217 
test_match_length_match_alias(void ** state)218 void test_match_length_match_alias(void **state) {
219     setup_multis("ZH:NHA,ZDL,AA,AAC\n");
220     assert_int_equal(get_matching_length("12aAAX2",0), 2);
221 }
222 
test_match_length_match_alias2(void ** state)223 void test_match_length_match_alias2(void **state) {
224     setup_multis("ZH:NHA,ZDL,AA,AAC\n");
225     assert_int_equal(get_matching_length("12aAAC2",0), 3);
226 }
227 
228 
229 /* addmult tests */
test_wysiwyg_once(void ** state)230 void test_wysiwyg_once(void **state) {
231     wysiwyg_once = 1;
232     strcpy(comment, "WAC   ");
233     assert_int_equal(addmult(), 0);
234     assert_string_equal(multis[0].name, "WAC");
235     assert_int_equal(shownewmult, 0);
236 }
237 
test_wysiwyg_multi(void ** state)238 void test_wysiwyg_multi(void **state) {
239     wysiwyg_multi = 1;
240     strcpy(comment, "WAC   ");
241     assert_int_equal(addmult(), 0);
242     assert_string_equal(multis[0].name, "WAC");
243     assert_int_equal(shownewmult, 0);
244 }
245 
test_wysiwyg_multi_empty(void ** state)246 void test_wysiwyg_multi_empty(void **state) {
247     wysiwyg_multi = 1;
248     strcpy(comment, "   ");
249     addmult();
250     assert_int_equal(shownewmult, -1);
251 }
252 
test_serial_grid4(void ** state)253 void test_serial_grid4(void **state) {
254     serial_grid4_mult = 1;
255     strcpy(section, "JO60LX");
256     assert_int_equal(addmult(), 0);
257     assert_string_equal(multis[0].name, "JO60");
258     assert_int_equal(shownewmult, 0);
259 }
260 
261 
test_serial_grid4_empty(void ** state)262 void test_serial_grid4_empty(void **state) {
263     serial_grid4_mult = 1;
264     addmult();
265     assert_int_equal(shownewmult, -1);
266 }
267 
test_arrlss(void ** state)268 void test_arrlss(void **state) {
269     arrlss = 1;
270     setup_multis("SC\nSCV\n");
271     strcpy(ssexchange, "SCV");
272     addmult();
273     strcpy(ssexchange, "97A23SCV");
274     addmult();
275     strcpy(ssexchange, "KL");
276     addmult();
277     strcpy(ssexchange, "SC");
278     addmult();
279     assert_int_equal(nr_multis, 2);
280     assert_string_equal(multis[0].name, "SCV");
281     assert_string_equal(multis[1].name, "SC");
282 }
283 
test_serial_section_mult(void ** state)284 void test_serial_section_mult(void **state) {
285     serial_section_mult = 1;
286     setup_multis("NE\nONE\n");
287     strcpy(ssexchange, "ONE");
288     addmult();
289     strcpy(ssexchange, "023");
290     addmult();
291     strcpy(ssexchange, "NE");
292     addmult();
293     strcpy(ssexchange, "SC");
294     addmult();
295     assert_int_equal(nr_multis, 2);
296 }
297 
test_dx_arrlsections(void ** state)298 void test_dx_arrlsections(void **state) {
299     dx_arrlsections = 1;
300     countrynr = w_cty;
301     setup_multis("NE\nONE\n");
302     strcpy(ssexchange, "ONE");
303     addmult();
304     strcpy(ssexchange, "97A23SCV");
305     addmult();
306     strcpy(ssexchange, "NE");
307     addmult();
308     strcpy(ssexchange, "SC");
309     addmult();
310     assert_int_equal(nr_multis, 2);
311 }
312 
313 
314 /* addmult2 tests */
315 char logline[] =
316     " 20CW  08-Feb-11 17:06 0025  W3ND           599  599   95 A 12 SCV            2 ";
317 
318 char logline_2[] =
319     " 20CW  08-Feb-11 17:06 0025  W3ND           599  599  WAC                     2 ";
320 
test_arrlss_2(void ** state)321 void test_arrlss_2(void **state) {
322     arrlss = 1;
323     setup_multis("SC\nSCV\n");
324     strcpy(lan_logline, logline);
325     addmult2();
326     memcpy(lan_logline + 54, " 97 A 23 SCV", 12);
327     addmult2();
328     memcpy(lan_logline + 63, "KL ", 3);
329     addmult2();
330     memcpy(lan_logline + 63, "SC ", 3);
331     addmult2();
332     assert_int_equal(nr_multis, 2);
333     assert_string_equal(multis[0].name, "SCV");
334     assert_string_equal(multis[1].name, "SC");
335 }
336 
test_wysiwyg_once_2(void ** state)337 void test_wysiwyg_once_2(void **state) {
338     wysiwyg_once = 1;
339     strcpy(lan_logline, logline_2);
340     assert_int_equal(addmult2(), 0);
341     assert_string_equal(multis[0].name, "WAC");
342     assert_int_equal(shownewmult, 0);
343 }
344 
345 
test_wysiwyg_multi_2(void ** state)346 void test_wysiwyg_multi_2(void **state) {
347     wysiwyg_multi = 1;
348     strcpy(lan_logline, logline_2);
349     assert_int_equal(addmult2(), 0);
350     assert_string_equal(multis[0].name, "WAC");
351     assert_int_equal(shownewmult, 0);
352 }
353 
354 
355