12#include <boost/python.hpp>
14#include <framework/utilities/CutNodes.h>
15#include <framework/utilities/TestHelpers.h>
16#include <framework/utilities/Conversion.h>
18#include <gtest/gtest.h>
23 namespace py = boost::python;
25 typedef std::variant<double, int, bool> VarVariant;
27 struct MockObjectType {
29 explicit MockObjectType(
const double& d) : m_value{d} {}
30 explicit MockObjectType(
const int& i) : m_value{i} {}
31 explicit MockObjectType(
const bool& b) : m_value{b} {}
35 std::function<VarVariant(
const MockObjectType*)> mockMetaVariable(
const std::vector<std::string>& arguments);
42 class MockVariableType {
45 VarVariant function(
const MockObjectType*
object)
const
47 return m_function(
object);
49 explicit MockVariableType(
const std::string& name) : m_name{name}
51 m_function = [](
const MockObjectType * object) -> VarVariant {
52 if (
object !=
nullptr)
54 return object->m_value;
57 return std::numeric_limits<double>::quiet_NaN();
62 MockVariableType(
const std::string& name, std::function<VarVariant(
const MockObjectType*)> function) : m_name{name}, m_function{function}
67 std::function<VarVariant(
const MockObjectType*)> m_function;
74 class MockVariableManager {
77 using Object = MockObjectType;
79 using Var = MockVariableType;
81 typedef std::variant<double, int, bool> VarVariant;
84 static MockVariableManager& Instance()
86 static MockVariableManager instance;
91 Var* getVariable(
const std::string& name)
93 if (name ==
"mocking_variable") {
94 return &m_mocking_variable;
100 Var* getVariable(
const std::string& functionName,
const std::vector<std::string>& functionArguments)
102 auto function = mockMetaVariable(functionArguments);
103 m_mocking_metavariable = MockVariableType(functionName, function);
104 return &m_mocking_metavariable;
108 Var m_mocking_variable{
"mocking_variable"};
109 Var m_mocking_metavariable{
""};
114 std::function<VarVariant(
const MockObjectType*)> mockMetaVariable(
const std::vector<std::string>& arguments)
116 const MockVariableType* var = MockVariableManager::Instance().getVariable(arguments[0]);
117 if (var ==
nullptr) {
118 throw std::runtime_error(
"Variable could not be found.");
120 auto func = [var, arguments](
const MockObjectType * object) -> VarVariant {
122 if (std::holds_alternative<int>(var->function(
object)))
124 sum += std::get<int>(var->function(
object));
125 }
else if (std::holds_alternative<double>(var->function(
object)))
127 sum += std::get<double>(var->function(
object));
130 sum += std::get<bool>(var->function(
object));
132 for (
size_t i = 1; i < arguments.size(); i++)
144 TEST(CutNodesTest, TupleLength)
147 py::tuple tuple = py::tuple();
151 tuple = py::make_tuple(
static_cast<int>(NodeType::UnaryBooleanNode));
154 tuple = py::make_tuple(
static_cast<int>(NodeType::BinaryBooleanNode));
157 tuple = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode));
160 tuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode));
163 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode));
166 tuple = py::make_tuple(
static_cast<int>(NodeType::UnaryExpressionNode));
169 tuple = py::make_tuple(
static_cast<int>(NodeType::BinaryExpressionNode));
172 tuple = py::make_tuple(
static_cast<int>(NodeType::BooleanNode));
175 tuple = py::make_tuple(
static_cast<int>(NodeType::IntegerNode));
178 tuple = py::make_tuple(
static_cast<int>(NodeType::DoubleNode));
181 tuple = py::make_tuple(
static_cast<int>(NodeType::IdentifierNode));
184 tuple = py::make_tuple(
static_cast<int>(NodeType::FunctionNode));
191 TEST(CutNodesTest, unaryBooleanNode)
195 const py::tuple booleanTuple_true = py::make_tuple(
static_cast<int>(NodeType::BooleanNode),
true);
196 const py::tuple booleanTuple_false = py::make_tuple(
static_cast<int>(NodeType::BooleanNode),
false);
200 EXPECT_TRUE(std::get<bool>(booleanNode_true->evaluate(
nullptr)));
201 EXPECT_FALSE(std::get<bool>(booleanNode_false->evaluate(
nullptr)));
204 const py::tuple uRelTuple_true = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), booleanTuple_true);
205 const py::tuple uRelTuple_false = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), booleanTuple_false);
209 EXPECT_TRUE(uRelNode_true->check(
nullptr));
210 EXPECT_FALSE(uRelNode_false->check(
nullptr));
214 const py::tuple uBoolTuple_true = py::make_tuple(
static_cast<int>(NodeType::UnaryBooleanNode), uRelTuple_true,
false,
false);
215 const py::tuple uBoolTuple_true_brack = py::make_tuple(
static_cast<int>(NodeType::UnaryBooleanNode), uRelTuple_true,
false,
true);
216 const py::tuple uBoolTuple_true_neg = py::make_tuple(
static_cast<int>(NodeType::UnaryBooleanNode), uRelTuple_true,
true,
false);
217 const py::tuple uBoolTuple_true_neg_brack = py::make_tuple(
static_cast<int>(NodeType::UnaryBooleanNode), uRelTuple_true,
true,
221 EXPECT_TRUE(uBoolNode_true->check(
nullptr));
222 EXPECT_EQ(uBoolNode_true->decompile(),
"true");
225 EXPECT_TRUE(uBoolNode_true_brack->check(
nullptr));
226 EXPECT_EQ(uBoolNode_true_brack->decompile(),
"[true]");
229 EXPECT_FALSE(uBoolNode_true_neg->check(
nullptr));
230 EXPECT_EQ(uBoolNode_true_neg->decompile(),
"not true");
233 EXPECT_FALSE(uBoolNode_true_neg_brack->check(
nullptr));
234 EXPECT_EQ(uBoolNode_true_neg_brack->decompile(),
"not [true]");
237 const py::tuple uBoolTuple_false = py::make_tuple(
static_cast<int>(NodeType::UnaryBooleanNode), uRelTuple_false,
false,
false);
238 const py::tuple uBoolTuple_false_brack = py::make_tuple(
static_cast<int>(NodeType::UnaryBooleanNode), uRelTuple_false,
false,
true);
239 const py::tuple uBoolTuple_false_neg = py::make_tuple(
static_cast<int>(NodeType::UnaryBooleanNode), uRelTuple_false,
true,
false);
240 const py::tuple uBoolTuple_false_neg_brack = py::make_tuple(
static_cast<int>(NodeType::UnaryBooleanNode), uRelTuple_false,
true,
244 EXPECT_FALSE(uBoolNode_false->check(
nullptr));
245 EXPECT_EQ(uBoolNode_false->decompile(),
"false");
248 EXPECT_FALSE(uBoolNode_false_brack->check(
nullptr));
249 EXPECT_EQ(uBoolNode_false_brack->decompile(),
"[false]");
252 EXPECT_TRUE(uBoolNode_false_neg->check(
nullptr));
253 EXPECT_EQ(uBoolNode_false_neg->decompile(),
"not false");
256 EXPECT_TRUE(uBoolNode_false_neg_brack->check(
nullptr));
257 EXPECT_EQ(uBoolNode_false_neg_brack->decompile(),
"not [false]");
261 TEST(CutNodesTest, binaryBooleanNode)
264 const py::tuple booleanTuple_true = py::make_tuple(
static_cast<int>(NodeType::BooleanNode),
true);
265 const py::tuple booleanTuple_false = py::make_tuple(
static_cast<int>(NodeType::BooleanNode),
false);
268 const py::tuple uRelTuple_true = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), booleanTuple_true);
269 const py::tuple uRelTuple_false = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), booleanTuple_false);
272 const py::tuple binBoolTuple_AND_true_true = py::make_tuple(
static_cast<int>(NodeType::BinaryBooleanNode), uRelTuple_true,
273 uRelTuple_true,
static_cast<int>(BooleanOperator::AND));
274 const py::tuple binBoolTuple_AND_false_true = py::make_tuple(
static_cast<int>(NodeType::BinaryBooleanNode), uRelTuple_false,
275 uRelTuple_true,
static_cast<int>(BooleanOperator::AND));
276 const py::tuple binBoolTuple_AND_true_false = py::make_tuple(
static_cast<int>(NodeType::BinaryBooleanNode), uRelTuple_true,
277 uRelTuple_false,
static_cast<int>(BooleanOperator::AND));
278 const py::tuple binBoolTuple_AND_false_false = py::make_tuple(
static_cast<int>(NodeType::BinaryBooleanNode), uRelTuple_false,
279 uRelTuple_false,
static_cast<int>(BooleanOperator::AND));
281 const py::tuple binBoolTuple_OR_true_true = py::make_tuple(
static_cast<int>(NodeType::BinaryBooleanNode), uRelTuple_true,
282 uRelTuple_true,
static_cast<int>(BooleanOperator::OR));
283 const py::tuple binBoolTuple_OR_false_true = py::make_tuple(
static_cast<int>(NodeType::BinaryBooleanNode), uRelTuple_false,
284 uRelTuple_true,
static_cast<int>(BooleanOperator::OR));
285 const py::tuple binBoolTuple_OR_true_false = py::make_tuple(
static_cast<int>(NodeType::BinaryBooleanNode), uRelTuple_true,
286 uRelTuple_false,
static_cast<int>(BooleanOperator::OR));
287 const py::tuple binBoolTuple_OR_false_false = py::make_tuple(
static_cast<int>(NodeType::BinaryBooleanNode), uRelTuple_false,
288 uRelTuple_false,
static_cast<int>(BooleanOperator::OR));
301 EXPECT_TRUE(binBoolNode_AND_true_true->check(
nullptr));
302 EXPECT_FALSE(binBoolNode_AND_false_true->check(
nullptr));
303 EXPECT_FALSE(binBoolNode_AND_true_false->check(
nullptr));
304 EXPECT_FALSE(binBoolNode_AND_false_false->check(
nullptr));
306 EXPECT_TRUE(binBoolNode_OR_true_true->check(
nullptr));
307 EXPECT_TRUE(binBoolNode_OR_false_true->check(
nullptr));
308 EXPECT_TRUE(binBoolNode_OR_true_false->check(
nullptr));
309 EXPECT_FALSE(binBoolNode_OR_false_false->check(
nullptr));
313 TEST(CutNodesTest, unaryRelationalNode)
317 py::object main = py::import(
"__main__");
318 py::object pyfloat = main.attr(
"__builtins__").attr(
"float");
321 py::tuple tuple = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), 1337);
322 py::tuple uRelTuple = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), tuple);
324 EXPECT_TRUE(node->check(
nullptr));
326 tuple = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), 0);
327 uRelTuple = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), tuple);
329 EXPECT_FALSE(node->check(
nullptr));
331 tuple = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), -0);
332 uRelTuple = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), tuple);
334 EXPECT_FALSE(node->check(
nullptr));
336 tuple = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), 1);
337 uRelTuple = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), tuple);
339 EXPECT_TRUE(node->check(
nullptr));
341 tuple = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), -1);
342 uRelTuple = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), tuple);
344 EXPECT_TRUE(node->check(
nullptr));
347 tuple = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 0.0);
348 uRelTuple = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), tuple);
350 EXPECT_FALSE(node->check(
nullptr));
352 tuple = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), -0.0);
353 uRelTuple = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), tuple);
355 EXPECT_FALSE(node->check(
nullptr));
357 tuple = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 1.0);
358 uRelTuple = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), tuple);
360 EXPECT_TRUE(node->check(
nullptr));
362 tuple = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), -1.0);
363 uRelTuple = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), tuple);
365 EXPECT_TRUE(node->check(
nullptr));
367 tuple = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 1.1);
368 uRelTuple = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), tuple);
370 EXPECT_TRUE(node->check(
nullptr));
372 tuple = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), -1.1);
373 uRelTuple = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), tuple);
375 EXPECT_TRUE(node->check(
nullptr));
377 tuple = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), pyfloat(
"nan"));
378 uRelTuple = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), tuple);
380 EXPECT_FALSE(node->check(
nullptr));
382 tuple = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), pyfloat(
"inf"));
383 uRelTuple = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), tuple);
385 EXPECT_TRUE(node->check(
nullptr));
388 tuple = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), pyfloat(
"-inf"));
389 uRelTuple = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), tuple);
391 EXPECT_TRUE(node->check(
nullptr));
394 tuple = py::make_tuple(
static_cast<int>(NodeType::BooleanNode),
true);
395 uRelTuple = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), tuple);
397 EXPECT_TRUE(node->check(
nullptr));
399 tuple = py::make_tuple(
static_cast<int>(NodeType::BooleanNode),
false);
400 uRelTuple = py::make_tuple(
static_cast<int>(NodeType::UnaryRelationalNode), tuple);
402 EXPECT_FALSE(node->check(
nullptr));
406 TEST(CutNodesTest, binaryRelationalNode)
410 py::object main = py::import(
"__main__");
411 py::object pyfloat = main.attr(
"__builtins__").attr(
"float");
413 py::tuple child1 = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), 1337);
414 py::tuple child2 = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), 1337);
415 py::tuple bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
416 static_cast<int>(ComparisonOperator::EQUALEQUAL));
418 EXPECT_TRUE(node->check(
nullptr));
420 child1 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 1337.0);
421 child2 = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), 1337);
422 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
423 static_cast<int>(ComparisonOperator::EQUALEQUAL));
425 EXPECT_TRUE(node->check(
nullptr));
427 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child2, child1,
428 static_cast<int>(ComparisonOperator::EQUALEQUAL));
430 EXPECT_TRUE(node->check(
nullptr));
432 child1 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 1337.0);
433 child2 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 1337.0);
434 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
435 static_cast<int>(ComparisonOperator::EQUALEQUAL));
437 EXPECT_TRUE(node->check(
nullptr));
440 child1 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), pyfloat(
"nan"));
441 child2 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), pyfloat(
"nan"));
442 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
443 static_cast<int>(ComparisonOperator::EQUALEQUAL));
445 EXPECT_TRUE(node->check(
nullptr));
447 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
448 static_cast<int>(ComparisonOperator::GREATEREQUAL));
450 EXPECT_FALSE(node->check(
nullptr));
452 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
453 static_cast<int>(ComparisonOperator::LESSEQUAL));
455 EXPECT_FALSE(node->check(
nullptr));
457 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
458 static_cast<int>(ComparisonOperator::GREATER));
460 EXPECT_FALSE(node->check(
nullptr));
462 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
463 static_cast<int>(ComparisonOperator::LESS));
465 EXPECT_FALSE(node->check(
nullptr));
468 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
469 static_cast<int>(ComparisonOperator::NOTEQUAL));
471 EXPECT_FALSE(node->check(
nullptr));
474 child1 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), pyfloat(
"nan"));
475 child2 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 0.0);
476 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
477 static_cast<int>(ComparisonOperator::EQUALEQUAL));
479 EXPECT_FALSE(node->check(
nullptr));
481 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
482 static_cast<int>(ComparisonOperator::GREATEREQUAL));
484 EXPECT_FALSE(node->check(
nullptr));
486 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
487 static_cast<int>(ComparisonOperator::LESSEQUAL));
489 EXPECT_FALSE(node->check(
nullptr));
491 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
492 static_cast<int>(ComparisonOperator::GREATER));
494 EXPECT_FALSE(node->check(
nullptr));
496 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
497 static_cast<int>(ComparisonOperator::LESS));
499 EXPECT_FALSE(node->check(
nullptr));
501 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
502 static_cast<int>(ComparisonOperator::NOTEQUAL));
504 EXPECT_TRUE(node->check(
nullptr));
507 child1 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), pyfloat(
"nan"));
508 child2 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), pyfloat(
"inf"));
509 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
510 static_cast<int>(ComparisonOperator::EQUALEQUAL));
512 EXPECT_FALSE(node->check(
nullptr));
514 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
515 static_cast<int>(ComparisonOperator::GREATEREQUAL));
517 EXPECT_FALSE(node->check(
nullptr));
519 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
520 static_cast<int>(ComparisonOperator::LESSEQUAL));
522 EXPECT_FALSE(node->check(
nullptr));
524 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
525 static_cast<int>(ComparisonOperator::GREATER));
527 EXPECT_FALSE(node->check(
nullptr));
529 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
530 static_cast<int>(ComparisonOperator::LESS));
532 EXPECT_FALSE(node->check(
nullptr));
534 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
535 static_cast<int>(ComparisonOperator::NOTEQUAL));
537 EXPECT_TRUE(node->check(
nullptr));
540 child1 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), pyfloat(
"nan"));
541 child2 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), pyfloat(
"-inf"));
542 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
543 static_cast<int>(ComparisonOperator::EQUALEQUAL));
545 EXPECT_FALSE(node->check(
nullptr));
547 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
548 static_cast<int>(ComparisonOperator::GREATEREQUAL));
550 EXPECT_FALSE(node->check(
nullptr));
552 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
553 static_cast<int>(ComparisonOperator::LESSEQUAL));
555 EXPECT_FALSE(node->check(
nullptr));
557 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
558 static_cast<int>(ComparisonOperator::GREATER));
560 EXPECT_FALSE(node->check(
nullptr));
562 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
563 static_cast<int>(ComparisonOperator::LESS));
565 EXPECT_FALSE(node->check(
nullptr));
567 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
568 static_cast<int>(ComparisonOperator::NOTEQUAL));
570 EXPECT_TRUE(node->check(
nullptr));
573 child1 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), pyfloat(
"inf"));
574 child2 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 0.0);
575 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
576 static_cast<int>(ComparisonOperator::EQUALEQUAL));
578 EXPECT_FALSE(node->check(
nullptr));
580 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
581 static_cast<int>(ComparisonOperator::GREATEREQUAL));
583 EXPECT_TRUE(node->check(
nullptr));
585 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
586 static_cast<int>(ComparisonOperator::LESSEQUAL));
588 EXPECT_FALSE(node->check(
nullptr));
590 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
591 static_cast<int>(ComparisonOperator::GREATER));
593 EXPECT_TRUE(node->check(
nullptr));
595 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
596 static_cast<int>(ComparisonOperator::LESS));
598 EXPECT_FALSE(node->check(
nullptr));
600 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
601 static_cast<int>(ComparisonOperator::NOTEQUAL));
603 EXPECT_TRUE(node->check(
nullptr));
606 child1 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), pyfloat(
"inf"));
607 child2 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), pyfloat(
"inf"));
608 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
609 static_cast<int>(ComparisonOperator::EQUALEQUAL));
611 EXPECT_TRUE(node->check(
nullptr));
613 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
614 static_cast<int>(ComparisonOperator::GREATEREQUAL));
616 EXPECT_TRUE(node->check(
nullptr));
618 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
619 static_cast<int>(ComparisonOperator::LESSEQUAL));
621 EXPECT_TRUE(node->check(
nullptr));
623 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
624 static_cast<int>(ComparisonOperator::GREATER));
626 EXPECT_FALSE(node->check(
nullptr));
628 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
629 static_cast<int>(ComparisonOperator::LESS));
631 EXPECT_FALSE(node->check(
nullptr));
633 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
634 static_cast<int>(ComparisonOperator::NOTEQUAL));
636 EXPECT_FALSE(node->check(
nullptr));
639 child1 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), pyfloat(
"inf"));
640 child2 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), pyfloat(
"-inf"));
641 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
642 static_cast<int>(ComparisonOperator::EQUALEQUAL));
644 EXPECT_FALSE(node->check(
nullptr));
646 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
647 static_cast<int>(ComparisonOperator::GREATEREQUAL));
649 EXPECT_TRUE(node->check(
nullptr));
651 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
652 static_cast<int>(ComparisonOperator::LESSEQUAL));
654 EXPECT_FALSE(node->check(
nullptr));
656 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
657 static_cast<int>(ComparisonOperator::GREATER));
659 EXPECT_TRUE(node->check(
nullptr));
661 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
662 static_cast<int>(ComparisonOperator::LESS));
664 EXPECT_FALSE(node->check(
nullptr));
666 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
667 static_cast<int>(ComparisonOperator::NOTEQUAL));
669 EXPECT_TRUE(node->check(
nullptr));
672 child1 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 3.141592653589793);
673 child2 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 3.141592653589792);
674 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
675 static_cast<int>(ComparisonOperator::EQUALEQUAL));
677 EXPECT_FALSE(node->check(
nullptr));
679 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
680 static_cast<int>(ComparisonOperator::GREATEREQUAL));
682 EXPECT_TRUE(node->check(
nullptr));
684 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
685 static_cast<int>(ComparisonOperator::LESSEQUAL));
687 EXPECT_FALSE(node->check(
nullptr));
689 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
690 static_cast<int>(ComparisonOperator::GREATER));
692 EXPECT_TRUE(node->check(
nullptr));
694 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
695 static_cast<int>(ComparisonOperator::LESS));
697 EXPECT_FALSE(node->check(
nullptr));
699 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
700 static_cast<int>(ComparisonOperator::NOTEQUAL));
702 EXPECT_TRUE(node->check(
nullptr));
705 child1 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 3.1415926535897931234567890);
706 child2 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 3.1415926535897931234567891);
707 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
708 static_cast<int>(ComparisonOperator::EQUALEQUAL));
710 EXPECT_TRUE(node->check(
nullptr));
712 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
713 static_cast<int>(ComparisonOperator::GREATEREQUAL));
715 EXPECT_TRUE(node->check(
nullptr));
717 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
718 static_cast<int>(ComparisonOperator::LESSEQUAL));
720 EXPECT_TRUE(node->check(
nullptr));
722 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
723 static_cast<int>(ComparisonOperator::GREATER));
725 EXPECT_FALSE(node->check(
nullptr));
727 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
728 static_cast<int>(ComparisonOperator::LESS));
730 EXPECT_FALSE(node->check(
nullptr));
732 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
733 static_cast<int>(ComparisonOperator::NOTEQUAL));
735 EXPECT_FALSE(node->check(
nullptr));
738 child1 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 3.0000000000000000000000001);
739 child2 = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), 3);
740 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
741 static_cast<int>(ComparisonOperator::EQUALEQUAL));
743 EXPECT_TRUE(node->check(
nullptr));
745 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
746 static_cast<int>(ComparisonOperator::GREATEREQUAL));
748 EXPECT_TRUE(node->check(
nullptr));
750 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
751 static_cast<int>(ComparisonOperator::LESSEQUAL));
753 EXPECT_TRUE(node->check(
nullptr));
755 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
756 static_cast<int>(ComparisonOperator::GREATER));
758 EXPECT_FALSE(node->check(
nullptr));
760 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
761 static_cast<int>(ComparisonOperator::LESS));
763 EXPECT_FALSE(node->check(
nullptr));
765 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
766 static_cast<int>(ComparisonOperator::NOTEQUAL));
768 EXPECT_FALSE(node->check(
nullptr));
772 child1 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 0.0);
773 child2 = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), 0);
774 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
775 static_cast<int>(ComparisonOperator::EQUALEQUAL));
777 EXPECT_TRUE(node->check(
nullptr));
779 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
780 static_cast<int>(ComparisonOperator::GREATEREQUAL));
782 EXPECT_TRUE(node->check(
nullptr));
784 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
785 static_cast<int>(ComparisonOperator::LESSEQUAL));
787 EXPECT_TRUE(node->check(
nullptr));
789 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
790 static_cast<int>(ComparisonOperator::GREATER));
792 EXPECT_FALSE(node->check(
nullptr));
794 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
795 static_cast<int>(ComparisonOperator::LESS));
797 EXPECT_FALSE(node->check(
nullptr));
799 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
800 static_cast<int>(ComparisonOperator::NOTEQUAL));
802 EXPECT_FALSE(node->check(
nullptr));
805 child1 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 3.00000000000001);
806 child2 = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), 3);
807 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
808 static_cast<int>(ComparisonOperator::EQUALEQUAL));
810 EXPECT_FALSE(node->check(
nullptr));
812 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
813 static_cast<int>(ComparisonOperator::GREATEREQUAL));
815 EXPECT_TRUE(node->check(
nullptr));
817 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
818 static_cast<int>(ComparisonOperator::LESSEQUAL));
820 EXPECT_FALSE(node->check(
nullptr));
822 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
823 static_cast<int>(ComparisonOperator::GREATER));
825 EXPECT_TRUE(node->check(
nullptr));
827 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
828 static_cast<int>(ComparisonOperator::LESS));
830 EXPECT_FALSE(node->check(
nullptr));
832 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
833 static_cast<int>(ComparisonOperator::NOTEQUAL));
835 EXPECT_TRUE(node->check(
nullptr));
838 child1 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 1.0000000000000001);
839 child2 = py::make_tuple(
static_cast<int>(NodeType::BooleanNode),
true);
840 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
841 static_cast<int>(ComparisonOperator::EQUALEQUAL));
844 EXPECT_TRUE(node->check(
nullptr));
846 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
847 static_cast<int>(ComparisonOperator::GREATEREQUAL));
849 EXPECT_TRUE(node->check(
nullptr));
851 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
852 static_cast<int>(ComparisonOperator::LESSEQUAL));
854 EXPECT_TRUE(node->check(
nullptr));
856 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
857 static_cast<int>(ComparisonOperator::GREATER));
859 EXPECT_FALSE(node->check(
nullptr));
861 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
862 static_cast<int>(ComparisonOperator::LESS));
864 EXPECT_FALSE(node->check(
nullptr));
866 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
867 static_cast<int>(ComparisonOperator::NOTEQUAL));
870 EXPECT_FALSE(node->check(
nullptr));
874 child1 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 0.0);
875 child2 = py::make_tuple(
static_cast<int>(NodeType::BooleanNode),
false);
876 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
877 static_cast<int>(ComparisonOperator::EQUALEQUAL));
879 EXPECT_TRUE(node->check(
nullptr));
881 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
882 static_cast<int>(ComparisonOperator::GREATEREQUAL));
884 EXPECT_TRUE(node->check(
nullptr));
886 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
887 static_cast<int>(ComparisonOperator::LESSEQUAL));
889 EXPECT_TRUE(node->check(
nullptr));
891 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
892 static_cast<int>(ComparisonOperator::GREATER));
894 EXPECT_FALSE(node->check(
nullptr));
896 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
897 static_cast<int>(ComparisonOperator::LESS));
899 EXPECT_FALSE(node->check(
nullptr));
901 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
902 static_cast<int>(ComparisonOperator::NOTEQUAL));
904 EXPECT_FALSE(node->check(
nullptr));
908 child1 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 1.00000000000001);
909 child2 = py::make_tuple(
static_cast<int>(NodeType::BooleanNode),
true);
910 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
911 static_cast<int>(ComparisonOperator::EQUALEQUAL));
913 EXPECT_FALSE(node->check(
nullptr));
915 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
916 static_cast<int>(ComparisonOperator::GREATEREQUAL));
918 EXPECT_TRUE(node->check(
nullptr));
920 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
921 static_cast<int>(ComparisonOperator::LESSEQUAL));
923 EXPECT_FALSE(node->check(
nullptr));
925 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
926 static_cast<int>(ComparisonOperator::GREATER));
928 EXPECT_TRUE(node->check(
nullptr));
930 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
931 static_cast<int>(ComparisonOperator::LESS));
933 EXPECT_FALSE(node->check(
nullptr));
935 bRelTuple = py::make_tuple(
static_cast<int>(NodeType::BinaryRelationalNode), child1, child2,
936 static_cast<int>(ComparisonOperator::NOTEQUAL));
938 EXPECT_TRUE(node->check(
nullptr));
942 TEST(CutNodesTest, ternaryRelationalNode)
946 py::object main = py::import(
"__main__");
947 py::object pyfloat = main.attr(
"__builtins__").attr(
"float");
949 auto child1 = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), 1);
950 auto child2 = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), 2);
951 auto child3 = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), 3);
952 auto tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child1, child2, child3,
953 static_cast<int>(ComparisonOperator::LESS),
static_cast<int>(ComparisonOperator::LESS));
956 EXPECT_TRUE(node->check(
nullptr));
957 EXPECT_EQ(node->decompile(),
"1 < 2 < 3");
959 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child1, child1, child1,
960 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::EQUALEQUAL));
962 EXPECT_TRUE(node->check(
nullptr));
963 EXPECT_EQ(node->decompile(),
"1 == 1 == 1");
966 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child1, child1, child1,
967 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::LESSEQUAL));
969 EXPECT_TRUE(node->check(
nullptr));
970 EXPECT_EQ(node->decompile(),
"1 == 1 <= 1");
973 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child1, child1, child2,
974 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::LESSEQUAL));
976 EXPECT_TRUE(node->check(
nullptr));
977 EXPECT_EQ(node->decompile(),
"1 == 1 <= 2");
980 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child1, child1, child2,
981 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::LESS));
983 EXPECT_TRUE(node->check(
nullptr));
984 EXPECT_EQ(node->decompile(),
"1 == 1 < 2");
986 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child1, child1, child2,
987 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::NOTEQUAL));
989 EXPECT_TRUE(node->check(
nullptr));
990 EXPECT_EQ(node->decompile(),
"1 == 1 != 2");
992 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child1, child1, child1,
993 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::GREATEREQUAL));
995 EXPECT_TRUE(node->check(
nullptr));
996 EXPECT_EQ(node->decompile(),
"1 == 1 >= 1");
998 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child1, child1, child2,
999 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::GREATER));
1001 EXPECT_FALSE(node->check(
nullptr));
1002 EXPECT_EQ(node->decompile(),
"1 == 1 > 2");
1004 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child1, child1, child1,
1005 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::NOTEQUAL));
1007 EXPECT_FALSE(node->check(
nullptr));
1008 EXPECT_EQ(node->decompile(),
"1 == 1 != 1");
1011 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child1, child1, child2,
1012 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::LESSEQUAL));
1014 EXPECT_TRUE(node->check(
nullptr));
1015 EXPECT_EQ(node->decompile(),
"1 == 1 <= 2");
1018 child3 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 3.141);
1020 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child1, child1, child3,
1021 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::LESSEQUAL));
1023 EXPECT_TRUE(node->check(
nullptr));
1024 EXPECT_EQ(node->decompile(),
"1 == 1 <= 3.141");
1026 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child1, child3, child3,
1027 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::LESSEQUAL));
1029 EXPECT_FALSE(node->check(
nullptr));
1030 EXPECT_EQ(node->decompile(),
"1 == 3.141 <= 3.141");
1033 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child3, child3, child3,
1034 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::LESSEQUAL));
1036 EXPECT_TRUE(node->check(
nullptr));
1037 EXPECT_EQ(node->decompile(),
"3.141 == 3.141 <= 3.141");
1040 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child3, child3, child3,
1041 static_cast<int>(ComparisonOperator::NOTEQUAL),
static_cast<int>(ComparisonOperator::LESSEQUAL));
1043 EXPECT_FALSE(node->check(
nullptr));
1044 EXPECT_EQ(node->decompile(),
"3.141 != 3.141 <= 3.141");
1046 child3 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), pyfloat(
"nan"));
1048 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child3, child3, child3,
1049 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::EQUALEQUAL));
1051 EXPECT_TRUE(node->check(
nullptr));
1052 EXPECT_EQ(node->decompile(),
"nan == nan == nan");
1054 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child3, child3, child2,
1055 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::EQUALEQUAL));
1057 EXPECT_FALSE(node->check(
nullptr));
1058 EXPECT_EQ(node->decompile(),
"nan == nan == 2");
1061 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child3, child3, child2,
1062 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::NOTEQUAL));
1064 EXPECT_TRUE(node->check(
nullptr));
1065 EXPECT_EQ(node->decompile(),
"nan == nan != 2");
1067 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child3, child3, child3,
1068 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::NOTEQUAL));
1070 EXPECT_FALSE(node->check(
nullptr));
1071 EXPECT_EQ(node->decompile(),
"nan == nan != nan");
1073 child2 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), pyfloat(
"inf"));
1075 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child3, child3, child2,
1076 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::NOTEQUAL));
1078 EXPECT_TRUE(node->check(
nullptr));
1079 EXPECT_EQ(node->decompile(),
"nan == nan != inf");
1082 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child3, child3, child2,
1083 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::EQUALEQUAL));
1085 EXPECT_FALSE(node->check(
nullptr));
1086 EXPECT_EQ(node->decompile(),
"nan == nan == inf");
1088 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child3, child3, child2,
1089 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::LESS));
1091 EXPECT_FALSE(node->check(
nullptr));
1092 EXPECT_EQ(node->decompile(),
"nan == nan < inf");
1094 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child3, child3, child2,
1095 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::LESSEQUAL));
1097 EXPECT_FALSE(node->check(
nullptr));
1098 EXPECT_EQ(node->decompile(),
"nan == nan <= inf");
1100 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child3, child3, child2,
1101 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::GREATER));
1103 EXPECT_FALSE(node->check(
nullptr));
1104 EXPECT_EQ(node->decompile(),
"nan == nan > inf");
1106 tuple = py::make_tuple(
static_cast<int>(NodeType::TernaryRelationalNode), child3, child3, child2,
1107 static_cast<int>(ComparisonOperator::EQUALEQUAL),
static_cast<int>(ComparisonOperator::GREATEREQUAL));
1109 EXPECT_FALSE(node->check(
nullptr));
1110 EXPECT_EQ(node->decompile(),
"nan == nan >= inf");
1114 TEST(CutNodesTest, unaryExpressionNode)
1117 auto child1 = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), 1);
1118 auto tuple = py::make_tuple(
static_cast<int>(NodeType::UnaryExpressionNode), child1,
false,
false);
1120 EXPECT_EQ(std::get<int>(node->evaluate(
nullptr)), 1);
1123 EXPECT_EQ(node->decompile(),
"1");
1125 tuple = py::make_tuple(
static_cast<int>(NodeType::UnaryExpressionNode), child1,
true,
false);
1127 EXPECT_EQ(std::get<int>(node->evaluate(
nullptr)), -1);
1130 EXPECT_EQ(node->decompile(),
"-1");
1132 tuple = py::make_tuple(
static_cast<int>(NodeType::UnaryExpressionNode), child1,
true,
true);
1134 EXPECT_EQ(std::get<int>(node->evaluate(
nullptr)), -1);
1137 EXPECT_EQ(node->decompile(),
"-( 1 )");
1139 tuple = py::make_tuple(
static_cast<int>(NodeType::UnaryExpressionNode), child1,
false,
true);
1141 EXPECT_EQ(std::get<int>(node->evaluate(
nullptr)), 1);
1144 EXPECT_EQ(node->decompile(),
"( 1 )");
1148 TEST(CutNodesTest, binaryExpressionNode)
1151 auto child1 = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), 1);
1152 auto child2 = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 2.5);
1153 auto tuple = py::make_tuple(
static_cast<int>(NodeType::BinaryExpressionNode), child1, child1,
1154 static_cast<int>(ArithmeticOperation::PLUS));
1156 EXPECT_EQ(std::get<int>(node->evaluate(
nullptr)), 2);
1159 EXPECT_EQ(node->decompile(),
"1 + 1");
1161 tuple = py::make_tuple(
static_cast<int>(NodeType::BinaryExpressionNode), child1, child2,
1162 static_cast<int>(ArithmeticOperation::PLUS));
1164 EXPECT_EQ(std::get<double>(node->evaluate(
nullptr)), 3.5);
1165 EXPECT_EQ(node->decompile(),
"1 + 2.5");
1167 tuple = py::make_tuple(
static_cast<int>(NodeType::BinaryExpressionNode), child1, child2,
1168 static_cast<int>(ArithmeticOperation::MINUS));
1170 EXPECT_EQ(std::get<double>(node->evaluate(
nullptr)), -1.5);
1171 EXPECT_EQ(node->decompile(),
"1 - 2.5");
1174 tuple = py::make_tuple(
static_cast<int>(NodeType::BinaryExpressionNode), child1, child2,
1175 static_cast<int>(ArithmeticOperation::PRODUCT));
1177 EXPECT_EQ(std::get<double>(node->evaluate(
nullptr)), 2.5);
1178 EXPECT_EQ(node->decompile(),
"1 * 2.5");
1181 tuple = py::make_tuple(
static_cast<int>(NodeType::BinaryExpressionNode), child1, child2,
1182 static_cast<int>(ArithmeticOperation::DIVISION));
1184 EXPECT_EQ(std::get<double>(node->evaluate(
nullptr)), 0.4);
1185 EXPECT_EQ(node->decompile(),
"1 / 2.5");
1188 tuple = py::make_tuple(
static_cast<int>(NodeType::BinaryExpressionNode), child1, child1,
1189 static_cast<int>(ArithmeticOperation::POWER));
1191 EXPECT_EQ(std::get<double>(node->evaluate(
nullptr)), 1.0);
1192 EXPECT_EQ(node->decompile(),
"1 ** 1");
1194 child1 = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), 2);
1195 child2 = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), 3);
1197 tuple = py::make_tuple(
static_cast<int>(NodeType::BinaryExpressionNode), child1, child2,
1198 static_cast<int>(ArithmeticOperation::POWER));
1200 EXPECT_EQ(std::get<double>(node->evaluate(
nullptr)), 8.0);
1201 EXPECT_EQ(node->decompile(),
"2 ** 3");
1203 child2 = py::make_tuple(
static_cast<int>(NodeType::IdentifierNode),
"mocking_variable");
1204 MockObjectType part{10};
1205 tuple = py::make_tuple(
static_cast<int>(NodeType::BinaryExpressionNode), child1, child2,
1206 static_cast<int>(ArithmeticOperation::POWER));
1208 EXPECT_EQ(std::get<double>(node->evaluate(&part)), 1024);
1209 EXPECT_EQ(node->decompile(),
"2 ** mocking_variable");
1212 tuple = py::make_tuple(
static_cast<int>(NodeType::BinaryExpressionNode), child2, child2,
1213 static_cast<int>(ArithmeticOperation::PLUS));
1215 EXPECT_EQ(std::get<int>(node->evaluate(&part)), 20);
1216 EXPECT_EQ(node->decompile(),
"mocking_variable + mocking_variable");
1218 tuple = py::make_tuple(
static_cast<int>(NodeType::BinaryExpressionNode), child2, child2,
1219 static_cast<int>(ArithmeticOperation::MINUS));
1221 EXPECT_EQ(std::get<int>(node->evaluate(&part)), 0);
1222 EXPECT_EQ(node->decompile(),
"mocking_variable - mocking_variable");
1224 tuple = py::make_tuple(
static_cast<int>(NodeType::BinaryExpressionNode), child2, child2,
1225 static_cast<int>(ArithmeticOperation::PRODUCT));
1227 EXPECT_EQ(std::get<int>(node->evaluate(&part)), 100);
1228 EXPECT_EQ(node->decompile(),
"mocking_variable * mocking_variable");
1231 tuple = py::make_tuple(
static_cast<int>(NodeType::BinaryExpressionNode), child2, child2,
1232 static_cast<int>(ArithmeticOperation::DIVISION));
1234 EXPECT_EQ(std::get<double>(node->evaluate(&part)), 1);
1235 EXPECT_EQ(node->decompile(),
"mocking_variable / mocking_variable");
1238 part = MockObjectType{20};
1239 tuple = py::make_tuple(
static_cast<int>(NodeType::BinaryExpressionNode), child1, child2,
1240 static_cast<int>(ArithmeticOperation::DIVISION));
1242 EXPECT_EQ(std::get<double>(node->evaluate(&part)), 0.1);
1243 EXPECT_EQ(node->decompile(),
"2 / mocking_variable");
1245 part = MockObjectType{0.1};
1246 tuple = py::make_tuple(
static_cast<int>(NodeType::BinaryExpressionNode), child2, child1,
1247 static_cast<int>(ArithmeticOperation::DIVISION));
1249 EXPECT_EQ(std::get<double>(node->evaluate(&part)), 0.05);
1250 EXPECT_EQ(node->decompile(),
"mocking_variable / 2");
1255 TEST(CutNodesTest, identifierNode)
1258 MockObjectType part{4.2};
1259 auto tuple = py::make_tuple(
static_cast<int>(NodeType::IdentifierNode),
"mocking_variable");
1261 EXPECT_EQ(std::get<double>(node->evaluate(&part)), 4.2);
1263 tuple = py::make_tuple(
static_cast<int>(NodeType::IdentifierNode),
"THISDOESNOTEXIST");
1267 tuple = py::make_tuple(
static_cast<int>(NodeType::UnaryExpressionNode), tuple,
false,
false);
1272 TEST(CutNodesTest, functionNode)
1275 MockObjectType part{4};
1276 auto tuple = py::make_tuple(
1277 static_cast<int>(NodeType::FunctionNode),
1279 "mocking_variable, 2, 1"
1282 EXPECT_EQ(std::get<double>(node->evaluate(&part)), 7);
1283 EXPECT_EQ(node->decompile(),
"sum(mocking_variable, 2, 1)");
1284 part = MockObjectType{4.2};
1285 EXPECT_EQ(std::get<double>(node->evaluate(&part)), 7.2);
1286 part = MockObjectType{
false};
1287 EXPECT_EQ(std::get<double>(node->evaluate(&part)), 3.0);
1288 part = MockObjectType{
true};
1289 EXPECT_EQ(std::get<double>(node->evaluate(&part)), 4.0);
1293 TEST(CutNodesTest, integerNode)
1297 py::object main = py::import(
"__main__");
1300 const py::tuple iTuple_val = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), 1337);
1301 const py::tuple iTuple_val_neg = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), -1337);
1302 const py::tuple iTuple_val_zero = py::make_tuple(
static_cast<int>(NodeType::IntegerNode), 0);
1305 const py::tuple iTuple_max = py::make_tuple(
static_cast<int>(NodeType::IntegerNode),
1306 main.attr(
"__builtins__").attr(
"int")(
"2147483647"));
1307 const py::tuple iTuple_min = py::make_tuple(
static_cast<int>(NodeType::IntegerNode),
1308 main.attr(
"__builtins__").attr(
"int")(
"-2147483648"));
1309 const py::tuple iTuple_pos_overflow = py::make_tuple(
static_cast<int>(NodeType::IntegerNode),
1310 main.attr(
"__builtins__").attr(
"int")(
"2147483648"));
1311 const py::tuple iTuple_neg_overflow = py::make_tuple(
static_cast<int>(NodeType::IntegerNode),
1312 main.attr(
"__builtins__").attr(
"int")(
"-2147483649"));
1325 EXPECT_EQ(std::get<int>(iNode_val->evaluate(
nullptr)), 1337);
1326 EXPECT_EQ(std::get<int>(iNode_val_neg->evaluate(
nullptr)), -1337);
1327 EXPECT_EQ(std::get<int>(iNode_val_zero->evaluate(
nullptr)), 0);
1328 EXPECT_EQ(std::get<int>(iNode_max->evaluate(
nullptr)), 2147483647);
1329 EXPECT_EQ(std::get<int>(iNode_min->evaluate(
nullptr)), -2147483648);
1331 EXPECT_EQ(std::get<double>(iNode_pos_overflow->evaluate(
nullptr)), 2147483648.);
1332 EXPECT_EQ(std::get<double>(iNode_neg_overflow->evaluate(
nullptr)), -2147483649.);
1335 EXPECT_EQ(iNode_val->decompile(),
"1337");
1336 EXPECT_EQ(iNode_val_neg->decompile(),
"-1337");
1337 EXPECT_EQ(iNode_val_zero->decompile(),
"0");
1338 EXPECT_EQ(iNode_max->decompile(),
"2147483647");
1339 EXPECT_EQ(iNode_min->decompile(),
"-2147483648");
1341 EXPECT_EQ(iNode_pos_overflow->decompile(),
"2.14748e+09");
1342 EXPECT_EQ(iNode_neg_overflow->decompile(),
"-2.14748e+09");
1345 TEST(CutNodesTest, booleanNode)
1349 const py::tuple booleanTuple_true = py::make_tuple(
static_cast<int>(NodeType::BooleanNode),
true);
1350 const py::tuple booleanTuple_false = py::make_tuple(
static_cast<int>(NodeType::BooleanNode),
false);
1355 EXPECT_TRUE(std::get<bool>(booleanNode_true->evaluate(
nullptr)));
1356 EXPECT_FALSE(std::get<bool>(booleanNode_false->evaluate(
nullptr)));
1358 EXPECT_EQ(booleanNode_true->decompile(),
"true");
1359 EXPECT_EQ(booleanNode_false->decompile(),
"false");
1362 TEST(CutNodesTest, doubleNode)
1366 py::object main = py::import(
"__main__");
1369 const py::tuple tuple_val = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 3.141);
1370 const py::tuple tuple_val_neg = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), -3.141);
1371 const py::tuple tuple_val_zero = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), 0.0);
1373 const py::tuple tuple_inf = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), main.attr(
"__builtins__").attr(
"float")(
"inf"));
1374 const py::tuple tuple_neg_inf = py::make_tuple(
static_cast<int>(NodeType::DoubleNode),
1375 main.attr(
"__builtins__").attr(
"float")(
"-inf"));
1377 const py::tuple tuple_nan = py::make_tuple(
static_cast<int>(NodeType::DoubleNode), main.attr(
"__builtins__").attr(
"float")(
"nan"));
1391 EXPECT_EQ(std::get<double>(doubleNode_val->evaluate(
nullptr)), 3.141);
1392 EXPECT_EQ(std::get<double>(doubleNode_val_neg->evaluate(
nullptr)), -3.141);
1393 EXPECT_EQ(std::get<double>(doubleNode_val_zero->evaluate(
nullptr)), 0);
1396 EXPECT_EQ(std::get<double>(doubleNode_inf->evaluate(
nullptr)), std::numeric_limits<double>::infinity());
1397 EXPECT_EQ(std::get<double>(doubleNode_neg_inf->evaluate(
nullptr)), -1 * std::numeric_limits<double>::infinity());
1400 EXPECT_TRUE(std::isnan(std::get<double>(doubleNode_nan->evaluate(
nullptr))));
1403 EXPECT_EQ(doubleNode_val->decompile(),
"3.141");
1404 EXPECT_EQ(doubleNode_val_neg->decompile(),
"-3.141");
1405 EXPECT_EQ(doubleNode_val_zero->decompile(),
"0");
1407 EXPECT_EQ(doubleNode_inf->decompile(),
"inf");
1408 EXPECT_EQ(doubleNode_neg_inf->decompile(),
"-inf");
1410 EXPECT_EQ(doubleNode_nan->decompile(),
"nan");
static std::unique_ptr< const AbstractExpressionNode< AVariableManager > > compile_expression_node(Nodetuple tuple)
This template function creates a ExpressionNode from a boost::python::tuple The Python Parser encodes...
static std::unique_ptr< const AbstractBooleanNode< AVariableManager > > compile_boolean_node(Nodetuple tuple)
This template function creates a boolean node from a boost::python::tuple The Python Parser encodes t...
T convertString(const std::string &str)
Converts a string to type T (one of float, double, long double, int, long int, unsigned long int).
Abstract base class for different kinds of events.