From 50e79a6817f3d125005dbaab0b95b78a973002a8 Mon Sep 17 00:00:00 2001 From: Torsten Paul Date: Fri, 5 Dec 2014 20:54:01 +0100 Subject: [PATCH] Fix evaluation of ! expressions. --- src/value.cc | 5 + src/value.h | 1 + .../misc/expression-evaluation-tests.scad | 41 ++ tests/CMakeLists.txt | 1 + .../expression-evaluation-tests-expected.echo | 361 ++++++++++++++++++ 5 files changed, 409 insertions(+) create mode 100644 testdata/scad/misc/expression-evaluation-tests.scad create mode 100644 tests/regression/echotest/expression-evaluation-tests-expected.echo diff --git a/src/value.cc b/src/value.cc index 3180f2b0..d3eea01a 100644 --- a/src/value.cc +++ b/src/value.cc @@ -877,6 +877,11 @@ ValuePtr ValuePtr::operator-() const return ValuePtr(-**this); } +ValuePtr ValuePtr::operator!() const +{ + return ValuePtr(!**this); +} + ValuePtr ValuePtr::operator[](const ValuePtr &v) const { return ValuePtr((**this)[*v]); diff --git a/src/value.h b/src/value.h index bfd08376..e3822309 100644 --- a/src/value.h +++ b/src/value.h @@ -187,6 +187,7 @@ public: bool operator>=(const ValuePtr &v) const; bool operator>(const ValuePtr &v) const; ValuePtr operator-() const; + ValuePtr operator!() const; ValuePtr operator[](const ValuePtr &v) const; ValuePtr operator+(const ValuePtr &v) const; ValuePtr operator-(const ValuePtr &v) const; diff --git a/testdata/scad/misc/expression-evaluation-tests.scad b/testdata/scad/misc/expression-evaluation-tests.scad new file mode 100644 index 00000000..0dd5ff37 --- /dev/null +++ b/testdata/scad/misc/expression-evaluation-tests.scad @@ -0,0 +1,41 @@ +values = [ + undef, // special undefined value + 1/0, // infinity + -1/0, // -infinity + 0/0, // not a number + 0, -4.2, -2, 3, 42.42, 242, // number + true, false, // boolean + "", "text", // string + [], [ 0 ], [ 1 ], // vector + [ 0 : 0 ], [ 1 : 2 ] // range +]; + +array = [ "a", "b", "c", "d" ]; + +for (v = values) { + echo(v = v, op = "not v", result = !v); + echo(v = v, op = "-v", result = -v); + echo(v = v, op = "v *", result = v * 3); + echo(v = v, op = "* v", result = 2 * v); + echo(v = v, op = "v /", result = v / 3); + echo(v = v, op = "/ v", result = 2 / v); + echo(v = v, op = "v %", result = v % 3); + echo(v = v, op = "% v", result = 2 % v); + echo(v = v, op = "v +", result = v + 3); + echo(v = v, op = "+ v", result = 2 + v); + echo(v = v, op = "v -", result = v - 3); + echo(v = v, op = "- v", result = 2 - v); + echo(v = v, op = "v and true", result = v && true); + echo(v = v, op = "v and false", result = v && false); + echo(v = v, op = "v or true", result = v || true); + echo(v = v, op = "v or false", result = v || false); +// echo(v = v, op = "<", result = v < 3); +// echo(v = v, op = "<=", result = v <= 3); +// echo(v = v, op = "==", result = v == 3); +// echo(v = v, op = "!=", result = v != 3); +// echo(v = v, op = ">=", result = v >= 3); +// echo(v = v, op = ">", result = v > 3); + echo(v = v, op = "[v]", result = array[v]); + echo(v = v, op = "v[0]", result = v[0]); + echo(v = v, op = "v[4]", result = v[4]); +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index be237330..e190b10c 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1025,6 +1025,7 @@ list(APPEND EXAMPLE_FILES ${EXAMPLE_3D_FILES} ${EXAMPLE_2D_FILES}) list(APPEND ECHO_FILES ${FUNCTION_FILES} ${CMAKE_SOURCE_DIR}/../testdata/scad/3D/features/for-tests.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/expression-evaluation-tests.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/echo-tests.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/escape-test.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/parser-tests.scad diff --git a/tests/regression/echotest/expression-evaluation-tests-expected.echo b/tests/regression/echotest/expression-evaluation-tests-expected.echo new file mode 100644 index 00000000..49f91f0d --- /dev/null +++ b/tests/regression/echotest/expression-evaluation-tests-expected.echo @@ -0,0 +1,361 @@ +ECHO: v = undef, op = "not v", result = true +ECHO: v = undef, op = "-v", result = undef +ECHO: v = undef, op = "v *", result = undef +ECHO: v = undef, op = "* v", result = undef +ECHO: v = undef, op = "v /", result = undef +ECHO: v = undef, op = "/ v", result = undef +ECHO: v = undef, op = "v %", result = undef +ECHO: v = undef, op = "% v", result = undef +ECHO: v = undef, op = "v +", result = undef +ECHO: v = undef, op = "+ v", result = undef +ECHO: v = undef, op = "v -", result = undef +ECHO: v = undef, op = "- v", result = undef +ECHO: v = undef, op = "v and true", result = false +ECHO: v = undef, op = "v and false", result = false +ECHO: v = undef, op = "v or true", result = true +ECHO: v = undef, op = "v or false", result = false +ECHO: v = undef, op = "[v]", result = undef +ECHO: v = undef, op = "v[0]", result = undef +ECHO: v = undef, op = "v[4]", result = undef +ECHO: v = inf, op = "not v", result = false +ECHO: v = inf, op = "-v", result = -inf +ECHO: v = inf, op = "v *", result = inf +ECHO: v = inf, op = "* v", result = inf +ECHO: v = inf, op = "v /", result = inf +ECHO: v = inf, op = "/ v", result = 0 +ECHO: v = inf, op = "v %", result = nan +ECHO: v = inf, op = "% v", result = 2 +ECHO: v = inf, op = "v +", result = inf +ECHO: v = inf, op = "+ v", result = inf +ECHO: v = inf, op = "v -", result = inf +ECHO: v = inf, op = "- v", result = -inf +ECHO: v = inf, op = "v and true", result = true +ECHO: v = inf, op = "v and false", result = false +ECHO: v = inf, op = "v or true", result = true +ECHO: v = inf, op = "v or false", result = true +ECHO: v = inf, op = "[v]", result = undef +ECHO: v = inf, op = "v[0]", result = undef +ECHO: v = inf, op = "v[4]", result = undef +ECHO: v = -inf, op = "not v", result = false +ECHO: v = -inf, op = "-v", result = inf +ECHO: v = -inf, op = "v *", result = -inf +ECHO: v = -inf, op = "* v", result = -inf +ECHO: v = -inf, op = "v /", result = -inf +ECHO: v = -inf, op = "/ v", result = 0 +ECHO: v = -inf, op = "v %", result = nan +ECHO: v = -inf, op = "% v", result = 2 +ECHO: v = -inf, op = "v +", result = -inf +ECHO: v = -inf, op = "+ v", result = -inf +ECHO: v = -inf, op = "v -", result = -inf +ECHO: v = -inf, op = "- v", result = inf +ECHO: v = -inf, op = "v and true", result = true +ECHO: v = -inf, op = "v and false", result = false +ECHO: v = -inf, op = "v or true", result = true +ECHO: v = -inf, op = "v or false", result = true +ECHO: v = -inf, op = "[v]", result = undef +ECHO: v = -inf, op = "v[0]", result = undef +ECHO: v = -inf, op = "v[4]", result = undef +ECHO: v = nan, op = "not v", result = false +ECHO: v = nan, op = "-v", result = nan +ECHO: v = nan, op = "v *", result = nan +ECHO: v = nan, op = "* v", result = nan +ECHO: v = nan, op = "v /", result = nan +ECHO: v = nan, op = "/ v", result = nan +ECHO: v = nan, op = "v %", result = nan +ECHO: v = nan, op = "% v", result = nan +ECHO: v = nan, op = "v +", result = nan +ECHO: v = nan, op = "+ v", result = nan +ECHO: v = nan, op = "v -", result = nan +ECHO: v = nan, op = "- v", result = nan +ECHO: v = nan, op = "v and true", result = true +ECHO: v = nan, op = "v and false", result = false +ECHO: v = nan, op = "v or true", result = true +ECHO: v = nan, op = "v or false", result = true +ECHO: v = nan, op = "[v]", result = undef +ECHO: v = nan, op = "v[0]", result = undef +ECHO: v = nan, op = "v[4]", result = undef +ECHO: v = 0, op = "not v", result = true +ECHO: v = 0, op = "-v", result = 0 +ECHO: v = 0, op = "v *", result = 0 +ECHO: v = 0, op = "* v", result = 0 +ECHO: v = 0, op = "v /", result = 0 +ECHO: v = 0, op = "/ v", result = inf +ECHO: v = 0, op = "v %", result = 0 +ECHO: v = 0, op = "% v", result = nan +ECHO: v = 0, op = "v +", result = 3 +ECHO: v = 0, op = "+ v", result = 2 +ECHO: v = 0, op = "v -", result = -3 +ECHO: v = 0, op = "- v", result = 2 +ECHO: v = 0, op = "v and true", result = false +ECHO: v = 0, op = "v and false", result = false +ECHO: v = 0, op = "v or true", result = true +ECHO: v = 0, op = "v or false", result = false +ECHO: v = 0, op = "[v]", result = "a" +ECHO: v = 0, op = "v[0]", result = undef +ECHO: v = 0, op = "v[4]", result = undef +ECHO: v = -4.2, op = "not v", result = false +ECHO: v = -4.2, op = "-v", result = 4.2 +ECHO: v = -4.2, op = "v *", result = -12.6 +ECHO: v = -4.2, op = "* v", result = -8.4 +ECHO: v = -4.2, op = "v /", result = -1.4 +ECHO: v = -4.2, op = "/ v", result = -0.47619047619 +ECHO: v = -4.2, op = "v %", result = -1.2 +ECHO: v = -4.2, op = "% v", result = 2 +ECHO: v = -4.2, op = "v +", result = -1.2 +ECHO: v = -4.2, op = "+ v", result = -2.2 +ECHO: v = -4.2, op = "v -", result = -7.2 +ECHO: v = -4.2, op = "- v", result = 6.2 +ECHO: v = -4.2, op = "v and true", result = true +ECHO: v = -4.2, op = "v and false", result = false +ECHO: v = -4.2, op = "v or true", result = true +ECHO: v = -4.2, op = "v or false", result = true +ECHO: v = -4.2, op = "[v]", result = undef +ECHO: v = -4.2, op = "v[0]", result = undef +ECHO: v = -4.2, op = "v[4]", result = undef +ECHO: v = -2, op = "not v", result = false +ECHO: v = -2, op = "-v", result = 2 +ECHO: v = -2, op = "v *", result = -6 +ECHO: v = -2, op = "* v", result = -4 +ECHO: v = -2, op = "v /", result = -0.66666666666 +ECHO: v = -2, op = "/ v", result = -1 +ECHO: v = -2, op = "v %", result = -2 +ECHO: v = -2, op = "% v", result = 0 +ECHO: v = -2, op = "v +", result = 1 +ECHO: v = -2, op = "+ v", result = 0 +ECHO: v = -2, op = "v -", result = -5 +ECHO: v = -2, op = "- v", result = 4 +ECHO: v = -2, op = "v and true", result = true +ECHO: v = -2, op = "v and false", result = false +ECHO: v = -2, op = "v or true", result = true +ECHO: v = -2, op = "v or false", result = true +ECHO: v = -2, op = "[v]", result = undef +ECHO: v = -2, op = "v[0]", result = undef +ECHO: v = -2, op = "v[4]", result = undef +ECHO: v = 3, op = "not v", result = false +ECHO: v = 3, op = "-v", result = -3 +ECHO: v = 3, op = "v *", result = 9 +ECHO: v = 3, op = "* v", result = 6 +ECHO: v = 3, op = "v /", result = 1 +ECHO: v = 3, op = "/ v", result = 0.66666666666 +ECHO: v = 3, op = "v %", result = 0 +ECHO: v = 3, op = "% v", result = 2 +ECHO: v = 3, op = "v +", result = 6 +ECHO: v = 3, op = "+ v", result = 5 +ECHO: v = 3, op = "v -", result = 0 +ECHO: v = 3, op = "- v", result = -1 +ECHO: v = 3, op = "v and true", result = true +ECHO: v = 3, op = "v and false", result = false +ECHO: v = 3, op = "v or true", result = true +ECHO: v = 3, op = "v or false", result = true +ECHO: v = 3, op = "[v]", result = "d" +ECHO: v = 3, op = "v[0]", result = undef +ECHO: v = 3, op = "v[4]", result = undef +ECHO: v = 42.42, op = "not v", result = false +ECHO: v = 42.42, op = "-v", result = -42.42 +ECHO: v = 42.42, op = "v *", result = 127.26 +ECHO: v = 42.42, op = "* v", result = 84.84 +ECHO: v = 42.42, op = "v /", result = 14.14 +ECHO: v = 42.42, op = "/ v", result = 0.0471475719 +ECHO: v = 42.42, op = "v %", result = 0.42 +ECHO: v = 42.42, op = "% v", result = 2 +ECHO: v = 42.42, op = "v +", result = 45.42 +ECHO: v = 42.42, op = "+ v", result = 44.42 +ECHO: v = 42.42, op = "v -", result = 39.42 +ECHO: v = 42.42, op = "- v", result = -40.42 +ECHO: v = 42.42, op = "v and true", result = true +ECHO: v = 42.42, op = "v and false", result = false +ECHO: v = 42.42, op = "v or true", result = true +ECHO: v = 42.42, op = "v or false", result = true +ECHO: v = 42.42, op = "[v]", result = undef +ECHO: v = 42.42, op = "v[0]", result = undef +ECHO: v = 42.42, op = "v[4]", result = undef +ECHO: v = 242, op = "not v", result = false +ECHO: v = 242, op = "-v", result = -242 +ECHO: v = 242, op = "v *", result = 726 +ECHO: v = 242, op = "* v", result = 484 +ECHO: v = 242, op = "v /", result = 80.66666666666 +ECHO: v = 242, op = "/ v", result = 0.00826446281 +ECHO: v = 242, op = "v %", result = 2 +ECHO: v = 242, op = "% v", result = 2 +ECHO: v = 242, op = "v +", result = 245 +ECHO: v = 242, op = "+ v", result = 244 +ECHO: v = 242, op = "v -", result = 239 +ECHO: v = 242, op = "- v", result = -240 +ECHO: v = 242, op = "v and true", result = true +ECHO: v = 242, op = "v and false", result = false +ECHO: v = 242, op = "v or true", result = true +ECHO: v = 242, op = "v or false", result = true +ECHO: v = 242, op = "[v]", result = undef +ECHO: v = 242, op = "v[0]", result = undef +ECHO: v = 242, op = "v[4]", result = undef +ECHO: v = true, op = "not v", result = false +ECHO: v = true, op = "-v", result = undef +ECHO: v = true, op = "v *", result = undef +ECHO: v = true, op = "* v", result = undef +ECHO: v = true, op = "v /", result = undef +ECHO: v = true, op = "/ v", result = undef +ECHO: v = true, op = "v %", result = undef +ECHO: v = true, op = "% v", result = undef +ECHO: v = true, op = "v +", result = undef +ECHO: v = true, op = "+ v", result = undef +ECHO: v = true, op = "v -", result = undef +ECHO: v = true, op = "- v", result = undef +ECHO: v = true, op = "v and true", result = true +ECHO: v = true, op = "v and false", result = false +ECHO: v = true, op = "v or true", result = true +ECHO: v = true, op = "v or false", result = true +ECHO: v = true, op = "[v]", result = undef +ECHO: v = true, op = "v[0]", result = undef +ECHO: v = true, op = "v[4]", result = undef +ECHO: v = false, op = "not v", result = true +ECHO: v = false, op = "-v", result = undef +ECHO: v = false, op = "v *", result = undef +ECHO: v = false, op = "* v", result = undef +ECHO: v = false, op = "v /", result = undef +ECHO: v = false, op = "/ v", result = undef +ECHO: v = false, op = "v %", result = undef +ECHO: v = false, op = "% v", result = undef +ECHO: v = false, op = "v +", result = undef +ECHO: v = false, op = "+ v", result = undef +ECHO: v = false, op = "v -", result = undef +ECHO: v = false, op = "- v", result = undef +ECHO: v = false, op = "v and true", result = false +ECHO: v = false, op = "v and false", result = false +ECHO: v = false, op = "v or true", result = true +ECHO: v = false, op = "v or false", result = false +ECHO: v = false, op = "[v]", result = undef +ECHO: v = false, op = "v[0]", result = undef +ECHO: v = false, op = "v[4]", result = undef +ECHO: v = "", op = "not v", result = true +ECHO: v = "", op = "-v", result = undef +ECHO: v = "", op = "v *", result = undef +ECHO: v = "", op = "* v", result = undef +ECHO: v = "", op = "v /", result = undef +ECHO: v = "", op = "/ v", result = undef +ECHO: v = "", op = "v %", result = undef +ECHO: v = "", op = "% v", result = undef +ECHO: v = "", op = "v +", result = undef +ECHO: v = "", op = "+ v", result = undef +ECHO: v = "", op = "v -", result = undef +ECHO: v = "", op = "- v", result = undef +ECHO: v = "", op = "v and true", result = false +ECHO: v = "", op = "v and false", result = false +ECHO: v = "", op = "v or true", result = true +ECHO: v = "", op = "v or false", result = false +ECHO: v = "", op = "[v]", result = undef +ECHO: v = "", op = "v[0]", result = undef +ECHO: v = "", op = "v[4]", result = undef +ECHO: v = "text", op = "not v", result = false +ECHO: v = "text", op = "-v", result = undef +ECHO: v = "text", op = "v *", result = undef +ECHO: v = "text", op = "* v", result = undef +ECHO: v = "text", op = "v /", result = undef +ECHO: v = "text", op = "/ v", result = undef +ECHO: v = "text", op = "v %", result = undef +ECHO: v = "text", op = "% v", result = undef +ECHO: v = "text", op = "v +", result = undef +ECHO: v = "text", op = "+ v", result = undef +ECHO: v = "text", op = "v -", result = undef +ECHO: v = "text", op = "- v", result = undef +ECHO: v = "text", op = "v and true", result = true +ECHO: v = "text", op = "v and false", result = false +ECHO: v = "text", op = "v or true", result = true +ECHO: v = "text", op = "v or false", result = true +ECHO: v = "text", op = "[v]", result = undef +ECHO: v = "text", op = "v[0]", result = "t" +ECHO: v = "text", op = "v[4]", result = undef +ECHO: v = [], op = "not v", result = true +ECHO: v = [], op = "-v", result = [] +ECHO: v = [], op = "v *", result = [] +ECHO: v = [], op = "* v", result = [] +ECHO: v = [], op = "v /", result = [] +ECHO: v = [], op = "/ v", result = [] +ECHO: v = [], op = "v %", result = undef +ECHO: v = [], op = "% v", result = undef +ECHO: v = [], op = "v +", result = undef +ECHO: v = [], op = "+ v", result = undef +ECHO: v = [], op = "v -", result = undef +ECHO: v = [], op = "- v", result = undef +ECHO: v = [], op = "v and true", result = false +ECHO: v = [], op = "v and false", result = false +ECHO: v = [], op = "v or true", result = true +ECHO: v = [], op = "v or false", result = false +ECHO: v = [], op = "[v]", result = undef +ECHO: v = [], op = "v[0]", result = undef +ECHO: v = [], op = "v[4]", result = undef +ECHO: v = [0], op = "not v", result = false +ECHO: v = [0], op = "-v", result = [0] +ECHO: v = [0], op = "v *", result = [0] +ECHO: v = [0], op = "* v", result = [0] +ECHO: v = [0], op = "v /", result = [0] +ECHO: v = [0], op = "/ v", result = [inf] +ECHO: v = [0], op = "v %", result = undef +ECHO: v = [0], op = "% v", result = undef +ECHO: v = [0], op = "v +", result = undef +ECHO: v = [0], op = "+ v", result = undef +ECHO: v = [0], op = "v -", result = undef +ECHO: v = [0], op = "- v", result = undef +ECHO: v = [0], op = "v and true", result = true +ECHO: v = [0], op = "v and false", result = false +ECHO: v = [0], op = "v or true", result = true +ECHO: v = [0], op = "v or false", result = true +ECHO: v = [0], op = "[v]", result = undef +ECHO: v = [0], op = "v[0]", result = 0 +ECHO: v = [0], op = "v[4]", result = undef +ECHO: v = [1], op = "not v", result = false +ECHO: v = [1], op = "-v", result = [-1] +ECHO: v = [1], op = "v *", result = [3] +ECHO: v = [1], op = "* v", result = [2] +ECHO: v = [1], op = "v /", result = [0.33333333333] +ECHO: v = [1], op = "/ v", result = [2] +ECHO: v = [1], op = "v %", result = undef +ECHO: v = [1], op = "% v", result = undef +ECHO: v = [1], op = "v +", result = undef +ECHO: v = [1], op = "+ v", result = undef +ECHO: v = [1], op = "v -", result = undef +ECHO: v = [1], op = "- v", result = undef +ECHO: v = [1], op = "v and true", result = true +ECHO: v = [1], op = "v and false", result = false +ECHO: v = [1], op = "v or true", result = true +ECHO: v = [1], op = "v or false", result = true +ECHO: v = [1], op = "[v]", result = undef +ECHO: v = [1], op = "v[0]", result = 1 +ECHO: v = [1], op = "v[4]", result = undef +ECHO: v = [0 : 1 : 0], op = "not v", result = false +ECHO: v = [0 : 1 : 0], op = "-v", result = undef +ECHO: v = [0 : 1 : 0], op = "v *", result = undef +ECHO: v = [0 : 1 : 0], op = "* v", result = undef +ECHO: v = [0 : 1 : 0], op = "v /", result = undef +ECHO: v = [0 : 1 : 0], op = "/ v", result = undef +ECHO: v = [0 : 1 : 0], op = "v %", result = undef +ECHO: v = [0 : 1 : 0], op = "% v", result = undef +ECHO: v = [0 : 1 : 0], op = "v +", result = undef +ECHO: v = [0 : 1 : 0], op = "+ v", result = undef +ECHO: v = [0 : 1 : 0], op = "v -", result = undef +ECHO: v = [0 : 1 : 0], op = "- v", result = undef +ECHO: v = [0 : 1 : 0], op = "v and true", result = true +ECHO: v = [0 : 1 : 0], op = "v and false", result = false +ECHO: v = [0 : 1 : 0], op = "v or true", result = true +ECHO: v = [0 : 1 : 0], op = "v or false", result = true +ECHO: v = [0 : 1 : 0], op = "[v]", result = undef +ECHO: v = [0 : 1 : 0], op = "v[0]", result = 0 +ECHO: v = [0 : 1 : 0], op = "v[4]", result = undef +ECHO: v = [1 : 1 : 2], op = "not v", result = false +ECHO: v = [1 : 1 : 2], op = "-v", result = undef +ECHO: v = [1 : 1 : 2], op = "v *", result = undef +ECHO: v = [1 : 1 : 2], op = "* v", result = undef +ECHO: v = [1 : 1 : 2], op = "v /", result = undef +ECHO: v = [1 : 1 : 2], op = "/ v", result = undef +ECHO: v = [1 : 1 : 2], op = "v %", result = undef +ECHO: v = [1 : 1 : 2], op = "% v", result = undef +ECHO: v = [1 : 1 : 2], op = "v +", result = undef +ECHO: v = [1 : 1 : 2], op = "+ v", result = undef +ECHO: v = [1 : 1 : 2], op = "v -", result = undef +ECHO: v = [1 : 1 : 2], op = "- v", result = undef +ECHO: v = [1 : 1 : 2], op = "v and true", result = true +ECHO: v = [1 : 1 : 2], op = "v and false", result = false +ECHO: v = [1 : 1 : 2], op = "v or true", result = true +ECHO: v = [1 : 1 : 2], op = "v or false", result = true +ECHO: v = [1 : 1 : 2], op = "[v]", result = undef +ECHO: v = [1 : 1 : 2], op = "v[0]", result = 1 +ECHO: v = [1 : 1 : 2], op = "v[4]", result = undef