Git init
[pkgs/e/elektra.git] / src / bindings / cpp / tests / test_ks.cpp
1 #include <tests.h>
2
3 void test_ksnew()
4 {
5         cout << "testing keyset new" << endl;
6
7         KeySet ks1;
8
9         KeySet ks2 (5,
10                 ckdb::keyNew ("user/key2", KEY_END),
11                 KS_END);
12
13         KeySet ks3 (5,
14                 *Key ("user/key3/1", KEY_END),
15                 *Key ("user/key3/2", KEY_REMOVE, KEY_END),
16                 *Key ("user/key3/3", KEY_VALUE, "value", KEY_END),
17                 KS_END);
18         // ks3.toStream(stdout, 0);
19
20         Key k1("user/key4/1", KEY_END);
21         Key k2("user/key4/2", KEY_REMOVE, KEY_END);
22         Key k3("user/key4/3", KEY_VALUE, "value", KEY_END);
23         KeySet ks4 (5,
24                 *k1, // k1 will lose its key and pass it to keyset
25                 *k2,
26                 *k3,
27                 KS_END);
28         // ks4.toStream(stdout, 0);
29
30         Key k4("user/key5/1", KEY_END);
31         Key k5("user/key5/2", KEY_REMOVE, KEY_END);
32         Key k6("user/key5/3", KEY_VALUE, "value", KEY_END);
33         KeySet ks5 (5,
34                 k4.dup(),
35                 k5.dup(),
36                 k6.dup(),
37                 KS_END);
38         // ks5.toStream(stdout, 0);
39         // k4, k5, k6 can still be used
40 }
41
42 void test_ksdup()
43 {
44         cout << "testing ksdup" << endl;
45
46         KeySet ks3 (5,
47                 *Key ("user/key3/1", KEY_END),
48                 *Key ("user/key3/2", KEY_REMOVE, KEY_END),
49                 *Key ("user/key3/3", KEY_VALUE, "value", KEY_END),
50                 KS_END);
51
52         KeySet ks4 (ks3.dup());
53         succeed_if (ks3.size() == 3, "size not correct");
54         succeed_if (ks4.size() == 3, "size not correct");
55
56         // ks3.toStream(stdout, 0);
57         // ks4.toStream(stdout, 0);
58 }
59
60 void test_kscopy()
61 {
62         cout << "testing ksdup" << endl;
63
64         KeySet ks3 (5,
65                 *Key ("user/key3/1", KEY_END),
66                 *Key ("user/key3/2", KEY_REMOVE, KEY_END),
67                 *Key ("user/key3/3", KEY_VALUE, "value", KEY_END),
68                 KS_END);
69
70         KeySet ks4 (ks3);
71         succeed_if (ks3.size() == 3, "size not correct");
72         succeed_if (ks4.size() == 3, "size not correct");
73
74         KeySet ks5;
75         ks5.copy(ks4);
76         succeed_if (ks4.size() == 3, "size not correct");
77         succeed_if (ks5.size() == 3, "size not correct");
78
79         ks5.clear();
80         succeed_if (ks5.size() == 0, "size not correct");
81
82
83
84         // ks3.toStream(stdout, 0);
85         // ks4.toStream(stdout, 0);
86 }
87
88 void test_iterate()
89 {
90         cout << "testing iterate" << endl;
91
92         KeySet ks3 (5,
93                 *Key ("user/key3/1", KEY_END),
94                 *Key ("user/key3/2", KEY_REMOVE, KEY_END),
95                 *Key ("user/key3/3", KEY_VALUE, "value", KEY_END),
96                 KS_END);
97
98         ks3.rewind();
99
100         Key k1 = ks3.next();
101         succeed_if (k1.getName() == "user/key3/1", "wrong keyname");
102         succeed_if (k1 == ks3.head(), "first key not head key");
103         Key k2 = ks3.next();
104         succeed_if (k2.getName() == "user/key3/2", "wrong keyname");
105         succeed_if (k2.needRemove(), "remove not set");
106         Key k3 = ks3.next();
107         succeed_if (k3.getName() == "user/key3/3", "wrong keyname");
108         succeed_if (k3.getString() == "value", "wrong value");
109         succeed_if (k3 == ks3.tail(), "last key not tail key");
110         try {
111                 ks3.next();
112                 succeed_if (false, "Out of Range not thrown");
113         } catch (KeySetOutOfRange) { }
114
115         ks3.rewind();
116         for (size_t i=0; i<ks3.size(); i++)
117         {
118                 Key k = ks3.next();
119                 char str[] = "user/key3/X";
120
121                 str [10] = i+'1';
122                 succeed_if (k.getName() == str, "wrong keyname");
123         }
124 }
125
126 void test_cursor()
127 {
128         cout << "testing cursor" << endl;
129
130         KeySet ks3 (5,
131                 *Key ("user/key3/1", KEY_END),
132                 *Key ("user/key3/2", KEY_REMOVE, KEY_END),
133                 *Key ("user/key3/3", KEY_VALUE, "value", KEY_END),
134                 KS_END);
135         cursor_t cursorTest;
136
137         ks3.rewind();
138         for (size_t i=0; i<ks3.size(); i++)
139         {
140                 Key k = ks3.next();
141                 if (i==0) cursorTest = ks3.getCursor();
142         }
143
144         ks3.setCursor (cursorTest);
145         Key k1 = ks3.current();
146         succeed_if (k1.getName() == "user/key3/1", "wrong keyname");
147         succeed_if (k1 == ks3.head(), "first key not head key");
148 }
149
150 void test_pop()
151 {
152         cout << "testing iterate" << endl;
153
154         KeySet ks3 (5,
155                 *Key ("user/key3/1", KEY_END),
156                 *Key ("user/key3/2", KEY_REMOVE, KEY_END),
157                 *Key ("user/key3/3", KEY_VALUE, "value", KEY_END),
158                 KS_END);
159
160         ks3.rewind();
161
162         Key k3 = ks3.pop();
163         succeed_if (k3.getName() == "user/key3/3", "wrong keyname");
164         succeed_if (k3.getString() == "value", "wrong value");
165         Key k2 = ks3.pop();
166         succeed_if (k2.getName() == "user/key3/2", "wrong keyname");
167         succeed_if (k2.needRemove(), "remove not set");
168         Key k1 = ks3.pop();
169         succeed_if (k1.getName() == "user/key3/1", "wrong keyname");
170         try {
171                 ks3.pop();
172                 succeed_if (false, "Out of Range not catched");
173         } catch (KeySetOutOfRange) { }
174
175         KeySet ks4 (5,
176                 *Key ("user/key3/1", KEY_END),
177                 *Key ("user/key3/2", KEY_REMOVE, KEY_END),
178                 *Key ("user/key3/3", KEY_VALUE, "value", KEY_END),
179                 KS_END);
180
181         ks4.rewind();
182         for (int i=ks4.size()-1; i>0; i--)
183         {
184                 Key k = ks4.pop();
185                 char str[] = "user/key3/X";
186
187                 str [10] = i+'1';
188                 succeed_if (k.getName() == str, str);
189         }
190 }
191
192
193 void test_lookup()
194 {
195         cout << "testing lookup" << endl;
196
197         KeySet ks3 (5,
198                 *Key ("user/key3/1", KEY_END),
199                 *Key ("user/key3/2", KEY_REMOVE, KEY_END),
200                 *Key ("user/key3/3", KEY_VALUE, "value", KEY_END),
201                 KS_END);
202
203         Key k1 = ks3.lookup("user/key3/1");
204         succeed_if (k1.getName() == "user/key3/1", "wrong keyname");
205
206         Key k3 = ks3.lookup("user/key3/3");
207         succeed_if (k3.getName() == "user/key3/3", "wrong keyname");
208         succeed_if (k3.getString() == "value", "wrong value");
209
210         try {
211                 ks3.lookup("user/key3/2");
212                 succeed_if (false, "Not Found not thrown for removed key");
213         } catch (KeySetNotFound) { }
214
215         try {
216                 ks3.lookup("user/key3/4");
217                 succeed_if (false, "Not Found not thrown for not existing key");
218         } catch (KeySetNotFound) { }
219 }
220
221 void test_append()
222 {
223         cout << "testing keyset append" << endl;
224
225         KeySet ks1;
226
227         KeySet ks2 (5,
228                 ckdb::keyNew ("user/key2", KEY_END),
229                 KS_END);
230         ks1.append (ks2);
231
232         KeySet ks3 (5,
233                 *Key ("user/key3/1", KEY_END),
234                 *Key ("user/key3/2", KEY_REMOVE, KEY_END),
235                 *Key ("user/key3/3", KEY_VALUE, "value", KEY_END),
236                 KS_END);
237         ks2.append (ks3);
238         ks1.append (ks3);
239         ks3.append (ks2);
240
241         Key k1("user/key4/1", KEY_END);
242         Key k2("user/key4/2", KEY_REMOVE, KEY_END);
243         Key k3("user/key4/3", KEY_VALUE, "value", KEY_END);
244         ks1.append (k1); ks1.append (k2); ks1.append (k3);
245         ks2.append (k1); ks2.append (k2); ks2.append (k3);
246         ks3.append (k1); ks3.append (k2); ks3.append (k3);
247
248         KeySet ks4 (5,
249                 *Key ("user/key3/1", KEY_END),
250                 *Key ("user/key3/2", KEY_REMOVE, KEY_END),
251                 *Key ("user/key3/3", KEY_VALUE, "value", KEY_END),
252                 KS_END);
253
254         // ks1.toStream();
255         // ks2.toStream();
256         // ks3.toStream();
257 }
258
259
260 int main()
261 {
262         cout << "KEYSET CLASS TESTS" << endl;
263         cout << "==================" << endl << endl;
264
265         test_ksnew();
266         test_ksdup();
267         test_kscopy();
268         test_iterate();
269         test_cursor();
270         test_pop();
271         test_lookup();
272         test_append();
273
274         cout << endl;
275         cout << "test_key RESULTS: " << nbTest << " test(s) done. " << nbError << " error(s)." << endl;
276         return nbError;
277 }