]> granicus.if.org Git - icinga2/blob - test/config-ops.cpp
Implement the 'continue' and 'break' keywords
[icinga2] / test / config-ops.cpp
1 /******************************************************************************
2  * Icinga 2                                                                   *
3  * Copyright (C) 2012-2015 Icinga Development Team (http://www.icinga.org)    *
4  *                                                                            *
5  * This program is free software; you can redistribute it and/or              *
6  * modify it under the terms of the GNU General Public License                *
7  * as published by the Free Software Foundation; either version 2             *
8  * of the License, or (at your option) any later version.                     *
9  *                                                                            *
10  * This program is distributed in the hope that it will be useful,            *
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
13  * GNU General Public License for more details.                               *
14  *                                                                            *
15  * You should have received a copy of the GNU General Public License          *
16  * along with this program; if not, write to the Free Software Foundation     *
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.             *
18  ******************************************************************************/
19
20 #include "config/configcompiler.hpp"
21 #include <boost/test/unit_test.hpp>
22
23 using namespace icinga;
24
25 BOOST_AUTO_TEST_SUITE(config_ops)
26
27 BOOST_AUTO_TEST_CASE(simple)
28 {
29         ScriptFrame frame;
30         Expression *expr;
31         Dictionary::Ptr dict;
32
33         expr = ConfigCompiler::CompileText("<test>", "");
34         BOOST_CHECK(expr->Evaluate(frame).GetValue() == Empty);
35         delete expr;
36
37         expr = ConfigCompiler::CompileText("<test>", "\n3");
38         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
39         delete expr;
40
41         expr = ConfigCompiler::CompileText("<test>", "{ 3\n\n5 }");
42         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
43         delete expr;
44
45         expr = ConfigCompiler::CompileText("<test>", "1 + 3");
46         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 4);
47         delete expr;
48
49         expr = ConfigCompiler::CompileText("<test>", "3 - 1");
50         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 2);
51         delete expr;
52
53         expr = ConfigCompiler::CompileText("<test>", "5m * 10");
54         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3000);
55         delete expr;
56
57         expr = ConfigCompiler::CompileText("<test>", "5m / 5");
58         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 60);
59         delete expr;
60
61         expr = ConfigCompiler::CompileText("<test>", "7 & 3");
62         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
63         delete expr;
64
65         expr = ConfigCompiler::CompileText("<test>", "2 | 3");
66         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
67         delete expr;
68
69         expr = ConfigCompiler::CompileText("<test>", "true && false");
70         BOOST_CHECK(!expr->Evaluate(frame).GetValue());
71         delete expr;
72
73         expr = ConfigCompiler::CompileText("<test>", "true || false");
74         BOOST_CHECK(expr->Evaluate(frame).GetValue());
75         delete expr;
76
77         expr = ConfigCompiler::CompileText("<test>", "3 < 5");
78         BOOST_CHECK(expr->Evaluate(frame).GetValue());
79         delete expr;
80
81         expr = ConfigCompiler::CompileText("<test>", "3 > 5");
82         BOOST_CHECK(!expr->Evaluate(frame).GetValue());
83         delete expr;
84
85         expr = ConfigCompiler::CompileText("<test>", "3 <= 3");
86         BOOST_CHECK(expr->Evaluate(frame).GetValue());
87         delete expr;
88
89         expr = ConfigCompiler::CompileText("<test>", "3 >= 3");
90         BOOST_CHECK(expr->Evaluate(frame).GetValue());
91         delete expr;
92
93         expr = ConfigCompiler::CompileText("<test>", "2 + 3 * 4");
94         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 14);
95         delete expr;
96
97         expr = ConfigCompiler::CompileText("<test>", "(2 + 3) * 4");
98         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 20);
99         delete expr;
100
101         expr = ConfigCompiler::CompileText("<test>", "2 * - 3");
102         BOOST_CHECK(expr->Evaluate(frame).GetValue() == -6);
103         delete expr;
104
105         expr = ConfigCompiler::CompileText("<test>", "-(2 + 3)");
106         BOOST_CHECK(expr->Evaluate(frame).GetValue() == -5);
107         delete expr;
108
109         expr = ConfigCompiler::CompileText("<test>", "- 2 * 2 - 2 * 3 - 4 * - 5");
110         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 10);
111         delete expr;
112
113         expr = ConfigCompiler::CompileText("<test>", "!0 == true");
114         BOOST_CHECK(expr->Evaluate(frame).GetValue());
115         delete expr;
116
117         expr = ConfigCompiler::CompileText("<test>", "~0");
118         BOOST_CHECK(expr->Evaluate(frame).GetValue() == (double)~(long)0);
119         delete expr;
120
121         expr = ConfigCompiler::CompileText("<test>", "4 << 8");
122         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 1024);
123         delete expr;
124
125         expr = ConfigCompiler::CompileText("<test>", "1024 >> 4");
126         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 64);
127         delete expr;
128
129         expr = ConfigCompiler::CompileText("<test>", "2 << 3 << 4");
130         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 256);
131         delete expr;
132
133         expr = ConfigCompiler::CompileText("<test>", "256 >> 4 >> 3");
134         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 2);
135         delete expr;
136
137         expr = ConfigCompiler::CompileText("<test>", "\"hello\" == \"hello\"");
138         BOOST_CHECK(expr->Evaluate(frame).GetValue());
139         delete expr;
140
141         expr = ConfigCompiler::CompileText("<test>", "\"hello\" != \"hello\"");
142         BOOST_CHECK(!expr->Evaluate(frame).GetValue());
143         delete expr;
144
145         expr = ConfigCompiler::CompileText("<test>", "\"foo\" in [ \"foo\", \"bar\" ]");
146         BOOST_CHECK(expr->Evaluate(frame).GetValue());
147         delete expr;
148
149         expr = ConfigCompiler::CompileText("<test>", "\"foo\" in [ \"bar\", \"baz\" ]");
150         BOOST_CHECK(!expr->Evaluate(frame).GetValue());
151         delete expr;
152
153         expr = ConfigCompiler::CompileText("<test>", "\"foo\" in null");
154         BOOST_CHECK(!expr->Evaluate(frame).GetValue());
155         delete expr;
156
157         expr = ConfigCompiler::CompileText("<test>", "\"foo\" in \"bar\"");
158         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
159         delete expr;
160
161         expr = ConfigCompiler::CompileText("<test>", "\"foo\" !in [ \"bar\", \"baz\" ]");
162         BOOST_CHECK(expr->Evaluate(frame).GetValue());
163         delete expr;
164
165         expr = ConfigCompiler::CompileText("<test>", "\"foo\" !in [ \"foo\", \"bar\" ]");
166         BOOST_CHECK(!expr->Evaluate(frame).GetValue());
167         delete expr;
168
169         expr = ConfigCompiler::CompileText("<test>", "\"foo\" !in null");
170         BOOST_CHECK(expr->Evaluate(frame).GetValue());
171         delete expr;
172
173         expr = ConfigCompiler::CompileText("<test>", "\"foo\" !in \"bar\"");
174         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
175         delete expr;
176
177         expr = ConfigCompiler::CompileText("<test>", "{ a += 3 }");
178         dict = expr->Evaluate(frame).GetValue();
179         delete expr;
180         BOOST_CHECK(dict->GetLength() == 1);
181         BOOST_CHECK(dict->Get("a") == 3);
182
183         expr = ConfigCompiler::CompileText("<test>", "test");
184         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
185         delete expr;
186
187         expr = ConfigCompiler::CompileText("<test>", "null + 3");
188         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
189         delete expr;
190
191         expr = ConfigCompiler::CompileText("<test>", "3 + null");
192         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
193         delete expr;
194
195         expr = ConfigCompiler::CompileText("<test>", "\"test\" + 3");
196         BOOST_CHECK(expr->Evaluate(frame).GetValue() == "test3");
197         delete expr;
198
199         expr = ConfigCompiler::CompileText("<test>", "\"\\\"te\\\\st\"");
200         BOOST_CHECK(expr->Evaluate(frame).GetValue() == "\"te\\st");
201         delete expr;
202
203         expr = ConfigCompiler::CompileText("<test>", "\"\\'test\"");
204         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
205         delete expr;
206 }
207
208 BOOST_AUTO_TEST_CASE(advanced)
209 {
210         ScriptFrame frame;
211         Expression *expr;
212         Function::Ptr func;
213
214         expr = ConfigCompiler::CompileText("<test>", "regex(\"^Hello\", \"Hello World\")");
215         BOOST_CHECK(expr->Evaluate(frame).GetValue());
216         delete expr;
217
218         expr = ConfigCompiler::CompileText("<test>", "__boost_test()");
219         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
220         delete expr;
221
222         Object::Ptr self = new Object();
223         ScriptFrame frame2(self);
224         expr = ConfigCompiler::CompileText("<test>", "this");
225         BOOST_CHECK(expr->Evaluate(frame2).GetValue() == Value(self));
226         delete expr;
227
228         expr = ConfigCompiler::CompileText("<test>", "var v = 7; v");
229         BOOST_CHECK(expr->Evaluate(frame).GetValue());
230         delete expr;
231
232         expr = ConfigCompiler::CompileText("<test>", "{ a = 3 }.a");
233         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
234         delete expr;
235
236         expr = ConfigCompiler::CompileText("<test>", "[ 2, 3 ][1]");
237         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
238         delete expr;
239
240         expr = ConfigCompiler::CompileText("<test>", "var v = { a = 3}; v.a");
241         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
242         delete expr;
243
244         expr = ConfigCompiler::CompileText("<test>", "a = 3 b = 3");
245         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
246         delete expr;
247
248         expr = ConfigCompiler::CompileText("<test>", "function() { 3 }()");
249         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
250         delete expr;
251
252         expr = ConfigCompiler::CompileText("<test>", "function() { return 3, 5 }()");
253         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
254         delete expr;
255
256         expr = ConfigCompiler::CompileText("<test>", "typeof([]) == Array");
257         BOOST_CHECK(expr->Evaluate(frame).GetValue());
258         delete expr;
259
260         expr = ConfigCompiler::CompileText("<test>", "typeof({}) == Dictionary");
261         BOOST_CHECK(expr->Evaluate(frame).GetValue());
262         delete expr;
263
264         expr = ConfigCompiler::CompileText("<test>", "typeof(3) == Number");
265         BOOST_CHECK(expr->Evaluate(frame).GetValue());
266         delete expr;
267
268         expr = ConfigCompiler::CompileText("<test>", "typeof(\"test\") == String");
269         BOOST_CHECK(expr->Evaluate(frame).GetValue());
270         delete expr;
271
272         expr = ConfigCompiler::CompileText("<test>", "(7 | 8) == 15");
273         BOOST_CHECK(expr->Evaluate(frame).GetValue());
274         delete expr;
275
276         expr = ConfigCompiler::CompileText("<test>", "(7 ^ 8) == 15");
277         BOOST_CHECK(expr->Evaluate(frame).GetValue());
278         delete expr;
279
280         expr = ConfigCompiler::CompileText("<test>", "(7 & 15) == 7");
281         BOOST_CHECK(expr->Evaluate(frame).GetValue());
282         delete expr;
283
284         expr = ConfigCompiler::CompileText("<test>", "7 in [7] == true");
285         BOOST_CHECK(expr->Evaluate(frame).GetValue());
286         delete expr;
287
288         expr = ConfigCompiler::CompileText("<test>", "7 !in [7] == false");
289         BOOST_CHECK(expr->Evaluate(frame).GetValue());
290         delete expr;
291
292         expr = ConfigCompiler::CompileText("<test>", "(7 | 8) > 14");
293         BOOST_CHECK(expr->Evaluate(frame).GetValue());
294         delete expr;
295
296         expr = ConfigCompiler::CompileText("<test>", "(7 ^ 8) > 14");
297         BOOST_CHECK(expr->Evaluate(frame).GetValue());
298         delete expr;
299
300         expr = ConfigCompiler::CompileText("<test>", "(7 & 15) > 6");
301         BOOST_CHECK(expr->Evaluate(frame).GetValue());
302         delete expr;
303
304         expr = ConfigCompiler::CompileText("<test>", "\"a\" = 3");
305         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
306         delete expr;
307
308         expr = ConfigCompiler::CompileText("<test>", "3 = 3");
309         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
310         delete expr;
311
312         expr = ConfigCompiler::CompileText("<test>", "var e; e");
313         BOOST_CHECK(expr->Evaluate(frame).GetValue().IsEmpty());
314         delete expr;
315
316         expr = ConfigCompiler::CompileText("<test>", "var e = 3; e");
317         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
318         delete expr;
319
320         expr = ConfigCompiler::CompileText("<test>", "Array.x");
321         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
322         delete expr;
323
324         expr = ConfigCompiler::CompileText("<test>", "{{ 3 }}");
325         func = expr->Evaluate(frame).GetValue();
326         BOOST_CHECK(func->Invoke() == 3);
327         delete expr;
328 }
329
330 BOOST_AUTO_TEST_SUITE_END()