Wapcaplet
Loading...
Searching...
No Matches
basictests.c
Go to the documentation of this file.
1/* test/basictests.c
2 *
3 * Basic tests for the test suite for libwapcaplet
4 *
5 * Copyright 2009 The NetSurf Browser Project
6 * Daniel Silverstone <dsilvers@netsurf-browser.org>
7 */
8
9#include <check.h>
10#include <stdlib.h>
11#include <string.h>
12
13#include "tests.h"
14
15#ifndef UNUSED
16#define UNUSED(x) (void)(x)
17#endif
18
19#ifndef NDEBUG
20
23
24/* All the basic assert() tests */
25START_TEST (test_lwc_intern_string_aborts1)
26{
27 (void) lwc_intern_string(NULL, 0, null_lwc_p);
28}
29END_TEST
30
31START_TEST (test_lwc_intern_string_aborts2)
32{
33 (void) lwc_intern_string("A", 1, null_lwc_p);
34}
35END_TEST
36
37START_TEST (test_lwc_intern_substring_aborts1)
38{
40}
41END_TEST
42
43START_TEST (test_lwc_intern_substring_aborts2)
44{
45 lwc_string *str;
46 ck_assert_msg(lwc_intern_string("Jam", 3, &str) == lwc_error_ok,
47 "unable to intern 'Jam'");
48
49 lwc_intern_substring(str, 88, 77, null_lwc_p);
50}
51END_TEST
52
53START_TEST (test_lwc_string_tolower_aborts1)
54{
56}
57END_TEST
58
59START_TEST (test_lwc_string_tolower_aborts2)
60{
61 lwc_string *str;
62 ck_assert_msg(lwc_intern_string("Badger", 6, &str) == lwc_error_ok,
63 "unable to intern 'Badger'");
64
66}
67END_TEST
68
69START_TEST (test_lwc_string_ref_aborts)
70{
71 lwc_string_ref(null_lwc);
72}
73END_TEST
74
75START_TEST (test_lwc_string_unref_aborts)
76{
78}
79END_TEST
80
81START_TEST (test_lwc_string_data_aborts)
82{
84}
85END_TEST
86
87START_TEST (test_lwc_string_length_aborts)
88{
90}
91END_TEST
92
93START_TEST (test_lwc_string_hash_value_aborts)
94{
96}
97END_TEST
98
99#endif
100
101/**** The next set of tests need a fixture set ****/
102
103static void
104with_simple_context_setup(void)
105{
106 /* Nothing to set up */
107}
108
109static void
110with_simple_context_teardown(void)
111{
112 /* Nothing to do to tear down */
113}
114
115START_TEST (test_lwc_intern_string_ok)
116{
117 lwc_string *str = NULL;
118 ck_assert_msg(lwc_intern_string("A", 1, &str) == lwc_error_ok,
119 "Unable to intern a simple string");
120 ck_assert_msg(str != NULL,
121 "Returned OK but str was still NULL");
122}
123END_TEST
124
125START_TEST (test_lwc_intern_string_twice_ok)
126{
127 lwc_string *str1 = NULL, *str2 = NULL;
128 ck_assert_msg(lwc_intern_string("A", 1, &str1) == lwc_error_ok,
129 "Unable to intern a simple string");
130 ck_assert_msg(str1 != NULL,
131 "Returned OK but str was still NULL");
132 ck_assert_msg(lwc_intern_string("B", 1, &str2) == lwc_error_ok,
133 "Unable to intern a simple string");
134 ck_assert_msg(str2 != NULL,
135 "Returned OK but str was still NULL");
136}
137END_TEST
138
139START_TEST (test_lwc_intern_string_twice_same_ok)
140{
141 lwc_string *str1 = NULL, *str2 = NULL;
142 ck_assert_msg(lwc_intern_string("A", 1, &str1) == lwc_error_ok,
143 "Unable to intern a simple string");
144 ck_assert_msg(str1 != NULL,
145 "Returned OK but str was still NULL");
146 ck_assert_msg(lwc_intern_string("A", 1, &str2) == lwc_error_ok,
147 "Unable to intern a simple string");
148 ck_assert_msg(str2 != NULL,
149 "Returned OK but str was still NULL");
150}
151END_TEST
152
153/**** The next set of tests need a fixture set with some strings ****/
154
155static lwc_string *intern_one = NULL, *intern_two = NULL, *intern_three = NULL, *intern_YAY = NULL;
156
157static void
158with_filled_context_setup(void)
159{
160 ck_assert_msg(lwc_intern_string("one", 3, &intern_one) == lwc_error_ok,
161 "Unable to intern 'one'");
162 ck_assert_msg(lwc_intern_string("two", 3, &intern_two) == lwc_error_ok,
163 "Unable to intern 'two'");
164 ck_assert_msg(lwc_intern_string("three", 5, &intern_three) == lwc_error_ok,
165 "Unable to intern 'three'");
166 ck_assert_msg(lwc_intern_string("YAY", 3, &intern_YAY) == lwc_error_ok,
167 "Unable to intern 'YAY'");
168
169 ck_assert_msg(intern_one != intern_two, "'one' == 'two'");
170 ck_assert_msg(intern_one != intern_three, "'one' == 'three'");
171 ck_assert_msg(intern_two != intern_three, "'two' == 'three'");
172}
173
174static void
175with_filled_context_teardown(void)
176{
177 if (intern_one != NULL)
178 lwc_string_unref(intern_one);
179 lwc_string_unref(intern_two);
180 lwc_string_unref(intern_three);
181 lwc_string_unref(intern_YAY);
182}
183
184START_TEST (test_lwc_interning_works)
185{
186 lwc_string *new_one = NULL;
187
188 ck_assert_msg(lwc_intern_string("one", 3, &new_one) == lwc_error_ok,
189 "Unable to re-intern 'one'");
190
191 ck_assert_msg(new_one == intern_one,
192 "Internalising of the string failed");
193}
194END_TEST
195
196START_TEST (test_lwc_intern_substring)
197{
198 lwc_string *new_hre = NULL, *sub_hre = NULL;
199
200 ck_assert_msg(lwc_intern_string("hre", 3, &new_hre) == lwc_error_ok,
201 "Unable to intern 'hre'");
202 ck_assert_msg(lwc_intern_substring(intern_three,
203 1, 3, &sub_hre) == lwc_error_ok,
204 "Unable to re-intern 'hre' by substring");
205 ck_assert_msg(new_hre == sub_hre,
206 "'hre' != 'hre' -- wow!");
207}
208END_TEST
209
210START_TEST (test_lwc_intern_substring_bad_offset)
211{
212 lwc_string *str;
213
214 ck_assert_msg(lwc_intern_substring(intern_three, 100, 1, &str) == lwc_error_range,
215 "Able to intern substring starting out of range");
216}
217END_TEST
218
219START_TEST (test_lwc_intern_substring_bad_size)
220{
221 lwc_string *str;
222
223 ck_assert_msg(lwc_intern_substring(intern_three, 1, 100, &str) == lwc_error_range,
224 "Able to intern substring ending out of range");
225}
226END_TEST
227
228START_TEST (test_lwc_string_ref_ok)
229{
230 ck_assert_msg(lwc_string_ref(intern_one) == intern_one,
231 "Oddly, reffing a string didn't return it");
232}
233END_TEST
234
235START_TEST (test_lwc_string_unref_ok)
236{
237 lwc_string_unref(intern_one);
238 intern_one = NULL;
239}
240END_TEST
241
242START_TEST (test_lwc_string_ref_unref_ok)
243{
244 lwc_string_ref(intern_one);
245 lwc_string_unref(intern_one);
246}
247END_TEST
248
249START_TEST (test_lwc_string_isequal_ok)
250{
251 bool result = true;
252 ck_assert_msg((lwc_string_isequal(intern_one, intern_two, &result)) == lwc_error_ok,
253 "Failure comparing 'one' and 'two'");
254 ck_assert_msg(result == false,
255 "'one' == 'two' ?!");
256}
257END_TEST
258
259START_TEST (test_lwc_string_caseless_isequal_ok1)
260{
261 bool result = true;
262 lwc_string *new_ONE;
263
264 ck_assert_msg(lwc_intern_string("ONE", 3, &new_ONE) == lwc_error_ok,
265 "Failure interning 'ONE'");
266
267 ck_assert((lwc_string_isequal(intern_one, new_ONE, &result)) == lwc_error_ok);
268 ck_assert_msg(result == false,
269 "'one' == 'ONE' ?!");
270
271 ck_assert_msg((lwc_string_caseless_isequal(intern_one, new_ONE, &result)) == lwc_error_ok,
272 "Failure comparing 'one' and 'ONE' caselessly");
273 ck_assert_msg(result == true,
274 "'one' !~= 'ONE' ?!");
275}
276END_TEST
277
278START_TEST (test_lwc_string_caseless_isequal_ok2)
279{
280 bool result = true;
281 lwc_string *new_yay;
282
283 ck_assert_msg(lwc_intern_string("yay", 3, &new_yay) == lwc_error_ok,
284 "Failure interning 'yay'");
285
286 ck_assert((lwc_string_isequal(intern_YAY, new_yay, &result)) == lwc_error_ok);
287 ck_assert_msg(result == false,
288 "'yay' == 'YAY' ?!");
289
290 ck_assert_msg((lwc_string_caseless_isequal(intern_YAY, new_yay, &result)) == lwc_error_ok,
291 "Failure comparing 'yay' and 'YAY' caselessly");
292 ck_assert_msg(result == true,
293 "'yay' !~= 'YAY' ?!");
294}
295END_TEST
296
297START_TEST (test_lwc_string_caseless_isequal_bad)
298{
299 bool result = true;
300
301 ck_assert_msg(lwc_string_caseless_isequal(intern_YAY, intern_one, &result) == lwc_error_ok,
302 "Failure comparing 'YAY' and 'one' caselessly");
303 ck_assert_msg(result == false,
304 "'YAY' ~= 'one' ?!");
305}
306END_TEST
307
308START_TEST (test_lwc_extract_data_ok)
309{
310 ck_assert_msg(memcmp("one",
311 lwc_string_data(intern_one),
312 lwc_string_length(intern_one)) == 0,
313 "Extracting data ptr etc failed");
314}
315END_TEST
316
317START_TEST (test_lwc_string_hash_value_ok)
318{
319 (void)lwc_string_hash_value(intern_one);
320}
321END_TEST
322
323START_TEST (test_lwc_string_is_nul_terminated)
324{
325 lwc_string *new_ONE;
326
327 ck_assert_msg(lwc_intern_string("ONE", 3, &new_ONE) == lwc_error_ok,
328 "Failure interning 'ONE'");
329
330 ck_assert_msg(lwc_string_data(new_ONE)[lwc_string_length(new_ONE)] == '\0',
331 "Interned string isn't NUL terminated");
332}
333END_TEST
334
335START_TEST (test_lwc_substring_is_nul_terminated)
336{
337 lwc_string *new_ONE;
338 lwc_string *new_O;
339
340 ck_assert_msg(lwc_intern_string("ONE", 3, &new_ONE) == lwc_error_ok,
341 "Failure interning 'ONE'");
342
343 ck_assert_msg(lwc_intern_substring(new_ONE, 0, 1, &new_O) == lwc_error_ok,
344 "Failure interning substring 'O'");
345
346 ck_assert_msg(lwc_string_data(new_O)[lwc_string_length(new_O)] == '\0',
347 "Interned substring isn't NUL terminated");
348}
349END_TEST
350
351START_TEST (test_lwc_string_tolower_ok1)
352{
353 bool result = true;
354 lwc_string *new_ONE;
355 lwc_string *new_one;
356
357 ck_assert_msg(lwc_intern_string("ONE", 3, &new_ONE) == lwc_error_ok,
358 "Failure interning 'ONE'");
359 ck_assert(lwc_string_tolower(new_ONE, &new_one) == lwc_error_ok);
360 ck_assert(lwc_string_isequal(intern_one, new_ONE, &result) == lwc_error_ok);
361 ck_assert_msg(result == false, "'one' == 'ONE' ?!");
362 ck_assert(lwc_string_isequal(intern_one, new_one, &result) == lwc_error_ok);
363 ck_assert_msg(result == true, "'one' != 'one' ?!");
364}
365END_TEST
366
367START_TEST (test_lwc_string_tolower_ok2)
368{
369 bool result = true;
370 lwc_string *new_ONE;
371 lwc_string *new_one;
372
373 ck_assert_msg(lwc_intern_string("ONE", 3, &new_ONE) == lwc_error_ok,
374 "Failure interning 'ONE'");
375 /* Ensure new_ONE has an insensitive pointer set */
376 ck_assert(lwc_string_caseless_isequal(intern_one, new_ONE, &result) == lwc_error_ok);
377 ck_assert_msg(result == true, "'one' != 'ONE' (caseless) ?!");
378 ck_assert(lwc_string_tolower(new_ONE, &new_one) == lwc_error_ok);
379 ck_assert(lwc_string_isequal(intern_one, new_ONE, &result) == lwc_error_ok);
380 ck_assert_msg(result == false, "'one' == 'ONE' ?!");
381 ck_assert(lwc_string_isequal(intern_one, new_one, &result) == lwc_error_ok);
382 ck_assert_msg(result == true, "'one' != 'one' ?!");
383}
384END_TEST
385
386static void
387counting_cb(lwc_string *str, void *pw)
388{
389 UNUSED(str);
390
391 *((int *)pw) += 1;
392}
393
394START_TEST (test_lwc_string_iteration)
395{
396 int counter = 0;
397 lwc_iterate_strings(counting_cb, (void*)&counter);
398 ck_assert_msg(counter == 4, "Incorrect string count");
399}
400END_TEST
401
402/**** And the suites are set up here ****/
403
404void
405lwc_basic_suite(SRunner *sr)
406{
407 Suite *s = suite_create("libwapcaplet: Basic tests");
408 TCase *tc_basic = tcase_create("Creation/Destruction");
409
410#ifndef NDEBUG
411 tcase_add_test_raise_signal(tc_basic,
412 test_lwc_intern_string_aborts1,
413 SIGABRT);
414 tcase_add_test_raise_signal(tc_basic,
415 test_lwc_intern_string_aborts2,
416 SIGABRT);
417 tcase_add_test_raise_signal(tc_basic,
418 test_lwc_intern_substring_aborts1,
419 SIGABRT);
420 tcase_add_test_raise_signal(tc_basic,
421 test_lwc_intern_substring_aborts2,
422 SIGABRT);
423 tcase_add_test_raise_signal(tc_basic,
424 test_lwc_string_tolower_aborts1,
425 SIGABRT);
426 tcase_add_test_raise_signal(tc_basic,
427 test_lwc_string_tolower_aborts2,
428 SIGABRT);
429 tcase_add_test_raise_signal(tc_basic,
430 test_lwc_string_ref_aborts,
431 SIGABRT);
432 tcase_add_test_raise_signal(tc_basic,
433 test_lwc_string_unref_aborts,
434 SIGABRT);
435 tcase_add_test_raise_signal(tc_basic,
436 test_lwc_string_data_aborts,
437 SIGABRT);
438 tcase_add_test_raise_signal(tc_basic,
439 test_lwc_string_length_aborts,
440 SIGABRT);
441 tcase_add_test_raise_signal(tc_basic,
442 test_lwc_string_hash_value_aborts,
443 SIGABRT);
444#endif
445
446 suite_add_tcase(s, tc_basic);
447
448 tc_basic = tcase_create("Ops with a context");
449
450 tcase_add_checked_fixture(tc_basic, with_simple_context_setup,
451 with_simple_context_teardown);
452 tcase_add_test(tc_basic, test_lwc_intern_string_ok);
453 tcase_add_test(tc_basic, test_lwc_intern_string_twice_ok);
454 tcase_add_test(tc_basic, test_lwc_intern_string_twice_same_ok);
455 suite_add_tcase(s, tc_basic);
456
457 tc_basic = tcase_create("Ops with a filled context");
458
459 tcase_add_checked_fixture(tc_basic, with_filled_context_setup,
460 with_filled_context_teardown);
461 tcase_add_test(tc_basic, test_lwc_interning_works);
462 tcase_add_test(tc_basic, test_lwc_intern_substring);
463 tcase_add_test(tc_basic, test_lwc_string_ref_ok);
464 tcase_add_test(tc_basic, test_lwc_string_ref_unref_ok);
465 tcase_add_test(tc_basic, test_lwc_string_unref_ok);
466 tcase_add_test(tc_basic, test_lwc_string_isequal_ok);
467 tcase_add_test(tc_basic, test_lwc_string_caseless_isequal_ok1);
468 tcase_add_test(tc_basic, test_lwc_string_caseless_isequal_ok2);
469 tcase_add_test(tc_basic, test_lwc_string_caseless_isequal_bad);
470 tcase_add_test(tc_basic, test_lwc_string_tolower_ok1);
471 tcase_add_test(tc_basic, test_lwc_string_tolower_ok2);
472 tcase_add_test(tc_basic, test_lwc_extract_data_ok);
473 tcase_add_test(tc_basic, test_lwc_string_hash_value_ok);
474 tcase_add_test(tc_basic, test_lwc_string_is_nul_terminated);
475 tcase_add_test(tc_basic, test_lwc_substring_is_nul_terminated);
476 tcase_add_test(tc_basic, test_lwc_intern_substring_bad_size);
477 tcase_add_test(tc_basic, test_lwc_intern_substring_bad_offset);
478 tcase_add_test(tc_basic, test_lwc_string_iteration);
479 suite_add_tcase(s, tc_basic);
480
481 srunner_add_suite(sr, s);
482}
lwc_string ** null_lwc_p
Definition basictests.c:22
END_TEST void lwc_basic_suite(SRunner *sr)
Definition basictests.c:405
#define UNUSED(x)
Definition basictests.c:16
START_TEST(test_lwc_intern_string_aborts1)
Definition basictests.c:25
lwc_string * null_lwc
Definition basictests.c:21
#define lwc_string_data(str)
lwc_error lwc_string_tolower(lwc_string *str, lwc_string **ret)
#define lwc_string_length(str)
lwc_error lwc_intern_substring(lwc_string *str, size_t ssoffset, size_t sslen, lwc_string **ret)
lwc_error lwc_intern_string(const char *s, size_t slen, lwc_string **ret)
#define lwc_string_isequal(str1, str2, ret)
#define lwc_string_unref(str)
#define lwc_string_hash_value(str)
void lwc_iterate_strings(lwc_iteration_callback_fn cb, void *pw)
@ lwc_error_ok
@ lwc_error_range