/*
**************************************************************
* C++ Mathematical Expression Toolkit Library *
* *
* Examples and Unit-Tests *
* Author: Arash Partow (1999-2025) *
* URL: https://www.partow.net/programming/exprtk/index.html *
* *
* Copyright notice: *
* Free use of the Mathematical Expression Toolkit Library is *
* permitted under the guidelines and in accordance with the *
* most current version of the MIT License. *
* https://www.opensource.org/licenses/MIT *
* SPDX-License-Identifier: MIT *
* *
**************************************************************
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "exprtk.hpp"
#ifdef exprtk_test_float32_type
typedef float numeric_type;
#else
typedef double numeric_type;
#endif
#if __cplusplus >= 201103L
#define exprtk_test_override override
#define exprtk_test_final final
#define exprtk_test_delete = delete
#else
#define exprtk_test_override
#define exprtk_test_final
#define exprtk_test_delete
#endif
typedef std::pair test_t;
static const test_t global_test_list[] =
{
// Note: Each of following tests must compile down
// to a single literal node.
test_t("0",0.0),
test_t("1",1.0),
test_t("2",2.0),
test_t("3",3.0),
test_t("4",4.0),
test_t("5",5.0),
test_t("6",6.0),
test_t("7",7.0),
test_t("8",8.0),
test_t("9",9.0),
test_t("12.12",12.12),
test_t("123.123",123.123),
test_t("1234.1234",1234.1234),
test_t("12345.12345",12345.12345),
test_t("123456.123456",123456.123456),
test_t("0.0",0.0),
test_t("1.0",1.0),
test_t("2.0",2.0),
test_t("3.0",3.0),
test_t("4.0",4.0),
test_t("5.0",5.0),
test_t("6.0",6.0),
test_t("7.0",7.0),
test_t("8.0",8.0),
test_t("9.0",9.0),
test_t("0.0",0.0),
test_t("1.1",1.1),
test_t("2.2",2.2),
test_t("3.3",3.3),
test_t("4.4",4.4),
test_t("5.5",5.5),
test_t("6.6",6.6),
test_t("7.7",7.7),
test_t("8.8",8.8),
test_t("9.9",9.9),
test_t("+0",0.0),
test_t("+1",1.0),
test_t("+2",2.0),
test_t("+3",3.0),
test_t("+4",4.0),
test_t("+5",5.0),
test_t("+6",6.0),
test_t("+7",7.0),
test_t("+8",8.0),
test_t("+9",9.0),
test_t("+0.0",0.0),
test_t("+1.0",1.0),
test_t("+2.0",2.0),
test_t("+3.0",3.0),
test_t("+4.0",4.0),
test_t("+5.0",5.0),
test_t("+6.0",6.0),
test_t("+7.0",7.0),
test_t("+8.0",8.0),
test_t("+9.0",9.0),
test_t("+0.0",0.0),
test_t("+1.1",1.1),
test_t("+2.2",2.2),
test_t("+3.3",3.3),
test_t("+4.4",4.4),
test_t("+5.5",5.5),
test_t("+6.6",6.6),
test_t("+7.7",7.7),
test_t("+8.8",8.8),
test_t("+9.9",9.9),
test_t("-0",-0.0),
test_t("-1",-1.0),
test_t("-2",-2.0),
test_t("-3",-3.0),
test_t("-4",-4.0),
test_t("-5",-5.0),
test_t("-6",-6.0),
test_t("-7",-7.0),
test_t("-8",-8.0),
test_t("-9",-9.0),
test_t("-0.0",-0.0),
test_t("-1.0",-1.0),
test_t("-2.0",-2.0),
test_t("-3.0",-3.0),
test_t("-4.0",-4.0),
test_t("-5.0",-5.0),
test_t("-6.0",-6.0),
test_t("-7.0",-7.0),
test_t("-8.0",-8.0),
test_t("-9.0",-9.0),
test_t("-0.0",-0.0),
test_t("-1.1",-1.1),
test_t("-2.2",-2.2),
test_t("-3.3",-3.3),
test_t("-4.4",-4.4),
test_t("-5.5",-5.5),
test_t("-6.6",-6.6),
test_t("-7.7",-7.7),
test_t("-8.8",-8.8),
test_t("-9.9",-9.9),
test_t("0.0e+0" ,+0.0e+0),
test_t("1.1e+1" ,+1.1e+1),
test_t("2.2e+2" ,+2.2e+2),
test_t("3.3e+3" ,+3.3e+3),
test_t("4.4e+4" ,+4.4e+4),
test_t("5.5e+5" ,+5.5e+5),
test_t("6.6e+6" ,+6.6e+6),
test_t("7.7e+7" ,+7.7e+7),
test_t("8.8e+8" ,+8.8e+8),
test_t("9.9e+9" ,+9.9e+9),
test_t("-0.0e+0",-0.0e+0),
test_t("-1.1e+1",-1.1e+1),
test_t("-2.2e+2",-2.2e+2),
test_t("-3.3e+3",-3.3e+3),
test_t("-4.4e+4",-4.4e+4),
test_t("-5.5e+5",-5.5e+5),
test_t("-6.6e+6",-6.6e+6),
test_t("-7.7e+7",-7.7e+7),
test_t("-8.8e+8",-8.8e+8),
test_t("-9.9e+9",-9.9e+9),
test_t("0.0E+0" ,+0.0E+0),
test_t("1.1E+1" ,+1.1E+1),
test_t("2.2E+2" ,+2.2E+2),
test_t("3.3E+3" ,+3.3E+3),
test_t("4.4E+4" ,+4.4E+4),
test_t("5.5E+5" ,+5.5E+5),
test_t("6.6E+6" ,+6.6E+6),
test_t("7.7E+7" ,+7.7E+7),
test_t("8.8E+8" ,+8.8E+8),
test_t("9.9E+9" ,+9.9E+9),
test_t("-0.0E+0",-0.0E+0),
test_t("-1.1E+1",-1.1E+1),
test_t("-2.2E+2",-2.2E+2),
test_t("-3.3E+3",-3.3E+3),
test_t("-4.4E+4",-4.4E+4),
test_t("-5.5E+5",-5.5E+5),
test_t("-6.6E+6",-6.6E+6),
test_t("-7.7E+7",-7.7E+7),
test_t("-8.8E+8",-8.8E+8),
test_t("-9.9E+9",-9.9E+9),
test_t("(0)",0.0),
test_t("(1)",1.0),
test_t("(2)",2.0),
test_t("(3)",3.0),
test_t("(4)",4.0),
test_t("(5)",5.0),
test_t("(6)",6.0),
test_t("(7)",7.0),
test_t("(8)",8.0),
test_t("(9)",9.0),
test_t("(0.0)",0.0),
test_t("(1.0)",1.0),
test_t("(2.0)",2.0),
test_t("(3.0)",3.0),
test_t("(4.0)",4.0),
test_t("(5.0)",5.0),
test_t("(6.0)",6.0),
test_t("(7.0)",7.0),
test_t("(8.0)",8.0),
test_t("(9.0)",9.0),
test_t("(0.0)",0.0),
test_t("(1.1)",1.1),
test_t("(2.2)",2.2),
test_t("(3.3)",3.3),
test_t("(4.4)",4.4),
test_t("(5.5)",5.5),
test_t("(6.6)",6.6),
test_t("(7.7)",7.7),
test_t("(8.8)",8.8),
test_t("(9.9)",9.9),
test_t("(+0)" ,0.0),
test_t("(+1)" ,1.0),
test_t("(+2)" ,2.0),
test_t("(+3)" ,3.0),
test_t("(+4)" ,4.0),
test_t("(+5)" ,5.0),
test_t("(+6)" ,6.0),
test_t("(+7)" ,7.0),
test_t("(+8)" ,8.0),
test_t("(+9)" ,9.0),
test_t("(+0.0)",0.0),
test_t("(+1.0)",1.0),
test_t("(+2.0)",2.0),
test_t("(+3.0)",3.0),
test_t("(+4.0)",4.0),
test_t("(+5.0)",5.0),
test_t("(+6.0)",6.0),
test_t("(+7.0)",7.0),
test_t("(+8.0)",8.0),
test_t("(+9.0)",9.0),
test_t("(+0.0)",0.0),
test_t("(+1.1)",1.1),
test_t("(+2.2)",2.2),
test_t("(+3.3)",3.3),
test_t("(+4.4)",4.4),
test_t("(+5.5)",5.5),
test_t("(+6.6)",6.6),
test_t("(+7.7)",7.7),
test_t("(+8.8)",8.8),
test_t("(+9.9)",9.9),
test_t("(-0)" ,-0.0),
test_t("(-1)" ,-1.0),
test_t("(-2)" ,-2.0),
test_t("(-3)" ,-3.0),
test_t("(-4)" ,-4.0),
test_t("(-5)" ,-5.0),
test_t("(-6)" ,-6.0),
test_t("(-7)" ,-7.0),
test_t("(-8)" ,-8.0),
test_t("(-9)" ,-9.0),
test_t("(-0.0)",-0.0),
test_t("(-1.0)",-1.0),
test_t("(-2.0)",-2.0),
test_t("(-3.0)",-3.0),
test_t("(-4.0)",-4.0),
test_t("(-5.0)",-5.0),
test_t("(-6.0)",-6.0),
test_t("(-7.0)",-7.0),
test_t("(-8.0)",-8.0),
test_t("(-9.0)",-9.0),
test_t("(-0.0)",-0.0),
test_t("(-1.1)",-1.1),
test_t("(-2.2)",-2.2),
test_t("(-3.3)",-3.3),
test_t("(-4.4)",-4.4),
test_t("(-5.5)",-5.5),
test_t("(-6.6)",-6.6),
test_t("(-7.7)",-7.7),
test_t("(-8.8)",-8.8),
test_t("(-9.9)",-9.9),
test_t("-(1.1)",-1.1),
test_t("-(1.1+2.2)",-3.3),
test_t("1234567890",1234567890),
test_t("123456789.0",123456789.0),
test_t("+1234567890",1234567890),
test_t("+123456789.0",123456789.0),
test_t("-1234567890",-1234567890),
test_t("-123456789.0",-123456789.0),
test_t("1234.567890",1234.567890),
test_t("-1234.567890",-1234.567890),
test_t("0+9",9.0),
test_t("1+8",9.0),
test_t("2+7",9.0),
test_t("3+6",9.0),
test_t("4+5",9.0),
test_t("5+4",9.0),
test_t("6+3",9.0),
test_t("7+2",9.0),
test_t("8+1",9.0),
test_t("9+0",9.0),
test_t(" 0 + 9 ",9.0),
test_t(" 1 + 8 ",9.0),
test_t(" 2 + 7 ",9.0),
test_t(" 3 + 6 ",9.0),
test_t(" 4 + 5 ",9.0),
test_t(" 5 + 4 ",9.0),
test_t(" 6 + 3 ",9.0),
test_t(" 7 + 2 ",9.0),
test_t(" 8 + 1 ",9.0),
test_t(" 9 + 0 ",9.0),
test_t("( 0 + 9 )",9.0),
test_t("( 1 + 8 )",9.0),
test_t("( 2 + 7 )",9.0),
test_t("( 3 + 6 )",9.0),
test_t("( 4 + 5 )",9.0),
test_t("( 5 + 4 )",9.0),
test_t("( 6 + 3 )",9.0),
test_t("( 7 + 2 )",9.0),
test_t("( 8 + 1 )",9.0),
test_t("( 9 + 0 )",9.0),
test_t("1E1+1",11.0),
test_t("1e1+1",11.0),
test_t("1E1-1", 9.0),
test_t("1e1-1", 9.0),
test_t("1E01+1",11.0),
test_t("1e01+1",11.0),
test_t("1E01-1", 9.0),
test_t("1e01-1", 9.0),
test_t("1+2",+3.0),
test_t("1-2",-1.0),
test_t("1*2",+2.0),
test_t("1/2",+0.5),
test_t("1.1+2.2", +3.3),
test_t("1.1-2.2", -1.1),
test_t("1.1*2.2",+2.42),
test_t("1.1/2.2", +0.5),
test_t("0-9",-9.0),
test_t("1-8",-7.0),
test_t("2-7",-5.0),
test_t("3-6",-3.0),
test_t("4-5",-1.0),
test_t("5-4",+1.0),
test_t("6-3",+3.0),
test_t("7-2",+5.0),
test_t("8-1",+7.0),
test_t("9-0",+9.0),
test_t("2.*3",+6.0),
test_t("2.*3.",+6.0),
test_t("2.+3",+5.0),
test_t("2.+3.",+5.0),
test_t("123.*456.",+56088.0),
test_t(" 0 - 9 ",-9.0),
test_t(" 1 - 8 ",-7.0),
test_t(" 2 - 7 ",-5.0),
test_t(" 3 - 6 ",-3.0),
test_t(" 4 - 5 ",-1.0),
test_t(" 5 - 4 ",+1.0),
test_t(" 6 - 3 ",+3.0),
test_t(" 7 - 2 ",+5.0),
test_t(" 8 - 1 ",+7.0),
test_t(" 9 - 0 ",+9.0),
test_t("( 0 - 9 )",-9.0),
test_t("( 1 - 8 )",-7.0),
test_t("( 2 - 7 )",-5.0),
test_t("( 3 - 6 )",-3.0),
test_t("( 4 - 5 )",-1.0),
test_t("( 5 - 4 )",+1.0),
test_t("( 6 - 3 )",+3.0),
test_t("( 7 - 2 )",+5.0),
test_t("( 8 - 1 )",+7.0),
test_t("( 9 - 0 )",+9.0),
test_t("1 - -1" , 2.0),
test_t("1 --1" , 2.0),
test_t("1-- 1" , 2.0),
test_t("1--1" , 2.0),
test_t("1 -- -1", 0.0),
test_t("1 + -1" , 0.0),
test_t("1 +-1" , 0.0),
test_t("1+- 1" , 0.0),
test_t("1+-1" , 0.0),
test_t("1 +- -1", 2.0),
test_t("1 + +1" , 2.0),
test_t("1 ++1" , 2.0),
test_t("1 - -1 + 1" , 3.0),
test_t("1 --1 + 1" , 3.0),
test_t("1-- 1 + 1" , 3.0),
test_t("1--1 + 1" , 3.0),
test_t("1 -- -1 + 1", 1.0),
test_t("1 + -1 + 1" , 1.0),
test_t("1 +-1 + 1" , 1.0),
test_t("1+- 1 + 1" , 1.0),
test_t("1+-1 + 1" , 1.0),
test_t("1 +- -1 + 1", 3.0),
test_t("1 + +1 + 1" , 3.0),
test_t("1 ++1 + 1" , 3.0),
test_t("1 - -1 - 1" , 1.0),
test_t("1 --1 - 1" , 1.0),
test_t("1-- 1 - 1" , 1.0),
test_t("1--1 - 1" , 1.0),
test_t("1 -- -1 - 1", -1.0),
test_t("1 + -1 - 1" , -1.0),
test_t("1 +-1 - 1" , -1.0),
test_t("1+- 1 - 1" , -1.0),
test_t("1+-1 - 1" , -1.0),
test_t("1 +- -1 - 1", 1.0),
test_t("1 + +1 - 1" , 1.0),
test_t("1 ++1 - 1" , 1.0),
test_t("-(1+2)",-3.0),
test_t("+(1+2)",+3.0),
test_t("+(1-2)",-1.0),
test_t("-(1-2)",+1.0),
test_t("(-3*-6)",+18.0),
test_t("(-6*-3)",+18.0),
test_t("-(-3*-6)",-18.0),
test_t("-(-6*-3)",-18.0),
test_t("1.1+2.2+3.3",+6.6),
test_t("+1.1+2.2+3.3",+6.6),
test_t("-1.1-2.2-3.3",-6.6),
test_t("1.1*2.2*3.3",+7.986),
test_t("+1.1*2.2*3.3",+7.986),
test_t("-1.1*-2.2*-3.3",-7.986),
test_t("1 + 1/2",+1.5),
test_t("1 + (1/2)",+1.5),
test_t("1.1 + 1.1/2.2",+1.6),
test_t("1.1 + (1.1/2.2)",+1.6),
test_t("2 * 1/2",+1.0),
test_t("2 * (1/2)",+1.0),
test_t("2.2 * 1.1/2.2",+1.1),
test_t("2.2 * (1.1/2.2)",+1.1),
test_t("1^2",1.0),
test_t("2^1",2.0),
test_t("2^3",8.0),
test_t("-2^3",-8.0),
test_t("-2^4",-16.0),
test_t("(-2)^3",-8.0),
test_t("(-2)^4",+16.0),
test_t("3^2^4",43046721.0),
test_t("1.1^2.2",1.23328630055466251099),
test_t("2.2^1.1",2.3804822576003541627),
test_t("2.2^3.3",13.48946876053338489127),
test_t("3.3^2.2^1.1",17.15193942371376191362),
test_t("+3.3^2.2^1.1",17.15193942371376191362),
test_t("3.3^+2.2^1.1",17.15193942371376191362),
test_t("3.3^2.2^+1.1",17.15193942371376191362),
test_t("3.3^2.2^-1.1",1.65127293793867959137),
test_t("+3.3^+2.2^-1.1",1.65127293793867959137),
test_t("1.1^(1.1 * 2.2)",1.25941916576299080582),
test_t("2.2^(1.1 * 3.3)",17.49823848953534759743),
test_t("3.3^(1.1 * 2.2)",17.98058156638874965269),
test_t("1.1^-2.2/1.1",0.73712884727743375853),
test_t("1.1^+2.2/1.1",1.121169364140602282717273261774),
test_t("1.1^2.2/+1.1",1.121169364140602282717273261774),
test_t("1.1^+2.2/+1.1",1.121169364140602282717273261774),
test_t("1.1^+2.2/-1.1",-1.121169364140602282717273261774),
test_t("1.1^2.2/-1.1",-1.121169364140602282717273261774),
test_t("1.1^+2.2/-1.1",-1.121169364140602282717273261774),
test_t("+1.1^-2.2/1.1",0.73712884727743375853),
test_t("+1.1^+2.2/1.1",1.121169364140602282717273261774),
test_t("+1.1^2.2/+1.1",1.121169364140602282717273261774),
test_t("+1.1^+2.2/+1.1",1.121169364140602282717273261774),
test_t("+1.1^+2.2/-1.1",-1.121169364140602282717273261774),
test_t("+1.1^2.2/-1.1",-1.121169364140602282717273261774),
test_t("+1.1^+2.2/-1.1",-1.121169364140602282717273261774),
test_t("equal(1.23^3,(1.23 * 1.23 * 1.23))",1.0),
test_t("equal(1.23^-3,1/(1.23 * 1.23 * 1.23))",1.0),
test_t("equal((2.1 + 1.23^3),(2.1 + [1.23 * 1.23 * 1.23]))",1.0),
test_t("equal((2.1 - 1.23^3),(2.1 - [1.23 * 1.23 * 1.23]))",1.0),
test_t("equal((2.1 * 1.23^3),(2.1 * [1.23 * 1.23 * 1.23]))",1.0),
test_t("equal((2.1 / 1.23^3),(2.1 / [1.23 * 1.23 * 1.23]))",1.0),
test_t("equal((1.23^3 + 2.1),({1.23 * 1.23 * 1.23} + 2.1))",1.0),
test_t("equal((1.23^3 - 2.1),({1.23 * 1.23 * 1.23} - 2.1))",1.0),
test_t("equal((1.23^3 * 2.1),({1.23 * 1.23 * 1.23} * 2.1))",1.0),
test_t("equal((1.23^3 / 2.1),({1.23 * 1.23 * 1.23} / 2.1))",1.0),
test_t("equal(1.0^(1.0/2.0),sqrt(1.0))",1.0),
test_t("equal(1.0^(1.0/2.0),root(1.0,2.0))",1.0),
test_t("equal(1.0^(1.0/3.0),root(1.0,3.0))",1.0),
test_t("equal(1.0^(1.0/4.0),root(1.0,4.0))",1.0),
test_t("equal(1.0^(1.0/5.0),root(1.0,5.0))",1.0),
test_t("equal(1.0^(1.0/6.0),root(1.0,6.0))",1.0),
test_t("equal(1.0^(1.0/7.0),root(1.0,7.0))",1.0),
test_t("equal(1.0^(1.0/8.0),root(1.0,8.0))",1.0),
test_t("equal(1.0^(1.0/9.0),root(1.0,9.0))",1.0),
test_t("equal(2.0^(1.0/2.0),sqrt(2.0))",1.0),
test_t("equal(2.0^(1.0/2.0),root(2.0,2.0))",1.0),
test_t("equal(3.0^(1.0/3.0),root(3.0,3.0))",1.0),
test_t("equal(4.0^(1.0/4.0),root(4.0,4.0))",1.0),
test_t("equal(5.0^(1.0/5.0),root(5.0,5.0))",1.0),
test_t("equal(6.0^(1.0/6.0),root(6.0,6.0))",1.0),
test_t("equal(7.0^(1.0/7.0),root(7.0,7.0))",1.0),
test_t("equal(8.0^(1.0/8.0),root(8.0,8.0))",1.0),
test_t("equal(9.0^(1.0/9.0),root(9.0,9.0))",1.0),
test_t("1 < 2", 1.0),
test_t("1 = 2.2", 0.0),
test_t("(1.0 + 0.1) >= (2.0 + 0.2)", 0.0),
test_t("1 2", 1.0),
test_t("1 != 2", 1.0),
test_t("1.1 2.2", 1.0),
test_t("1.1 != 2.2", 1.0),
test_t("(1.0 + 0.1) (2.0 + 0.2)", 1.0),
test_t("(1.0 + 0.1) != (2.0 + 0.2)", 1.0),
test_t("1 == 1", 1.0),
test_t("1.1 == 1.1", 1.0),
test_t("1 = 1", 1.0),
test_t("1.1 = 1.1", 1.0),
test_t("1 1", 0.0),
test_t("1 != 1", 0.0),
test_t("1.1 1.1", 0.0),
test_t("1.1 != 1.1", 0.0),
test_t("(1.0 + 0.1) (1.0 + 0.1)", 0.0),
test_t("(1.0 + 0.1) != (1.0 + 0.1)", 0.0),
test_t("equal(1.1,1.1)",1.0),
test_t("equal(1.1,2.2)",0.0),
test_t("not_equal(1.1,1.1)",0.0),
test_t("not_equal(1.1,2.2)",1.0),
test_t("1 and 1",1.0),
test_t("1 and 0",0.0),
test_t("0 and 1",0.0),
test_t("0 and 0",0.0),
test_t("1.0 and 1.0",1.0),
test_t("1.0 and 0.0",0.0),
test_t("0.0 and 1.0",0.0),
test_t("0.0 and 0.0",0.0),
test_t("(1 and 1)",1.0),
test_t("(1 and 0)",0.0),
test_t("(0 and 1)",0.0),
test_t("(0 and 0)",0.0),
test_t("(1.0 and 1.0)",1.0),
test_t("(1.0 and 0.0)",0.0),
test_t("(0.0 and 1.0)",0.0),
test_t("(0.0 and 0.0)",0.0),
test_t("1 or 1",1.0),
test_t("1 or 0",1.0),
test_t("0 or 1",1.0),
test_t("0 or 0",0.0),
test_t("1.0 or 1.0",1.0),
test_t("1.0 or 0.0",1.0),
test_t("0.0 or 1.0",1.0),
test_t("0.0 or 0.0",0.0),
test_t("(1 or 1)",1.0),
test_t("(1 or 0)",1.0),
test_t("(0 or 1)",1.0),
test_t("(0 or 0)",0.0),
test_t("(1.0 or 1.0)",1.0),
test_t("(1.0 or 0.0)",1.0),
test_t("(0.0 or 1.0)",1.0),
test_t("(0.0 or 0.0)",0.0),
test_t("1 nand 1",0.0),
test_t("1 nand 0",1.0),
test_t("0 nand 1",1.0),
test_t("0 nand 0",1.0),
test_t("1.0 nand 1.0",0.0),
test_t("1.0 nand 0.0",1.0),
test_t("0.0 nand 1.0",1.0),
test_t("0.0 nand 0.0",1.0),
test_t("(1 nand 1)",0.0),
test_t("(1 nand 0)",1.0),
test_t("(0 nand 1)",1.0),
test_t("(0 nand 0)",1.0),
test_t("(1.0 nand 1.0)",0.0),
test_t("(1.0 nand 0.0)",1.0),
test_t("(0.0 nand 1.0)",1.0),
test_t("(0.0 nand 0.0)",1.0),
test_t("1 nor 1",0.0),
test_t("1 nor 0",0.0),
test_t("0 nor 1",0.0),
test_t("0 nor 0",1.0),
test_t("1.0 nor 1.0",0.0),
test_t("1.0 nor 0.0",0.0),
test_t("0.0 nor 1.0",0.0),
test_t("0.0 nor 0.0",1.0),
test_t("(1 nor 1)",0.0),
test_t("(1 nor 0)",0.0),
test_t("(0 nor 1)",0.0),
test_t("(0 nor 0)",1.0),
test_t("(1.0 nor 1.0)",0.0),
test_t("(1.0 nor 0.0)",0.0),
test_t("(0.0 nor 1.0)",0.0),
test_t("(0.0 nor 0.0)",1.0),
test_t("0 xor 0",0.0),
test_t("0 xor 1",1.0),
test_t("1 xor 0",1.0),
test_t("1 xor 1",0.0),
test_t("0.0 xor 0.0",0.0),
test_t("0.0 xor 1.0",1.0),
test_t("1.0 xor 0.0",1.0),
test_t("1.0 xor 1.0",0.0),
test_t("(0 xor 0)",0.0),
test_t("(0 xor 1)",1.0),
test_t("(1 xor 0)",1.0),
test_t("(1 xor 1)",0.0),
test_t("(0.0 xor 0.0)",0.0),
test_t("(0.0 xor 1.0)",1.0),
test_t("(1.0 xor 0.0)",1.0),
test_t("(1.0 xor 1.0)",0.0),
test_t("1 & 1",1.0),
test_t("1 & 0",0.0),
test_t("0 & 1",0.0),
test_t("0 & 0",0.0),
test_t("1.0 & 1.0",1.0),
test_t("1.0 & 0.0",0.0),
test_t("0.0 & 1.0",0.0),
test_t("0.0 & 0.0",0.0),
test_t("(1 & 1)",1.0),
test_t("(1 & 0)",0.0),
test_t("(0 & 1)",0.0),
test_t("(0 & 0)",0.0),
test_t("(1.0 & 1.0)",1.0),
test_t("(1.0 & 0.0)",0.0),
test_t("(0.0 & 1.0)",0.0),
test_t("(0.0 & 0.0)",0.0),
test_t("1 | 1",1.0),
test_t("1 | 0",1.0),
test_t("0 | 1",1.0),
test_t("0 | 0",0.0),
test_t("1.0 | 1.0",1.0),
test_t("1.0 | 0.0",1.0),
test_t("0.0 | 1.0",1.0),
test_t("0.0 | 0.0",0.0),
test_t("(1 | 1)",1.0),
test_t("(1 | 0)",1.0),
test_t("(0 | 1)",1.0),
test_t("(0 | 0)",0.0),
test_t("(1.0 | 1.0)",1.0),
test_t("(1.0 | 0.0)",1.0),
test_t("(0.0 | 1.0)",1.0),
test_t("(0.0 | 0.0)",0.0),
test_t("(1 nand 1) == not(1 and 1)",1.0),
test_t("(1 nand 0) == not(1 and 0)",1.0),
test_t("(0 nand 1) == not(0 and 1)",1.0),
test_t("(0 nand 0) == not(0 and 0)",1.0),
test_t("(1 nor 1) == not(1 or 1)",1.0),
test_t("(1 nor 0) == not(1 or 0)",1.0),
test_t("(0 nor 1) == not(0 or 1)",1.0),
test_t("(0 nor 0) == not(0 or 0)",1.0),
test_t("(1.0 nand 1.0) == not(1.0 and 1.0)",1.0),
test_t("(1.0 nand 0.0) == not(1.0 and 0.0)",1.0),
test_t("(0.0 nand 1.0) == not(0.0 and 1.0)",1.0),
test_t("(0.0 nand 0.0) == not(0.0 and 0.0)",1.0),
test_t("(1.0 nor 1.0) == not(1.0 or 1.0)",1.0),
test_t("(1.0 nor 0.0) == not(1.0 or 0.0)",1.0),
test_t("(0.0 nor 1.0) == not(0.0 or 1.0)",1.0),
test_t("(0.0 nor 0.0) == not(0.0 or 0.0)",1.0),
test_t("(1 nand 1) == not(1 & 1)",1.0),
test_t("(1 nand 0) == not(1 & 0)",1.0),
test_t("(0 nand 1) == not(0 & 1)",1.0),
test_t("(0 nand 0) == not(0 & 0)",1.0),
test_t("(1 nor 1) == not(1 | 1)",1.0),
test_t("(1 nor 0) == not(1 | 0)",1.0),
test_t("(0 nor 1) == not(0 | 1)",1.0),
test_t("(0 nor 0) == not(0 | 0)",1.0),
test_t("(1.0 nand 1.0) == not(1.0 & 1.0)",1.0),
test_t("(1.0 nand 0.0) == not(1.0 & 0.0)",1.0),
test_t("(0.0 nand 1.0) == not(0.0 & 1.0)",1.0),
test_t("(0.0 nand 0.0) == not(0.0 & 0.0)",1.0),
test_t("(1.0 nor 1.0) == not(1.0 | 1.0)",1.0),
test_t("(1.0 nor 0.0) == not(1.0 | 0.0)",1.0),
test_t("(0.0 nor 1.0) == not(0.0 | 1.0)",1.0),
test_t("(0.0 nor 0.0) == not(0.0 | 0.0)",1.0),
test_t("mand(1,1)",1.0),
test_t("mand(1,0)",0.0),
test_t("mand(0,1)",0.0),
test_t("mand(0,0)",0.0),
test_t("mand(1.0,1.0)",1.0),
test_t("mand(1.0,0.0)",0.0),
test_t("mand(0.0,1.0)",0.0),
test_t("mand(0.0,0.0)",0.0),
test_t("mor(1,1)",1.0),
test_t("mor(1,0)",1.0),
test_t("mor(0,1)",1.0),
test_t("mor(0,0)",0.0),
test_t("mor(1.0,1.0)",1.0),
test_t("mor(1.0,0.0)",1.0),
test_t("mor(0.0,1.0)",1.0),
test_t("mor(0.0,0.0)",0.0),
test_t("(1 nand 1) == not(mand(1,1))",1.0),
test_t("(1 nand 0) == not(mand(1,0))",1.0),
test_t("(0 nand 1) == not(mand(0,1))",1.0),
test_t("(0 nand 0) == not(mand(0,0))",1.0),
test_t("(1 nor 1) == not(mor(1,1))",1.0),
test_t("(1 nor 0) == not(mor(1,0))",1.0),
test_t("(0 nor 1) == not(mor(0,1))",1.0),
test_t("(0 nor 0) == not(mor(0,0))",1.0),
test_t("(1.0 nand 1.0) == not(mand(1.0,1.0))",1.0),
test_t("(1.0 nand 0.0) == not(mand(1.0,0.0))",1.0),
test_t("(0.0 nand 1.0) == not(mand(0.0,1.0))",1.0),
test_t("(0.0 nand 0.0) == not(mand(0.0,0.0))",1.0),
test_t("(1.0 nor 1.0) == not(mor(1.0,1.0))",1.0),
test_t("(1.0 nor 0.0) == not(mor(1.0,0.0))",1.0),
test_t("(0.0 nor 1.0) == not(mor(0.0,1.0))",1.0),
test_t("(0.0 nor 0.0) == not(mor(0.0,0.0))",1.0),
test_t("abs(1)",1.0),
test_t("abs(-1)",1.0),
test_t("abs(1.0)",1.0),
test_t("abs(-1.0)",1.0),
test_t("min(1,2)",1.0),
test_t("min(1,2,3)",1.0),
test_t("min(1,2,3,4)",1.0),
test_t("min(1,2,3,4,5)",1.0),
test_t("min(1,2,3,4,5,6)",1.0),
test_t("min(1.1,2.2)",1.1),
test_t("min(1.1,2.2,3.3)",1.1),
test_t("min(1.1,2.2,3.3,4.4)",1.1),
test_t("min(1.1,2.2,3.3,4.4,5.5)",1.1),
test_t("min(1.1,2.2,3.3,4.4,5.5,6.6)",1.1),
test_t("min(min(1,2),min(3,4))",1.0),
test_t("max(1,2)",2.0),
test_t("max(1,2,3)",3.0),
test_t("max(1,2,3,4)",4.0),
test_t("max(1,2,3,4,5)",5.0),
test_t("max(1,2,3,4,5,6)",6.0),
test_t("max(1.1,2.2)",2.2),
test_t("max(1.1,2.2,3.3)",3.3),
test_t("max(1.1,2.2,3.3,4.4)",4.4),
test_t("max(1.1,2.2,3.3,4.4,5.5)",5.5),
test_t("max(1.1,2.2,3.3,4.4,5.5,6.6)",6.6),
test_t("max(max(1,2),max(3,4))",4.0),
test_t("avg(1,2)",1.5),
test_t("avg(1,2,3)",2.0),
test_t("avg(1,2,3,4)",2.5),
test_t("avg(1,2,3,4,5)",3.0),
test_t("avg(1.1,2.2)",1.65),
test_t("avg(1.1,2.2,3.3)",2.2),
test_t("avg(1.1,2.2,3.3,4.4)",2.75),
test_t("avg(1.1,2.2,3.3,4.4,5.5)",3.3),
test_t("avg(1.1,2.2,3.3,4.4,5.5,6.6)",3.85),
test_t("sum(1,2)",3.0),
test_t("sum(1,2,3)",6.0),
test_t("sum(1,2,3,4)",10),
test_t("sum(1,2,3,4,5)",15.0),
test_t("sum(1,2,3,4,5,6)",21),
test_t("sum(1.1,2.2)",3.3),
test_t("sum(1.1,2.2,3.3)",6.6),
test_t("sum(1.1,2.2,3.3,4.4)",11.0),
test_t("sum(1.1,2.2,3.3,4.4,5.5)",16.5),
test_t("sum(1.1,2.2,3.3,4.4,5.5,6.6)",23.1),
test_t("mul(1,2)",2.0),
test_t("mul(1,2,3)",6.0),
test_t("mul(1,2,3,4)",24.0),
test_t("mul(1,2,3,4,5)",120.0),
test_t("mul(1,2,3,4,5,6)",720.0),
test_t("mul(1.1,2.2)",2.42),
test_t("mul(1.1,2.2,3.3)",7.986),
test_t("mul(1.1,2.2,3.3,4.4)",35.1384),
test_t("mul(1.1,2.2,3.3,4.4,5.5)",193.2612),
test_t("mul(1.1,2.2,3.3,4.4,5.5,6.6)",1275.52392),
test_t("equal(sum(1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9),(1.1+2.2+3.3+4.4+5.5+6.6+7.7+8.8+9.9))",1.0),
test_t("equal(mul(1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9),(1.1*2.2*3.3*4.4*5.5*6.6*7.7*8.8*9.9))",1.0),
test_t("equal(min(1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9),1.1)",1.0),
test_t("equal(max(1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9),9.9)",1.0),
test_t("equal(avg(1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9),5.5)",1.0),
test_t("floor(1.0)",1.0),
test_t("floor(1.1)",1.0),
test_t("floor(-1.0)",-1.0),
test_t("floor(-1.1)",-2.0),
test_t("ceil(1.0)",1.0),
test_t("ceil(1.1)",2.0),
test_t("ceil(-1.0)",-1.0),
test_t("ceil(-1.1)",-1.0),
test_t("round(1.1)",1.0),
test_t("round(1.49)",1.0),
test_t("round(1.5)",2.0),
test_t("round(1.9)",2.0),
test_t("roundn(1/3,2)",0.33),
test_t("roundn(1/3,5)",0.33333),
test_t("roundn(2/3,2)",0.67),
test_t("roundn(2/3,5)",0.66667),
test_t("roundn(1.0/3.0,2.0)",0.33),
test_t("roundn(1.0/3.0,5.0)",0.33333),
test_t("roundn(2.0/3.0,2.0)",0.67),
test_t("roundn(2.0/3.0,5.0)",0.66667),
test_t("cos(0.0)",1.0),
test_t("sin(0.0)",0.0),
test_t("equal(sin(pi/4.0),cos(pi/4.0))",1.0),
test_t("equal(sin(pi/6.0),cos(pi/3.0))",1.0),
test_t("(sin(pi/4.0) - cos(pi/4.0)) = 2.2, 3.3, 4.4)",4.4),
test_t("if((1.0+1.1) >= (2.0+1.2), 3.3, 4.4)",4.4),
test_t("if(((1.0 + 2.0) == 3.0) and ((4.0 + 5.0) < 9.0),1,2)",2.0),
test_t("(3.0 - 1.0 - 2.0) == ((3.0 - 1.0) - 2.0)",1.0),
test_t("true == true",1.0),
test_t("false == false",1.0),
test_t("true != false",1.0),
test_t("false != true",1.0),
test_t("(1 < 2) == true",1.0),
test_t("(1 > 2) == false",1.0),
test_t("true == (1 < 2)",1.0),
test_t("false == (1 > 2)",1.0),
test_t("(1 > 2) != true",1.0),
test_t("(1 < 2) != false",1.0),
test_t("true != (1 > 2)",1.0),
test_t("false != (1 < 2)",1.0),
test_t("(true and true) == true",1.0),
test_t("(false and false) == false",1.0),
test_t("(true or true) == true",1.0),
test_t("(false or false) == false",1.0),
test_t("(true and false) == false",1.0),
test_t("(false and true) == false",1.0),
test_t("(true or false) == true",1.0),
test_t("(false or true) == true",1.0),
test_t("(true & true) == true",1.0),
test_t("(false & false) == false",1.0),
test_t("(true | true) == true",1.0),
test_t("(false | false) == false",1.0),
test_t("(true & false) == false",1.0),
test_t("(false & true) == false",1.0),
test_t("(true | false) == true",1.0),
test_t("(false | true) == true",1.0),
test_t("clamp(-1,1,+1)",1.0),
test_t("clamp(-1,-1.5,+1.0)",-1.0),
test_t("clamp(-1,+1.5,+1.0)",+1.0),
test_t("clamp(-1,-1.5,+1.0) + clamp(-1,+1.5,+1.0)",0.0),
test_t("inrange(-2,1,+2) == ((-2 2) 3; else if (1 < 2) {1+2; 4;} == 4",1.0),
test_t("if (1 > 2) 3; else if (1 > 2) {1+2; 4;} == null",1.0),
test_t("if (1 < 2) { 1+2; 3;} == 3",1.0),
test_t("if (1 > 2) { 1+2; 3;} == null",1.0),
test_t("(if (1 < 2) { 1+2; 3;} else 4;) == 3",1.0),
test_t("(if (1 > 2) { 1+2; 3;} else 4;) == 4",1.0),
test_t("if (1 < 2) { 1+2; 3;} else {1+2; 4;} == 3",1.0),
test_t("if (1 > 2) { 1+2; 3;} else {1+2; 4;} == 4",1.0),
test_t("(if (1 < 2) { 1+2; 3;} else if (1 < 2) 4;) == 3",1.0),
test_t("(if (1 > 2) { 1+2; 3;} else if (1 < 2) 4;) == 4",1.0),
test_t("(if (1 > 2) { 1+2; 3;} else if (1 > 2) 4;) == null",1.0),
test_t("if (1 < 2) { 1+2; 3;} else if (1 < 2) {1+2; 4;} == 3",1.0),
test_t("if (1 > 2) { 1+2; 3;} else if (1 < 2) {1+2; 4;} == 4",1.0),
test_t("if (1 > 2) { 1+2; 3;} else if (1 > 2) {1+2; 4;} == null",1.0)
};
static const std::size_t global_test_list_size = sizeof(global_test_list) / sizeof(test_t);
template
inline bool not_equal_impl(const T& t1,
const T& t2,
const T& epsilon = 0.0000000001/*std::numeric_limits::epsilon()*/)
{
if (t1 != t1) return true;
if (t2 != t2) return true;
T diff = std::abs(t1 - t2);
T eps_norm = (std::max(T(1),std::max(std::abs(t1),std::abs(t2))) * epsilon);
return diff > eps_norm;
}
template
inline bool not_equal(const T& t0, const T& t1,
const T& epsilon = T(0.0000000001))
{
return not_equal_impl(t0,t1,epsilon);
}
inline bool not_equal(const float& t0, const float& t1, const float& epsilon = 0.000001f)
{
return not_equal_impl(t0,t1,epsilon);
}
template
inline bool test_expression(const std::string& expression_string, const T& expected_result)
{
exprtk::symbol_table symbol_table;
symbol_table.add_constants();
exprtk::polynomial poly01;
exprtk::polynomial poly02;
exprtk::polynomial poly03;
exprtk::polynomial poly04;
exprtk::polynomial poly05;
exprtk::polynomial poly06;
exprtk::polynomial poly07;
exprtk::polynomial poly08;
exprtk::polynomial poly09;
exprtk::polynomial poly10;
exprtk::polynomial poly11;
exprtk::polynomial poly12;
symbol_table.add_function("poly01", poly01);
symbol_table.add_function("poly02", poly02);
symbol_table.add_function("poly03", poly03);
symbol_table.add_function("poly04", poly04);
symbol_table.add_function("poly05", poly05);
symbol_table.add_function("poly06", poly06);
symbol_table.add_function("poly07", poly07);
symbol_table.add_function("poly08", poly08);
symbol_table.add_function("poly09", poly09);
symbol_table.add_function("poly10", poly10);
symbol_table.add_function("poly11", poly11);
symbol_table.add_function("poly12", poly12);
exprtk::expression expression;
expression.register_symbol_table(symbol_table);
{
exprtk::parser parser;
if (!parser.compile(expression_string,expression))
{
printf("test_expression() - Error: %s Expression: %s\n",
parser.error().c_str(),
expression_string.c_str());
return false;
}
}
if (!exprtk::expression_helper::is_literal(expression))
{
printf("test_expression() - Error: Expression did not compile to a constant! Expression: %s\n",
expression_string.c_str());
return false;
}
const T result = expression.value();
if (not_equal(result,expected_result))
{
printf("test_expression() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
expression_string.c_str(),
static_cast(expected_result),
static_cast(result));
return false;
}
return true;
}
template
struct edge_cases {};
template
struct edge_cases
{
static inline std::vector test_cases()
{
std::vector cases;
cases.push_back(test_t(" 1.175494350822287508e-38", 1.175494350822287508e-38));
cases.push_back(test_t(" 3.402823466385288598e+38", 3.402823466385288598e+38));
cases.push_back(test_t("+1.175494350822287508e-38", +1.175494350822287508e-38));
cases.push_back(test_t("+3.402823466385288598e+38", +3.402823466385288598e+38));
cases.push_back(test_t("-1.175494350822287508e-38", -1.175494350822287508e-38));
cases.push_back(test_t("-3.402823466385288598e+38", -3.402823466385288598e+38));
return cases;
}
};
template
struct edge_cases
{
static inline std::vector test_cases()
{
std::vector cases;
cases.push_back(test_t(" 2.2250738585072013831e-308", 2.2250738585072013831e-308));
cases.push_back(test_t(" 1.7976931348623157081e+308", 1.7976931348623157081e+308));
cases.push_back(test_t("+2.2250738585072013831e-308", +2.2250738585072013831e-308));
cases.push_back(test_t("+1.7976931348623157081e+308", +1.7976931348623157081e+308));
cases.push_back(test_t("-2.2250738585072013831e-308", -2.2250738585072013831e-308));
cases.push_back(test_t("-1.7976931348623157081e+308", -1.7976931348623157081e+308));
return cases;
}
};
template
bool run_test00()
{
const std::size_t rounds = 10;
for (std::size_t r = 0; r < rounds; ++r)
{
bool result = true;
for (std::size_t i = 0; i < global_test_list_size; ++i)
{
if (!test_expression(global_test_list[i].first,T(global_test_list[i].second)))
{
result = false;
}
}
if (!result)
{
return false;
}
}
{
const std::vector tests = edge_cases::test_cases();
bool result = true;
for (std::size_t i = 0; i < tests.size(); ++i)
{
if (!test_expression(tests[i].first,T(tests[i].second)))
{
result = false;
}
}
if (!result)
{
return false;
}
}
return true;
}
template
struct test_xy
{
test_xy(const std::string& e, const T& v0, const T& v1, const T& r)
: expr(e)
, x(v0)
, y(v1)
, result(r)
{}
std::string expr;
T x;
T y;
T result;
};
template
struct test_xyzw
{
test_xyzw(const std::string& e, const T& v0, const T& v1, const T& v2, const T& v3, const T& r)
: expr(e)
, x(v0)
, y(v1)
, z(v2)
, w(v3)
, result(r)
{}
std::string expr;
T x;
T y;
T z;
T w;
T result;
};
template
bool run_test01()
{
{
static const test_xy test_list[] =
{
test_xy("x + y" ,T(2.2),T(3.3),T(5.5 )),
test_xy("x - y" ,T(3.3),T(2.2),T(1.1 )),
test_xy("x * y" ,T(3.3),T(2.2),T(7.26 )),
test_xy("x / y" ,T(3.3),T(2.2),T(1.5 )),
test_xy("(x + y) * (x + y)" ,T(2.2),T(3.3),T(30.25)),
test_xy("(x + y) / (x + y)" ,T(2.2),T(3.3),T(1.0 )),
test_xy("x + y > x and x + y > y" ,T(2.2),T(3.3),T(1.0)),
test_xy("1 + (x + y)" ,T(2.2),T(3.3),T(6.5 )),
test_xy("(x + y) - 1" ,T(2.2),T(3.3),T(4.5 )),
test_xy("1 + (x + y) * 2" ,T(2.2),T(3.3),T(12.0 )),
test_xy("2 * (x + y) - 1" ,T(2.2),T(3.3),T(10.0 )),
test_xy("y + (x + 1)" ,T(2.2),T(3.3),T(6.5 )),
test_xy("(x + 1) + y" ,T(2.2),T(3.3),T(6.5 )),
test_xy("2 * x" ,T(2.2),T(0.0),T(4.4)),
test_xy("x * 2" ,T(2.2),T(0.0),T(4.4)),
test_xy("1.1 + x" ,T(2.2),T(0.0),T(3.3)),
test_xy("x + 1.1" ,T(2.2),T(0.0),T(3.3)),
test_xy("x - -1 " ,T(1.0),T(0.0),T(2)),
test_xy("x --1 " ,T(1.0),T(0.0),T(2)),
test_xy("x-- 1 " ,T(1.0),T(0.0),T(2)),
test_xy("x--1 " ,T(1.0),T(0.0),T(2)),
test_xy("x -- -1" ,T(1.0),T(0.0),T(0)),
test_xy("x + -1 " ,T(1.0),T(0.0),T(0)),
test_xy("x +-1 " ,T(1.0),T(0.0),T(0)),
test_xy("x+- 1 " ,T(1.0),T(0.0),T(0)),
test_xy("x+-1 " ,T(1.0),T(0.0),T(0)),
test_xy("x +- -1" ,T(1.0),T(0.0),T(2)),
test_xy("x + +1 " ,T(1.0),T(0.0),T(2)),
test_xy("x ++1 " ,T(1.0),T(0.0),T(2)),
test_xy("1 - -x " ,T(1.0),T(0.0),T(2)),
test_xy("1 --x " ,T(1.0),T(0.0),T(2)),
test_xy("1-- x " ,T(1.0),T(0.0),T(2)),
test_xy("1--x " ,T(1.0),T(0.0),T(2)),
test_xy("1 -- -x" ,T(1.0),T(0.0),T(0)),
test_xy("1 + -x " ,T(1.0),T(0.0),T(0)),
test_xy("1 +-x " ,T(1.0),T(0.0),T(0)),
test_xy("1+- x " ,T(1.0),T(0.0),T(0)),
test_xy("1+-x " ,T(1.0),T(0.0),T(0)),
test_xy("1 +- -x" ,T(1.0),T(0.0),T(2)),
test_xy("1 + +x " ,T(1.0),T(0.0),T(2)),
test_xy("1 ++x " ,T(1.0),T(0.0),T(2)),
test_xy("(x - -1 + 1)" ,T(1.0),T(0.0),T(3)),
test_xy("(x --1 + 1)" ,T(1.0),T(0.0),T(3)),
test_xy("(x-- 1 + 1)" ,T(1.0),T(0.0),T(3)),
test_xy("(x--1 + 1)" ,T(1.0),T(0.0),T(3)),
test_xy("(x -- -1 + 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(x + -1 + 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(x +-1 + 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(x+- 1 + 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(x+-1 + 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(x +- -1 + 1)" ,T(1.0),T(0.0),T(3)),
test_xy("(x + +1 + 1)" ,T(1.0),T(0.0),T(3)),
test_xy("(x ++1 + 1)" ,T(1.0),T(0.0),T(3)),
test_xy("(1 - -x + 1)" ,T(1.0),T(0.0),T(3)),
test_xy("(1 --x + 1)" ,T(1.0),T(0.0),T(3)),
test_xy("(1-- x + 1)" ,T(1.0),T(0.0),T(3)),
test_xy("(1--x + 1)" ,T(1.0),T(0.0),T(3)),
test_xy("(1 -- -x + 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(1 + -x + 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(1 +-x + 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(1+- x + 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(1+-x + 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(1 +- -x + 1)" ,T(1.0),T(0.0),T(3)),
test_xy("(1 + +x + 1)" ,T(1.0),T(0.0),T(3)),
test_xy("(1 ++x + 1)" ,T(1.0),T(0.0),T(3)),
test_xy("(x - -1 - 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(x --1 - 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(x-- 1 - 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(x--1 - 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(x -- -1 - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy("(x + -1 - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy("(x +-1 - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy("(x+- 1 - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy("(x+-1 - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy("(x +- -1 - 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(x + +1 - 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(x ++1 - 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(1 - -x - 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(1 --x - 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(1-- x - 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(1--x - 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(1 -- -x - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy("(1 + -x - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy("(1 +-x - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy("(1+- x - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy("(1+-x - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy("(1 +- -x - 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(1 + +x - 1)" ,T(1.0),T(0.0),T(1)),
test_xy("(1 ++x - 1)" ,T(1.0),T(0.0),T(1)),
test_xy("x * 1 == x" ,T(2.0),T(3.0),T(1.0)),
test_xy("1 * x == x" ,T(2.0),T(3.0),T(1.0)),
test_xy("y * 1 == y" ,T(2.0),T(3.0),T(1.0)),
test_xy("1 * y == y" ,T(2.0),T(3.0),T(1.0)),
test_xy("x * 0 == 0" ,T(2.0),T(3.0),T(1.0)),
test_xy("0 * x == 0" ,T(2.0),T(3.0),T(1.0)),
test_xy("y * 0 == 0" ,T(2.0),T(3.0),T(1.0)),
test_xy("0 * y == 0" ,T(2.0),T(3.0),T(1.0)),
test_xy("x + 1 == 1 + x" ,T(2.0),T(3.0),T(1.0)),
test_xy("y + 1 == 1 + y" ,T(2.0),T(3.0),T(1.0)),
test_xy("x + y == y + x" ,T(2.0),T(3.0),T(1.0)),
test_xy("x * y == y * x" ,T(2.0),T(3.0),T(1.0)),
test_xy("x < y" ,T(2.0),T(3.0),T(1.0)),
test_xy("y > x" ,T(2.0),T(3.0),T(1.0)),
test_xy("x = x" ,T(2.0),T(3.0),T(1.0)),
test_xy("x + y > y" ,T(2.0),T(3.0),T(1.0)),
test_xy("x + y > x" ,T(2.0),T(3.0),T(1.0)),
test_xy("x * y > y" ,T(2.0),T(3.0),T(1.0)),
test_xy("x * y > x" ,T(2.0),T(3.0),T(1.0)),
test_xy("(x + y) > y" ,T(2.0),T(3.0),T(1.0)),
test_xy("(x + y) > x" ,T(2.0),T(3.0),T(1.0)),
test_xy("(x * y) > y" ,T(2.0),T(3.0),T(1.0)),
test_xy("(x * y) > x" ,T(2.0),T(3.0),T(1.0)),
test_xy("(2x + 3y) == (2*x + 3*y)" ,T(2.0),T(3.0),T(1.0)),
test_xy("2(x + y) == (2*x + 2*y)" ,T(2.0),T(3.0),T(1.0)),
test_xy(" (x + y)3 == (3*x + 3*y)" ,T(2.0),T(3.0),T(1.0)),
test_xy("2x + 3y == 2*x + 3*y" ,T(2.0),T(3.0),T(1.0)),
test_xy("2(x + y) == 2*x + 2*y" ,T(2.0),T(3.0),T(1.0)),
test_xy(" (x + y)3 == 3*x + 3*y" ,T(2.0),T(3.0),T(1.0)),
test_xy(" (x)y == (x*y)" ,T(2.0),T(3.0),T(1.0)),
test_xy(" x(y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
test_xy(" (x) y == (x*y)" ,T(2.0),T(3.0),T(1.0)),
test_xy(" x (y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
test_xy(" ((x) y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
test_xy(" (x (y)) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
test_xy(" (x)3 == (x*3)" ,T(2.0),T(3.0),T(1.0)),
test_xy(" x(3) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
test_xy(" (x) 3 == (x*3)" ,T(2.0),T(3.0),T(1.0)),
test_xy(" x (3) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
test_xy(" ((x) 3) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
test_xy(" (x (3)) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
test_xy(" (2)y == (2*y)" ,T(2.0),T(3.0),T(1.0)),
test_xy(" 2(y) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
test_xy(" (2) y == (2*y)" ,T(2.0),T(3.0),T(1.0)),
test_xy(" 2 (y) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
test_xy(" ((2) y) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
test_xy(" (2 (y)) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; (a)(3) == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; (A){3} == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; (a)[3] == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; {a}(3) == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; {a}{3} == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; {a}[3] == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; var b := 3; (a)(b) == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; var b := 3; (a){B} == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; var b := 3; (a)[b] == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; var b := 3; {a}(b) == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; var b := 3; {a}{b} == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; var b := 3; {a}[b] == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; (a)(a+1) == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; (a){a+1} == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; (a)[a+1] == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; {a}(a+1) == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; {a}{a+1} == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; {a}[a+1] == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; var b := 3; (b-1)(b) == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; var b := 3; (b-1){b} == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; var b := 3; (b-1)[b] == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; var b := 3; {b-1}(b) == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; var b := 3; {b-1}{b} == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("var a := 2; var b := 3; {b-1}[b] == 6" ,T(2.0),T(3.0),T(1.0)),
test_xy("equal(x^2.2^1.1,17.15193942371376191362)" ,T(3.3),T(0.0),T(1.0)),
test_xy("equal(3.3^x^1.1,17.15193942371376191362)" ,T(2.2),T(0.0),T(1.0)),
test_xy("equal(3.3^2.2^x,17.15193942371376191362)" ,T(1.1),T(0.0),T(1.0)),
test_xy("equal(x^2.2^y,17.15193942371376191362)" ,T(3.3),T(1.1),T(1.0)),
test_xy("equal(x^y^1.1,17.15193942371376191362)" ,T(3.3),T(2.2),T(1.0)),
test_xy("equal(3.3^x^y,17.15193942371376191362)" ,T(2.2),T(1.1),T(1.0)),
test_xy("equal(x+y^3/7,x+(y*y*y)/7)",T(2.0),T(3.0),T(1.0)),
test_xy("equal(1-x^3+y^2*7,1-(x*x*x)+(y*y)*7)",T(2.0),T(3.0),T(1.0)),
test_xy("equal( x^0,1)",T(12.34),T(0.0),T(1.0)),
test_xy("equal( x^1,x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal( x^2,x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal( x^3,x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal( x^4,x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal( x^5,x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal( x^6,x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal( x^7,x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal( x^8,x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal( x^9,x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^10,x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^11,x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^12,x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^13,x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^14,x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^15,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^16,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^17,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^18,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^19,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^20,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^21,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^22,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^23,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^24,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^25,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
test_xy("equal( y^0,1)",T(0.0),T(12.34),T(1.0)),
test_xy("equal( y^1,y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal( y^2,y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal( y^3,y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal( y^4,y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal( y^5,y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal( y^6,y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal( y^7,y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal( y^8,y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal( y^9,y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^10,y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^11,y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^12,y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^13,y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^14,y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^15,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^16,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^17,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^18,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^19,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^20,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^21,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^22,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^23,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^24,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^25,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
test_xy("equal( x^-0,1/1)",T(12.34),T(0.0),T(1.0)),
test_xy("equal( x^-1,1/(x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal( x^-2,1/(x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal( x^-3,1/(x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal( x^-4,1/(x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal( x^-5,1/(x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal( x^-6,1/(x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal( x^-7,1/(x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal( x^-8,1/(x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal( x^-9,1/(x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^-10,1/(x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^-11,1/(x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^-12,1/(x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^-13,1/(x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^-14,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^-15,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^-16,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^-17,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^-18,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^-19,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^-20,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^-21,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^-22,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^-23,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^-24,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal(x^-25,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
test_xy("equal( y^-0,1/1)",T(0.0),T(12.34),T(1.0)),
test_xy("equal( y^-1,1/(y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal( y^-2,1/(y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal( y^-3,1/(y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal( y^-4,1/(y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal( y^-5,1/(y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal( y^-6,1/(y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal( y^-7,1/(y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal( y^-8,1/(y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal( y^-9,1/(y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^-10,1/(y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^-11,1/(y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^-12,1/(y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^-13,1/(y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^-14,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^-15,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^-16,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^-17,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^-18,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^-19,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^-20,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^-21,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^-22,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^-23,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^-24,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("equal(y^-25,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
test_xy("(2 + x) + 7",T(3.0),T(0.0),T((2.0 + 3.0) + 7.0)),
test_xy("(2 + x) - 7",T(3.0),T(0.0),T((2.0 + 3.0) - 7.0)),
test_xy("(2 - x) + 7",T(3.0),T(0.0),T((2.0 - 3.0) + 7.0)),
test_xy("(2 - x) - 7",T(3.0),T(0.0),T((2.0 - 3.0) - 7.0)),
test_xy("(2 * x) * 7",T(3.0),T(0.0),T((2.0 * 3.0) * 7.0)),
test_xy("(2 * x) / 7",T(3.0),T(0.0),T((2.0 * 3.0) / 7.0)),
test_xy("(2 / x) * 7",T(3.0),T(0.0),T((2.0 / 3.0) * 7.0)),
test_xy("(2 / x) / 7",T(3.0),T(0.0),T((2.0 / 3.0) / 7.0)),
test_xy("2 + (x + 7)",T(3.0),T(0.0),T(2.0 + (3.0 + 7.0))),
test_xy("2 + (x - 7)",T(3.0),T(0.0),T(2.0 + (3.0 - 7.0))),
test_xy("2 - (x + 7)",T(3.0),T(0.0),T(2.0 - (3.0 + 7.0))),
test_xy("2 - (x - 7)",T(3.0),T(0.0),T(2.0 - (3.0 - 7.0))),
test_xy("2 * (x * 7)",T(3.0),T(0.0),T(2.0 * (3.0 * 7.0))),
test_xy("2 * (x / 7)",T(3.0),T(0.0),T(2.0 * (3.0 / 7.0))),
test_xy("2 / (x * 7)",T(3.0),T(0.0),T(2.0 / (3.0 * 7.0))),
test_xy("2 / (x / 7)",T(3.0),T(0.0),T(2.0 / (3.0 / 7.0))),
test_xy("2 + (7 + x)",T(3.0),T(0.0),T(2.0 + (7.0 + 3.0))),
test_xy("2 + (7 - x)",T(3.0),T(0.0),T(2.0 + (7.0 - 3.0))),
test_xy("2 - (7 + x)",T(3.0),T(0.0),T(2.0 - (7.0 + 3.0))),
test_xy("2 - (7 - x)",T(3.0),T(0.0),T(2.0 - (7.0 - 3.0))),
test_xy("2 * (7 * x)",T(3.0),T(0.0),T(2.0 * (7.0 * 3.0))),
test_xy("2 * (7 / x)",T(3.0),T(0.0),T(2.0 * (7.0 / 3.0))),
test_xy("2 / (7 * x)",T(3.0),T(0.0),T(2.0 / (7.0 * 3.0))),
test_xy("2 / (7 / x)",T(3.0),T(0.0),T(2.0 / (7.0 / 3.0))),
test_xy("(x + 2) + 7",T(3.0),T(0.0),T((3.0 + 2.0) + 7.0)),
test_xy("(x + 2) - 7",T(3.0),T(0.0),T((3.0 + 2.0) - 7.0)),
test_xy("(x - 2) + 7",T(3.0),T(0.0),T((3.0 - 2.0) + 7.0)),
test_xy("(x - 2) - 7",T(3.0),T(0.0),T((3.0 - 2.0) - 7.0)),
test_xy("(x * 2) * 7",T(3.0),T(0.0),T((3.0 * 2.0) * 7.0)),
test_xy("(x * 2) / 7",T(3.0),T(0.0),T((3.0 * 2.0) / 7.0)),
test_xy("(x / 2) * 7",T(3.0),T(0.0),T((3.0 / 2.0) * 7.0)),
test_xy("(x / 2) / 7",T(3.0),T(0.0),T((3.0 / 2.0) / 7.0)),
test_xy("((2 + x) + (3 + y))",T(7.0),T(9.0),T(((2.0 + 7.0) + (3.0 + 9.0)))),
test_xy("((2 + x) - (3 + y))",T(7.0),T(9.0),T(((2.0 + 7.0) - (3.0 + 9.0)))),
test_xy("((2 - x) - (3 - y))",T(7.0),T(9.0),T(((2.0 - 7.0) - (3.0 - 9.0)))),
test_xy("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
test_xy("((x + 2) + (y + 3))",T(7.0),T(9.0),T(((7.0 + 2.0) + (9.0 + 3.0)))),
test_xy("((x + 2) - (y + 3))",T(7.0),T(9.0),T(((7.0 + 2.0) - (9.0 + 3.0)))),
test_xy("((x - 2) - (y - 3))",T(7.0),T(9.0),T(((7.0 - 2.0) - (9.0 - 3.0)))),
test_xy("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
test_xy("((2 + x) + (y + 3))",T(7.0),T(9.0),T(((2.0 + 7.0) + (9.0 + 3.0)))),
test_xy("((2 + x) - (y + 3))",T(7.0),T(9.0),T(((2.0 + 7.0) - (9.0 + 3.0)))),
test_xy("((2 - x) - (y - 3))",T(7.0),T(9.0),T(((2.0 - 7.0) - (9.0 - 3.0)))),
test_xy("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
test_xy("((x + 2) + (3 + y))",T(7.0),T(9.0),T(((7.0 + 2.0) + (3.0 + 9.0)))),
test_xy("((x + 2) - (3 + y))",T(7.0),T(9.0),T(((7.0 + 2.0) - (3.0 + 9.0)))),
test_xy("((x - 2) - (3 - y))",T(7.0),T(9.0),T(((7.0 - 2.0) - (3.0 - 9.0)))),
test_xy("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
test_xy("((2 * x) / (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) / (3.0 * 9.0)))),
test_xy("((2 / x) * (3 / y))",T(7.0),T(9.0),T(((2.0 / 7.0) * (3.0 / 9.0)))),
test_xy("((2 * x) / (3 / y))",T(7.0),T(9.0),T(((2.0 * 7.0) / (3.0 / 9.0)))),
test_xy("((2 / x) / (3 * y))",T(7.0),T(9.0),T(((2.0 / 7.0) / (3.0 * 9.0)))),
test_xy("((x * 2) / (y * 3))",T(7.0),T(9.0),T(((7.0 * 2.0) / (9.0 * 3.0)))),
test_xy("((x / 2) * (y / 3))",T(7.0),T(9.0),T(((7.0 / 2.0) * (9.0 / 3.0)))),
test_xy("((x * 2) / (y / 3))",T(7.0),T(9.0),T(((7.0 * 2.0) / (9.0 / 3.0)))),
test_xy("((x / 2) / (y * 3))",T(7.0),T(9.0),T(((7.0 / 2.0) / (9.0 * 3.0)))),
test_xy("((2 * x) / (y * 3))",T(7.0),T(9.0),T(((2.0 * 7.0) / (9.0 * 3.0)))),
test_xy("((2 / x) * (y / 3))",T(7.0),T(9.0),T(((2.0 / 7.0) * (9.0 / 3.0)))),
test_xy("((2 * x) / (y / 3))",T(7.0),T(9.0),T(((2.0 * 7.0) / (9.0 / 3.0)))),
test_xy("((2 / x) / (y * 3))",T(7.0),T(9.0),T(((2.0 / 7.0) / (9.0 * 3.0)))),
test_xy("((x * 2) / (3 * y))",T(7.0),T(9.0),T(((7.0 * 2.0) / (3.0 * 9.0)))),
test_xy("((x / 2) * (3 / y))",T(7.0),T(9.0),T(((7.0 / 2.0) * (3.0 / 9.0)))),
test_xy("((x * 2) / (3 / y))",T(7.0),T(9.0),T(((7.0 * 2.0) / (3.0 / 9.0)))),
test_xy("((x / 2) / (3 * y))",T(7.0),T(9.0),T(((7.0 / 2.0) / (3.0 * 9.0)))),
test_xy("([(min(x,8) + y) + 3] - 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) + 3.0) - 4.0))),
test_xy("([(min(x,8) + y) + 3] + 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) + 3.0) + 4.0))),
test_xy("([(min(x,8) + y) + 3] * 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) + 3.0) * 4.0))),
test_xy("([(min(x,8) + y) + 3] / 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) + 3.0) / 4.0))),
test_xy("([(min(x,8) + y) - 3] - 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) - 3.0) - 4.0))),
test_xy("([(min(x,8) + y) - 3] + 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) - 3.0) + 4.0))),
test_xy("([(min(x,8) + y) - 3] * 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) - 3.0) * 4.0))),
test_xy("([(min(x,8) + y) - 3] / 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) - 3.0) / 4.0))),
test_xy("([(min(x,8) + y) * 3] - 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) * 3.0) - 4.0))),
test_xy("([(min(x,8) + y) * 3] + 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) * 3.0) + 4.0))),
test_xy("([(min(x,8) + y) * 3] * 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) * 3.0) * 4.0))),
test_xy("([(min(x,8) + y) * 3] / 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) * 3.0) / 4.0))),
test_xy("([(min(x,8) + y) / 3] - 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) / 3.0) - 4.0))),
test_xy("([(min(x,8) + y) / 3] + 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) / 3.0) + 4.0))),
test_xy("([(min(x,8) + y) / 3] * 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) / 3.0) * 4.0))),
test_xy("([(min(x,8) + y) / 3] / 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) / 3.0) / 4.0))),
test_xy("(4 - [3 + (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 - (3.0 + (std::min(7.0,8.0) + 9.0))))),
test_xy("(4 + [3 + (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 + (3.0 + (std::min(7.0,8.0) + 9.0))))),
test_xy("(4 * [3 + (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 * (3.0 + (std::min(7.0,8.0) + 9.0))))),
test_xy("(4 / [3 + (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 / (3.0 + (std::min(7.0,8.0) + 9.0))))),
test_xy("(4 - [3 - (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 - (3.0 - (std::min(7.0,8.0) + 9.0))))),
test_xy("(4 + [3 - (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 + (3.0 - (std::min(7.0,8.0) + 9.0))))),
test_xy("(4 * [3 - (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 * (3.0 - (std::min(7.0,8.0) + 9.0))))),
test_xy("(4 / [3 - (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 / (3.0 - (std::min(7.0,8.0) + 9.0))))),
test_xy("(4 - [3 * (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 - (3.0 * (std::min(7.0,8.0) + 9.0))))),
test_xy("(4 + [3 * (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 + (3.0 * (std::min(7.0,8.0) + 9.0))))),
test_xy("(4 * [3 * (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 * (3.0 * (std::min(7.0,8.0) + 9.0))))),
test_xy("(4 / [3 * (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 / (3.0 * (std::min(7.0,8.0) + 9.0))))),
test_xy("(4 - [3 / (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 - (3.0 / (std::min(7.0,8.0) + 9.0))))),
test_xy("(4 + [3 / (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 + (3.0 / (std::min(7.0,8.0) + 9.0))))),
test_xy("(4 * [3 / (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 * (3.0 / (std::min(7.0,8.0) + 9.0))))),
test_xy("(4 / [3 / (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 / (3.0 / (std::min(7.0,8.0) + 9.0))))),
test_xy("((2 * x) + (2 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) + (2.0 * 9.0)))),
test_xy("((2 * x) - (2 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) - (2.0 * 9.0)))),
test_xy("((2 * x) + (y * 2))",T(7.0),T(9.0),T(((2.0 * 7.0) + (9.0 * 2.0)))),
test_xy("((x * 2) - (y * 2))",T(7.0),T(9.0),T(((7.0 * 2.0) - (9.0 * 2.0)))),
test_xy("0 * (abs (x) + acos (y) + asin (x) + atan (y))",T(1.0),T(1.0),T(0.0)),
test_xy("0 * (ceil (x) + cos (y) + cosh (x) + exp (y))",T(1.0),T(1.0),T(0.0)),
test_xy("0 * (floor(x) + log (y) + log10(x) + round(y))",T(1.0),T(1.0),T(0.0)),
test_xy("0 * (sin (x) + sinh (y) + sqrt (x) + tan (y))",T(1.0),T(1.0),T(0.0)),
test_xy("0 * (sec (x) + csc (y) + tanh (x) + cot (y))",T(1.0),T(1.0),T(0.0)),
test_xy("0 * (erf (x) + erfc (y) + sgn (y) + frac (y))",T(1.0),T(1.0),T(0.0)),
test_xy("0 * (log1p(x) + expm1(y) + acosh(x) + asinh(y))",T(1.0),T(1.0),T(0.0)),
test_xy("0 * (deg2grad(x) + grad2deg(y) + rad2deg(x) + deg2rad(y))",T(1.0),T(1.0),T(0.0)),
test_xy("switch { case (x y) : 0; case (x y : x + y; case y > x : y - x; }",T(2.0),T(3.0),T(1.0)),
test_xy("[*]{ case x > y : x - y; case y < x : y + x; }",T(2.0),T(3.0),T(0.0)),
test_xy("0 ? x : y" ,T(1.0),T(2.0),T( 2.0)),
test_xy("1 ? x : y" ,T(1.0),T(2.0),T( 1.0)),
test_xy("x ? x : y" ,T(1.0),T(2.0),T( 1.0)),
test_xy("x ? x : y" ,T(0.0),T(2.0),T( 2.0)),
test_xy("(x + y < 4) ? 1 : 2" ,T(1.0),T(2.0),T( 1.0)),
test_xy("(x + y > 4) ? 1 : 2" ,T(1.0),T(2.0),T( 2.0)),
test_xy("x < y ? x + y : x - y" ,T(1.0),T(2.0),T( 3.0)),
test_xy("x > y ? x + y : x - y" ,T(1.0),T(2.0),T(-1.0)),
test_xy("(x + x < y ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
test_xy("(x + x < y + y ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
test_xy("(x > y + y ? 7 : 9) == 9" ,T(1.0),T(3.0),T( 1.0)),
test_xy("(x + x > y ? 7 : 9) == 9" ,T(1.0),T(3.0),T( 1.0)),
test_xy("(x + x > y + 3 ? 7 : 9) == 9" ,T(1.0),T(3.0),T( 1.0)),
test_xy("(x < (y + y) ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
test_xy("((x + x) < y ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
test_xy("((x + x) < (y + y) ? 7 : 9) == 7",T(1.0),T(3.0),T( 1.0)),
test_xy("(x += 2 ) == 3 " ,T(1),T(3),T(1)),
test_xy("(x += 2y) == 7 " ,T(1),T(3),T(1)),
test_xy("(x -= 2 ) == -1 " ,T(1),T(3),T(1)),
test_xy("(x -= 2y) == -5 " ,T(1),T(3),T(1)),
test_xy("(x *= 2 ) == 2 " ,T(1),T(3),T(1)),
test_xy("(x *= 2y) == 6 " ,T(1),T(3),T(1)),
test_xy("(x /= 2 ) == (1/2)" ,T(1),T(3),T(1)),
test_xy("(x /= 2y) == (1/6)" ,T(1),T(3),T(1)),
test_xy("for(var i := 0; (i < 10);) { i += 1; }; x;" ,T(1),T(20),T( 1)),
test_xy("for(var i := 0; (i < 10) and (i != y); i+=2) { x += i; }; x;" ,T(1),T(20),T(21)),
test_xy("for(var i := 0; (i < 10) and (i != y);) { x += i; i+=2; }; x;",T(1),T(20),T(21)),
test_xy("for(var i := 0; (i < y); i += 1) { if (i y) { z+2; z;} == null" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
test_xyzw("if (x < y) { z+2; z;} else w; == z" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
test_xyzw("if (x > y) { z+2; z;} else 1 + w; == (w + 1)" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
test_xyzw("if (x < y) { z+2; z;} else {1+2; w;} == z" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
test_xyzw("if (x > y) { z+2; z;} else {1+2; w;} == w" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
test_xyzw("(if (x < y) { z+2; z;} else if (x < y) w;) == z" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
test_xyzw("(if (x > y) { z+2; z;} else if (x < y) 1 + w;) == w + 1" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
test_xyzw("(if (x > y) { z+2; z;} else if (x > y) w;) == null" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
test_xyzw("if (x < y) { z+2; z;} else if (x < y) {w + 2; w;} == z" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
test_xyzw("if (x > y) { z+2; z;} else if (x < y) {w + 2; w;} == w" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
test_xyzw("if (x > y) { z+2; z;} else if (x > y) {w + 2; w;} == null",T(1.0),T(2.0),T(3.0),T(4.0),T(1.0))
};
static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_xyzw);
const std::size_t rounds = 60;
for (std::size_t r = 0; r < rounds; ++r)
{
bool loop_result = true;
for (std::size_t i = 0; i < test_list_size; ++i)
{
test_xyzw& test = const_cast(test_list[i]);
exprtk::symbol_table symbol_table;
symbol_table.add_variable("x",test.x);
symbol_table.add_variable("y",test.y);
symbol_table.add_variable("z",test.z);
symbol_table.add_variable("w",test.w);
exprtk::expression expression;
expression.register_symbol_table(symbol_table);
{
exprtk::parser parser;
if (!parser.compile(test.expr,expression))
{
printf("run_test01() - Error: %s Expression: %s\n",
parser.error().c_str(),
test.expr.c_str());
loop_result = false;
continue;
}
}
const T result = expression.value();
if (not_equal(result,test.result))
{
printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
test.expr.c_str(),
static_cast(test.result),
static_cast(result));
loop_result = false;
}
}
if (!loop_result)
{
return false;
}
}
}
{
const std::string expr_list[] =
{
"((v[1] + x) == (x + v[1]))",
"((v[0] += x) == x)",
"((v[0] += x + y) == (x + y))",
"((v[0] -= x) == -x)",
"((v[0] -= (x + y)) == -(x + y))",
"((v[1] + v[2]) == (v[3 - 1] + v[2 * 1/2]))",
"(v[v[1]] == v[1])",
"(v[1] += v[1]) == v[1 + 1]",
"((v[i[1]] + x) == (x + v[i[1]]))",
"((v[i[0]] += x) == x)",
"((v[i[0]] += x + y) == (x + y))",
"((v[i[0]] -= x) == -x)",
"((v[i[0]] -= (x + y)) == -(x + y))",
"((v[i[1]] + v[2]) == (v[i[3] - i[1]] + v[i[2] * 1/2]))",
"(v[v[i[1]]] == v[i[1]])",
"(v[i[1]] += v[i[1]]) == v[i[1] + 1]"
};
const std::size_t expr_list_size = sizeof(expr_list) / sizeof(std::string);
const std::size_t rounds = 60;
for (std::size_t r = 0; r < rounds; ++r)
{
bool loop_result = true;
for (std::size_t i = 0; i < expr_list_size; ++i)
{
T v[] = { T(0.0), T(1.1), T(2.2), T(3.3), T(4.4), T(5.5) };
T index[] = { T(0) , T(1) , T(2) , T(3) , T(4) , T(5) };
T x = T(6.6);
T y = T(7.7);
T z = T(8.8);
exprtk::symbol_table symbol_table;
symbol_table.add_variable("x",x);
symbol_table.add_variable("y",y);
symbol_table.add_variable("z",z);
symbol_table.add_vector ("v",v);
symbol_table.add_vector ("i",index);
exprtk::expression expression;
expression.register_symbol_table(symbol_table);
{
exprtk::parser parser;
if (!parser.compile(expr_list[i],expression))
{
printf("run_test01() - Error: %s Expression: %s\n",
parser.error().c_str(),
expr_list[i].c_str());
loop_result = false;
continue;
}
}
const T result = expression.value();
if (not_equal(result,T(1)))
{
printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
expr_list[i].c_str(),
static_cast(1.0),
static_cast(result));
loop_result = false;
}
}
if (!loop_result)
{
return false;
}
}
for (std::size_t r = 0; r < rounds; ++r)
{
bool loop_result = true;
for (std::size_t i = 0; i < expr_list_size; ++i)
{
T v_[] = { T(0.0), T(1.1), T(2.2), T(3.3), T(4.4), T(5.5) };
T index_[] = { T(0) , T(1) , T(2) , T(3) , T(4) , T(5) };
T x = T(6.6);
T y = T(7.7);
T z = T(8.8);
exprtk::vector_view v = exprtk::make_vector_view(v_ ,6);
exprtk::vector_view index = exprtk::make_vector_view(index_,6);
exprtk::symbol_table symbol_table;
symbol_table.add_variable("x",x);
symbol_table.add_variable("y",y);
symbol_table.add_variable("z",z);
symbol_table.add_vector ("v",v);
symbol_table.add_vector ("i",index);
exprtk::expression expression;
expression.register_symbol_table(symbol_table);
{
exprtk::parser parser;
if (!parser.compile(expr_list[i],expression))
{
printf("run_test01() - Error: %s Expression: %s\n",
parser.error().c_str(),
expr_list[i].c_str());
loop_result = false;
continue;
}
}
const T result = expression.value();
if (not_equal(result,T(1)))
{
printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
expr_list[i].c_str(),
static_cast(1.0),
static_cast(result));
loop_result = false;
}
}
if (!loop_result)
{
return false;
}
}
}
return true;
}
template
struct test_ab
{
test_ab(const std::string& e, const std::string& v0, const std::string& v1, const T& r)
: expr(e)
, a(v0)
, b(v1)
, c("ccc")
, result(r)
{}
std::string expr;
std::string a;
std::string b;
std::string c;
T result;
};
template
bool run_test02()
{
static const test_ab test_list[] =
{
test_ab("'aaa' == 'aaa'" ,"","",T(1.0)),
test_ab("'aaa' < 'bbb'" ,"","",T(1.0)),
test_ab("'aaa' 'aaa'" ,"","",T(1.0)),
test_ab("'bbb' >= 'aaa'" ,"","",T(1.0)),
test_ab("'aaa' != 'aaa'" ,"","",T(0.0)),
test_ab("'aaa' != 'bbb'" ,"","",T(1.0)),
test_ab("'aaa' + '123' == 'aaa123'" ,"","",T(1.0)),
test_ab("'aaa123' == 'aaa' + '123'" ,"","",T(1.0)),
test_ab("('aaa' + '123') == 'aaa123'" ,"","",T(1.0)),
test_ab("'aaa123' == ('aaa' + '123')" ,"","",T(1.0)),
test_ab("'aaa' in 'aaa123'" ,"","",T(1.0)),
test_ab("'123' in 'aaa123'" ,"","",T(1.0)),
test_ab("'a123b' like '*123*'" ,"","",T(1.0)),
test_ab("'a123b' like '*123?'" ,"","",T(1.0)),
test_ab("'1XYZ2' ilike '*xyz*'" ,"","",T(1.0)),
test_ab("'1XYZ2' ilike '*xyz?'" ,"","",T(1.0)),
test_ab("inrange('aaa','bbb','ccc')" ,"","",T(1.0)),
test_ab("a == b" ,"aaa","aaa",T(1.0)),
test_ab("a != b" ,"aaa","bbb",T(1.0)),
test_ab("a < b" ,"aaa","bbb",T(1.0)),
test_ab("a a" ,"aaa","bbb",T(1.0)),
test_ab("b >= a" ,"aaa","bbb",T(1.0)),
test_ab("a in b" ,"aaa","aaa123",T(1.0)),
test_ab("a in b" ,"123","aaa123",T(1.0)),
test_ab("a == 'aaa'" ,"aaa","aaa",T(1.0)),
test_ab("'aaa' == a" ,"aaa","aaa",T(1.0)),
test_ab("a != 'bbb'" ,"aaa","bbb",T(1.0)),
test_ab("'bbb' != a" ,"aaa","bbb",T(1.0)),
test_ab("a < 'bbb'" ,"aaa","bbb",T(1.0)),
test_ab("a a" ,"aaa","bbb",T(1.0)),
test_ab("'bbb' >= a" ,"aaa","bbb",T(1.0)),
test_ab("a in 'aaa123'" ,"aaa","aaa123",T(1.0)),
test_ab("a in 'aaa123'" ,"123","aaa123",T(1.0)),
test_ab("'aaa' in b" ,"aaa","aaa123",T(1.0)),
test_ab("'123' in b" ,"aaa","aaa123",T(1.0)),
test_ab("(a < b) or (a == b)" ,"aaa","bbb",T(1.0)),
test_ab("(a == b) or (a < b)" ,"aaa","bbb",T(1.0)),
test_ab("(b > a) or (b == a)" ,"aaa","bbb",T(1.0)),
test_ab("(b == a) or (b > a)" ,"aaa","bbb",T(1.0)),
test_ab("(a < b) and (b > a)" ,"aaa","bbb",T(1.0)),
test_ab("a like '*123*'" ,"a123b","",T(1.0)),
test_ab("a like '*123?'" ,"a123b","",T(1.0)),
test_ab("'a123b' like b" ,"a123b","*123*",T(1.0)),
test_ab("'a123b' like b" ,"a123b","*123?",T(1.0)),
test_ab("a ilike '*xyz*'" ,"1XYZ2","",T(1.0)),
test_ab("a ilike '*xyz?'" ,"1XYZ2","",T(1.0)),
test_ab("'1XYZ2' ilike b" ,"","*xyz*",T(1.0)),
test_ab("'1XYZ2' ilike b" ,"","*xyz?",T(1.0)),
test_ab("inrange(a,'bbb',c)" ,"aaa","bbb",T(1.0)),
test_ab("inrange('aaa',b,'ccc')" ,"aaa","bbb",T(1.0)),
test_ab("inrange(a,b,c)" ,"aaa","bbb",T(1.0)),
test_ab("inrange(a,b,'ccc')" ,"aaa","bbb",T(1.0)),
test_ab("inrange('aaa',b,c)" ,"aaa","bbb",T(1.0)),
test_ab("inrange('aaa',b,c)" ,"aaa","bbb",T(1.0)),
test_ab("(a < b ? a : b) == a" ,"aaa","bbb",T(1.0)),
test_ab("(a > b ? a : b) == b" ,"aaa","bbb",T(1.0)),
test_ab("(a == (a + '1') ? a : b) == b" ,"aaa","bbb",T(1.0)),
test_ab("((a + '2') != a ? a : b) == a" ,"aaa","bbb",T(1.0)),
test_ab("(a < b ? a + '1' : b) == 'aaa1'","aaa","bbb",T(1.0)),
test_ab("(a > b ? a : b + '2') == 'bbb2'","aaa","bbb",T(1.0)),
test_ab("b == (a == (a + '1') ? a : b)" ,"aaa","bbb",T(1.0)),
test_ab("a == (a != (a + '2') ? a : b)" ,"aaa","bbb",T(1.0)),
test_ab("'aaa1' == (a < b ? a + '1' : b)","aaa","bbb",T(1.0)),
test_ab("'bbb2' == (a > b ? a : b + '2')","aaa","bbb",T(1.0)),
test_ab("(a < b ? a[1:3] : b) == '23'" ,"1234","67890",T(1.0)),
test_ab("(a > b ? a : b[0:4]) == '6789'" ,"1234","67890",T(1.0)),
test_ab("~{var x := 'xxx'; var y := 'yyy';~{(x < y ? x : y) == x }}","","",T(1.0)),
test_ab("~{var x := 'xxx'; var y := 'yyy';~{(x > y ? x : y) == y }}","","",T(1.0)),
test_ab("~{var x := 'xxx'; var y := 'yyy';~{(x == (x + '1') ? x : y) == y }}","","",T(1.0)),
test_ab("~{var x := 'xxx'; var y := 'yyy';~{((x + '2') != x ? x : y) == x }}","","",T(1.0)),
test_ab("~{var x := 'xxx'; var y := 'yyy';~{(x < y ? x + '1' : y) == 'xxx1'}}","","",T(1.0)),
test_ab("~{var x := 'xxx'; var y := 'yyy';~{(x > y ? x : y + '2') == 'yyy2'}}","","",T(1.0)),
test_ab("~{var x := 'xxx'; var y := 'yyy';~{y == (x == (x + '1') ? x : y) }}","","",T(1.0)),
test_ab("~{var x := 'xxx'; var y := 'yyy';~{x == (x != (x + '2') ? x : y) }}","","",T(1.0)),
test_ab("~{var x := 'xxx'; var y := 'yyy';~{'xxx1' == (x < y ? x + '1' : y)}}","","",T(1.0)),
test_ab("~{var x := 'xxx'; var y := 'yyy';~{'yyy2' == (x > y ? x : y + '2')}}","","",T(1.0)),
test_ab("'01234567890123456789'[0:9] == '012345678' ","","",T(1.0)),
test_ab("'01234567890123456789'[0:9] == '012345678'[:] ","","",T(1.0)),
test_ab("'01234567890123456789'[0:9] == '012345678'[0:] ","","",T(1.0)),
test_ab("'01234567890123456789'[0:9] == '012345678'[:9] ","","",T(1.0)),
test_ab("'01234567890123456789'[:9] == '0123456789'[:9] ","","",T(1.0)),
test_ab("'01234567890123456789'[10:] == '0123456789'[:] ","","",T(1.0)),
test_ab("'01234567890123456789'[0:9] != '123456789' ","","",T(1.0)),
test_ab("'01234567890123456789'[0:9] != '123456789'[:] ","","",T(1.0)),
test_ab("'01234567890123456789'[0:9] != '123456789'[0:] ","","",T(1.0)),
test_ab("'01234567890123456789'[0:9] != '123456789'[:8] ","","",T(1.0)),
test_ab("'01234567890123456789'[:9] != '123456789'[:8] ","","",T(1.0)),
test_ab("'01234567890123456789'[10:] != '123456789'[:] ","","",T(1.0)),
test_ab("'01234567890123456789'[2*6:10+7] == '23456' ","","",T(1.0)),
test_ab("'0123456789' == '01234567890123456789'[0:10]","","",T(1.0)),
test_ab("'0123456789'[:] == '01234567890123456789'[0:10]","","",T(1.0)),
test_ab("'0123456789'[0:] == '01234567890123456789'[0:10]","","",T(1.0)),
test_ab("'0123456789'[:9] == '01234567890123456789'[0:9] ","","",T(1.0)),
test_ab("'0123456789'[:9] == '01234567890123456789'[:9] ","","",T(1.0)),
test_ab("'0123456789'[:] == '01234567890123456789'[10:] ","","",T(1.0)),
test_ab("'0123456789'[3:4] == '3'[:] ","","",T(1.0)),
test_ab("'0123456789'[3:4] == '3'[0:1] ","","",T(1.0)),
test_ab("'123456789' != '01234567890123456789'[0:9] ","","",T(1.0)),
test_ab("'123456789'[:] != '01234567890123456789'[0:9] ","","",T(1.0)),
test_ab("'123456789'[0:] != '01234567890123456789'[0:9] ","","",T(1.0)),
test_ab("'123456789'[:8] != '01234567890123456789'[0:9] ","","",T(1.0)),
test_ab("'123456789'[:8] != '01234567890123456789'[:9] ","","",T(1.0)),
test_ab("'123456789'[:] != '01234567890123456789'[10:] ","","",T(1.0)),
test_ab("'23456' == '01234567890123456789'[2*6:10+7] ","","",T(1.0)),
test_ab("'01234567890123456789'[r0: 7] == '23456' ","","",T(1.0)),
test_ab("'01234567890123456789'[2: r1 + 1] == '23456' ","","",T(1.0)),
test_ab("'01234567890123456789'[r0:3*2 + 1] == '23456' ","","",T(1.0)),
test_ab("'01234567890123456789'[1+1:r1 + 1] == '23456' ","","",T(1.0)),
test_ab("'01234567890123456789'[r0: ] == '234567890123456789' ","","",T(1.0)),
test_ab("'01234567890123456789'[: r1 + 1] == '0123456' ","","",T(1.0)),
test_ab("'01234567890123456789'[r0:r1 + 1] == '23456' ","","",T(1.0)),
test_ab("'01234567890123456789'[r0:r1+2+1] == '2345678' ","","",T(1.0)),
test_ab("'01234567890123456789'[r0+2:r1+1] == '456' ","","",T(1.0)),
test_ab("'01234567890123456789'[r1-r0:] == '4567890123456789' ","","",T(1.0)),
test_ab("'01234567890123456789'[:r1-r0 + 1] == '01234' ","","",T(1.0)),
test_ab("'23456' == '01234567890123456789'[r0: 7] ","","",T(1.0)),
test_ab("'23456' == '01234567890123456789'[2: r1+1] ","","",T(1.0)),
test_ab("'23456' == '01234567890123456789'[r0:3*2+1] ","","",T(1.0)),
test_ab("'23456' == '01234567890123456789'[1+1:r1+1] ","","",T(1.0)),
test_ab("'234567890123456789' == '01234567890123456789'[r0: ] ","","",T(1.0)),
test_ab("'0123456' == '01234567890123456789'[: 1+r1] ","","",T(1.0)),
test_ab("'23456' == '01234567890123456789'[r0:r1+1] ","","",T(1.0)),
test_ab("'2345678' == '01234567890123456789'[r0:r1+3] ","","",T(1.0)),
test_ab("'456' == '01234567890123456789'[r0+2:r1+1] ","","",T(1.0)),
test_ab("'4567890123456789' == '01234567890123456789'[r1-r0:] ","","",T(1.0)),
test_ab("'01234' == '01234567890123456789'[:r1-r0+1] ","","",T(1.0)),
test_ab("a[r0: 7] == '23456' ","01234567890123456789","",T(1.0)),
test_ab("a[2: r1+1] == '23456' ","01234567890123456789","",T(1.0)),
test_ab("a[r0:3*2+1] == '23456' ","01234567890123456789","",T(1.0)),
test_ab("a[1+1:r1+1] == '23456' ","01234567890123456789","",T(1.0)),
test_ab("a[r0: ] == '234567890123456789' ","01234567890123456789","",T(1.0)),
test_ab("a[:1+r1] == '0123456' ","01234567890123456789","",T(1.0)),
test_ab("a[r0:1+r1] == '23456' ","01234567890123456789","",T(1.0)),
test_ab("a[r0:r1+3] == '2345678' ","01234567890123456789","",T(1.0)),
test_ab("a[r0+2:r1+1]== '456' ","01234567890123456789","",T(1.0)),
test_ab("a[r1-r0:] == '4567890123456789' ","01234567890123456789","",T(1.0)),
test_ab("a[:r1-r0+1] == '01234' ","01234567890123456789","",T(1.0)),
test_ab("'23456' == a[r0: 7] ","01234567890123456789","",T(1.0)),
test_ab("'23456' == a[2: r1+1] ","01234567890123456789","",T(1.0)),
test_ab("'23456' == a[r0:3*2+1] ","01234567890123456789","",T(1.0)),
test_ab("'23456' == a[1+1:r1+1] ","01234567890123456789","",T(1.0)),
test_ab("'234567890123456789' == a[r0: ] ","01234567890123456789","",T(1.0)),
test_ab("'0123456' == a[:1+r1] ","01234567890123456789","",T(1.0)),
test_ab("'23456' == a[r0:r1+1] ","01234567890123456789","",T(1.0)),
test_ab("'2345678' == a[r0:r1+3] ","01234567890123456789","",T(1.0)),
test_ab("'456' == a[r0+2:r1+1] ","01234567890123456789","",T(1.0)),
test_ab("'4567890123456789' == a[r1-r0:] ","01234567890123456789","",T(1.0)),
test_ab("'01234' == a[:r1-r0+1] ","01234567890123456789","",T(1.0)),
test_ab("a[r0: 7] == b ","01234567890123456789","23456",T(1.0)),
test_ab("a[2: r1+1] == b ","01234567890123456789","23456",T(1.0)),
test_ab("a[r0:3*2+1] == b ","01234567890123456789","23456",T(1.0)),
test_ab("a[1+1:r1+1] == b ","01234567890123456789","23456",T(1.0)),
test_ab("a[r0: ] == b ","01234567890123456789","234567890123456789",T(1.0)),
test_ab("a[: r1+1] == b ","01234567890123456789","0123456",T(1.0)),
test_ab("a[r0:r1+1] == b ","01234567890123456789","23456",T(1.0)),
test_ab("a[r0:r1+3] == b ","01234567890123456789","2345678",T(1.0)),
test_ab("a[r0+2:r1+1] == b ","01234567890123456789","456",T(1.0)),
test_ab("a[r1-r0:] == b ","01234567890123456789","4567890123456789",T(1.0)),
test_ab("a[:r1-r0+1] == b ","01234567890123456789","01234",T(1.0)),
test_ab("b == a[r0: 7] ","01234567890123456789","23456",T(1.0)),
test_ab("b == a[2: r1+1] ","01234567890123456789","23456",T(1.0)),
test_ab("b == a[r0:3*2+1] ","01234567890123456789","23456",T(1.0)),
test_ab("b == a[1+1:r1+1] ","01234567890123456789","23456",T(1.0)),
test_ab("b == a[r0: ] ","01234567890123456789","234567890123456789",T(1.0)),
test_ab("b == a[: r1+1] ","01234567890123456789","0123456",T(1.0)),
test_ab("b == a[r0:r1+1] ","01234567890123456789","23456",T(1.0)),
test_ab("b == a[r0:r1+3] ","01234567890123456789","2345678",T(1.0)),
test_ab("b == a[r0+2:r1+1] ","01234567890123456789","456",T(1.0)),
test_ab("b == a[r1-r0:] ","01234567890123456789","4567890123456789",T(1.0)),
test_ab("b == a[:r1-r0+1] ","01234567890123456789","01234",T(1.0)),
test_ab("'01234567890123456789'[0:10] == a ","0123456789","",T(1.0)),
test_ab("'01234567890123456789'[0:10] == a[:] ","0123456789","",T(1.0)),
test_ab("'01234567890123456789'[0:10] == a[0:] ","0123456789","",T(1.0)),
test_ab("'01234567890123456789'[0:10] == a[:10] ","0123456789","",T(1.0)),
test_ab("'01234567890123456789'[:10] == a[:10] ","0123456789","",T(1.0)),
test_ab("'01234567890123456789'[10:] == a[:] ","0123456789","",T(1.0)),
test_ab("'01234567890123456789'[0:10] != a ","123456789" ,"",T(1.0)),
test_ab("'01234567890123456789'[0:10] != a[:] ","123456789" ,"",T(1.0)),
test_ab("'01234567890123456789'[0:10] != a[0:] ","123456789" ,"",T(1.0)),
test_ab("'01234567890123456789'[0:10] != a[:8] ","123456789" ,"",T(1.0)),
test_ab("'01234567890123456789'[:10] != a[:8] ","123456789" ,"",T(1.0)),
test_ab("'01234567890123456789'[10:] != a[:] ","123456789" ,"",T(1.0)),
test_ab("'01234567890123456789'[2*6:10+7] == a ","23456" ,"",T(1.0)),
test_ab("'23456' == a[:] ","23456" ,"",T(1.0)),
test_ab("a == '01234567890123456789'[0:10] ","0123456789","",T(1.0)),
test_ab("a[:] == '01234567890123456789'[0:10] ","0123456789","",T(1.0)),
test_ab("a[0:] == '01234567890123456789'[0:10] ","0123456789","",T(1.0)),
test_ab("a[:9] == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
test_ab("a[:9] == '01234567890123456789'[:9] ","0123456789","",T(1.0)),
test_ab("a[:] == '01234567890123456789'[10:] ","0123456789","",T(1.0)),
test_ab("a != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
test_ab("a[:] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
test_ab("a[0:] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
test_ab("a[:8] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
test_ab("a[:8] != '01234567890123456789'[:9] ","123456789" ,"",T(1.0)),
test_ab("a[:] != '01234567890123456789'[10:] ","123456789" ,"",T(1.0)),
test_ab("a == '01234567890123456789'[2*6:10+7] ","23456" ,"",T(1.0)),
test_ab("a[:] == '23456' ","23456" ,"",T(1.0)),
test_ab("a[0:10] == b ","01234567890123456789","0123456789",T(1.0)),
test_ab("a[0:10] == b[:] ","01234567890123456789","0123456789",T(1.0)),
test_ab("a[0:10] == b[0:] ","01234567890123456789","0123456789",T(1.0)),
test_ab("a[0:10] == b[:10] ","01234567890123456789","0123456789",T(1.0)),
test_ab("a[:9] == b[:9] ","01234567890123456789","0123456789",T(1.0)),
test_ab("a[10:] == b[:] ","01234567890123456789","0123456789",T(1.0)),
test_ab("a[0:9] != b ","01234567890123456789","123456789" ,T(1.0)),
test_ab("a[0:9] != b[:] ","01234567890123456789","123456789" ,T(1.0)),
test_ab("a[0:9] != b[0:] ","01234567890123456789","123456789" ,T(1.0)),
test_ab("a[0:9] != b[:8] ","01234567890123456789","123456789" ,T(1.0)),
test_ab("a[:9] != b[:8] ","01234567890123456789","123456789" ,T(1.0)),
test_ab("a[10:] != b[:] ","01234567890123456789","123456789" ,T(1.0)),
test_ab("a[2*6:10+7] == b ","01234567890123456789","23456" ,T(1.0)),
test_ab("b == a[0:10] ","01234567890123456789","0123456789",T(1.0)),
test_ab("b[:] == a[0:10] ","01234567890123456789","0123456789",T(1.0)),
test_ab("b[0:] == a[0:10] ","01234567890123456789","0123456789",T(1.0)),
test_ab("b[:9] == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
test_ab("b[:9] == a[:9] ","01234567890123456789","0123456789",T(1.0)),
test_ab("b[:] == a[10:] ","01234567890123456789","0123456789",T(1.0)),
test_ab("b != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
test_ab("b[:] != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
test_ab("b[0:] != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
test_ab("b[:8] != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
test_ab("b[:8] != a[:9] ","01234567890123456789","123456789" ,T(1.0)),
test_ab("b[:] != a[10:] ","01234567890123456789","123456789" ,T(1.0)),
test_ab("b == a[2*6:10+7] ","01234567890123456789","23456" ,T(1.0)),
test_ab("a[2:7] == b" ,"0123456789","23456" ,T(1.0)),
test_ab("a == b[2:7]" ,"23456","0123456789" ,T(1.0)),
test_ab("a[1+1:2*3+1] == b" ,"0123456789","23456" ,T(1.0)),
test_ab("a == b[4/2:sqrt(49)]","23456","0123456789" ,T(1.0)),
test_ab("a[0:7] == b" ,"0123456789","0123456" ,T(1.0)),
test_ab("a[:7] == b" ,"0123456789","0123456" ,T(1.0)),
test_ab("a[4/2-2:2+5] == b" ,"0123456789","0123456" ,T(1.0)),
test_ab("a[:12/2+1] == b" ,"0123456789","0123456" ,T(1.0)),
test_ab("a[0:] == b" ,"0123456","0123456" ,T(1.0)),
test_ab("a[:] == b" ,"0123456","0123456" ,T(1.0)),
test_ab("a == b[0:7]" ,"0123456","0123456789" ,T(1.0)),
test_ab("a == b[:7]" ,"0123456","0123456789" ,T(1.0)),
test_ab("a == b[4/2-2:2+5]" ,"0123456","0123456789" ,T(1.0)),
test_ab("a == b[:12/2+1]" ,"0123456","0123456789" ,T(1.0)),
test_ab("a == b[0:]" ,"0123456","0123456" ,T(1.0)),
test_ab("a == b[:]" ,"0123456","0123456" ,T(1.0)),
test_ab("a[:10] == b[0:10]" ,"0123456789","01234567890123456789",T(1.0)),
test_ab("a[0:10] == b[0:10]" ,"0123456789","01234567890123456789",T(1.0)),
test_ab("a[0:] == b[0:10]" ,"0123456789","01234567890123456789",T(1.0)),
test_ab("a[:] == b[0:10]" ,"0123456789","01234567890123456789",T(1.0)),
test_ab("a[:] == b[10:]" ,"0123456789","01234567890123456789",T(1.0)),
test_ab("'!@#$%^&*([{}])-=' != ')]}{[(*&^%$#@!'","","",T(1.0)),
test_ab("('!@#$%^&*([{}])-=') != (')]}{[(*&^%$#@!')","","",T(1.0)),
test_ab("{[('a')]} == [{('a')}]","","",T(1.0)),
test_ab("{[('!@#$%^&*([{}])-=')]} != [{(')]}{[(*&^%$#@!')}]","","",T(1.0)),
test_ab("'!@#$%^&*([{}])-=' == '!@#$%^&*([{}])-='","","",T(1.0)),
test_ab("('!@#$%^&*([{}])-=') == ('!@#$%^&*([{}])-=')","","",T(1.0)),
test_ab("{[('!@#$%^&*([{}])-=')]} == [{('!@#$%^&*([{}])-=')}]","","",T(1.0)),
test_ab("'1234\\\\abc\nxyz\r890\tqaz\\'567' == a","1234\\abc\nxyz\r890\tqaz'567","",T(1.0)),
test_ab("a == '1234\\\\abc\nxyz\r890\tqaz\\'567'","1234\\abc\nxyz\r890\tqaz'567","",T(1.0)),
test_ab("'123'[] == 3" ,"","" ,T(1.0)),
test_ab("3 == '123'[]" ,"","" ,T(1.0)),
test_ab("'123'[] + '1234'[] == 7" ,"","" ,T(1.0)),
test_ab("abs('123'[] - '1234'[]) == 1" ,"","" ,T(1.0)),
test_ab("'1234'[] == a[]" ,"1234","" ,T(1.0)),
test_ab("'123'[] + a[] == 7" ,"1234","" ,T(1.0)),
test_ab("abs(a[] - '12345'[]) == 1" ,"1234","" ,T(1.0)),
test_ab("'1234'[] + '12345'[] == a[] + b[]" ,"1234","12345" ,T(1.0)),
test_ab("abs('123'[] -'1234'[]) == abs(a[] - b[])" ,"1234","12345",T(1.0)),
test_ab("(a + b) == 'abc123' ","abc","123" ,T(1.0)),
test_ab("(a + '123') == 'abc123' ","abc","123" ,T(1.0)),
test_ab("('abc' + b) == 'abc123' ","abc","123" ,T(1.0)),
test_ab("(a + '1') == 'abc1' ","abc","123" ,T(1.0)),
test_ab("('a' + b) == 'a123' ","abc","123" ,T(1.0)),
test_ab("(a[2:8] + b) == 'cdefgh0123' ","abcdefghij","0123",T(1.0)),
test_ab("(a + b[2:8]) == 'abc234567' ","abc","0123456789" ,T(1.0)),
test_ab("(a[2:8] + '0123') == 'cdefgh0123' ","abcdefghij","0123",T(1.0)),
test_ab("('abc' + b[2:8]) == 'abc234567' ","abc","0123456789" ,T(1.0)),
test_ab("(a[2:3] + b[3:4]) == 'c3' ","abc","0123456789" ,T(1.0)),
test_ab("(a[3:] + b) == 'defghij0123' ","abcdefghij","0123",T(1.0)),
test_ab("('abc' + b[:8]) == 'abc01234567' ","abc","0123456789" ,T(1.0)),
test_ab("a + '123' == 'abc'+ b ","abc" , "123" , T(1.0)),
test_ab("a[0:3] + '123' == 'abc' + b[0:3] ","abcXYZ", "123XYZ", T(1.0)),
test_ab("a[ :3] + '123' == 'abc' + b[ :3] ","abcXYZ", "123XYZ", T(1.0)),
test_ab("a[3: ] + '123' == 'abc' + b[3: ]","XYZabc", "XYZ123", T(1.0)),
test_ab("a[3:a[]] + '123' == 'abc' + b[3:b[]]","XYZabc", "XYZ123", T(1.0)),
test_ab("(a[r0:r2] + b) == 'cdefg0123' ","abcdefghij","0123",T(1.0)),
test_ab("(a + b[r0:r2]) == 'abc23456' ","abc","0123456789" ,T(1.0)),
test_ab("(a[r0:r2] + '0123') == 'cdefg0123' ","abcdefghij","0123",T(1.0)),
test_ab("('abc' + b[r0:r2]) == 'abc23456' ","abc","0123456789" ,T(1.0)),
test_ab("(a[r0:r0+1] + b[r3:r3+1]) == 'c3' ","abc","0123456789" ,T(1.0)),
test_ab("(a[r3:] + b) == 'defghij0123' ","abcdefghij","0123",T(1.0)),
test_ab("('abc' + b[:r2]) == 'abc0123456' ","abc","0123456789" ,T(1.0)),
test_ab("a[0:r0] + '123' == 'ab'+ b[0:r0+1] ","abcXYZ", "123XYZ", T(1.0)),
test_ab("a[ :r0] + '123' == 'ab' +b[ :r0+1] ","abcXYZ", "123XYZ", T(1.0)),
test_ab("a[r3: ] + '123' == 'abc' + b[r3: ]","XYZabc", "XYZ123", T(1.0)),
test_ab("a[r3:a[]] + '123' == 'abc' + b[r3:b[]] ","XYZabc", "XYZ123", T(1.0)),
test_ab("(a[r0:r0+1] + b[r3:r0+2]) == 'c3' ","abc","0123456789" ,T(1.0)),
test_ab("(a[r0+1:] + b) == 'defghij0123' ","abcdefghij","0123",T(1.0)),
test_ab("a[r0+1: ] + '123' == 'abc' + b[r0+1: ]", "XYZabc" ,"XYZ123" ,T(1.0)),
test_ab("a[r0+1:a[]] + '123' == 'abc' + b[r0+1:b[]] ", "XYZabc" ,"XYZ123" ,T(1.0)),
test_ab("(a + b)[ :14] == 'abcdefghij0123' ", "abcdefghij", "0123456789" ,T(1.0)),
test_ab("(a + b)[ 6: ] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
test_ab("(a + b)[ 2:3r1] == 'cdefghij01234567' ", "abcdefghij", "0123456789" ,T(1.0)),
test_ab("(a[2:8] + b[2:8]) == 'cdefgh234567' ", "abcdefghij", "0123456789" ,T(1.0)),
test_ab("(a[2:8] + b[2:8])[3:9] == 'fgh234' ", "abcdefghij", "0123456789" ,T(1.0)),
test_ab("(a + b)[r0 - 2: r1 + r2 +1] == 'abcdefghij0123'", "abcdefghij", "0123456789" ,T(1.0)),
test_ab("(a + b)[r0*r3:] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
test_ab("(a + b)[3r0: ] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
test_ab("(a + b)[2r3: ] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
test_ab("(a + b)[2:3r1] == 'cdefghij01234567' ", "abcdefghij", "0123456789" ,T(1.0)),
test_ab("(a[r0:8] + b[r0:r2+1])== 'cdefgh234567' ", "abcdefghij", "0123456789" ,T(1.0)),
test_ab("(a[r1 / r3:8] + b[r0:r2+1])[3:r2 + 2] == 'fgh234'", "abcdefghij", "0123456789" ,T(1.0)),
test_ab("(a += b) == 'abc123' ", "abc","123" ,T(1.0)),
test_ab("(a += '123') == 'abc123' ", "abc","123" ,T(1.0)),
test_ab("(a += b[3:6]) == 'abc123' ", "abc","XXX123XXX" ,T(1.0)),
test_ab("(a += 'XXX123XXX'[3:6]) == 'abc123' ", "abc","123" ,T(1.0)),
test_ab("(a += b)[:] == 'abc123' ", "abc","123" ,T(1.0)),
test_ab("(a += '123')[:] == 'abc123' ", "abc","123" ,T(1.0)),
test_ab("(a += b[3:6])[:] == 'abc123' ", "abc","XXX123XXX" ,T(1.0)),
test_ab("(a += 'XXX123XXX'[3:6])[:] == 'abc123' ", "abc","123" ,T(1.0)),
test_ab("(a += b[r1/2:r1]) == 'abc123' ", "abc","XXX123XXX" ,T(1.0)),
test_ab("(a += 'XXX123XXX'[r0+1:r1]) == 'abc123' ", "abc","123" ,T(1.0)),
test_ab("(a += b)[] == 6 ", "abc","123" ,T(1.0)),
test_ab("(a += '123')[] == 6 ", "abc","123" ,T(1.0)),
test_ab("(a += b[3:6])[] == 6 ", "abc","XXX123XXX" ,T(1.0)),
test_ab("(a += b[r0+1:r1])[] == 6 ", "abc","XXX123XXX" ,T(1.0)),
test_ab("(a + b)[:][] == 6 ","abc","123" ,T(1.0)),
test_ab("(a + b)[:][:][] == 6 ","abc","123" ,T(1.0)),
test_ab("(a + b)[:][:][:][] == 6 ","abc","123" ,T(1.0)),
test_ab("(a + b)[:][:][:][:][] == 6 ","abc","123" ,T(1.0)),
test_ab("(a + b)[:][:][:][:][:][] == 6 ","abc","123" ,T(1.0)),
test_ab("(a + b)[:][:][:][:][:][:][] == 6 ","abc","123" ,T(1.0)),
test_ab("(a + b)[:][:][:][:][:][:][:][]== 6 ","abc","123" ,T(1.0)),
test_ab("(a + b)[0:6] == 'abc123' ","abc","123" ,T(1.0)),
test_ab("(a + b)[0:6][1:5] == 'bc12' ","abc","123" ,T(1.0)),
test_ab("(a + b)[0:6][1:5][1:3] == 'c1' ","abc","123" ,T(1.0)),
test_ab("(a + b)[0:6][1:5][1:3][0:1] == 'c' ","abc","123" ,T(1.0)),
test_ab("(a + b)[0:6][] == 6 ","abc","123" ,T(1.0)),
test_ab("(a + b)[0:6][1:5][] == 4 ","abc","123" ,T(1.0)),
test_ab("(a + b)[0:6][1:5][1:3][] == 2 ","abc","123" ,T(1.0)),
test_ab("(a + b)[0:6][1:5][1:4][0:1][] == 1 ","abc","123" ,T(1.0)),
test_ab("(a[ : ] := b); (a == 'ABCDEFGHIJ');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[0: ] := b); (a == 'ABCDEFGHIJ');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[ :10]:= b); (a == 'ABCDEFGHIJ');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[3: 8]:= b); (a == '012ABCDE89');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[2: 9]:= b); (a == '01ABCDEFG9');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[1:10]:= b); (a == '0ABCDEFGHI');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[0:1] := b); (a == 'A123456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[1:2] := b); (a == '0A23456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[2:3] := b); (a == '01A3456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[3:4] := b); (a == '012A456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[4:5] := b); (a == '0123A56789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[5:6] := b); (a == '01234A6789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[6:7] := b); (a == '012345A789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[7:8] := b); (a == '0123456A89');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[8:9] := b); (a == '01234567A9');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[9:10]:= b); (a == '012345678A');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[0:2] := b); (a == 'AB23456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[1:3] := b); (a == '0AB3456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[2:4] := b); (a == '01AB456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[3:5] := b); (a == '012AB56789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[4:6] := b); (a == '0123AB6789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[5:7] := b); (a == '01234AB789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[6:8] := b); (a == '012345AB89');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[7:9] := b); (a == '0123456AB9');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[8:10]:= b); (a == '01234567AB');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
test_ab("(a[ : ] := b[3:b[] - 2]); (a == 'ABCDEFGHIJ');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[0: ] := b[3:b[] - 2]); (a == 'ABCDEFGHIJ');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[ :10] := b[3:b[] - 2]); (a == 'ABCDEFGHIJ');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[3:8] := b[3:b[] - 2]); (a == '012ABCDE89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[2:9] := b[3:b[] - 2]); (a == '01ABCDEFG9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[1:10] := b[3:b[] - 2]); (a == '0ABCDEFGHI');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[0:1] := b[3:b[] - 2]); (a == 'A123456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[1:2] := b[3:b[] - 2]); (a == '0A23456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[2:3] := b[3:b[] - 2]); (a == '01A3456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[3:4] := b[3:b[] - 2]); (a == '012A456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[4:5] := b[3:b[] - 2]); (a == '0123A56789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[5:6] := b[3:b[] - 2]); (a == '01234A6789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[6:7] := b[3:b[] - 2]); (a == '012345A789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[7:8] := b[3:b[] - 2]); (a == '0123456A89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[8:9] := b[3:b[] - 2]); (a == '01234567A9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[9:10] := b[3:b[] - 2]); (a == '012345678A');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[0:2] := b[3:b[] - 2]); (a == 'AB23456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[1:3] := b[3:b[] - 2]); (a == '0AB3456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[2:4] := b[3:b[] - 2]); (a == '01AB456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[3:5] := b[3:b[] - 2]); (a == '012AB56789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[4:6] := b[3:b[] - 2]); (a == '0123AB6789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[5:7] := b[3:b[] - 2]); (a == '01234AB789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[6:8] := b[3:b[] - 2]); (a == '012345AB89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[7:9] := b[3:b[] - 2]); (a == '0123456AB9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[8:10] := b[3:b[] - 2]); (a == '01234567AB');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[0:10] := b); (a == 'A123456789');", "0123456789","A" ,T(1.0)),
test_ab("(a[0:10] := b); (a == 'AB23456789');", "0123456789","AB" ,T(1.0)),
test_ab("(a[0:10] := b); (a == 'ABC3456789');", "0123456789","ABC" ,T(1.0)),
test_ab("(a[0:10] := b); (a == 'ABCD456789');", "0123456789","ABCD" ,T(1.0)),
test_ab("(a[0:10] := b); (a == 'ABCDE56789');", "0123456789","ABCDE" ,T(1.0)),
test_ab("(a[0:10] := b); (a == 'ABCDEF6789');", "0123456789","ABCDEF" ,T(1.0)),
test_ab("(a[0:10] := b); (a == 'ABCDEFG789');", "0123456789","ABCDEFG" ,T(1.0)),
test_ab("(a[0:10] := b); (a == 'ABCDEFGH89');", "0123456789","ABCDEFGH" ,T(1.0)),
test_ab("(a[0:10] := b); (a == 'ABCDEFGHI9');", "0123456789","ABCDEFGHI" ,T(1.0)),
test_ab("(a[3:10] := b); (a == '012A456789');", "0123456789","A" ,T(1.0)),
test_ab("(a[3:10] := b); (a == '012AB56789');", "0123456789","AB" ,T(1.0)),
test_ab("(a[3:10] := b); (a == '012ABC6789');", "0123456789","ABC" ,T(1.0)),
test_ab("(a[3:10] := b); (a == '012ABCD789');", "0123456789","ABCD" ,T(1.0)),
test_ab("(a[3:10] := b); (a == '012ABCDE89');", "0123456789","ABCDE" ,T(1.0)),
test_ab("(a[3:10] := b); (a == '012ABCDEF9');", "0123456789","ABCDEF" ,T(1.0)),
test_ab("(a[r1 / r0:r2 + 1] := b[3:b[] - r3 + 1]); (a == '012ABCDE89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("(a[r0:r2 + 2] := b[r3:b[] - r3 + 1]); (a == '01ABCDEFG9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
test_ab("'\\0x30\\0x31\\0x32\\0x33\\0x34\\0x35\\0x36\\0x37\\0x38\\0x39' == '0123456789'","","",T(1.0)),
test_ab("'abc\\0x30\\0x31\\0x32\\0x33xyz' == 'abc0123xyz'" ,"","",T(1.0)),
test_ab("'\\0x30\\n\\0x31\\n\\0x32\\n\\0x33' == '0\\n1\\n2\\n3'" ,"","",T(1.0)),
test_ab("('\\0x30' + '') == '0'" ,"","",T(1.0)),
test_ab("('\\0x30' + '') == '0' + ''" ,"","",T(1.0)),
test_ab("('\\0x30' + '') == ''+ '0'" ,"","",T(1.0)),
test_ab("('' + '\\0x30') == '0'" ,"","",T(1.0)),
test_ab("('' + '\\0x30') == '0' + ''" ,"","",T(1.0)),
test_ab("('' + '\\0x30') == ''+ '0'" ,"","",T(1.0)),
test_ab("('' + '\\0x30' + '') == '0'" ,"","",T(1.0)),
test_ab("('' + '\\0x30' + '') == '0' + ''" ,"","",T(1.0)),
test_ab("('' + '\\0x30' + '') == ''+ '0'" ,"","",T(1.0)),
test_ab("('' + '\\0x30' + '') == '0'" ,"","",T(1.0)),
test_ab("('' + '\\0x30' + '') == '0' + ''" ,"","",T(1.0)),
test_ab("('' + '\\0x30' + '') == ''+ '0'" ,"","",T(1.0)),
test_ab("('\\0x30' + '\\0x31\\0x32') == '012'" ,"","",T(1.0)),
test_ab("('\\0x30' + '\\0x31\\0x32' + '\\0x33\\0x34\\0x35') == '012345'" ,"","",T(1.0)),
test_ab("'a\\'\\\\b' == a" ,"a'\\b","",T(1.0)),
test_ab("'a\\\\\\'b' == a" ,"a\\'b","",T(1.0)),
test_ab("'a\\'\\\\\\\\b' == a" ,"a'\\\\b","",T(1.0)),
test_ab("'a\\0x30\\'\\0x31\\\\\\0x32b' == a" ,"a0'1\\2b","",T(1.0)),
test_ab("var x := 3; x > 2 and 'abc' like '*bc'" ,"","",T(1.0)),
test_ab("var x := 3; x > 2 and 'abc' ilike '*Bc'" ,"","",T(1.0)),
test_ab("var x := 3; x > 2 and 'abc' in '123abc123'","","",T(1.0)),
test_ab("var x := 3; var s := 'abc'; x > 2 and s like '*bc'" ,"","",T(1.0)),
test_ab("var x := 3; var s := 'abc'; x > 2 and s ilike '*Bc'" ,"","",T(1.0)),
test_ab("var x := 3; var s := 'abc'; x > 2 and s in '123abc123'","","",T(1.0)),
test_ab("var x := 3; var s := 'abc'; var t := '*bc'; x > 2 and s like t" ,"","",T(1.0)),
test_ab("var x := 3; var s := 'abc'; var t := '*Bc'; x > 2 and s ilike t" ,"","",T(1.0)),
test_ab("var x := 3; var s := 'abc'; var t := '123abc123'; x > 2 and s in t","","",T(1.0)),
test_ab("var x := 3; x > 2 and a like '*bc'" ,"abc","",T(1.0)),
test_ab("var x := 3; x > 2 and a ilike '*Bc'" ,"abc","",T(1.0)),
test_ab("var x := 3; x > 2 and a in '123abc123'","abc","",T(1.0)),
test_ab("var x := 3; x > 2 and a like b ","abc","*bc",T(1.0)),
test_ab("var x := 3; x > 2 and a ilike b","abc","*Bc",T(1.0)),
test_ab("var x := 3; x > 2 and a in b ","abc","123abc123",T(1.0)),
test_ab("a[] > 2 and a like '*bc'" ,"abc","",T(1.0)),
test_ab("a[] > 2 and a ilike '*Bc'" ,"abc","",T(1.0)),
test_ab("a[] > 2 and a in '123abc123'","abc","",T(1.0)),
test_ab("a[] > 2 and a like b ","abc","*bc",T(1.0)),
test_ab("a[] > 2 and a ilike b","abc","*Bc",T(1.0)),
test_ab("a[] > 2 and a in b ","abc","123abc123",T(1.0)),
test_ab("a[0:1] := b[ :]; a == '0XXXX'", "XXXXX","01234567890",T(1.0)),
test_ab("a[0:2] := b[ :]; a == '01XXX'", "XXXXX","01234567890",T(1.0)),
test_ab("a[0:3] := b[ :]; a == '012XX'", "XXXXX","01234567890",T(1.0)),
test_ab("a[0:4] := b[ :]; a == '0123X'", "XXXXX","01234567890",T(1.0)),
test_ab("a[0:5] := b[ :]; a == '01234'", "XXXXX","01234567890",T(1.0)),
test_ab("a[0:1] := b[6:]; a == '6XXXX'", "XXXXX","01234567890",T(1.0)),
test_ab("a[0:2] := b[6:]; a == '67XXX'", "XXXXX","01234567890",T(1.0)),
test_ab("a[0:3] := b[6:]; a == '678XX'", "XXXXX","01234567890",T(1.0)),
test_ab("a[0:4] := b[6:]; a == '6789X'", "XXXXX","01234567890",T(1.0)),
test_ab("a[0:5] := b[6:]; a == '67890'", "XXXXX","01234567890",T(1.0)),
test_ab("a[0:1] b[ :]; (a == '0XXXX') and (b == 'X1234567890')", "XXXXX","01234567890",T(1.0)),
test_ab("a[0:2] b[ :]; (a == '01XXX') and (b == 'XX234567890')", "XXXXX","01234567890",T(1.0)),
test_ab("a[0:3] b[ :]; (a == '012XX') and (b == 'XXX34567890')", "XXXXX","01234567890",T(1.0)),
test_ab("a[0:4] b[ :]; (a == '0123X') and (b == 'XXXX4567890')", "XXXXX","01234567890",T(1.0)),
test_ab("a[0:5] b[ :]; (a == '01234') and (b == 'XXXXX567890')", "XXXXX","01234567890",T(1.0)),
test_ab("a[0:1] b[6:]; (a == '6XXXX') and (b == '012345X7890')", "XXXXX","01234567890",T(1.0)),
test_ab("a[0:2] b[6:]; (a == '67XXX') and (b == '012345XX890')", "XXXXX","01234567890",T(1.0)),
test_ab("a[0:3] b[6:]; (a == '678XX') and (b == '012345XXX90')", "XXXXX","01234567890",T(1.0)),
test_ab("a[0:4] b[6:]; (a == '6789X') and (b == '012345XXXX0')", "XXXXX","01234567890",T(1.0)),
test_ab("a[0:5] b[6:]; (a == '67890') and (b == '012345XXXXX')", "XXXXX","01234567890",T(1.0)),
test_ab("var i := 0; a[0:i+1] := b[:]; a == '0XXXX'", "XXXXX","01234567890",T(1.0)),
test_ab("var i := 0; a[0:i+2] := b[:]; a == '01XXX'", "XXXXX","01234567890",T(1.0)),
test_ab("var i := 0; a[0:i+3] := b[:]; a == '012XX'", "XXXXX","01234567890",T(1.0)),
test_ab("var i := 0; a[0:i+4] := b[:]; a == '0123X'", "XXXXX","01234567890",T(1.0)),
test_ab("var i := 0; a[0:i+5] := b[:]; a == '01234'", "XXXXX","01234567890",T(1.0)),
test_ab("var i := 0; a[0:i+1] b[:]; (a == '0XXXX') and (b == 'X1234567890')", "XXXXX","01234567890",T(1.0)),
test_ab("var i := 0; a[0:i+2] b[:]; (a == '01XXX') and (b == 'XX234567890')", "XXXXX","01234567890",T(1.0)),
test_ab("var i := 0; a[0:i+3] b[:]; (a == '012XX') and (b == 'XXX34567890')", "XXXXX","01234567890",T(1.0)),
test_ab("var i := 0; a[0:i+4] b[:]; (a == '0123X') and (b == 'XXXX4567890')", "XXXXX","01234567890",T(1.0)),
test_ab("var i := 0; a[0:i+5] b[:]; (a == '01234') and (b == 'XXXXX567890')", "XXXXX","01234567890",T(1.0)),
test_ab("var y:= 2; '01234567890'[y:] == a ", "234567890","" ,T(1.0)),
test_ab("var y:= 2; '01234567890'[y:][y:] == a ", "4567890" ,"" ,T(1.0)),
test_ab("var y:= 2; '01234567890'[y:][y:][y:] == a ", "67890" ,"" ,T(1.0)),
test_ab("var y:= 2; '01234567890'[y:][y:][y:][y:] == a ", "890" ,"" ,T(1.0)),
test_ab("var y:= 2; '01234567890'[y:][y:][y:][y:][y:] == a", "0" ,"" ,T(1.0)),
test_ab("var y:= 2; '0123456789'[y:] == a ", "23456789" ,"" ,T(1.0)),
test_ab("var y:= 2; '0123456789'[y:][y:] == a ", "456789" ,"" ,T(1.0)),
test_ab("var y:= 2; '0123456789'[y:][y:][y:] == a ", "6789" ,"" ,T(1.0)),
test_ab("var y:= 2; '0123456789'[y:][y:][y:][y:] == a ", "89" ,"" ,T(1.0)),
test_ab("var y:= 2; '0123456789'[y:][y:][y:][y:][y:] == a ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; s := ''; s == '' ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; s := ''; '' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; s := ''; s[:] == '' ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; s := ''; '' == s[:] ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; s := ''; s[:s[]] == '' ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; s := ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; s := '' + ''; s == '' ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; s := '' + ''; '' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; s += ''; s == '' ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; s += ''; '' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= '1'; s := '' + ''; s == '' ", "" ,"" ,T(1.0)),
test_ab("var s:= '1'; s := '' + ''; '' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= '12'; s := '' + ''; s == '' ", "" ,"" ,T(1.0)),
test_ab("var s:= '12'; s := '' + ''; '' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= '123'; s := '' + ''; s == '' ", "" ,"" ,T(1.0)),
test_ab("var s:= '123'; s := '' + ''; '' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= '1'; s += ''; s == '1' ", "" ,"" ,T(1.0)),
test_ab("var s:= '1'; s += ''; '1' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= '12'; s += ''; s == '12' ", "" ,"" ,T(1.0)),
test_ab("var s:= '12'; s += ''; '12' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= '123'; s += ''; s == '123' ", "" ,"" ,T(1.0)),
test_ab("var s:= '123'; s += ''; '123' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; s := '' + ''; s[:] == '' ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; s := '' + ''; '' == s[:] ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; s += ''; s[:] == '' ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; s += ''; '' == s[:] ", "" ,"" ,T(1.0)),
test_ab("var s:= '1'; s := '' + ''; s[:] == '' ", "" ,"" ,T(1.0)),
test_ab("var s:= '1'; s := '' + ''; '' == s[:] ", "" ,"" ,T(1.0)),
test_ab("var s:= '12'; s := '' + ''; s[:] == '' ", "" ,"" ,T(1.0)),
test_ab("var s:= '12'; s := '' + ''; '' == s[:] ", "" ,"" ,T(1.0)),
test_ab("var s:= '123'; s := '' + ''; s[:] == '' ", "" ,"" ,T(1.0)),
test_ab("var s:= '123'; s := '' + ''; '' == s[:] ", "" ,"" ,T(1.0)),
test_ab("var s:= '1'; s += ''; s[:] == '1' ", "" ,"" ,T(1.0)),
test_ab("var s:= '1'; s += ''; '1' == s[:] ", "" ,"" ,T(1.0)),
test_ab("var s:= '12'; s += ''; s[:] == '12' ", "" ,"" ,T(1.0)),
test_ab("var s:= '12'; s += ''; '12' == s[:] ", "" ,"" ,T(1.0)),
test_ab("var s:= '123'; s += ''; s[:] == '123' ", "" ,"" ,T(1.0)),
test_ab("var s:= '123'; s += ''; '123' == s[:] ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; s := '' + ''; s[:s[]] == '' ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; s := '' + ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; s += ''; s[:s[]] == '' ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; s += ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
test_ab("var s:= '1'; s := '' + ''; s[:s[]] == '' ", "" ,"" ,T(1.0)),
test_ab("var s:= '1'; s := '' + ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
test_ab("var s:= '12'; s := '' + ''; s[:s[]] == '' ", "" ,"" ,T(1.0)),
test_ab("var s:= '12'; s := '' + ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
test_ab("var s:= '123'; s := '' + ''; s[:s[]] == '' ", "" ,"" ,T(1.0)),
test_ab("var s:= '123'; s := '' + ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
test_ab("var s:= '1'; s += ''; s[:s[]] == '1' ", "" ,"" ,T(1.0)),
test_ab("var s:= '1'; s += ''; '1' == s[:s[]] ", "" ,"" ,T(1.0)),
test_ab("var s:= '12'; s += ''; s[:s[]] == '12' ", "" ,"" ,T(1.0)),
test_ab("var s:= '12'; s += ''; '12' == s[:s[]] ", "" ,"" ,T(1.0)),
test_ab("var s:= '123'; s += ''; s[:s[]] == '123' ", "" ,"" ,T(1.0)),
test_ab("var s:= '123'; s += ''; '123' == s[:s[]] ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 10; i+=1) {s += '';}; s == '' ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 10; i+=1) {s += '';}; '' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= '1'; for(var i:=0; i < 10; i+=1) {s += '';}; s == '1' ", "" ,"" ,T(1.0)),
test_ab("var s:= '1'; for(var i:=0; i < 10; i+=1) {s += '';}; '1' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= '12'; for(var i:=0; i < 10; i+=1) {s += '';}; s == '12' ", "" ,"" ,T(1.0)),
test_ab("var s:= '12'; for(var i:=0; i < 10; i+=1) {s += '';}; '12' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= '123'; for(var i:=0; i < 10; i+=1) {s += '';}; s == '123' ", "" ,"" ,T(1.0)),
test_ab("var s:= '123'; for(var i:=0; i < 10; i+=1) {s += '';}; '123' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 4; i+=1) {s += '1';}; s == '1111' ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 4; i+=1) {s += '1';}; '1111' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 2; i+=1) {s += '22';}; s == '2222' ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 2; i+=1) {s += '22';}; '2222' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 2; i+=1) {s += '333';}; s == '333333' ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 2; i+=1) {s += '333';}; '333333' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 4; i+=1) {s := s + '1';}; s == '1111' ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 4; i+=1) {s := s + '1';}; '1111' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 2; i+=1) {s := s + '22';}; s == '2222' ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 2; i+=1) {s := s + '22';}; '2222' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 2; i+=1) {s := s + '333';}; s == '333333'", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 2; i+=1) {s := s + '333';}; '333333' == s", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 4; i+=1) {s := '1' + s;}; s == '1111' ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 4; i+=1) {s := '1' + s;}; '1111' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 2; i+=1) {s := '22' + s;}; s == '2222' ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 2; i+=1) {s := '22' + s;}; '2222' == s ", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 2; i+=1) {s := '333' + s;}; s == '333333'", "" ,"" ,T(1.0)),
test_ab("var s:= ''; for(var i:=0; i < 2; i+=1) {s := '333' + s;}; '333333' == s", "" ,"" ,T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:1] := y[:]; x == '0XXXX'", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:2] := y[:]; x == '01XXX'", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:3] := y[:]; x == '012XX'", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:4] := y[:]; x == '0123X'", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:5] := y[:]; x == '01234'", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:1] := y[6:]; x == '6XXXX'", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:2] := y[6:]; x == '67XXX'", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:3] := y[6:]; x == '678XX'", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:4] := y[6:]; x == '6789X'", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:5] := y[6:]; x == '67890'", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:1] y[:]; (x == '0XXXX') and (y == 'X1234567890')", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:2] y[:]; (x == '01XXX') and (y == 'XX234567890')", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:3] y[:]; (x == '012XX') and (y == 'XXX34567890')", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:4] y[:]; (x == '0123X') and (y == 'XXXX4567890')", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:5] y[:]; (x == '01234') and (y == 'XXXXX567890')", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:1] y[6:]; (x == '6XXXX') and (y == '012345X7890')", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:2] y[6:]; (x == '67XXX') and (y == '012345XX890')", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:3] y[6:]; (x == '678XX') and (y == '012345XXX90')", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:4] y[6:]; (x == '6789X') and (y == '012345XXXX0')", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; x[0:5] y[6:]; (x == '67890') and (y == '012345XXXXX')", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+1] := y[:]; x == '0XXXX'", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+2] := y[:]; x == '01XXX'", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+3] := y[:]; x == '012XX'", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+4] := y[:]; x == '0123X'", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+5] := y[:]; x == '01234'", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+1] y[:]; (x == '0XXXX') and (y == 'X1234567890')", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+2] y[:]; (x == '01XXX') and (y == 'XX234567890')", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+3] y[:]; (x == '012XX') and (y == 'XXX34567890')", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+4] y[:]; (x == '0123X') and (y == 'XXXX4567890')", "","",T(1.0)),
test_ab("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+5] y[:]; (x == '01234') and (y == 'XXXXX567890')", "","",T(1.0)),
test_ab("var v[4] := {1,2,3,4}; for (var i := 0; i < v[]; i += 1) { v[i] += 10; v[i] == 0 }; sum(v) == (1 + 2 + 3 + 4) + (v[] * 10)", "","",T(1.0)),
test_ab("var v[4] := {1,2,3,4}; for (var i := 0; i < v[]; i += 1) { v[i] -= 10; v[i] == 0 }; sum(v) == (1 + 2 + 3 + 4) - (v[] * 10)", "","",T(1.0)),
test_ab("var v[4] := {1,2,3,4}; for (var i := 0; i < v[]; i += 1) { v[i] *= 10; v[i] == 0 }; sum(v) == (1 + 2 + 3 + 4) * 10", "","",T(1.0)),
test_ab("var v[4] := {1,2,3,4}; for (var i := 0; i < v[]; i += 1) { v[i] /= 10; v[i] == 0 }; sum(v) == (1 + 2 + 3 + 4) / 10", "","",T(1.0)),
test_ab("a like b", "abcd", "abcd*", T(1.0)),
test_ab("a like b", "abcd", "abcd" , T(1.0)),
test_ab("a like b", "abcd", "abc*" , T(1.0)),
test_ab("a like b", "abcd", "*bcd" , T(1.0)),
test_ab("a like b", "abcd", "abc?" , T(1.0)),
test_ab("a like b", "abcd", "?bcd" , T(1.0)),
test_ab("a like b", "abcd", "ab?d" , T(1.0)),
test_ab("a like b", "abcd", "ab*d" , T(1.0)),
test_ab("a like b", "abcd", "a?cd" , T(1.0)),
test_ab("a like b", "abcd", "a*cd" , T(1.0)),
test_ab("a like b", "abcd", "a??d" , T(1.0)),
test_ab("a like b", "abcd", "a*?d" , T(1.0)),
test_ab("a like b", "abcd", "*bc*" , T(1.0)),
test_ab("a like b", "abcd", "?bc?" , T(1.0)),
test_ab("a like b", "abcd", "????" , T(1.0)),
test_ab("a like b", "abcd", "a???" , T(1.0)),
test_ab("a like b", "abcd", "ab??" , T(1.0)),
test_ab("a like b", "abcd", "abc?" , T(1.0)),
test_ab("a like b", "abcd", "???d" , T(1.0)),
test_ab("a like b", "abcd", "??cd" , T(1.0)),
test_ab("a like b", "abcd", "?bcd" , T(1.0)),
test_ab("a like b", "abcd", "?b?d" , T(1.0)),
test_ab("a like b", "abcd", "a?c?" , T(1.0)),
test_ab("a like b", "abcd", "a??d" , T(1.0)),
test_ab("a like b", "abcd", "?bc?" , T(1.0)),
test_ab("a like b", "abcd", "ab**" , T(1.0)),
test_ab("a like b", "abcd", "ab*?" , T(1.0)),
test_ab("a like b", "abcd", "a***" , T(1.0)),
test_ab("a like b", "abcd", "**cd" , T(1.0)),
test_ab("a like b", "abcd", "*?cd" , T(1.0)),
test_ab("a like b", "abcd", "***d" , T(1.0)),
test_ab("a like b", "abcd", "*bc*" , T(1.0)),
test_ab("a like b", "abcd", "*bc?" , T(1.0)),
test_ab("a like b", "abcd", "*b??" , T(1.0)),
test_ab("a like b", "abcd", "?bc*" , T(1.0)),
test_ab("a like b", "abcd", "??c*" , T(1.0)),
test_ab("a like b", "abcd", "*b?*" , T(1.0)),
test_ab("a like b", "ab" , "a*" , T(1.0)),
test_ab("a like b", "ab" , "a?" , T(1.0)),
test_ab("a ilike b", "aBcD", "abcd*", T(1.0)),
test_ab("a ilike b", "aBcD", "abcd" , T(1.0)),
test_ab("a ilike b", "aBcD", "abc*" , T(1.0)),
test_ab("a ilike b", "aBcD", "*bcd" , T(1.0)),
test_ab("a ilike b", "aBcD", "abc?" , T(1.0)),
test_ab("a ilike b", "aBcD", "?bcd" , T(1.0)),
test_ab("a ilike b", "aBcD", "ab?d" , T(1.0)),
test_ab("a ilike b", "aBcD", "ab*d" , T(1.0)),
test_ab("a ilike b", "aBcD", "a?cd" , T(1.0)),
test_ab("a ilike b", "aBcD", "a*cd" , T(1.0)),
test_ab("a ilike b", "aBcD", "a??d" , T(1.0)),
test_ab("a ilike b", "aBcD", "a*?d" , T(1.0)),
test_ab("a ilike b", "aBcD", "*bc*" , T(1.0)),
test_ab("a ilike b", "aBcD", "?bc?" , T(1.0)),
test_ab("a ilike b", "aBcD", "????" , T(1.0)),
test_ab("a ilike b", "aBcD", "a???" , T(1.0)),
test_ab("a ilike b", "aBcD", "ab??" , T(1.0)),
test_ab("a ilike b", "aBcD", "abc?" , T(1.0)),
test_ab("a ilike b", "aBcD", "???d" , T(1.0)),
test_ab("a ilike b", "aBcD", "??cd" , T(1.0)),
test_ab("a ilike b", "aBcD", "?bcd" , T(1.0)),
test_ab("a ilike b", "aBcD", "?b?d" , T(1.0)),
test_ab("a ilike b", "aBcD", "a?c?" , T(1.0)),
test_ab("a ilike b", "aBcD", "a??d" , T(1.0)),
test_ab("a ilike b", "aBcD", "?bc?" , T(1.0)),
test_ab("a ilike b", "aBcD", "ab**" , T(1.0)),
test_ab("a ilike b", "aBcD", "ab*?" , T(1.0)),
test_ab("a ilike b", "aBcD", "a***" , T(1.0)),
test_ab("a ilike b", "aBcD", "**cd" , T(1.0)),
test_ab("a ilike b", "aBcD", "*?cd" , T(1.0)),
test_ab("a ilike b", "aBcD", "***d" , T(1.0)),
test_ab("a ilike b", "aBcD", "*bc*" , T(1.0)),
test_ab("a ilike b", "aBcD", "*bc?" , T(1.0)),
test_ab("a ilike b", "aBcD", "*b??" , T(1.0)),
test_ab("a ilike b", "aBcD", "?bc*" , T(1.0)),
test_ab("a ilike b", "aBcD", "??c*" , T(1.0)),
test_ab("a ilike b", "aBcD", "*b?*" , T(1.0)),
test_ab("a ilike b", "aB" , "a*" , T(1.0)),
test_ab("a ilike b", "aB" , "a?" , T(1.0))
};
static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_ab);
{
const std::size_t rounds = 50;
for (std::size_t r = 0; r < rounds; ++r)
{
bool result = true;
for (std::size_t i = 0; i < test_list_size; ++i)
{
test_ab& test = const_cast(test_list[i]);
std::string str_a;
std::string str_b;
std::string str_c;
T r0 = T(2);
T r1 = T(6);
T r2 = T(7);
T r3 = T(3);
exprtk::symbol_table symbol_table;
symbol_table.add_stringvar("a", str_a);
symbol_table.add_stringvar("b", str_b);
symbol_table.add_stringvar("c", str_c);
symbol_table.add_variable("r0", r0);
symbol_table.add_variable("r1", r1);
symbol_table.add_variable("r2", r2);
symbol_table.add_variable("r3", r3);
exprtk::expression expression;
expression.register_symbol_table(symbol_table);
{
exprtk::parser parser;
if (!parser.compile(test.expr, expression))
{
printf("run_test02() - Error: %s Expression: %s\n",
parser.error().c_str(),
test.expr.c_str());
result = false;
continue;
}
}
str_a = test.a;
str_b = test.b;
str_c = test.c;
T expr_result = expression.value();
if (not_equal(expr_result, test.result))
{
printf("run_test02() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\t"
"a='%s'\tb='%s'\tc='%s'\n",
test.expr.c_str(),
static_cast(test.result),
static_cast(expr_result),
str_a.c_str(),
str_b.c_str(),
str_c.c_str());
result = false;
continue;
}
}
if (!result)
{
return false;
}
}
}
{
std::string s0;
std::string s1;
const std::string expression_str =
" s0 := 'abc'; "
" s0 := (s1 := '0123456789'[2:8]); "
" s1 := 'xyz'; "
" s0 < s1; ";
exprtk::symbol_table symbol_table;
symbol_table.add_stringvar("s0" ,s0);
symbol_table.add_stringvar("s1" ,s1);
exprtk::expression expression;
expression.register_symbol_table(symbol_table);
{
exprtk::parser parser;
if (!parser.compile(expression_str,expression))
{
printf("run_test02() - [2] Error: %s Expression: %s\n",
parser.error().c_str(),
expression_str.c_str());
return false;
}
}
if (T(0) == expression.value())
{
printf("run_test02() - Evaluation Error [2]: Expression: [%s]\tExpected: True\n",
expression_str.c_str());
return false;
}
else if ("234567" != s0)
{
printf("run_test02() - Evaluation Error [2]: Expression: [%s]\tInvalid value for s0\n",
expression_str.c_str());
return false;
}
else if ("xyz" != s1)
{
printf("run_test02() - Evaluation Error [2]: Expression: [%s]\tInvalid value for s1\n",
expression_str.c_str());
return false;
}
}
return true;
}
template
bool run_test03()
{
typedef exprtk::symbol_table symbol_table_t;
typedef exprtk::expression expression_t;
typedef exprtk::parser parser_t;
const std::string expression_string =
"A+A0+aA+Aa0+b+B1+Bb+bB1+A+A0+AA+AA0+B+B1+BB+BB1+a+a0+aa+aa0+b+b1+bb+bb1+"
"c+C2+Cc+Cc2+D+D3+dD+dD3+C+C2+CC+CC2+D+D3+DD+DD3+c+c2+cc+cc2+d+d3+dd+dd3+"
"E+E4+eE+Ee4+f+F5+Ff+fF5+E+E4+EE+EE4+F+F5+FF+FF5+e+e4+ee+ee4+f+f5+ff+ff5+"
"g+G6+Gg+Gg6+H+H7+hH+hH7+G+G6+GG+GG6+H+H7+HH+HH7+g+g6+gg+gg6+h+h7+hh+hh7+"
"I+I8+iI+Ii8+j+J9+Jj+jJ9+I+I8+II+II8+J+J9+JJ+JJ9+i+i8+ii+ii8+j+j9+jj+jj9+"
"k+K0+Kk+Kk0+L+L1+lL+lL1+K+K0+KK+KK0+L+L1+LL+LL1+k+k0+kk+kk0+l+l1+ll+ll1+"
"M+M2+mM+Mm2+n+N3+Nn+nN3+M+M2+MM+MM2+N+N3+NN+NN3+m+m2+mm+mm2+n+n3+nn+nn3+"
"o+O4+Oo+Oo4+P+P5+pP+pP5+O+O4+OO+OO4+P+P5+PP+PP5+o+o4+oo+oo4+p+p5+pp+pp5+"
"Q+Q6+qQ+Qq6+r+R7+Rr+rR7+Q+Q6+QQ+QQ6+R+R7+RR+RR7+q+q6+qq+qq6+r+r7+rr+rr7+"
"s+S8+Ss+Ss8+T+T9+tT+tT9+S+S8+SS+SS8+T+T9+TT+TT9+s+s8+ss+ss8+t+t9+tt+tt9+"
"U+U0+uU+Uu0+v+V1+Vv+vV1+U+U0+UU+UU0+V+V1+VV+VV1+u+u0+uu+uu0+v+v1+vv+vv1+"
"w+W2+Ww+Ww2+X+X3+xX+xX3+W+W2+WW+WW2+X+X3+XX+XX3+w+w2+ww+ww2+x+x3+xx+xx3+"
"Y+Y4+yY+Yy4+z+Z5+Zz+zZ5+Y+Y4+YY+YY4+Z+Z5+ZZ+ZZ5+y+y4+yy+yy4+z+z5+zz+zz5 ";
static const std::string variable_list[] =
{
"A", "A0", "aA", "Aa0", "b", "B1", "Bb", "bB1",
"c", "C2", "Cc", "Cc2", "D", "D3", "dD", "dD3",
"E", "E4", "eE", "Ee4", "f", "F5", "Ff", "fF5",
"g", "G6", "Gg", "Gg6", "H", "H7", "hH", "hH7",
"I", "I8", "iI", "Ii8", "j", "J9", "Jj", "jJ9",
"k", "K0", "Kk", "Kk0", "L", "L1", "lL", "lL1",
"M", "M2", "mM", "Mm2", "n", "N3", "Nn", "nN3",
"o", "O4", "Oo", "Oo4", "P", "P5", "pP", "pP5",
"Q", "Q6", "qQ", "Qq6", "r", "R7", "Rr", "rR7",
"s", "S8", "Ss", "Ss8", "T", "T9", "tT", "tT9",
"U", "U0", "uU", "Uu0", "v", "V1", "Vv", "vV1",
"w", "W2", "Ww", "Ww2", "X", "X3", "xX", "xX3",
"Y", "Y4", "yY", "Yy4", "z", "Z5", "Zz", "zZ5"
};
static const std::size_t variable_list_size = sizeof(variable_list) / sizeof(std::string);
static const std::size_t rounds = 300;
for (std::size_t r = 0; r < rounds; ++r)
{
symbol_table_t symbol_table_0;
symbol_table_t symbol_table_1;
expression_t expression;
std::vector v;
v.resize(variable_list_size);
for (std::size_t i = 0; i < variable_list_size; ++i)
{
v[i] = T(i);
if (i & 1)
symbol_table_0.add_variable(variable_list[i],v[i]);
else
symbol_table_1.add_variable(variable_list[i],v[i]);
}
std::size_t total_symbol_count = symbol_table_0.variable_count() +
symbol_table_1.variable_count();
if (variable_list_size != total_symbol_count)
{
printf("run_test03() - Error - Invalid number of variables in symbol_table! Expected: %d got: %d\n",
static_cast(variable_list_size),
static_cast(total_symbol_count));
return false;
}
symbol_table_0.add_constants();
expression.register_symbol_table(symbol_table_0);
expression.register_symbol_table(symbol_table_1);
{
exprtk::parser parser;
if (!parser.compile(expression_string,expression))
{
printf("run_test03() - Error: %s Expression: %s\n",
parser.error().c_str(),
expression_string.c_str());
return false;
}
}
expression.value();
}
{
static const std::string invalid_expr[] =
{
"x y",
"x y z",
"x y z w",
"x 1",
"x 1 2",
"x 1 2 3",
"x 'abc'",
"x 1 'abc'",
"x 'abc' 1",
"1 2",
"1 2 3",
"1 2 3 4",
"'abc' 'xyz'",
"'abc' 1",
"1 'abc'",
"x sin(1)",
"s 'abc'",
"s x",
"s y",
"s 1",
"s 1 x",
"s 1 y",
"s x 1",
"s y 1",
"x s ",
"y s ",
"1 s ",
"1 s x",
"1 s y",
"x s 1",
"y s 1",
"v 'abc'",
"v x ",
"v y ",
"v s ",
"v 1 ",
"v 1 x",
"v 1 y",
"v 1 s",
"v x 1",
"v y 1",
"v s 1",
"x v ",
"y v ",
"1 v ",
"1 v x",
"1 v y",
"x v 1",
"y v 1",
"(x == 'a string' )",
"(x == 'a string'[1:3] )",
"(x == 'a string' + 'b string' )",
"(x == ('a string' + 'b string')[3:6])",
"('a string' == x )",
"('a string'[1:3] == x )",
"('a string' + 'b string' == x )",
"(('a string' + 'b string')[3:6] == x)",
"var a; var b; 3in(a)+sin(b) ",
"var a; var b; sin(a)+3in(b) ",
"var a; var b; sqrt(a)