Branch data Line data Source code
1 : : /* SPDX-License-Identifier: LGPL-2.1+ */
2 : :
3 : : #include <stdio.h>
4 : :
5 : : #include "ordered-set.h"
6 : : #include "string-util.h"
7 : : #include "strv.h"
8 : :
9 : 4 : static void test_set_steal_first(void) {
10 : 4 : _cleanup_ordered_set_free_ OrderedSet *m = NULL;
11 : 4 : int seen[3] = {};
12 : : char *val;
13 : :
14 : 4 : m = ordered_set_new(&string_hash_ops);
15 [ - + ]: 4 : assert_se(m);
16 : :
17 [ - + ]: 4 : assert_se(ordered_set_put(m, (void*) "1") == 1);
18 [ - + ]: 4 : assert_se(ordered_set_put(m, (void*) "22") == 1);
19 [ - + ]: 4 : assert_se(ordered_set_put(m, (void*) "333") == 1);
20 : :
21 : 4 : ordered_set_print(stdout, "SET=", m);
22 : :
23 [ + + ]: 16 : while ((val = ordered_set_steal_first(m)))
24 : 12 : seen[strlen(val) - 1]++;
25 : :
26 [ + - - + : 4 : assert_se(seen[0] == 1 && seen[1] == 1 && seen[2] == 1);
+ - - + ]
27 : :
28 [ - + ]: 4 : assert_se(ordered_set_isempty(m));
29 : :
30 : 4 : ordered_set_print(stdout, "SET=", m);
31 : 4 : }
32 : :
33 : : typedef struct Item {
34 : : int seen;
35 : : } Item;
36 : 12 : static void item_seen(Item *item) {
37 : 12 : item->seen++;
38 : 12 : }
39 : :
40 : 12 : DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(item_hash_ops, void, trivial_hash_func, trivial_compare_func, Item, item_seen);
41 : :
42 : 4 : static void test_set_free_with_hash_ops(void) {
43 : : OrderedSet *m;
44 : 4 : struct Item items[4] = {};
45 : : unsigned i;
46 : :
47 [ - + ]: 4 : assert_se(m = ordered_set_new(&item_hash_ops));
48 [ + + ]: 16 : for (i = 0; i < ELEMENTSOF(items) - 1; i++)
49 [ - + ]: 12 : assert_se(ordered_set_put(m, items + i) == 1);
50 : :
51 : 4 : m = ordered_set_free(m);
52 [ - + ]: 4 : assert_se(items[0].seen == 1);
53 [ - + ]: 4 : assert_se(items[1].seen == 1);
54 [ - + ]: 4 : assert_se(items[2].seen == 1);
55 [ - + ]: 4 : assert_se(items[3].seen == 0);
56 : 4 : }
57 : :
58 : 4 : static void test_set_put(void) {
59 : 4 : _cleanup_ordered_set_free_ OrderedSet *m = NULL;
60 : 4 : _cleanup_free_ char **t = NULL;
61 : :
62 : 4 : m = ordered_set_new(&string_hash_ops);
63 [ - + ]: 4 : assert_se(m);
64 : :
65 [ - + ]: 4 : assert_se(ordered_set_put(m, (void*) "1") == 1);
66 [ - + ]: 4 : assert_se(ordered_set_put(m, (void*) "22") == 1);
67 [ - + ]: 4 : assert_se(ordered_set_put(m, (void*) "333") == 1);
68 [ - + ]: 4 : assert_se(ordered_set_put(m, (void*) "333") == 0);
69 [ - + ]: 4 : assert_se(ordered_set_remove(m, (void*) "333"));
70 [ - + ]: 4 : assert_se(ordered_set_put(m, (void*) "333") == 1);
71 [ - + ]: 4 : assert_se(ordered_set_put(m, (void*) "333") == 0);
72 [ - + ]: 4 : assert_se(ordered_set_put(m, (void*) "22") == 0);
73 : :
74 [ - + ]: 4 : assert_se(t = ordered_set_get_strv(m));
75 [ - + ]: 4 : assert_se(streq(t[0], "1"));
76 [ - + ]: 4 : assert_se(streq(t[1], "22"));
77 [ - + ]: 4 : assert_se(streq(t[2], "333"));
78 [ - + ]: 4 : assert_se(!t[3]);
79 : :
80 : 4 : ordered_set_print(stdout, "FOO=", m);
81 : 4 : }
82 : :
83 : 4 : static void test_set_put_string_set(void) {
84 : 4 : _cleanup_ordered_set_free_free_ OrderedSet *m = NULL;
85 : 4 : _cleanup_ordered_set_free_ OrderedSet *q = NULL;
86 : 4 : _cleanup_free_ char **final = NULL; /* "just free" because the strings are in the set */
87 : : void *t;
88 : :
89 : 4 : m = ordered_set_new(&string_hash_ops);
90 [ - + ]: 4 : assert_se(m);
91 : :
92 : 4 : q = ordered_set_new(&string_hash_ops);
93 [ - + ]: 4 : assert_se(q);
94 : :
95 [ - + ]: 4 : assert_se(t = strdup("1"));
96 [ - + ]: 4 : assert_se(ordered_set_put(m, t) == 1);
97 [ - + ]: 4 : assert_se(t = strdup("22"));
98 [ - + ]: 4 : assert_se(ordered_set_put(m, t) == 1);
99 [ - + ]: 4 : assert_se(t = strdup("333"));
100 [ - + ]: 4 : assert_se(ordered_set_put(m, t) == 1);
101 : :
102 [ - + ]: 4 : assert_se(ordered_set_put(q, (void*) "11") == 1);
103 [ - + ]: 4 : assert_se(ordered_set_put(q, (void*) "22") == 1);
104 [ - + ]: 4 : assert_se(ordered_set_put(q, (void*) "33") == 1);
105 : :
106 [ - + ]: 4 : assert_se(ordered_set_put_string_set(m, q) == 2);
107 : :
108 [ - + ]: 4 : assert_se(final = ordered_set_get_strv(m));
109 [ - + ]: 4 : assert_se(strv_equal(final, STRV_MAKE("1", "22", "333", "11", "33")));
110 : :
111 : 4 : ordered_set_print(stdout, "BAR=", m);
112 : 4 : }
113 : :
114 : 4 : int main(int argc, const char *argv[]) {
115 : 4 : test_set_steal_first();
116 : 4 : test_set_free_with_hash_ops();
117 : 4 : test_set_put();
118 : 4 : test_set_put_string_set();
119 : :
120 : 4 : return 0;
121 : : }
|