[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/ArashPartow/exprtk/master/exprtk_test.cpp [Back]  [Original]

/*
 **************************************************************
 *         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)

Web Proxy Viewer  |  New URL  |  Original Page