1 #include <framework/utilities/GeneralCut.h>
2 #include <gtest/gtest.h>
7 struct MockObjectType {
17 class MockVariableType {
20 double function(
const MockObjectType* object)
const
26 const std::string name =
"mocking_variable";
33 class MockVariableManager {
36 using Object = MockObjectType;
38 using Var = MockVariableType;
41 static MockVariableManager& Instance()
43 static MockVariableManager instance;
48 Var* getVariable(
const std::string& name)
50 if (name ==
"mocking_variable") {
51 return &m_mocking_variable;
58 Var m_mocking_variable;
65 TEST(GeneralCutTest, cutCheck)
67 MockObjectType testObject;
69 std::unique_ptr<MockGeneralCut> a = MockGeneralCut::compile(
"1.2 < 1.5 ");
70 EXPECT_TRUE(a->check(&testObject));
71 a = MockGeneralCut::compile(
" 1.5<1.2");
72 EXPECT_FALSE(a->check(&testObject));
76 a = MockGeneralCut::compile(
"-1 == 1");
77 EXPECT_FALSE(a->check(&testObject));
78 a = MockGeneralCut::compile(
"-1 != 1");
79 EXPECT_TRUE(a->check(&testObject));
81 a = MockGeneralCut::compile(
" 12.3 >1.5 ");
82 EXPECT_TRUE(a->check(&testObject));
83 a = MockGeneralCut::compile(
"12 > 15");
84 EXPECT_FALSE(a->check(&testObject));
86 a = MockGeneralCut::compile(
"1.2 == 1.2");
87 EXPECT_TRUE(a->check(&testObject));
88 a = MockGeneralCut::compile(
" 1.5!=1.2");
89 EXPECT_TRUE(a->check(&testObject));
91 a = MockGeneralCut::compile(
"1.2 == 1.2 == 1.2");
92 EXPECT_TRUE(a->check(&testObject));
93 a = MockGeneralCut::compile(
" 1.5 == 1.5!=1.2");
94 EXPECT_TRUE(a->check(&testObject));
95 a = MockGeneralCut::compile(
" 1.5 == 1.5!=1.5");
96 EXPECT_FALSE(a->check(&testObject));
98 a = MockGeneralCut::compile(
"1.0 < 1.2 == 1.2");
99 EXPECT_TRUE(a->check(&testObject));
100 a = MockGeneralCut::compile(
" 1.5 < 1.6 != 1.6");
101 EXPECT_FALSE(a->check(&testObject));
102 a = MockGeneralCut::compile(
" 1.5 < 1.6 != 1.7");
103 EXPECT_TRUE(a->check(&testObject));
105 a = MockGeneralCut::compile(
" [12 >= 12 ]");
106 EXPECT_TRUE(a->check(&testObject));
107 a = MockGeneralCut::compile(
"[ 15>= 16 ]");
108 EXPECT_FALSE(a->check(&testObject));
110 a = MockGeneralCut::compile(
" [12 <= 12 ]");
111 EXPECT_TRUE(a->check(&testObject));
112 a = MockGeneralCut::compile(
" [ 17<= 16.7 ]");
113 EXPECT_FALSE(a->check(&testObject));
115 a = MockGeneralCut::compile(
" [12 <= 12 < 13]");
116 EXPECT_TRUE(a->check(&testObject));
117 a = MockGeneralCut::compile(
" [ 17<= 16.7 < 18 ]");
118 EXPECT_FALSE(a->check(&testObject));
120 a = MockGeneralCut::compile(
" [12 >= 12 < 13]");
121 EXPECT_TRUE(a->check(&testObject));
122 a = MockGeneralCut::compile(
" [ 15> 16.7 <= 18 ]");
123 EXPECT_FALSE(a->check(&testObject));
125 a = MockGeneralCut::compile(
"mocking_variable > 1.0");
126 EXPECT_TRUE(a->check(&testObject));
127 a = MockGeneralCut::compile(
"1.0 < mocking_variable <= mocking_variable");
128 EXPECT_TRUE(a->check(&testObject));
130 a = MockGeneralCut::compile(
"mocking_variable < 100.0");
131 EXPECT_TRUE(a->check(&testObject));
132 a = MockGeneralCut::compile(
"mocking_variable <= mocking_variable <= mocking_variable");
133 EXPECT_TRUE(a->check(&testObject));
135 a = MockGeneralCut::compile(
"1 < 2 and 3 < 4");
136 EXPECT_TRUE(a->check(&testObject));
137 a = MockGeneralCut::compile(
"1 < 2 and 4 < 3");
138 EXPECT_FALSE(a->check(&testObject));
139 a = MockGeneralCut::compile(
"2 < 1 and 4 < 3");
140 EXPECT_FALSE(a->check(&testObject));
141 a = MockGeneralCut::compile(
"2 < 1 and 3 < 4");
142 EXPECT_FALSE(a->check(&testObject));
144 a = MockGeneralCut::compile(
"1 < 2 or 3 < 4");
145 EXPECT_TRUE(a->check(&testObject));
146 a = MockGeneralCut::compile(
"1 < 2 or 4 < 3");
147 EXPECT_TRUE(a->check(&testObject));
148 a = MockGeneralCut::compile(
"2 < 1 or 4 < 3");
149 EXPECT_FALSE(a->check(&testObject));
150 a = MockGeneralCut::compile(
"2 < 1 or 3 < 4");
151 EXPECT_TRUE(a->check(&testObject));
153 a = MockGeneralCut::compile(
"1 < 2 and 3 < 4 and [ 5 < 6 or 7 > 6 ]");
154 EXPECT_TRUE(a->check(&testObject));
155 a = MockGeneralCut::compile(
"[1 < 2 < 3 or 3 > 4 ] and [ 5 < 6 or 7 > 6 ]");
156 EXPECT_TRUE(a->check(&testObject));
157 a = MockGeneralCut::compile(
"[1 < 2 < 3 or 3 > 4 ] or [ 5 < 6 and 7 > 6 ]");
158 EXPECT_TRUE(a->check(&testObject));
160 a = MockGeneralCut::compile(
"1 < 2 and 3 < 4 or 5 > 6");
161 EXPECT_TRUE(a->check(&testObject));
162 a = MockGeneralCut::compile(
"1 < 2 or 3 < 4 and 5 > 6");
163 EXPECT_TRUE(a->check(&testObject));
164 a = MockGeneralCut::compile(
"1 < 2 and 4 < 3 or 6 > 5");
165 EXPECT_TRUE(a->check(&testObject));
166 a = MockGeneralCut::compile(
"1 < 2 or 4 < 3 and 6 > 5");
167 EXPECT_TRUE(a->check(&testObject));
169 a = MockGeneralCut::compile(
"1 != 2 and 3 < 4 or 5 > 6");
170 EXPECT_TRUE(a->check(&testObject));
171 a = MockGeneralCut::compile(
"1 < 2 or 3 != 4 and 5 > 6");
172 EXPECT_TRUE(a->check(&testObject));
174 a = MockGeneralCut::compile(
"1 != 2 and 3 == 4 or 5 > 6");
175 EXPECT_FALSE(a->check(&testObject));
176 a = MockGeneralCut::compile(
"1 < 2 or 3 == 4 and 5 > 6");
177 EXPECT_TRUE(a->check(&testObject));
179 a = MockGeneralCut::compile(
"15 != 0x15");
180 EXPECT_TRUE(a->check(&testObject));
182 a = MockGeneralCut::compile(
"15 == 0xF");
183 EXPECT_TRUE(a->check(&testObject));
186 EXPECT_THROW(a = MockGeneralCut::compile(
"15 == 15.0 bla"), std::runtime_error);
187 EXPECT_TRUE(a->check(&testObject));
188 EXPECT_THROW(a = MockGeneralCut::compile(
"15 == other_var"), std::runtime_error);
189 EXPECT_TRUE(a->check(&testObject));
190 EXPECT_THROW(a = MockGeneralCut::compile(
"15 == 15e1000"), std::out_of_range);
191 EXPECT_TRUE(a->check(&testObject));
193 a = MockGeneralCut::compile(
"1e-3 < 1e3");
194 EXPECT_TRUE(a->check(&testObject));
196 a = MockGeneralCut::compile(
"1e-3 == 0.001");
197 EXPECT_TRUE(a->check(&testObject));
199 a = MockGeneralCut::compile(
"1000 < infinity");
200 EXPECT_TRUE(a->check(&testObject));
202 a = MockGeneralCut::compile(
"1000 > infinity");
203 EXPECT_FALSE(a->check(&testObject));
205 a = MockGeneralCut::compile(
"1000 < nan");
206 EXPECT_FALSE(a->check(&testObject));
208 a = MockGeneralCut::compile(
"1000 > nan");
209 EXPECT_FALSE(a->check(&testObject));
212 a = MockGeneralCut::compile(
"3.141592653589793 == 3.141592653589792");
213 EXPECT_FALSE(a->check(&testObject));
215 a = MockGeneralCut::compile(
"3.1415926535897931234567890 == 3.1415926535897931234567891");
216 EXPECT_TRUE(a->check(&testObject));
218 a = MockGeneralCut::compile(
"3141592653589 != 3141592653588");
219 EXPECT_TRUE(a->check(&testObject));
221 a = MockGeneralCut::compile(
"");
222 EXPECT_TRUE(a->check(&testObject));
224 a = MockGeneralCut::compile(
" ");
225 EXPECT_TRUE(a->check(&testObject));
227 a = MockGeneralCut::compile(
"[ ]");
228 EXPECT_TRUE(a->check(&testObject));
230 a = MockGeneralCut::compile(
"[ ] and []");
231 EXPECT_TRUE(a->check(&testObject));
235 TEST(GeneralCutTest, compileAndDecompile)
238 std::unique_ptr<MockGeneralCut> a = MockGeneralCut::compile(
"1 < 2");
239 EXPECT_EQ(a->decompile(),
"[1 < 2]");
241 a = MockGeneralCut::compile(
"[1 < 2]");
242 EXPECT_EQ(a->decompile(),
"[1 < 2]");
244 a = MockGeneralCut::compile(
"1 < 2 < 3");
245 EXPECT_EQ(a->decompile(),
"[[1 < 2] and [2 < 3]]");
247 a = MockGeneralCut::compile(
"[1 < 2 < 3] or [[ 2 < 4] and [ mocking_variable < 4.4231 and [1 < 3 and 4 < mocking_variable]]]");
248 EXPECT_EQ(a->decompile(),
249 "[[[1 < 2] and [2 < 3]] or [[2 < 4] and [[mocking_variable < 4.4231] and [[1 < 3] and [4 < mocking_variable]]]]]");