1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
3 #include "config/configcompiler.hpp"
4 #include "base/exception.hpp"
5 #include <BoostTestTargetConfig.h>
7 using namespace icinga;
9 BOOST_AUTO_TEST_SUITE(config_ops)
11 BOOST_AUTO_TEST_CASE(simple)
13 ScriptFrame frame(true);
14 std::unique_ptr<Expression> expr;
17 expr = ConfigCompiler::CompileText("<test>", "");
18 BOOST_CHECK(expr->Evaluate(frame).GetValue() == Empty);
20 expr = ConfigCompiler::CompileText("<test>", "\n3");
21 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
23 expr = ConfigCompiler::CompileText("<test>", "{ 3\n\n5 }");
24 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
26 expr = ConfigCompiler::CompileText("<test>", "1 + 3");
27 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 4);
29 expr = ConfigCompiler::CompileText("<test>", "3 - 1");
30 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 2);
32 expr = ConfigCompiler::CompileText("<test>", "5m * 10");
33 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3000);
35 expr = ConfigCompiler::CompileText("<test>", "5m / 5");
36 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 60);
38 expr = ConfigCompiler::CompileText("<test>", "7 & 3");
39 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
41 expr = ConfigCompiler::CompileText("<test>", "2 | 3");
42 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
44 expr = ConfigCompiler::CompileText("<test>", "true && false");
45 BOOST_CHECK(!expr->Evaluate(frame).GetValue());
47 expr = ConfigCompiler::CompileText("<test>", "true || false");
48 BOOST_CHECK(expr->Evaluate(frame).GetValue());
50 expr = ConfigCompiler::CompileText("<test>", "3 < 5");
51 BOOST_CHECK(expr->Evaluate(frame).GetValue());
53 expr = ConfigCompiler::CompileText("<test>", "3 > 5");
54 BOOST_CHECK(!expr->Evaluate(frame).GetValue());
56 expr = ConfigCompiler::CompileText("<test>", "3 <= 3");
57 BOOST_CHECK(expr->Evaluate(frame).GetValue());
59 expr = ConfigCompiler::CompileText("<test>", "3 >= 3");
60 BOOST_CHECK(expr->Evaluate(frame).GetValue());
62 expr = ConfigCompiler::CompileText("<test>", "2 + 3 * 4");
63 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 14);
65 expr = ConfigCompiler::CompileText("<test>", "(2 + 3) * 4");
66 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 20);
68 expr = ConfigCompiler::CompileText("<test>", "2 * - 3");
69 BOOST_CHECK(expr->Evaluate(frame).GetValue() == -6);
71 expr = ConfigCompiler::CompileText("<test>", "-(2 + 3)");
72 BOOST_CHECK(expr->Evaluate(frame).GetValue() == -5);
74 expr = ConfigCompiler::CompileText("<test>", "- 2 * 2 - 2 * 3 - 4 * - 5");
75 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 10);
77 expr = ConfigCompiler::CompileText("<test>", "!0 == true");
78 BOOST_CHECK(expr->Evaluate(frame).GetValue());
80 expr = ConfigCompiler::CompileText("<test>", "~0");
81 BOOST_CHECK(expr->Evaluate(frame).GetValue() == (double)~(long)0);
83 expr = ConfigCompiler::CompileText("<test>", "4 << 8");
84 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 1024);
86 expr = ConfigCompiler::CompileText("<test>", "1024 >> 4");
87 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 64);
89 expr = ConfigCompiler::CompileText("<test>", "2 << 3 << 4");
90 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 256);
92 expr = ConfigCompiler::CompileText("<test>", "256 >> 4 >> 3");
93 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 2);
95 expr = ConfigCompiler::CompileText("<test>", R"("hello" == "hello")");
96 BOOST_CHECK(expr->Evaluate(frame).GetValue());
98 expr = ConfigCompiler::CompileText("<test>", R"("hello" != "hello")");
99 BOOST_CHECK(!expr->Evaluate(frame).GetValue());
101 expr = ConfigCompiler::CompileText("<test>", R"("foo" in [ "foo", "bar" ])");
102 BOOST_CHECK(expr->Evaluate(frame).GetValue());
104 expr = ConfigCompiler::CompileText("<test>", R"("foo" in [ "bar", "baz" ])");
105 BOOST_CHECK(!expr->Evaluate(frame).GetValue());
107 expr = ConfigCompiler::CompileText("<test>", "\"foo\" in null");
108 BOOST_CHECK(!expr->Evaluate(frame).GetValue());
110 expr = ConfigCompiler::CompileText("<test>", R"("foo" in "bar")");
111 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
113 expr = ConfigCompiler::CompileText("<test>", R"("foo" !in [ "bar", "baz" ])");
114 BOOST_CHECK(expr->Evaluate(frame).GetValue());
116 expr = ConfigCompiler::CompileText("<test>", R"("foo" !in [ "foo", "bar" ])");
117 BOOST_CHECK(!expr->Evaluate(frame).GetValue());
119 expr = ConfigCompiler::CompileText("<test>", "\"foo\" !in null");
120 BOOST_CHECK(expr->Evaluate(frame).GetValue());
122 expr = ConfigCompiler::CompileText("<test>", R"("foo" !in "bar")");
123 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
125 expr = ConfigCompiler::CompileText("<test>", "{ a += 3 }");
126 dict = expr->Evaluate(frame).GetValue();
127 BOOST_CHECK(dict->GetLength() == 1);
128 BOOST_CHECK(dict->Get("a") == 3);
130 expr = ConfigCompiler::CompileText("<test>", "test");
131 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
133 expr = ConfigCompiler::CompileText("<test>", "null + 3");
134 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
136 expr = ConfigCompiler::CompileText("<test>", "3 + null");
137 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
139 expr = ConfigCompiler::CompileText("<test>", "\"test\" + 3");
140 BOOST_CHECK(expr->Evaluate(frame).GetValue() == "test3");
142 expr = ConfigCompiler::CompileText("<test>", R"("\"te\\st")");
143 BOOST_CHECK(expr->Evaluate(frame).GetValue() == "\"te\\st");
145 expr = ConfigCompiler::CompileText("<test>", R"("\'test")");
146 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
148 expr = ConfigCompiler::CompileText("<test>", "({ a = 3\nb = 3 })");
149 BOOST_CHECK(expr->Evaluate(frame).GetValue().IsObjectType<Dictionary>());
152 BOOST_AUTO_TEST_CASE(advanced)
154 ScriptFrame frame(true);
155 std::unique_ptr<Expression> expr;
158 expr = ConfigCompiler::CompileText("<test>", R"(regex("^Hello", "Hello World"))");
159 BOOST_CHECK(expr->Evaluate(frame).GetValue());
161 expr = ConfigCompiler::CompileText("<test>", "__boost_test()");
162 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
164 Object::Ptr self = new Object();
165 ScriptFrame frame2(true, self);
166 expr = ConfigCompiler::CompileText("<test>", "this");
167 BOOST_CHECK(expr->Evaluate(frame2).GetValue() == Value(self));
169 expr = ConfigCompiler::CompileText("<test>", "var v = 7; v");
170 BOOST_CHECK(expr->Evaluate(frame).GetValue());
172 expr = ConfigCompiler::CompileText("<test>", "{ a = 3 }.a");
173 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
175 expr = ConfigCompiler::CompileText("<test>", "[ 2, 3 ][1]");
176 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
178 expr = ConfigCompiler::CompileText("<test>", "var v = { a = 3}; v.a");
179 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
181 expr = ConfigCompiler::CompileText("<test>", "a = 3 b = 3");
182 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
184 expr = ConfigCompiler::CompileText("<test>", "function() { 3 }()");
185 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
187 expr = ConfigCompiler::CompileText("<test>", "function() { return 3, 5 }()");
188 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
190 expr = ConfigCompiler::CompileText("<test>", "typeof([]) == Array");
191 BOOST_CHECK(expr->Evaluate(frame).GetValue());
193 expr = ConfigCompiler::CompileText("<test>", "typeof({}) == Dictionary");
194 BOOST_CHECK(expr->Evaluate(frame).GetValue());
196 expr = ConfigCompiler::CompileText("<test>", "typeof(3) == Number");
197 BOOST_CHECK(expr->Evaluate(frame).GetValue());
199 expr = ConfigCompiler::CompileText("<test>", "typeof(\"test\") == String");
200 BOOST_CHECK(expr->Evaluate(frame).GetValue());
202 expr = ConfigCompiler::CompileText("<test>", "(7 | 8) == 15");
203 BOOST_CHECK(expr->Evaluate(frame).GetValue());
205 expr = ConfigCompiler::CompileText("<test>", "(7 ^ 8) == 15");
206 BOOST_CHECK(expr->Evaluate(frame).GetValue());
208 expr = ConfigCompiler::CompileText("<test>", "(7 & 15) == 7");
209 BOOST_CHECK(expr->Evaluate(frame).GetValue());
211 expr = ConfigCompiler::CompileText("<test>", "7 in [7] == true");
212 BOOST_CHECK(expr->Evaluate(frame).GetValue());
214 expr = ConfigCompiler::CompileText("<test>", "7 !in [7] == false");
215 BOOST_CHECK(expr->Evaluate(frame).GetValue());
217 expr = ConfigCompiler::CompileText("<test>", "(7 | 8) > 14");
218 BOOST_CHECK(expr->Evaluate(frame).GetValue());
220 expr = ConfigCompiler::CompileText("<test>", "(7 ^ 8) > 14");
221 BOOST_CHECK(expr->Evaluate(frame).GetValue());
223 expr = ConfigCompiler::CompileText("<test>", "(7 & 15) > 6");
224 BOOST_CHECK(expr->Evaluate(frame).GetValue());
226 expr = ConfigCompiler::CompileText("<test>", "\"a\" = 3");
227 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
229 expr = ConfigCompiler::CompileText("<test>", "3 = 3");
230 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
232 expr = ConfigCompiler::CompileText("<test>", "var e; e");
233 BOOST_CHECK(expr->Evaluate(frame).GetValue().IsEmpty());
235 expr = ConfigCompiler::CompileText("<test>", "var e = 3; e");
236 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
238 expr = ConfigCompiler::CompileText("<test>", "Array.x");
239 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
241 expr = ConfigCompiler::CompileText("<test>", "{{ 3 }}");
242 func = expr->Evaluate(frame).GetValue();
243 BOOST_CHECK(func->Invoke() == 3);
246 BOOST_AUTO_TEST_SUITE_END()