C++ Mathematical Expression Toolkit (ExprTk) release
Loading...
Searching...
No Matches
Classes | Macros | Typedefs | Functions | Variables
exprtk_real_test.cpp File Reference
#include <cmath>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <deque>
#include <fstream>
#include <numeric>
#include <string>
#include <vector>
#include "real_type.hpp"
#include "exprtk_real_adaptor.hpp"
#include "exprtk.hpp"
Include dependency graph for exprtk_real_test.cpp:

Go to the source code of this file.

Classes

struct  edge_cases< T >
 
struct  edge_cases< numeric_type >
 
struct  test_xy< T >
 
struct  test_xyzw< T >
 
struct  test_ab< T >
 
struct  myfunc< T >
 
struct  sine_deg< T >
 
struct  cosine_deg< T >
 
struct  base_func< T >
 
struct  test_func5< T >
 
struct  test_func4< T >
 
struct  test_func3< T >
 
struct  test_func2< T >
 
struct  test_func1< T >
 
struct  test_func0< T >
 
struct  va_func< T >
 
struct  gen_func< T >
 
struct  gen_func2< T >
 
struct  inc_func< T >
 
struct  rem_space_and_uppercase< T >
 
struct  vararg_func< T >
 
struct  vecrebase_func< T >
 
struct  overload_func< T >
 
struct  overload_func< T >::test_result_t
 
struct  vector_access_rtc_counter
 
struct  depth_to_str< T >
 
struct  my_usr< T >
 
struct  my_usr_ext< T >
 
class  vv_size_handler_t< T >
 
struct  assert_handler
 
struct  type_name< T >
 

Macros

#define exprtk_test_override
 
#define exprtk_test_final
 
#define exprtk_test_delete
 
#define define_free_functions(N, Type)
 
#define pb(v, N)    v.push_back(T(N)); \
 
#define pb(v, N)    v.push_back(T(N)); \
 
#define pb(v, N)    v.push_back(T(N)); \
 
#define pb(v, N)    v.push_back(T(N)); \
 
#define perform_test(Type, Number)
 

Typedefs

typedef real::type numeric_type
 
typedef std::pair< std::string, numeric_typetest_t
 

Functions

template<typename T >
bool not_equal_impl (const T &t1, const T &t2, const T &epsilon=0.0000000001)
 
template<typename T >
bool not_equal (const T &t0, const T &t1, const T &epsilon=T(0.0000000001))
 
bool not_equal (const float &t0, const float &t1, const float &epsilon=0.000001f)
 
template<typename T >
bool test_expression (const std::string &expression_string, const T &expected_result)
 
template<typename T >
bool run_test00 ()
 
template<typename T >
bool run_test01 ()
 
template<typename T >
bool run_test02 ()
 
template<typename T >
bool run_test03 ()
 
template<typename T >
clamp (const T &l, const T &v, const T &u)
 
template<typename T >
bool run_test04 ()
 
template<typename T >
bool run_test05 ()
 
template<typename T >
bool run_test06 ()
 
template<typename T >
bool run_test07 ()
 
template<typename T >
bool run_test08 ()
 
numeric_type foo1 (numeric_type v0)
 
numeric_type foo2 (numeric_type v0, numeric_type v1)
 
numeric_type foo3 (numeric_type v0, numeric_type v1, numeric_type v2)
 
numeric_type foo4 (numeric_type v0, numeric_type v1, numeric_type v2, numeric_type v3)
 
numeric_type foo5 (numeric_type v0, numeric_type v1, numeric_type v2, numeric_type v3, numeric_type v4)
 
numeric_type foo6 (numeric_type v0, numeric_type v1, numeric_type v2, numeric_type v3, numeric_type v4, numeric_type v5)
 
template<typename T >
bool run_test09 ()
 
template<typename T >
bool run_test10 ()
 
template<typename T >
bool run_test11 ()
 
template<typename T >
bool run_test12 ()
 
template<typename T >
bool run_test13 ()
 
template<typename Allocator , template< typename, typename > class Sequence>
std::size_t load_expressions (const std::string &file_name, Sequence< std::string, Allocator > &sequence)
 
template<typename T >
bool run_test14 ()
 
template<typename T >
bool run_test15 ()
 
template<typename T >
bool run_test16 ()
 
template<typename T >
bool run_test17 ()
 
template<typename T >
bool run_test18 ()
 
template<typename T >
bool run_test19 ()
 
template<typename T >
bool run_test20 ()
 
template<typename T >
std::string results_to_string (const exprtk::results_context< T > &results)
 
template<typename T >
bool result_equal (const exprtk::results_context< T > &results, const T &value)
 
template<typename T >
bool run_test21 ()
 
template<typename T >
bool run_test22 ()
 
int main (int argc, char *argv[])
 

Variables

static const test_t global_test_list []
 
static const std::size_t global_test_list_size = sizeof(global_test_list) / sizeof(test_t)
 

Macro Definition Documentation

◆ define_free_functions

#define define_free_functions (   N,
  Type 
)
Value:
inline Type N##1(Type v0) { return v0; } \
inline Type N##2(Type v0, Type v1) { return v0 + v1; } \
inline Type N##3(Type v0, Type v1, Type v2) { return v0 + v1 + v2; } \
inline Type N##4(Type v0, Type v1, Type v2, Type v3) { return v0 + v1 + v2 + v3; } \
inline Type N##5(Type v0, Type v1, Type v2, Type v3, Type v4) { return v0 + v1 + v2 + v3 + v4; } \
inline Type N##6(Type v0, Type v1, Type v2, Type v3, Type v4, Type v5) { return v0 + v1 + v2 + v3 + v4 + v5; } \

Definition at line 3722 of file exprtk_real_test.cpp.

3723 { return v0; } \
3724inline Type N##2(Type v0, Type v1) { return v0 + v1; } \
3725inline Type N##3(Type v0, Type v1, Type v2) { return v0 + v1 + v2; } \
3726inline Type N##4(Type v0, Type v1, Type v2, Type v3) { return v0 + v1 + v2 + v3; } \
3727inline Type N##5(Type v0, Type v1, Type v2, Type v3, Type v4) { return v0 + v1 + v2 + v3 + v4; } \
3728inline Type N##6(Type v0, Type v1, Type v2, Type v3, Type v4, Type v5) { return v0 + v1 + v2 + v3 + v4 + v5; } \
3729

◆ exprtk_test_delete

#define exprtk_test_delete

Definition at line 43 of file exprtk_real_test.cpp.

◆ exprtk_test_final

#define exprtk_test_final

Definition at line 42 of file exprtk_real_test.cpp.

◆ exprtk_test_override

#define exprtk_test_override

Definition at line 41 of file exprtk_real_test.cpp.

◆ pb [1/4]

#define pb (   v,
 
)     v.push_back(T(N)); \

◆ pb [2/4]

#define pb (   v,
 
)     v.push_back(T(N)); \

◆ pb [3/4]

#define pb (   v,
 
)     v.push_back(T(N)); \

◆ pb [4/4]

#define pb (   v,
 
)     v.push_back(T(N)); \

◆ perform_test

#define perform_test (   Type,
  Number 
)
Value:
{ \
const std::string test_name = "run_test"#Number; \
if ( \
test_set.empty() || \
test_set.find(test_name) != std::string::npos \
) \
{ \
exprtk::timer timer; \
timer.start(); \
if (!run_test##Number<Type>()) \
{ \
printf("run_test"#Number" (%s) *** FAILED! ***\n", \
type_name<Type>::value().c_str()); \
result = EXIT_FAILURE; \
} \
else \
{ \
timer.stop(); \
printf("run_test"#Number" (%s) - Result: SUCCESS Time: %8.4fsec\n", \
timer.time()); \
} \
} \
} \
double time() const
Definition exprtk.hpp:43502

Typedef Documentation

◆ numeric_type

Definition at line 35 of file exprtk_real_test.cpp.

◆ test_t

typedef std::pair<std::string,numeric_type> test_t

Definition at line 46 of file exprtk_real_test.cpp.

Function Documentation

◆ clamp()

template<typename T >
T clamp ( const T &  l,
const T &  v,
const T &  u 
)
inline

Definition at line 3238 of file exprtk_real_test.cpp.

3239{
3240 return (v < l) ? l : ((v > u) ? u : v);
3241}

◆ foo1()

numeric_type foo1 ( numeric_type  v0)
inline

Definition at line 3730 of file exprtk_real_test.cpp.

Referenced by run_test09(), and run_test18().

Here is the caller graph for this function:

◆ foo2()

numeric_type foo2 ( numeric_type  v0,
numeric_type  v1 
)
inline

Definition at line 3730 of file exprtk_real_test.cpp.

Referenced by run_test09(), and run_test18().

Here is the caller graph for this function:

◆ foo3()

numeric_type foo3 ( numeric_type  v0,
numeric_type  v1,
numeric_type  v2 
)
inline

Definition at line 3730 of file exprtk_real_test.cpp.

Referenced by run_test09(), and run_test18().

Here is the caller graph for this function:

◆ foo4()

numeric_type foo4 ( numeric_type  v0,
numeric_type  v1,
numeric_type  v2,
numeric_type  v3 
)
inline

Definition at line 3730 of file exprtk_real_test.cpp.

Referenced by run_test09(), and run_test18().

Here is the caller graph for this function:

◆ foo5()

numeric_type foo5 ( numeric_type  v0,
numeric_type  v1,
numeric_type  v2,
numeric_type  v3,
numeric_type  v4 
)
inline

Definition at line 3730 of file exprtk_real_test.cpp.

Referenced by run_test09(), and run_test18().

Here is the caller graph for this function:

◆ foo6()

numeric_type foo6 ( numeric_type  v0,
numeric_type  v1,
numeric_type  v2,
numeric_type  v3,
numeric_type  v4,
numeric_type  v5 
)
inline

Definition at line 3730 of file exprtk_real_test.cpp.

Referenced by run_test09(), and run_test18().

Here is the caller graph for this function:

◆ load_expressions()

template<typename Allocator , template< typename, typename > class Sequence>
std::size_t load_expressions ( const std::string &  file_name,
Sequence< std::string, Allocator > &  sequence 
)
inline

Definition at line 5557 of file exprtk_real_test.cpp.

5559{
5560 std::ifstream stream(file_name.c_str());
5561
5562 if (!stream) return 0;
5563
5564 std::string buffer;
5565 buffer.reserve(1024);
5566
5567 std::size_t line_count = 0;
5568
5569 while (std::getline(stream,(buffer)))
5570 {
5571 if (buffer.empty())
5572 continue;
5573 else if ('#' == buffer[0])
5574 continue;
5575
5576 ++line_count;
5577 sequence.push_back(buffer);
5578 }
5579
5580 return line_count;
5581}

Referenced by run_test14().

Here is the caller graph for this function:

◆ main()

int main ( int  argc,
char *  argv[] 
)

Definition at line 12609 of file exprtk_real_test.cpp.

12610{
12611 const std::string test_set = (argc == 2) ? std::string(argv[1]) : "";
12612
12613 #define perform_test(Type,Number) \
12614 { \
12615 const std::string test_name = "run_test"#Number; \
12616 if ( \
12617 test_set.empty() || \
12618 test_set.find(test_name) != std::string::npos \
12619 ) \
12620 { \
12621 exprtk::timer timer; \
12622 timer.start(); \
12623 if (!run_test##Number<Type>()) \
12624 { \
12625 printf("run_test"#Number" (%s) *** FAILED! ***\n", \
12626 type_name<Type>::value().c_str()); \
12627 result = EXIT_FAILURE; \
12628 } \
12629 else \
12630 { \
12631 timer.stop(); \
12632 printf("run_test"#Number" (%s) - Result: SUCCESS Time: %8.4fsec\n", \
12633 type_name<Type>::value().c_str(), \
12634 timer.time()); \
12635 } \
12636 } \
12637 } \
12638
12639 int result = 0;
12640
12664
12665 #undef perform_test
12666
12667 return result;
12668}
mpfr::mpreal numeric_type
#define perform_test(Type, Number)

References perform_test.

◆ not_equal() [1/2]

bool not_equal ( const float &  t0,
const float &  t1,
const float &  epsilon = 0.000001f 
)
inline

Definition at line 1147 of file exprtk_real_test.cpp.

1148{
1149 return not_equal_impl(t0,t1,epsilon);
1150}
bool not_equal_impl(const T &t1, const T &t2, const T &epsilon=0.0000000001)

References not_equal_impl().

Here is the call graph for this function:

◆ not_equal() [2/2]

template<typename T >
bool not_equal ( const T &  t0,
const T &  t1,
const T &  epsilon = T(0.0000000001) 
)
inline

Definition at line 1141 of file exprtk_real_test.cpp.

1143{
1144 return not_equal_impl(t0,t1,epsilon);
1145}

References not_equal_impl().

Referenced by run_test01(), run_test02(), run_test04(), run_test05(), run_test06(), run_test07(), run_test09(), run_test11(), run_test15(), run_test18(), run_test19(), and test_expression().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ not_equal_impl()

template<typename T >
bool not_equal_impl ( const T &  t1,
const T &  t2,
const T &  epsilon = 0.0000000001 
)
inline

Definition at line 1129 of file exprtk_real_test.cpp.

1132{
1133 if (t1 != t1) return true;
1134 if (t2 != t2) return true;
1135 T diff = real::abs(t1 - t2);
1136 T eps_norm = (real::max(T(1),real::max(real::abs(t1),real::abs(t2))) * epsilon);
1137 return diff > eps_norm;
1138}
type max(const type v0, const type v1)
type abs(const type v)

References real::abs(), and real::max().

Referenced by not_equal(), and not_equal().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ result_equal()

template<typename T >
bool result_equal ( const exprtk::results_context< T > &  results,
const T &  value 
)
inline

Definition at line 10254 of file exprtk_real_test.cpp.

10255{
10256 typedef exprtk::results_context<T> results_context_t;
10257 typedef typename results_context_t::type_store_t type_t;
10258 typedef typename type_t::scalar_view scalar_t;
10259
10260 if (1 != results.count())
10261 return false;
10262 else if (type_t::e_scalar != results[0].type)
10263 return false;
10264 else
10265 return (value == scalar_t(results[0])());
10266}
std::size_t count() const
Definition exprtk.hpp:4896

References exprtk::results_context< T >::count().

Referenced by run_test21().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ results_to_string()

template<typename T >
std::string results_to_string ( const exprtk::results_context< T > &  results)
inline

Definition at line 10224 of file exprtk_real_test.cpp.

10225{
10226 typedef exprtk::results_context<T> results_context_t;
10227 typedef typename results_context_t::type_store_t type_t;
10228
10229 std::string res_str;
10230
10231 for (std::size_t i = 0; i < results.count(); ++i)
10232 {
10233 type_t t = results[i];
10234
10235 switch (t.type)
10236 {
10237 case type_t::e_scalar : res_str += 'T';
10238 break;
10239
10240 case type_t::e_vector : res_str += 'V';
10241 break;
10242
10243 case type_t::e_string : res_str += 'S';
10244 break;
10245
10246 default : continue;
10247 }
10248 }
10249
10250 return res_str;
10251}

References exprtk::results_context< T >::count().

Here is the call graph for this function:

◆ run_test00()

template<typename T >
bool run_test00 ( )
inline

Definition at line 1244 of file exprtk_real_test.cpp.

1245{
1246 const std::size_t rounds = 10;
1247 for (std::size_t r = 0; r < rounds; ++r)
1248 {
1249 bool result = true;
1250 for (std::size_t i = 0; i < global_test_list_size; ++i)
1251 {
1252 if (!test_expression<T>(global_test_list[i].first,T(global_test_list[i].second)))
1253 {
1254 result = false;
1255 }
1256 }
1257
1258 if (!result)
1259 {
1260 return false;
1261 }
1262 }
1263
1264 {
1265 const std::vector<test_t> tests = edge_cases<T>::test_cases();
1266
1267 bool result = true;
1268
1269 for (std::size_t i = 0; i < tests.size(); ++i)
1270 {
1271 if (!test_expression<T>(tests[i].first,T(tests[i].second)))
1272 {
1273 result = false;
1274 }
1275 }
1276
1277 if (!result)
1278 {
1279 return false;
1280 }
1281 }
1282
1283 return true;
1284}
static const std::size_t rounds
static const test_t global_test_list[]
static const std::size_t global_test_list_size

References global_test_list, global_test_list_size, and rounds.

◆ run_test01()

template<typename T >
bool run_test01 ( )
inline

Definition at line 1323 of file exprtk_real_test.cpp.

1324{
1325 {
1326 static const test_xy<T> test_list[] =
1327 {
1328 test_xy<T>("x + y" ,T(2.2),T(3.3),T(5.5 )),
1329 test_xy<T>("x - y" ,T(3.3),T(2.2),T(1.1 )),
1330 test_xy<T>("x * y" ,T(3.3),T(2.2),T(7.26 )),
1331 test_xy<T>("x / y" ,T(3.3),T(2.2),T(1.5 )),
1332 test_xy<T>("(x + y) * (x + y)" ,T(2.2),T(3.3),T(30.25)),
1333 test_xy<T>("(x + y) / (x + y)" ,T(2.2),T(3.3),T(1.0 )),
1334 test_xy<T>("x + y > x and x + y > y" ,T(2.2),T(3.3),T(1.0)),
1335 test_xy<T>("1 + (x + y)" ,T(2.2),T(3.3),T(6.5 )),
1336 test_xy<T>("(x + y) - 1" ,T(2.2),T(3.3),T(4.5 )),
1337 test_xy<T>("1 + (x + y) * 2" ,T(2.2),T(3.3),T(12.0 )),
1338 test_xy<T>("2 * (x + y) - 1" ,T(2.2),T(3.3),T(10.0 )),
1339 test_xy<T>("y + (x + 1)" ,T(2.2),T(3.3),T(6.5 )),
1340 test_xy<T>("(x + 1) + y" ,T(2.2),T(3.3),T(6.5 )),
1341 test_xy<T>("2 * x" ,T(2.2),T(0.0),T(4.4)),
1342 test_xy<T>("x * 2" ,T(2.2),T(0.0),T(4.4)),
1343 test_xy<T>("1.1 + x" ,T(2.2),T(0.0),T(3.3)),
1344 test_xy<T>("x + 1.1" ,T(2.2),T(0.0),T(3.3)),
1345 test_xy<T>("x - -1 " ,T(1.0),T(0.0),T(2)),
1346 test_xy<T>("x --1 " ,T(1.0),T(0.0),T(2)),
1347 test_xy<T>("x-- 1 " ,T(1.0),T(0.0),T(2)),
1348 test_xy<T>("x--1 " ,T(1.0),T(0.0),T(2)),
1349 test_xy<T>("x -- -1" ,T(1.0),T(0.0),T(0)),
1350 test_xy<T>("x + -1 " ,T(1.0),T(0.0),T(0)),
1351 test_xy<T>("x +-1 " ,T(1.0),T(0.0),T(0)),
1352 test_xy<T>("x+- 1 " ,T(1.0),T(0.0),T(0)),
1353 test_xy<T>("x+-1 " ,T(1.0),T(0.0),T(0)),
1354 test_xy<T>("x +- -1" ,T(1.0),T(0.0),T(2)),
1355 test_xy<T>("x + +1 " ,T(1.0),T(0.0),T(2)),
1356 test_xy<T>("x ++1 " ,T(1.0),T(0.0),T(2)),
1357 test_xy<T>("1 - -x " ,T(1.0),T(0.0),T(2)),
1358 test_xy<T>("1 --x " ,T(1.0),T(0.0),T(2)),
1359 test_xy<T>("1-- x " ,T(1.0),T(0.0),T(2)),
1360 test_xy<T>("1--x " ,T(1.0),T(0.0),T(2)),
1361 test_xy<T>("1 -- -x" ,T(1.0),T(0.0),T(0)),
1362 test_xy<T>("1 + -x " ,T(1.0),T(0.0),T(0)),
1363 test_xy<T>("1 +-x " ,T(1.0),T(0.0),T(0)),
1364 test_xy<T>("1+- x " ,T(1.0),T(0.0),T(0)),
1365 test_xy<T>("1+-x " ,T(1.0),T(0.0),T(0)),
1366 test_xy<T>("1 +- -x" ,T(1.0),T(0.0),T(2)),
1367 test_xy<T>("1 + +x " ,T(1.0),T(0.0),T(2)),
1368 test_xy<T>("1 ++x " ,T(1.0),T(0.0),T(2)),
1369 test_xy<T>("(x - -1 + 1)" ,T(1.0),T(0.0),T(3)),
1370 test_xy<T>("(x --1 + 1)" ,T(1.0),T(0.0),T(3)),
1371 test_xy<T>("(x-- 1 + 1)" ,T(1.0),T(0.0),T(3)),
1372 test_xy<T>("(x--1 + 1)" ,T(1.0),T(0.0),T(3)),
1373 test_xy<T>("(x -- -1 + 1)" ,T(1.0),T(0.0),T(1)),
1374 test_xy<T>("(x + -1 + 1)" ,T(1.0),T(0.0),T(1)),
1375 test_xy<T>("(x +-1 + 1)" ,T(1.0),T(0.0),T(1)),
1376 test_xy<T>("(x+- 1 + 1)" ,T(1.0),T(0.0),T(1)),
1377 test_xy<T>("(x+-1 + 1)" ,T(1.0),T(0.0),T(1)),
1378 test_xy<T>("(x +- -1 + 1)" ,T(1.0),T(0.0),T(3)),
1379 test_xy<T>("(x + +1 + 1)" ,T(1.0),T(0.0),T(3)),
1380 test_xy<T>("(x ++1 + 1)" ,T(1.0),T(0.0),T(3)),
1381 test_xy<T>("(1 - -x + 1)" ,T(1.0),T(0.0),T(3)),
1382 test_xy<T>("(1 --x + 1)" ,T(1.0),T(0.0),T(3)),
1383 test_xy<T>("(1-- x + 1)" ,T(1.0),T(0.0),T(3)),
1384 test_xy<T>("(1--x + 1)" ,T(1.0),T(0.0),T(3)),
1385 test_xy<T>("(1 -- -x + 1)" ,T(1.0),T(0.0),T(1)),
1386 test_xy<T>("(1 + -x + 1)" ,T(1.0),T(0.0),T(1)),
1387 test_xy<T>("(1 +-x + 1)" ,T(1.0),T(0.0),T(1)),
1388 test_xy<T>("(1+- x + 1)" ,T(1.0),T(0.0),T(1)),
1389 test_xy<T>("(1+-x + 1)" ,T(1.0),T(0.0),T(1)),
1390 test_xy<T>("(1 +- -x + 1)" ,T(1.0),T(0.0),T(3)),
1391 test_xy<T>("(1 + +x + 1)" ,T(1.0),T(0.0),T(3)),
1392 test_xy<T>("(1 ++x + 1)" ,T(1.0),T(0.0),T(3)),
1393 test_xy<T>("(x - -1 - 1)" ,T(1.0),T(0.0),T(1)),
1394 test_xy<T>("(x --1 - 1)" ,T(1.0),T(0.0),T(1)),
1395 test_xy<T>("(x-- 1 - 1)" ,T(1.0),T(0.0),T(1)),
1396 test_xy<T>("(x--1 - 1)" ,T(1.0),T(0.0),T(1)),
1397 test_xy<T>("(x -- -1 - 1)" ,T(1.0),T(0.0),T(-1)),
1398 test_xy<T>("(x + -1 - 1)" ,T(1.0),T(0.0),T(-1)),
1399 test_xy<T>("(x +-1 - 1)" ,T(1.0),T(0.0),T(-1)),
1400 test_xy<T>("(x+- 1 - 1)" ,T(1.0),T(0.0),T(-1)),
1401 test_xy<T>("(x+-1 - 1)" ,T(1.0),T(0.0),T(-1)),
1402 test_xy<T>("(x +- -1 - 1)" ,T(1.0),T(0.0),T(1)),
1403 test_xy<T>("(x + +1 - 1)" ,T(1.0),T(0.0),T(1)),
1404 test_xy<T>("(x ++1 - 1)" ,T(1.0),T(0.0),T(1)),
1405 test_xy<T>("(1 - -x - 1)" ,T(1.0),T(0.0),T(1)),
1406 test_xy<T>("(1 --x - 1)" ,T(1.0),T(0.0),T(1)),
1407 test_xy<T>("(1-- x - 1)" ,T(1.0),T(0.0),T(1)),
1408 test_xy<T>("(1--x - 1)" ,T(1.0),T(0.0),T(1)),
1409 test_xy<T>("(1 -- -x - 1)" ,T(1.0),T(0.0),T(-1)),
1410 test_xy<T>("(1 + -x - 1)" ,T(1.0),T(0.0),T(-1)),
1411 test_xy<T>("(1 +-x - 1)" ,T(1.0),T(0.0),T(-1)),
1412 test_xy<T>("(1+- x - 1)" ,T(1.0),T(0.0),T(-1)),
1413 test_xy<T>("(1+-x - 1)" ,T(1.0),T(0.0),T(-1)),
1414 test_xy<T>("(1 +- -x - 1)" ,T(1.0),T(0.0),T(1)),
1415 test_xy<T>("(1 + +x - 1)" ,T(1.0),T(0.0),T(1)),
1416 test_xy<T>("(1 ++x - 1)" ,T(1.0),T(0.0),T(1)),
1417 test_xy<T>("x * 1 == x" ,T(2.0),T(3.0),T(1.0)),
1418 test_xy<T>("1 * x == x" ,T(2.0),T(3.0),T(1.0)),
1419 test_xy<T>("y * 1 == y" ,T(2.0),T(3.0),T(1.0)),
1420 test_xy<T>("1 * y == y" ,T(2.0),T(3.0),T(1.0)),
1421 test_xy<T>("x * 0 == 0" ,T(2.0),T(3.0),T(1.0)),
1422 test_xy<T>("0 * x == 0" ,T(2.0),T(3.0),T(1.0)),
1423 test_xy<T>("y * 0 == 0" ,T(2.0),T(3.0),T(1.0)),
1424 test_xy<T>("0 * y == 0" ,T(2.0),T(3.0),T(1.0)),
1425 test_xy<T>("x + 1 == 1 + x" ,T(2.0),T(3.0),T(1.0)),
1426 test_xy<T>("y + 1 == 1 + y" ,T(2.0),T(3.0),T(1.0)),
1427 test_xy<T>("x + y == y + x" ,T(2.0),T(3.0),T(1.0)),
1428 test_xy<T>("x * y == y * x" ,T(2.0),T(3.0),T(1.0)),
1429 test_xy<T>("x < y" ,T(2.0),T(3.0),T(1.0)),
1430 test_xy<T>("y > x" ,T(2.0),T(3.0),T(1.0)),
1431 test_xy<T>("x <= y" ,T(2.0),T(3.0),T(1.0)),
1432 test_xy<T>("y >= x" ,T(2.0),T(3.0),T(1.0)),
1433 test_xy<T>("x + y > y" ,T(2.0),T(3.0),T(1.0)),
1434 test_xy<T>("x + y > x" ,T(2.0),T(3.0),T(1.0)),
1435 test_xy<T>("x * y > y" ,T(2.0),T(3.0),T(1.0)),
1436 test_xy<T>("x * y > x" ,T(2.0),T(3.0),T(1.0)),
1437 test_xy<T>("(x + y) > y" ,T(2.0),T(3.0),T(1.0)),
1438 test_xy<T>("(x + y) > x" ,T(2.0),T(3.0),T(1.0)),
1439 test_xy<T>("(x * y) > y" ,T(2.0),T(3.0),T(1.0)),
1440 test_xy<T>("(x * y) > x" ,T(2.0),T(3.0),T(1.0)),
1441 test_xy<T>("(2x + 3y) == (2*x + 3*y)" ,T(2.0),T(3.0),T(1.0)),
1442 test_xy<T>("2(x + y) == (2*x + 2*y)" ,T(2.0),T(3.0),T(1.0)),
1443 test_xy<T>(" (x + y)3 == (3*x + 3*y)" ,T(2.0),T(3.0),T(1.0)),
1444 test_xy<T>("2x + 3y == 2*x + 3*y" ,T(2.0),T(3.0),T(1.0)),
1445 test_xy<T>("2(x + y) == 2*x + 2*y" ,T(2.0),T(3.0),T(1.0)),
1446 test_xy<T>(" (x + y)3 == 3*x + 3*y" ,T(2.0),T(3.0),T(1.0)),
1447 test_xy<T>(" (x)y == (x*y)" ,T(2.0),T(3.0),T(1.0)),
1448 test_xy<T>(" x(y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
1449 test_xy<T>(" (x) y == (x*y)" ,T(2.0),T(3.0),T(1.0)),
1450 test_xy<T>(" x (y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
1451 test_xy<T>(" ((x) y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
1452 test_xy<T>(" (x (y)) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
1453 test_xy<T>(" (x)3 == (x*3)" ,T(2.0),T(3.0),T(1.0)),
1454 test_xy<T>(" x(3) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
1455 test_xy<T>(" (x) 3 == (x*3)" ,T(2.0),T(3.0),T(1.0)),
1456 test_xy<T>(" x (3) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
1457 test_xy<T>(" ((x) 3) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
1458 test_xy<T>(" (x (3)) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
1459 test_xy<T>(" (2)y == (2*y)" ,T(2.0),T(3.0),T(1.0)),
1460 test_xy<T>(" 2(y) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
1461 test_xy<T>(" (2) y == (2*y)" ,T(2.0),T(3.0),T(1.0)),
1462 test_xy<T>(" 2 (y) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
1463 test_xy<T>(" ((2) y) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
1464 test_xy<T>(" (2 (y)) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
1465 test_xy<T>("var a := 2; (a)(3) == 6" ,T(2.0),T(3.0),T(1.0)),
1466 test_xy<T>("var a := 2; (A){3} == 6" ,T(2.0),T(3.0),T(1.0)),
1467 test_xy<T>("var a := 2; (a)[3] == 6" ,T(2.0),T(3.0),T(1.0)),
1468 test_xy<T>("var a := 2; {a}(3) == 6" ,T(2.0),T(3.0),T(1.0)),
1469 test_xy<T>("var a := 2; {a}{3} == 6" ,T(2.0),T(3.0),T(1.0)),
1470 test_xy<T>("var a := 2; {a}[3] == 6" ,T(2.0),T(3.0),T(1.0)),
1471 test_xy<T>("var a := 2; var b := 3; (a)(b) == 6" ,T(2.0),T(3.0),T(1.0)),
1472 test_xy<T>("var a := 2; var b := 3; (a){B} == 6" ,T(2.0),T(3.0),T(1.0)),
1473 test_xy<T>("var a := 2; var b := 3; (a)[b] == 6" ,T(2.0),T(3.0),T(1.0)),
1474 test_xy<T>("var a := 2; var b := 3; {a}(b) == 6" ,T(2.0),T(3.0),T(1.0)),
1475 test_xy<T>("var a := 2; var b := 3; {a}{b} == 6" ,T(2.0),T(3.0),T(1.0)),
1476 test_xy<T>("var a := 2; var b := 3; {a}[b] == 6" ,T(2.0),T(3.0),T(1.0)),
1477 test_xy<T>("var a := 2; (a)(a+1) == 6" ,T(2.0),T(3.0),T(1.0)),
1478 test_xy<T>("var a := 2; (a){a+1} == 6" ,T(2.0),T(3.0),T(1.0)),
1479 test_xy<T>("var a := 2; (a)[a+1] == 6" ,T(2.0),T(3.0),T(1.0)),
1480 test_xy<T>("var a := 2; {a}(a+1) == 6" ,T(2.0),T(3.0),T(1.0)),
1481 test_xy<T>("var a := 2; {a}{a+1} == 6" ,T(2.0),T(3.0),T(1.0)),
1482 test_xy<T>("var a := 2; {a}[a+1] == 6" ,T(2.0),T(3.0),T(1.0)),
1483 test_xy<T>("var a := 2; var b := 3; (b-1)(b) == 6" ,T(2.0),T(3.0),T(1.0)),
1484 test_xy<T>("var a := 2; var b := 3; (b-1){b} == 6" ,T(2.0),T(3.0),T(1.0)),
1485 test_xy<T>("var a := 2; var b := 3; (b-1)[b] == 6" ,T(2.0),T(3.0),T(1.0)),
1486 test_xy<T>("var a := 2; var b := 3; {b-1}(b) == 6" ,T(2.0),T(3.0),T(1.0)),
1487 test_xy<T>("var a := 2; var b := 3; {b-1}{b} == 6" ,T(2.0),T(3.0),T(1.0)),
1488 test_xy<T>("var a := 2; var b := 3; {b-1}[b] == 6" ,T(2.0),T(3.0),T(1.0)),
1489 test_xy<T>("equal(x^2.2^1.1,17.15193942371376191362)" ,T(3.3),T(0.0),T(1.0)),
1490 test_xy<T>("equal(3.3^x^1.1,17.15193942371376191362)" ,T(2.2),T(0.0),T(1.0)),
1491 test_xy<T>("equal(3.3^2.2^x,17.15193942371376191362)" ,T(1.1),T(0.0),T(1.0)),
1492 test_xy<T>("equal(x^2.2^y,17.15193942371376191362)" ,T(3.3),T(1.1),T(1.0)),
1493 test_xy<T>("equal(x^y^1.1,17.15193942371376191362)" ,T(3.3),T(2.2),T(1.0)),
1494 test_xy<T>("equal(3.3^x^y,17.15193942371376191362)" ,T(2.2),T(1.1),T(1.0)),
1495 test_xy<T>("equal(x+y^3/7,x+(y*y*y)/7)",T(2.0),T(3.0),T(1.0)),
1496 test_xy<T>("equal(1-x^3+y^2*7,1-(x*x*x)+(y*y)*7)",T(2.0),T(3.0),T(1.0)),
1497 test_xy<T>("equal( x^0,1)",T(12.34),T(0.0),T(1.0)),
1498 test_xy<T>("equal( x^1,x)",T(12.34),T(0.0),T(1.0)),
1499 test_xy<T>("equal( x^2,x*x)",T(12.34),T(0.0),T(1.0)),
1500 test_xy<T>("equal( x^3,x*x*x)",T(12.34),T(0.0),T(1.0)),
1501 test_xy<T>("equal( x^4,x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1502 test_xy<T>("equal( x^5,x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1503 test_xy<T>("equal( x^6,x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1504 test_xy<T>("equal( x^7,x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1505 test_xy<T>("equal( x^8,x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1506 test_xy<T>("equal( x^9,x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1507 test_xy<T>("equal(x^10,x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1508 test_xy<T>("equal(x^11,x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1509 test_xy<T>("equal(x^12,x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1510 test_xy<T>("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)),
1511 test_xy<T>("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)),
1512 test_xy<T>("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)),
1513 test_xy<T>("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)),
1514 test_xy<T>("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)),
1515 test_xy<T>("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)),
1516 test_xy<T>("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)),
1517 test_xy<T>("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)),
1518 test_xy<T>("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)),
1519 test_xy<T>("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)),
1520 test_xy<T>("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)),
1521 test_xy<T>("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)),
1522 test_xy<T>("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)),
1523 test_xy<T>("equal( y^0,1)",T(0.0),T(12.34),T(1.0)),
1524 test_xy<T>("equal( y^1,y)",T(0.0),T(12.34),T(1.0)),
1525 test_xy<T>("equal( y^2,y*y)",T(0.0),T(12.34),T(1.0)),
1526 test_xy<T>("equal( y^3,y*y*y)",T(0.0),T(12.34),T(1.0)),
1527 test_xy<T>("equal( y^4,y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1528 test_xy<T>("equal( y^5,y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1529 test_xy<T>("equal( y^6,y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1530 test_xy<T>("equal( y^7,y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1531 test_xy<T>("equal( y^8,y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1532 test_xy<T>("equal( y^9,y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1533 test_xy<T>("equal(y^10,y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1534 test_xy<T>("equal(y^11,y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1535 test_xy<T>("equal(y^12,y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1536 test_xy<T>("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)),
1537 test_xy<T>("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)),
1538 test_xy<T>("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)),
1539 test_xy<T>("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)),
1540 test_xy<T>("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)),
1541 test_xy<T>("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)),
1542 test_xy<T>("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)),
1543 test_xy<T>("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)),
1544 test_xy<T>("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)),
1545 test_xy<T>("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)),
1546 test_xy<T>("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)),
1547 test_xy<T>("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)),
1548 test_xy<T>("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)),
1549 test_xy<T>("equal( x^-0,1/1)",T(12.34),T(0.0),T(1.0)),
1550 test_xy<T>("equal( x^-1,1/(x))",T(12.34),T(0.0),T(1.0)),
1551 test_xy<T>("equal( x^-2,1/(x*x))",T(12.34),T(0.0),T(1.0)),
1552 test_xy<T>("equal( x^-3,1/(x*x*x))",T(12.34),T(0.0),T(1.0)),
1553 test_xy<T>("equal( x^-4,1/(x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1554 test_xy<T>("equal( x^-5,1/(x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1555 test_xy<T>("equal( x^-6,1/(x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1556 test_xy<T>("equal( x^-7,1/(x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1557 test_xy<T>("equal( x^-8,1/(x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1558 test_xy<T>("equal( x^-9,1/(x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1559 test_xy<T>("equal(x^-10,1/(x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1560 test_xy<T>("equal(x^-11,1/(x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1561 test_xy<T>("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)),
1562 test_xy<T>("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)),
1563 test_xy<T>("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)),
1564 test_xy<T>("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)),
1565 test_xy<T>("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)),
1566 test_xy<T>("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)),
1567 test_xy<T>("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)),
1568 test_xy<T>("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)),
1569 test_xy<T>("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)),
1570 test_xy<T>("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)),
1571 test_xy<T>("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)),
1572 test_xy<T>("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)),
1573 test_xy<T>("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)),
1574 test_xy<T>("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)),
1575 test_xy<T>("equal( y^-0,1/1)",T(0.0),T(12.34),T(1.0)),
1576 test_xy<T>("equal( y^-1,1/(y))",T(0.0),T(12.34),T(1.0)),
1577 test_xy<T>("equal( y^-2,1/(y*y))",T(0.0),T(12.34),T(1.0)),
1578 test_xy<T>("equal( y^-3,1/(y*y*y))",T(0.0),T(12.34),T(1.0)),
1579 test_xy<T>("equal( y^-4,1/(y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1580 test_xy<T>("equal( y^-5,1/(y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1581 test_xy<T>("equal( y^-6,1/(y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1582 test_xy<T>("equal( y^-7,1/(y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1583 test_xy<T>("equal( y^-8,1/(y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1584 test_xy<T>("equal( y^-9,1/(y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1585 test_xy<T>("equal(y^-10,1/(y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1586 test_xy<T>("equal(y^-11,1/(y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1587 test_xy<T>("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)),
1588 test_xy<T>("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)),
1589 test_xy<T>("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)),
1590 test_xy<T>("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)),
1591 test_xy<T>("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)),
1592 test_xy<T>("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)),
1593 test_xy<T>("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)),
1594 test_xy<T>("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)),
1595 test_xy<T>("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)),
1596 test_xy<T>("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)),
1597 test_xy<T>("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)),
1598 test_xy<T>("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)),
1599 test_xy<T>("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)),
1600 test_xy<T>("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)),
1601 test_xy<T>("(2 + x) + 7",T(3.0),T(0.0),T((2.0 + 3.0) + 7.0)),
1602 test_xy<T>("(2 + x) - 7",T(3.0),T(0.0),T((2.0 + 3.0) - 7.0)),
1603 test_xy<T>("(2 - x) + 7",T(3.0),T(0.0),T((2.0 - 3.0) + 7.0)),
1604 test_xy<T>("(2 - x) - 7",T(3.0),T(0.0),T((2.0 - 3.0) - 7.0)),
1605 test_xy<T>("(2 * x) * 7",T(3.0),T(0.0),T((2.0 * 3.0) * 7.0)),
1606 test_xy<T>("(2 * x) / 7",T(3.0),T(0.0),T((2.0 * 3.0) / 7.0)),
1607 test_xy<T>("(2 / x) * 7",T(3.0),T(0.0),T((2.0 / 3.0) * 7.0)),
1608 test_xy<T>("(2 / x) / 7",T(3.0),T(0.0),T((2.0 / 3.0) / 7.0)),
1609 test_xy<T>("2 + (x + 7)",T(3.0),T(0.0),T(2.0 + (3.0 + 7.0))),
1610 test_xy<T>("2 + (x - 7)",T(3.0),T(0.0),T(2.0 + (3.0 - 7.0))),
1611 test_xy<T>("2 - (x + 7)",T(3.0),T(0.0),T(2.0 - (3.0 + 7.0))),
1612 test_xy<T>("2 - (x - 7)",T(3.0),T(0.0),T(2.0 - (3.0 - 7.0))),
1613 test_xy<T>("2 * (x * 7)",T(3.0),T(0.0),T(2.0 * (3.0 * 7.0))),
1614 test_xy<T>("2 * (x / 7)",T(3.0),T(0.0),T(2.0 * (3.0 / 7.0))),
1615 test_xy<T>("2 / (x * 7)",T(3.0),T(0.0),T(2.0 / (3.0 * 7.0))),
1616 test_xy<T>("2 / (x / 7)",T(3.0),T(0.0),T(2.0 / (3.0 / 7.0))),
1617 test_xy<T>("2 + (7 + x)",T(3.0),T(0.0),T(2.0 + (7.0 + 3.0))),
1618 test_xy<T>("2 + (7 - x)",T(3.0),T(0.0),T(2.0 + (7.0 - 3.0))),
1619 test_xy<T>("2 - (7 + x)",T(3.0),T(0.0),T(2.0 - (7.0 + 3.0))),
1620 test_xy<T>("2 - (7 - x)",T(3.0),T(0.0),T(2.0 - (7.0 - 3.0))),
1621 test_xy<T>("2 * (7 * x)",T(3.0),T(0.0),T(2.0 * (7.0 * 3.0))),
1622 test_xy<T>("2 * (7 / x)",T(3.0),T(0.0),T(2.0 * (7.0 / 3.0))),
1623 test_xy<T>("2 / (7 * x)",T(3.0),T(0.0),T(2.0 / (7.0 * 3.0))),
1624 test_xy<T>("2 / (7 / x)",T(3.0),T(0.0),T(2.0 / (7.0 / 3.0))),
1625 test_xy<T>("(x + 2) + 7",T(3.0),T(0.0),T((3.0 + 2.0) + 7.0)),
1626 test_xy<T>("(x + 2) - 7",T(3.0),T(0.0),T((3.0 + 2.0) - 7.0)),
1627 test_xy<T>("(x - 2) + 7",T(3.0),T(0.0),T((3.0 - 2.0) + 7.0)),
1628 test_xy<T>("(x - 2) - 7",T(3.0),T(0.0),T((3.0 - 2.0) - 7.0)),
1629 test_xy<T>("(x * 2) * 7",T(3.0),T(0.0),T((3.0 * 2.0) * 7.0)),
1630 test_xy<T>("(x * 2) / 7",T(3.0),T(0.0),T((3.0 * 2.0) / 7.0)),
1631 test_xy<T>("(x / 2) * 7",T(3.0),T(0.0),T((3.0 / 2.0) * 7.0)),
1632 test_xy<T>("(x / 2) / 7",T(3.0),T(0.0),T((3.0 / 2.0) / 7.0)),
1633 test_xy<T>("((2 + x) + (3 + y))",T(7.0),T(9.0),T(((2.0 + 7.0) + (3.0 + 9.0)))),
1634 test_xy<T>("((2 + x) - (3 + y))",T(7.0),T(9.0),T(((2.0 + 7.0) - (3.0 + 9.0)))),
1635 test_xy<T>("((2 - x) - (3 - y))",T(7.0),T(9.0),T(((2.0 - 7.0) - (3.0 - 9.0)))),
1636 test_xy<T>("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
1637 test_xy<T>("((x + 2) + (y + 3))",T(7.0),T(9.0),T(((7.0 + 2.0) + (9.0 + 3.0)))),
1638 test_xy<T>("((x + 2) - (y + 3))",T(7.0),T(9.0),T(((7.0 + 2.0) - (9.0 + 3.0)))),
1639 test_xy<T>("((x - 2) - (y - 3))",T(7.0),T(9.0),T(((7.0 - 2.0) - (9.0 - 3.0)))),
1640 test_xy<T>("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
1641 test_xy<T>("((2 + x) + (y + 3))",T(7.0),T(9.0),T(((2.0 + 7.0) + (9.0 + 3.0)))),
1642 test_xy<T>("((2 + x) - (y + 3))",T(7.0),T(9.0),T(((2.0 + 7.0) - (9.0 + 3.0)))),
1643 test_xy<T>("((2 - x) - (y - 3))",T(7.0),T(9.0),T(((2.0 - 7.0) - (9.0 - 3.0)))),
1644 test_xy<T>("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
1645 test_xy<T>("((x + 2) + (3 + y))",T(7.0),T(9.0),T(((7.0 + 2.0) + (3.0 + 9.0)))),
1646 test_xy<T>("((x + 2) - (3 + y))",T(7.0),T(9.0),T(((7.0 + 2.0) - (3.0 + 9.0)))),
1647 test_xy<T>("((x - 2) - (3 - y))",T(7.0),T(9.0),T(((7.0 - 2.0) - (3.0 - 9.0)))),
1648 test_xy<T>("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
1649 test_xy<T>("((2 * x) / (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) / (3.0 * 9.0)))),
1650 test_xy<T>("((2 / x) * (3 / y))",T(7.0),T(9.0),T(((2.0 / 7.0) * (3.0 / 9.0)))),
1651 test_xy<T>("((2 * x) / (3 / y))",T(7.0),T(9.0),T(((2.0 * 7.0) / (3.0 / 9.0)))),
1652 test_xy<T>("((2 / x) / (3 * y))",T(7.0),T(9.0),T(((2.0 / 7.0) / (3.0 * 9.0)))),
1653 test_xy<T>("((x * 2) / (y * 3))",T(7.0),T(9.0),T(((7.0 * 2.0) / (9.0 * 3.0)))),
1654 test_xy<T>("((x / 2) * (y / 3))",T(7.0),T(9.0),T(((7.0 / 2.0) * (9.0 / 3.0)))),
1655 test_xy<T>("((x * 2) / (y / 3))",T(7.0),T(9.0),T(((7.0 * 2.0) / (9.0 / 3.0)))),
1656 test_xy<T>("((x / 2) / (y * 3))",T(7.0),T(9.0),T(((7.0 / 2.0) / (9.0 * 3.0)))),
1657 test_xy<T>("((2 * x) / (y * 3))",T(7.0),T(9.0),T(((2.0 * 7.0) / (9.0 * 3.0)))),
1658 test_xy<T>("((2 / x) * (y / 3))",T(7.0),T(9.0),T(((2.0 / 7.0) * (9.0 / 3.0)))),
1659 test_xy<T>("((2 * x) / (y / 3))",T(7.0),T(9.0),T(((2.0 * 7.0) / (9.0 / 3.0)))),
1660 test_xy<T>("((2 / x) / (y * 3))",T(7.0),T(9.0),T(((2.0 / 7.0) / (9.0 * 3.0)))),
1661 test_xy<T>("((x * 2) / (3 * y))",T(7.0),T(9.0),T(((7.0 * 2.0) / (3.0 * 9.0)))),
1662 test_xy<T>("((x / 2) * (3 / y))",T(7.0),T(9.0),T(((7.0 / 2.0) * (3.0 / 9.0)))),
1663 test_xy<T>("((x * 2) / (3 / y))",T(7.0),T(9.0),T(((7.0 * 2.0) / (3.0 / 9.0)))),
1664 test_xy<T>("((x / 2) / (3 * y))",T(7.0),T(9.0),T(((7.0 / 2.0) / (3.0 * 9.0)))),
1665 test_xy<T>("([(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))),
1666 test_xy<T>("([(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))),
1667 test_xy<T>("([(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))),
1668 test_xy<T>("([(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))),
1669 test_xy<T>("([(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))),
1670 test_xy<T>("([(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))),
1671 test_xy<T>("([(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))),
1672 test_xy<T>("([(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))),
1673 test_xy<T>("([(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))),
1674 test_xy<T>("([(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))),
1675 test_xy<T>("([(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))),
1676 test_xy<T>("([(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))),
1677 test_xy<T>("([(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))),
1678 test_xy<T>("([(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))),
1679 test_xy<T>("([(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))),
1680 test_xy<T>("([(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))),
1681 test_xy<T>("(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))))),
1682 test_xy<T>("(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))))),
1683 test_xy<T>("(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))))),
1684 test_xy<T>("(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))))),
1685 test_xy<T>("(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))))),
1686 test_xy<T>("(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))))),
1687 test_xy<T>("(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))))),
1688 test_xy<T>("(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))))),
1689 test_xy<T>("(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))))),
1690 test_xy<T>("(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))))),
1691 test_xy<T>("(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))))),
1692 test_xy<T>("(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))))),
1693 test_xy<T>("(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))))),
1694 test_xy<T>("(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))))),
1695 test_xy<T>("(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))))),
1696 test_xy<T>("(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))))),
1697 test_xy<T>("((2 * x) + (2 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) + (2.0 * 9.0)))),
1698 test_xy<T>("((2 * x) - (2 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) - (2.0 * 9.0)))),
1699 test_xy<T>("((2 * x) + (y * 2))",T(7.0),T(9.0),T(((2.0 * 7.0) + (9.0 * 2.0)))),
1700 test_xy<T>("((x * 2) - (y * 2))",T(7.0),T(9.0),T(((7.0 * 2.0) - (9.0 * 2.0)))),
1701 test_xy<T>("0 * (abs (x) + acos (y) + asin (x) + atan (y))",T(1.0),T(1.0),T(0.0)),
1702 test_xy<T>("0 * (ceil (x) + cos (y) + cosh (x) + exp (y))",T(1.0),T(1.0),T(0.0)),
1703 test_xy<T>("0 * (floor(x) + log (y) + log10(x) + round(y))",T(1.0),T(1.0),T(0.0)),
1704 test_xy<T>("0 * (sin (x) + sinh (y) + sqrt (x) + tan (y))",T(1.0),T(1.0),T(0.0)),
1705 test_xy<T>("0 * (sec (x) + csc (y) + tanh (x) + cot (y))",T(1.0),T(1.0),T(0.0)),
1706 test_xy<T>("0 * (erf (x) + erfc (y) + sgn (y) + frac (y))",T(1.0),T(1.0),T(0.0)),
1707 test_xy<T>("0 * (log1p(x) + expm1(y) + acosh(x) + asinh(y))",T(1.0),T(1.0),T(0.0)),
1708 test_xy<T>("0 * (deg2grad(x) + grad2deg(y) + rad2deg(x) + deg2rad(y))",T(1.0),T(1.0),T(0.0)),
1709 test_xy<T>("switch { case (x <= y) : (y - x); default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1710 test_xy<T>("switch { case (x > y) : 0; case (x <= y) : (y - x); default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1711 test_xy<T>("switch { case (x <= y) : switch { case (x <= y) : (y - x); default: 1.12345; }; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1712 test_xy<T>("switch { case [x <= y] : [y - x]; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1713 test_xy<T>("switch { case [x > y] : 0; case [x <= y] : [y - x]; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1714 test_xy<T>("switch { case [x <= y] : switch { case [x <= y] : {y - x}; default: 1.12345; }; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1715 test_xy<T>("switch { case {x <= y} : x; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1716 test_xy<T>("switch { case {x > y} : 0; case {x <= y} : {y - x}; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1717 test_xy<T>("switch { case {x <= y} : switch { case {x <= y} : x; default: 1.12345; }; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1718 test_xy<T>("switch { case [(x <= y)] : {y - x}; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1719 test_xy<T>("switch { case ([x > y]) : [0]; case ([x <= y]) : [y - x]; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1720 test_xy<T>("switch { case {(x <= y)} : switch { case ({x <= y}) : x; default: 1.12345; }; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1721 test_xy<T>("[*]{ case x < y : x + y; case y < x : y - x; }",T(2.0),T(3.0),T(5.0)),
1722 test_xy<T>("[*]{ case x > y : x + y; case y > x : y - x; }",T(2.0),T(3.0),T(1.0)),
1723 test_xy<T>("[*]{ case x > y : x - y; case y < x : y + x; }",T(2.0),T(3.0),T(0.0)),
1724 test_xy<T>("0 ? x : y" ,T(1.0),T(2.0),T( 2.0)),
1725 test_xy<T>("1 ? x : y" ,T(1.0),T(2.0),T( 1.0)),
1726 test_xy<T>("x ? x : y" ,T(1.0),T(2.0),T( 1.0)),
1727 test_xy<T>("x ? x : y" ,T(0.0),T(2.0),T( 2.0)),
1728 test_xy<T>("(x + y < 4) ? 1 : 2" ,T(1.0),T(2.0),T( 1.0)),
1729 test_xy<T>("(x + y > 4) ? 1 : 2" ,T(1.0),T(2.0),T( 2.0)),
1730 test_xy<T>("x < y ? x + y : x - y" ,T(1.0),T(2.0),T( 3.0)),
1731 test_xy<T>("x > y ? x + y : x - y" ,T(1.0),T(2.0),T(-1.0)),
1732 test_xy<T>("(x + x < y ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
1733 test_xy<T>("(x + x < y + y ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
1734 test_xy<T>("(x > y + y ? 7 : 9) == 9" ,T(1.0),T(3.0),T( 1.0)),
1735 test_xy<T>("(x + x > y ? 7 : 9) == 9" ,T(1.0),T(3.0),T( 1.0)),
1736 test_xy<T>("(x + x > y + 3 ? 7 : 9) == 9" ,T(1.0),T(3.0),T( 1.0)),
1737 test_xy<T>("(x < (y + y) ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
1738 test_xy<T>("((x + x) < y ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
1739 test_xy<T>("((x + x) < (y + y) ? 7 : 9) == 7",T(1.0),T(3.0),T( 1.0)),
1740 test_xy<T>("(x += 2 ) == 3 " ,T(1),T(3),T(1)),
1741 test_xy<T>("(x += 2y) == 7 " ,T(1),T(3),T(1)),
1742 test_xy<T>("(x -= 2 ) == -1 " ,T(1),T(3),T(1)),
1743 test_xy<T>("(x -= 2y) == -5 " ,T(1),T(3),T(1)),
1744 test_xy<T>("(x *= 2 ) == 2 " ,T(1),T(3),T(1)),
1745 test_xy<T>("(x *= 2y) == 6 " ,T(1),T(3),T(1)),
1746 test_xy<T>("(x /= 2 ) == (1/2)" ,T(1),T(3),T(1)),
1747 test_xy<T>("(x /= 2y) == (1/6)" ,T(1),T(3),T(1)),
1748 test_xy<T>("for(var i := 0; (i < 10);) { i += 1; }; x;" ,T(1),T(20),T( 1)),
1749 test_xy<T>("for(var i := 0; (i < 10) and (i != y); i+=2) { x += i; }; x;" ,T(1),T(20),T(21)),
1750 test_xy<T>("for(var i := 0; (i < 10) and (i != y);) { x += i; i+=2; }; x;",T(1),T(20),T(21)),
1751 test_xy<T>("for(var i := 0; (i < y); i += 1) { if (i <= (y / 2)) x += i; else break; }; x;" ,T(0),T(10),T(15)),
1752 test_xy<T>("for(var i := 0; (i < y); i += 1) { if (i <= (y / 2)) continue; else x += i; }; x;" ,T(0),T(10),T(30)),
1753 test_xy<T>("var a := 2; (0 * a) == 0",T(0),T(0),T(1)),
1754 test_xy<T>("var a := 2; (0 / a) == 0",T(0),T(0),T(1)),
1755 test_xy<T>("var a := 2; (a * 0) == 0",T(0),T(0),T(1)),
1756 test_xy<T>("var a := 2; (a / 1) == a",T(0),T(0),T(1)),
1757 test_xy<T>("var a := 2; (0 + a) == a",T(0),T(0),T(1)),
1758 test_xy<T>("var a := 2; (a + 0) == a",T(0),T(0),T(1)),
1759 test_xy<T>("var a := 2; (1 * a) == a",T(0),T(0),T(1)),
1760 test_xy<T>("var a.b := 3; (2 * a.b ) == 6",T(0),T(0),T(1)),
1761 test_xy<T>("var aa.bb := 3; (2 * aa.bb ) == 6",T(0),T(0),T(1)),
1762 test_xy<T>("var aaa.bbb := 3; (2 * aAa.BbB) == 6",T(0),T(0),T(1)),
1763 test_xy<T>("var a1.b2 := 3; (2 * a1.b2 ) == 6",T(0),T(0),T(1))
1764 };
1765
1766 static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_xy<T>);
1767
1768 const std::size_t rounds = 60;
1769
1770 for (std::size_t r = 0; r < rounds; ++r)
1771 {
1772 bool loop_result = true;
1773
1774 for (std::size_t i = 0; i < test_list_size; ++i)
1775 {
1776 test_xy<T>& test = const_cast<test_xy<T>&>(test_list[i]);
1777
1778 T x = test.x;
1779 T y = test.y;
1780
1781 exprtk::symbol_table<T> symbol_table;
1782 symbol_table.add_variable("x",x);
1783 symbol_table.add_variable("y",y);
1784
1785 exprtk::expression<T> expression;
1786 expression.register_symbol_table(symbol_table);
1787
1788 {
1789 exprtk::parser<T> parser;
1790
1791 if (!parser.compile(test.expr,expression))
1792 {
1793 printf("run_test01() - Error: %s Expression: %s\n",
1794 parser.error().c_str(),
1795 test.expr.c_str());
1796
1797 loop_result = false;
1798
1799 continue;
1800 }
1801 }
1802
1803 const T result = expression.value();
1804
1805 if (not_equal(result,test.result))
1806 {
1807 printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
1808 test.expr.c_str(),
1809 static_cast<double>(test.result),
1810 static_cast<double>(result));
1811
1812 loop_result = false;
1813 }
1814 }
1815
1816 if (!loop_result)
1817 {
1818 return false;
1819 }
1820 }
1821 }
1822
1823 {
1824 static const test_xyzw<T> test_list[] =
1825 {
1826 test_xyzw<T>("((x / y) / z )",T(7.0),T(9.0),T(3.0),T(0.0),T(((7.0 / 9.0) / 3.0 ))),
1827 test_xyzw<T>("((x / y) / 2 )",T(7.0),T(9.0),T(3.0),T(0.0),T(((7.0 / 9.0) / 2.0 ))),
1828 test_xyzw<T>("((x / 2) / y )",T(7.0),T(9.0),T(3.0),T(0.0),T(((7.0 / 2.0) / 9.0 ))),
1829 test_xyzw<T>("((2 / x) / y )",T(7.0),T(9.0),T(3.0),T(0.0),T(((2.0 / 7.0) / 9.0 ))),
1830 test_xyzw<T>("( x / (y / z))",T(7.0),T(9.0),T(3.0),T(0.0),T(( 7.0 / (9.0 / 3.0)))),
1831 test_xyzw<T>("( x / (y / 2))",T(7.0),T(9.0),T(3.0),T(0.0),T(( 7.0 / (9.0 / 2.0)))),
1832 test_xyzw<T>("( x / (2 / y))",T(7.0),T(9.0),T(3.0),T(0.0),T(( 7.0 / (2.0 / 9.0)))),
1833 test_xyzw<T>("( 2 / (x / y))",T(7.0),T(9.0),T(3.0),T(0.0),T(( 2.0 / (7.0 / 9.0)))),
1834 test_xyzw<T>("([(min(x,y) + z) + 3] - 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) + 3.0) - 4.0))),
1835 test_xyzw<T>("([(min(x,y) + z) + 3] + 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) + 3.0) + 4.0))),
1836 test_xyzw<T>("([(min(x,y) + z) + 3] * 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) + 3.0) * 4.0))),
1837 test_xyzw<T>("([(min(x,y) + z) + 3] / 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) + 3.0) / 4.0))),
1838 test_xyzw<T>("([(min(x,y) + z) - 3] - 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) - 3.0) - 4.0))),
1839 test_xyzw<T>("([(min(x,y) + z) - 3] + 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) - 3.0) + 4.0))),
1840 test_xyzw<T>("([(min(x,y) + z) - 3] * 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) - 3.0) * 4.0))),
1841 test_xyzw<T>("([(min(x,y) + z) - 3] / 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) - 3.0) / 4.0))),
1842 test_xyzw<T>("([(min(x,y) + z) * 3] - 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) * 3.0) - 4.0))),
1843 test_xyzw<T>("([(min(x,y) + z) * 3] + 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) * 3.0) + 4.0))),
1844 test_xyzw<T>("([(min(x,y) + z) * 3] * 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) * 3.0) * 4.0))),
1845 test_xyzw<T>("([(min(x,y) + z) * 3] / 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) * 3.0) / 4.0))),
1846 test_xyzw<T>("([(min(x,y) + z) / 3] - 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) / 3.0) - 4.0))),
1847 test_xyzw<T>("([(min(x,y) + z) / 3] + 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) / 3.0) + 4.0))),
1848 test_xyzw<T>("([(min(x,y) + z) / 3] * 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) / 3.0) * 4.0))),
1849 test_xyzw<T>("([(min(x,y) + z) / 3] / 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) / 3.0) / 4.0))),
1850 test_xyzw<T>("(4 - [3 + (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 - (3.0 + (std::min(5.0,7.0) + 9.0))))),
1851 test_xyzw<T>("(4 + [3 + (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 + (3.0 + (std::min(5.0,7.0) + 9.0))))),
1852 test_xyzw<T>("(4 * [3 + (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 * (3.0 + (std::min(5.0,7.0) + 9.0))))),
1853 test_xyzw<T>("(4 / [3 + (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 / (3.0 + (std::min(5.0,7.0) + 9.0))))),
1854 test_xyzw<T>("(4 - [3 - (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 - (3.0 - (std::min(5.0,7.0) + 9.0))))),
1855 test_xyzw<T>("(4 + [3 - (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 + (3.0 - (std::min(5.0,7.0) + 9.0))))),
1856 test_xyzw<T>("(4 * [3 - (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 * (3.0 - (std::min(5.0,7.0) + 9.0))))),
1857 test_xyzw<T>("(4 / [3 - (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 / (3.0 - (std::min(5.0,7.0) + 9.0))))),
1858 test_xyzw<T>("(4 - [3 * (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 - (3.0 * (std::min(5.0,7.0) + 9.0))))),
1859 test_xyzw<T>("(4 + [3 * (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 + (3.0 * (std::min(5.0,7.0) + 9.0))))),
1860 test_xyzw<T>("(4 * [3 * (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 * (3.0 * (std::min(5.0,7.0) + 9.0))))),
1861 test_xyzw<T>("(4 / [3 * (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 / (3.0 * (std::min(5.0,7.0) + 9.0))))),
1862 test_xyzw<T>("(4 - [3 / (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 - (3.0 / (std::min(5.0,7.0) + 9.0))))),
1863 test_xyzw<T>("(4 + [3 / (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 + (3.0 / (std::min(5.0,7.0) + 9.0))))),
1864 test_xyzw<T>("(4 * [3 / (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 * (3.0 / (std::min(5.0,7.0) + 9.0))))),
1865 test_xyzw<T>("(4 / [3 / (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 / (3.0 / (std::min(5.0,7.0) + 9.0))))),
1866 test_xyzw<T>("if (x < y) { z+2; z;} == z" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
1867 test_xyzw<T>("if (x > y) { z+2; z;} == null" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
1868 test_xyzw<T>("if (x < y) { z+2; z;} else w; == z" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
1869 test_xyzw<T>("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)),
1870 test_xyzw<T>("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)),
1871 test_xyzw<T>("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)),
1872 test_xyzw<T>("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)),
1873 test_xyzw<T>("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)),
1874 test_xyzw<T>("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)),
1875 test_xyzw<T>("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)),
1876 test_xyzw<T>("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)),
1877 test_xyzw<T>("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))
1878 };
1879
1880 static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_xyzw<T>);
1881
1882 const std::size_t rounds = 60;
1883
1884 for (std::size_t r = 0; r < rounds; ++r)
1885 {
1886 bool loop_result = true;
1887 for (std::size_t i = 0; i < test_list_size; ++i)
1888 {
1889 test_xyzw<T>& test = const_cast<test_xyzw<T>&>(test_list[i]);
1890
1891 exprtk::symbol_table<T> symbol_table;
1892 symbol_table.add_variable("x",test.x);
1893 symbol_table.add_variable("y",test.y);
1894 symbol_table.add_variable("z",test.z);
1895 symbol_table.add_variable("w",test.w);
1896
1897 exprtk::expression<T> expression;
1898 expression.register_symbol_table(symbol_table);
1899
1900 {
1901 exprtk::parser<T> parser;
1902
1903 if (!parser.compile(test.expr,expression))
1904 {
1905 printf("run_test01() - Error: %s Expression: %s\n",
1906 parser.error().c_str(),
1907 test.expr.c_str());
1908
1909 loop_result = false;
1910
1911 continue;
1912 }
1913 }
1914
1915 const T result = expression.value();
1916
1917 if (not_equal(result,test.result))
1918 {
1919 printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
1920 test.expr.c_str(),
1921 static_cast<double>(test.result),
1922 static_cast<double>(result));
1923
1924 loop_result = false;
1925 }
1926 }
1927
1928 if (!loop_result)
1929 {
1930 return false;
1931 }
1932 }
1933 }
1934
1935 {
1936 const std::string expr_list[] =
1937 {
1938 "((v[1] + x) == (x + v[1]))",
1939 "((v[0] += x) == x)",
1940 "((v[0] += x + y) == (x + y))",
1941 "((v[0] -= x) == -x)",
1942 "((v[0] -= (x + y)) == -(x + y))",
1943 "((v[1] + v[2]) == (v[3 - 1] + v[2 * 1/2]))",
1944 "(v[v[1]] == v[1])",
1945 "(v[1] += v[1]) == v[1 + 1]",
1946 "((v[i[1]] + x) == (x + v[i[1]]))",
1947 "((v[i[0]] += x) == x)",
1948 "((v[i[0]] += x + y) == (x + y))",
1949 "((v[i[0]] -= x) == -x)",
1950 "((v[i[0]] -= (x + y)) == -(x + y))",
1951 "((v[i[1]] + v[2]) == (v[i[3] - i[1]] + v[i[2] * 1/2]))",
1952 "(v[v[i[1]]] == v[i[1]])",
1953 "(v[i[1]] += v[i[1]]) == v[i[1] + 1]"
1954 };
1955
1956 const std::size_t expr_list_size = sizeof(expr_list) / sizeof(std::string);
1957
1958 const std::size_t rounds = 60;
1959
1960 for (std::size_t r = 0; r < rounds; ++r)
1961 {
1962 bool loop_result = true;
1963
1964 for (std::size_t i = 0; i < expr_list_size; ++i)
1965 {
1966 T v[] = { T(0.0), T(1.1), T(2.2), T(3.3), T(4.4), T(5.5) };
1967 T index[] = { T(0) , T(1) , T(2) , T(3) , T(4) , T(5) };
1968
1969 T x = T(6.6);
1970 T y = T(7.7);
1971 T z = T(8.8);
1972
1973 exprtk::symbol_table<T> symbol_table;
1974 symbol_table.add_variable("x",x);
1975 symbol_table.add_variable("y",y);
1976 symbol_table.add_variable("z",z);
1977 symbol_table.add_vector ("v",v);
1978 symbol_table.add_vector ("i",index);
1979
1980 exprtk::expression<T> expression;
1981 expression.register_symbol_table(symbol_table);
1982
1983 {
1984 exprtk::parser<T> parser;
1985
1986 if (!parser.compile(expr_list[i],expression))
1987 {
1988 printf("run_test01() - Error: %s Expression: %s\n",
1989 parser.error().c_str(),
1990 expr_list[i].c_str());
1991
1992 loop_result = false;
1993
1994 continue;
1995 }
1996 }
1997
1998 const T result = expression.value();
1999
2000 if (not_equal(result,T(1)))
2001 {
2002 printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
2003 expr_list[i].c_str(),
2004 static_cast<double>(1.0),
2005 static_cast<double>(result));
2006
2007 loop_result = false;
2008 }
2009 }
2010
2011 if (!loop_result)
2012 {
2013 return false;
2014 }
2015 }
2016
2017 for (std::size_t r = 0; r < rounds; ++r)
2018 {
2019 bool loop_result = true;
2020
2021 for (std::size_t i = 0; i < expr_list_size; ++i)
2022 {
2023 T v_[] = { T(0.0), T(1.1), T(2.2), T(3.3), T(4.4), T(5.5) };
2024 T index_[] = { T(0) , T(1) , T(2) , T(3) , T(4) , T(5) };
2025
2026 T x = T(6.6);
2027 T y = T(7.7);
2028 T z = T(8.8);
2029
2032
2033 exprtk::symbol_table<T> symbol_table;
2034 symbol_table.add_variable("x",x);
2035 symbol_table.add_variable("y",y);
2036 symbol_table.add_variable("z",z);
2037 symbol_table.add_vector ("v",v);
2038 symbol_table.add_vector ("i",index);
2039
2040 exprtk::expression<T> expression;
2041 expression.register_symbol_table(symbol_table);
2042
2043 {
2044 exprtk::parser<T> parser;
2045
2046 if (!parser.compile(expr_list[i],expression))
2047 {
2048 printf("run_test01() - Error: %s Expression: %s\n",
2049 parser.error().c_str(),
2050 expr_list[i].c_str());
2051
2052 loop_result = false;
2053
2054 continue;
2055 }
2056 }
2057
2058 const T result = expression.value();
2059
2060 if (not_equal(result,T(1)))
2061 {
2062 printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
2063 expr_list[i].c_str(),
2064 static_cast<double>(1.0),
2065 static_cast<double>(result));
2066 loop_result = false;
2067 }
2068 }
2069
2070 if (!loop_result)
2071 {
2072 return false;
2073 }
2074 }
2075 }
2076
2077 return true;
2078}
bool register_symbol_table(symbol_table< T > &st)
Definition exprtk.hpp:21726
bool compile(const std::string &expression_string, expression< T > &expr)
Definition exprtk.hpp:24443
std::string error() const
Definition exprtk.hpp:24722
bool add_variable(const std::string &variable_name, T &t, const bool is_constant=false)
Definition exprtk.hpp:20770
bool add_vector(const std::string &vector_name, T(&v)[N])
Definition exprtk.hpp:20974
bool not_equal(const T &t0, const T &t1, const T &epsilon=T(0.0000000001))
vector_view< T > make_vector_view(T *data, const std::size_t size, const std::size_t offset=0)
Definition exprtk.hpp:4660
std::string expr
std::string expr

References exprtk::symbol_table< T >::add_variable(), exprtk::symbol_table< T >::add_vector(), exprtk::parser< T >::compile(), exprtk::parser< T >::error(), test_xy< T >::expr, test_xyzw< T >::expr, exprtk::make_vector_view(), not_equal(), exprtk::expression< T >::register_symbol_table(), test_xy< T >::result, test_xyzw< T >::result, rounds, exprtk::expression< T >::value(), test_xyzw< T >::w, test_xy< T >::x, test_xyzw< T >::x, test_xy< T >::y, test_xyzw< T >::y, and test_xyzw< T >::z.

Here is the call graph for this function:

◆ run_test02()

template<typename T >
bool run_test02 ( )
inline

Definition at line 2099 of file exprtk_real_test.cpp.

2100{
2101 static const test_ab<T> test_list[] =
2102 {
2103 test_ab<T>("'aaa' == 'aaa'" ,"","",T(1.0)),
2104 test_ab<T>("'aaa' < 'bbb'" ,"","",T(1.0)),
2105 test_ab<T>("'aaa' <= 'bbb'" ,"","",T(1.0)),
2106 test_ab<T>("'bbb' > 'aaa'" ,"","",T(1.0)),
2107 test_ab<T>("'bbb' >= 'aaa'" ,"","",T(1.0)),
2108 test_ab<T>("'aaa' != 'aaa'" ,"","",T(0.0)),
2109 test_ab<T>("'aaa' != 'bbb'" ,"","",T(1.0)),
2110 test_ab<T>("'aaa' + '123' == 'aaa123'" ,"","",T(1.0)),
2111 test_ab<T>("'aaa123' == 'aaa' + '123'" ,"","",T(1.0)),
2112 test_ab<T>("('aaa' + '123') == 'aaa123'" ,"","",T(1.0)),
2113 test_ab<T>("'aaa123' == ('aaa' + '123')" ,"","",T(1.0)),
2114 test_ab<T>("'aaa' in 'aaa123'" ,"","",T(1.0)),
2115 test_ab<T>("'123' in 'aaa123'" ,"","",T(1.0)),
2116 test_ab<T>("'a123b' like '*123*'" ,"","",T(1.0)),
2117 test_ab<T>("'a123b' like '*123?'" ,"","",T(1.0)),
2118 test_ab<T>("'1XYZ2' ilike '*xyz*'" ,"","",T(1.0)),
2119 test_ab<T>("'1XYZ2' ilike '*xyz?'" ,"","",T(1.0)),
2120 test_ab<T>("inrange('aaa','bbb','ccc')" ,"","",T(1.0)),
2121 test_ab<T>("a == b" ,"aaa","aaa",T(1.0)),
2122 test_ab<T>("a != b" ,"aaa","bbb",T(1.0)),
2123 test_ab<T>("a < b" ,"aaa","bbb",T(1.0)),
2124 test_ab<T>("a <= b" ,"aaa","bbb",T(1.0)),
2125 test_ab<T>("b > a" ,"aaa","bbb",T(1.0)),
2126 test_ab<T>("b >= a" ,"aaa","bbb",T(1.0)),
2127 test_ab<T>("a in b" ,"aaa","aaa123",T(1.0)),
2128 test_ab<T>("a in b" ,"123","aaa123",T(1.0)),
2129 test_ab<T>("a == 'aaa'" ,"aaa","aaa",T(1.0)),
2130 test_ab<T>("'aaa' == a" ,"aaa","aaa",T(1.0)),
2131 test_ab<T>("a != 'bbb'" ,"aaa","bbb",T(1.0)),
2132 test_ab<T>("'bbb' != a" ,"aaa","bbb",T(1.0)),
2133 test_ab<T>("a < 'bbb'" ,"aaa","bbb",T(1.0)),
2134 test_ab<T>("a <= 'bbb'" ,"aaa","bbb",T(1.0)),
2135 test_ab<T>("'bbb' > a" ,"aaa","bbb",T(1.0)),
2136 test_ab<T>("'bbb' >= a" ,"aaa","bbb",T(1.0)),
2137 test_ab<T>("a in 'aaa123'" ,"aaa","aaa123",T(1.0)),
2138 test_ab<T>("a in 'aaa123'" ,"123","aaa123",T(1.0)),
2139 test_ab<T>("'aaa' in b" ,"aaa","aaa123",T(1.0)),
2140 test_ab<T>("'123' in b" ,"aaa","aaa123",T(1.0)),
2141 test_ab<T>("(a < b) or (a == b)" ,"aaa","bbb",T(1.0)),
2142 test_ab<T>("(a == b) or (a < b)" ,"aaa","bbb",T(1.0)),
2143 test_ab<T>("(b > a) or (b == a)" ,"aaa","bbb",T(1.0)),
2144 test_ab<T>("(b == a) or (b > a)" ,"aaa","bbb",T(1.0)),
2145 test_ab<T>("(a < b) and (b > a)" ,"aaa","bbb",T(1.0)),
2146 test_ab<T>("a like '*123*'" ,"a123b","",T(1.0)),
2147 test_ab<T>("a like '*123?'" ,"a123b","",T(1.0)),
2148 test_ab<T>("'a123b' like b" ,"a123b","*123*",T(1.0)),
2149 test_ab<T>("'a123b' like b" ,"a123b","*123?",T(1.0)),
2150 test_ab<T>("a ilike '*xyz*'" ,"1XYZ2","",T(1.0)),
2151 test_ab<T>("a ilike '*xyz?'" ,"1XYZ2","",T(1.0)),
2152 test_ab<T>("'1XYZ2' ilike b" ,"","*xyz*",T(1.0)),
2153 test_ab<T>("'1XYZ2' ilike b" ,"","*xyz?",T(1.0)),
2154 test_ab<T>("inrange(a,'bbb',c)" ,"aaa","bbb",T(1.0)),
2155 test_ab<T>("inrange('aaa',b,'ccc')" ,"aaa","bbb",T(1.0)),
2156 test_ab<T>("inrange(a,b,c)" ,"aaa","bbb",T(1.0)),
2157 test_ab<T>("inrange(a,b,'ccc')" ,"aaa","bbb",T(1.0)),
2158 test_ab<T>("inrange('aaa',b,c)" ,"aaa","bbb",T(1.0)),
2159 test_ab<T>("inrange('aaa',b,c)" ,"aaa","bbb",T(1.0)),
2160 test_ab<T>("(a < b ? a : b) == a" ,"aaa","bbb",T(1.0)),
2161 test_ab<T>("(a > b ? a : b) == b" ,"aaa","bbb",T(1.0)),
2162 test_ab<T>("(a == (a + '1') ? a : b) == b" ,"aaa","bbb",T(1.0)),
2163 test_ab<T>("((a + '2') != a ? a : b) == a" ,"aaa","bbb",T(1.0)),
2164 test_ab<T>("(a < b ? a + '1' : b) == 'aaa1'","aaa","bbb",T(1.0)),
2165 test_ab<T>("(a > b ? a : b + '2') == 'bbb2'","aaa","bbb",T(1.0)),
2166 test_ab<T>("b == (a == (a + '1') ? a : b)" ,"aaa","bbb",T(1.0)),
2167 test_ab<T>("a == (a != (a + '2') ? a : b)" ,"aaa","bbb",T(1.0)),
2168 test_ab<T>("'aaa1' == (a < b ? a + '1' : b)","aaa","bbb",T(1.0)),
2169 test_ab<T>("'bbb2' == (a > b ? a : b + '2')","aaa","bbb",T(1.0)),
2170 test_ab<T>("(a < b ? a[1:3] : b) == '23'" ,"1234","67890",T(1.0)),
2171 test_ab<T>("(a > b ? a : b[0:4]) == '6789'" ,"1234","67890",T(1.0)),
2172 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x < y ? x : y) == x }}","","",T(1.0)),
2173 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x > y ? x : y) == y }}","","",T(1.0)),
2174 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x == (x + '1') ? x : y) == y }}","","",T(1.0)),
2175 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{((x + '2') != x ? x : y) == x }}","","",T(1.0)),
2176 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x < y ? x + '1' : y) == 'xxx1'}}","","",T(1.0)),
2177 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x > y ? x : y + '2') == 'yyy2'}}","","",T(1.0)),
2178 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{y == (x == (x + '1') ? x : y) }}","","",T(1.0)),
2179 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{x == (x != (x + '2') ? x : y) }}","","",T(1.0)),
2180 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{'xxx1' == (x < y ? x + '1' : y)}}","","",T(1.0)),
2181 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{'yyy2' == (x > y ? x : y + '2')}}","","",T(1.0)),
2182 test_ab<T>("'01234567890123456789'[0:9] == '0123456789' ","","",T(1.0)),
2183 test_ab<T>("'01234567890123456789'[0:9] == '0123456789'[:] ","","",T(1.0)),
2184 test_ab<T>("'01234567890123456789'[0:9] == '0123456789'[0:]","","",T(1.0)),
2185 test_ab<T>("'01234567890123456789'[0:9] == '0123456789'[:9]","","",T(1.0)),
2186 test_ab<T>("'01234567890123456789'[:9] == '0123456789'[:9]","","",T(1.0)),
2187 test_ab<T>("'01234567890123456789'[10:] == '0123456789'[:] ","","",T(1.0)),
2188 test_ab<T>("'01234567890123456789'[0:9] != '123456789' ","","",T(1.0)),
2189 test_ab<T>("'01234567890123456789'[0:9] != '123456789'[:] ","","",T(1.0)),
2190 test_ab<T>("'01234567890123456789'[0:9] != '123456789'[0:] ","","",T(1.0)),
2191 test_ab<T>("'01234567890123456789'[0:9] != '123456789'[:8] ","","",T(1.0)),
2192 test_ab<T>("'01234567890123456789'[:9] != '123456789'[:8] ","","",T(1.0)),
2193 test_ab<T>("'01234567890123456789'[10:] != '123456789'[:] ","","",T(1.0)),
2194 test_ab<T>("'01234567890123456789'[2*6:10+6] == '23456' ","","",T(1.0)),
2195 test_ab<T>("'0123456789' == '01234567890123456789'[0:9]","","",T(1.0)),
2196 test_ab<T>("'0123456789'[:] == '01234567890123456789'[0:9]","","",T(1.0)),
2197 test_ab<T>("'0123456789'[0:] == '01234567890123456789'[0:9]","","",T(1.0)),
2198 test_ab<T>("'0123456789'[:9] == '01234567890123456789'[0:9]","","",T(1.0)),
2199 test_ab<T>("'0123456789'[:9] == '01234567890123456789'[:9] ","","",T(1.0)),
2200 test_ab<T>("'0123456789'[:] == '01234567890123456789'[10:]","","",T(1.0)),
2201 test_ab<T>("'0123456789'[3:3] == '3'[:] ","","",T(1.0)),
2202 test_ab<T>("'0123456789'[3:3] == '3'[0:0] ","","",T(1.0)),
2203 test_ab<T>("'123456789' != '01234567890123456789'[0:9]","","",T(1.0)),
2204 test_ab<T>("'123456789'[:] != '01234567890123456789'[0:9]","","",T(1.0)),
2205 test_ab<T>("'123456789'[0:] != '01234567890123456789'[0:9]","","",T(1.0)),
2206 test_ab<T>("'123456789'[:8] != '01234567890123456789'[0:9]","","",T(1.0)),
2207 test_ab<T>("'123456789'[:8] != '01234567890123456789'[:9] ","","",T(1.0)),
2208 test_ab<T>("'123456789'[:] != '01234567890123456789'[10:]","","",T(1.0)),
2209 test_ab<T>("'23456' == '01234567890123456789'[2*6:10+6] ","","",T(1.0)),
2210 test_ab<T>("'01234567890123456789'[r0: 6] == '23456' ","","",T(1.0)),
2211 test_ab<T>("'01234567890123456789'[2: r1] == '23456' ","","",T(1.0)),
2212 test_ab<T>("'01234567890123456789'[r0:3*2] == '23456' ","","",T(1.0)),
2213 test_ab<T>("'01234567890123456789'[1+1:r1] == '23456' ","","",T(1.0)),
2214 test_ab<T>("'01234567890123456789'[r0: ] == '234567890123456789' ","","",T(1.0)),
2215 test_ab<T>("'01234567890123456789'[: r1] == '0123456' ","","",T(1.0)),
2216 test_ab<T>("'01234567890123456789'[r0:r1] == '23456' ","","",T(1.0)),
2217 test_ab<T>("'01234567890123456789'[r0:r1+2] == '2345678' ","","",T(1.0)),
2218 test_ab<T>("'01234567890123456789'[r0+2:r1] == '456' ","","",T(1.0)),
2219 test_ab<T>("'01234567890123456789'[r1-r0:] == '4567890123456789' ","","",T(1.0)),
2220 test_ab<T>("'01234567890123456789'[:r1-r0] == '01234' ","","",T(1.0)),
2221 test_ab<T>("'23456' == '01234567890123456789'[r0: 6] ","","",T(1.0)),
2222 test_ab<T>("'23456' == '01234567890123456789'[2: r1] ","","",T(1.0)),
2223 test_ab<T>("'23456' == '01234567890123456789'[r0:3*2] ","","",T(1.0)),
2224 test_ab<T>("'23456' == '01234567890123456789'[1+1:r1] ","","",T(1.0)),
2225 test_ab<T>("'234567890123456789' == '01234567890123456789'[r0: ] ","","",T(1.0)),
2226 test_ab<T>("'0123456' == '01234567890123456789'[: r1] ","","",T(1.0)),
2227 test_ab<T>("'23456' == '01234567890123456789'[r0:r1] ","","",T(1.0)),
2228 test_ab<T>("'2345678' == '01234567890123456789'[r0:r1+2] ","","",T(1.0)),
2229 test_ab<T>("'456' == '01234567890123456789'[r0+2:r1] ","","",T(1.0)),
2230 test_ab<T>("'4567890123456789' == '01234567890123456789'[r1-r0:] ","","",T(1.0)),
2231 test_ab<T>("'01234' == '01234567890123456789'[:r1-r0] ","","",T(1.0)),
2232 test_ab<T>("a[r0: 6] == '23456' ","01234567890123456789","",T(1.0)),
2233 test_ab<T>("a[2: r1] == '23456' ","01234567890123456789","",T(1.0)),
2234 test_ab<T>("a[r0:3*2] == '23456' ","01234567890123456789","",T(1.0)),
2235 test_ab<T>("a[1+1:r1] == '23456' ","01234567890123456789","",T(1.0)),
2236 test_ab<T>("a[r0: ] == '234567890123456789' ","01234567890123456789","",T(1.0)),
2237 test_ab<T>("a[: r1] == '0123456' ","01234567890123456789","",T(1.0)),
2238 test_ab<T>("a[r0:r1] == '23456' ","01234567890123456789","",T(1.0)),
2239 test_ab<T>("a[r0:r1+2] == '2345678' ","01234567890123456789","",T(1.0)),
2240 test_ab<T>("a[r0+2:r1] == '456' ","01234567890123456789","",T(1.0)),
2241 test_ab<T>("a[r1-r0:] == '4567890123456789' ","01234567890123456789","",T(1.0)),
2242 test_ab<T>("a[:r1-r0] == '01234' ","01234567890123456789","",T(1.0)),
2243 test_ab<T>("'23456' == a[r0: 6] ","01234567890123456789","",T(1.0)),
2244 test_ab<T>("'23456' == a[2: r1] ","01234567890123456789","",T(1.0)),
2245 test_ab<T>("'23456' == a[r0:3*2] ","01234567890123456789","",T(1.0)),
2246 test_ab<T>("'23456' == a[1+1:r1] ","01234567890123456789","",T(1.0)),
2247 test_ab<T>("'234567890123456789' == a[r0: ] ","01234567890123456789","",T(1.0)),
2248 test_ab<T>("'0123456' == a[: r1] ","01234567890123456789","",T(1.0)),
2249 test_ab<T>("'23456' == a[r0:r1] ","01234567890123456789","",T(1.0)),
2250 test_ab<T>("'2345678' == a[r0:r1+2] ","01234567890123456789","",T(1.0)),
2251 test_ab<T>("'456' == a[r0+2:r1] ","01234567890123456789","",T(1.0)),
2252 test_ab<T>("'4567890123456789' == a[r1-r0:] ","01234567890123456789","",T(1.0)),
2253 test_ab<T>("'01234' == a[:r1-r0] ","01234567890123456789","",T(1.0)),
2254 test_ab<T>("a[r0: 6] == b ","01234567890123456789","23456",T(1.0)),
2255 test_ab<T>("a[2: r1] == b ","01234567890123456789","23456",T(1.0)),
2256 test_ab<T>("a[r0:3*2] == b ","01234567890123456789","23456",T(1.0)),
2257 test_ab<T>("a[1+1:r1] == b ","01234567890123456789","23456",T(1.0)),
2258 test_ab<T>("a[r0: ] == b ","01234567890123456789","234567890123456789",T(1.0)),
2259 test_ab<T>("a[: r1] == b ","01234567890123456789","0123456",T(1.0)),
2260 test_ab<T>("a[r0:r1] == b ","01234567890123456789","23456",T(1.0)),
2261 test_ab<T>("a[r0:r1+2] == b ","01234567890123456789","2345678",T(1.0)),
2262 test_ab<T>("a[r0+2:r1] == b ","01234567890123456789","456",T(1.0)),
2263 test_ab<T>("a[r1-r0:] == b ","01234567890123456789","4567890123456789",T(1.0)),
2264 test_ab<T>("a[:r1-r0] == b ","01234567890123456789","01234",T(1.0)),
2265 test_ab<T>("b == a[r0: 6] ","01234567890123456789","23456",T(1.0)),
2266 test_ab<T>("b == a[2: r1] ","01234567890123456789","23456",T(1.0)),
2267 test_ab<T>("b == a[r0:3*2] ","01234567890123456789","23456",T(1.0)),
2268 test_ab<T>("b == a[1+1:r1] ","01234567890123456789","23456",T(1.0)),
2269 test_ab<T>("b == a[r0: ] ","01234567890123456789","234567890123456789",T(1.0)),
2270 test_ab<T>("b == a[: r1] ","01234567890123456789","0123456",T(1.0)),
2271 test_ab<T>("b == a[r0:r1] ","01234567890123456789","23456",T(1.0)),
2272 test_ab<T>("b == a[r0:r1+2] ","01234567890123456789","2345678",T(1.0)),
2273 test_ab<T>("b == a[r0+2:r1] ","01234567890123456789","456",T(1.0)),
2274 test_ab<T>("b == a[r1-r0:] ","01234567890123456789","4567890123456789",T(1.0)),
2275 test_ab<T>("b == a[:r1-r0] ","01234567890123456789","01234",T(1.0)),
2276 test_ab<T>("'01234567890123456789'[0:9] == a ","0123456789","",T(1.0)),
2277 test_ab<T>("'01234567890123456789'[0:9] == a[:] ","0123456789","",T(1.0)),
2278 test_ab<T>("'01234567890123456789'[0:9] == a[0:] ","0123456789","",T(1.0)),
2279 test_ab<T>("'01234567890123456789'[0:9] == a[:9] ","0123456789","",T(1.0)),
2280 test_ab<T>("'01234567890123456789'[:9] == a[:9] ","0123456789","",T(1.0)),
2281 test_ab<T>("'01234567890123456789'[10:] == a[:] ","0123456789","",T(1.0)),
2282 test_ab<T>("'01234567890123456789'[0:9] != a ","123456789" ,"",T(1.0)),
2283 test_ab<T>("'01234567890123456789'[0:9] != a[:] ","123456789" ,"",T(1.0)),
2284 test_ab<T>("'01234567890123456789'[0:9] != a[0:] ","123456789" ,"",T(1.0)),
2285 test_ab<T>("'01234567890123456789'[0:9] != a[:8] ","123456789" ,"",T(1.0)),
2286 test_ab<T>("'01234567890123456789'[:9] != a[:8] ","123456789" ,"",T(1.0)),
2287 test_ab<T>("'01234567890123456789'[10:] != a[:] ","123456789" ,"",T(1.0)),
2288 test_ab<T>("'01234567890123456789'[2*6:10+6] == a","23456" ,"",T(1.0)),
2289 test_ab<T>("'23456' == a[:] ","23456" ,"",T(1.0)),
2290 test_ab<T>("a == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
2291 test_ab<T>("a[:] == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
2292 test_ab<T>("a[0:] == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
2293 test_ab<T>("a[:9] == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
2294 test_ab<T>("a[:9] == '01234567890123456789'[:9] ","0123456789","",T(1.0)),
2295 test_ab<T>("a[:] == '01234567890123456789'[10:] ","0123456789","",T(1.0)),
2296 test_ab<T>("a != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
2297 test_ab<T>("a[:] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
2298 test_ab<T>("a[0:] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
2299 test_ab<T>("a[:8] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
2300 test_ab<T>("a[:8] != '01234567890123456789'[:9] ","123456789" ,"",T(1.0)),
2301 test_ab<T>("a[:] != '01234567890123456789'[10:] ","123456789" ,"",T(1.0)),
2302 test_ab<T>("a == '01234567890123456789'[2*6:10+6]","23456" ,"",T(1.0)),
2303 test_ab<T>("a[:] == '23456' ","23456" ,"",T(1.0)),
2304 test_ab<T>("a[0:9] == b ","01234567890123456789","0123456789",T(1.0)),
2305 test_ab<T>("a[0:9] == b[:] ","01234567890123456789","0123456789",T(1.0)),
2306 test_ab<T>("a[0:9] == b[0:] ","01234567890123456789","0123456789",T(1.0)),
2307 test_ab<T>("a[0:9] == b[:9] ","01234567890123456789","0123456789",T(1.0)),
2308 test_ab<T>("a[:9] == b[:9] ","01234567890123456789","0123456789",T(1.0)),
2309 test_ab<T>("a[10:] == b[:] ","01234567890123456789","0123456789",T(1.0)),
2310 test_ab<T>("a[0:9] != b ","01234567890123456789","123456789" ,T(1.0)),
2311 test_ab<T>("a[0:9] != b[:] ","01234567890123456789","123456789" ,T(1.0)),
2312 test_ab<T>("a[0:9] != b[0:] ","01234567890123456789","123456789" ,T(1.0)),
2313 test_ab<T>("a[0:9] != b[:8] ","01234567890123456789","123456789" ,T(1.0)),
2314 test_ab<T>("a[:9] != b[:8] ","01234567890123456789","123456789" ,T(1.0)),
2315 test_ab<T>("a[10:] != b[:] ","01234567890123456789","123456789" ,T(1.0)),
2316 test_ab<T>("a[2*6:10+6] == b ","01234567890123456789","23456" ,T(1.0)),
2317 test_ab<T>("b == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
2318 test_ab<T>("b[:] == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
2319 test_ab<T>("b[0:] == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
2320 test_ab<T>("b[:9] == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
2321 test_ab<T>("b[:9] == a[:9] ","01234567890123456789","0123456789",T(1.0)),
2322 test_ab<T>("b[:] == a[10:] ","01234567890123456789","0123456789",T(1.0)),
2323 test_ab<T>("b != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
2324 test_ab<T>("b[:] != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
2325 test_ab<T>("b[0:] != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
2326 test_ab<T>("b[:8] != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
2327 test_ab<T>("b[:8] != a[:9] ","01234567890123456789","123456789" ,T(1.0)),
2328 test_ab<T>("b[:] != a[10:] ","01234567890123456789","123456789" ,T(1.0)),
2329 test_ab<T>("b == a[2*6:10+6] ","01234567890123456789","23456" ,T(1.0)),
2330 test_ab<T>("a[2:6] == b" ,"0123456789","23456" ,T(1.0)),
2331 test_ab<T>("a == b[2:6]" ,"23456","0123456789" ,T(1.0)),
2332 test_ab<T>("a[1+1:2*3] == b" ,"0123456789","23456" ,T(1.0)),
2333 test_ab<T>("a == b[4/2:sqrt(36)]","23456","0123456789" ,T(1.0)),
2334 test_ab<T>("a[0:6] == b" ,"0123456789","0123456",T(1.0)),
2335 test_ab<T>("a[:6] == b" ,"0123456789","0123456",T(1.0)),
2336 test_ab<T>("a[4/2-2:2+4] == b" ,"0123456789","0123456",T(1.0)),
2337 test_ab<T>("a[:12/2] == b" ,"0123456789","0123456",T(1.0)),
2338 test_ab<T>("a[0:] == b" ,"0123456","0123456" ,T(1.0)),
2339 test_ab<T>("a[:] == b" ,"0123456","0123456" ,T(1.0)),
2340 test_ab<T>("a == b[0:6]" ,"0123456","0123456789",T(1.0)),
2341 test_ab<T>("a == b[:6]" ,"0123456","0123456789",T(1.0)),
2342 test_ab<T>("a == b[4/2-2:2+4]" ,"0123456","0123456789",T(1.0)),
2343 test_ab<T>("a == b[:12/2]" ,"0123456","0123456789",T(1.0)),
2344 test_ab<T>("a == b[0:]" ,"0123456","0123456" ,T(1.0)),
2345 test_ab<T>("a == b[:]" ,"0123456","0123456" ,T(1.0)),
2346 test_ab<T>("a[:9] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
2347 test_ab<T>("a[0:9] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
2348 test_ab<T>("a[0:] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
2349 test_ab<T>("a[:] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
2350 test_ab<T>("a[:] == b[10:]" ,"0123456789","01234567890123456789",T(1.0)),
2351 test_ab<T>("'!@#$%^&*([{}])-=' != ')]}{[(*&^%$#@!'","","",T(1.0)),
2352 test_ab<T>("('!@#$%^&*([{}])-=') != (')]}{[(*&^%$#@!')","","",T(1.0)),
2353 test_ab<T>("{[('a')]} == [{('a')}]","","",T(1.0)),
2354 test_ab<T>("{[('!@#$%^&*([{}])-=')]} != [{(')]}{[(*&^%$#@!')}]","","",T(1.0)),
2355 test_ab<T>("'!@#$%^&*([{}])-=' == '!@#$%^&*([{}])-='","","",T(1.0)),
2356 test_ab<T>("('!@#$%^&*([{}])-=') == ('!@#$%^&*([{}])-=')","","",T(1.0)),
2357 test_ab<T>("{[('!@#$%^&*([{}])-=')]} == [{('!@#$%^&*([{}])-=')}]","","",T(1.0)),
2358 test_ab<T>("'1234\\\\abc\nxyz\r890\tqaz\\'567' == a","1234\\abc\nxyz\r890\tqaz'567","",T(1.0)),
2359 test_ab<T>("a == '1234\\\\abc\nxyz\r890\tqaz\\'567'","1234\\abc\nxyz\r890\tqaz'567","",T(1.0)),
2360 test_ab<T>("'123'[] == 3" ,"","" ,T(1.0)),
2361 test_ab<T>("3 == '123'[]" ,"","" ,T(1.0)),
2362 test_ab<T>("'123'[] + '1234'[] == 7" ,"","" ,T(1.0)),
2363 test_ab<T>("abs('123'[] - '1234'[]) == 1" ,"","" ,T(1.0)),
2364 test_ab<T>("'1234'[] == a[]" ,"1234","" ,T(1.0)),
2365 test_ab<T>("'123'[] + a[] == 7" ,"1234","" ,T(1.0)),
2366 test_ab<T>("abs(a[] - '12345'[]) == 1" ,"1234","" ,T(1.0)),
2367 test_ab<T>("'1234'[] + '12345'[] == a[] + b[]" ,"1234","12345" ,T(1.0)),
2368 test_ab<T>("abs('123'[] -'1234'[]) == abs(a[] - b[])" ,"1234","12345",T(1.0)),
2369 test_ab<T>("(a + b) == 'abc123' ","abc","123" ,T(1.0)),
2370 test_ab<T>("(a + '123') == 'abc123' ","abc","123" ,T(1.0)),
2371 test_ab<T>("('abc' + b) == 'abc123' ","abc","123" ,T(1.0)),
2372 test_ab<T>("(a + '1') == 'abc1' ","abc","123" ,T(1.0)),
2373 test_ab<T>("('a' + b) == 'a123' ","abc","123" ,T(1.0)),
2374 test_ab<T>("(a[2:8] + b) == 'cdefgh0123' ","abcdefghij","0123",T(1.0)),
2375 test_ab<T>("(a + b[2:8]) == 'abc234567' ","abc","0123456789" ,T(1.0)),
2376 test_ab<T>("(a[2:8] + '0123') == 'cdefgh0123' ","abcdefghij","0123",T(1.0)),
2377 test_ab<T>("('abc' + b[2:8]) == 'abc234567' ","abc","0123456789" ,T(1.0)),
2378 test_ab<T>("(a[2:3] + b[3:4]) == 'c3' ","abc","0123456789" ,T(1.0)),
2379 test_ab<T>("(a[3:] + b) == 'defghij0123' ","abcdefghij","0123",T(1.0)),
2380 test_ab<T>("('abc' + b[:8]) == 'abc01234567' ","abc","0123456789" ,T(1.0)),
2381 test_ab<T>("a + '123' == 'abc'+ b ","abc" , "123" , T(1.0)),
2382 test_ab<T>("a[0:3] + '123' == 'abc' + b[0:3] ","abcXYZ", "123XYZ", T(1.0)),
2383 test_ab<T>("a[ :3] + '123' == 'abc' + b[ :3] ","abcXYZ", "123XYZ", T(1.0)),
2384 test_ab<T>("a[3: ] + '123' == 'abc' + b[3: ]","XYZabc", "XYZ123", T(1.0)),
2385 test_ab<T>("a[3:a[]] + '123' == 'abc' + b[3:b[]]","XYZabc", "XYZ123", T(1.0)),
2386 test_ab<T>("(a[r0:r2] + b) == 'cdefg0123' ","abcdefghij","0123",T(1.0)),
2387 test_ab<T>("(a + b[r0:r2]) == 'abc23456' ","abc","0123456789" ,T(1.0)),
2388 test_ab<T>("(a[r0:r2] + '0123') == 'cdefg0123' ","abcdefghij","0123",T(1.0)),
2389 test_ab<T>("('abc' + b[r0:r2]) == 'abc23456' ","abc","0123456789" ,T(1.0)),
2390 test_ab<T>("(a[r0:r0+1] + b[r3:r3+1]) == 'c3' ","abc","0123456789" ,T(1.0)),
2391 test_ab<T>("(a[r3:] + b) == 'defghij0123' ","abcdefghij","0123",T(1.0)),
2392 test_ab<T>("('abc' + b[:r2]) == 'abc0123456' ","abc","0123456789" ,T(1.0)),
2393 test_ab<T>("a[0:r0] + '123' == 'ab'+ b[0:r0+1] ","abcXYZ", "123XYZ", T(1.0)),
2394 test_ab<T>("a[ :r0] + '123' == 'ab' +b[ :r0+1] ","abcXYZ", "123XYZ", T(1.0)),
2395 test_ab<T>("a[r3: ] + '123' == 'abc' + b[r3: ]","XYZabc", "XYZ123", T(1.0)),
2396 test_ab<T>("a[r3:a[]] + '123' == 'abc' + b[r3:b[]] ","XYZabc", "XYZ123", T(1.0)),
2397 test_ab<T>("(a[r0:r0+1] + b[r3:r0+2]) == 'c3' ","abc","0123456789" ,T(1.0)),
2398 test_ab<T>("(a[r0+1:] + b) == 'defghij0123' ","abcdefghij","0123",T(1.0)),
2399 test_ab<T>("a[r0+1: ] + '123' == 'abc' + b[r0+1: ]", "XYZabc" ,"XYZ123" ,T(1.0)),
2400 test_ab<T>("a[r0+1:a[]] + '123' == 'abc' + b[r0+1:b[]] ", "XYZabc" ,"XYZ123" ,T(1.0)),
2401 test_ab<T>("(a + b)[ :14] == 'abcdefghij0123' ", "abcdefghij", "0123456789" ,T(1.0)),
2402 test_ab<T>("(a + b)[ 6: ] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
2403 test_ab<T>("(a + b)[ 2:3r1] == 'cdefghij01234567' ", "abcdefghij", "0123456789" ,T(1.0)),
2404 test_ab<T>("(a[2:8] + b[2:8]) == 'cdefgh234567' ", "abcdefghij", "0123456789" ,T(1.0)),
2405 test_ab<T>("(a[2:8] + b[2:8])[3:9] == 'fgh234' ", "abcdefghij", "0123456789" ,T(1.0)),
2406 test_ab<T>("(a + b)[r0 - 2: r1 + r2 +1] == 'abcdefghij0123'", "abcdefghij", "0123456789" ,T(1.0)),
2407 test_ab<T>("(a + b)[r0*r3:] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
2408 test_ab<T>("(a + b)[3r0: ] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
2409 test_ab<T>("(a + b)[2r3: ] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
2410 test_ab<T>("(a + b)[2:3r1] == 'cdefghij01234567' ", "abcdefghij", "0123456789" ,T(1.0)),
2411 test_ab<T>("(a[r0:8] + b[r0:r2+1])== 'cdefgh234567' ", "abcdefghij", "0123456789" ,T(1.0)),
2412 test_ab<T>("(a[r1 / r3:8] + b[r0:r2+1])[3:r2 + 2] == 'fgh234'", "abcdefghij", "0123456789" ,T(1.0)),
2413 test_ab<T>("(a += b) == 'abc123' ", "abc","123" ,T(1.0)),
2414 test_ab<T>("(a += '123') == 'abc123' ", "abc","123" ,T(1.0)),
2415 test_ab<T>("(a += b[3:6]) == 'abc123' ", "abc","XXX123XXX" ,T(1.0)),
2416 test_ab<T>("(a += 'XXX123XXX'[3:6]) == 'abc123' ", "abc","123" ,T(1.0)),
2417 test_ab<T>("(a += b)[:] == 'abc123' ", "abc","123" ,T(1.0)),
2418 test_ab<T>("(a += '123')[:] == 'abc123' ", "abc","123" ,T(1.0)),
2419 test_ab<T>("(a += b[3:6])[:] == 'abc123' ", "abc","XXX123XXX" ,T(1.0)),
2420 test_ab<T>("(a += 'XXX123XXX'[3:6])[:] == 'abc123' ", "abc","123" ,T(1.0)),
2421 test_ab<T>("(a += b[r1/2:r1]) == 'abc123' ", "abc","XXX123XXX" ,T(1.0)),
2422 test_ab<T>("(a += 'XXX123XXX'[r0+1:r1]) == 'abc123' ", "abc","123" ,T(1.0)),
2423 test_ab<T>("(a += b)[] == 6 ", "abc","123" ,T(1.0)),
2424 test_ab<T>("(a += '123')[] == 6 ", "abc","123" ,T(1.0)),
2425 test_ab<T>("(a += b[3:6])[] == 6 ", "abc","XXX123XXX" ,T(1.0)),
2426 test_ab<T>("(a += b[r0+1:r1])[] == 6 ", "abc","XXX123XXX" ,T(1.0)),
2427 test_ab<T>("(a + b)[:][] == 6 ","abc","123" ,T(1.0)),
2428 test_ab<T>("(a + b)[:][:][] == 6 ","abc","123" ,T(1.0)),
2429 test_ab<T>("(a + b)[:][:][:][] == 6 ","abc","123" ,T(1.0)),
2430 test_ab<T>("(a + b)[:][:][:][:][] == 6 ","abc","123" ,T(1.0)),
2431 test_ab<T>("(a + b)[:][:][:][:][:][] == 6 ","abc","123" ,T(1.0)),
2432 test_ab<T>("(a + b)[:][:][:][:][:][:][] == 6 ","abc","123" ,T(1.0)),
2433 test_ab<T>("(a + b)[:][:][:][:][:][:][:][]== 6 ","abc","123" ,T(1.0)),
2434 test_ab<T>("(a + b)[0:6] == 'abc123' ","abc","123" ,T(1.0)),
2435 test_ab<T>("(a + b)[0:6][1:5] == 'bc12' ","abc","123" ,T(1.0)),
2436 test_ab<T>("(a + b)[0:6][1:5][1:3] == 'c1' ","abc","123" ,T(1.0)),
2437 test_ab<T>("(a + b)[0:6][1:5][1:3][0:1] == 'c' ","abc","123" ,T(1.0)),
2438 test_ab<T>("(a + b)[0:6][] == 6 ","abc","123" ,T(1.0)),
2439 test_ab<T>("(a + b)[0:6][1:5][] == 4 ","abc","123" ,T(1.0)),
2440 test_ab<T>("(a + b)[0:6][1:5][1:3][] == 2 ","abc","123" ,T(1.0)),
2441 test_ab<T>("(a + b)[0:6][1:5][1:4][0:1][] == 1 ","abc","123" ,T(1.0)),
2442 test_ab<T>("(a[ : ] := b); (a == 'ABCDEFGHIJ');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2443 test_ab<T>("(a[0: ] := b); (a == 'ABCDEFGHIJ');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2444 test_ab<T>("(a[ :10]:= b); (a == 'ABCDEFGHIJ');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2445 test_ab<T>("(a[3: 8]:= b); (a == '012ABCDE89');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2446 test_ab<T>("(a[2: 9]:= b); (a == '01ABCDEFG9');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2447 test_ab<T>("(a[1:10]:= b); (a == '0ABCDEFGHI');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2448 test_ab<T>("(a[0:1] := b); (a == 'A123456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2449 test_ab<T>("(a[1:2] := b); (a == '0A23456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2450 test_ab<T>("(a[2:3] := b); (a == '01A3456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2451 test_ab<T>("(a[3:4] := b); (a == '012A456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2452 test_ab<T>("(a[4:5] := b); (a == '0123A56789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2453 test_ab<T>("(a[5:6] := b); (a == '01234A6789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2454 test_ab<T>("(a[6:7] := b); (a == '012345A789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2455 test_ab<T>("(a[7:8] := b); (a == '0123456A89');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2456 test_ab<T>("(a[8:9] := b); (a == '01234567A9');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2457 test_ab<T>("(a[9:10]:= b); (a == '012345678A');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2458 test_ab<T>("(a[0:2] := b); (a == 'AB23456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2459 test_ab<T>("(a[1:3] := b); (a == '0AB3456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2460 test_ab<T>("(a[2:4] := b); (a == '01AB456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2461 test_ab<T>("(a[3:5] := b); (a == '012AB56789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2462 test_ab<T>("(a[4:6] := b); (a == '0123AB6789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2463 test_ab<T>("(a[5:7] := b); (a == '01234AB789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2464 test_ab<T>("(a[6:8] := b); (a == '012345AB89');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2465 test_ab<T>("(a[7:9] := b); (a == '0123456AB9');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2466 test_ab<T>("(a[8:10]:= b); (a == '01234567AB');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2467 test_ab<T>("(a[ : ] := b[3:b[] - 2]); (a == 'ABCDEFGHIJ');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2468 test_ab<T>("(a[0: ] := b[3:b[] - 2]); (a == 'ABCDEFGHIJ');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2469 test_ab<T>("(a[ :10] := b[3:b[] - 2]); (a == 'ABCDEFGHIJ');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2470 test_ab<T>("(a[3:8] := b[3:b[] - 2]); (a == '012ABCDE89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2471 test_ab<T>("(a[2:9] := b[3:b[] - 2]); (a == '01ABCDEFG9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2472 test_ab<T>("(a[1:10] := b[3:b[] - 2]); (a == '0ABCDEFGHI');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2473 test_ab<T>("(a[0:1] := b[3:b[] - 2]); (a == 'A123456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2474 test_ab<T>("(a[1:2] := b[3:b[] - 2]); (a == '0A23456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2475 test_ab<T>("(a[2:3] := b[3:b[] - 2]); (a == '01A3456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2476 test_ab<T>("(a[3:4] := b[3:b[] - 2]); (a == '012A456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2477 test_ab<T>("(a[4:5] := b[3:b[] - 2]); (a == '0123A56789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2478 test_ab<T>("(a[5:6] := b[3:b[] - 2]); (a == '01234A6789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2479 test_ab<T>("(a[6:7] := b[3:b[] - 2]); (a == '012345A789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2480 test_ab<T>("(a[7:8] := b[3:b[] - 2]); (a == '0123456A89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2481 test_ab<T>("(a[8:9] := b[3:b[] - 2]); (a == '01234567A9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2482 test_ab<T>("(a[9:10] := b[3:b[] - 2]); (a == '012345678A');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2483 test_ab<T>("(a[0:2] := b[3:b[] - 2]); (a == 'AB23456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2484 test_ab<T>("(a[1:3] := b[3:b[] - 2]); (a == '0AB3456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2485 test_ab<T>("(a[2:4] := b[3:b[] - 2]); (a == '01AB456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2486 test_ab<T>("(a[3:5] := b[3:b[] - 2]); (a == '012AB56789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2487 test_ab<T>("(a[4:6] := b[3:b[] - 2]); (a == '0123AB6789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2488 test_ab<T>("(a[5:7] := b[3:b[] - 2]); (a == '01234AB789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2489 test_ab<T>("(a[6:8] := b[3:b[] - 2]); (a == '012345AB89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2490 test_ab<T>("(a[7:9] := b[3:b[] - 2]); (a == '0123456AB9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2491 test_ab<T>("(a[8:10] := b[3:b[] - 2]); (a == '01234567AB');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2492 test_ab<T>("(a[0:10] := b); (a == 'A123456789');", "0123456789","A" ,T(1.0)),
2493 test_ab<T>("(a[0:10] := b); (a == 'AB23456789');", "0123456789","AB" ,T(1.0)),
2494 test_ab<T>("(a[0:10] := b); (a == 'ABC3456789');", "0123456789","ABC" ,T(1.0)),
2495 test_ab<T>("(a[0:10] := b); (a == 'ABCD456789');", "0123456789","ABCD" ,T(1.0)),
2496 test_ab<T>("(a[0:10] := b); (a == 'ABCDE56789');", "0123456789","ABCDE" ,T(1.0)),
2497 test_ab<T>("(a[0:10] := b); (a == 'ABCDEF6789');", "0123456789","ABCDEF" ,T(1.0)),
2498 test_ab<T>("(a[0:10] := b); (a == 'ABCDEFG789');", "0123456789","ABCDEFG" ,T(1.0)),
2499 test_ab<T>("(a[0:10] := b); (a == 'ABCDEFGH89');", "0123456789","ABCDEFGH" ,T(1.0)),
2500 test_ab<T>("(a[0:10] := b); (a == 'ABCDEFGHI9');", "0123456789","ABCDEFGHI" ,T(1.0)),
2501 test_ab<T>("(a[3:10] := b); (a == '012A456789');", "0123456789","A" ,T(1.0)),
2502 test_ab<T>("(a[3:10] := b); (a == '012AB56789');", "0123456789","AB" ,T(1.0)),
2503 test_ab<T>("(a[3:10] := b); (a == '012ABC6789');", "0123456789","ABC" ,T(1.0)),
2504 test_ab<T>("(a[3:10] := b); (a == '012ABCD789');", "0123456789","ABCD" ,T(1.0)),
2505 test_ab<T>("(a[3:10] := b); (a == '012ABCDE89');", "0123456789","ABCDE" ,T(1.0)),
2506 test_ab<T>("(a[3:10] := b); (a == '012ABCDEF9');", "0123456789","ABCDEF" ,T(1.0)),
2507 test_ab<T>("(a[r1 / r0:r2 + 1] := b[3:b[] - r3 + 1]); (a == '012ABCDE89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2508 test_ab<T>("(a[r0:r2 + 2] := b[r3:b[] - r3 + 1]); (a == '01ABCDEFG9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2509 test_ab<T>("'\\0x30\\0x31\\0x32\\0x33\\0x34\\0x35\\0x36\\0x37\\0x38\\0x39' == '0123456789'","","",T(1.0)),
2510 test_ab<T>("'abc\\0x30\\0x31\\0x32\\0x33xyz' == 'abc0123xyz'" ,"","",T(1.0)),
2511 test_ab<T>("'\\0x30\\n\\0x31\\n\\0x32\\n\\0x33' == '0\\n1\\n2\\n3'" ,"","",T(1.0)),
2512 test_ab<T>("('\\0x30' + '') == '0'" ,"","",T(1.0)),
2513 test_ab<T>("('\\0x30' + '') == '0' + ''" ,"","",T(1.0)),
2514 test_ab<T>("('\\0x30' + '') == ''+ '0'" ,"","",T(1.0)),
2515 test_ab<T>("('' + '\\0x30') == '0'" ,"","",T(1.0)),
2516 test_ab<T>("('' + '\\0x30') == '0' + ''" ,"","",T(1.0)),
2517 test_ab<T>("('' + '\\0x30') == ''+ '0'" ,"","",T(1.0)),
2518 test_ab<T>("('' + '\\0x30' + '') == '0'" ,"","",T(1.0)),
2519 test_ab<T>("('' + '\\0x30' + '') == '0' + ''" ,"","",T(1.0)),
2520 test_ab<T>("('' + '\\0x30' + '') == ''+ '0'" ,"","",T(1.0)),
2521 test_ab<T>("('' + '\\0x30' + '') == '0'" ,"","",T(1.0)),
2522 test_ab<T>("('' + '\\0x30' + '') == '0' + ''" ,"","",T(1.0)),
2523 test_ab<T>("('' + '\\0x30' + '') == ''+ '0'" ,"","",T(1.0)),
2524 test_ab<T>("('\\0x30' + '\\0x31\\0x32') == '012'" ,"","",T(1.0)),
2525 test_ab<T>("('\\0x30' + '\\0x31\\0x32' + '\\0x33\\0x34\\0x35') == '012345'" ,"","",T(1.0)),
2526 test_ab<T>("'a\\'\\\\b' == a" ,"a'\\b","",T(1.0)),
2527 test_ab<T>("'a\\\\\\'b' == a" ,"a\\'b","",T(1.0)),
2528 test_ab<T>("'a\\'\\\\\\\\b' == a" ,"a'\\\\b","",T(1.0)),
2529 test_ab<T>("'a\\0x30\\'\\0x31\\\\\\0x32b' == a" ,"a0'1\\2b","",T(1.0)),
2530
2531 test_ab<T>("var x := 3; x > 2 and 'abc' like '*bc'" ,"","",T(1.0)),
2532 test_ab<T>("var x := 3; x > 2 and 'abc' ilike '*Bc'" ,"","",T(1.0)),
2533 test_ab<T>("var x := 3; x > 2 and 'abc' in '123abc123'","","",T(1.0)),
2534
2535 test_ab<T>("var x := 3; var s := 'abc'; x > 2 and s like '*bc'" ,"","",T(1.0)),
2536 test_ab<T>("var x := 3; var s := 'abc'; x > 2 and s ilike '*Bc'" ,"","",T(1.0)),
2537 test_ab<T>("var x := 3; var s := 'abc'; x > 2 and s in '123abc123'","","",T(1.0)),
2538
2539 test_ab<T>("var x := 3; var s := 'abc'; var t := '*bc'; x > 2 and s like t" ,"","",T(1.0)),
2540 test_ab<T>("var x := 3; var s := 'abc'; var t := '*Bc'; x > 2 and s ilike t" ,"","",T(1.0)),
2541 test_ab<T>("var x := 3; var s := 'abc'; var t := '123abc123'; x > 2 and s in t","","",T(1.0)),
2542
2543 test_ab<T>("var x := 3; x > 2 and a like '*bc'" ,"abc","",T(1.0)),
2544 test_ab<T>("var x := 3; x > 2 and a ilike '*Bc'" ,"abc","",T(1.0)),
2545 test_ab<T>("var x := 3; x > 2 and a in '123abc123'","abc","",T(1.0)),
2546
2547 test_ab<T>("var x := 3; x > 2 and a like b ","abc","*bc",T(1.0)),
2548 test_ab<T>("var x := 3; x > 2 and a ilike b","abc","*Bc",T(1.0)),
2549 test_ab<T>("var x := 3; x > 2 and a in b ","abc","123abc123",T(1.0)),
2550
2551 test_ab<T>("a[] > 2 and a like '*bc'" ,"abc","",T(1.0)),
2552 test_ab<T>("a[] > 2 and a ilike '*Bc'" ,"abc","",T(1.0)),
2553 test_ab<T>("a[] > 2 and a in '123abc123'","abc","",T(1.0)),
2554
2555 test_ab<T>("a[] > 2 and a like b ","abc","*bc",T(1.0)),
2556 test_ab<T>("a[] > 2 and a ilike b","abc","*Bc",T(1.0)),
2557 test_ab<T>("a[] > 2 and a in b ","abc","123abc123",T(1.0)),
2558
2559 test_ab<T>("a[0:1] := b[ :]; a == '0XXXX'", "XXXXX","01234567890",T(1.0)),
2560 test_ab<T>("a[0:2] := b[ :]; a == '01XXX'", "XXXXX","01234567890",T(1.0)),
2561 test_ab<T>("a[0:3] := b[ :]; a == '012XX'", "XXXXX","01234567890",T(1.0)),
2562 test_ab<T>("a[0:4] := b[ :]; a == '0123X'", "XXXXX","01234567890",T(1.0)),
2563 test_ab<T>("a[0:5] := b[ :]; a == '01234'", "XXXXX","01234567890",T(1.0)),
2564 test_ab<T>("a[0:1] := b[6:]; a == '6XXXX'", "XXXXX","01234567890",T(1.0)),
2565 test_ab<T>("a[0:2] := b[6:]; a == '67XXX'", "XXXXX","01234567890",T(1.0)),
2566 test_ab<T>("a[0:3] := b[6:]; a == '678XX'", "XXXXX","01234567890",T(1.0)),
2567 test_ab<T>("a[0:4] := b[6:]; a == '6789X'", "XXXXX","01234567890",T(1.0)),
2568 test_ab<T>("a[0:5] := b[6:]; a == '67890'", "XXXXX","01234567890",T(1.0)),
2569 test_ab<T>("a[0:1] <=> b[ :]; (a == '0XXXX') and (b == 'X1234567890')", "XXXXX","01234567890",T(1.0)),
2570 test_ab<T>("a[0:2] <=> b[ :]; (a == '01XXX') and (b == 'XX234567890')", "XXXXX","01234567890",T(1.0)),
2571 test_ab<T>("a[0:3] <=> b[ :]; (a == '012XX') and (b == 'XXX34567890')", "XXXXX","01234567890",T(1.0)),
2572 test_ab<T>("a[0:4] <=> b[ :]; (a == '0123X') and (b == 'XXXX4567890')", "XXXXX","01234567890",T(1.0)),
2573 test_ab<T>("a[0:5] <=> b[ :]; (a == '01234') and (b == 'XXXXX567890')", "XXXXX","01234567890",T(1.0)),
2574 test_ab<T>("a[0:1] <=> b[6:]; (a == '6XXXX') and (b == '012345X7890')", "XXXXX","01234567890",T(1.0)),
2575 test_ab<T>("a[0:2] <=> b[6:]; (a == '67XXX') and (b == '012345XX890')", "XXXXX","01234567890",T(1.0)),
2576 test_ab<T>("a[0:3] <=> b[6:]; (a == '678XX') and (b == '012345XXX90')", "XXXXX","01234567890",T(1.0)),
2577 test_ab<T>("a[0:4] <=> b[6:]; (a == '6789X') and (b == '012345XXXX0')", "XXXXX","01234567890",T(1.0)),
2578 test_ab<T>("a[0:5] <=> b[6:]; (a == '67890') and (b == '012345XXXXX')", "XXXXX","01234567890",T(1.0)),
2579 test_ab<T>("var i := 0; a[0:i+1] := b[:]; a == '0XXXX'", "XXXXX","01234567890",T(1.0)),
2580 test_ab<T>("var i := 0; a[0:i+2] := b[:]; a == '01XXX'", "XXXXX","01234567890",T(1.0)),
2581 test_ab<T>("var i := 0; a[0:i+3] := b[:]; a == '012XX'", "XXXXX","01234567890",T(1.0)),
2582 test_ab<T>("var i := 0; a[0:i+4] := b[:]; a == '0123X'", "XXXXX","01234567890",T(1.0)),
2583 test_ab<T>("var i := 0; a[0:i+5] := b[:]; a == '01234'", "XXXXX","01234567890",T(1.0)),
2584 test_ab<T>("var i := 0; a[0:i+1] <=> b[:]; (a == '0XXXX') and (b == 'X1234567890')", "XXXXX","01234567890",T(1.0)),
2585 test_ab<T>("var i := 0; a[0:i+2] <=> b[:]; (a == '01XXX') and (b == 'XX234567890')", "XXXXX","01234567890",T(1.0)),
2586 test_ab<T>("var i := 0; a[0:i+3] <=> b[:]; (a == '012XX') and (b == 'XXX34567890')", "XXXXX","01234567890",T(1.0)),
2587 test_ab<T>("var i := 0; a[0:i+4] <=> b[:]; (a == '0123X') and (b == 'XXXX4567890')", "XXXXX","01234567890",T(1.0)),
2588 test_ab<T>("var i := 0; a[0:i+5] <=> b[:]; (a == '01234') and (b == 'XXXXX567890')", "XXXXX","01234567890",T(1.0)),
2589
2590 test_ab<T>("var y:= 2; '01234567890'[y:] == a ", "234567890","" ,T(1.0)),
2591 test_ab<T>("var y:= 2; '01234567890'[y:][y:] == a ", "4567890" ,"" ,T(1.0)),
2592 test_ab<T>("var y:= 2; '01234567890'[y:][y:][y:] == a ", "67890" ,"" ,T(1.0)),
2593 test_ab<T>("var y:= 2; '01234567890'[y:][y:][y:][y:] == a ", "890" ,"" ,T(1.0)),
2594 test_ab<T>("var y:= 2; '01234567890'[y:][y:][y:][y:][y:] == a", "0" ,"" ,T(1.0)),
2595 test_ab<T>("var y:= 2; '0123456789'[y:] == a ", "23456789" ,"" ,T(1.0)),
2596 test_ab<T>("var y:= 2; '0123456789'[y:][y:] == a ", "456789" ,"" ,T(1.0)),
2597 test_ab<T>("var y:= 2; '0123456789'[y:][y:][y:] == a ", "6789" ,"" ,T(1.0)),
2598 test_ab<T>("var y:= 2; '0123456789'[y:][y:][y:][y:] == a ", "89" ,"" ,T(1.0)),
2599 test_ab<T>("var y:= 2; '0123456789'[y:][y:][y:][y:][y:] == a ", "" ,"" ,T(1.0)),
2600
2601 test_ab<T>("var s:= ''; s := ''; s == '' ", "" ,"" ,T(1.0)),
2602 test_ab<T>("var s:= ''; s := ''; '' == s ", "" ,"" ,T(1.0)),
2603 test_ab<T>("var s:= ''; s := ''; s[:] == '' ", "" ,"" ,T(1.0)),
2604 test_ab<T>("var s:= ''; s := ''; '' == s[:] ", "" ,"" ,T(1.0)),
2605 test_ab<T>("var s:= ''; s := ''; s[:s[]] == '' ", "" ,"" ,T(1.0)),
2606 test_ab<T>("var s:= ''; s := ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
2607
2608 test_ab<T>("var s:= ''; s := '' + ''; s == '' ", "" ,"" ,T(1.0)),
2609 test_ab<T>("var s:= ''; s := '' + ''; '' == s ", "" ,"" ,T(1.0)),
2610 test_ab<T>("var s:= ''; s += ''; s == '' ", "" ,"" ,T(1.0)),
2611 test_ab<T>("var s:= ''; s += ''; '' == s ", "" ,"" ,T(1.0)),
2612 test_ab<T>("var s:= '1'; s := '' + ''; s == '' ", "" ,"" ,T(1.0)),
2613 test_ab<T>("var s:= '1'; s := '' + ''; '' == s ", "" ,"" ,T(1.0)),
2614 test_ab<T>("var s:= '12'; s := '' + ''; s == '' ", "" ,"" ,T(1.0)),
2615 test_ab<T>("var s:= '12'; s := '' + ''; '' == s ", "" ,"" ,T(1.0)),
2616 test_ab<T>("var s:= '123'; s := '' + ''; s == '' ", "" ,"" ,T(1.0)),
2617 test_ab<T>("var s:= '123'; s := '' + ''; '' == s ", "" ,"" ,T(1.0)),
2618 test_ab<T>("var s:= '1'; s += ''; s == '1' ", "" ,"" ,T(1.0)),
2619 test_ab<T>("var s:= '1'; s += ''; '1' == s ", "" ,"" ,T(1.0)),
2620 test_ab<T>("var s:= '12'; s += ''; s == '12' ", "" ,"" ,T(1.0)),
2621 test_ab<T>("var s:= '12'; s += ''; '12' == s ", "" ,"" ,T(1.0)),
2622 test_ab<T>("var s:= '123'; s += ''; s == '123' ", "" ,"" ,T(1.0)),
2623 test_ab<T>("var s:= '123'; s += ''; '123' == s ", "" ,"" ,T(1.0)),
2624
2625 test_ab<T>("var s:= ''; s := '' + ''; s[:] == '' ", "" ,"" ,T(1.0)),
2626 test_ab<T>("var s:= ''; s := '' + ''; '' == s[:] ", "" ,"" ,T(1.0)),
2627 test_ab<T>("var s:= ''; s += ''; s[:] == '' ", "" ,"" ,T(1.0)),
2628 test_ab<T>("var s:= ''; s += ''; '' == s[:] ", "" ,"" ,T(1.0)),
2629 test_ab<T>("var s:= '1'; s := '' + ''; s[:] == '' ", "" ,"" ,T(1.0)),
2630 test_ab<T>("var s:= '1'; s := '' + ''; '' == s[:] ", "" ,"" ,T(1.0)),
2631 test_ab<T>("var s:= '12'; s := '' + ''; s[:] == '' ", "" ,"" ,T(1.0)),
2632 test_ab<T>("var s:= '12'; s := '' + ''; '' == s[:] ", "" ,"" ,T(1.0)),
2633 test_ab<T>("var s:= '123'; s := '' + ''; s[:] == '' ", "" ,"" ,T(1.0)),
2634 test_ab<T>("var s:= '123'; s := '' + ''; '' == s[:] ", "" ,"" ,T(1.0)),
2635 test_ab<T>("var s:= '1'; s += ''; s[:] == '1' ", "" ,"" ,T(1.0)),
2636 test_ab<T>("var s:= '1'; s += ''; '1' == s[:] ", "" ,"" ,T(1.0)),
2637 test_ab<T>("var s:= '12'; s += ''; s[:] == '12' ", "" ,"" ,T(1.0)),
2638 test_ab<T>("var s:= '12'; s += ''; '12' == s[:] ", "" ,"" ,T(1.0)),
2639 test_ab<T>("var s:= '123'; s += ''; s[:] == '123' ", "" ,"" ,T(1.0)),
2640 test_ab<T>("var s:= '123'; s += ''; '123' == s[:] ", "" ,"" ,T(1.0)),
2641
2642 test_ab<T>("var s:= ''; s := '' + ''; s[:s[]] == '' ", "" ,"" ,T(1.0)),
2643 test_ab<T>("var s:= ''; s := '' + ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
2644 test_ab<T>("var s:= ''; s += ''; s[:s[]] == '' ", "" ,"" ,T(1.0)),
2645 test_ab<T>("var s:= ''; s += ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
2646 test_ab<T>("var s:= '1'; s := '' + ''; s[:s[]] == '' ", "" ,"" ,T(1.0)),
2647 test_ab<T>("var s:= '1'; s := '' + ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
2648 test_ab<T>("var s:= '12'; s := '' + ''; s[:s[]] == '' ", "" ,"" ,T(1.0)),
2649 test_ab<T>("var s:= '12'; s := '' + ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
2650 test_ab<T>("var s:= '123'; s := '' + ''; s[:s[]] == '' ", "" ,"" ,T(1.0)),
2651 test_ab<T>("var s:= '123'; s := '' + ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
2652 test_ab<T>("var s:= '1'; s += ''; s[:s[]] == '1' ", "" ,"" ,T(1.0)),
2653 test_ab<T>("var s:= '1'; s += ''; '1' == s[:s[]] ", "" ,"" ,T(1.0)),
2654 test_ab<T>("var s:= '12'; s += ''; s[:s[]] == '12' ", "" ,"" ,T(1.0)),
2655 test_ab<T>("var s:= '12'; s += ''; '12' == s[:s[]] ", "" ,"" ,T(1.0)),
2656 test_ab<T>("var s:= '123'; s += ''; s[:s[]] == '123' ", "" ,"" ,T(1.0)),
2657 test_ab<T>("var s:= '123'; s += ''; '123' == s[:s[]] ", "" ,"" ,T(1.0)),
2658
2659 test_ab<T>("var s:= ''; for(var i:=0; i < 10; i+=1) {s += '';}; s == '' ", "" ,"" ,T(1.0)),
2660 test_ab<T>("var s:= ''; for(var i:=0; i < 10; i+=1) {s += '';}; '' == s ", "" ,"" ,T(1.0)),
2661 test_ab<T>("var s:= '1'; for(var i:=0; i < 10; i+=1) {s += '';}; s == '1' ", "" ,"" ,T(1.0)),
2662 test_ab<T>("var s:= '1'; for(var i:=0; i < 10; i+=1) {s += '';}; '1' == s ", "" ,"" ,T(1.0)),
2663 test_ab<T>("var s:= '12'; for(var i:=0; i < 10; i+=1) {s += '';}; s == '12' ", "" ,"" ,T(1.0)),
2664 test_ab<T>("var s:= '12'; for(var i:=0; i < 10; i+=1) {s += '';}; '12' == s ", "" ,"" ,T(1.0)),
2665 test_ab<T>("var s:= '123'; for(var i:=0; i < 10; i+=1) {s += '';}; s == '123' ", "" ,"" ,T(1.0)),
2666 test_ab<T>("var s:= '123'; for(var i:=0; i < 10; i+=1) {s += '';}; '123' == s ", "" ,"" ,T(1.0)),
2667
2668 test_ab<T>("var s:= ''; for(var i:=0; i < 4; i+=1) {s += '1';}; s == '1111' ", "" ,"" ,T(1.0)),
2669 test_ab<T>("var s:= ''; for(var i:=0; i < 4; i+=1) {s += '1';}; '1111' == s ", "" ,"" ,T(1.0)),
2670 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s += '22';}; s == '2222' ", "" ,"" ,T(1.0)),
2671 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s += '22';}; '2222' == s ", "" ,"" ,T(1.0)),
2672 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s += '333';}; s == '333333' ", "" ,"" ,T(1.0)),
2673 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s += '333';}; '333333' == s ", "" ,"" ,T(1.0)),
2674
2675 test_ab<T>("var s:= ''; for(var i:=0; i < 4; i+=1) {s := s + '1';}; s == '1111' ", "" ,"" ,T(1.0)),
2676 test_ab<T>("var s:= ''; for(var i:=0; i < 4; i+=1) {s := s + '1';}; '1111' == s ", "" ,"" ,T(1.0)),
2677 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := s + '22';}; s == '2222' ", "" ,"" ,T(1.0)),
2678 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := s + '22';}; '2222' == s ", "" ,"" ,T(1.0)),
2679 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := s + '333';}; s == '333333'", "" ,"" ,T(1.0)),
2680 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := s + '333';}; '333333' == s", "" ,"" ,T(1.0)),
2681
2682 test_ab<T>("var s:= ''; for(var i:=0; i < 4; i+=1) {s := '1' + s;}; s == '1111' ", "" ,"" ,T(1.0)),
2683 test_ab<T>("var s:= ''; for(var i:=0; i < 4; i+=1) {s := '1' + s;}; '1111' == s ", "" ,"" ,T(1.0)),
2684 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := '22' + s;}; s == '2222' ", "" ,"" ,T(1.0)),
2685 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := '22' + s;}; '2222' == s ", "" ,"" ,T(1.0)),
2686 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := '333' + s;}; s == '333333'", "" ,"" ,T(1.0)),
2687 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := '333' + s;}; '333333' == s", "" ,"" ,T(1.0)),
2688
2689 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] := y[:]; x == '0XXXX'", "","",T(1.0)),
2690 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] := y[:]; x == '01XXX'", "","",T(1.0)),
2691 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] := y[:]; x == '012XX'", "","",T(1.0)),
2692 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] := y[:]; x == '0123X'", "","",T(1.0)),
2693 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:5] := y[:]; x == '01234'", "","",T(1.0)),
2694 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] := y[6:]; x == '6XXXX'", "","",T(1.0)),
2695 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] := y[6:]; x == '67XXX'", "","",T(1.0)),
2696 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] := y[6:]; x == '678XX'", "","",T(1.0)),
2697 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] := y[6:]; x == '6789X'", "","",T(1.0)),
2698 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:5] := y[6:]; x == '67890'", "","",T(1.0)),
2699 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] <=> y[:]; (x == '0XXXX') and (y == 'X1234567890')", "","",T(1.0)),
2700 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] <=> y[:]; (x == '01XXX') and (y == 'XX234567890')", "","",T(1.0)),
2701 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] <=> y[:]; (x == '012XX') and (y == 'XXX34567890')", "","",T(1.0)),
2702 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] <=> y[:]; (x == '0123X') and (y == 'XXXX4567890')", "","",T(1.0)),
2703 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:5] <=> y[:]; (x == '01234') and (y == 'XXXXX567890')", "","",T(1.0)),
2704 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] <=> y[6:]; (x == '6XXXX') and (y == '012345X7890')", "","",T(1.0)),
2705 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] <=> y[6:]; (x == '67XXX') and (y == '012345XX890')", "","",T(1.0)),
2706 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] <=> y[6:]; (x == '678XX') and (y == '012345XXX90')", "","",T(1.0)),
2707 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] <=> y[6:]; (x == '6789X') and (y == '012345XXXX0')", "","",T(1.0)),
2708 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:5] <=> y[6:]; (x == '67890') and (y == '012345XXXXX')", "","",T(1.0)),
2709 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+1] := y[:]; x == '0XXXX'", "","",T(1.0)),
2710 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+2] := y[:]; x == '01XXX'", "","",T(1.0)),
2711 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+3] := y[:]; x == '012XX'", "","",T(1.0)),
2712 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+4] := y[:]; x == '0123X'", "","",T(1.0)),
2713 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+5] := y[:]; x == '01234'", "","",T(1.0)),
2714 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+1] <=> y[:]; (x == '0XXXX') and (y == 'X1234567890')", "","",T(1.0)),
2715 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+2] <=> y[:]; (x == '01XXX') and (y == 'XX234567890')", "","",T(1.0)),
2716 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+3] <=> y[:]; (x == '012XX') and (y == 'XXX34567890')", "","",T(1.0)),
2717 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+4] <=> y[:]; (x == '0123X') and (y == 'XXXX4567890')", "","",T(1.0)),
2718 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+5] <=> y[:]; (x == '01234') and (y == 'XXXXX567890')", "","",T(1.0)),
2719
2720 test_ab<T>("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)),
2721 test_ab<T>("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)),
2722 test_ab<T>("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)),
2723 test_ab<T>("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)),
2724
2725 test_ab<T>("a like b", "abcd", "abcd*", T(1.0)),
2726 test_ab<T>("a like b", "abcd", "abcd" , T(1.0)),
2727 test_ab<T>("a like b", "abcd", "abc*" , T(1.0)),
2728 test_ab<T>("a like b", "abcd", "*bcd" , T(1.0)),
2729 test_ab<T>("a like b", "abcd", "abc?" , T(1.0)),
2730 test_ab<T>("a like b", "abcd", "?bcd" , T(1.0)),
2731 test_ab<T>("a like b", "abcd", "ab?d" , T(1.0)),
2732 test_ab<T>("a like b", "abcd", "ab*d" , T(1.0)),
2733 test_ab<T>("a like b", "abcd", "a?cd" , T(1.0)),
2734 test_ab<T>("a like b", "abcd", "a*cd" , T(1.0)),
2735 test_ab<T>("a like b", "abcd", "a??d" , T(1.0)),
2736 test_ab<T>("a like b", "abcd", "a*?d" , T(1.0)),
2737 test_ab<T>("a like b", "abcd", "*bc*" , T(1.0)),
2738 test_ab<T>("a like b", "abcd", "?bc?" , T(1.0)),
2739 test_ab<T>("a like b", "abcd", "????" , T(1.0)),
2740 test_ab<T>("a like b", "abcd", "a???" , T(1.0)),
2741 test_ab<T>("a like b", "abcd", "ab??" , T(1.0)),
2742 test_ab<T>("a like b", "abcd", "abc?" , T(1.0)),
2743 test_ab<T>("a like b", "abcd", "???d" , T(1.0)),
2744 test_ab<T>("a like b", "abcd", "??cd" , T(1.0)),
2745 test_ab<T>("a like b", "abcd", "?bcd" , T(1.0)),
2746 test_ab<T>("a like b", "abcd", "?b?d" , T(1.0)),
2747 test_ab<T>("a like b", "abcd", "a?c?" , T(1.0)),
2748 test_ab<T>("a like b", "abcd", "a??d" , T(1.0)),
2749 test_ab<T>("a like b", "abcd", "?bc?" , T(1.0)),
2750 test_ab<T>("a like b", "abcd", "ab**" , T(1.0)),
2751 test_ab<T>("a like b", "abcd", "ab*?" , T(1.0)),
2752 test_ab<T>("a like b", "abcd", "a***" , T(1.0)),
2753 test_ab<T>("a like b", "abcd", "**cd" , T(1.0)),
2754 test_ab<T>("a like b", "abcd", "*?cd" , T(1.0)),
2755 test_ab<T>("a like b", "abcd", "***d" , T(1.0)),
2756 test_ab<T>("a like b", "abcd", "*bc*" , T(1.0)),
2757 test_ab<T>("a like b", "abcd", "*bc?" , T(1.0)),
2758 test_ab<T>("a like b", "abcd", "*b??" , T(1.0)),
2759 test_ab<T>("a like b", "abcd", "?bc*" , T(1.0)),
2760 test_ab<T>("a like b", "abcd", "??c*" , T(1.0)),
2761 test_ab<T>("a like b", "abcd", "*b?*" , T(1.0)),
2762 test_ab<T>("a like b", "ab" , "a*" , T(1.0)),
2763 test_ab<T>("a like b", "ab" , "a?" , T(1.0)),
2764
2765 test_ab<T>("a ilike b", "aBcD", "abcd*", T(1.0)),
2766 test_ab<T>("a ilike b", "aBcD", "abcd" , T(1.0)),
2767 test_ab<T>("a ilike b", "aBcD", "abc*" , T(1.0)),
2768 test_ab<T>("a ilike b", "aBcD", "*bcd" , T(1.0)),
2769 test_ab<T>("a ilike b", "aBcD", "abc?" , T(1.0)),
2770 test_ab<T>("a ilike b", "aBcD", "?bcd" , T(1.0)),
2771 test_ab<T>("a ilike b", "aBcD", "ab?d" , T(1.0)),
2772 test_ab<T>("a ilike b", "aBcD", "ab*d" , T(1.0)),
2773 test_ab<T>("a ilike b", "aBcD", "a?cd" , T(1.0)),
2774 test_ab<T>("a ilike b", "aBcD", "a*cd" , T(1.0)),
2775 test_ab<T>("a ilike b", "aBcD", "a??d" , T(1.0)),
2776 test_ab<T>("a ilike b", "aBcD", "a*?d" , T(1.0)),
2777 test_ab<T>("a ilike b", "aBcD", "*bc*" , T(1.0)),
2778 test_ab<T>("a ilike b", "aBcD", "?bc?" , T(1.0)),
2779 test_ab<T>("a ilike b", "aBcD", "????" , T(1.0)),
2780 test_ab<T>("a ilike b", "aBcD", "a???" , T(1.0)),
2781 test_ab<T>("a ilike b", "aBcD", "ab??" , T(1.0)),
2782 test_ab<T>("a ilike b", "aBcD", "abc?" , T(1.0)),
2783 test_ab<T>("a ilike b", "aBcD", "???d" , T(1.0)),
2784 test_ab<T>("a ilike b", "aBcD", "??cd" , T(1.0)),
2785 test_ab<T>("a ilike b", "aBcD", "?bcd" , T(1.0)),
2786 test_ab<T>("a ilike b", "aBcD", "?b?d" , T(1.0)),
2787 test_ab<T>("a ilike b", "aBcD", "a?c?" , T(1.0)),
2788 test_ab<T>("a ilike b", "aBcD", "a??d" , T(1.0)),
2789 test_ab<T>("a ilike b", "aBcD", "?bc?" , T(1.0)),
2790 test_ab<T>("a ilike b", "aBcD", "ab**" , T(1.0)),
2791 test_ab<T>("a ilike b", "aBcD", "ab*?" , T(1.0)),
2792 test_ab<T>("a ilike b", "aBcD", "a***" , T(1.0)),
2793 test_ab<T>("a ilike b", "aBcD", "**cd" , T(1.0)),
2794 test_ab<T>("a ilike b", "aBcD", "*?cd" , T(1.0)),
2795 test_ab<T>("a ilike b", "aBcD", "***d" , T(1.0)),
2796 test_ab<T>("a ilike b", "aBcD", "*bc*" , T(1.0)),
2797 test_ab<T>("a ilike b", "aBcD", "*bc?" , T(1.0)),
2798 test_ab<T>("a ilike b", "aBcD", "*b??" , T(1.0)),
2799 test_ab<T>("a ilike b", "aBcD", "?bc*" , T(1.0)),
2800 test_ab<T>("a ilike b", "aBcD", "??c*" , T(1.0)),
2801 test_ab<T>("a ilike b", "aBcD", "*b?*" , T(1.0)),
2802 test_ab<T>("a ilike b", "aB" , "a*" , T(1.0)),
2803 test_ab<T>("a ilike b", "aB" , "a?" , T(1.0))
2804 };
2805
2806 static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_ab<T>);
2807
2808 {
2809 const std::size_t rounds = 50;
2810
2811 for (std::size_t r = 0; r < rounds; ++r)
2812 {
2813 bool result = true;
2814
2815 for (std::size_t i = 0; i < test_list_size; ++i)
2816 {
2817 test_ab<T>& test = const_cast<test_ab<T>&>(test_list[i]);
2818
2819 std::string str_a;
2820 std::string str_b;
2821 std::string str_c;
2822
2823 T r0 = T(2);
2824 T r1 = T(6);
2825 T r2 = T(7);
2826 T r3 = T(3);
2827
2828 exprtk::symbol_table<T> symbol_table;
2829 symbol_table.add_stringvar("a", str_a);
2830 symbol_table.add_stringvar("b", str_b);
2831 symbol_table.add_stringvar("c", str_c);
2832 symbol_table.add_variable("r0", r0);
2833 symbol_table.add_variable("r1", r1);
2834 symbol_table.add_variable("r2", r2);
2835 symbol_table.add_variable("r3", r3);
2836
2837 exprtk::expression<T> expression;
2838 expression.register_symbol_table(symbol_table);
2839
2840 {
2841 exprtk::parser<T> parser;
2842
2843 if (!parser.compile(test.expr, expression))
2844 {
2845 printf("run_test02() - Error: %s Expression: %s\n",
2846 parser.error().c_str(),
2847 test.expr.c_str());
2848
2849 result = false;
2850 continue;
2851 }
2852 }
2853
2854 str_a = test.a;
2855 str_b = test.b;
2856 str_c = test.c;
2857
2858 T expr_result = expression.value();
2859
2860 if (not_equal(expr_result, test.result))
2861 {
2862 printf("run_test02() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\t"
2863 "a='%s'\tb='%s'\tc='%s'\n",
2864 test.expr.c_str(),
2865 static_cast<double>(test.result),
2866 static_cast<double>(expr_result),
2867 str_a.c_str(),
2868 str_b.c_str(),
2869 str_c.c_str());
2870
2871 result = false;
2872 continue;
2873 }
2874 }
2875
2876 if (!result)
2877 {
2878 return false;
2879 }
2880 }
2881 }
2882
2883 {
2884 std::string s0;
2885 std::string s1;
2886
2887 const std::string expression_str =
2888 " s0 := 'abc'; "
2889 " s0 := (s1 := '0123456789'[2:8]); "
2890 " s1 := 'xyz'; "
2891 " s0 < s1; ";
2892
2893 exprtk::symbol_table<T> symbol_table;
2894 symbol_table.add_stringvar("s0" ,s0);
2895 symbol_table.add_stringvar("s1" ,s1);
2896
2897 exprtk::expression<T> expression;
2898 expression.register_symbol_table(symbol_table);
2899
2900 {
2901 exprtk::parser<T> parser;
2902
2903 if (!parser.compile(expression_str,expression))
2904 {
2905 printf("run_test02() - [2] Error: %s Expression: %s\n",
2906 parser.error().c_str(),
2907 expression_str.c_str());
2908
2909 return false;
2910 }
2911 }
2912
2913 if (T(0) == expression.value())
2914 {
2915 printf("run_test02() - Evaluation Error [2]: Expression: [%s]\tExpected: True\n",
2916 expression_str.c_str());
2917
2918 return false;
2919 }
2920 else if ("234567" != s0)
2921 {
2922 printf("run_test02() - Evaluation Error [2]: Expression: [%s]\tInvalid value for s0\n",
2923 expression_str.c_str());
2924
2925 return false;
2926 }
2927 else if ("xyz" != s1)
2928 {
2929 printf("run_test02() - Evaluation Error [2]: Expression: [%s]\tInvalid value for s1\n",
2930 expression_str.c_str());
2931
2932 return false;
2933 }
2934 }
2935
2936 return true;
2937}
bool add_stringvar(const std::string &stringvar_name, std::string &s, const bool is_constant=false)
Definition exprtk.hpp:20798
std::string expr
std::string c
std::string a
std::string b

References test_ab< T >::a, exprtk::symbol_table< T >::add_stringvar(), exprtk::symbol_table< T >::add_variable(), test_ab< T >::b, test_ab< T >::c, exprtk::parser< T >::compile(), exprtk::parser< T >::error(), test_ab< T >::expr, not_equal(), exprtk::expression< T >::register_symbol_table(), test_ab< T >::result, rounds, and exprtk::expression< T >::value().

Here is the call graph for this function:

◆ run_test03()

template<typename T >
bool run_test03 ( )
inline

Definition at line 2940 of file exprtk_real_test.cpp.

2941{
2942 typedef exprtk::symbol_table<T> symbol_table_t;
2943 typedef exprtk::expression<T> expression_t;
2944 typedef exprtk::parser<T> parser_t;
2945
2946 const std::string expression_string =
2947 "A+A0+aA+Aa0+b+B1+Bb+bB1+A+A0+AA+AA0+B+B1+BB+BB1+a+a0+aa+aa0+b+b1+bb+bb1+"
2948 "c+C2+Cc+Cc2+D+D3+dD+dD3+C+C2+CC+CC2+D+D3+DD+DD3+c+c2+cc+cc2+d+d3+dd+dd3+"
2949 "E+E4+eE+Ee4+f+F5+Ff+fF5+E+E4+EE+EE4+F+F5+FF+FF5+e+e4+ee+ee4+f+f5+ff+ff5+"
2950 "g+G6+Gg+Gg6+H+H7+hH+hH7+G+G6+GG+GG6+H+H7+HH+HH7+g+g6+gg+gg6+h+h7+hh+hh7+"
2951 "I+I8+iI+Ii8+j+J9+Jj+jJ9+I+I8+II+II8+J+J9+JJ+JJ9+i+i8+ii+ii8+j+j9+jj+jj9+"
2952 "k+K0+Kk+Kk0+L+L1+lL+lL1+K+K0+KK+KK0+L+L1+LL+LL1+k+k0+kk+kk0+l+l1+ll+ll1+"
2953 "M+M2+mM+Mm2+n+N3+Nn+nN3+M+M2+MM+MM2+N+N3+NN+NN3+m+m2+mm+mm2+n+n3+nn+nn3+"
2954 "o+O4+Oo+Oo4+P+P5+pP+pP5+O+O4+OO+OO4+P+P5+PP+PP5+o+o4+oo+oo4+p+p5+pp+pp5+"
2955 "Q+Q6+qQ+Qq6+r+R7+Rr+rR7+Q+Q6+QQ+QQ6+R+R7+RR+RR7+q+q6+qq+qq6+r+r7+rr+rr7+"
2956 "s+S8+Ss+Ss8+T+T9+tT+tT9+S+S8+SS+SS8+T+T9+TT+TT9+s+s8+ss+ss8+t+t9+tt+tt9+"
2957 "U+U0+uU+Uu0+v+V1+Vv+vV1+U+U0+UU+UU0+V+V1+VV+VV1+u+u0+uu+uu0+v+v1+vv+vv1+"
2958 "w+W2+Ww+Ww2+X+X3+xX+xX3+W+W2+WW+WW2+X+X3+XX+XX3+w+w2+ww+ww2+x+x3+xx+xx3+"
2959 "Y+Y4+yY+Yy4+z+Z5+Zz+zZ5+Y+Y4+YY+YY4+Z+Z5+ZZ+ZZ5+y+y4+yy+yy4+z+z5+zz+zz5 ";
2960
2961 static const std::string variable_list[] =
2962 {
2963 "A", "A0", "aA", "Aa0", "b", "B1", "Bb", "bB1",
2964 "c", "C2", "Cc", "Cc2", "D", "D3", "dD", "dD3",
2965 "E", "E4", "eE", "Ee4", "f", "F5", "Ff", "fF5",
2966 "g", "G6", "Gg", "Gg6", "H", "H7", "hH", "hH7",
2967 "I", "I8", "iI", "Ii8", "j", "J9", "Jj", "jJ9",
2968 "k", "K0", "Kk", "Kk0", "L", "L1", "lL", "lL1",
2969 "M", "M2", "mM", "Mm2", "n", "N3", "Nn", "nN3",
2970 "o", "O4", "Oo", "Oo4", "P", "P5", "pP", "pP5",
2971 "Q", "Q6", "qQ", "Qq6", "r", "R7", "Rr", "rR7",
2972 "s", "S8", "Ss", "Ss8", "T", "T9", "tT", "tT9",
2973 "U", "U0", "uU", "Uu0", "v", "V1", "Vv", "vV1",
2974 "w", "W2", "Ww", "Ww2", "X", "X3", "xX", "xX3",
2975 "Y", "Y4", "yY", "Yy4", "z", "Z5", "Zz", "zZ5"
2976 };
2977
2978 static const std::size_t variable_list_size = sizeof(variable_list) / sizeof(std::string);
2979
2980 static const std::size_t rounds = 300;
2981
2982 for (std::size_t r = 0; r < rounds; ++r)
2983 {
2984 symbol_table_t symbol_table_0;
2985 symbol_table_t symbol_table_1;
2986 expression_t expression;
2987
2988 std::vector<T> v;
2989 v.resize(variable_list_size);
2990
2991 for (std::size_t i = 0; i < variable_list_size; ++i)
2992 {
2993 v[i] = T(i);
2994 if (i & 1)
2995 symbol_table_0.add_variable(variable_list[i],v[i]);
2996 else
2997 symbol_table_1.add_variable(variable_list[i],v[i]);
2998 }
2999
3000 std::size_t total_symbol_count = symbol_table_0.variable_count() +
3001 symbol_table_1.variable_count();
3002
3003 if (variable_list_size != total_symbol_count)
3004 {
3005 printf("run_test03() - Error - Invalid number of variables in symbol_table! Expected: %d got: %d\n",
3006 static_cast<unsigned int>(variable_list_size),
3007 static_cast<unsigned int>(total_symbol_count));
3008
3009 return false;
3010 }
3011
3012 symbol_table_0.add_constants();
3013
3014 expression.register_symbol_table(symbol_table_0);
3015 expression.register_symbol_table(symbol_table_1);
3016
3017 {
3018 exprtk::parser<T> parser;
3019
3020 if (!parser.compile(expression_string,expression))
3021 {
3022 printf("run_test03() - Error: %s Expression: %s\n",
3023 parser.error().c_str(),
3024 expression_string.c_str());
3025
3026 return false;
3027 }
3028 }
3029
3030 expression.value();
3031 }
3032
3033 {
3034 static const std::string invalid_expr[] =
3035 {
3036 "x y",
3037 "x y z",
3038 "x y z w",
3039 "x 1",
3040 "x 1 2",
3041 "x 1 2 3",
3042 "x 'abc'",
3043 "x 1 'abc'",
3044 "x 'abc' 1",
3045 "1 2",
3046 "1 2 3",
3047 "1 2 3 4",
3048 "'abc' 'xyz'",
3049 "'abc' 1",
3050 "1 'abc'",
3051 "x sin(1)",
3052 "s 'abc'",
3053 "s x",
3054 "s y",
3055 "s 1",
3056 "s 1 x",
3057 "s 1 y",
3058 "s x 1",
3059 "s y 1",
3060 "x s ",
3061 "y s ",
3062 "1 s ",
3063 "1 s x",
3064 "1 s y",
3065 "x s 1",
3066 "y s 1",
3067 "v 'abc'",
3068 "v x ",
3069 "v y ",
3070 "v s ",
3071 "v 1 ",
3072 "v 1 x",
3073 "v 1 y",
3074 "v 1 s",
3075 "v x 1",
3076 "v y 1",
3077 "v s 1",
3078 "x v ",
3079 "y v ",
3080 "1 v ",
3081 "1 v x",
3082 "1 v y",
3083 "x v 1",
3084 "y v 1",
3085
3086 "(x == 'a string' )",
3087 "(x == 'a string'[1:3] )",
3088 "(x == 'a string' + 'b string' )",
3089 "(x == ('a string' + 'b string')[3:6])",
3090 "('a string' == x )",
3091 "('a string'[1:3] == x )",
3092 "('a string' + 'b string' == x )",
3093 "(('a string' + 'b string')[3:6] == x)",
3094
3095 "var a; var b; 3in(a)+sin(b) ",
3096 "var a; var b; sin(a)+3in(b) ",
3097 "var a; var b; sqrt(a)<3in(8) ",
3098 "var a; var b; (1.99-3in((b-b))) ",
3099 "var a; var b; ((3in(sin((b+b)))/1.06)-a) ",
3100 "var a; var b; ((sin(3in((b+b)))/1.06)-a) ",
3101 "var a; var b; (3in(x*(y+z))+cos(x*(y-z))) ",
3102 "var a; var b; (cos(x*(y+z))+3in(x*(y-z))) ",
3103
3104 "1++++",
3105 "1+-+-+",
3106 "1===",
3107 "1====",
3108 "[*][*][*][*][*]",
3109
3110 "var v[1] := {}; var s0appe0 := false; repeat s0appe0 false for(){(){}}",
3111 "var v[2] := {}; repeat var s0appe0 := false; s0appe0 false for(){(){}}",
3112 "var v[3] := {}; repeat var s0appe0 := false; for(){(){}} s0appe0 false",
3113 "var v[4] := {}; repeat var s0appe0 := false; s0appe0 for(){(){}} false",
3114 "var v[5] := {}; repeat for(){(){}} var s0appe0 := false; s0appe0 false",
3115 "var v{};v ;v 60;v 60;v o5",
3116
3117 "var vv[4] := [0]; v[k]",
3118 "var vv[4] := [0]; v[k + 1]",
3119 "var vv[4] := [0]; v[1 + k]"
3120 };
3121
3122 const std::size_t invalid_expr_size = sizeof(invalid_expr) / sizeof(std::string);
3123
3124 {
3125 for (std::size_t i = 0; i < invalid_expr_size; ++i)
3126 {
3127 symbol_table_t symbol_table;
3128 expression_t expression;
3129 parser_t parser;
3130
3131 T x = T(0);
3132 std::string s;
3133 std::vector<T> v(10, T(1.234));
3134
3135 symbol_table.add_variable ("x",x);
3136 symbol_table.add_stringvar("s",s);
3137 symbol_table.add_vector ("v",v);
3138
3139 if (parser.compile(invalid_expr[i],expression))
3140 {
3141 printf("run_test03() - Error: [1] Invalid expression compiled successfully. Expression: %s\n",
3142 invalid_expr[i].c_str());
3143
3144 return false;
3145 }
3146 }
3147 }
3148
3149 {
3150 T x = T(0);
3151 std::string s;
3152 std::vector<T> v(10, T(1.234));
3153
3154 symbol_table_t symbol_table;
3155 parser_t parser;
3156
3157 symbol_table.add_variable ("x",x);
3158 symbol_table.add_stringvar("s",s);
3159 symbol_table.add_vector ("v",v);
3160
3161 for (std::size_t i = 0; i < invalid_expr_size; ++i)
3162 {
3163 exprtk::expression<T> expression;
3164
3165 if (parser.compile(invalid_expr[i],expression))
3166 {
3167 printf("run_test03() - Error: [2] Invalid expression compiled successfully. Expression: %s\n",
3168 invalid_expr[i].c_str());
3169
3170 return false;
3171 }
3172 }
3173 }
3174
3175 {
3176 const std::string base_expression =
3177 "1+(2+2(3+3(4+4cos(((((a+((x*(e-tan((cos((((((b/(tan(((1.60*a)-0.34))-0.76))-x)+y)-3.27)+a))/pi))))^a))+y)*b)-e))+e)/z)+w)+"
3178 "(((b+(a/((((tan((b*((((((a-(cos((cos(tan(((a+a)*3.33)))-b))/2.52))*x)/b)+3.07)^0.86)+b)))*3.95)/0.39)*y)+a)))*a)*z)";
3179
3180 const std::string mod =
3181 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789^+-/*,;:<>=%?[]{}() #&'\"\\\t\r\n";
3182
3183 symbol_table_t symbol_table;
3184 expression_t expression;
3185 parser_t parser;
3186
3187 T a = T(1.1 );
3188 T b = T(2.2 );
3189 T c = T(3.3 );
3190 T d = T(4.5 );
3191 T e = T(4.5 );
3192 T x = T(2.123456);
3193 T y = T(3.123456);
3194 T z = T(4.123456);
3195 T w = T(5.123456);
3196
3197 symbol_table.add_variable("a", a);
3198 symbol_table.add_variable("b", b);
3199 symbol_table.add_variable("c", c);
3200 symbol_table.add_variable("d", d);
3201 symbol_table.add_variable("e", e);
3202
3203 symbol_table.add_variable("x", x);
3204 symbol_table.add_variable("y", y);
3205 symbol_table.add_variable("z", z);
3206 symbol_table.add_variable("w", w);
3207
3208 expression.register_symbol_table(symbol_table);
3209
3210 T total = T(0);
3211
3212 for (std::size_t j = 0; j < base_expression.size(); ++j)
3213 {
3214 std::string expression_str = base_expression;
3215 const char old_c = base_expression[j];
3216
3217 for (std::size_t i = 0; i < mod.size(); ++i)
3218 {
3219 expression_str[j] = mod[i];
3220
3221 if (parser.compile(expression_str, expression))
3222 {
3223 total += expression.value();
3224 }
3225 }
3226
3227 expression_str[j] = old_c;
3228 }
3229
3230 if (total == T(12345.6789)) { printf(" "); }
3231 }
3232 }
3233
3234 return true;
3235}

References exprtk::parser< T >::compile(), exprtk::parser< T >::error(), and rounds.

Here is the call graph for this function:

◆ run_test04()

template<typename T >
bool run_test04 ( )
inline

Definition at line 3244 of file exprtk_real_test.cpp.

3245{
3246 std::string expression_string = "clamp(-1.0,sin(2 * pi * x) + cos(y / 2 * pi),+1.0)";
3247
3248 exprtk::symbol_table<T> symbol_table;
3249 exprtk::expression<T> expression;
3250
3251 T x = T(-1000);
3252 T y = T(-1000);
3253
3254 symbol_table.add_variable("x",x);
3255 symbol_table.add_variable("y",y);
3256 symbol_table.add_constants();
3257
3258 expression.register_symbol_table(symbol_table);
3259
3260 {
3261 exprtk::parser<T> parser;
3262
3263 if (!parser.compile(expression_string,expression))
3264 {
3265 printf("run_test04() - Error: %s Expression: %s\n",
3266 parser.error().c_str(),
3267 expression_string.c_str());
3268
3269 return false;
3270 }
3271 }
3272
3273 const T pi = T(3.141592653589793238462643383279502);
3274 const T increment = T(0.0001);
3275
3276 while ((x <= T(+1000)) && (y <= T(+1000)))
3277 {
3278 T result1 = expression.value();
3279 T result2 = clamp<T>(-1.0,real::sin(2 * pi * x) + real::cos(y / 2 * pi),+1.0);
3280
3281 if (not_equal(result1,result2))
3282 {
3283 printf("run_test04() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f x:%19.15f\ty:%19.15f\n",
3284 expression_string.c_str(),
3285 static_cast<double>(result1),
3286 static_cast<double>(result2),
3287 static_cast<double>(x),
3288 static_cast<double>(y));
3289
3290 return false;
3291 }
3292
3293 x += increment;
3294 y += increment;
3295 }
3296
3297 return true;
3298}
const double pi
type sin(const type v)
type cos(const type v)

References exprtk::symbol_table< T >::add_constants(), exprtk::symbol_table< T >::add_variable(), exprtk::parser< T >::compile(), real::cos(), exprtk::parser< T >::error(), not_equal(), pi, exprtk::expression< T >::register_symbol_table(), real::sin(), and exprtk::expression< T >::value().

Here is the call graph for this function:

◆ run_test05()

template<typename T >
bool run_test05 ( )
inline

Definition at line 3301 of file exprtk_real_test.cpp.

3302{
3303 typedef exprtk::expression<T> expression_t;
3304 std::string expression_string = "clamp(-1.0,sin(2 * pi * x_var123) + cos(y_var123 / 2 * pi),+1.0)";
3305
3306 exprtk::symbol_table<T> symbol_table;
3307 std::deque<expression_t> expression_list;
3308
3309 T x = T(-1000);
3310 T y = T(-1000);
3311
3312 symbol_table.add_variable("x_var123",x);
3313 symbol_table.add_variable("y_var123",y);
3314 symbol_table.add_constants();
3315
3316 const std::size_t expression_count = 10;
3317 for (std::size_t i = 0; i < expression_count; ++i)
3318 {
3319 expression_t e;
3320 e.register_symbol_table(symbol_table);
3321
3322 {
3323 exprtk::parser<T> parser;
3324
3325 if (!parser.compile(expression_string,e))
3326 {
3327 printf("run_test05() - Error: %s Expression: %s\n",
3328 parser.error().c_str(),
3329 expression_string.c_str());
3330
3331 return false;
3332 }
3333 }
3334
3335 expression_list.push_back(e);
3336 }
3337
3338 const T pi = T(3.141592653589793238462643383279502);
3339 const T increment = T(0.001);
3340
3341 while ((x <= T(+1000)) && (y <= T(+1000)))
3342 {
3343 T real_result = clamp<T>(-1.0,real::sin(2 * pi * x) + real::cos(y / 2 * pi),+1.0);
3344
3345 for (std::size_t i = 0; i < expression_list.size(); ++i)
3346 {
3347 expression_t& expr = expression_list[i];
3348
3349 T result = expr.value();
3350
3351 if (not_equal(result,real_result))
3352 {
3353 printf("run_test05() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f x:%19.15f\ty:%19.15f\tIndex:%d\n",
3354 expression_string.c_str(),
3355 static_cast<double>(real_result),
3356 static_cast<double>(result),
3357 static_cast<double>(x),
3358 static_cast<double>(y),
3359 static_cast<unsigned int>(i));
3360
3361 return false;
3362 }
3363 }
3364
3365 x += increment;
3366 y += increment;
3367 }
3368
3369 return true;
3370}
static const std::string expression_list[]

References exprtk::symbol_table< T >::add_constants(), exprtk::symbol_table< T >::add_variable(), exprtk::parser< T >::compile(), real::cos(), exprtk::parser< T >::error(), expression_list, not_equal(), pi, and real::sin().

Here is the call graph for this function:

◆ run_test06()

template<typename T >
bool run_test06 ( )
inline

Definition at line 3373 of file exprtk_real_test.cpp.

3374{
3375 typedef exprtk::expression<T> expression_t;
3376 std::string expression_string = "sqrt(1 - (x^2))";
3377
3378 T x = T(0);
3379
3380 exprtk::symbol_table<T> symbol_table;
3381 symbol_table.add_variable("x",x);
3382
3383 expression_t expression;
3384 expression.register_symbol_table(symbol_table);
3385
3386 {
3387 exprtk::parser<T> parser;
3388
3389 if (!parser.compile(expression_string,expression))
3390 {
3391 printf("run_test06() - Error: %s Expression: %s\n",
3392 parser.error().c_str(),
3393 expression_string.c_str());
3394
3395 return false;
3396 }
3397 }
3398
3399 T total_area1 = exprtk::integrate(expression,x,T(-1),T(1));
3400 T total_area2 = exprtk::integrate(expression,"x",T(-1),T(1));
3401 const T pi = T(3.141592653589793238462643383279502);
3402
3403 if (not_equal(total_area1,total_area2,T(0.000001)))
3404 {
3405 printf("run_test06() - Integration Error: area1 != area2\n");
3406 return false;
3407 }
3408
3409 if (not_equal(total_area1,T(pi) / T(2),T(0.000001)))
3410 {
3411 printf("run_test06() - Integration Error: Expected: %19.15f\tResult: %19.15f\n",
3412 static_cast<double>((pi / T(2))),
3413 static_cast<double>(total_area1));
3414
3415 return false;
3416 }
3417
3418 return true;
3419}
T integrate(const expression< T > &e, T &x, const T &r0, const T &r1, const std::size_t number_of_intervals=1000000)
Definition exprtk.hpp:41863

References exprtk::symbol_table< T >::add_variable(), exprtk::parser< T >::compile(), exprtk::parser< T >::error(), exprtk::integrate(), not_equal(), and pi.

Here is the call graph for this function:

◆ run_test07()

template<typename T >
bool run_test07 ( )
inline

Definition at line 3422 of file exprtk_real_test.cpp.

3423{
3424 typedef exprtk::expression<T> expression_t;
3425 std::string expression_string = "sin(2x + 1 / 3)";
3426
3427 T x = T(0);
3428
3429 exprtk::symbol_table<T> symbol_table;
3430 symbol_table.add_variable("x",x);
3431
3432 expression_t expression;
3433 expression.register_symbol_table(symbol_table);
3434
3435 {
3436 exprtk::parser<T> parser;
3437
3438 if (!parser.compile(expression_string,expression))
3439 {
3440 printf("run_test07() - Error: %s Expression: %s\n",
3441 parser.error().c_str(),
3442 expression_string.c_str());
3443
3444 return false;
3445 }
3446 }
3447
3448 for (x = T(-200); x < T(200); x += T(0.0001))
3449 {
3450 {
3451 T deriv1_real_result = T(2) * real::cos(T(2) * x + T(1.0 / 3.0));
3452 T deriv1_result1 = exprtk::derivative(expression,x);
3453 T deriv1_result2 = exprtk::derivative(expression,"x");
3454
3455 if (not_equal(deriv1_result1,deriv1_result2,T(0.00001)))
3456 {
3457 printf("run_test07() - 1st Derivative Error: result1 != result2\n");
3458 return false;
3459 }
3460
3461 if (not_equal(deriv1_result1,deriv1_real_result,T(0.00001)))
3462 {
3463 printf("run_test07() - 1st Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
3464 static_cast<double>(x),
3465 static_cast<double>(deriv1_real_result),
3466 static_cast<double>(deriv1_result1));
3467
3468 return false;
3469 }
3470 }
3471
3472 {
3473 T deriv2_real_result = T(-4) * real::sin(T(2) * x + T(1.0 / 3.0));
3474 T deriv2_result1 = exprtk::second_derivative(expression,x);
3475 T deriv2_result2 = exprtk::second_derivative(expression,"x");
3476
3477 if (not_equal(deriv2_result1,deriv2_result2,T(0.0000001)))
3478 {
3479 printf("run_test07() - 2nd Derivative Error: result1 != result2\n");
3480 return false;
3481 }
3482
3483 if (not_equal(deriv2_result1,deriv2_real_result,T(0.01)))
3484 {
3485 printf("run_test07() - 2nd Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
3486 static_cast<double>(x),
3487 static_cast<double>(deriv2_real_result),
3488 static_cast<double>(deriv2_result1));
3489
3490 return false;
3491 }
3492 }
3493
3494 {
3495 T deriv3_real_result = T(-8) * real::cos(T(2) * x + T(1.0 / 3.0));
3496 T deriv3_result1 = exprtk::third_derivative(expression,x);
3497 T deriv3_result2 = exprtk::third_derivative(expression,"x");
3498
3499 if (not_equal(deriv3_result1,deriv3_result2,T(0.0000001)))
3500 {
3501 printf("run_test07() - 3rd Derivative Error: result1 != result2\n");
3502 return false;
3503 }
3504
3505 if (not_equal(deriv3_result1,deriv3_real_result,T(0.01)))
3506 {
3507 printf("run_test07() - 3rd Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
3508 static_cast<double>(x),
3509 static_cast<double>(deriv3_real_result),
3510 static_cast<double>(deriv3_result1));
3511
3512 return false;
3513 }
3514 }
3515 }
3516
3517 return true;
3518}
T third_derivative(const expression< T > &e, T &x, const T &h=T(0.0001))
Definition exprtk.hpp:41958
T derivative(const expression< T > &e, T &x, const T &h=T(0.00000001))
Definition exprtk.hpp:41915
T second_derivative(const expression< T > &e, T &x, const T &h=T(0.00001))
Definition exprtk.hpp:41936

References exprtk::symbol_table< T >::add_variable(), exprtk::parser< T >::compile(), real::cos(), exprtk::derivative(), exprtk::parser< T >::error(), not_equal(), exprtk::second_derivative(), real::sin(), and exprtk::third_derivative().

Here is the call graph for this function:

◆ run_test08()

template<typename T >
bool run_test08 ( )
inline

Definition at line 3521 of file exprtk_real_test.cpp.

3522{
3523
3524 static const std::string expr_str[] =
3525 {
3526 "x", "y", "z", "w", "u",
3527 "x + y + z + w + u",
3528 "x + y / z * w ^ u",
3529 "x:=1.1", "y:=2.2", "z:=3.3", "w:=4.4", "u:=5.5",
3530 "x:=x+1.1", "y:=y+2.2", "z:=z+3.3", "w:=w+4.4", "u:=u+5.5",
3531 "x:=1.1+x", "y:=2.2+y", "z:=3.3+z", "w:=4.4+w", "u:=5.5+u",
3532 "x:=(x <= 1.1)",
3533 "y:=(2.2 >= y)",
3534 "z:=(3.3 and z)",
3535 "w:=(4.4 or w)",
3536 "u:=(u xor 5.5)",
3537 "min(x,y) + min(x,y,z) + min(x,y,z,w) + min(x,y,z,w,y)",
3538 "max(x,y) + max(x,y,z) + max(x,y,z,w) + max(x,y,z,w,y)",
3539 "avg(x,y)",
3540 "avg(x,y,z)",
3541 "avg(x,y,z,w)",
3542 "avg(x,y,z,w,u)",
3543 "(u := u := min(x:=1,y:=2,z:=3)) == 1",
3544 "(2x+3y+4z+5w)==(2*x+3*y+4*z+5*w)",
3545 "(3(x+y)/2+1)==(3*(x+y)/2+1)",
3546 "((x+y)3+1/4)==((x+y)*3+1/4)",
3547 "((x+y)z+1/2)==((x+y)*z+1/2)",
3548 "(x+y^3/z) == (x+(y*y*y)/z)",
3549 "(z-x^3+y^2*7) == (z-(x*x*x)+(y*y)*7)",
3550 "(3min(x,y))==(3*min(x,y))",
3551 "(sin(x)y)==(sin(x)*y)",
3552 "(sin(x)cos(y)+1)==(sin(x)*cos(y)+1)",
3553 "(sgn(sin(x))cos(sgn(y))+1)==(sgn(sin(x))*cos(sgn(y))+1)",
3554 "equal($f00(x,y,z),(x+y)/z)",
3555 "equal($f01(x,y,z),(x+y)*z)",
3556 "equal($f02(x,y,z),(x+y)-z)",
3557 "equal($f03(x,y,z),(x+y)+z)",
3558 "equal($f04(x,y,z),(x-y)+z)",
3559 "equal($f05(x,y,z),(x-y)/z)",
3560 "equal($f06(x,y,z),(x-y)*z)",
3561 "equal($f07(x,y,z),(x*y)+z)",
3562 "equal($f08(x,y,z),(x*y)-z)",
3563 "equal($f09(x,y,z),(x*y)/z)",
3564 "equal($f10(x,y,z),(x*y)*z)",
3565 "equal($f11(x,y,z),(x/y)+z)",
3566 "equal($f12(x,y,z),(x/y)-z)",
3567 "equal($f13(x,y,z),(x/y)/z)",
3568 "equal($f14(x,y,z),(x/y)*z)",
3569 "equal($f15(x,y,z),x/(y+z))",
3570 "equal($f16(x,y,z),x/(y-z))",
3571 "equal($f17(x,y,z),x/(y*z))",
3572 "equal($f18(x,y,z),x/(y/z))",
3573 "equal($f19(x,y,z),x*(y+z))",
3574 "equal($f20(x,y,z),x*(y-z))",
3575 "equal($f21(x,y,z),x*(y*z))",
3576 "equal($f22(x,y,z),x*(y/z))",
3577 "equal($f23(x,y,z),x-(y+z))",
3578 "equal($f24(x,y,z),x-(y-z))",
3579 "equal($f25(x,y,z),x-(y/z))",
3580 "equal($f26(x,y,z),x-(y*z))",
3581 "equal($f27(x,y,z),x+(y*z))",
3582 "equal($f28(x,y,z),x+(y/z))",
3583 "equal($f29(x,y,z),x+(y+z))",
3584 "equal($f30(x,y,z),x+(y-z))",
3585 "equal($f31(x,y,z),x*y^2+z)",
3586 "equal($f32(x,y,z),x*y^3+z)",
3587 "equal($f33(x,y,z),x*y^4+z)",
3588 "equal($f34(x,y,z),x*y^5+z)",
3589 "equal($f35(x,y,z),x*y^6+z)",
3590 "equal($f36(x,y,z),x*y^7+z)",
3591 "equal($f37(x,y,z),x*y^8+z)",
3592 "equal($f38(x,y,z),x*y^9+z)",
3593 "equal($f39(x,y,z),x*log(y)+z)",
3594 "equal($f40(x,y,z),x*log(y)-z)",
3595 "equal($f41(x,y,z),x*log10(y)+z)",
3596 "equal($f42(x,y,z),x*log10(y)-z)",
3597 "equal($f43(x,y,z),x*sin(y)+z)",
3598 "equal($f44(x,y,z),x*sin(y)-z)",
3599 "equal($f45(x,y,z),x*cos(y)+z)",
3600 "equal($f46(x,y,z),x*cos(y)-z)",
3601 "equal($f47(x,y,z),if(0!=x,y,z))",
3602 "equal($f48(x,y,z,w),x+((y+z)/w))",
3603 "equal($f49(x,y,z,w),x+((y+z)*w))",
3604 "equal($f50(x,y,z,w),x+((y-z)/w))",
3605 "equal($f51(x,y,z,w),x+((y-z)*w))",
3606 "equal($f52(x,y,z,w),x+((y*z)/w))",
3607 "equal($f53(x,y,z,w),x+((y*z)*w))",
3608 "equal($f54(x,y,z,w),x+((y/z)+w))",
3609 "equal($f55(x,y,z,w),x+((y/z)/w))",
3610 "equal($f56(x,y,z,w),x+((y/z)*w))",
3611 "equal($f57(x,y,z,w),x-((y+z)/w))",
3612 "equal($f58(x,y,z,w),x-((y+z)*w))",
3613 "equal($f59(x,y,z,w),x-((y-z)/w))",
3614 "equal($f60(x,y,z,w),x-((y-z)*w))",
3615 "equal($f61(x,y,z,w),x-((y*z)/w))",
3616 "equal($f62(x,y,z,w),x-((y*z)*w))",
3617 "equal($f63(x,y,z,w),x-((y/z)/w))",
3618 "equal($f64(x,y,z,w),x-((y/z)*w))",
3619 "equal($f65(x,y,z,w),((x+y)*z)-w)",
3620 "equal($f66(x,y,z,w),((x-y)*z)-w)",
3621 "equal($f67(x,y,z,w),((x*y)*z)-w)",
3622 "equal($f68(x,y,z,w),((x/y)*z)-w)",
3623 "equal($f69(x,y,z,w),((x+y)/z)-w)",
3624 "equal($f70(x,y,z,w),((x-y)/z)-w)",
3625 "equal($f71(x,y,z,w),((x*y)/z)-w)",
3626 "equal($f72(x,y,z,w),((x/y)/z)-w)",
3627 "equal($f73(x,y,z,w),(x*y)+(z*w))",
3628 "equal($f74(x,y,z,w),(x*y)-(z*w))",
3629 "equal($f75(x,y,z,w),(x*y)+(z/w))",
3630 "equal($f76(x,y,z,w),(x*y)-(z/w))",
3631 "equal($f77(x,y,z,w),(x/y)+(z/w))",
3632 "equal($f78(x,y,z,w),(x/y)-(z/w))",
3633 "equal($f79(x,y,z,w),(x/y)-(z*w))",
3634 "equal($f80(x,y,z,w),x/(y+(z*w)))",
3635 "equal($f81(x,y,z,w),x/(y-(z*w)))",
3636 "equal($f82(x,y,z,w),x*(y+(z*w)))",
3637 "equal($f83(x,y,z,w),x*(y-(z*w)))",
3638 "equal($f84(x,y,z,w),x*y^2+z*w^2)",
3639 "equal($f85(x,y,z,w),x*y^3+z*w^3)",
3640 "equal($f86(x,y,z,w),x*y^4+z*w^4)",
3641 "equal($f87(x,y,z,w),x*y^5+z*w^5)",
3642 "equal($f88(x,y,z,w),x*y^6+z*w^6)",
3643 "equal($f89(x,y,z,w),x*y^7+z*w^7)",
3644 "equal($f90(x,y,z,w),x*y^8+z*w^8)",
3645 "equal($f91(x,y,z,w),x*y^9+z*w^9)",
3646 "equal($f92(x,y,z,w),if(x and y,z,w))",
3647 "equal($f93(x,y,z,w),if(x or y,z,w))",
3648 "equal($f94(x,y,z,w),if(x < y,z,w))",
3649 "equal($f95(x,y,z,w),if(x <= y,z,w))",
3650 "equal($f96(x,y,z,w),if(x > y,z,w))",
3651 "equal($f97(x,y,z,w),if(x >= y,z,w))",
3652 "equal($f98(x,y,z,w),if(equal(x,y),z,w))",
3653 "equal($f92(x,y,z,w),x and y ? z : w)",
3654 "equal($f93(x,y,z,w),x or y ? z : w)",
3655 "equal($f94(x,y,z,w),x < y ? z : w)",
3656 "equal($f95(x,y,z,w),x <= y ? z : w)",
3657 "equal($f96(x,y,z,w),x > y ? z : w)",
3658 "equal($f97(x,y,z,w),x >= y ? z : w)",
3659 "equal($f98(x,y,z,w),equal(x,y) ? z : w)",
3660 "equal($f99(x,y,z,w),x*sin(y)+z*cos(w))"
3661 };
3662
3663 static const std::size_t expr_str_size = sizeof(expr_str) / sizeof(std::string);
3664
3665 static const std::size_t rounds = 25;
3666
3667 for (std::size_t i = 0; i < rounds; ++i)
3668 {
3669 for (std::size_t j = 0; j < expr_str_size; ++j)
3670 {
3671 typedef exprtk::expression<T> expression_t;
3672
3673 T x = T(1.12345);
3674 T y = T(2.12345);
3675 T z = T(3.12345);
3676 T w = T(4.12345);
3677 T u = T(5.12345);
3678
3679 exprtk::symbol_table<T> symbol_table;
3680 symbol_table.add_variable("x",x);
3681 symbol_table.add_variable("y",y);
3682 symbol_table.add_variable("z",z);
3683 symbol_table.add_variable("w",w);
3684 symbol_table.add_variable("u",u);
3685
3686 expression_t expression;
3687 expression.register_symbol_table(symbol_table);
3688
3689 {
3690 exprtk::parser<T> parser;
3691
3692 if (!parser.compile(expr_str[j],expression))
3693 {
3694 printf("run_test08() - Error: %s Expression: %s\n",
3695 parser.error().c_str(),
3696 expr_str[j].c_str());
3697
3698 return false;
3699 }
3700 }
3701
3702 expression.value();
3703 }
3704 }
3705
3706 return true;
3707}

References exprtk::symbol_table< T >::add_variable(), exprtk::parser< T >::compile(), exprtk::parser< T >::error(), and rounds.

Here is the call graph for this function:

◆ run_test09()

template<typename T >
bool run_test09 ( )
inline

Definition at line 3734 of file exprtk_real_test.cpp.

3735{
3736 {
3737 static const std::size_t rounds = 1000;
3738 for (std::size_t i = 0; i < rounds; ++i)
3739 {
3740 typedef exprtk::expression<T> expression_t;
3741 const std::string expression_string =
3742 "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3743 "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3744 "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3745 "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3746 "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)+"
3747 "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3748 "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3749 "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3750 "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3751 "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)+"
3752 "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3753 "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3754 "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3755 "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3756 "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)+"
3757 "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3758 "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3759 "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3760 "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3761 "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)";
3762
3763 T x = T(1) + (i / T(10000));
3764 T y = T(2) + (i / T(10000));
3765 myfunc<T> mf;
3766
3767 exprtk::symbol_table<T> symbol_table;
3768 symbol_table.add_variable("x",x);
3769 symbol_table.add_variable("y",y);
3770 symbol_table.add_function("myfunc0",mf);
3771 symbol_table.add_function("myfunc1",mf);
3772 symbol_table.add_function("myfunc2",mf);
3773 symbol_table.add_function("myfunc3",mf);
3774 symbol_table.add_function("myfunc4",mf);
3775 symbol_table.add_function("myfunc5",mf);
3776 symbol_table.add_function("myfunc6",mf);
3777 symbol_table.add_function("myfunc7",mf);
3778 symbol_table.add_function("myfunc8",mf);
3779 symbol_table.add_function("myfunc9",mf);
3780 symbol_table.add_constants();
3781
3782 expression_t expression;
3783 expression.register_symbol_table(symbol_table);
3784
3785 {
3786 exprtk::parser<T> parser;
3787
3788 if (!parser.compile(expression_string,expression))
3789 {
3790 printf("run_test09() - Error: %s Expression: %s\n",
3791 parser.error().c_str(),
3792 expression_string.c_str());
3793
3794 return false;
3795 }
3796 }
3797
3798 const T pi = T(3.141592653589793238462643383279502);
3799
3800 const T result = expression.value();
3801
3802 const T expected =
3803 T(4) *
3804 (
3805 mf(sin(x * pi), y / T(2)) +
3806 mf(sin(x * pi), y / T(2)) +
3807 mf(sin(x * pi), y / T(2)) +
3808 mf(sin(x * pi), y / T(2)) +
3809 mf(sin(x * pi), y / T(2)) +
3810 mf(sin(x * pi), y / T(2)) +
3811 mf(sin(x * pi), y / T(2)) +
3812 mf(sin(x * pi), y / T(2)) +
3813 mf(sin(x * pi), y / T(2)) +
3814 mf(sin(x * pi), y / T(2))
3815 );
3816
3817 if (not_equal(result,expected,T(0.0000001)))
3818 {
3819 printf("run_test09() - Error Expected: %19.15f\tResult: %19.15f\n",
3820 static_cast<double>(expected),
3821 static_cast<double>(result));
3822
3823 return false;
3824 }
3825 }
3826 }
3827
3828 {
3829 typedef exprtk::expression<T> expression_t;
3830 typedef exprtk::symbol_table<T> symbol_table_t;
3831
3832 bool result = true;
3833
3834 const std::string expression_list[] =
3835 {
3836 "foo1(1) == 1",
3837 "foo2(1,2) == (1 + 2)",
3838 "foo3(1,2,3) == (1 + 2 + 3)",
3839 "foo4(1,2,3,4) == (1 + 2 + 3 + 4)",
3840 "foo5(1,2,3,4,5) == (1 + 2 + 3 + 4 + 5)",
3841 "foo6(1,2,3,4,5,6) == (1 + 2 + 3 + 4 + 5 + 6)"
3842 };
3843
3844 const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
3845
3846 symbol_table_t symbol_table;
3847
3848 symbol_table.add_function("foo1",foo1);
3849 symbol_table.add_function("foo2",foo2);
3850 symbol_table.add_function("foo3",foo3);
3851 symbol_table.add_function("foo4",foo4);
3852 symbol_table.add_function("foo5",foo5);
3853 symbol_table.add_function("foo6",foo6);
3854
3855 for (std::size_t i = 0; i < expression_list_size; ++i)
3856 {
3857 expression_t expression;
3858 expression.register_symbol_table(symbol_table);
3859
3860 exprtk::parser<T> parser;
3861
3862 if (!parser.compile(expression_list[i],expression))
3863 {
3864 printf("run_test09() - Error: %s Expression: %s\n",
3865 parser.error().c_str(),
3866 expression_list[i].c_str());
3867
3868 result = false;
3869 }
3870 }
3871
3872 if (!result)
3873 return false;
3874 }
3875
3876 return true;
3877}
bool add_function(const std::string &function_name, function_t &function)
Definition exprtk.hpp:20811
const std::size_t expression_list_size
numeric_type foo4(numeric_type v0, numeric_type v1, numeric_type v2, numeric_type v3)
numeric_type foo6(numeric_type v0, numeric_type v1, numeric_type v2, numeric_type v3, numeric_type v4, numeric_type v5)
numeric_type foo5(numeric_type v0, numeric_type v1, numeric_type v2, numeric_type v3, numeric_type v4)
numeric_type foo2(numeric_type v0, numeric_type v1)
numeric_type foo1(numeric_type v0)
numeric_type foo3(numeric_type v0, numeric_type v1, numeric_type v2)
complex_t sin(const complex_t v)

References exprtk::symbol_table< T >::add_constants(), exprtk::symbol_table< T >::add_function(), exprtk::symbol_table< T >::add_variable(), exprtk::parser< T >::compile(), exprtk::parser< T >::error(), expression_list, expression_list_size, foo1(), foo2(), foo3(), foo4(), foo5(), foo6(), not_equal(), pi, and rounds.

Here is the call graph for this function:

◆ run_test10()

template<typename T >
bool run_test10 ( )
inline

Definition at line 3880 of file exprtk_real_test.cpp.

3881{
3882 typedef exprtk::expression<T> expression_t;
3883
3884 T x = T(1.1);
3885 T y = T(2.2);
3886 T xx = T(3.3);
3887 T yy = T(4.4);
3888
3889 std::string i_s = "A String";
3890 std::string j_s = "Another String";
3891 std::string ii_s = "A String";
3892 std::string jj_s = "Another String";
3893
3894 struct test
3895 {
3896 static inline bool variable(exprtk::symbol_table<T>& symbol_table, const std::string& variable_name, const T& value)
3897 {
3898 exprtk::details::variable_node<T>* var = symbol_table.get_variable(variable_name);
3899
3900 if (var)
3901 return (!not_equal(var->ref(),value));
3902 else
3903 return false;
3904 }
3905
3906 static inline bool string(exprtk::symbol_table<T>& symbol_table, const std::string& string_name, const std::string& str)
3907 {
3908 exprtk::details::stringvar_node<T>* str_node = symbol_table.get_stringvar(string_name);
3909
3910 if (str_node)
3911 return (str_node->ref() == str);
3912 else
3913 return false;
3914 }
3915 };
3916
3917 {
3918 static const std::size_t rounds = 10;
3919
3920 exprtk::symbol_table<T> symbol_table;
3921
3922 for (std::size_t r = 0; r < rounds; ++r)
3923 {
3924 symbol_table.add_variable("x" , x );
3925 symbol_table.add_variable("y" , y );
3926 symbol_table.add_variable("xx", xx);
3927 symbol_table.add_variable("yy", yy);
3928
3929 if (!symbol_table.symbol_exists("x"))
3930 {
3931 printf("run_test10() - Symbol 'x' does not exist!\n");
3932 return false;
3933 }
3934 else if (!symbol_table.symbol_exists("y"))
3935 {
3936 printf("run_test10() - Symbol 'y' does not exist!\n");
3937 return false;
3938 }
3939 else if (!symbol_table.symbol_exists("xx"))
3940 {
3941 printf("run_test10() - Symbol 'xx' does not exist!\n");
3942 return false;
3943 }
3944 else if (!symbol_table.symbol_exists("yy"))
3945 {
3946 printf("run_test10() - Symbol 'yy' does not exist!\n");
3947 return false;
3948 }
3949 else if (!test::variable(symbol_table, "x", x))
3950 {
3951 printf("run_test10() - Symbol 'x' value failure!\n");
3952 return false;
3953 }
3954 else if (!test::variable(symbol_table, "y", y))
3955 {
3956 printf("run_test10() - Symbol 'y' value failure!\n");
3957 return false;
3958 }
3959 else if (!test::variable(symbol_table, "xx", xx))
3960 {
3961 printf("run_test10() - Symbol 'xx' value failure!\n");
3962 return false;
3963 }
3964 else if (!test::variable(symbol_table, "yy", yy))
3965 {
3966 printf("run_test10() - Symbol 'yy' value failure!\n");
3967 return false;
3968 }
3969
3970 if (!symbol_table.remove_variable("x"))
3971 {
3972 printf("run_test10() - Failed to remove symbol 'x'!\n");
3973 return false;
3974 }
3975 else if (!symbol_table.remove_variable("y"))
3976 {
3977 printf("run_test10() - Failed to remove symbol 'y'!\n");
3978 return false;
3979 }
3980 else if (!symbol_table.remove_variable("xx"))
3981 {
3982 printf("run_test10() - Failed to remove symbol 'xx'!\n");
3983 return false;
3984 }
3985 else if (!symbol_table.remove_variable("yy"))
3986 {
3987 printf("run_test10() - Failed to remove symbol 'yy'!\n");
3988 return false;
3989 }
3990 }
3991
3992 for (std::size_t r = 0; r < rounds; ++r)
3993 {
3994 myfunc<T> mf;
3995
3996 symbol_table.add_function("f", mf);
3997 symbol_table.add_function("f1", mf);
3998
3999 if (!symbol_table.symbol_exists("f"))
4000 {
4001 printf("run_test10() - function 'f' does not exist!\n");
4002 return false;
4003 }
4004 else if (!symbol_table.symbol_exists("f1"))
4005 {
4006 printf("run_test10() - function 'f1' does not exist!\n");
4007 return false;
4008 }
4009
4010 if (!symbol_table.remove_function("f"))
4011 {
4012 printf("run_test10() - Failed to remove function 'f'!\n");
4013 return false;
4014 }
4015 else if (!symbol_table.remove_function("f1"))
4016 {
4017 printf("run_test10() - Failed to remove function 'f1'!\n");
4018 return false;
4019 }
4020 }
4021
4022 for (std::size_t r = 0; r < rounds; ++r)
4023 {
4024 symbol_table.add_stringvar("i", i_s);
4025 symbol_table.add_stringvar("j", j_s);
4026
4027 symbol_table.add_stringvar("ii", ii_s);
4028 symbol_table.add_stringvar("jj", jj_s);
4029
4030 if (!symbol_table.symbol_exists("i"))
4031 {
4032 printf("run_test10() - String 'i' does not exist!\n");
4033 return false;
4034 }
4035 else if (!symbol_table.symbol_exists("j"))
4036 {
4037 printf("run_test10() - String 'j' does not exist!\n");
4038 return false;
4039 }
4040 else if (!symbol_table.symbol_exists("ii"))
4041 {
4042 printf("run_test10() - String 'ii' does not exist!\n");
4043 return false;
4044 }
4045 else if (!symbol_table.symbol_exists("jj"))
4046 {
4047 printf("run_test10() - String 'jj' does not exist!\n");
4048 return false;
4049 }
4050 else if (!test::string(symbol_table, "i", i_s))
4051 {
4052 printf("run_test10() - String 'i' value failure!\n");
4053 return false;
4054 }
4055 else if (!test::string(symbol_table, "j", j_s))
4056 {
4057 printf("run_test10() - String 'j' value failure!\n");
4058 return false;
4059 }
4060 else if (!test::string(symbol_table, "ii", ii_s))
4061 {
4062 printf("run_test10() - String 'ii' value failure!\n");
4063 return false;
4064 }
4065 else if (!test::string(symbol_table, "jj", jj_s))
4066 {
4067 printf("run_test10() - String 'jj' value failure!\n");
4068 return false;
4069 }
4070 else if (!symbol_table.remove_stringvar("i"))
4071 {
4072 printf("run_test10() - Failed to remove String 'i'!\n");
4073 return false;
4074 }
4075 else if (!symbol_table.remove_stringvar("j"))
4076 {
4077 printf("run_test10() - Failed to remove String 'j'!\n");
4078 return false;
4079 }
4080 else if (!symbol_table.remove_stringvar("ii"))
4081 {
4082 printf("run_test10() - Failed to remove String 'ii'!\n");
4083 return false;
4084 }
4085 else if (!symbol_table.remove_stringvar("jj"))
4086 {
4087 printf("run_test10() - Failed to remove String 'jj'!\n");
4088 return false;
4089 }
4090 }
4091
4092 for (std::size_t r = 0; r < rounds; ++r)
4093 {
4094 symbol_table.add_variable("x" , x );
4095 symbol_table.add_variable("y" , y );
4096 symbol_table.add_variable("xx", xx);
4097 symbol_table.add_variable("yy", yy);
4098
4099 std::vector<std::string> expected_var_list;
4100
4101 expected_var_list.push_back("x" );
4102 expected_var_list.push_back("y" );
4103 expected_var_list.push_back("xx");
4104 expected_var_list.push_back("yy");
4105
4106 std::deque<std::pair<std::string, T> > variable_list;
4107
4108 symbol_table.get_variable_list(variable_list);
4109
4110 if (variable_list.size() != expected_var_list.size())
4111 {
4112 printf("run_test10() - Failed to get variable list (1)\n");
4113 return false;
4114 }
4115
4116 std::size_t found_count = 0;
4117
4118 for (std::size_t i = 0; i < variable_list.size(); ++i)
4119 {
4120 for (std::size_t j = 0; j < expected_var_list.size(); ++j)
4121 {
4122 if (variable_list[i].first == expected_var_list[j])
4123 {
4124 ++found_count;
4125 break;
4126 }
4127 }
4128 }
4129
4130 if (found_count != expected_var_list.size())
4131 {
4132 printf("run_test10() - Failed to get variable list (2)\n");
4133 return false;
4134 }
4135 }
4136
4137 for (std::size_t r = 0; r < rounds; ++r)
4138 {
4139 symbol_table.add_variable("x" , x );
4140 symbol_table.add_variable("y" , y );
4141 symbol_table.add_variable("xx", xx);
4142 symbol_table.add_variable("yy", yy);
4143
4144 std::vector<std::string> expected_var_list;
4145
4146 expected_var_list.push_back("x" );
4147 expected_var_list.push_back("y" );
4148 expected_var_list.push_back("xx");
4149 expected_var_list.push_back("yy");
4150
4151 std::deque<std::string> variable_list;
4152
4153 symbol_table.get_variable_list(variable_list);
4154
4155 if (variable_list.size() != expected_var_list.size())
4156 {
4157 printf("run_test10() - Failed to get variable list (3)\n");
4158 return false;
4159 }
4160
4161 std::size_t found_count = 0;
4162
4163 for (std::size_t i = 0; i < variable_list.size(); ++i)
4164 {
4165 for (std::size_t j = 0; j < expected_var_list.size(); ++j)
4166 {
4167 if (variable_list[i] == expected_var_list[j])
4168 {
4169 ++found_count;
4170 break;
4171 }
4172 }
4173 }
4174
4175 if (found_count != expected_var_list.size())
4176 {
4177 printf("run_test10() - Failed to get variable list (4)\n");
4178 return false;
4179 }
4180 }
4181
4182 for (std::size_t r = 0; r < rounds; ++r)
4183 {
4184 symbol_table.add_stringvar("i" , i_s );
4185 symbol_table.add_stringvar("j" , j_s );
4186 symbol_table.add_stringvar("ii", ii_s);
4187 symbol_table.add_stringvar("jj", jj_s);
4188
4189 std::vector<std::string> expected_var_list;
4190
4191 expected_var_list.push_back("i" );
4192 expected_var_list.push_back("j" );
4193 expected_var_list.push_back("ii");
4194 expected_var_list.push_back("jj");
4195
4196 std::deque<std::pair<std::string, std::string> > stringvar_list;
4197
4198 symbol_table.get_stringvar_list(stringvar_list);
4199
4200 if (stringvar_list.size() != expected_var_list.size())
4201 {
4202 printf("run_test10() - Failed to get stringvar list (1)\n");
4203 return false;
4204 }
4205
4206 std::size_t found_count = 0;
4207
4208 for (std::size_t i = 0; i < stringvar_list.size(); ++i)
4209 {
4210 for (std::size_t j = 0; j < expected_var_list.size(); ++j)
4211 {
4212 if (stringvar_list[i].first == expected_var_list[j])
4213 {
4214 ++found_count;
4215 break;
4216 }
4217 }
4218 }
4219
4220 if (found_count != expected_var_list.size())
4221 {
4222 printf("run_test10() - Failed to get stringvar list (2)\n");
4223 return false;
4224 }
4225 }
4226
4227 for (std::size_t r = 0; r < rounds; ++r)
4228 {
4229 symbol_table.add_stringvar("i" , i_s );
4230 symbol_table.add_stringvar("j" , j_s );
4231 symbol_table.add_stringvar("ii", ii_s);
4232 symbol_table.add_stringvar("jj", jj_s);
4233
4234 std::vector<std::string> expected_var_list;
4235
4236 expected_var_list.push_back("i" );
4237 expected_var_list.push_back("j" );
4238 expected_var_list.push_back("ii");
4239 expected_var_list.push_back("jj");
4240
4241 std::deque<std::string> stringvar_list;
4242
4243 symbol_table.get_stringvar_list(stringvar_list);
4244
4245 if (stringvar_list.size() != expected_var_list.size())
4246 {
4247 printf("run_test10() - Failed to get stringvar list (3.0)\n");
4248 return false;
4249 }
4250
4251 if (symbol_table.stringvar_count() != expected_var_list.size())
4252 {
4253 printf("run_test10() - Failed to get stringvar list (3.1)\n");
4254 return false;
4255 }
4256
4257 std::size_t found_count = 0;
4258
4259 for (std::size_t i = 0; i < stringvar_list.size(); ++i)
4260 {
4261 for (std::size_t j = 0; j < expected_var_list.size(); ++j)
4262 {
4263 if (stringvar_list[i] == expected_var_list[j])
4264 {
4265 ++found_count;
4266 break;
4267 }
4268 }
4269 }
4270
4271 if (found_count != expected_var_list.size())
4272 {
4273 printf("run_test10() - Failed to get stringvar list (4)\n");
4274 return false;
4275 }
4276 }
4277 }
4278
4279 {
4280 T x0 = T(0);
4281 T y0 = T(0);
4282 T z0 = T(0);
4283
4284 std::string expression_string = "(x0 + y0) / z0";
4285
4286 static const std::size_t rounds = 100;
4287
4288 for (std::size_t i = 0; i < rounds; ++i)
4289 {
4290 expression_t expression0;
4291
4292 x0 = T(i + 1.11);
4293 y0 = T(i + 2.22);
4294 z0 = T(i + 3.33);
4295
4297
4298 st0.add_variable("x0",x0);
4299 st0.add_variable("y0",y0);
4300 st0.add_variable("z0",z0);
4301
4302 expression0.register_symbol_table(st0);
4303
4304 {
4305 exprtk::parser<T> parser;
4306
4307 if (!parser.compile(expression_string,expression0))
4308 {
4309 printf("run_test10() - Error: %s Expression: %s\n",
4310 parser.error().c_str(),
4311 expression_string.c_str());
4312
4313 return false;
4314 }
4315 }
4316
4317 {
4318 expression_t expression1;
4319 exprtk::symbol_table<T> st1 = st0;
4320 expression1.register_symbol_table(st1);
4321
4322 {
4323 exprtk::parser<T> parser;
4324
4325 if (!parser.compile(expression_string,expression1))
4326 {
4327 printf("run_test10() - Error: %s Expression: %s\n",
4328 parser.error().c_str(),
4329 expression_string.c_str());
4330
4331 return false;
4332 }
4333 }
4334
4335 st1.remove_variable("x0");
4336 st1.remove_variable("y0");
4337 st1.remove_variable("z0");
4338 }
4339 }
4340 }
4341
4342 {
4343 T a = T(1);
4344 T b = T(2);
4345 T c = T(3);
4346 T d = T(4);
4347
4348 std::string e = "string";
4349
4350 exprtk::symbol_table<T> symbol_table;
4351
4352 symbol_table.add_variable ("a",a);
4353 symbol_table.add_variable ("b",b);
4354 symbol_table.add_variable ("c",c);
4355 symbol_table.add_variable ("d",d);
4356 symbol_table.add_stringvar("e",e);
4357
4358 expression_t expression;
4359 expression.register_symbol_table(symbol_table);
4360
4361 std::string expression_string = "(E == '1234') and (sin(a) + C) / b";
4362
4363 typedef exprtk::parser<T> parser_t;
4364 typedef typename parser_t::dependent_entity_collector::symbol_t symbol_t;
4365
4366 std::deque<symbol_t> symbol_list;
4367
4368 {
4369 parser_t parser;
4370
4371 parser.dec().collect_variables() = true;
4372 parser.dec().collect_functions() = true;
4373
4374 if (!parser.compile(expression_string,expression))
4375 {
4376 printf("run_test10() - Error: %s Expression: %s\n",
4377 parser.error().c_str(),
4378 expression_string.c_str());
4379
4380 return false;
4381 }
4382
4383 parser.dec().symbols(symbol_list);
4384 }
4385
4386 std::deque<symbol_t> expected_symbol_list;
4387
4388 expected_symbol_list.push_back(symbol_t("a" ,parser_t::e_st_variable));
4389 expected_symbol_list.push_back(symbol_t("b" ,parser_t::e_st_variable));
4390 expected_symbol_list.push_back(symbol_t("c" ,parser_t::e_st_variable));
4391 expected_symbol_list.push_back(symbol_t("e" ,parser_t::e_st_string ));
4392 expected_symbol_list.push_back(symbol_t("sin",parser_t::e_st_function));
4393
4394 bool result = (symbol_list.size() == expected_symbol_list.size()) &&
4395 std::equal(symbol_list.begin(),
4396 symbol_list.end(),
4397 expected_symbol_list.begin());
4398 if (!result)
4399 {
4400 printf("run_test10() - Failed variable list comparison.(5)\n");
4401 return false;
4402 }
4403 }
4404
4405 {
4406 T a = T(1);
4407 T b = T(2);
4408 T c = T(3);
4409 T d = T(4);
4410
4411 std::string e = "string";
4412
4413 exprtk::symbol_table<T> symbol_table;
4414
4415 symbol_table.add_variable ("a",a);
4416 symbol_table.add_variable ("b",b);
4417 symbol_table.add_variable ("c",c);
4418 symbol_table.add_variable ("d",d);
4419 symbol_table.add_stringvar("e",e);
4420
4421 expression_t expression;
4422 expression.register_symbol_table(symbol_table);
4423
4424 const std::string expression_string =
4425 "a := b + c; "
4426 "b := c + d; "
4427 "c := d + 1; "
4428 "e := e + 'abc'; ";
4429
4430 typedef exprtk::parser<T> parser_t;
4431 typedef typename parser_t::dependent_entity_collector::symbol_t symbol_t;
4432
4433 std::deque<symbol_t> variable_list;
4434
4435 {
4436 parser_t parser;
4437
4438 parser.dec().collect_assignments() = true;
4439
4440 if (!parser.compile(expression_string,expression))
4441 {
4442 printf("run_test10() - Error: %s Expression: %s\n",
4443 parser.error().c_str(),
4444 expression_string.c_str());
4445
4446 return false;
4447 }
4448
4449 parser.dec().assignment_symbols(variable_list);
4450 }
4451
4452 std::deque<symbol_t> expected_assignment_list;
4453
4454 expected_assignment_list.push_back(symbol_t("a",parser_t::e_st_variable));
4455 expected_assignment_list.push_back(symbol_t("b",parser_t::e_st_variable));
4456 expected_assignment_list.push_back(symbol_t("c",parser_t::e_st_variable));
4457 expected_assignment_list.push_back(symbol_t("e",parser_t::e_st_string ));
4458
4459 bool result = (variable_list.size() == expected_assignment_list.size()) &&
4460 std::equal(variable_list.begin(),
4461 variable_list.end(),
4462 expected_assignment_list.begin());
4463 if (!result)
4464 {
4465 printf("run_test10() - Failed variable list comparison.(6)\n");
4466 return false;
4467 }
4468 }
4469
4470 {
4471 exprtk::symbol_table<T> symbol_table0;
4472 exprtk::symbol_table<T> symbol_table1;
4473
4474 if (symbol_table0 == symbol_table1)
4475 {
4476 printf("run_test10() - Error symbol_table0 and symbol_table1 are equal\n");
4477 return false;
4478 }
4479
4480 symbol_table0 = symbol_table1;
4481 symbol_table1 = symbol_table0;
4482
4483 if (!(symbol_table0 == symbol_table1))
4484 {
4485 printf("run_test10() - Error symbol_table0 and symbol_table1 are not equal\n");
4486 return false;
4487 }
4488 }
4489
4490 {
4491 T a = T(1);
4492 T b = T(2);
4493 T c = T(3);
4494 T d = T(4);
4495
4496 std::string e = "a string";
4497
4498 exprtk::symbol_table<T> symbol_table0;
4499 exprtk::symbol_table<T> symbol_table1;
4500 expression_t expression;
4501
4502 for (std::size_t i = 0; i < 10000; ++i)
4503 {
4504 symbol_table0.clear();
4505 symbol_table1.clear();
4506
4507 symbol_table0.add_variable ("a",a);
4508 symbol_table0.add_variable ("b",b);
4509 symbol_table0.add_variable ("c",c);
4510 symbol_table0.add_variable ("d",d);
4511 symbol_table0.add_stringvar("e",e);
4512 symbol_table0.add_constants( );
4513
4514 symbol_table1.add_variable ("a",a);
4515 symbol_table1.add_variable ("b",b);
4516 symbol_table1.add_variable ("c",c);
4517 symbol_table1.add_variable ("d",d);
4518 symbol_table1.add_stringvar("e",e);
4519 symbol_table1.add_constants( );
4520
4521 expression.register_symbol_table(symbol_table0);
4522 expression.register_symbol_table(symbol_table1);
4523 }
4524 }
4525
4526 {
4527 const std::string expression =
4528 "for (var i := 0; i < min(x[],y[],z[]); i += 1)"
4529 "{ z[i] := 3sin(x[i]) + 2log(y[i]); }";
4530
4531 std::vector<std::string> var_symbol_list;
4532 std::vector<std::string> func_symbol_list;
4533
4534 if (!exprtk::collect_variables(expression, var_symbol_list))
4535 {
4536 printf("run_test10() - Failed to collect variables.\n");
4537 return false;
4538 }
4539
4540 if (!exprtk::collect_functions(expression, func_symbol_list))
4541 {
4542 printf("run_test10() - Failed to collect functions.\n");
4543 return false;
4544 }
4545
4546 std::sort(var_symbol_list .begin(), var_symbol_list .end());
4547 std::sort(func_symbol_list.begin(), func_symbol_list.end());
4548
4549 std::vector<std::string> expected_var_symbol_list;
4550 std::vector<std::string> expected_func_symbol_list;
4551
4552 expected_var_symbol_list.push_back("i");
4553 expected_var_symbol_list.push_back("x");
4554 expected_var_symbol_list.push_back("y");
4555 expected_var_symbol_list.push_back("z");
4556
4557 expected_func_symbol_list.push_back("log");
4558 expected_func_symbol_list.push_back("min");
4559 expected_func_symbol_list.push_back("sin");
4560
4561 const bool var_result = (var_symbol_list.size() == expected_var_symbol_list.size()) &&
4562 std::equal(var_symbol_list.begin(),
4563 var_symbol_list.end(),
4564 expected_var_symbol_list.begin());
4565 if (!var_result)
4566 {
4567 printf("run_test10() - Failed collected variable comparison between received and expected variables\n");
4568 return false;
4569 }
4570
4571 const bool func_result = (func_symbol_list.size() == expected_func_symbol_list.size()) &&
4572 std::equal(func_symbol_list.begin(),
4573 func_symbol_list.end(),
4574 expected_func_symbol_list.begin());
4575 if (!func_result)
4576 {
4577 printf("run_test10() - Failed collected functions comparison between received and expected functions\n");
4578 return false;
4579 }
4580 }
4581
4582 {
4583 const std::string expression_list[] =
4584 {
4585 "var x; 1",
4586 "var x := 1; x",
4587 "var x:= 1; x - -1 == 2",
4588 "var x:= 1; x --1 == 2",
4589 "var x:= 1; x-- 1 == 2",
4590 "var x:= 1; x--1 == 2",
4591 "var x:= 1; x -- -1== 0",
4592 "var x:= 1; x + -1 == 0",
4593 "var x:= 1; x +-1 == 0",
4594 "var x:= 1; x+- 1 == 0",
4595 "var x:= 1; x+-1 == 0",
4596 "var x:= 1; x +- -1== 2",
4597 "var x:= 1; x + +1 == 2",
4598 "var x:= 1; x ++1 == 2",
4599 "var x:= 1; 1 - -x == 2",
4600 "var x:= 1; 1 --x == 2",
4601 "var x:= 1; 1-- x == 2",
4602 "var x:= 1; 1--x == 2",
4603 "var x:= 1; 1 -- -x== 0",
4604 "var x:= 1; 1 + -x == 0",
4605 "var x:= 1; 1 +-x == 0",
4606 "var x:= 1; 1+- x == 0",
4607 "var x:= 1; 1+-x == 0",
4608 "var x:= 1; 1 +- -x== 2",
4609 "var x:= 1; 1 + +x == 2",
4610 "var x:= 1; 1 ++x == 2",
4611 "var x:= 1; (x - -1 + 1) == 3",
4612 "var x:= 1; (x --1 + 1) == 3",
4613 "var x:= 1; (x-- 1 + 1) == 3",
4614 "var x:= 1; (x--1 + 1) == 3",
4615 "var x:= 1; (x -- -1 + 1) == 1",
4616 "var x:= 1; (x + -1 + 1) == 1",
4617 "var x:= 1; (x +-1 + 1) == 1",
4618 "var x:= 1; (x+- 1 + 1) == 1",
4619 "var x:= 1; (x+-1 + 1) == 1",
4620 "var x:= 1; (x +- -1 + 1) == 3",
4621 "var x:= 1; (x + +1 + 1) == 3",
4622 "var x:= 1; (x ++1 + 1) == 3",
4623 "var x:= 1; (1 - -x + 1) == 3",
4624 "var x:= 1; (1 --x + 1) == 3",
4625 "var x:= 1; (1-- x + 1) == 3",
4626 "var x:= 1; (1--x + 1) == 3",
4627 "var x:= 1; (1 -- -x + 1) == 1",
4628 "var x:= 1; (1 + -x + 1) == 1",
4629 "var x:= 1; (1 +-x + 1) == 1",
4630 "var x:= 1; (1+- x + 1) == 1",
4631 "var x:= 1; (1+-x + 1) == 1",
4632 "var x:= 1; (1 +- -x + 1) == 3",
4633 "var x:= 1; (1 + +x + 1) == 3",
4634 "var x:= 1; (1 ++x + 1) == 3",
4635 "var x:= 1; (x - -1 - 1) == 1",
4636 "var x:= 1; (x --1 - 1) == 1",
4637 "var x:= 1; (x-- 1 - 1) == 1",
4638 "var x:= 1; (x--1 - 1) == 1",
4639 "var x:= 1; (x -- -1 - 1) == -1",
4640 "var x:= 1; (x + -1 - 1) == -1",
4641 "var x:= 1; (x +-1 - 1) == -1",
4642 "var x:= 1; (x+- 1 - 1) == -1",
4643 "var x:= 1; (x+-1 - 1) == -1",
4644 "var x:= 1; (x +- -1 - 1) == 1",
4645 "var x:= 1; (x + +1 - 1) == 1",
4646 "var x:= 1; (x ++1 - 1) == 1",
4647 "var x:= 1; (1 - -x - 1) == 1",
4648 "var x:= 1; (1 --x - 1) == 1",
4649 "var x:= 1; (1-- x - 1) == 1",
4650 "var x:= 1; (1--x - 1) == 1",
4651 "var x:= 1; (1 -- -x - 1) == -1",
4652 "var x:= 1; (1 + -x - 1) == -1",
4653 "var x:= 1; (1 +-x - 1) == -1",
4654 "var x:= 1; (1+- x - 1) == -1",
4655 "var x:= 1; (1+-x - 1) == -1",
4656 "var x:= 1; (1 +- -x - 1) == 1",
4657 "var x:= 1; (1 + +x - 1) == 1",
4658 "var x:= 1; (1 ++x - 1) == 1",
4659 "var x := 1; var y := 2; 1",
4660 "var x := 1; var y := 2; x",
4661 "var x:=6; var y:=4; x + -3 == 3",
4662 "var x:=6; var y:=4; x - -3 == 9",
4663 "var x:=6; var y:=4; x * -3 == -18",
4664 "var x:=6; var y:=4; x / -3 == -2",
4665 "var x:=6; var y:=4; -x + -3 == -9",
4666 "var x:=6; var y:=4; -x - -3 == -3",
4667 "var x:=6; var y:=4; -x * -3 == 18",
4668 "var x:=6; var y:=4; -x / -3 == 2",
4669 "var x:=6; var y:=4; -3 + -x == -9",
4670 "var x:=6; var y:=4; -3 - -x == 3",
4671 "var x:=6; var y:=4; -3 * -x == 18",
4672 "var x:=6; var y:=4; -3 / -x == 0.5",
4673 "var x:=6; var y:=4; 3 + -x == -3",
4674 "var x:=6; var y:=4; 3 - -x == 9",
4675 "var x:=6; var y:=4; 3 * -x == -18",
4676 "var x:=6; var y:=4; 3 / -x == -0.5",
4677 "var x := 3; var y := 6; x + -y == -3",
4678 "var x := 3; var y := 6; x - -y == 9",
4679 "var x := 3; var y := 6; -x + -y == -9",
4680 "var x := 3; var y := 6; -x - -y == 3",
4681 "var x := 3; var y := 6; -x * -y == 18",
4682 "var x := 6; var y := 3; -x / -y == 2",
4683 "var x := 3; var y := 6; -(-x * -y) == -18",
4684 "var x := 6; var y := 3; -(-x / -y) == -2",
4685 "var x:=1; 2+(3+abs(x)) == 6 ",
4686 "var x:=1; (3+abs(x))+2 == 6 ",
4687 "var x:=1; 2+(abs(x)+3) == 6 ",
4688 "var x:=1; (abs(x)+3)+2 == 6 ",
4689 "var x:=1; 2+(3-abs(x)) == 4 ",
4690 "var x:=1; (3-abs(x))+2 == 4 ",
4691 "var x:=1; 2+(abs(x)-3) == 0 ",
4692 "var x:=1; (abs(x)-3)+2 == 0 ",
4693 "var x:=1; 2-(3+abs(x)) == -2 ",
4694 "var x:=1; (3+abs(x))-2 == 2 ",
4695 "var x:=1; 2-(abs(x)+3) == -2 ",
4696 "var x:=1; (abs(x)+3)-2 == 2 ",
4697 "var x:=1; 2*(3*abs(x)) == 6 ",
4698 "var x:=1; (3*abs(x))*2 == 6 ",
4699 "var x:=1; 2*(abs(x)*3) == 6 ",
4700 "var x:=1; (abs(x)*3)*2 == 6 ",
4701 "var x:=1; 2*(3/abs(x)) == 6 ",
4702 "var x:=1; (3/abs(x))*2 == 6 ",
4703 "var x:=1; 2*(abs(x)/3) == (2/3)",
4704 "var x:=1; (abs(x)/3)*2 == (2/3)",
4705 "var x:=1; 2/(3*abs(x)) == (2/3)",
4706 "var x:=1; (3*abs(x))/2 == (3/2)",
4707 "var x:=1; 2/(abs(x)*3) == (2/3)",
4708 "var x:=1; (abs(x)*3)/2 == (3/2)",
4709 "var x:=1; 2/(3/abs(x)) == (2/3)",
4710 "var x:=1; (3/abs(x))/2 == (3/2)",
4711 "var x:=1; 2/(abs(x)/3) == 6 ",
4712 "var x:=1; (abs(x)/3)/2 == (1/6)",
4713 "var x:=3; var y:=6; -(-x)*-(-y) == 18",
4714 "var x:=3; var y:=6; -(-x)*-(-(-y)) == -18",
4715 "var x:=3; var y:=6; -(-(-x))*-(-y) == -18",
4716 "var x:=3; var y:=6; -(-(-x))*-(-(-y)) == 18",
4717 "var x:=3; var y:=6; -(-(x+y))*-(-(y+x)) == 81",
4718 "var x:=3; var y:=6; -(-(-(x+y)))*-(-(y+x)) == -81",
4719 "var x:=3; var y:=6; -(-(x+y))*-(-(-(y+x))) == -81",
4720 "var x:=3; var y:=6; -(-(-(x+y)))*-(-(-(y+x))) == 81",
4721 "var x:= 2; var y := 3; (-abs(x)+-abs(y)) == -5 ",
4722 "var x:= 2; var y := 3; (-abs(x)--abs(y)) == 1 ",
4723 "var x:= 2; var y := 3; (-abs(x)*-abs(y)) == 6 ",
4724 "var x:= 2; var y := 3; (-abs(x)/-abs(y)) == (2/3) ",
4725 "var x:= 2; var y := 3; (-abs(x)+abs(y)) == 1 ",
4726 "var x:= 2; var y := 3; (-abs(x)-abs(y)) == -5 ",
4727 "var x:= 2; var y := 3; (-abs(x)*abs(y)) == -6 ",
4728 "var x:= 2; var y := 3; (-abs(x)/abs(y)) == -(2/3) ",
4729 "var x:= 2; var y := 3; (abs(x)+-abs(y)) == -1 ",
4730 "var x:= 2; var y := 3; (abs(x)--abs(y)) == 5 ",
4731 "var x:= 2; var y := 3; (abs(x)*-abs(y)) == -6 ",
4732 "var x:= 2; var y := 3; (abs(x)/-abs(y)) == -(2/3) ",
4733 "var x:= 2; var y := 3; (-abs(x + 0)+-abs(y - 0)) == -5 ",
4734 "var x:= 2; var y := 3; (-abs(x + 0)--abs(y - 0)) == 1 ",
4735 "var x:= 2; var y := 3; (-abs(x + 0)*-abs(y - 0)) == 6 ",
4736 "var x:= 2; var y := 3; (-abs(x + 0)/-abs(y - 0)) == (2/3) ",
4737 "var x:= 2; var y := 3; (-abs(x + 0)+abs(y - 0)) == 1 ",
4738 "var x:= 2; var y := 3; (-abs(x + 0)-abs(y - 0)) == -5 ",
4739 "var x:= 2; var y := 3; (-abs(x + 0)*abs(y - 0)) == -6 ",
4740 "var x:= 2; var y := 3; (-abs(x + 0)/abs(y - 0)) == -(2/3) ",
4741 "var x:= 2; var y := 3; (abs(x + 0)+-abs(y - 0)) == -1 ",
4742 "var x:= 2; var y := 3; (abs(x + 0)--abs(y - 0)) == 5 ",
4743 "var x:= 2; var y := 3; (abs(x + 0)*-abs(y - 0)) == -6 ",
4744 "var x:= 2; var y := 3; (abs(x + 0)/-abs(y - 0)) == -(2/3) ",
4745 "var x := 1; var y := 2; swap(x,y); (x == 2) and (y == 1)",
4746 "var x := 1; var y := 2; x <=> y ; (x == 2) and (y == 1)",
4747 "var x := 'abc'; x == 'abc' ",
4748 "var x := 'abc'; var y := '123'; x != y ",
4749 "var x := 'abc'; var y := x + '123'; y == 'abc123' ",
4750 "var x := 'abc'; var y := '123' + x; y == '123abc' ",
4751 "~{var x := '123'; x[]} + ~{var x := '1234'; x[]} == 7",
4752 "~{var x := '123'; x[]} + ~{~{var x := '1234'; x[]}} == 7",
4753 "~{~{var x := '123'; x[]}} + ~{var x := '1234'; x[]} == 7",
4754 "~{var x := '123'; x[]} + ~{var x := 4} == 7",
4755 "~{var x := 3} + ~{var x := '1234'; x[]} == 7",
4756 "~{var x := '123'; x[]} + ~{~{var x := 4}} == 7",
4757 "~{~{var x := 3}} + ~{var x := '1234'; x[]} == 7",
4758 "var v[2] := {1,2}; swap(v[0],v[1]); (v[0] == 2) and (v[1] == 1)",
4759 "var v[2] := {1,2}; v[0] <=> v[1] ; (v[0] == 2) and (v[1] == 1)",
4760 "var x := 1; var y := 2; ~(swap(x,y),(x == 2) and (y == 1))",
4761 "var x := 1; var y := 2; ~(x <=> y , (x == 2) and (y == 1))",
4762 "var v[2] := {1,2}; ~(swap(v[0],v[1]), (v[0] == 2) and (v[1] == 1))",
4763 "var v[2] := {1,2}; ~(v[0] <=> v[1] , (v[0] == 2) and (v[1] == 1))",
4764 "var v[2] := {1,2}; swap(v[zero],v[one]); (v[zero] == 2) and (v[one] == 1)",
4765 "var v[2] := {1,2}; v[zero] <=> v[one] ; (v[zero] == 2) and (v[one] == 1)",
4766 "var v[2] := {1,2}; ~(swap(v[zero],v[one]), (v[zero] == 2) and (v[one] == 1))",
4767 "var v[2] := {1,2}; ~(v[zero] <=> v[one] , (v[zero] == 2) and (v[one] == 1))",
4768 "var v[2] := {1,2}; swap(v[2 * zero],v[(2 * one) / (1 + 1)]); (v[2 * zero] == 2) and (v[(2 * one) / (1 + 1)] == 1)",
4769 "var v[2] := {1,2}; v[2 * zero] <=> v[(2*one)/(1+1)] ; (v[2 * zero] == 2) and (v[(2 * one) / (1 + 1)] == 1)",
4770 "var v[2] := {1,2}; ~(swap(v[2 * zero],v[(2 * one) / (1 + 1)]), (v[2 * zero] == 2) and (v[(2 * one) / (1 + 1)] == 1))",
4771 "var v[2] := {1,2}; ~(v[2 * zero] <=> v[(2 * one) / (1 + 1)] , (v[2 * zero] == 2) and (v[(2 * one) / (1 + 1)] == 1))",
4772 "var x := 1; var y := 2; var v[2] := {3,4}; swap(x,v[0]); swap(v[1],y); (x == 3) and (y == 4)",
4773 "var x := 1; var y := 2; var v[2] := {3,4}; x <=> v[0]; v[1] <=> y; (x == 3) and (y == 4)",
4774 "var x := 1; var y := 2; var v[2] := {3,4}; swap(x,v[zero]); swap(v[one],y); (x == 3) and (y == 4)",
4775 "var x := 1; var y := 2; var v[2] := {3,4}; x <=> v[zero]; v[one] <=> y; (x == 3) and (y == 4)",
4776 "var x := 1; var y := 2; var v[2] := {3,4}; swap(x,v[2 * zero]); swap(v[(2 * one) / (1 + 1)],y); (x == 3) and (y == 4)",
4777 "var x := 1; var y := 2; var v[2] := {3,4}; x <=> v[zero / 3]; v[(2 * one)/(1 + 1)] <=> y; (x == 3) and (y == 4)",
4778 "~{ var x := 1 } + ~{ var x := 2 } == 3",
4779 "(~{ var x := 1 } + ~{ var x := 2 }) == (~{ var x := 2 } + ~{ var x := 1 })",
4780 "(~{ var x := 1 } + ~{ var x := 2 } + ~{~{ var x := 1 } + ~{ var x := 2 }}) == 6",
4781 "(~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }}) == 6",
4782 "(~{ var x := [1] } + ~{ var x[1] := [2] } + ~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }}) == 6",
4783 "(~{ var x[1] := [1] } + ~{ var x := [2] } + ~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }}) == 6",
4784 "(~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{~{ var x := [1] } + ~{ var x[1] := [2] }}) == 6",
4785 "(~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{~{ var x[1] := [1] } + ~{ var x := [2] }}) == 6",
4786 "(~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] }) == 6",
4787 "(~{~{ var x := [1] } + ~{ var x[1] := [2] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] }) == 6",
4788 "(~{~{ var x[1] := [1] } + ~{ var x := [2] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] }) == 6",
4789 "(~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }} + ~{ var x := [1] } + ~{ var x[1] := [2] }) == 6",
4790 "(~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }} + ~{ var x[1] := [1] } + ~{ var x := [2] }) == 6",
4791 "(~{~{ var x[1] := [1] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{{ var x[1] := [2] }}) == 6",
4792 "(~{~{ var x := [1] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{{ var x[1] := [2] }}) == 6",
4793 "(~{~{ var x[1] := [1] }} + ~{ var x := [1] } + ~{ var x[1] := [2] } + ~{{ var x[1] := [2] }}) == 6",
4794 "(~{~{ var x[1] := [1] }} + ~{ var x[1] := [1] } + ~{ var x := [2] } + ~{{ var x[1] := [2] }}) == 6",
4795 "(~{~{ var x[1] := [1] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{{ var x := [2] }}) == 6",
4796 "(~{~{~{var x[1] := [1]}}} + ~{~{var x[1] := [2]}} + ~{var x[1] := [3]}) == 6",
4797 "(~{var x[1] := [1]} + ~{~{var x[1] := [2]}} + ~{~{~{var x[1] := [3]}}}) == 6",
4798 "(~{ var x[3] := [1] } + ~{ var x[6] := {6,5,4,3,2,1}}) == 7",
4799 "(~{ var x[6] := {6,5,4,3,2,1} } + ~{ var x := 1 }) == 7",
4800 "(~{ var x := 1 } + ~{ var x[6] := {6,5,4,3,2,1} }) == 7",
4801 "var x[3] := {}; (x[0] == 0) and (x[1] == 0) and (x[2] == 0)",
4802 "var x[3] := {1,2}; (x[0] == 1) and (x[1] == 2) and (x[2] == 0)",
4803 "var x[3] := {1,2,3}; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
4804 "var x[3] := [1]; (x[0] == 1) and (x[1] == 1) and (x[2] == 1)",
4805 "var v[3] := [1]; v += 1; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 2)",
4806 "var v[3] := [1]; v -= 1; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 0)",
4807 "var v[3] := [1]; v *= 2; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 2)",
4808 "var v[3] := [3]; v /= 3; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 1)",
4809 "var v[3] := {1,2, 3}; v += 1; (v[0] == 2) and (v[1] == 3) and (v[2] == 4)",
4810 "var v[3] := {1,2, 3}; v -= 1; (v[0] == 0) and (v[1] == 1) and (v[2] == 2)",
4811 "var v[3] := {1,2, 3}; v *= 2; (v[0] == 2) and (v[1] == 4) and (v[2] == 6)",
4812 "var v[3] := {3,9,15}; v /= 3; (v[0] == 1) and (v[1] == 3) and (v[2] == 5)",
4813 "var v0[3] := [1]; var v1[3] := [1]; v0 += v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 2)",
4814 "var v0[3] := [1]; var v1[3] := [1]; v0 -= v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 0)",
4815 "var v0[3] := [1]; var v1[3] := [2]; v0 *= v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 2)",
4816 "var v0[3] := [3]; var v1[3] := [3]; v0 /= v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 1)",
4817 "var v0[3] := {1,2, 3}; var v1[3] := {1,1,1}; v0 += v1; (v0[0] == 2) and (v0[1] == 3) and (v0[2] == 4)",
4818 "var v0[3] := {1,2, 3}; var v1[3] := {1,1,1}; v0 -= v1; (v0[0] == 0) and (v0[1] == 1) and (v0[2] == 2)",
4819 "var v0[3] := {1,2, 3}; var v1[3] := {2,2,2}; v0 *= v1; (v0[0] == 2) and (v0[1] == 4) and (v0[2] == 6)",
4820 "var v0[3] := {3,9,15}; var v1[3] := {3,3,3}; v0 /= v1; (v0[0] == 1) and (v0[1] == 3) and (v0[2] == 5)",
4821 "var x[3] := {}; var y[4] := {1,2,3,4}; x := y; (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == y[2])",
4822 "var x[3] := {}; var y[3] := {1,2,3}; x := y; (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == y[2])",
4823 "var x[3] := {}; var y[2] := {1,2}; x := y; (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == 0)",
4824 "var x[3] := {}; var y[1] := {1}; x := y; (x[0] == y[0]) and (x[1] == 0) and (x[2] == 0)",
4825 "var x[3] := {}; var y[4] := {1,2,3,4}; x := (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == y[2])",
4826 "var x[3] := {}; var y[3] := {1,2,3}; x := (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == y[2])",
4827 "var x[3] := {}; var y[2] := {1,2}; x := (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == 0)",
4828 "var x[3] := {}; var y[1] := {1}; x := (y+=1); (x[0] == y[0]) and (x[1] == 0) and (x[2] == 0)",
4829 "var x[3] := {}; var y[4] := {1,2,3,4}; x += (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == y[2])",
4830 "var x[3] := {}; var y[3] := {1,2,3}; x += (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == y[2])",
4831 "var x[3] := {}; var y[2] := {1,2}; x += (y+=1); (x[0] == y[0]) ",
4832 "var x[3] := {}; var y[2] := {1,2}; x += (y+=1); (x[0] == y[0]) and (x[1] == y[1]) ",
4833 "var x[3] := {}; var y[2] := {1,2}; x += (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == 0)",
4834 "var x[3] := {}; var y[1] := {1}; x += (y+=1); (x[0] == y[0]) ",
4835 "var x[3] := {}; var y[1] := {1}; x += (y+=1); (x[0] == y[0]) and (x[1] == 0) ",
4836 "var x[3] := {}; var y[1] := {1}; x += (y+=1); (x[0] == y[0]) and (x[1] == 0) and (x[2] == 0)",
4837 "var x[3] := [9]; var y[4] := {1,2,3,4}; x <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
4838 "var x[3] := [9]; var y[3] := {1,2,3}; x <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
4839 "var x[3] := [9]; var y[2] := {1,2}; x <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 9)",
4840 "var x[3] := [9]; var y[1] := {1}; x <=> y; (x[0] == 1) and (x[1] == 9) and (x[2] == 9)",
4841 "var x[3] := [9]; var y[4] := {1,2,3,4}; x <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 4)",
4842 "var x[3] := [9]; var y[3] := {1,2,3}; x <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 4)",
4843 "var x[3] := [9]; var y[2] := {1,2}; x <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 9)",
4844 "var x[3] := [9]; var y[1] := {1}; x <=> (y += 1); (x[0] == 2) and (x[1] == 9) and (x[2] == 9)",
4845 "var x[3] := [8]; var y[4] := {1,2,3,4}; (x += 1) <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
4846 "var x[3] := [8]; var y[3] := {1,2,3}; (x += 1) <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
4847 "var x[3] := [8]; var y[2] := {1,2}; (x += 1) <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 9)",
4848 "var x[3] := [8]; var y[1] := {1}; (x += 1) <=> y; (x[0] == 1) and (x[1] == 9) and (x[2] == 9)",
4849 "var x[3] := [8]; var y[4] := {1,2,3,4}; (x += 1) <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 4)",
4850 "var x[3] := [8]; var y[3] := {1,2,3}; (x += 1) <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 4)",
4851 "var x[3] := [8]; var y[2] := {1,2}; (x += 1) <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 9)",
4852 "var x[3] := [8]; var y[1] := {1}; (x += 1) <=> (y += 1); (x[0] == 2) and (x[1] == 9) and (x[2] == 9)",
4853 "var x[3] := [0]; var y[4] := {1,2,3,4}; X < y",
4854 "var x[3] := [0]; var y[3] := {1,2,3}; x < Y",
4855 "var x[3] := [0]; var y[2] := {1,2}; X < y",
4856 "var x[3] := [0]; var y[1] := {1}; x < Y",
4857 "var x[3] := [0]; var y[4] := {1,2,3,4}; x <= y",
4858 "var x[3] := [0]; var y[3] := {1,2,3}; x <= y",
4859 "var x[3] := [0]; var y[2] := {1,2}; x <= y",
4860 "var x[3] := [0]; var y[1] := {1}; x <= y",
4861 "var x[3] := [5]; var y[4] := {1,2,3,4}; x > y",
4862 "var x[3] := [5]; var y[3] := {1,2,3}; x > y",
4863 "var x[3] := [5]; var y[2] := {1,2}; x > y",
4864 "var x[3] := [5]; var y[1] := {1}; x > y",
4865 "var x[3] := [5]; var y[4] := {1,2,3,4}; x >= y",
4866 "var x[3] := [5]; var y[3] := {1,2,3}; x >= y",
4867 "var x[3] := [5]; var y[2] := {1,2}; x >= y",
4868 "var x[3] := [5]; var y[1] := {1}; x >= y",
4869 "var x[3] := [1]; var y[4] := [1]; x == y",
4870 "var x[3] := [1]; var y[3] := [1]; x == y",
4871 "var x[3] := [1]; var y[2] := [1]; x == y",
4872 "var x[3] := [1]; var y[1] := [1]; x == y",
4873 "var x[3] := [1]; var y[4] := [2]; x != y",
4874 "var x[3] := [1]; var y[3] := [2]; x != y",
4875 "var x[3] := [1]; var y[2] := [2]; x != y",
4876 "var x[3] := [1]; var y[1] := [2]; x != y",
4877 "var x[3] := [0]; var y[4] := {5,6,7,8}; (x += 1) < y",
4878 "var x[3] := [0]; var y[3] := {5,6,7}; (x += 1) < y",
4879 "var x[3] := [0]; var y[2] := {5,6}; (x += 1) < y",
4880 "var x[3] := [0]; var y[1] := {5}; (x += 1) < y",
4881 "var x[3] := [0]; var y[4] := {1,2,3,4}; x < (y += 1)",
4882 "var x[3] := [0]; var y[3] := {1,2,3}; x < (y += 1)",
4883 "var x[3] := [0]; var y[2] := {1,2}; x < (y += 1)",
4884 "var x[3] := [0]; var y[1] := {1}; x < (y += 1)",
4885 "var x[3] := [0]; var y[4] := {5,6,7,8}; (x += 1) < (y += 1)",
4886 "var x[3] := [0]; var y[3] := {5,6,7}; (x += 1) < (y += 1)",
4887 "var x[3] := [0]; var y[2] := {5,6}; (x += 1) < (y += 1)",
4888 "var x[3] := [0]; var y[1] := {5}; (x += 1) < (y += 1)",
4889 "var x[3] := {1,2,3}; var y := 5; x < y ",
4890 "var x[3] := {1,2,3}; var y := 3; x < y + 1 ",
4891 "var x[3] := {1,2,3}; var y := 5; x <= y ",
4892 "var x[3] := {1,2,3}; var y := 3; x <= y + 1",
4893 "var x[3] := {1,1,1}; var y := 1; x == y ",
4894 "var x[3] := {1,1,1}; var y := 2; x == y - 1",
4895 "var x[3] := {1,2,3}; var y := 5; y > x ",
4896 "var x[3] := {1,2,3}; var y := 3; y >= x ",
4897 "var x[3] := {1,2,3}; var y := 5; y + 1 > x ",
4898 "var x[3] := {1,1,1}; var y := 1; y == x ",
4899 "var x[3] := {1,1,1}; var y := 2; y - 1 == x",
4900 "var x[3] := {1,2,3}; var y := 5; equal(true,(x += 1) < y) ",
4901 "var x[3] := {1,2,3}; var y := 3; equal(true,(x -= 1) < y + 1)",
4902 "var x[3] := {1,2,3}; var y := 5; equal(true,(x -= 1) <= y) ",
4903 "var x[3] := {2,2,2}; var y := 1; (x -= 1) == y ",
4904 "var x[3] := {1,2,3}; var y := 5; y > (x += 1) ",
4905 "var x[3] := {1,2,3}; var y := 5; y + 1 > (x += 1) ",
4906 "var x[3] := {2,2,2}; var y := 1; y == (x -= 1) ",
4907 "var x[3] := {2,2,2}; var y := 0; y + 1 == (x -= 1)",
4908 "var x[3] := [1]; var y[4] := {1,2,3,4}; var z[3] := [1]; z := (x + y); z == (x + y)",
4909 "var x[3] := [1]; var y[3] := {1,2,3}; var z[3] := [1]; z := (x - y); z == (x - y)",
4910 "var x[3] := [1]; var y[2] := {1,2}; var z[3] := [1]; z := (x / y); z == (x / y)",
4911 "var x[3] := [1]; var y[1] := {1}; var z[3] := [1]; z := (x * y); z == (x * y)",
4912 "var x[3] := [1]; var y[4] := {1,2,3,4}; var z[3] := [1]; z := 2(x + y); z == (x + y)2",
4913 "var x[3] := [1]; var y[3] := {1,2,3}; var z[3] := [1]; z := 2(x - y); z == (x - y)2",
4914 "var x[3] := [1]; var y[2] := {1,2}; var z[3] := [1]; z := 2(x / y); z == (x / y)2",
4915 "var x[3] := [1]; var y[1] := {1}; var z[3] := [1]; z := 2(x * y); z == (x * y)2",
4916 "var x[3] := [1]; var y[4] := {1,2,3,4}; var z[3] := [1]; z := 2(x + y)/3; z == 2(x + y)/3",
4917 "var x[3] := [1]; var y[3] := {1,2,3}; var z[3] := [1]; z := 2(x - y)/3; z == 2(x - y)/3",
4918 "var x[3] := [1]; var y[2] := {1,2}; var z[3] := [1]; z := 2(x / y)/3; z == 2(x / y)/3",
4919 "var x[3] := [1]; var y[1] := {1}; var z[3] := [1]; z := 2(x * y)/3; z == 2(x * y)/3",
4920 "var x[6] := {1,2,3,4,5,6}; equal(sqrt(sum([x - avg(x)]^2) / x[]),1.70782512765993300)",
4921 "var x[3] := {-1,-2,-3}; sum(abs(x) ) == 6",
4922 "var x[3] := {0.1,0.2,0.3}; sum(trunc(x)) == 0",
4923
4924 "var x[10^6]:=[2];var y[10^6]:=[3]; var s:=0;equal(for(var i:=0; i<10;i+=1){s+= sum(5 *(2x-y/3)) + i;},150000045.0)",
4925
4926 "var x := 2; (~{ for (var i := 0; i < 10; i += 1) { for (var j := 0; j <= i; "
4927 "j += 1) { var y := 3; if ((i + j + y + x) < 6) { y += x; continue; } else "
4928 "break[i + j]; } } } + ~{ for (var i := 0; i < 10; i += 1) { for (var j := 0; "
4929 "j <= i; j += 1) { var y := 3; if ((i + j + y + x) < 6) { y += x; continue; } "
4930 " else break[i + j]; } } }) == 18 ",
4931
4932 "var x := 2; var v0[3] := {1,2,3}; ( ~{ for (var i := 0; i < 10; i += 1) { "
4933 "for (var j := 0; j <= i; j += 1) { var y := 3; var v2[3] := {1,2,3}; if ( "
4934 "(i + j + y + x + abs(v0[i % v0[]] - v2[j % v2[]])) < 6) { var v3[3] := "
4935 "{1,2,3}; y += x / v3[j % v3[]]; continue; } else break[i + j]; } } } "
4936 "+ ~{ for (var i := 0; i < 10; i += 1) { for (var j := 0; j <= i; j += 1) "
4937 " { var y := 3; var v2[3] := {1,2,3}; if ((i + j + y + x + abs(v0[i % v0[]] - "
4938 "v2[j % v2[]])) < 6) { var v3[3] := {1,2,3}; y += x / v3[j % v3[]]; "
4939 "continue; } else break[i + j]; } } } ) == 18 ",
4940
4941 "12 == (if (1 > 2) { var x:= 2; } else { var x[3] := {7,2,3}; sum(x); })",
4942 "12 == (if (1 < 2) { var x[3] := {7,2,3}; sum(x); } else { var x:= 2; })",
4943 "12 == (if (1 > 2) { var x:= 2; } else { var x[3] := {7,2,3}; sum(x); })",
4944 "12 == (if (1 < 2) { var x[3] := {7,2,3}; sum(x); } else { var x:= 2; })",
4945
4946 "21 == (for (var i := 0; i < 10; i += 1) { if (i > 2) { break [i * 7]; i += 1;"
4947 "i += 2; i += 3; }; })",
4948
4949 "21 == (for (var i := 0; i < 10; i += 1) { if (i > 2) { break [i * 7]; return "
4950 "[i * 8]; i += 1; i += 2; i += 3; }; })",
4951
4952 "2 == for (var i := 0; i < 10; i += 1) { if (i > 2) { continue; i += 1; i += 2;"
4953 "i += 3; } else i; }",
4954
4955 "2 == for (var i := 0; i < 10; i += 1) { if (i > 2) { continue; return [i * 8];"
4956 "i += 1; i += 2; i += 3; } else i; }",
4957
4958 "var x[10] := [-1]; var y[10] := [-1]; for (var i := 0; i < 10; i += 1) { x[i] := i; "
4959 "y[i] := 2 * x[i]; }; (sum(x) == 45) and (sum(y) == (2 * sum(x)));"
4960
4961 "7 == (for (var i := 0; i < 10; i += 1) { ~{break[7]; continue; i += i} })",
4962 "0 == (for (var i := 0; i < 10; i += 1) { ~{break[i]; continue; i += i} })",
4963 "0 == (for (var i := 0; i < 10; i += 1) { ~{continue; break[7]; i += i} })",
4964 "1 == (for (var i := 0; i < 10; i += 1) { ~{break[i += 1]; continue; i += i} })",
4965
4966 "var s := 'abc'; s == ~{'abc' } ",
4967 "var s := 'abc'; s == ~{s } ",
4968 "var s := 'abc'; s == ~{'ab' + 'c'} ",
4969 "var s := 'abc'; ~{'abc' } == s ",
4970 "var s := 'abc'; ~{s } == s ",
4971 "var s := 'abc'; ~{'ab' + 'c'} == s ",
4972 "var s := 'abc'; ~{1 + 2; 'abc' + s; s} == s ",
4973 "var s := 'abc'; ~{1 + 2; var x := 'ab'; x + 'c'} == s ",
4974
4975 "var x[10^6] := null; var y[10^7] := null; 0 * (min(x) + min(y)) + x[] + y[] == 10^7 + 10^6",
4976
4977 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 < 2, v0, v1) == v0",
4978 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 > 2, v0, v1) == v1",
4979 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 < 2, v0 - v1, v1 - v0) == (v0 - v1)",
4980 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 > 2, v0 - v1, v1 - v0) == (v1 - v0)",
4981 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; if (x < y, v0, v1) == v0",
4982 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; if (x > y, v0, v1) == v1",
4983 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; if (x < y, v0 - v1, v1 - v0) == (v0 - v1)",
4984 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; if (x > y, v0 - v1, v1 - v0) == (v1 - v0)",
4985
4986 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 < 2, v0, v1) == v0",
4987 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 > 2, v0, v1) == v1",
4988 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 < 2, v0 - v1, v1 - v0) == (v0 - v1)",
4989 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 > 2, v0 - v1, v1 - v0) == (v1 - v0)",
4990 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; if (x < y, v0, v1) == v0",
4991 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; if (x > y, v0, v1) == v1",
4992 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; if (x < y, v0 - v1, v1 - v0) == (v0 - v1)",
4993 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; if (x > y, v0 - v1, v1 - v0) == (v1 - v0)",
4994
4995 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 < 2) v0; else v1;) == v0",
4996 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 > 2) v0; else v1;) == v1",
4997 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 < 2) v0 - v1; else v1 - v0;) == (v0 - v1)",
4998 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 > 2) v0 - v1; else v1 - v0;) == (v1 - v0)",
4999 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; (if (x < y) v0; else v1;) == v0",
5000 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; (if (x > y) v0; else v1;) == v1",
5001 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; (if (x < y) v0 - v1; else v1 - v0;) == (v0 - v1)",
5002 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; (if (x > y) v0 - v1; else v1 - v0;) == (v1 - v0)",
5003
5004 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 < 2) v0; else v1;) == v0",
5005 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 > 2) v0; else v1;) == v1",
5006 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 < 2) v0 - v1; else v1 - v0;) == (v0 - v1)",
5007 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 > 2) v0 - v1; else v1 - v0;) == (v1 - v0)",
5008 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; (if (x < y) v0; else v1;) == v0",
5009 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; (if (x > y) v0; else v1;) == v1",
5010 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; (if (x < y) v0 - v1; else v1 - v0;) == (v0 - v1)",
5011 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; (if (x > y) v0 - v1; else v1 - v0;) == (v1 - v0)",
5012
5013 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((-x * -y)); true;",
5014 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((-x + -y)); true;",
5015 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((-x - -y)); true;",
5016 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((-x / -y)); true;",
5017 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) + (1.123 * y)); true;",
5018 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) - (1.123 * y)); true;",
5019 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) + (y * 1.123)); true;",
5020 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) - (y * 1.123)); true;",
5021 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) * (y / z)); true;",
5022 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) / (y / z)); true;",
5023 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) / y); true;",
5024 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) * 2.123); true;",
5025 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) / 2.123); true;",
5026 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) * (2.123 * y)); true;",
5027 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) * (y * 2.123)); true;",
5028 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) / (2.123 * y)); true;",
5029 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) / (2.123 / y)); true;",
5030 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) / (y * 2.123)); true;",
5031 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) / (y / 2.123)); true;",
5032 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 + x) + 2.123); true;",
5033 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 + x) - 2.123); true;",
5034 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 + x) + (2.123 + y)); true;",
5035 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 + x) + (y + 2.123)); true;",
5036 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 + x) - (2.123 + y)); true;",
5037 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 + x) - (y + 2.123)); true;",
5038 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 - x) + 2.123); true;",
5039 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 - x) - 2.123); true;",
5040 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 - x) - (2.123 - y)); true;",
5041 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 - x) - (y - 2.123)); true;",
5042 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) * 2.123); true;",
5043 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) / 2.123); true;",
5044 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) * (2.123 / y)); true;",
5045 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) * (y / 2.123)); true;",
5046 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) / (2.123 * y)); true;",
5047 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) / (2.123 / y)); true;",
5048 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) / (y * 2.123)); true;",
5049 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) / (y / 2.123)); true;",
5050 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) * (2.123 * x)); true;",
5051 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) * (2.123 / x)); true;",
5052 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) * (x * 2.123)); true;",
5053 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) * (x / 2.123)); true;",
5054 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) + (2.123 + x)); true;",
5055 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) + (2.123 - x)); true;",
5056 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) + (x + 2.123)); true;",
5057 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) + (x - 2.123)); true;",
5058 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) - (2.123 + x)); true;",
5059 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) - (2.123 - x)); true;",
5060 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) - (x + 2.123)); true;",
5061 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) - (x - 2.123)); true;",
5062 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) / (2.123 * x)); true;",
5063 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) / (2.123 / x)); true;",
5064 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) / (x * 2.123)); true;",
5065 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) / (x / 2.123)); true;",
5066 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) * 2.123); true;",
5067 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) / 2.123); true;",
5068 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x + 1.123) + 2.123); true;",
5069 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x + 1.123) - 2.123); true;",
5070 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x - 1.123) + 2.123); true;",
5071 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x - 1.123) - 2.123); true;",
5072 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) * 2.123); true;",
5073 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) / 2.123); true;",
5074 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x ^ 1.123) ^ 2.123); true;",
5075 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) + (1.123 * y)); true;",
5076 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) - (1.123 * y)); true;",
5077 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) + (y * 1.123)); true;",
5078 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) - (y * 1.123)); true;",
5079 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) * (2.123 * y)); true;",
5080 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) * (y * 2.123)); true;",
5081 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) / (2.123 * y)); true;",
5082 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) / (2.123 / y)); true;",
5083 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) / (y * 2.123)); true;",
5084 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) / (y / 2.123)); true;",
5085 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * y) / (z / w)); true;",
5086 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x + 1.123) + (2.123 + y)); true;",
5087 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x + 1.123) + (y + 2.123)); true;",
5088 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x + 1.123) - (2.123 + y)); true;",
5089 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x + 1.123) - (y + 2.123)); true;",
5090 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x + y) / (z / w)); true;",
5091 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x - 1.123) - (2.123 - y)); true;",
5092 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x - 1.123) - (y - 2.123)); true;",
5093 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x - y) / (z / w)); true;",
5094 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) * (y / z)); true;",
5095 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) + (y / 1.123)); true;",
5096 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) - (y / 1.123)); true;",
5097 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) / (y / z)); true;",
5098 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) / y); true;",
5099 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) * (2.123 / y)); true;",
5100 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) * (y + 2.123)); true;",
5101 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) * (y - 2.123)); true;",
5102 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) * (y / 2.123)); true;",
5103 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) / (2.123 * y)); true;",
5104 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) / (2.123 / y)); true;",
5105 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) / (y * 2.123)); true;",
5106 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) / (y / 2.123)); true;",
5107 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) * (1.123 / z)); true;",
5108 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) * (z / 1.123)); true;",
5109 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) * (z / w)); true;",
5110 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) / (1.123 / z)); true;",
5111 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) / (z / 1.123)); true;",
5112 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) / (z / w)); true;",
5113 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) / 1.123); true;",
5114 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) / z); true;",
5115 };
5116
5117 const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
5118
5119 static const std::size_t rounds = 20;
5120
5121 exprtk::symbol_table<T> symbol_table;
5122
5123 T zero = T(0);
5124 T one = T(1);
5125
5126 symbol_table.add_variable("zero",zero);
5127 symbol_table.add_variable("one" , one);
5128 symbol_table.add_pi();
5129
5130 bool failed = false;
5131
5132 for (std::size_t r = 0; r < rounds; ++r)
5133 {
5134 for (std::size_t i = 0; i < expression_list_size; ++i)
5135 {
5136 expression_t expression;
5137 expression.register_symbol_table(symbol_table);
5138
5139 {
5140 exprtk::parser<T> parser;
5141
5142 if (!parser.compile(expression_list[i],expression))
5143 {
5144 printf("run_test10() - swaps[1] Error: %s Expression: %s\n",
5145 parser.error().c_str(),
5146 expression_list[i].c_str());
5147
5148 failed = true;
5149 continue;
5150 }
5151 }
5152
5153 const T result = expression.value();
5154
5155 if (T(1) != result)
5156 {
5157 printf("run_test10() - swaps[1] evaluation error Expression: %s\n",
5158 expression_list[i].c_str());
5159
5160 failed = true;
5161 }
5162
5163 expression.release();
5164 }
5165
5166 if (failed)
5167 {
5168 return false;
5169 }
5170 }
5171
5172 // reuse parser
5173 for (std::size_t r = 0; r < rounds; ++r)
5174 {
5175 exprtk::parser<T> parser;
5176
5177 for (std::size_t i = 0; i < expression_list_size; ++i)
5178 {
5179 expression_t expression;
5180 expression.register_symbol_table(symbol_table);
5181
5182 if (!parser.compile(expression_list[i],expression))
5183 {
5184 printf("run_test10() - swaps[2] Error: %s Expression: %s\n",
5185 parser.error().c_str(),
5186 expression_list[i].c_str());
5187
5188 failed = true;
5189 continue;
5190 }
5191
5192 const T result = expression.value();
5193
5194 if (T(1) != result)
5195 {
5196 printf("run_test10() - swaps[2] evaluation error Expression: %s\n",
5197 expression_list[i].c_str());
5198
5199 failed = true;
5200 }
5201 }
5202
5203 if (failed)
5204 {
5205 return false;
5206 }
5207 }
5208 }
5209
5210 return true;
5211}
dependent_entity_collector & dec()
Definition exprtk.hpp:24737
bool remove_variable(const std::string &variable_name, const bool delete_node=true)
Definition exprtk.hpp:21029
std::size_t get_variable_list(Sequence< std::pair< std::string, T >, Allocator > &vlist) const
Definition exprtk.hpp:21105
stringvar_ptr get_stringvar(const std::string &string_name) const
Definition exprtk.hpp:20599
bool remove_stringvar(const std::string &string_name)
Definition exprtk.hpp:21038
variable_ptr get_variable(const std::string &variable_name) const
Definition exprtk.hpp:20579
bool symbol_exists(const std::string &symbol_name, const bool check_reserved_symb=true) const
Definition exprtk.hpp:21191
std::size_t get_stringvar_list(Sequence< std::pair< std::string, std::string >, Allocator > &svlist) const
Definition exprtk.hpp:21126
std::size_t stringvar_count() const
Definition exprtk.hpp:20554
bool remove_function(const std::string &function_name)
Definition exprtk.hpp:21047
bool not_equal(const T &t0, const T &t1, const T &epsilon=T(0.000000000001))
bool collect_variables(const std::string &expression, Sequence< std::string, Allocator > &symbol_list)
Definition exprtk.hpp:41742
bool collect_functions(const std::string &expression, Sequence< std::string, Allocator > &symbol_list)
Definition exprtk.hpp:41803

References exprtk::symbol_table< T >::add_constants(), exprtk::symbol_table< T >::add_function(), exprtk::symbol_table< T >::add_pi(), exprtk::symbol_table< T >::add_stringvar(), exprtk::symbol_table< T >::add_variable(), exprtk::symbol_table< T >::clear(), exprtk::parser< T >::dependent_entity_collector::collect_assignments(), exprtk::collect_functions(), exprtk::parser< T >::dependent_entity_collector::collect_variables(), exprtk::collect_variables(), exprtk::parser< T >::compile(), exprtk::parser< T >::dec(), exprtk::parser< T >::error(), expression_list, expression_list_size, exprtk::symbol_table< T >::get_stringvar(), exprtk::symbol_table< T >::get_stringvar_list(), exprtk::symbol_table< T >::get_variable(), exprtk::symbol_table< T >::get_variable_list(), not_equal(), exprtk::details::variable_node< T >::ref(), exprtk::details::stringvar_node< T >::ref(), exprtk::symbol_table< T >::remove_function(), exprtk::symbol_table< T >::remove_stringvar(), exprtk::symbol_table< T >::remove_variable(), rounds, exprtk::symbol_table< T >::stringvar_count(), and exprtk::symbol_table< T >::symbol_exists().

Here is the call graph for this function:

◆ run_test11()

template<typename T >
bool run_test11 ( )
inline

Definition at line 5214 of file exprtk_real_test.cpp.

5215{
5216 typedef exprtk::expression<T> expression_t;
5217 std::string expression_string = "(x + y) / 3";
5218
5219 T x = T(1.0);
5220 T y = T(2.0);
5221
5222 exprtk::symbol_table<T> symbol_table;
5223 symbol_table.add_variable("x",x);
5224 symbol_table.add_variable("y",y);
5225
5226 expression_t expression;
5227 expression.register_symbol_table(symbol_table);
5228
5229 static const std::size_t rounds = 500;
5230
5231 for (std::size_t i = 0; i < rounds; ++i)
5232 {
5233 {
5234 exprtk::parser<T> parser;
5235
5236 if (!parser.compile(expression_string,expression))
5237 {
5238 printf("run_test11() - Error: %s Expression: %s\n",
5239 parser.error().c_str(),
5240 expression_string.c_str());
5241
5242 return false;
5243 }
5244 }
5245
5246 if (not_equal(expression.value(),(x + y) / T(3),T(0.000001)))
5247 {
5248 printf("run_test11() - Error in evaluation!(1)\n");
5249 return false;
5250 }
5251
5252 expression.release();
5253
5254 if (false == (!expression))
5255 {
5256 printf("run_test11() - Error in evaluation!(2)\n");
5257 return false;
5258 }
5259
5260 {
5261 exprtk::parser<T> parser;
5262
5263 if (!parser.compile(expression_string,expression))
5264 {
5265 printf("run_test11() - Error: %s Expression: %s\n",
5266 parser.error().c_str(),
5267 expression_string.c_str());
5268
5269 return false;
5270 }
5271 }
5272
5273 expression.value();
5274
5275 if (not_equal(expression.value(),(x + y) / T(3),T(0.000001)))
5276 {
5277 printf("run_test11() - Error in evaluation!(3)\n");
5278 return false;
5279 }
5280 }
5281
5282 return true;
5283}

References exprtk::symbol_table< T >::add_variable(), exprtk::parser< T >::compile(), exprtk::parser< T >::error(), not_equal(), and rounds.

Here is the call graph for this function:

◆ run_test12()

template<typename T >
bool run_test12 ( )
inline

Definition at line 5286 of file exprtk_real_test.cpp.

5287{
5288 typedef exprtk::expression<T> expression_t;
5289
5290 static const std::string expression_string[] =
5291 {
5292 "equal(poly01(x,2.2,1.1),(2.2x^1+1.1))",
5293 "equal(poly02(x,3.3,2.2,1.1),(3.3x^2+2.2x^1+1.1))",
5294 "equal(poly03(x,4.4,3.3,2.2,1.1),(4.4x^3+3.3x^2+2.2x^1+1.1))",
5295 "equal(poly04(x,5.5,4.4,3.3,2.2,1.1),(5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
5296 "equal(poly05(x,6.6,5.5,4.4,3.3,2.2,1.1),(6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
5297 "equal(poly06(x,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
5298 "equal(poly07(x,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
5299 "equal(poly08(x,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
5300 "equal(poly09(x,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
5301 "equal(poly10(x,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
5302 "equal(poly11(x,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(3.3x^11+2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
5303 "equal(poly12(x,4.4,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(4.4x^12+3.3x^11+2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
5304 "EquaL(Poly01(x,2.2,1.1),(2.2x^1+1.1))",
5305 "eQuAl(pOly02(x,3.3,2.2,1.1),(3.3x^2+2.2x^1+1.1))",
5306 "eqUal(poLy03(x,4.4,3.3,2.2,1.1),(4.4x^3+3.3x^2+2.2x^1+1.1))",
5307 "eQuAl(polY04(x,5.5,4.4,3.3,2.2,1.1),(5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
5308 "EquAl(pOLy05(x,6.6,5.5,4.4,3.3,2.2,1.1),(6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
5309 "EqUaL(pOly06(x,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
5310 "Equal(Poly07(x,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
5311 "eQual(PoLy08(x,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
5312 "eqUal(pOlY09(x,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
5313 "equAl(POLY10(x,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
5314 "equaL(PolY11(x,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(3.3x^11+2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
5315 "EQUAL(pOLy12(x,4.4,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(4.4x^12+3.3x^11+2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))"
5316 };
5317
5318 static const std::size_t expression_string_size = sizeof(expression_string) / sizeof(std::string);
5319
5320 T x = T(1.23456);
5321
5334
5335 exprtk::symbol_table<T> symbol_table;
5336
5337 symbol_table.add_variable("x",x);
5338 symbol_table.add_function("poly01", poly01);
5339 symbol_table.add_function("poly02", poly02);
5340 symbol_table.add_function("poly03", poly03);
5341 symbol_table.add_function("poly04", poly04);
5342 symbol_table.add_function("poly05", poly05);
5343 symbol_table.add_function("poly06", poly06);
5344 symbol_table.add_function("poly07", poly07);
5345 symbol_table.add_function("poly08", poly08);
5346 symbol_table.add_function("poly09", poly09);
5347 symbol_table.add_function("poly10", poly10);
5348 symbol_table.add_function("poly11", poly11);
5349 symbol_table.add_function("poly12", poly12);
5350
5351 expression_t expression;
5352 expression.register_symbol_table(symbol_table);
5353
5354 static const std::size_t rounds = 500;
5355
5356 for (std::size_t i = 0; i < rounds; ++i)
5357 {
5358 for (std::size_t j = 0; j < expression_string_size; ++j)
5359 {
5360 const std::string& expr_str = expression_string[j];
5361
5362 {
5363 exprtk::parser<T> parser;
5364
5365 if (!parser.compile(expr_str,expression))
5366 {
5367 printf("run_test12() - Error: %s Expression: %s\n",
5368 parser.error().c_str(),
5369 expr_str.c_str());
5370
5371 return false;
5372 }
5373 }
5374
5375 if (T(1) != expression.value())
5376 {
5377 printf("run_test12() - Error in evaluation! Expression: %s\n",expr_str.c_str());
5378 return false;
5379 }
5380 }
5381 }
5382
5383 return true;
5384}

References exprtk::symbol_table< T >::add_function(), exprtk::symbol_table< T >::add_variable(), exprtk::parser< T >::compile(), exprtk::parser< T >::error(), and rounds.

Here is the call graph for this function:

◆ run_test13()

template<typename T >
bool run_test13 ( )
inline

Definition at line 5413 of file exprtk_real_test.cpp.

5414{
5415 typedef exprtk::symbol_table<T> symbol_table_t;
5416 typedef exprtk::expression<T> expression_t;
5417 typedef exprtk::parser<T> parser_t;
5418
5419 static const std::string expression_string[] =
5420 {
5421 "equal(sin(30),0.5) ",
5422 "equal(cos(60),0.5) ",
5423 "equal(sin(60),sqrt(3)/2) ",
5424 "equal(cos(30),sqrt(3)/2) ",
5425 "equal(sin(x_deg),0.5) ",
5426 "equal(cos(y_deg),0.5) ",
5427 "equal(sin(y_deg),sqrt(3)/2) ",
5428 "equal(cos(x_deg),sqrt(3)/2) ",
5429 "equal(sin(30) + sin(30),1.0) ",
5430 "equal(cos(60) + cos(60),1.0) ",
5431 "equal(sin(60) + sin(60),sqrt(3)) ",
5432 "equal(cos(30) + cos(30),sqrt(3)) ",
5433 "equal(sin(x_deg) + sin(x_deg),1.0) ",
5434 "equal(cos(y_deg) + cos(y_deg),1.0) ",
5435 "equal(sin(y_deg) + sin(y_deg),sqrt(3))",
5436 "equal(cos(x_deg) + cos(x_deg),sqrt(3))"
5437 };
5438
5439 static const std::size_t expression_string_size = sizeof(expression_string) / sizeof(std::string);
5440
5441 {
5442 T x_deg = T(30);
5443 T y_deg = T(60);
5444
5445 sine_deg <T> sine;
5446 cosine_deg<T> cosine;
5447
5448 symbol_table_t symbol_table_0;
5449 symbol_table_t symbol_table_1;
5450
5451 symbol_table_0.add_variable("x_deg",x_deg);
5452 symbol_table_1.add_variable("y_deg",y_deg);
5453
5454 symbol_table_0.add_function( "sine_deg", sine);
5455 symbol_table_1.add_function("cosine_deg", cosine);
5456
5457 expression_t expression;
5458
5459 expression.register_symbol_table(symbol_table_0);
5460 expression.register_symbol_table(symbol_table_1);
5461
5462 static const std::size_t rounds = 100;
5463
5464 for (std::size_t i = 0; i < rounds; ++i)
5465 {
5466 for (std::size_t j = 0; j < expression_string_size; ++j)
5467 {
5468 const std::string& expr_str = expression_string[j];
5469
5470 {
5471 parser_t parser;
5472
5473 parser.replace_symbol("sin", "sine_deg");
5474 parser.replace_symbol("cos", "cosine_deg");
5475
5476 if (!parser.compile(expr_str,expression))
5477 {
5478 printf("run_test13() - Error: %s Expression: %s [1]\n",
5479 parser.error().c_str(),
5480 expr_str.c_str());
5481
5482 return false;
5483 }
5484 }
5485
5486 if (T(1) != expression.value())
5487 {
5488 printf("run_test13() - Error in evaluation! Expression: %s [1]\n",expr_str.c_str());
5489 return false;
5490 }
5491 }
5492 }
5493 }
5494
5495 {
5496 T x_deg = T(30);
5497 T y_deg = T(60);
5498
5499 sine_deg <T> sine;
5500 cosine_deg<T> cosine;
5501
5502 symbol_table_t symbol_table_0;
5503 symbol_table_t symbol_table_1;
5504
5505 symbol_table_0.add_variable("x_deg",x_deg);
5506 symbol_table_1.add_variable("y_deg",y_deg);
5507
5508 symbol_table_0.add_reserved_function("sin", sine);
5509 symbol_table_1.add_reserved_function("cos",cosine);
5510
5511 expression_t expression;
5512
5513 expression.register_symbol_table(symbol_table_0);
5514 expression.register_symbol_table(symbol_table_1);
5515
5516 static const std::size_t rounds = 100;
5517
5518 for (std::size_t i = 0; i < rounds; ++i)
5519 {
5520 for (std::size_t j = 0; j < expression_string_size; ++j)
5521 {
5522 const std::string& expr_str = expression_string[j];
5523
5524 {
5525 typedef typename parser_t::settings_store settings_t;
5526
5527 parser_t parser;
5528
5529 parser.settings()
5530 .disable_base_function(settings_t::e_bf_sin)
5531 .disable_base_function(settings_t::e_bf_cos);
5532
5533 if (!parser.compile(expr_str,expression))
5534 {
5535 printf("run_test13() - Error: %s Expression: %s [2]\n",
5536 parser.error().c_str(),
5537 expr_str.c_str());
5538
5539 return false;
5540 }
5541 }
5542
5543 if (T(1) != expression.value())
5544 {
5545 printf("run_test13() - Error in evaluation! Expression: %s [2]\n",expr_str.c_str());
5546 return false;
5547 }
5548 }
5549 }
5550 }
5551
5552 return true;
5553}

References rounds.

◆ run_test14()

template<typename T >
bool run_test14 ( )
inline

Definition at line 5584 of file exprtk_real_test.cpp.

5585{
5586 typedef exprtk::expression<T> expression_t;
5587
5588 T x = T(0);
5589 T y = T(0);
5590 T z = T(0);
5591 T w = T(0);
5592
5605
5606 exprtk::rtl::vecops::package<T> vector_package;
5607
5608 exprtk::symbol_table<T> symbol_table;
5609 symbol_table.add_constants();
5610 symbol_table.add_variable("x",x);
5611 symbol_table.add_variable("y",y);
5612 symbol_table.add_variable("z",z);
5613 symbol_table.add_variable("w",w);
5614 symbol_table.add_function("poly01", poly01);
5615 symbol_table.add_function("poly02", poly02);
5616 symbol_table.add_function("poly03", poly03);
5617 symbol_table.add_function("poly04", poly04);
5618 symbol_table.add_function("poly05", poly05);
5619 symbol_table.add_function("poly06", poly06);
5620 symbol_table.add_function("poly07", poly07);
5621 symbol_table.add_function("poly08", poly08);
5622 symbol_table.add_function("poly09", poly09);
5623 symbol_table.add_function("poly10", poly10);
5624 symbol_table.add_function("poly11", poly11);
5625 symbol_table.add_function("poly12", poly12);
5626
5627 symbol_table.add_package(vector_package);
5628
5629 expression_t expression;
5630 expression.register_symbol_table(symbol_table);
5631
5632 exprtk::parser<T> parser;
5633
5634 std::deque<std::string> expr_str_list;
5635
5636 load_expressions("exprtk_functional_test.txt" ,expr_str_list);
5637 load_expressions("exprtk_functional_ext_test.txt",expr_str_list);
5638
5639 if (expr_str_list.empty())
5640 {
5641 return true;
5642 }
5643
5644 std::deque<exprtk::expression<T> > expression_list;
5645 bool error_found = false;
5646 static const std::size_t rounds = 5;
5647
5648 for (std::size_t r = 0; r < rounds; ++r)
5649 {
5650 for (std::size_t i = 0; i < expr_str_list.size(); ++i)
5651 {
5652 exprtk::expression<T> current_expression;
5653
5654 current_expression.register_symbol_table(symbol_table);
5655
5656 if (!parser.compile(expr_str_list[i],current_expression))
5657 {
5658 printf("run_test14() - Error: %s Expression: %s\n",
5659 parser.error().c_str(),
5660 expr_str_list[i].c_str());
5661
5662 error_found = true;
5663 }
5664 else
5665 expression_list.push_back(current_expression);
5666 }
5667
5668 if (error_found)
5669 {
5670 break;
5671 }
5672
5673 for (std::size_t i = 0; i < expression_list.size(); ++i)
5674 {
5675 T result = expression_list[i].value();
5676
5677 if (result != T(1))
5678 {
5679 error_found = true;
5680
5681 printf("run_test14() - Error with evaluation of expression: %s\n",
5682 expr_str_list[i].c_str());
5683 }
5684 }
5685
5686 expression_list.clear();
5687
5688 if (error_found)
5689 {
5690 break;
5691 }
5692 }
5693
5694 return !error_found;
5695}
bool add_package(Package &package)
Definition exprtk.hpp:21098
std::size_t load_expressions(const std::string &file_name, Sequence< std::string, Allocator > &sequence)

References exprtk::symbol_table< T >::add_constants(), exprtk::symbol_table< T >::add_function(), exprtk::symbol_table< T >::add_package(), exprtk::symbol_table< T >::add_variable(), exprtk::parser< T >::compile(), exprtk::parser< T >::error(), expression_list, load_expressions(), exprtk::expression< T >::register_symbol_table(), and rounds.

Here is the call graph for this function:

◆ run_test15()

template<typename T >
bool run_test15 ( )
inline

Definition at line 5698 of file exprtk_real_test.cpp.

5699{
5700 typedef exprtk::expression<T> expression_t;
5701
5702 T x = T(1.1);
5703 T y = T(2.2);
5704 T z = T(3.3);
5705
5706 exprtk::symbol_table<T> symbol_table;
5707 symbol_table.add_constants();
5708 symbol_table.add_variable("x",x);
5709 symbol_table.add_variable("y",y);
5710 symbol_table.add_variable("z",z);
5711
5712 static const std::string expr_str_list[] =
5713 {
5714 "2 - (x + y) / z//Comment 01 ",
5715 "2 - (x + y) / z#Comment 02 ",
5716 "2 - (x + y) / z //Comment 03 ",
5717 "2 - (x + y) / z #Comment 04 ",
5718 "2 - (x + y) / z//Comment 05 \n",
5719 "2 - (x + y) / z#Comment 06 \n",
5720 "2 - (x + y) / z //Comment 07\n",
5721 "2 - (x + y) / z #Comment 08 \n",
5722 "/* Comment 09*/2 - (x + y) / z",
5723 "/* Comment 10*/2 - (x + y) / z\n",
5724 "/* Comment 11*/2 - (x + y) / z/* Comment 12*/",
5725 "/* Comment 13*/2 - (x + y) / z/* Comment 14*/\n",
5726 "2 - /* Comment 15 */(x + y) / z",
5727 "2 - /* Comment 16 */(x + y) /* Comment 17 *// z \n",
5728 "2 - /* Comment 18 */(x + y) /* Comment 19 */ / z //Comment 20\n",
5729 "2 - /* Comment 21 */(x + y) /* Comment 22 */ / z #Comment 23\n",
5730 "2 - /* Comment 24 */(x + y) /* Comment 25 */ / z //Comment 26",
5731 "2 - /* Comment 27 */(x + y) /* Comment 28 */ / z #Comment 29"
5732 };
5733 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
5734
5735 std::deque<expression_t> expression_list;
5736
5737 for (std::size_t i = 0; i < expr_str_list_size; ++i)
5738 {
5739 expression_t expression;
5740 expression.register_symbol_table(symbol_table);
5741
5742 exprtk::parser<T> parser;
5743
5744 if (!parser.compile(expr_str_list[i],expression))
5745 {
5746 printf("run_test15() - Error: %s Expression: %s\n",
5747 parser.error().c_str(),
5748 expr_str_list[i].c_str());
5749
5750 return false;
5751 }
5752 else
5753 expression_list.push_back(expression);
5754 }
5755
5756 expression_t base_expression;
5757 const std::string base_expr_str = "2 - (x + y) / z";
5758
5759 {
5760 base_expression.register_symbol_table(symbol_table);
5761
5762 exprtk::parser<T> parser;
5763
5764 if (!parser.compile(base_expr_str,base_expression))
5765 {
5766 printf("run_test15() - Error: %s Expression: %s\n",
5767 parser.error().c_str(),
5768 base_expr_str.c_str());
5769
5770 return false;
5771 }
5772 }
5773
5774 bool error_found = false;
5775
5776 for (std::size_t i = 0; i < expression_list.size(); ++i)
5777 {
5778 T base_result = base_expression.value();
5779 T result = expression_list[i].value();
5780
5781 if (not_equal(base_result,result))
5782 {
5783 printf("run_test15() - Error in evaluation! (1) Base: %20.10f\tResult: %20.10f\tExpression: %s\n",
5784 static_cast<double>(base_result),
5785 static_cast<double>(result),
5786 expr_str_list[i].c_str());
5787
5788 error_found = true;
5789 }
5790 }
5791
5792 return !error_found;
5793}

References exprtk::symbol_table< T >::add_constants(), exprtk::symbol_table< T >::add_variable(), exprtk::parser< T >::compile(), exprtk::parser< T >::error(), expression_list, and not_equal().

Here is the call graph for this function:

◆ run_test16()

template<typename T >
bool run_test16 ( )
inline

Definition at line 5818 of file exprtk_real_test.cpp.

5819{
5820 typedef exprtk::expression<T> expression_t;
5821
5822 T x = T(1.1);
5823 T y = T(2.2);
5824 T z = T(3.3);
5825 T w = T(4.4);
5826 T u = T(5.5);
5827
5828 test_func0<T> test_func00;
5829 test_func1<T> test_func01;
5830 test_func2<T> test_func02;
5831 test_func3<T> test_func03;
5832 test_func4<T> test_func04;
5833 test_func5<T> test_func05;
5834
5835 exprtk::symbol_table<T> symbol_table;
5836 symbol_table.add_constants();
5837 symbol_table.add_variable("x",x);
5838 symbol_table.add_variable("y",y);
5839 symbol_table.add_variable("z",z);
5840 symbol_table.add_variable("w",w);
5841 symbol_table.add_variable("u",u);
5842
5843 symbol_table.add_function("test_func0",test_func00);
5844 symbol_table.add_function("test_func1",test_func01);
5845 symbol_table.add_function("test_func2",test_func02);
5846 symbol_table.add_function("test_func3",test_func03);
5847 symbol_table.add_function("test_func4",test_func04);
5848 symbol_table.add_function("test_func5",test_func05);
5849
5850 static const std::string expr_str_list[] =
5851 {
5852 "test_func0 = test_func0()",
5853 "test_func0 == test_func0()",
5854 "equal(1.1 + test_func0,test_func0() + 1.1)",
5855 "equal(test_func0 + 1.1,1.1 + test_func0())",
5856 "equal((1.1 + test_func0),(test_func0() + 1.1))",
5857 "equal((test_func0 + 1.1),(1.1 + test_func0()))",
5858 "equal(test_func0,test_func0())",
5859 "equal(test_func0,1.1234)",
5860 "equal(test_func0(),1.1234)",
5861 "equal(test_func0 + test_func0(),2 * 1.1234)",
5862 "equal((test_func0 + test_func0()),2 * 1.1234)",
5863 "equal((test_func0) + (test_func0()),2 * 1.1234)",
5864 "equal(test_func1(x),(x))",
5865 "equal(test_func2(x,y),(x + y))",
5866 "equal(test_func3(x,y,z),(x + y + z))",
5867 "equal(test_func4(x,y,z,w),(x + y + z + w))",
5868 "equal(test_func5(x,y,z,w,u),(x + y + z + w + u))",
5869 "equal(1.1 + test_func0,1.1234 + 1.1)",
5870 "equal(1.1 + test_func0(),1.1234 + 1.1)",
5871 "equal(1.1 + test_func1(x),(x + 1.1))",
5872 "equal(1.1 + test_func2(x,y),(x + y + 1.1))",
5873 "equal(1.1 + test_func3(x,y,z),(x + y + z + 1.1))",
5874 "equal(1.1 + test_func4(x,y,z,w),(x + y + z + w + 1.1))",
5875 "equal(1.1 + test_func5(x,y,z,w,u),(x + y + z + w + u + 1.1))",
5876 "equal(test_func0 + 2.2,1.1234 + 2.2)",
5877 "equal(test_func0() + 2.2,1.1234 + 2.2)",
5878 "equal(test_func1(x) + 2.2,(x + 2.2))",
5879 "equal(test_func2(x,y) + 2.2,(x + y + 2.2))",
5880 "equal(test_func3(x,y,z) + 2.2,(x + y + z + 2.2))",
5881 "equal(test_func4(x,y,z,w) + 2.2,(x + y + z + w + 2.2))",
5882 "equal(test_func5(x,y,z,w,u) + 2.2,(x + y + z + w + u + 2.2))",
5883 "equal({[test_func1(x)]},{[(x)]})",
5884 "equal({[test_func2(x,y)]},{[(x + y)]})",
5885 "equal({[test_func3(x,y,z)]},{[(x + y + z)]})",
5886 "equal({[test_func4(x,y,z,w)]},{[(x + y + z + w)]})",
5887 "equal({[test_func5(x,y,z,w,u)]},{[(x + y + z + w + u)]})",
5888 "equal(test_func1(2.12),(2.12))",
5889 "equal(test_func2(2.12,3.12),(2.12 + 3.12))",
5890 "equal(test_func3(2.12,3.12,4.12),(2.12 + 3.12 + 4.12))",
5891 "equal(test_func4(2.12,3.12,4.12,5.12),(2.12 + 3.12 + 4.12 + 5.12))",
5892 "equal(test_func5(2.12,3.12,4.12,5.12,6.12),(2.12 + 3.12 + 4.12 + 5.12 + 6.12))",
5893 "equal(1.1 + test_func1(2.12),(2.12 + 1.1))",
5894 "equal(1.1 + test_func2(2.12,3.12),(2.12 + 3.12 + 1.1))",
5895 "equal(1.1 + test_func3(2.12,3.12,4.12),(2.12 + 3.12 + 4.12 + 1.1))",
5896 "equal(1.1 + test_func4(2.12,3.12,4.12,5.12),(2.12 + 3.12 + 4.12 + 5.12 + 1.1))",
5897 "equal(1.1 + test_func5(2.12,3.12,4.12,5.12,6.12),(2.12 + 3.12 + 4.12 + 5.12 + 6.12 + 1.1))",
5898 "equal(test_func1(2.12) + 2.2,(2.12 + 2.2))",
5899 "equal(test_func2(2.12,3.12) + 2.2,(2.12 + 3.12 + 2.2))",
5900 "equal(test_func3(2.12,3.12,4.12) + 2.2,(2.12 + 3.12 + 4.12 + 2.2))",
5901 "equal(test_func4(2.12,3.12,4.12,5.12) + 2.2,(2.12 + 3.12 + 4.12 + 5.12 + 2.2))",
5902 "equal(test_func5(2.12,3.12,4.12,5.12,6.12) + 2.2,(2.12 + 3.12 + 4.12 + 5.12 + 6.12 + 2.2))",
5903 "equal({[test_func1(2.12)]},{[(2.12)]})",
5904 "equal({[test_func2(2.12,3.12)]},{[(2.12 + 3.12)]})",
5905 "equal({[test_func3(2.12,3.12,4.12)]},{[(2.12 + 3.12 + 4.12)]})",
5906 "equal({[test_func4(2.12,3.12,4.12,5.12)]},{[(2.12 + 3.12 + 4.12 + 5.12)]})",
5907 "equal({[test_func5(2.12,3.12,4.12,5.12,6.12)]},{[(2.12 + 3.12 + 4.12 + 5.12 + 6.12)]})",
5908 "TeSt_FuNc0 = tEsT_fUnC0()",
5909 "TEst_fuNC0 == tESt_fUNc0()",
5910 "EquaL(tEsT_FuNC1(x),(x))",
5911 "eQuAl(teSt_fUnc2(x,y),(x + y))",
5912 "EqUaL(tEsT_fUNc3(x,y,z),(x + y + z))",
5913 "EQUal(TEst_FunC4(x,y,z,w),(x + y + z + w))",
5914 "eqUAL(tEsT_FuNc5(x,y,z,w,u),(x + y + z + w + u))"
5915 };
5916 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
5917
5918 std::deque<expression_t> expression_list;
5919
5920 for (std::size_t i = 0; i < expr_str_list_size; ++i)
5921 {
5922 expression_t expression;
5923 expression.register_symbol_table(symbol_table);
5924
5925 exprtk::parser<T> parser;
5926
5927 if (!parser.compile(expr_str_list[i],expression))
5928 {
5929 printf("run_test16() - Error: %s Expression: %s\n",
5930 parser.error().c_str(),
5931 expr_str_list[i].c_str());
5932
5933 return false;
5934 }
5935 else
5936 expression_list.push_back(expression);
5937 }
5938
5939 bool error_found = false;
5940
5941 for (std::size_t i = 0; i < expression_list.size(); ++i)
5942 {
5943 if (T(1) != expression_list[i].value())
5944 {
5945 printf("run_test16() - Error in evaluation! (1) Expression: %s\n",
5946 expr_str_list[i].c_str());
5947
5948 error_found = true;
5949 }
5950 }
5951
5952 return !error_found;
5953}
T value(details::expression_node< T > *n)
Definition exprtk.hpp:15749

References exprtk::symbol_table< T >::add_constants(), exprtk::symbol_table< T >::add_function(), exprtk::symbol_table< T >::add_variable(), exprtk::parser< T >::compile(), exprtk::parser< T >::error(), and expression_list.

Here is the call graph for this function:

◆ run_test17()

template<typename T >
bool run_test17 ( )
inline

Definition at line 5956 of file exprtk_real_test.cpp.

5957{
5958 typedef exprtk::expression<T> expression_t;
5959
5960 T x = T(1.1);
5961 T y = T(2.2);
5962 T z = T(3.3);
5963 T w = T(4.4);
5964 T u = T(5.5);
5965 T v = T(6.6);
5966 T t = T(7.7);
5967
5968 T one = T(1);
5969 T zero = T(0);
5970
5971 exprtk::symbol_table<T> symbol_table;
5972 symbol_table.add_constants();
5973 symbol_table.add_variable("x",x);
5974 symbol_table.add_variable("y",y);
5975 symbol_table.add_variable("z",z);
5976 symbol_table.add_variable("w",w);
5977 symbol_table.add_variable("u",u);
5978 symbol_table.add_variable("v",v);
5979 symbol_table.add_variable("t",t);
5980
5981 symbol_table.add_variable("one",one);
5982 symbol_table.add_variable("zero",zero);
5983
5984 static const std::string expr_str_list[] =
5985 {
5986 "equal(mand(one,one),1.0)",
5987 "equal(mand(one,zero),0.0)",
5988 "equal(mand(zero,one),0.0)",
5989 "equal(mand(zero,zero),0.0)",
5990 "equal(mand(one,one),1.0)",
5991 "equal(mand(one,one,one),1.0)",
5992 "equal(mand(one,one,one,one),1.0)",
5993 "equal(mand(one,one,one,one,one),1.0)",
5994 "equal(mand(one,one,zero),0.0)",
5995 "equal(mand(one,one,one,zero),0.0)",
5996 "equal(mand(one,one,one,one,zero),0.0)",
5997 "equal(mand(one,one,one,one,one,zero),0.0)",
5998 "equal(mor(one,one),1.0)",
5999 "equal(mor(one,zero),1.0)",
6000 "equal(mor(zero,one),1.0)",
6001 "equal(mor(zero,zero),0.0)",
6002 "equal(mor(one,one),1.0)",
6003 "equal(mor(one,one,zero),1.0)",
6004 "equal(mor(one,zero,one),1.0)",
6005 "equal(mor(one,zero,one,zero),1.0)",
6006 "equal(mor(zero,one),1.0)",
6007 "equal(mor(zero,zero,one),1.0)",
6008 "equal(mor(zero,zero,zero,zero,one),1.0)",
6009 "equal(mor(zero,zero,zero,zero,zero,one),1.0)",
6010 "equal(mor(zero,zero,zero,zero,zero,zero,zero,zero),0.0)",
6011 "equal((one nand one),not(mand(one,one)))",
6012 "equal((one nand zero),not(mand(one,zero)))",
6013 "equal((zero nand one),not(mand(zero,one)))",
6014 "equal((zero nand zero),not(mand(zero,zero)))",
6015 "equal((one nor one),not(mor(one,one)))",
6016 "equal((one nor zero),not(mor(one,zero)))",
6017 "equal((zero nor one),not(mor(zero,one)))",
6018 "equal((zero nor zero),not(mor(zero,zero)))",
6019 "equal(sum(x,y,z,w,u,v,t),(x+y+z+w+u+v+t))",
6020 "equal(sum(x+t,y+v,z+u,w+w,u+z,v+y,t+x),2*(x+y+z+w+u+v+t))",
6021 "equal(mul(x,y,z,w,u,v,t),(x*y*z*w*u*v*t))",
6022 "equal(mul(x*t,y*v,z*u,w*w,u*z,v*y,t*x),(x*y*z*w*u*v*t)^2)",
6023 "equal(sum(x,1.0,y,2.0,z,3.0,w,4.0,u,5.0,v,6.0,t),(x+y+z+w+u+v+t+21.0))",
6024 "equal(sum(x+1.0,y+2.0,z+3.0,w+4.0,u+5.0,v+6.0,t),(x+y+z+w+u+v+t+21.0))",
6025 "equal(mul(x,1.0,y,2.0,z,3.0,w,4.0,u,5.0,v,6.0,t),(x*y*z*w*u*v*t*720.0))",
6026 "equal(mul(x*1.0,y*2.0,z*3.0,w*4.0,u*5.0,v*6.0,t),(x*y*z*w*u*v*t*720.0))",
6027 "equal(min(x,y,z,w,u,v,t,zero),zero)",
6028 "equal(min(x+y,z+w,u+v,t,zero),zero)",
6029 "equal(max(one,x,y,z,w,u,v,t),t)",
6030 "equal(max(x+y,z+w,u+v,t,one),u+v)",
6031 "equal(avg(x,y,z,w,u,v,t),(x+y+z+w+u+v+t)/7.0)",
6032 "equal(avg(x+t,y+v,z+u,w+w,u+z,v+y,t+x),2/7*(x+y+z+w+u+v+t))"
6033 };
6034 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
6035
6036 std::deque<expression_t> expression_list;
6037
6038 for (std::size_t i = 0; i < expr_str_list_size; ++i)
6039 {
6040 expression_t expression;
6041 expression.register_symbol_table(symbol_table);
6042
6043 exprtk::parser<T> parser;
6044
6045 if (!parser.compile(expr_str_list[i],expression))
6046 {
6047 printf("run_test17() - Error: %s Expression: %s\n",
6048 parser.error().c_str(),
6049 expr_str_list[i].c_str());
6050
6051 return false;
6052 }
6053 else
6054 expression_list.push_back(expression);
6055 }
6056
6057 bool error_found = false;
6058
6059 for (std::size_t i = 0; i < expression_list.size(); ++i)
6060 {
6061 if (T(1) != expression_list[i].value())
6062 {
6063 printf("run_test17() - Error in evaluation! (1) Expression: %s\n",
6064 expr_str_list[i].c_str());
6065
6066 error_found = true;
6067 }
6068 }
6069
6070 return !error_found;
6071}

References exprtk::symbol_table< T >::add_constants(), exprtk::symbol_table< T >::add_variable(), exprtk::parser< T >::compile(), exprtk::parser< T >::error(), and expression_list.

Here is the call graph for this function:

◆ run_test18()

template<typename T >
bool run_test18 ( )
inline

Definition at line 6423 of file exprtk_real_test.cpp.

6424{
6425 {
6426 exprtk::symbol_table<T> symbol_table;
6427 symbol_table.remove_variable("x",true);
6428 symbol_table.remove_variable("x",false);
6429 symbol_table.remove_stringvar("x");
6430 symbol_table.remove_function("x");
6431 symbol_table.remove_vararg_function("x");
6432 symbol_table.remove_vector("x");
6433 }
6434
6435 {
6436 exprtk::symbol_table<T> symbol_table;
6437
6438 {
6439 T x;
6440 const bool result1 = symbol_table.add_variable("x", x);
6441 const bool result2 = symbol_table.remove_variable("x");
6442 const bool result3 = symbol_table.remove_variable("x");
6443
6444 if (!result1 || !result2 || result3)
6445 {
6446 printf("run_test18() - Failed sym_tab add/remove [1]\n");
6447 }
6448 }
6449
6450 {
6451 std::string x;
6452 const bool result1 = symbol_table.add_stringvar("x", x);
6453 const bool result2 = symbol_table.remove_stringvar("x");
6454 const bool result3 = symbol_table.remove_stringvar("x");
6455
6456 if (!result1 || !result2 || result3)
6457 {
6458 printf("run_test18() - Failed sym_tab add/remove [2]\n");
6459 }
6460 }
6461
6462 {
6463 std::vector<T> x(10,T(0));
6464 const bool result1 = symbol_table.add_vector("x", x);
6465 const bool result2 = symbol_table.remove_vector("x");
6466 const bool result3 = symbol_table.remove_vector("x");
6467
6468 if (!result1 || !result2 || result3)
6469 {
6470 printf("run_test18() - Failed sym_tab add/remove [3]\n");
6471 }
6472 }
6473
6474 {
6475 myfunc<T> x;
6476 const bool result1 = symbol_table.add_function("x", x);
6477 const bool result2 = symbol_table.remove_function("x");
6478 const bool result3 = symbol_table.remove_function("x");
6479
6480 if (!result1 || !result2 || result3)
6481 {
6482 printf("run_test18() - Failed sym_tab add/remove [4]\n");
6483 }
6484 }
6485
6486 {
6487 va_func<T> x;
6488 const bool result1 = symbol_table.add_function("x", x);
6489 const bool result2 = symbol_table.remove_vararg_function("x");
6490 const bool result3 = symbol_table.remove_vararg_function("x");
6491
6492 if (!result1 || !result2 || result3)
6493 {
6494 printf("run_test18() - Failed sym_tab add/remove [5]\n");
6495 }
6496 }
6497
6498 {
6499 symbol_table.add_function("foo1",foo1);
6500 symbol_table.add_function("foo2",foo2);
6501 symbol_table.add_function("foo3",foo3);
6502 symbol_table.add_function("foo4",foo4);
6503 symbol_table.add_function("foo5",foo5);
6504 symbol_table.add_function("foo6",foo6);
6505
6506 symbol_table.remove_function("foo1");
6507 symbol_table.remove_function("foo2");
6508 symbol_table.remove_function("foo3");
6509 symbol_table.remove_function("foo4");
6510 symbol_table.remove_function("foo5");
6511 symbol_table.remove_function("foo6");
6512 }
6513 }
6514
6515 {
6516 typedef exprtk::expression<T> expression_t;
6517
6518 T x = T(1.1);
6519 T y = T(2.2);
6520 T z = T(3.3);
6521 T w = T(4.4);
6522 T u = T(5.5);
6523 T v = T(6.6);
6524 T t = T(7.7);
6525
6526 va_func<T> vaf;
6527
6528 exprtk::symbol_table<T> symbol_table;
6529 symbol_table.add_constants();
6530 symbol_table.add_variable("x",x);
6531 symbol_table.add_variable("y",y);
6532 symbol_table.add_variable("z",z);
6533 symbol_table.add_variable("w",w);
6534 symbol_table.add_variable("u",u);
6535 symbol_table.add_variable("v",v);
6536 symbol_table.add_variable("t",t);
6537 symbol_table.add_function("va_func",vaf);
6538
6539 static const std::string expr_str_list[] =
6540 {
6541 "equal(va_func,(0))",
6542 "equal(va_func(),(0))",
6543 "equal(va_func(1,2,3,4,5,6,7,8,9),(1+2+3+4+5+6+7+8+9))",
6544 "equal(va_func(1,x,3,y,5,z,7,w,9),(1+x+3+y+5+z+7+w+9))",
6545 "equal(va_func(x,2,y,4,z,6,w,8,u),(x+2+y+4+z+6+w+8+u))",
6546 "equal(va_func(x,y,z,w,u,v,t,1,2,3),(x+y+z+w+u+v+t+1+2+3))",
6547 "equal(va_func(x,y,z,w,u,v,t),(x+y+z+w+u+v+t))",
6548 "equal(va_func(x+t,y+v,z+u,w+w,u+z,v+y,t+x),2*(x+y+z+w+u+v+t))",
6549 "equal(1+va_func(1,x,3,y,5,z,7,w,9),(1+x+3+y+5+z+7+w+9)+1)",
6550 "equal(va_func(va_func(x,y,z,w,u,v,t),va_func(x,y,z,w,u,v,t)),2*(x+y+z+w+u+v+t))",
6551 "equal(va_func(va_func(x),va_func(y),va_func(z)),va_func(x,y,z))",
6552 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x)))))))),x)",
6553 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(123.456)))))))),123.456)",
6554 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x+1)))))))),x+1)",
6555 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x+y)))))))),x+y)"
6556 };
6557 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
6558
6559 std::deque<expression_t> expression_list;
6560
6561 for (std::size_t i = 0; i < expr_str_list_size; ++i)
6562 {
6563 expression_t expression;
6564 expression.register_symbol_table(symbol_table);
6565
6566 exprtk::parser<T> parser;
6567
6568 if (!parser.compile(expr_str_list[i],expression))
6569 {
6570 printf("run_test18() - [1] VarArg Error: %s Expression: %s\n",
6571 parser.error().c_str(),
6572 expr_str_list[i].c_str());
6573
6574 return false;
6575 }
6576 else
6577 expression_list.push_back(expression);
6578 }
6579
6580 bool error_found = false;
6581
6582 for (std::size_t i = 0; i < expression_list.size(); ++i)
6583 {
6584 if (T(1) != expression_list[i].value())
6585 {
6586 printf("run_test18() - Error in evaluation! (1) Expression: %s\n",
6587 expr_str_list[i].c_str());
6588
6589 error_found = true;
6590 }
6591 }
6592
6593 if (error_found)
6594 {
6595 return false;
6596 }
6597 }
6598
6599 {
6600 typedef exprtk::symbol_table<T> symbol_table_t;
6601 typedef exprtk::expression<T> expression_t;
6602 typedef exprtk::parser<T> parser_t;
6603
6604 T x = T(33);
6605 T y = T(77);
6606
6607 T v0[] = { T(1), T(1), T(1), T(1) };
6608 T v1[] = { T(1), T(2), T(3), T(4) };
6609
6610 std::vector<T> v2;
6611
6612 v2.push_back(T(5));
6613 v2.push_back(T(6));
6614 v2.push_back(T(7));
6615 v2.push_back(T(8));
6616
6617 std::string s0 = "AbCdEfGhIj";
6618
6619 gen_func<T> f;
6620
6621 symbol_table_t symbol_table;
6622
6623 symbol_table.add_constants();
6624
6625 symbol_table.add_variable ("x" , x);
6626 symbol_table.add_variable ("y" , y);
6627 symbol_table.add_vector ("v0" ,v0);
6628 symbol_table.add_vector ("v1" ,v1);
6629 symbol_table.add_vector ("v2" ,v2);
6630 symbol_table.add_stringvar("s0", s0);
6631 symbol_table.add_function ("gen_func", f);
6632
6633 const std::string expression_list[] =
6634 {
6635 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6]);",
6636 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6]);",
6637 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6],v0);",
6638 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2);",
6639 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(x, 2x + y, z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2]);",
6640 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(2x + y, z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2], x);",
6641 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2], x, 2x + y);",
6642 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2], x, 2x + y, z);",
6643 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func('abc123', s0[2:6],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3);",
6644 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(s0[2:6],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3, 'abc123');"
6645 };
6646
6647 static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
6648
6649 bool error_found = false;
6650
6651 for (std::size_t i = 0; i < expression_list_size; ++i)
6652 {
6653 const std::string& expression_str = expression_list[i];
6654 expression_t expression;
6655
6656 expression.register_symbol_table(symbol_table);
6657
6658 parser_t parser;
6659
6660 if (!parser.compile(expression_str,expression))
6661 {
6662 printf("run_test18() - [2] GenFunc Error: %s Expression: %s [2]\n",
6663 parser.error().c_str(),
6664 expression_str.c_str());
6665
6666 error_found = true;
6667 continue;
6668 }
6669
6670 f.scalar_count = 0;
6671 f.vector_count = 0;
6672 f.string_count = 0;
6673
6674 expression.value();
6675
6676 if (
6677 (4 != f.scalar_count) ||
6678 (3 != f.vector_count) ||
6679 (2 != f.string_count)
6680 )
6681 {
6682 printf("run_test18() - Error in evaluation! (2) Expression: %s "
6683 "sc_count = %d "
6684 "vr_count = %d "
6685 "st_count = %d\n",
6686 expression_list[i].c_str(),
6687 static_cast<int>(f.scalar_count),
6688 static_cast<int>(f.vector_count),
6689 static_cast<int>(f.string_count));
6690
6691 error_found = true;
6692 }
6693
6694 expression.release();
6695 }
6696
6697 if (error_found)
6698 {
6699 return false;
6700 }
6701 }
6702
6703 {
6704 typedef exprtk::symbol_table<T> symbol_table_t;
6705 typedef exprtk::expression<T> expression_t;
6706 typedef exprtk::parser<T> parser_t;
6707
6708 T x = T(33);
6709 T y = T(77);
6710
6711 T v0[] = { T(1), T(1), T(1), T(1) };
6712 T v1[] = { T(1), T(2), T(3), T(4) };
6713 T v2[] = { T(5), T(6), T(7), T(8) };
6714
6715 std::string s0 = "AbCdEfGhIj";
6716
6717 gen_func2<T> f;
6718
6719 symbol_table_t symbol_table;
6720
6721 symbol_table.add_constants();
6722
6723 symbol_table.add_variable ("x" , x);
6724 symbol_table.add_variable ("y" , y);
6725 symbol_table.add_vector ("v0" ,v0);
6726 symbol_table.add_vector ("v1" ,v1);
6727 symbol_table.add_vector ("v2" ,v2);
6728 symbol_table.add_stringvar("s0", s0);
6729 symbol_table.add_function ("foo", f);
6730
6731 const std::string expression_list[] =
6732 {
6733 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6]);",
6734 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6],v0);",
6735 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2);",
6736 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x, 2x + y, z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2]);",
6737 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(2x + y, z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2], x);",
6738 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2], x, 2x + y);",
6739 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2], x, 2x + y, z);",
6740 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo('abc123', s0[2:6],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3);",
6741 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0[2:6],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3, 'abc123');",
6742 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0[2:3]+s0[4:5],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3, 'abc123');",
6743 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6744 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6745 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6746 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6747 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x);",
6748 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x);",
6749 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x);",
6750 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x,x);",
6751 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0);",
6752 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0);",
6753 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0);",
6754 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0,s0);",
6755 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0);",
6756 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0);",
6757 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0);",
6758 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0,v0);",
6759 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x);",
6760 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x);",
6761 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x);",
6762 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x,x);",
6763 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0);",
6764 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0);",
6765 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0);",
6766 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0,s0);",
6767 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0);",
6768 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0);",
6769 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0);",
6770 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0,v0);",
6771 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6772 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6773 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6774 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);"
6775 };
6776
6777 static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
6778
6779 const std::string parameter_type_list[] =
6780 {
6781 "VVTTTTVSS",
6782 "VTTTTVSSV",
6783 "TTTTVSSVV",
6784 "TTTVSSVVT",
6785 "TTVSSVVT*",
6786 "TVSSVVT*" ,
6787 "VSSVVT*" ,
6788 "SSVVTTTTV",
6789 "SVVTTTTVS",
6790 "SVVTTTTVS",
6791 "V*T*VS*" ,
6792 "V*TTTTVSS",
6793 "VVT*VSS" ,
6794 "VVTTTTVS*",
6795 "T*",
6796 "T*",
6797 "T*",
6798 "T*",
6799 "S*",
6800 "S*",
6801 "S*",
6802 "S*",
6803 "V*",
6804 "V*",
6805 "V*",
6806 "V*",
6807 "T",
6808 "TT",
6809 "TTT",
6810 "TTTT",
6811 "S",
6812 "SS",
6813 "SSS",
6814 "SSSS",
6815 "V",
6816 "VV",
6817 "VVV",
6818 "VVVV",
6819 "TTTTTTT|STSTSTS|V*T*VS*" ,
6820 "TTTTTTT|STSTSTS|V*TTTTVSS",
6821 "TTTTTTT|STSTSTS|VVT*VSS" ,
6822 "TTTTTTT|STSTSTS|VVTTTTVS*",
6823 };
6824
6825 bool error_found = false;
6826
6827 for (std::size_t i = 0; i < expression_list_size; ++i)
6828 {
6829 const std::string& expression_str = expression_list[i];
6830 expression_t expression;
6831
6832 expression.register_symbol_table(symbol_table);
6833
6834 parser_t parser;
6835
6836 f.parameter_sequence = parameter_type_list[i];
6837
6838 if (!parser.compile(expression_str,expression))
6839 {
6840 printf("run_test18() - [3] GenFunc2 Error: %s Expression: %s Parameter Sequence: %s [3]\n",
6841 parser.error().c_str(),
6842 expression_str.c_str(),
6843 parameter_type_list[i].c_str());
6844
6845 error_found = true;
6846 continue;
6847 }
6848
6849 expression.value();
6850 }
6851
6852 if (error_found)
6853 {
6854 return false;
6855 }
6856 }
6857
6858 {
6859 bool error_found = false;
6860
6861 const std::string expression_list[] =
6862 {
6863 "foo(v0,v1,v2,x,y,s0);",
6864 "foo(v1,v2,x,y,s0,v0);",
6865 "foo(v2,x,y,s0,v0,v1);",
6866 "foo(x,y,s0,v0,v1,v2);",
6867 "foo(y,s0,v0,v1,v2,x);",
6868 "foo(s0,v0,v1,v2,x,y);"
6869 };
6870
6871 static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
6872
6873 const std::string parameter_type_list[] =
6874 {
6875 "VVVTTS",
6876 "VVTTSV",
6877 "VTTSVV",
6878 "TTSVVV",
6879 "TSVVVT",
6880 "SVVVTT"
6881 };
6882
6883 for (std::size_t i = 0; i < expression_list_size; ++i)
6884 {
6885 typedef exprtk::symbol_table<T> symbol_table_t;
6886 typedef exprtk::expression<T> expression_t;
6887 typedef exprtk::parser<T> parser_t;
6888
6889 T x = T(33);
6890 T y = T(77);
6891
6892 T v0[] = { T(1), T(1), T(1), T(1) };
6893 T v1[] = { T(1), T(2), T(3), T(4) };
6894 T v2[] = { T(5), T(6), T(7), T(8) };
6895
6896 std::string s0 = "AbCdEfGhIj";
6897
6898 T x_inc = T(34);
6899 T y_inc = T(78);
6900
6901 T v0_inc[] = { T(2), T(2), T(2), T(2) };
6902 T v1_inc[] = { T(2), T(3), T(4), T(5) };
6903 T v2_inc[] = { T(6), T(7), T(8), T(9) };
6904
6905 std::size_t sizeof_vec = sizeof(v0) / sizeof(T);
6906
6907 std::string s0_inc = "BcDeFgHiJk";
6908
6909 inc_func<T> f;
6910
6911 symbol_table_t symbol_table;
6912
6913 symbol_table.add_constants();
6914
6915 symbol_table.add_variable ("x" , x );
6916 symbol_table.add_variable ("y" , y );
6917 symbol_table.add_vector ("v0" , v0);
6918 symbol_table.add_vector ("v1" , v1);
6919 symbol_table.add_vector ("v2" , v2);
6920 symbol_table.add_stringvar("s0", s0);
6921 symbol_table.add_function ("foo", f );
6922
6923 expression_t expression;
6924
6925 expression.register_symbol_table(symbol_table);
6926
6927 parser_t parser;
6928
6929 f.parameter_sequence = parameter_type_list[i];
6930
6931 if (!parser.compile(expression_list[i],expression))
6932 {
6933 printf("run_test18() - [4] IncFunc Error: %s Expression: %s Parameter Sequence: %s [4]\n",
6934 parser.error().c_str(),
6935 expression_list[i].c_str(),
6936 parameter_type_list[i].c_str());
6937
6938 error_found = true;
6939 continue;
6940 }
6941
6942 expression.value();
6943
6944 if (x != x_inc)
6945 {
6946 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: x\n",
6947 expression_list[i].c_str());
6948 error_found = true;
6949 }
6950
6951 if (y != y_inc)
6952 {
6953 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: y\n",
6954 expression_list[i].c_str());
6955 error_found = true;
6956 }
6957
6958 if (s0 != s0_inc)
6959 {
6960 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: y\n",
6961 expression_list[i].c_str());
6962 error_found = true;
6963 }
6964
6965 if (!std::equal(v0,v0 + sizeof_vec,v0_inc))
6966 {
6967 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v0\n",
6968 expression_list[i].c_str());
6969 error_found = true;
6970 }
6971
6972 if (!std::equal(v1,v1 + sizeof_vec,v1_inc))
6973 {
6974 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v1\n",
6975 expression_list[i].c_str());
6976 error_found = true;
6977 }
6978
6979 if (!std::equal(v2,v2 + sizeof_vec,v2_inc))
6980 {
6981 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v2\n",
6982 expression_list[i].c_str());
6983 error_found = true;
6984 }
6985 }
6986
6987 if (error_found)
6988 {
6989 return false;
6990 }
6991 }
6992
6993 {
6994 bool error_found = false;
6995
6997
6998 std::string s0 = "XXXXXXXXXXXXXXX";
6999 std::string s1 = "XXXXXXXXXXXXXXX";
7000 std::string s2 = "XXXXXXXXXXXXXXX";
7001 std::string s3 = "XXXXXXXXXXXXXXX";
7002 std::string s4 = "XXXXXXXXXXXXXXX";
7003
7004 typedef exprtk::symbol_table<T> symbol_table_t;
7005 typedef exprtk::expression<T> expression_t;
7006 typedef exprtk::parser<T> parser_t;
7007
7008 symbol_table_t symbol_table;
7009
7010 symbol_table.add_constants();
7011
7012 symbol_table.add_stringvar("s0", s0);
7013 symbol_table.add_stringvar("s1", s1);
7014 symbol_table.add_stringvar("s2", s2);
7015 symbol_table.add_stringvar("s3", s3);
7016 symbol_table.add_stringvar("s4", s4);
7017
7018 symbol_table.add_function("remspc_uc", rsauc);
7019
7020 const std::string program =
7021 " s0 := 'How now '; "
7022 " s1 := 'brown cow?'; "
7023 " s2 := remspc_uc(s0 + s1); "
7024 " s3 := remspc_uc(s0) + s1; "
7025 " s4 := s0 + remspc_uc(s1); "
7026 " remspc_uc(s0 + s1) == remspc_uc(s0) + remspc_uc(s1); ";
7027
7028 const std::string parameter_type_list[] =
7029 {
7030 "VVVTTT|S",
7031 "VVTTTV|S",
7032 "VTTTVV|S",
7033 "TTTVVV|S",
7034 "TTVVVT|S",
7035 "TVVVTT|S"
7036 };
7037
7038 std::size_t parameter_type_list_size = sizeof(parameter_type_list) / sizeof(std::string);
7039
7040 for (std::size_t i = 0; i < parameter_type_list_size; ++i)
7041 {
7042 expression_t expression;
7043
7044 expression.register_symbol_table(symbol_table);
7045
7046 parser_t parser;
7047
7048 rsauc.parameter_sequence = parameter_type_list[i];
7049
7050 if (!parser.compile(program,expression))
7051 {
7052 printf("run_test18() - [5] Error: %s\tExpression: %s\n",
7053 parser.error().c_str(),
7054 program.c_str());
7055
7056 return false;
7057 }
7058
7059 const T result = expression.value();
7060
7061 if (result != T(1))
7062 {
7063 printf("run_test18() - Error in evaluation! (4) Expression: %s Result <> 1\n",
7064 program.c_str());
7065 error_found = true;
7066 }
7067
7068 if (result != T(1))
7069 {
7070 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s0\n",
7071 program.c_str());
7072 error_found = true;
7073 }
7074
7075 if ("How now " != s0)
7076 {
7077 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s0\n",
7078 program.c_str());
7079 error_found = true;
7080 }
7081
7082 if ("brown cow?" != s1)
7083 {
7084 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s1\n",
7085 program.c_str());
7086 error_found = true;
7087 }
7088
7089 if ("HOWNOWBROWNCOW?" != s2)
7090 {
7091 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s2\n",
7092 program.c_str());
7093 error_found = true;
7094 }
7095
7096 if ("HOWNOWbrown cow?" != s3)
7097 {
7098 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s3\n",
7099 program.c_str());
7100 error_found = true;
7101 }
7102
7103 if ("How now BROWNCOW?" != s4)
7104 {
7105 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s4\n",
7106 program.c_str());
7107 error_found = true;
7108 }
7109 }
7110
7111 if (error_found)
7112 {
7113 return false;
7114 }
7115 }
7116
7117 {
7118 bool error_found = false;
7119
7120 typedef exprtk::symbol_table<T> symbol_table_t;
7121 typedef exprtk::expression<T> expression_t;
7122 typedef exprtk::parser<T> parser_t;
7123
7124 symbol_table_t symbol_table;
7125
7126 T v[4] = {T(5), T(6), T(7), T(8)};
7127
7128 symbol_table.add_vector("v",v);
7129
7130 vararg_func<T> vaf;
7131 symbol_table.add_function("vararg_func",vaf);
7132
7133 expression_t expression;
7134 expression.register_symbol_table(symbol_table);
7135
7136 parser_t parser;
7137
7138 const std::string programs[] =
7139 {
7140 "equal(0,vararg_func())",
7141 "equal(1,vararg_func() + 1)",
7142 "equal(1,1 + vararg_func())",
7143 "equal(1,vararg_func + 1)",
7144 "equal(1,1 + vararg_func)",
7145 "equal(0,vararg_func() + vararg_func)",
7146 "equal(0,vararg_func + vararg_func())",
7147 "equal(1,vararg_func + vararg_func(1))",
7148 "equal(1,vararg_func + vararg_func(1,2))",
7149 "equal(2,vararg_func + vararg_func(v))",
7150 "equal(1,vararg_func() + vararg_func(1))",
7151 "equal(1,vararg_func() + vararg_func(1,2))",
7152 "equal(2,vararg_func() + vararg_func(v))",
7153 "equal(2,vararg_func(v))",
7154 "equal(1,vararg_func(1))",
7155 "equal(1,vararg_func(1,2,3))",
7156 "equal(1,vararg_func(5,6,7,8))",
7157 "equal(5,vararg_func(v) + 3)",
7158 "equal(5,vararg_func(1) + 4)",
7159 "equal(6,vararg_func(1,2,3) + 5)",
7160 "equal(7,vararg_func(5,6,7,8) + 6)"
7161 };
7162
7163 static const std::size_t programs_size = sizeof(programs) / sizeof(std::string);
7164
7165 for (std::size_t i = 0; i < programs_size; ++i)
7166 {
7167 if (!parser.compile(programs[i],expression))
7168 {
7169 printf("run_test18() - [6] Error: %s\tExpression: %s\n",
7170 parser.error().c_str(),
7171 programs[i].c_str());
7172
7173 error_found = true;
7174 }
7175 else if (T(1) != expression.value())
7176 {
7177 printf("run_test18() - Error in evaluation! (5) Expression: %s\n",
7178 programs[i].c_str());
7179
7180 error_found = true;
7181 }
7182 }
7183
7184 if (error_found)
7185 {
7186 return false;
7187 }
7188 }
7189
7190 {
7191 bool error_found = false;
7192
7193 typedef exprtk::symbol_table<T> symbol_table_t;
7194 typedef exprtk::expression<T> expression_t;
7195 typedef exprtk::parser<T> parser_t;
7196
7197 std::vector<T> v0;
7198 std::vector<T> v1;
7199 std::vector<T> v2;
7200 std::vector<T> v3;
7201
7202 #define pb(v,N) \
7203 v.push_back(T(N)); \
7204
7205 pb(v0,0) pb(v0,0) pb(v0,0) pb(v0,0) pb(v0,0) pb(v0, 0) pb(v0, 0)
7206 pb(v1,0) pb(v1,2) pb(v1,4) pb(v1,6) pb(v1,8) pb(v1,10) pb(v1,12)
7207 pb(v2,1) pb(v2,3) pb(v2,5) pb(v2,7) pb(v2,9) pb(v2,11) pb(v2,13)
7208 pb(v3,0) pb(v3,1) pb(v3,2) pb(v3,3) pb(v3,4) pb(v3, 5) pb(v3, 6)
7209 #undef pb
7210
7211 const std::string expr_string = "sum(v + 1)";
7212
7214
7215 symbol_table_t symbol_table;
7216 symbol_table.add_vector("v",v);
7217
7218 expression_t expression;
7219 expression.register_symbol_table(symbol_table);
7220
7221 parser_t parser;
7222
7223 if (!parser.compile(expr_string,expression))
7224 {
7225 printf("run_test18() - [7] Error: %s\tExpression: %s\n",
7226 parser.error().c_str(),
7227 expr_string.c_str());
7228
7229 error_found = true;
7230 }
7231
7232 T sum = { T(0) };
7233
7234 sum = expression.value();
7235
7236 if (not_equal(sum,T(7)))
7237 {
7238 printf("run_test18() - Error in evaluation! (6) Expression: %s\n",
7239 expr_string.c_str());
7240
7241 error_found = true;
7242 }
7243
7244 v.rebase(v1.data());
7245 sum = expression.value();
7246
7247 if (not_equal(sum,T(49)))
7248 {
7249 printf("run_test18() - Error in evaluation! (7) Expression: %s\n",
7250 expr_string.c_str());
7251 error_found = true;
7252 }
7253
7254 v.rebase(v2.data());
7255 sum = expression.value();
7256
7257 if (not_equal(sum,T(56)))
7258 {
7259 printf("run_test18() - Error in evaluation! (8) Expression: %s\n",
7260 expr_string.c_str());
7261 error_found = true;
7262 }
7263
7264 v.rebase(v3.data());
7265 sum = expression.value();
7266
7267 if (not_equal(sum,T(28)))
7268 {
7269 printf("run_test18() - Error in evaluation! (9) Expression: %s\n",
7270 expr_string.c_str());
7271 error_found = true;
7272 }
7273
7274 if (error_found)
7275 {
7276 return false;
7277 }
7278 }
7279
7280 {
7281 bool error_found = false;
7282
7283 typedef exprtk::symbol_table<T> symbol_table_t;
7284 typedef exprtk::expression<T> expression_t;
7285 typedef exprtk::parser<T> parser_t;
7286
7287 std::vector<T> v0;
7288 std::vector<T> s;
7289
7290 #define pb(v,N) \
7291 v.push_back(T(N)); \
7292
7293 pb(v0,0) pb(v0,1) pb(v0,2) pb(v0,3) pb(v0,4)
7294 pb(v0,5) pb(v0,6) pb(v0,7) pb(v0,8) pb(v0,9)
7295
7296 pb(s, 3) pb(s, 6) pb(s, 9) pb(s,12)
7297 pb(s,15) pb(s,18) pb(s,21)
7298 #undef pb
7299
7300 const std::string expr_string = "v[0] + v[1] + v[2]";
7301
7303
7304 symbol_table_t symbol_table;
7305 symbol_table.add_vector("v",v);
7306
7307 expression_t expression;
7308 expression.register_symbol_table(symbol_table);
7309
7310 parser_t parser;
7311
7312 if (!parser.compile(expr_string,expression))
7313 {
7314 printf("run_test18() - [8] Error: %s\tExpression: %s\n",
7315 parser.error().c_str(),
7316 expr_string.c_str());
7317
7318 error_found = true;
7319 }
7320
7321 for (std::size_t i = 0; i < v0.size() - 4; ++i)
7322 {
7323 v.rebase(v0.data() + i);
7324
7325 T sum = expression.value();
7326
7327 if (not_equal(sum,s[i]))
7328 {
7329 printf("run_test18() - Error in evaluation! (7) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7330 expr_string.c_str(),
7331 static_cast<double>(s[i]),
7332 static_cast<double>(sum));
7333
7334 error_found = true;
7335 }
7336
7337 }
7338
7339 if (error_found)
7340 {
7341 return false;
7342 }
7343 }
7344
7345 {
7346 bool error_found = false;
7347
7348 typedef exprtk::symbol_table<T> symbol_table_t;
7349 typedef exprtk::expression<T> expression_t;
7350 typedef exprtk::parser<T> parser_t;
7351
7352 std::vector<T> v0;
7353 std::vector<T> s;
7354
7355 #define pb(v,N) \
7356 v.push_back(T(N)); \
7357
7358 pb(v0,0) pb(v0,1) pb(v0,2) pb(v0,3) pb(v0,4)
7359 pb(v0,5) pb(v0,6) pb(v0,7) pb(v0,8) pb(v0,9)
7360
7361 pb(s, 3) pb(s, 6) pb(s, 9) pb(s,12)
7362 pb(s,15) pb(s,18) pb(s,21)
7363 #undef pb
7364
7365 const std::string expr_string = "var i := 0; var j := 1; var k := 2; v[i] + v[j] + v[k]";
7366
7368
7369 symbol_table_t symbol_table;
7370 symbol_table.add_vector("v",v);
7371
7372 expression_t expression;
7373 expression.register_symbol_table(symbol_table);
7374
7375 parser_t parser;
7376
7377 if (!parser.compile(expr_string,expression))
7378 {
7379 printf("run_test18() - [9] Error: %s\tExpression: %s\n",
7380 parser.error().c_str(),
7381 expr_string.c_str());
7382
7383 error_found = true;
7384 }
7385
7386 for (std::size_t i = 0; i < v0.size() - 4; ++i)
7387 {
7388 v.rebase(v0.data() + i);
7389
7390 T sum = expression.value();
7391
7392 if (not_equal(sum,s[i]))
7393 {
7394 printf("run_test18() - Error in evaluation! (8) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7395 expr_string.c_str(),
7396 static_cast<double>(s[i]),
7397 static_cast<double>(sum));
7398
7399 error_found = true;
7400 }
7401
7402 }
7403
7404 if (error_found)
7405 {
7406 return false;
7407 }
7408 }
7409
7410 {
7411 typedef exprtk::symbol_table<T> symbol_table_t;
7412 typedef exprtk::expression<T> expression_t;
7413 typedef exprtk::parser<T> parser_t;
7414
7415 const std::string const_folded_expression_list[] =
7416 {
7417 "(0 * dot(2 * v0,v1 - 1))",
7418 "(0 * dot(2 * v0,v1 - 1)) + (dot(2 * v0,v1 - 1) * 0)",
7419 "(0 * dot(v0 - v1,v1 / v0))",
7420 "(0 * dot(v0 - v1,v1 / v0)) + (dot(v0 - v1,v1 / v0) * 0)",
7421 "(0 * dot(v0,v1))",
7422 "(0 * dot(v0,v1)) + (dot(v0,v1) * 0)",
7423 "(0 / dot(2 * v0,v1 - 1))",
7424 "(0 / dot(2 * v0,v1 - 1)) + (dot(2 * v0,v1 - 1) * 0)",
7425 "(0 / dot(v0 - v1,v1 / v0))",
7426 "(0 / dot(v0 - v1,v1 / v0)) + (dot(v0 - v1,v1 / v0) * 0)",
7427 "(0 / dot(v0,v1))",
7428 "(0 / dot(v0,v1)) + (dot(v0,v1) * 0)",
7429 "(dot(2 * v0,v1 - 1) * 0)",
7430 "(dot(2 * v0,v1 - 1) * 0) + (0 * dot(2 * v0,v1 - 1))",
7431 "(dot(2 * v0,v1 - 1) * 0) + (0 / dot(2 * v0,v1 - 1))",
7432 "(dot(v0 - v1,v1 / v0) * 0)",
7433 "(dot(v0 - v1,v1 / v0) * 0) + (0 * dot(v0 - v1,v1 / v0))",
7434 "(dot(v0 - v1,v1 / v0) * 0) + (0 / dot(v0 - v1,v1 / v0))",
7435 "(dot(v0,v1) * 0)",
7436 "(dot(v0,v1) * 0) + (0 * dot(v0,v1))",
7437 "(dot(v0,v1) * 0) + (0 / dot(v0,v1))"
7438 };
7439
7440 const std::size_t const_folded_expression_list_size = sizeof(const_folded_expression_list) / sizeof(std::string);
7441
7442 const std::size_t vector_size = 5;
7443 T v0[vector_size] = { 0, 2, 4, 6, 8 };
7444 T v1[vector_size] = { 1, 3, 5, 7, 9 };
7445
7446 exprtk::vector_view<T> vv0 = exprtk::make_vector_view(v0, vector_size);
7447 exprtk::vector_view<T> vv1 = exprtk::make_vector_view(v1, vector_size);
7448
7449 exprtk::rtl::vecops::package<T> vector_package;
7450 exprtk::rtl::io::package<T> io_package;
7451
7452 symbol_table_t symbol_table;
7453
7454 symbol_table.add_package( vector_package );
7455 symbol_table.add_package( io_package );
7456 symbol_table.add_vector ( "v0" , vv0 );
7457 symbol_table.add_vector ( "v1" , vv1 );
7458
7459 expression_t expression;
7460 expression.register_symbol_table(symbol_table);
7461
7462 parser_t parser;
7463
7464 for (std::size_t i = 0; i < const_folded_expression_list_size; ++i)
7465 {
7466 const std::string& expression_string = const_folded_expression_list[i];
7467
7468 if (!parser.compile(expression_string, expression))
7469 {
7470 printf("run_test18() - [10] Error: %s Expression: %s\n",
7471 parser.error().c_str(),
7472 expression_string.c_str());
7473
7474 return false;
7475 }
7476
7478 {
7479 printf("run_test18() - Error: Expression did not compile to a constant! [1] Expression: %s\n",
7480 expression_string.c_str());
7481
7482 return false;
7483 }
7484
7485 for (std::size_t j = 0; j < 100; ++j)
7486 {
7487 if ((j % 2) == 0)
7488 {
7489 vv0.rebase(v0);
7490 vv1.rebase(v1);
7491 }
7492 else
7493 {
7494 vv0.rebase(v1);
7495 vv1.rebase(v0);
7496 }
7497
7498 const T result = expression.value();
7499
7500 if (result != T(0))
7501 {
7502 printf("run_test18() - Error: Expected result of zero, result: %8.4f for Expression: %s\n",
7503 static_cast<double>(result),
7504 expression_string.c_str());
7505
7506 return false;
7507 }
7508 }
7509
7510 expression.release();
7511 }
7512 }
7513
7514 {
7515 typedef exprtk::symbol_table<T> symbol_table_t;
7516 typedef exprtk::expression<T> expression_t;
7517 typedef exprtk::parser<T> parser_t;
7518
7519 const std::string rebase_expression_list[] =
7520 {
7521 "dot(v0,v1)",
7522 "dot(2 * v0,v1 - 1) + dot(2 * v0,v1 - 1)",
7523 "dot(2 * v0,v1 - 1)",
7524 "dot(v0 - v1,v1 / v0) + dot(v0 - v1,v1 / v0)",
7525 "dot(v0 - v1,v1 / v0)",
7526 "dot(v0,v1) + dot(v0,v1)",
7527 "dot(v0,v1) + x",
7528 "dot(2 * v0,v1 - 1) * x + dot(2 * v0,v1 - 1) * y",
7529 "x / dot(2 * v0,v1 - 1)",
7530 "x / dot(v0 - v1,v1 / v0) + dot(v0 - v1,v1 / v0) / y",
7531 "x * dot(v0 - v1,v1 / v0) / y",
7532 "x - dot(v0,v1) + dot(v0,v1) + y",
7533 };
7534
7535 const std::size_t rebase_expression_list_size = sizeof(rebase_expression_list) / sizeof(std::string);
7536
7537 T x = T(1.234);
7538 T y = T(5.678);
7539
7540 const std::size_t vector_size = 5;
7541 T v0[vector_size] = { 0, 2, 4, 6, 8 };
7542 T v1[vector_size] = { 1, 3, 5, 7, 9 };
7543
7544 exprtk::vector_view<T> vv0 = exprtk::make_vector_view(v0, vector_size);
7545 exprtk::vector_view<T> vv1 = exprtk::make_vector_view(v1, vector_size);
7546
7547 exprtk::rtl::vecops::package<T> vector_package;
7548 exprtk::rtl::io::package<T> io_package;
7549
7550 symbol_table_t symbol_table;
7551
7552 symbol_table.add_package ( vector_package );
7553 symbol_table.add_package ( io_package );
7554 symbol_table.add_variable( "x" , x );
7555 symbol_table.add_variable( "y" , y );
7556 symbol_table.add_vector ( "v0" , vv0 );
7557 symbol_table.add_vector ( "v1" , vv1 );
7558
7559 expression_t expression;
7560 expression.register_symbol_table(symbol_table);
7561
7562 parser_t parser;
7563
7564 for (std::size_t i = 0; i < rebase_expression_list_size; ++i)
7565 {
7566 const std::string& expression_string = rebase_expression_list[i];
7567
7568 if (!parser.compile(expression_string, expression))
7569 {
7570 printf("run_test18() - [11] Error: %s Expression: %s\n",
7571 parser.error().c_str(),
7572 expression_string.c_str());
7573
7574 return false;
7575 }
7576
7577 for (std::size_t j = 0; j < 100; ++j)
7578 {
7579 if ((j % 2) == 0)
7580 {
7581 vv0.rebase(v0);
7582 vv1.rebase(v1);
7583 }
7584 else
7585 {
7586 vv0.rebase(v1);
7587 vv1.rebase(v0);
7588 }
7589
7590 expression.value();
7591 }
7592
7593 expression.release();
7594 }
7595 }
7596
7597 {
7598 bool error_found = false;
7599
7600 typedef exprtk::symbol_table<T> symbol_table_t;
7601 typedef exprtk::expression<T> expression_t;
7602 typedef exprtk::parser<T> parser_t;
7603
7604 std::vector<T> v0;
7605 std::vector<T> s;
7606
7607 #define pb(v,N) \
7608 v.push_back(T(N)); \
7609
7610 pb(v0,0) pb(v0,1) pb(v0,2) pb(v0,3) pb(v0,4)
7611 pb(v0,5) pb(v0,6) pb(v0,7) pb(v0,8) pb(v0,9)
7612
7613 pb(s, 3) pb(s, 6) pb(s, 9) pb(s,12)
7614 pb(s,15) pb(s,18) pb(s,21)
7615 #undef pb
7616
7617 const std::string expr_string = "var i := 0; v[i + 0] + v[i + 1] + v[i + 2]";
7618
7620
7621 symbol_table_t symbol_table;
7622 symbol_table.add_vector("v",v);
7623
7624 expression_t expression;
7625 expression.register_symbol_table(symbol_table);
7626
7627 parser_t parser;
7628
7629 if (!parser.compile(expr_string,expression))
7630 {
7631 printf("run_test18() - [12] Error: %s\tExpression: %s\n",
7632 parser.error().c_str(),
7633 expr_string.c_str());
7634
7635 error_found = true;
7636 }
7637
7638 for (std::size_t i = 0; i < v0.size() - 4; ++i)
7639 {
7640 v.rebase(v0.data() + i);
7641
7642 const T sum = expression.value();
7643
7644 if (not_equal(sum,s[i]))
7645 {
7646 printf("run_test18() - Error in evaluation! (9) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7647 expr_string.c_str(),
7648 static_cast<double>(s[i]),
7649 static_cast<double>(sum));
7650
7651 error_found = true;
7652 }
7653
7654 }
7655
7656 if (error_found)
7657 {
7658 return false;
7659 }
7660 }
7661
7662 {
7663 typedef exprtk::symbol_table<T> symbol_table_t;
7664 typedef exprtk::expression<T> expression_t;
7665 typedef exprtk::parser<T> parser_t;
7666
7667 T v0[] = { T(0), T(1), T(2), T(3), T(4) };
7668 T v1[] = { T(5), T(6), T(7), T(8), T(9) };
7669
7670 const std::size_t v0_size = sizeof(v0) / sizeof (T);
7671 const std::size_t v1_size = sizeof(v1) / sizeof (T);
7672
7674
7675 vecrebase_func<T> vec_sum;
7676
7677 symbol_table_t symbol_table;
7678 symbol_table.add_vector("v",v);
7679 symbol_table.add_function("vec_sum",vec_sum);
7680
7681 expression_t expression;
7682 expression.register_symbol_table(symbol_table);
7683
7684 parser_t parser;
7685
7686 const std::string expr_string = "vec_sum(v)";
7687
7688 if (!parser.compile(expr_string,expression))
7689 {
7690 printf("run_test18() - [13] Error: %s\tExpression: %s\n",
7691 parser.error().c_str(),
7692 expr_string.c_str());
7693
7694 return false;
7695 }
7696
7697 const T expected_result0 = std::accumulate(v0, v0 + v0_size, T(0));
7698
7699 if (expression.value() != expected_result0)
7700 {
7701 printf("run_test18() - Error in evaluation! (10.1) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7702 expr_string.c_str(),
7703 static_cast<double>(expected_result0),
7704 static_cast<double>(expression.value()));
7705
7706 return false;
7707 }
7708
7709 v.rebase(v1);
7710
7711 const T expected_result1 = std::accumulate(v1, v1 + v1_size, T(0));
7712
7713 if (expression.value() != expected_result1)
7714 {
7715 printf("run_test18() - Error in evaluation! (10.2) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7716 expr_string.c_str(),
7717 static_cast<double>(expected_result1),
7718 static_cast<double>(expression.value()));
7719
7720 return false;
7721 }
7722 }
7723
7724 {
7725 bool error_found = false;
7726
7727 typedef exprtk::symbol_table<T> symbol_table_t;
7728 typedef exprtk::expression<T> expression_t;
7729 typedef exprtk::parser<T> parser_t;
7730
7732
7733 symbol_table_t symbol_table;
7734 symbol_table.add_package(vecops_pkg);
7735
7736 const std::string expr_str_list[] =
7737 {
7738 "var v[9] := {1,2,3,4,5,6,7,8,9}; all_true(v) == true" ,
7739 "var v[6] := {-1,-2,-3,-4,-5,-6}; all_true(v) == true" ,
7740 "var v[8] := {1,2,3,0,0,0,0,0}; all_true(v) == false",
7741 "var v[8] := {-1,-2,-3,0,0,0,0,0}; all_true(v) == false",
7742 "var v[9] := {0,0,0,0,0,0,0,0,0}; all_true(v + 1) == true",
7743
7744 "var v[9] := {0,0,0,0,0,0,0,0,0}; all_false(v) == true" ,
7745 "var v[9] := {0,0,0,0,0,1,2,3,4}; all_false(v) == false" ,
7746 "var v[8] := {0,0,0,0,0,-1,-2,-3}; all_false(v) == false" ,
7747 "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v - 1) == true",
7748
7749 "var v[9] := {0,0,0,0,0,0,0,0,1}; any_true(v) == true" ,
7750 "var v[9] := {0,0,0,0,1,0,0,0,0}; any_true(v) == true" ,
7751 "var v[9] := {0,0,0,0,0,0,0,0,0}; any_true(v) == false" ,
7752 "var v[9] := {0,0,0,0,0,0,0,0,0}; any_true(v + 1) == true",
7753
7754 "var v[9] := {1,1,1,1,1,1,1,1,0}; any_false(v) == true" ,
7755 "var v[9] := {1,1,1,1,0,1,1,1,1}; any_false(v) == true" ,
7756 "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v) == false" ,
7757 "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v - 1) == true",
7758
7759 "var v[9] := {0,0,0,0,0,0,0,0,0}; count(v) == 0" ,
7760 "var v[9] := {0,0,0,0,0,0,0,0,1}; count(v) == 1" ,
7761 "var v[9] := {0,0,0,0,0,0,0,2,1}; count(v) == 2" ,
7762 "var v[9] := {0,0,0,0,0,0,3,2,1}; count(v) == 3" ,
7763 "var v[9] := {0,0,0,0,0,0,0,0,0}; count(v + 1) == v[]",
7764 "var v[9] := {1,1,1,1,1,1,1,1,1}; count(v - 1) == 0",
7765
7766 "var v[9] := {1,2,3,4,5,6,7,8,9}; var r[9] := [0]; copy(v,r); sum(v == r) == v[]",
7767 "var v[9] := {1,2,3,4,5,6,7,8,9}; var r[9] := [0]; copy(v,0,8,r,0,8); sum(r) == 45",
7768 "var v[9] := {1,2,3,4,5,6,7,8,9}; var r[9] := [0]; copy(v,1,7,r,1,7); sum(r) == 35",
7769 "var v[9] := {1,2,3,4,5,6,7,8,9}; var r[5] := [0]; copy(v,0,4,r,0,4); sum(r) == 15",
7770
7771 "var v[5] := {1,2,3,4,5}; var r[5] := {4,5,1,2,3}; rol(v,3); sum(v == r) == v[]",
7772 "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,1,2}; ror(v,3); sum(v == r) == v[]",
7773
7774 "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,1,2}; rol(v,2); sum(v == r) == v[]",
7775 "var v[5] := {1,2,3,4,5}; var r[5] := {4,5,1,2,3}; ror(v,2); sum(v == r) == v[]",
7776
7777 "var v[5] := {1,2,3,4,5}; var r[5] := {1,3,4,2,5}; rol(v,1,1,3); sum(v == r) == v[]",
7778 "var v[5] := {1,2,3,4,5}; var r[5] := {1,4,2,3,5}; ror(v,1,1,3); sum(v == r) == v[]",
7779
7780 "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,0,0}; shftl(v,2); sum(v == r) == v[]",
7781 "var v[5] := {1,2,3,4,5}; var r[5] := {5,0,0,0,0}; shftl(v,4); sum(v == r) == v[]",
7782 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,0}; shftl(v,5); sum(v == r) == v[]",
7783
7784 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,1,2,3}; shftr(v,2); sum(v == r) == v[]",
7785 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,1}; shftr(v,4); sum(v == r) == v[]",
7786 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,0}; shftr(v,5); sum(v == r) == v[]",
7787
7788 "var v[5] := {1,2,3,4,5}; var r[5] := {1,3,4,0,5}; shftl(v,1,1,3); sum(v == r) == v[]",
7789 "var v[5] := {1,2,3,4,5}; var r[5] := {1,0,2,3,5}; shftr(v,1,1,3); sum(v == r) == v[]",
7790
7791 "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
7792 "var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
7793 "var v[5] := {1,4,2,3,5}; var r[5] := {1,2,3,4,5}; sort(v,1,3); sum(v == r) == v[]",
7794 "var v[5] := {5,4,2,3,1}; var r[5] := {5,2,3,4,1}; sort(v,1,3); sum(v == r) == v[]",
7795 "var v[5] := {3,1,2,4,5}; var r[5] := {1,2,3,4,5}; sort(v,0,2); sum(v == r) == v[]",
7796 "var v[5] := {1,2,5,3,4}; var r[5] := {1,2,3,4,5}; sort(v,2,4); sum(v == r) == v[]",
7797
7798 "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
7799 "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v,'aScEnDiNg'); sum(v == r) == v[]",
7800 "var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
7801 "var v[5] := {1,4,2,3,5}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',1,3); sum(v == r) == v[]",
7802 "var v[5] := {3,1,2,4,5}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',0,2); sum(v == r) == v[]",
7803 "var v[5] := {1,2,5,3,4}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',2,4); sum(v == r) == v[]",
7804
7805 "var v[5] := {1,3,5,2,4}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
7806 "var v[5] := {1,3,5,2,4}; var r[5] := {5,4,3,2,1}; sort(v,'DeScEnDiNg'); sum(v == r) == v[]",
7807 "var v[5] := {5,4,3,2,1}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
7808 "var v[5] := {1,4,2,3,5}; var r[5] := {1,4,3,2,5}; sort(v,'descending',1,3); sum(v == r) == v[]",
7809 "var v[5] := {3,1,2,4,5}; var r[5] := {3,2,1,4,5}; sort(v,'descending',0,2); sum(v == r) == v[]",
7810 "var v[5] := {1,2,5,3,4}; var r[5] := {1,2,5,4,3}; sort(v,'descending',2,4); sum(v == r) == v[]",
7811
7812 "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 2)); v[v[] / 2] == 5",
7813 "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 3)); v[v[] / 3] == 4",
7814
7815 "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 2)); sort(v,0,trunc(v[] / 2)); (v[v[] / 2] == 5) and (v[0] == 1)",
7816 "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 3)); sort(v,0,trunc(v[] / 3)); (v[v[] / 3] == 4) and (v[0] == 1)",
7817
7818 "var v[5]; iota(v, 0,1); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7819 "var v[5]; iota(v, 0,2); var r[5] := { 0, 2, 4, 6, 8}; sum(v == r) == v[]",
7820 "var v[5]; iota(v, 1,1); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7821 "var v[5]; iota(v, 1,2); var r[5] := { 1, 3, 5, 7, 9}; sum(v == r) == v[]",
7822 "var v[5]; iota(v,-1,1); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7823 "var v[5]; iota(v,-1,2); var r[5] := {-1, 1, 3, 5, 7}; sum(v == r) == v[]",
7824 "var v[5]; iota(v,-2,1); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7825 "var v[5]; iota(v,-2,2); var r[5] := {-2, 0, 2, 4, 6}; sum(v == r) == v[]",
7826 "var v[5]; iota(v, 0); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7827 "var v[5]; iota(v, 1); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7828 "var v[5]; iota(v,-1); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7829 "var v[5]; iota(v,-2); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7830 "var v[5]; iota(v, 0, 0); var r[5] := { 0, 0, 0, 0, 0}; sum(v == r) == v[]",
7831 "var v[5]; iota(v, 1, 0); var r[5] := { 1, 1, 1, 1, 1}; sum(v == r) == v[]",
7832
7833 "var v[5]; iota(v, 0, v[] - 1, 0,1); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7834 "var v[5]; iota(v, 0, v[] - 1, 0,2); var r[5] := { 0, 2, 4, 6, 8}; sum(v == r) == v[]",
7835 "var v[5]; iota(v, 0, v[] - 1, 1,1); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7836 "var v[5]; iota(v, 0, v[] - 1, 1,2); var r[5] := { 1, 3, 5, 7, 9}; sum(v == r) == v[]",
7837 "var v[5]; iota(v, 0, v[] - 1,-1,1); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7838 "var v[5]; iota(v, 0, v[] - 1,-1,2); var r[5] := {-1, 1, 3, 5, 7}; sum(v == r) == v[]",
7839 "var v[5]; iota(v, 0, v[] - 1,-2,1); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7840 "var v[5]; iota(v, 0, v[] - 1,-2,2); var r[5] := {-2, 0, 2, 4, 6}; sum(v == r) == v[]",
7841 "var v[5]; iota(v, 0, v[] - 1, 0 ); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7842 "var v[5]; iota(v, 0, v[] - 1, 1 ); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7843 "var v[5]; iota(v, 0, v[] - 1,-1 ); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7844 "var v[5]; iota(v, 0, v[] - 1,-2 ); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7845 "var v[5]; iota(v, 0, v[] - 1, 0,0); var r[5] := { 0, 0, 0, 0, 0}; sum(v == r) == v[]",
7846 "var v[5]; iota(v, 0, v[] - 1, 1,0); var r[5] := { 1, 1, 1, 1, 1}; sum(v == r) == v[]",
7847
7848 "var v[5]; iota(v, 1, v[] - 1, 0,1); var r[5] := { 0, 0, 1, 2, 3 }; sum(v == r) == v[]",
7849 "var v[5]; iota(v, 1, v[] - 1, 0,2); var r[5] := { 0, 0, 2, 4, 6 }; sum(v == r) == v[]",
7850 "var v[5]; iota(v, 1, v[] - 1, 1,1); var r[5] := { 0, 1, 2, 3, 4 }; sum(v == r) == v[]",
7851 "var v[5]; iota(v, 1, v[] - 1, 1,2); var r[5] := { 0, 1, 3, 5, 7 }; sum(v == r) == v[]",
7852 "var v[5]; iota(v, 1, v[] - 1,-1,1); var r[5] := { 0, -1, 0, 1, 2 }; sum(v == r) == v[]",
7853 "var v[5]; iota(v, 1, v[] - 1,-1,2); var r[5] := { 0, -1, 1, 3, 5 }; sum(v == r) == v[]",
7854 "var v[5]; iota(v, 1, v[] - 1,-2,1); var r[5] := { 0, -2,-1, 0, 1 }; sum(v == r) == v[]",
7855 "var v[5]; iota(v, 1, v[] - 1,-2,2); var r[5] := { 0, -2, 0, 2, 4 }; sum(v == r) == v[]",
7856 "var v[5]; iota(v, 1, v[] - 1, 0 ); var r[5] := { 0, 0, 1, 2, 3 }; sum(v == r) == v[]",
7857 "var v[5]; iota(v, 1, v[] - 1, 1 ); var r[5] := { 0, 1, 2, 3, 4 }; sum(v == r) == v[]",
7858 "var v[5]; iota(v, 1, v[] - 1,-1 ); var r[5] := { 0, -1, 0, 1, 2 }; sum(v == r) == v[]",
7859 "var v[5]; iota(v, 1, v[] - 1,-2 ); var r[5] := { 0, -2,-1, 0, 1 }; sum(v == r) == v[]",
7860
7861 "var v[5]; iota(v, 1, v[] - 2, 0,1); var r[5] := { 0, 0, 1, 2, 0 }; sum(v == r) == v[]",
7862 "var v[5]; iota(v, 1, v[] - 2, 0,2); var r[5] := { 0, 0, 2, 4, 0 }; sum(v == r) == v[]",
7863 "var v[5]; iota(v, 1, v[] - 2, 1,1); var r[5] := { 0, 1, 2, 3, 0 }; sum(v == r) == v[]",
7864 "var v[5]; iota(v, 1, v[] - 2, 1,2); var r[5] := { 0, 1, 3, 5, 0 }; sum(v == r) == v[]",
7865 "var v[5]; iota(v, 1, v[] - 2,-1,1); var r[5] := { 0, -1, 0, 1, 0 }; sum(v == r) == v[]",
7866 "var v[5]; iota(v, 1, v[] - 2,-1,2); var r[5] := { 0, -1, 1, 3, 0 }; sum(v == r) == v[]",
7867 "var v[5]; iota(v, 1, v[] - 2,-2,1); var r[5] := { 0, -2,-1, 0, 0 }; sum(v == r) == v[]",
7868 "var v[5]; iota(v, 1, v[] - 2,-2,2); var r[5] := { 0, -2, 0, 2, 0 }; sum(v == r) == v[]",
7869 "var v[5]; iota(v, 1, v[] - 2, 0 ); var r[5] := { 0, 0, 1, 2, 0 }; sum(v == r) == v[]",
7870 "var v[5]; iota(v, 1, v[] - 2, 1 ); var r[5] := { 0, 1, 2, 3, 0 }; sum(v == r) == v[]",
7871 "var v[5]; iota(v, 1, v[] - 2,-1 ); var r[5] := { 0, -1, 0, 1, 0 }; sum(v == r) == v[]",
7872 "var v[5]; iota(v, 1, v[] - 2,-2 ); var r[5] := { 0, -2,-1, 0, 0 }; sum(v == r) == v[]",
7873
7874 "var v[5]; iota(v, 0, v[] - 2, 0,1); var r[5] := { 0, 1, 2, 3, 0}; sum(v == r) == v[]",
7875 "var v[5]; iota(v, 0, v[] - 2, 0,2); var r[5] := { 0, 2, 4, 6, 0}; sum(v == r) == v[]",
7876 "var v[5]; iota(v, 0, v[] - 2, 1,1); var r[5] := { 1, 2, 3, 4, 0}; sum(v == r) == v[]",
7877 "var v[5]; iota(v, 0, v[] - 2, 1,2); var r[5] := { 1, 3, 5, 7, 0}; sum(v == r) == v[]",
7878 "var v[5]; iota(v, 0, v[] - 2,-1,1); var r[5] := {-1, 0, 1, 2, 0}; sum(v == r) == v[]",
7879 "var v[5]; iota(v, 0, v[] - 2,-1,2); var r[5] := {-1, 1, 3, 5, 0}; sum(v == r) == v[]",
7880 "var v[5]; iota(v, 0, v[] - 2,-2,1); var r[5] := {-2,-1, 0, 1, 0}; sum(v == r) == v[]",
7881 "var v[5]; iota(v, 0, v[] - 2,-2,2); var r[5] := {-2, 0, 2, 4, 0}; sum(v == r) == v[]",
7882 "var v[5]; iota(v, 0, v[] - 2, 0 ); var r[5] := { 0, 1, 2, 3, 0}; sum(v == r) == v[]",
7883 "var v[5]; iota(v, 0, v[] - 2, 1 ); var r[5] := { 1, 2, 3, 4, 0}; sum(v == r) == v[]",
7884 "var v[5]; iota(v, 0, v[] - 2,-1 ); var r[5] := {-1, 0, 1, 2, 0}; sum(v == r) == v[]",
7885 "var v[5]; iota(v, 0, v[] - 2,-2 ); var r[5] := {-2,-1, 0, 1, 0}; sum(v == r) == v[]",
7886
7887 "var v[5]; iota(v, 0, -1); var r[5] := { 0, -1, -2, -3, -4}; sum(v == r) == v[]",
7888 "var v[5]; iota(v, 0, -2); var r[5] := { 0, -2, -4, -6, -8}; sum(v == r) == v[]",
7889 "var v[5]; iota(v, -1, -2); var r[5] := { -1, -3, -5, -7, -9}; sum(v == r) == v[]",
7890
7891 "var v[5]; iota(v, 0, v[] -1, 0, -1); var r[5] := { 0, -1, -2, -3, -4}; sum(v == r) == v[]",
7892 "var v[5]; iota(v, 0, v[] -1, 0, -2); var r[5] := { 0, -2, -4, -6, -8}; sum(v == r) == v[]",
7893 "var v[5]; iota(v, 0, v[] -1, -1, -2); var r[5] := { -1, -3, -5, -7, -9}; sum(v == r) == v[]",
7894
7895 "var v[5]; iota(v, 0,1); threshold_below(v,2, 0) var r[5] := { 0, 0, 2, 3, 4}; sum(v == r) == v[]",
7896 "var v[5]; iota(v, 0,1); threshold_above(v,2, 0) var r[5] := { 0, 1, 2, 0, 0}; sum(v == r) == v[]",
7897
7898 "var v[5]; iota(v, 0,1); threshold_below(v,0,v[] - 1,2, 0) var r[5] := { 0, 0, 2, 3, 4}; sum(v == r) == v[]",
7899 "var v[5]; iota(v, 0,1); threshold_above(v,0,v[] - 1,2, 0) var r[5] := { 0, 1, 2, 0, 0}; sum(v == r) == v[]",
7900
7901 "var v[5]; iota(v, 1,1); threshold_below(v,1,v[] - 1,2, 0) var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7902 "var v[5]; iota(v, 1,1); threshold_above(v,1,v[] - 1,2, 0) var r[5] := { 1, 2, 0, 0, 0}; sum(v == r) == v[]",
7903
7904 "var v[5]; iota(v, 0,1); threshold_below(v,0,v[] - 2,2, 0) var r[5] := { 0, 0, 2, 3, 4}; sum(v == r) == v[]",
7905 "var v[5]; iota(v, 0,1); threshold_above(v,0,v[] - 2,2, 0) var r[5] := { 0, 1, 2, 0, 4}; sum(v == r) == v[]",
7906
7907 " var a := 2; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var r[3] := [0]; r := a * x + y; axpy(a,x,y); sum(y == r) == y[]",
7908 " var a := 2; var b := 3; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var r[3] := [0]; r := a * x + b * y; axpby(a,x,b,y); sum(y == r) == y[]",
7909
7910 " var a := 2; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a * x + y; axpyz(a,x,y,z); sum(z == r) == z[]",
7911 " var a := 2; var b := 3; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a * x + b * y; axpbyz(a,x,b,y,z); sum(z == r) == z[]",
7912 " var a := 2; var b := 3; var x[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a * x + b; axpbz(a,x,b,z); sum(z == r) == z[]",
7913 };
7914
7915 const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
7916
7917 parser_t parser;
7918
7919 for (std::size_t i = 0; i < expr_str_list_size; ++i)
7920 {
7921 expression_t expression;
7922 expression.register_symbol_table(symbol_table);
7923
7924 if (!parser.compile(expr_str_list[i], expression))
7925 {
7926 printf("run_test18() - [14] Error: %s Expression: %s\n",
7927 parser.error().c_str(),
7928 expr_str_list[i].c_str());
7929
7930 error_found = true;
7931
7932 continue;
7933 }
7934
7935 const T result = expression.value();
7936
7937 if (result != T(1))
7938 {
7939 printf("run_test18() - Error in evaluation! (11) Expression: %s\n",
7940 expr_str_list[i].c_str());
7941
7942 error_found = true;
7943 }
7944 }
7945
7946 if (error_found)
7947 {
7948 return false;
7949 }
7950 }
7951
7952 {
7953 typedef exprtk::expression<T> expression_t;
7954
7955 std::string a = "a";
7956 std::string b = "b";
7957 std::string c = "c";
7958 std::string d = "d";
7959
7960 T x = T(1.1);
7961 T y = T(2.2);
7962 T z = T(3.3);
7963 T w = T(4.4);
7964
7965 overload_func<T> ovrld_func
7966 (
7967 "T:T|T:TT|T:TTT|T:TTTT|"
7968 "T:S|T:SS|T:SSS|T:SSSS|"
7969 "T:ST|T:STS|T:STST|"
7970 "T:TS|T:TST|T:TSTS|"
7971 "T:TTSS|T:SSTT|T:STTS|T:TSST"
7972 );
7973
7974 exprtk::symbol_table<T> symbol_table;
7975
7976 symbol_table.add_constants();
7977 symbol_table.add_variable ("x",x);
7978 symbol_table.add_variable ("y",y);
7979 symbol_table.add_variable ("z",z);
7980 symbol_table.add_variable ("w",w);
7981
7982 symbol_table.add_stringvar("a",a);
7983 symbol_table.add_stringvar("b",b);
7984 symbol_table.add_stringvar("c",c);
7985 symbol_table.add_stringvar("d",d);
7986
7987 symbol_table.add_function("foo",ovrld_func);
7988
7989 typedef typename overload_func<T>::test_result_t test_result_t;
7990 typedef std::pair<std::string, typename overload_func<T>::test_result_t> test_pack_t;
7991
7992 static const test_pack_t test_pack_list[] =
7993 {
7994 test_pack_t("foo(x)" , test_result_t( 0, "T" )),
7995 test_pack_t("foo(x, y)" , test_result_t( 1, "TT" )),
7996 test_pack_t("foo(x, y, z)" , test_result_t( 2, "TTT" )),
7997 test_pack_t("foo(x, y, z, w)" , test_result_t( 3, "TTTT")),
7998 test_pack_t("foo(x + y)" , test_result_t( 0, "T" )),
7999 test_pack_t("foo(x + y, y + z)" , test_result_t( 1, "TT" )),
8000 test_pack_t("foo(x + y, y + z, z + w)" , test_result_t( 2, "TTT" )),
8001 test_pack_t("foo(x + y, y + z, z + w, w)" , test_result_t( 3, "TTTT")),
8002 test_pack_t("foo(a)" , test_result_t( 4, "S" )),
8003 test_pack_t("foo(a, b)" , test_result_t( 5, "SS" )),
8004 test_pack_t("foo(a, b, c)" , test_result_t( 6, "SSS" )),
8005 test_pack_t("foo(a, b, c, d)" , test_result_t( 7, "SSSS")),
8006 test_pack_t("foo(a + b)" , test_result_t( 4, "S" )),
8007 test_pack_t("foo(a + b, b + c)" , test_result_t( 5, "SS" )),
8008 test_pack_t("foo(a + b, b + c, c + d)" , test_result_t( 6, "SSS" )),
8009 test_pack_t("foo(a + b, b + c, c + d, d)" , test_result_t( 7, "SSSS")),
8010 test_pack_t("foo(a, x)" , test_result_t( 8, "ST" )),
8011 test_pack_t("foo(a, x, b)" , test_result_t( 9, "STS" )),
8012 test_pack_t("foo(a, x, b, y)" , test_result_t(10, "STST")),
8013 test_pack_t("foo(a + b, x + y)" , test_result_t( 8, "ST" )),
8014 test_pack_t("foo(a + b, x + y, b + c)" , test_result_t( 9, "STS" )),
8015 test_pack_t("foo(a + b, x + y, b + c, y + z)" , test_result_t(10, "STST")),
8016 test_pack_t("foo(x, a)" , test_result_t(11, "TS" )),
8017 test_pack_t("foo(x, a, y)" , test_result_t(12, "TST" )),
8018 test_pack_t("foo(x, a, y, b)" , test_result_t(13, "TSTS")),
8019 test_pack_t("foo(x + y, a + b)" , test_result_t(11, "TS" )),
8020 test_pack_t("foo(x + y, a + b, y + z)" , test_result_t(12, "TST" )),
8021 test_pack_t("foo(x + y, a + b, y + z, b + c)" , test_result_t(13, "TSTS")),
8022 test_pack_t("foo(x, y, a, b)" , test_result_t(14, "TTSS")),
8023 test_pack_t("foo(a, b, x, y)" , test_result_t(15, "SSTT")),
8024 test_pack_t("foo(a, x, y, b)" , test_result_t(16, "STTS")),
8025 test_pack_t("foo(x, a, b, y)" , test_result_t(17, "TSST")),
8026 test_pack_t("foo(x + y, y + z, a + b, b + c)" , test_result_t(14, "TTSS")),
8027 test_pack_t("foo(a + b, b + c, x + y, y + z)" , test_result_t(15, "SSTT")),
8028 test_pack_t("foo(a + b, x + y, y + z, b + c)" , test_result_t(16, "STTS")),
8029 test_pack_t("foo(x + y, a + b, b + c, y + z)" , test_result_t(17, "TSST"))
8030 };
8031
8032 static const std::size_t test_pack_list_size = sizeof(test_pack_list) / sizeof(test_pack_t);
8033
8034 std::deque<expression_t> expression_list;
8035
8036 for (std::size_t i = 0; i < test_pack_list_size; ++i)
8037 {
8038 expression_t expression;
8039 expression.register_symbol_table(symbol_table);
8040
8041 exprtk::parser<T> parser;
8042
8043 if (!parser.compile(test_pack_list[i].first, expression))
8044 {
8045 printf("run_test18() - [15] Overload VarArg Error: %s Expression: %s\n",
8046 parser.error().c_str(),
8047 test_pack_list[i].first.c_str());
8048
8049 return false;
8050 }
8051 else
8052 expression_list.push_back(expression);
8053 }
8054
8055 bool error_found = false;
8056
8057 for (std::size_t i = 0; i < expression_list.size(); ++i)
8058 {
8059 ovrld_func.clear();
8060
8061 if (T(1) != expression_list[i].value())
8062 {
8063 printf("run_test18() - Error in evaluation! (12) Expression: %s\n",
8064 test_pack_list[i].first.c_str());
8065
8066 error_found = true;
8067 }
8068
8069 if (ovrld_func.current_ps_index != test_pack_list[i].second.ps_index)
8070 {
8071 printf("run_test18() - Error with ps_index (12) Expression: %s Expected: %d Got: %d\n",
8072 test_pack_list[i].first.c_str(),
8073 static_cast<int>(test_pack_list[i].second.ps_index),
8074 static_cast<int>(ovrld_func.current_ps_index));
8075
8076 error_found = true;
8077 }
8078
8079 if (ovrld_func.current_param_seq != test_pack_list[i].second.param_seq)
8080 {
8081 printf("run_test18() - Error with parameter seq (12) Expression: %s Expected: %s Got: %s\n",
8082 test_pack_list[i].first.c_str(),
8083 test_pack_list[i].second.param_seq.c_str(),
8084 ovrld_func.current_param_seq.c_str());
8085
8086 error_found = true;
8087 }
8088 ::fflush(stdout);
8089 }
8090
8091 if (error_found)
8092 {
8093 return false;
8094 }
8095 }
8096
8097 {
8098 typedef exprtk::expression<T> expression_t;
8099
8100 std::string a = "a";
8101 std::string b = "b";
8102 std::string c = "c";
8103 std::string d = "d";
8104 std::string result = "";
8105
8106 T x = T(1.1);
8107 T y = T(2.2);
8108 T z = T(3.3);
8109 T w = T(4.4);
8110
8111 overload_func<T> ovrld_func
8112 (
8113 "S:T|S:TT|S:TTT|S:TTTT|"
8114 "S:S|S:SS|S:SSS|S:SSSS|"
8115 "S:ST|S:STS|S:STST|"
8116 "S:TS|S:TST|S:TSTS|"
8117 "S:TTSS|S:SSTT|S:STTS|S:TSST"
8118 );
8119
8120 exprtk::symbol_table<T> symbol_table;
8121
8122 symbol_table.add_constants();
8123 symbol_table.add_variable ("x",x);
8124 symbol_table.add_variable ("y",y);
8125 symbol_table.add_variable ("z",z);
8126 symbol_table.add_variable ("w",w);
8127
8128 symbol_table.add_stringvar("a",a);
8129 symbol_table.add_stringvar("b",b);
8130 symbol_table.add_stringvar("c",c);
8131 symbol_table.add_stringvar("d",d);
8132 symbol_table.add_stringvar("result",result);
8133
8134 symbol_table.add_function("foo",ovrld_func);
8135
8136 typedef typename overload_func<T>::test_result_t test_result_t;
8137 typedef std::pair<std::string, typename overload_func<T>::test_result_t> test_pack_t;
8138
8139 static const test_pack_t test_pack_list[] =
8140 {
8141 test_pack_t("result := foo(x)" , test_result_t( 0, "T" )),
8142 test_pack_t("result := foo(x, y)" , test_result_t( 1, "TT" )),
8143 test_pack_t("result := foo(x, y, z)" , test_result_t( 2, "TTT" )),
8144 test_pack_t("result := foo(x, y, z, w)" , test_result_t( 3, "TTTT")),
8145 test_pack_t("result := foo(x + y)" , test_result_t( 0, "T" )),
8146 test_pack_t("result := foo(x + y, y + z)" , test_result_t( 1, "TT" )),
8147 test_pack_t("result := foo(x + y, y + z, z + w)" , test_result_t( 2, "TTT" )),
8148 test_pack_t("result := foo(x + y, y + z, z + w, w)" , test_result_t( 3, "TTTT")),
8149 test_pack_t("result := foo(a)" , test_result_t( 4, "S" )),
8150 test_pack_t("result := foo(a, b)" , test_result_t( 5, "SS" )),
8151 test_pack_t("result := foo(a, b, c)" , test_result_t( 6, "SSS" )),
8152 test_pack_t("result := foo(a, b, c, d)" , test_result_t( 7, "SSSS")),
8153 test_pack_t("result := foo(a + b)" , test_result_t( 4, "S" )),
8154 test_pack_t("result := foo(a + b, b + c)" , test_result_t( 5, "SS" )),
8155 test_pack_t("result := foo(a + b, b + c, c + d)" , test_result_t( 6, "SSS" )),
8156 test_pack_t("result := foo(a + b, b + c, c + d, d)" , test_result_t( 7, "SSSS")),
8157 test_pack_t("result := foo(a, x)" , test_result_t( 8, "ST" )),
8158 test_pack_t("result := foo(a, x, b)" , test_result_t( 9, "STS" )),
8159 test_pack_t("result := foo(a, x, b, y)" , test_result_t(10, "STST")),
8160 test_pack_t("result := foo(a + b, x + y)" , test_result_t( 8, "ST" )),
8161 test_pack_t("result := foo(a + b, x + y, b + c)" , test_result_t( 9, "STS" )),
8162 test_pack_t("result := foo(a + b, x + y, b + c, y + z)" , test_result_t(10, "STST")),
8163 test_pack_t("result := foo(x, a)" , test_result_t(11, "TS" )),
8164 test_pack_t("result := foo(x, a, y)" , test_result_t(12, "TST" )),
8165 test_pack_t("result := foo(x, a, y, b)" , test_result_t(13, "TSTS")),
8166 test_pack_t("result := foo(x + y, a + b)" , test_result_t(11, "TS" )),
8167 test_pack_t("result := foo(x + y, a + b, y + z)" , test_result_t(12, "TST" )),
8168 test_pack_t("result := foo(x + y, a + b, y + z, b + c)" , test_result_t(13, "TSTS")),
8169 test_pack_t("result := foo(x, y, a, b)" , test_result_t(14, "TTSS")),
8170 test_pack_t("result := foo(a, b, x, y)" , test_result_t(15, "SSTT")),
8171 test_pack_t("result := foo(a, x, y, b)" , test_result_t(16, "STTS")),
8172 test_pack_t("result := foo(x, a, b, y)" , test_result_t(17, "TSST")),
8173 test_pack_t("result := foo(x + y, y + z, a + b, b + c)" , test_result_t(14, "TTSS")),
8174 test_pack_t("result := foo(a + b, b + c, x + y, y + z)" , test_result_t(15, "SSTT")),
8175 test_pack_t("result := foo(a + b, x + y, y + z, b + c)" , test_result_t(16, "STTS")),
8176 test_pack_t("result := foo(x + y, a + b, b + c, y + z)" , test_result_t(17, "TSST"))
8177 };
8178
8179 static const std::size_t test_pack_list_size = sizeof(test_pack_list) / sizeof(test_pack_t);
8180
8181 std::deque<expression_t> expression_list;
8182
8183 for (std::size_t i = 0; i < test_pack_list_size; ++i)
8184 {
8185 expression_t expression;
8186 expression.register_symbol_table(symbol_table);
8187
8188 exprtk::parser<T> parser;
8189
8190 if (!parser.compile(test_pack_list[i].first, expression))
8191 {
8192 printf("run_test18() - [16] Overload VarArg Error: %s Expression: %s\n",
8193 parser.error().c_str(),
8194 test_pack_list[i].first.c_str());
8195
8196 return false;
8197 }
8198 else
8199 expression_list.push_back(expression);
8200 }
8201
8202 bool error_found = false;
8203
8204 for (std::size_t i = 0; i < expression_list.size(); ++i)
8205 {
8206 ovrld_func.clear();
8207 result = "";
8208 expression_list[i].value();
8209
8210 if (result != "string result")
8211 {
8212 printf("run_test18() - Error in evaluation! (13) Expression: %s\n",
8213 test_pack_list[i].first.c_str());
8214
8215 error_found = true;
8216 }
8217
8218 if (ovrld_func.current_ps_index != test_pack_list[i].second.ps_index)
8219 {
8220 printf("run_test18() - Error with ps_index (13) Expression: %s Expected: %d Got: %d\n",
8221 test_pack_list[i].first.c_str(),
8222 static_cast<int>(test_pack_list[i].second.ps_index),
8223 static_cast<int>(ovrld_func.current_ps_index));
8224
8225 error_found = true;
8226 }
8227
8228 if (ovrld_func.current_param_seq != test_pack_list[i].second.param_seq)
8229 {
8230 printf("run_test18() - Error with parameter seq (13) Expression: %s Expected: %s Got: %s\n",
8231 test_pack_list[i].first.c_str(),
8232 test_pack_list[i].second.param_seq.c_str(),
8233 ovrld_func.current_param_seq.c_str());
8234
8235 error_found = true;
8236 }
8237 }
8238
8239 if (error_found)
8240 {
8241 return false;
8242 }
8243 }
8244
8245 {
8246 typedef exprtk::symbol_table<T> symbol_table_t;
8247 typedef exprtk::expression<T> expression_t;
8248 typedef exprtk::parser<T> parser_t;
8249
8250 typedef std::pair<std::string,std::size_t> rtc_test_t;
8251 static const rtc_test_t rtc_tests[] =
8252 {
8253 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + v[]]; } ", 5 ),
8254 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + 10]; } ", 5 ),
8255 std::make_pair(" x:= 0; for (var i := 0; i < (2 * v[]); i += 1) { x += (v[i] == vv[i]); } ", 10),
8256 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + v[]] := i; } ", 5 ),
8257 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + v[]] <=> v[i]; } ", 5 ),
8258 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i] <=> v[i + v[]]; } ", 10),
8259 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + z[]]; } ", 5 ),
8260 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + 10]; } ", 5 ),
8261 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + z[]] := i; } ", 5 ),
8262 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + z[]] <=> z[i]; } ", 5 ),
8263 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*w)[i + v[]]; } ", 10),
8264 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*w)[i+w[]]; } ", 10),
8265 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+w)[i + v[]]; } ", 10),
8266 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+w)[i+w[]]; } ", 10),
8267 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*z)[i+v[]]; } ", 10),
8268 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*z)[i+w[]]; } ", 9 ),
8269 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+z)[i+v[]]; } ", 10),
8270 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+z)[i+z[]]; } ", 10),
8271 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; qq[i[0]] += xx ", 0 ),
8272 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[1] + xx) == (xx + qq[1])) ", 0 ),
8273 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[0] += xx) == xx) ", 0 ),
8274 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[0] += xx + yy) == (xx + yy)) ", 0 ),
8275 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[0] -= xx) == -xx) ", 0 ),
8276 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[0] -= (xx + yy)) == -(xx + yy)) ", 0 ),
8277 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[1] + qq[2]) == (qq[3 - 1] + qq[2 * 1/2]))", 0 ),
8278 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; (qq[qq[1]] == qq[1]) ", 0 ),
8279 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; (qq[1] += qq[1]) == qq[1 + 1] ", 0 ),
8280 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[i[1]] + xx) == (xx + qq[i[1]])) ", 0 ),
8281 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[i[0]] += xx) == xx) ", 0 ),
8282 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[i[0]] += xx + yy) == (xx + yy)) ", 0 ),
8283 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[i[0]] -= xx) == -xx) ", 0 ),
8284 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[i[0]] -= (xx + yy)) == -(xx + yy))", 0 ),
8285 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[i[1]] + qq[2]) == (qq[i[3] - i[1]] + qq[i[2] * 1/2]))", 0 ),
8286 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; (qq[qq[i[1]]] == qq[i[1]]) ", 0 ),
8287 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; (qq[i[1]] += qq[i[1]]) == qq[i[1] + 1] ", 0 ),
8288 };
8289
8290 static const std::size_t rtc_tests_size = sizeof(rtc_tests) / sizeof(rtc_test_t);
8291
8292 bool error_found = false;
8293
8294 for (std::size_t i = 0; i < rtc_tests_size; ++i)
8295 {
8296 const std::string& expression_str = rtc_tests[i].first;
8297
8298 {
8299 T x = 6;
8300 T v[5] = { 0, 1, 2, 3, 4 };
8301 T w[3] = { 0, 1, 2 };
8304
8305 symbol_table_t symbol_table;
8306 expression_t expression;
8307 parser_t parser;
8308
8309 symbol_table.add_variable("x" , x );
8310 symbol_table.add_vector ("v" , v );
8311 symbol_table.add_vector ("w" , w );
8312 symbol_table.add_vector ("vv", vv);
8313 symbol_table.add_vector ("ww", ww);
8314
8316
8317 expression.register_symbol_table(symbol_table);
8318
8319 parser.register_vector_access_runtime_check(vartc);
8320
8321 if (!parser.compile(expression_str, expression))
8322 {
8323 printf("run_test18() - Error: %s\t [1] Expression: %s\n",
8324 parser.error().c_str(),
8325 expression_str.c_str());
8326
8327 error_found = true;
8328 return false;
8329 }
8330
8331 vartc.rtc_count = 0;
8332 expression.value();
8333
8334 if (vartc.rtc_count != rtc_tests[i].second)
8335 {
8336 printf("run_test18() - Expected rtc_count: %d got rtc_count: %d [0] Expression: %s\n",
8337 static_cast<unsigned int>(rtc_tests[i].second),
8338 static_cast<unsigned int>(vartc.rtc_count),
8339 expression_str.c_str());
8340 error_found = true;
8341 }
8342 }
8343
8344 {
8345 T x = 6;
8346 T v[5] = { 0, 1, 2, 3, 4 };
8347 T w[3] = { 0, 1, 2 };
8348 T v0[5] = { 0, 1, 2, 3, 4 };
8349 T v1[5] = { 0, 1, 2, 3, 4 };
8352
8353 symbol_table_t symbol_table;
8354 expression_t expression;
8355 parser_t parser;
8356
8357 symbol_table.add_variable("x" , x );
8358 symbol_table.add_vector ("v" , v );
8359 symbol_table.add_vector ("w" , w );
8360 symbol_table.add_vector ("vv", vv);
8361 symbol_table.add_vector ("ww", ww);
8362
8364
8365 expression.register_symbol_table(symbol_table);
8366
8367 parser.register_vector_access_runtime_check(vartc);
8368
8369 if (!parser.compile(expression_str, expression))
8370 {
8371 printf("run_test18() - Error: %s\t [2] Expression: %s\n",
8372 parser.error().c_str(),
8373 expression_str.c_str());
8374
8375 error_found = true;
8376 return false;
8377 }
8378
8379 vartc.rtc_count = 0;
8380 vv.rebase(v0);
8381 expression.value();
8382
8383 if (vartc.rtc_count != rtc_tests[i].second)
8384 {
8385 printf("run_test18() - Expected rtc_count: %d got rtc_count: %d [1] Expression: %s\n",
8386 static_cast<unsigned int>(rtc_tests[i].second),
8387 static_cast<unsigned int>(vartc.rtc_count),
8388 expression_str.c_str());
8389 error_found = true;
8390 }
8391
8392 vartc.rtc_count = 0;
8393 vv.rebase(v1);
8394 expression.value();
8395
8396 if (vartc.rtc_count != rtc_tests[i].second)
8397 {
8398 printf("run_test18() - Expected rtc_count: %d got rtc_count: %d [2] Expression: %s\n",
8399 static_cast<unsigned int>(rtc_tests[i].second),
8400 static_cast<unsigned int>(vartc.rtc_count),
8401 expression_str.c_str());
8402 error_found = true;
8403 }
8404 }
8405 }
8406
8407 if (error_found)
8408 {
8409 return false;
8410 }
8411 }
8412
8413 return true;
8414}
std::string parameter_sequence
Definition exprtk.hpp:19699
bool remove_vararg_function(const std::string &vararg_function_name)
Definition exprtk.hpp:21055
bool remove_vector(const std::string &vector_name)
Definition exprtk.hpp:21063
void rebase(data_ptr_t data)
Definition exprtk.hpp:4576
#define pb(v, N)
std::size_t vector_count
std::size_t string_count
std::size_t scalar_count

References exprtk::symbol_table< T >::add_constants(), exprtk::symbol_table< T >::add_function(), exprtk::symbol_table< T >::add_stringvar(), exprtk::symbol_table< T >::add_variable(), exprtk::symbol_table< T >::add_vector(), overload_func< T >::clear(), exprtk::parser< T >::compile(), overload_func< T >::current_param_seq, overload_func< T >::current_ps_index, exprtk::parser< T >::error(), expression_list, expression_list_size, foo1(), foo2(), foo3(), foo4(), foo5(), foo6(), exprtk::make_vector_view(), not_equal(), exprtk::igeneric_function< T >::parameter_sequence, pb, exprtk::vector_view< T >::rebase(), exprtk::symbol_table< T >::remove_function(), exprtk::symbol_table< T >::remove_stringvar(), exprtk::symbol_table< T >::remove_vararg_function(), exprtk::symbol_table< T >::remove_variable(), exprtk::symbol_table< T >::remove_vector(), vector_access_rtc_counter::rtc_count, gen_func< T >::scalar_count, gen_func< T >::string_count, and gen_func< T >::vector_count.

Here is the call graph for this function:

◆ run_test19()

template<typename T >
bool run_test19 ( )
inline

Definition at line 8440 of file exprtk_real_test.cpp.

8441{
8442 typedef exprtk::symbol_table<T> symbol_table_t;
8443 typedef exprtk::expression<T> expression_t;
8444 typedef exprtk::parser<T> parser_t;
8445 typedef exprtk::function_compositor<T> compositor_t;
8446 typedef typename compositor_t::function function_t;
8447
8448 {
8449 T x = T(123.123);
8450
8451 compositor_t compositor;
8452
8453 // f(x) = x + 2
8454 compositor.add(function_t("f", "x + 2", "x"));
8455
8456 // g(x) = x^2-3
8457 compositor.add(function_t("g", "x^2 - 3", "x"));
8458
8459 // fof(x) = f(f(x))
8460 compositor.add(function_t("fof", "f(f(x))", "x"));
8461
8462 // gog(x) = g(g(x))
8463 compositor.add(function_t("gog", "g(g(x))", "x"));
8464
8465 // fog(x) = f(g(x))
8466 compositor.add(function_t("fog", "f(g(x))", "x"));
8467
8468 // gof(x) = g(f(x))
8469 compositor.add(function_t("gof", "g(f(x))", "x"));
8470
8471 // fogof(x) = f(g(f(x)))
8472 compositor.add(function_t("fogof", "f(g(f(x)))", "x"));
8473
8474 // gofog(x) = g(f(g(x)))
8475 compositor.add(function_t("gofog", "g(f(g(x)))", "x"));
8476
8477 symbol_table_t& symbol_table = compositor.symbol_table();
8478 symbol_table.add_constants();
8479 symbol_table.add_variable("x", x);
8480
8481 static const std::string expr_str_list[] =
8482 {
8483 "equal(f(x),(x + 2))",
8484 "equal(g(x),(x^2 - 3))",
8485 "equal(fof(x),(x + 4))",
8486 "equal(gog(x),(x^4 - 6x^2 + 6))",
8487 "equal(fog(x),(x^2 - 1))",
8488 "equal(gof(x),(x^2 + 4x + 1))",
8489 "equal(fogof(x),(x^2 + 4x + 3))",
8490 "equal(gofog(x),(x^4 - 2x^2 - 2))"
8491 };
8492 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
8493
8494 std::deque<expression_t> expression_list;
8495
8496 for (std::size_t i = 0; i < expr_str_list_size; ++i)
8497 {
8498 expression_t expression;
8499 expression.register_symbol_table(symbol_table);
8500
8501 parser_t parser;
8502
8503 if (!parser.compile(expr_str_list[i], expression))
8504 {
8505 printf("run_test19() - Error: %s Expression: %s\n",
8506 parser.error().c_str(),
8507 expr_str_list[i].c_str());
8508
8509 return false;
8510 }
8511 else
8512 expression_list.push_back(expression);
8513 }
8514
8515 bool error_found = false;
8516
8517 for (std::size_t i = 0; i < expression_list.size(); ++i)
8518 {
8519 if (T(1) != expression_list[i].value())
8520 {
8521 printf("run_test19() - Error in evaluation! (1) Expression: %s\n",
8522 expr_str_list[i].c_str());
8523
8524 error_found = true;
8525 }
8526 }
8527
8528 if (error_found)
8529 {
8530 return false;
8531 }
8532 }
8533
8534 {
8535 const std::size_t rounds = 100;
8536
8537 for (std::size_t r = 0; r < rounds; ++r)
8538 {
8539 T x = T(1);
8540 T y = T(2);
8541 T z = T(3);
8542 T w = T(4);
8543 T u = T(5);
8544 T v = T(6);
8545
8546 compositor_t compositor;
8547
8548 // f0() = 6
8549 compositor
8550 .add(
8551 function_t("f0")
8552 .expression("3 * 2"));
8553
8554 // f1(x) = 5 * (f0 + x)
8555 compositor
8556 .add(
8557 function_t("f1")
8558 .var("x")
8559 .expression("5 * (f0 + x)"));
8560
8561 // f2(x,y) = 7 * (f1(x) + f1(y))
8562 compositor
8563 .add(
8564 function_t("f2")
8565 .var("x").var("y")
8566 .expression("7 * (f1(x) + f1(y))"));
8567
8568 // f3(x,y,z) = 9 * (f2(x,y) + f2(y,z) + f2(x,z))
8569 compositor
8570 .add(
8571 function_t("f3")
8572 .var("x").var("y").var("z")
8573 .expression("9 * (f2(x,y) + f2(y,z) + f2(x,z))"));
8574
8575 // f4(x,y,z,w) = 11 * (f3(x,y,z) + f3(y,z,w) + f3(z,w,z))
8576 compositor
8577 .add(
8578 function_t("f4")
8579 .var("x").var("y").var("z").var("w")
8580 .expression("11 * (f3(x,y,z) + f3(y,z,w) + f3(z,w,x))"));
8581
8582 // f5(x,y,z,w,u) = 13 * (f4(x,y,z,w) + f4(y,z,w,u) + f4(z,w,u,x) + f4(w,u,x,y))
8583 compositor
8584 .add(
8585 function_t("f5")
8586 .var("x").var("y").var("z").var("w").var("u")
8587 .expression("13 * (f4(x,y,z,w) + f4(y,z,w,u) + f4(z,w,u,x) + f4(w,u,x,y))"));
8588
8589 // f6(x,y,z,w,u,v) = 17 * (f5(x,y,z,w,u) + f5(y,z,w,u,v) + f5(z,w,u,v,x) + f5(w,u,v,x,y))
8590 compositor
8591 .add(
8592 function_t("f6")
8593 .var("x").var("y").var("z")
8594 .var("w").var("u").var("v")
8595 .expression("17 * (f5(x,y,z,w,u) + f5(y,z,w,u,v) + f5(z,w,u,v,x) + f5(w,u,v,x,y))"));
8596
8597 symbol_table_t& symbol_table = compositor.symbol_table();
8598 symbol_table.add_constants();
8599 symbol_table.add_variable("x", x);
8600 symbol_table.add_variable("y", y);
8601 symbol_table.add_variable("z", z);
8602 symbol_table.add_variable("w", w);
8603 symbol_table.add_variable("u", u);
8604 symbol_table.add_variable("v", v);
8605
8606 parser_t parser;
8607
8608 const std::string expr_str_list[] =
8609 {
8610 "f0()",
8611 "f1(x)",
8612 "f2(x,x)",
8613 "f3(x,x,x)",
8614 "f4(x,x,x,x)",
8615 "f5(x,x,x,x,x)",
8616 "f6(x,x,x,x,x,x)",
8617 "f2(x,y)",
8618 "f3(x,y,z)",
8619 "f4(x,y,z,w)",
8620 "f5(x,y,z,w,u)",
8621 "f6(x,y,z,w,u,v)"
8622 };
8623
8624 const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
8625
8626 const T result_list[] =
8627 {
8628 T(6),
8629 T(35),
8630 T(490),
8631 T(13230),
8632 T(436590),
8633 T(22702680),
8634 T(1543782240),
8635 T(525),
8636 T(15120),
8637 T(533610),
8638 T(29459430),
8639 T(2122700580)
8640 };
8641
8642 bool error_found = false;
8643
8644 for (std::size_t i = 0; i < expr_str_list_size; ++i)
8645 {
8646 expression_t expression;
8647 expression.register_symbol_table(symbol_table);
8648
8649 if (!parser.compile(expr_str_list[i], expression))
8650 {
8651 printf("run_test19() - Error: %s Expression: %s\n",
8652 parser.error().c_str(),
8653 expr_str_list[i].c_str());
8654
8655 error_found = true;
8656 continue;
8657 }
8658
8659 const T result = expression.value();
8660
8661 if (result_list[i] != result)
8662 {
8663 printf("run_test19() - Error in evaluation! (2) Expression: %s Expected: %10.1f\tResult: %10.1f\n",
8664 expr_str_list[i].c_str(),
8665 static_cast<double>(result_list[i]),
8666 static_cast<double>(result));
8667
8668 error_found = true;
8669 continue;
8670 }
8671 }
8672
8673 if (error_found)
8674 {
8675 return false;
8676 }
8677 }
8678 }
8679
8680 {
8681 T x = T(0);
8682
8683 compositor_t compositor;
8684
8685 compositor
8686 .add(
8687 function_t(
8688 "is_prime_impl1",
8689 "if (y == 1,true, "
8690 " if (0 == (x % y),false, "
8691 " is_prime_impl1(x,y - 1))) ",
8692 "x","y"));
8693
8694 compositor
8695 .add(
8696 function_t(
8697 "is_prime1",
8698 "if (frac(x) != 0, false, "
8699 " if (x <= 0, false, "
8700 " is_prime_impl1(x,min(x - 1,trunc(sqrt(x)) + 1)))) ",
8701 "x"));
8702
8703 compositor
8704 .add(
8705 function_t(
8706 "is_prime_impl2",
8707 "switch "
8708 "{ "
8709 " case y == 1 : true; "
8710 " case (x % y) == 0 : false; "
8711 " default : is_prime_impl2(x,y - 1);"
8712 "} ",
8713 "x","y"));
8714
8715 compositor
8716 .add(
8717 function_t(
8718 "is_prime2",
8719 "switch "
8720 "{ "
8721 " case x <= 0 : false; "
8722 " case frac(x) != 0 : false; "
8723 " default : is_prime_impl2(x,min(x - 1,trunc(sqrt(x)) + 1));"
8724 "} ",
8725 "x"));
8726
8727 compositor
8728 .add(
8729 function_t(
8730 "is_prime_impl3",
8731 "while (y > 0) "
8732 "{ "
8733 " switch "
8734 " { "
8735 " case y == 1 : ~(y := 0, true);"
8736 " case (x % y) == 0 : ~(y := 0,false);"
8737 " default : y := y - 1; "
8738 " } "
8739 "} ",
8740 "x","y"));
8741
8742 compositor
8743 .add(
8744 function_t(
8745 "is_prime3",
8746 "switch "
8747 "{ "
8748 " case x <= 0 : false; "
8749 " case frac(x) != 0 : false; "
8750 " default : is_prime_impl3(x,min(x - 1,trunc(sqrt(x)) + 1));"
8751 "} ",
8752 "x"));
8753
8754 compositor
8755 .add(
8756 function_t(
8757 "is_prime_impl4",
8758 "switch "
8759 "{ "
8760 " case 1 == x : false; "
8761 " case 2 == x : true; "
8762 " case 3 == x : true; "
8763 " case 5 == x : true; "
8764 " case 7 == x : true; "
8765 " case 0 == x % 2 : false; "
8766 " default : "
8767 " { "
8768 " for (var i := 3; i < y; i += 2) "
8769 " { "
8770 " if ((x % i) == 0) "
8771 " break[false]; "
8772 " else "
8773 " true; "
8774 " } "
8775 " }; "
8776 "} ",
8777 "x","y"));
8778
8779 compositor
8780 .add(
8781 function_t(
8782 "is_prime4",
8783 "switch "
8784 "{ "
8785 " case x <= 0 : false; "
8786 " case frac(x) != 0 : false; "
8787 " default : is_prime_impl4(x,min(x - 1,trunc(sqrt(x)) + 1));"
8788 "} ",
8789 "x"));
8790
8791 symbol_table_t& symbol_table = compositor.symbol_table();
8792 symbol_table.add_constants();
8793 symbol_table.add_variable("x",x);
8794
8795 const std::string expression_str[] =
8796 {
8797 "is_prime1(x)",
8798 "is_prime2(x)",
8799 "is_prime3(x)",
8800 "is_prime4(x)"
8801 };
8802
8803 const std::size_t expression_count = sizeof(expression_str) / sizeof(std::string);
8804
8805 std::vector<expression_t> expression_list;
8806
8807 for (std::size_t i = 0; i < expression_count; ++i)
8808 {
8809 parser_t parser;
8810
8811 expression_t expression;
8812 expression.register_symbol_table(symbol_table);
8813
8814 if (!parser.compile(expression_str[i],expression))
8815 {
8816 printf("run_test19() - Error: %s Expression%d: %s\n",
8817 parser.error().c_str(),
8818 static_cast<unsigned int>(i),
8819 expression_str[i].c_str());
8820
8821 return false;
8822 }
8823 else
8824 expression_list.push_back(expression);
8825 }
8826
8827 bool error_found = false;
8828
8829 const std::size_t prime_list[] =
8830 {
8831 2, 3, 5, 7, 11, 13, 17, 19,
8832 877, 947, 1087, 1153, 1229, 1297, 1381, 1453,
8833 1523, 1597, 1663, 1741, 1823, 1901, 1993, 2063,
8834 2131, 2221, 2293, 2371, 2437, 2539, 2621, 2689,
8835 2749, 2833, 2909, 3001, 3083, 3187, 3259, 3343,
8836 3433, 3517, 3581, 3659, 3733, 3823, 3911, 4001,
8837 4073, 4153, 4241, 4327, 4421, 4507, 4591, 4663,
8838 4759, 4861, 4943, 5009, 5099, 5189, 5281, 5393,
8839 5449, 5527, 5641, 5701, 5801, 5861, 5953, 6067,
8840 6143, 6229, 6311, 6373, 6481, 6577, 6679, 6763,
8841 6841, 6947, 7001, 7109, 7211, 7307, 7417, 7507,
8842 104309, 104311, 104323, 104327, 104347, 104369, 104381, 104383,
8843 104393, 104399, 104417, 104459, 104471, 104473, 104479, 104491,
8844 104513, 104527, 104537, 104543, 104549, 104551, 104561, 104579,
8845 104593, 104597, 104623, 104639, 104651, 104659, 104677, 104681,
8846 104683, 104693, 104701, 104707, 104711, 104717, 104723, 104729,
8847 1000621, 1000639, 1000651, 1000667, 1000669, 1001023, 1001027, 1001041
8848 };
8849
8850 const std::size_t prime_list_size = sizeof(prime_list) / sizeof(std::size_t);
8851
8852 for (std::size_t i = 0; (i < prime_list_size) && (!error_found); ++i)
8853 {
8854 x = static_cast<T>(prime_list[i]);
8855
8856 std::vector<T> result(expression_count,T(0));
8857
8858 for (std::size_t j = 0; j < expression_list.size(); ++j)
8859 {
8860 result[j] = expression_list[j].value();
8861 }
8862
8863 for (std::size_t j = 1; j < expression_list.size(); ++j)
8864 {
8865 if (result[j] != result[0])
8866 {
8867 error_found = true;
8868 break;
8869 }
8870 }
8871
8872 if (error_found)
8873 {
8874 printf("run_test19() - Error in evaluation! (3) Results don't match! Prime: %d\n",
8875 static_cast<unsigned int>(prime_list[i]));
8876
8877 for (std::size_t j = 0; j < expression_list.size(); ++j)
8878 {
8879 printf("Expression[%02d]: %s = %d\n",
8880 static_cast<unsigned int>(j),
8881 expression_str[j].c_str(),
8882 static_cast<unsigned int>(result[j]));
8883 }
8884 }
8885 else if (T(1) != expression_list[0].value())
8886 {
8887 printf("run_test19() - Error in evaluation! (4) Results don't match! Prime: %d\n",
8888 static_cast<unsigned int>(prime_list[i]));
8889
8890 for (std::size_t j = 0; j < expression_list.size(); ++j)
8891 {
8892 printf("Expression[%02d]: %s = %d\n",
8893 static_cast<unsigned int>(j),
8894 expression_str[j].c_str(),
8895 static_cast<unsigned int>(result[j]));
8896 }
8897 }
8898 }
8899
8900 if (error_found)
8901 {
8902 return false;
8903 }
8904 }
8905
8906 {
8907 T x = T(0);
8908
8909 compositor_t compositor;
8910
8911 compositor
8912 .add(
8913 function_t(
8914 "fibonacci1",
8915 "if (x == 0,0, "
8916 " if (x == 1,1, "
8917 " fibonacci1(x - 1) + fibonacci1(x - 2)))",
8918 "x"));
8919
8920 compositor
8921 .add(
8922 function_t(
8923 "fibonacci2",
8924 "switch "
8925 "{ "
8926 " case x == 0 : 0; "
8927 " case x == 1 : 1; "
8928 " default : fibonacci2(x - 1) + fibonacci2(x - 2);"
8929 "} ",
8930 "x"));
8931
8932 compositor
8933 .add(
8934 function_t(
8935 "fibonacci_impl3",
8936 "switch "
8937 "{ "
8938 " case x == 0 : 0; "
8939 " case x == 1 : 1; "
8940 " default : "
8941 " while ((x := (x - 1)) > 0) "
8942 " { "
8943 " w := z; "
8944 " z := z + y; "
8945 " y := w; "
8946 " z "
8947 " }; "
8948 "} ",
8949 "x","y","z","w"));
8950
8951 compositor
8952 .add(
8953 function_t(
8954 "fibonacci3",
8955 "fibonacci_impl3(x,0,1,0)",
8956 "x"));
8957
8958 compositor
8959 .add(
8960 function_t(
8961 "fibonacci_impl4",
8962 "switch "
8963 "{ "
8964 " case x == 0 : 0; "
8965 " case x == 1 : 1; "
8966 " default : "
8967 " repeat "
8968 " w := z; "
8969 " z := z + y; "
8970 " y := w; "
8971 " x := x - 1; "
8972 " z "
8973 " until (x <= 1); "
8974 "} ",
8975 "x","y","z","w"));
8976
8977 compositor
8978 .add(
8979 function_t(
8980 "fibonacci4",
8981 "fibonacci_impl4(x,0,1,0)",
8982 "x"));
8983
8984 compositor
8985 .add(
8986 function_t(
8987 "fibonacci5",
8988 "if ((x == 0) or (x == 1)) "
8989 " x; "
8990 "else "
8991 " fibonacci5(x - 1) + fibonacci5(x - 2); ",
8992 "x"));
8993
8994 symbol_table_t& symbol_table = compositor.symbol_table();
8995
8996 symbol_table.add_constants();
8997 symbol_table.add_variable("x",x);
8998
8999 const std::string expression_str[] =
9000 {
9001 "fibonacci1(x)",
9002 "fibonacci2(x)",
9003 "fibonacci3(x)",
9004 "fibonacci4(x)",
9005 "fibonacci5(x)"
9006 };
9007
9008 const std::size_t expression_count = sizeof(expression_str) / sizeof(std::string);
9009
9010 std::vector<expression_t> expression_list;
9011
9012 for (std::size_t i = 0; i < expression_count; ++i)
9013 {
9014 parser_t parser;
9015
9016 expression_t expression;
9017 expression.register_symbol_table(symbol_table);
9018
9019 if (!parser.compile(expression_str[i],expression))
9020 {
9021 printf("run_test19() - Error: %s Expression[%02d]: %s\n",
9022 parser.error().c_str(),
9023 static_cast<unsigned int>(i),
9024 expression_str[i].c_str());
9025
9026 return false;
9027 }
9028 else
9029 expression_list.push_back(expression);
9030 }
9031
9032 bool error_found = false;
9033
9034 const std::size_t fibonacci_list[] =
9035 {
9036 0, 1, 1, 2,
9037 3, 5, 8, 13,
9038 21, 34, 55, 89,
9039 144, 233, 377, 610,
9040 987, 1597, 2584, 4181,
9041 6765, 10946, 17711, 28657,
9042 46368, 75025, 121393, 196418,
9043 317811, 514229, 832040, 1346269
9044 };
9045
9046 const std::size_t fibonacci_list_size = sizeof(fibonacci_list) / sizeof(std::size_t);
9047
9048 for (std::size_t i = 0; (i < fibonacci_list_size) && (!error_found); ++i)
9049 {
9050 x = static_cast<T>(i);
9051
9052 std::vector<T> result(expression_count,T(0));
9053
9054 for (std::size_t j = 0; j < expression_list.size(); ++j)
9055 {
9056 result[j] = expression_list[j].value();
9057 }
9058
9059 for (std::size_t j = 1; j < expression_list.size(); ++j)
9060 {
9061 if (result[j] != result[0])
9062 {
9063 error_found = true;
9064 break;
9065 }
9066 }
9067
9068 if (error_found)
9069 {
9070 printf("run_test19() - Error in evaluation! (5) Results don't match! fibonacci(%d) = %d\n",
9071 static_cast<unsigned int>(i),
9072 static_cast<unsigned int>(fibonacci_list[i]));
9073
9074 for (std::size_t j = 0; j < expression_list.size(); ++j)
9075 {
9076 printf("Expression[%02d]: %s = %d\n",
9077 static_cast<unsigned int>(j),
9078 expression_str[j].c_str(),
9079 static_cast<unsigned int>(result[j]));
9080 }
9081 }
9082 else if (fibonacci_list[i] != expression_list[0].value())
9083 {
9084 printf("run_test19() - Error in evaluation! (6) Results don't match! fibonacci(%d) = %d\n",
9085 static_cast<unsigned int>(i),
9086 static_cast<unsigned int>(fibonacci_list[i]));
9087
9088 for (std::size_t j = 0; j < expression_list.size(); ++j)
9089 {
9090 printf("Expression[%02d]: %s = %d\n",
9091 static_cast<unsigned int>(j),
9092 expression_str[j].c_str(),
9093 static_cast<unsigned int>(result[j]));
9094 }
9095 }
9096 }
9097
9098 if (error_found)
9099 {
9100 return false;
9101 }
9102 }
9103
9104 {
9105 T x = T(0);
9106
9107 symbol_table_t symbol_table;
9108
9109 symbol_table.add_constants();
9110 symbol_table.add_variable("x",x);
9111
9112 compositor_t compositor(symbol_table);
9113
9114 compositor
9115 .add(
9116 function_t(
9117 "newton_sqrt_impl",
9118 "switch "
9119 "{ "
9120 " case x < 0 : -inf; "
9121 " case x == 0 : 0; "
9122 " case x == 1 : 1; "
9123 " default: "
9124 " ~{ "
9125 " z := 100; "
9126 " y := x / 2; "
9127 " repeat "
9128 " y := (1 / 2) * (y + (x / y)); "
9129 " if (equal(y * y,x)) "
9130 " break[y]; "
9131 " until ((z -= 1) <= 0); "
9132 " }; "
9133 "} ",
9134 "x","y","z"));
9135
9136 compositor
9137 .add(
9138 function_t(
9139 "newton_sqrt",
9140 "newton_sqrt_impl(x,0,0)","x"));
9141
9142 std::string expression_str = "newton_sqrt(x)";
9143
9144 expression_t expression;
9145
9146 expression.register_symbol_table(symbol_table);
9147
9148 parser_t parser;
9149
9150 if (!parser.compile(expression_str,expression))
9151 {
9152 printf("run_test19() - Error: %s Expression: %s\n",
9153 parser.error().c_str(),
9154 expression_str.c_str());
9155
9156 return false;
9157 }
9158
9159 bool error_found = false;
9160
9161 for (std::size_t i = 0; i < 100; ++i)
9162 {
9163 x = static_cast<T>(i);
9164
9165 const T result = expression.value();
9166
9167 if (not_equal(result, real::sqrt(x), T(0.0000001)))
9168 {
9169 printf("run_test19() - Computation Error "
9170 "Expression: [%s]\tExpected: %12.8f\tResult: %12.8f\n",
9171 expression_str.c_str(),
9172 static_cast<double>(real::sqrt(x)),
9173 static_cast<double>(result));
9174
9175 error_found = true;
9176 }
9177 }
9178
9179 if (error_found)
9180 {
9181 return false;
9182 }
9183 }
9184
9185 {
9186 symbol_table_t symbol_table;
9187
9188 symbol_table.add_constants();
9189
9190 compositor_t compositor(symbol_table);
9191
9192 compositor
9193 .add(
9194 function_t(
9195 "mandelbrot",
9196 " var width := 118; "
9197 " var height := 41; "
9198 " var imag_max := +1; "
9199 " var imag_min := -1; "
9200 " var real_max := +1; "
9201 " var real_min := -2.5; "
9202 " var x_step := (real_max - real_min) / width; "
9203 " var y_step := (imag_max - imag_min) / height; "
9204 " for (var y := 0; y < height; y += 1) "
9205 " { "
9206 " var imag := imag_min + (y_step * y); "
9207 " for (var x := 0; x < width; x += 1) "
9208 " { "
9209 " var real := real_min + x_step * x; "
9210 " var z_real := real; "
9211 " var z_imag := imag; "
9212 " var plot_value; "
9213 " for (var n := 0; n < 30; n += 1) "
9214 " { "
9215 " var a := z_real^2; "
9216 " var b := z_imag^2; "
9217 " plot_value := n; "
9218 " if ((a + b) < 4) "
9219 " { "
9220 " z_imag := 2 * z_real * z_imag + imag; "
9221 " z_real := a - b + real; "
9222 " } "
9223 " else "
9224 " break; "
9225 " }; "
9226 " }; "
9227 " } "));
9228
9229 std::string expression_str = "mandelbrot()";
9230
9231 expression_t expression;
9232
9233 expression.register_symbol_table(symbol_table);
9234
9235 parser_t parser;
9236
9237 if (!parser.compile(expression_str,expression))
9238 {
9239 printf("run_test19() - Error: %s Expression: %s\n",
9240 parser.error().c_str(),
9241 expression_str.c_str());
9242
9243 return false;
9244 }
9245
9246 for (std::size_t i = 0; i < 100; ++i)
9247 {
9248 expression.value();
9249 }
9250 }
9251
9252 {
9253 T x = T(0);
9254
9255 symbol_table_t symbol_table;
9256
9257 symbol_table.add_variable("x",x);
9258
9259 compositor_t compositor(symbol_table);
9260
9261 compositor
9262 .add(
9263 function_t(
9264 "fooboo",
9265 " var x := input; "
9266 " if (x > 0) "
9267 " fooboo(x - 1) + x; "
9268 " else "
9269 " 0; ",
9270 "input"));
9271
9272 std::string expression_str = "fOoBoO(x)";
9273
9274 expression_t expression;
9275
9276 expression.register_symbol_table(symbol_table);
9277
9278 parser_t parser;
9279
9280 if (!parser.compile(expression_str,expression))
9281 {
9282 printf("run_test19() - Error: %s Expression: %s\n",
9283 parser.error().c_str(),
9284 expression_str.c_str());
9285
9286 return false;
9287 }
9288
9289 T sum = T(0);
9290
9291 for (std::size_t i = 0; i < 100; ++i)
9292 {
9293 x = T(i);
9294
9295 sum += x;
9296
9297 const T result = expression.value();
9298
9299 if (result != sum)
9300 {
9301 printf("run_test19() - FooBoo(%5.2f) Expected: %5.2f\tResult: %5.2f\n",
9302 static_cast<double>(x),
9303 static_cast<double>(sum),
9304 static_cast<double>(result));
9305
9306 return false;
9307 }
9308 }
9309 }
9310
9311 {
9312 const std::pair<std::string,std::string> test_funcprog[] =
9313 {
9314 std::make_pair
9315 (
9316 " var s := depth_to_str(depth); "
9317 " "
9318 " if (depth > 0) "
9319 " { "
9320 " if (recursive(depth - 1) == false) "
9321 " { "
9322 " return [false]; "
9323 " } "
9324 " }; "
9325 " "
9326 " s == depth_to_str(depth); ",
9327
9328 " recursive(1000) "
9329 ),
9330
9331 std::make_pair
9332 (
9333 " var v[7] := [ depth ]; "
9334 " "
9335 " if (depth > 0) "
9336 " { "
9337 " if (recursive(depth - 1) == false) "
9338 " { "
9339 " return [false]; "
9340 " } "
9341 " }; "
9342 " "
9343 " return [sum(v == depth) == v[]]; ",
9344
9345 " recursive(1000) "
9346 ),
9347
9348 std::make_pair
9349 (
9350 " var v1[ 7] := [ depth ]; "
9351 " var v2[21] := [ depth ]; "
9352 " "
9353 " if (depth > 0) "
9354 " { "
9355 " if (recursive(depth - 1) == false) "
9356 " { "
9357 " return [false]; "
9358 " } "
9359 " }; "
9360 " "
9361 " (sum(v1 == depth) == v1[]) and "
9362 " (sum(v2 == depth) == v2[]) ; "
9363 " ",
9364
9365 " recursive(1000) "
9366 ),
9367
9368 std::make_pair
9369 (
9370 " var s := depth_to_str(depth); "
9371 " "
9372 " for (var i := 0; i < 2; i += 1) "
9373 " { "
9374 " if (depth > 0) "
9375 " { "
9376 " if (recursive(depth - 1) == false) "
9377 " { "
9378 " return [false]; "
9379 " } "
9380 " }; "
9381 " }; "
9382 " "
9383 " s == depth_to_str(depth); ",
9384
9385 " recursive(20) "
9386 ),
9387
9388 std::make_pair
9389 (
9390 " var s := depth_to_str(depth); "
9391 " "
9392 " for (var i := 0; i < 2; i += 1) "
9393 " { "
9394 " for (var j := 0; j < 2; j += 1) "
9395 " { "
9396 " if (depth > 0) "
9397 " { "
9398 " if (recursive(depth - 1) == false) "
9399 " { "
9400 " return [false]; "
9401 " } "
9402 " }; "
9403 " }; "
9404 " }; "
9405 " "
9406 " s == depth_to_str(depth); ",
9407
9408 " recursive(10) "
9409 ),
9410
9411 std::make_pair
9412 (
9413 " var v[7] := [ depth ]; "
9414 " "
9415 " for (var i := 0; i < 2; i += 1) "
9416 " { "
9417 " var w[21] := [ depth + 1 ]; "
9418 " "
9419 " if (depth > 0) "
9420 " { "
9421 " if (recursive(depth - 1) == false) "
9422 " { "
9423 " return [false]; "
9424 " } "
9425 " }; "
9426 " "
9427 " if (sum(w == (depth + 1)) != w[]) "
9428 " { "
9429 " return [false]; "
9430 " }; "
9431 " }; "
9432 " "
9433 " return [sum(v == depth) == v[]]; ",
9434
9435 " recursive(5) "
9436 ),
9437
9438 std::make_pair
9439 (
9440 " var v[7] := [ depth ]; "
9441 " "
9442 " for (var i := 0; i < 2; i += 1) "
9443 " { "
9444 " var u[21] := [ depth + 1 ]; "
9445 " "
9446 " for (var j := 0; j < 2; j += 1) "
9447 " { "
9448 " var w[35] := [ depth + 2 ]; "
9449 " "
9450 " if (depth > 0) "
9451 " { "
9452 " if (recursive(depth - 1) == false) "
9453 " { "
9454 " return [false]; "
9455 " } "
9456 " }; "
9457 " "
9458 " if (sum(w == (depth + 2)) != w[]) "
9459 " { "
9460 " return [false]; "
9461 " }; "
9462 " }; "
9463 " "
9464 " if (sum(u == (depth + 1)) != u[]) "
9465 " { "
9466 " return [false]; "
9467 " }; "
9468 " }; "
9469 " "
9470 " return [sum(v == depth) == v[]]; ",
9471
9472 " recursive(5) "
9473 ),
9474
9475 std::make_pair
9476 (
9477 " var s := depth_to_str(depth); "
9478 " var v[7] := [ depth ]; "
9479 " "
9480 " if (depth > 0) "
9481 " { "
9482 " if (recursive(depth - 1) == false) "
9483 " { "
9484 " return [false]; "
9485 " } "
9486 " }; "
9487 " "
9488 " return "
9489 " [ "
9490 " (s == depth_to_str(depth)) and "
9491 " (sum(v == depth) == v[]) "
9492 " ]; ",
9493
9494 " recursive(1000) "
9495 ),
9496
9497 std::make_pair
9498 (
9499 " var s0 := depth_to_str(depth); "
9500 " var v0[7] := [ depth ]; "
9501 " var s1 := depth_to_str(depth); "
9502 " var v1[42] := [ depth ]; "
9503 " "
9504 " if (depth > 0) "
9505 " { "
9506 " if (recursive(depth - 1) == false) "
9507 " { "
9508 " return [false]; "
9509 " } "
9510 " }; "
9511 " "
9512 " return "
9513 " [ "
9514 " (s0 == depth_to_str(depth)) and "
9515 " (sum(v0 == depth) == v0[]) and "
9516 " (s1 == depth_to_str(depth)) and "
9517 " (sum(v1 == depth) == v1[]) "
9518 " ]; ",
9519
9520 " recursive(1000) "
9521 ),
9522
9523 std::make_pair
9524 (
9525 " var s := depth_to_str(depth); "
9526 " var v[7] := [ depth ]; "
9527 " "
9528 " for (var i := 0; i < 2; i += 1) "
9529 " { "
9530 " if (depth > 0) "
9531 " { "
9532 " if (recursive(depth - 1) == false) "
9533 " { "
9534 " return [false]; "
9535 " } "
9536 " }; "
9537 " }; "
9538 " "
9539 " return "
9540 " [ "
9541 " (s == depth_to_str(depth)) and "
9542 " (sum(v == depth) == v[]) "
9543 " ]; ",
9544
9545 " recursive(15) "
9546 ),
9547
9548 std::make_pair
9549 (
9550 " var s0 := depth_to_str(depth); "
9551 " var v0[7] := [ depth ]; "
9552 " var s1 := depth_to_str(depth); "
9553 " var v1[42] := [ depth ]; "
9554 " "
9555 " for (var i := 0; i < 2; i += 1) "
9556 " { "
9557 " if (depth > 0) "
9558 " { "
9559 " if (recursive(depth - 1) == false) "
9560 " { "
9561 " return [false]; "
9562 " } "
9563 " }; "
9564 " }; "
9565 " "
9566 " return "
9567 " [ "
9568 " (s0 == depth_to_str(depth)) and "
9569 " (sum(v0 == depth) == v0[]) and "
9570 " (s1 == depth_to_str(depth)) and "
9571 " (sum(v1 == depth) == v1[]) "
9572 " ]; ",
9573
9574 " recursive(15) "
9575 ),
9576
9577 std::make_pair
9578 (
9579 " var s0 := depth_to_str(depth); "
9580 " var v0[7] := [ depth ]; "
9581 " "
9582 " for (var i := 0; i < 2; i += 1) "
9583 " { "
9584 " var s1 := depth_to_str(depth); "
9585 " var v1[21] := [ depth + 1 ]; "
9586 " "
9587 " if (depth > 0) "
9588 " { "
9589 " if (recursive(depth - 1) == false) "
9590 " { "
9591 " return [false]; "
9592 " } "
9593 " }; "
9594 " "
9595 " if (s1 != depth_to_str(depth)) "
9596 " { "
9597 " return [false]; "
9598 " }; "
9599 " "
9600 " if (sum(v1 == (depth + 1)) != v1[]) "
9601 " { "
9602 " return [false]; "
9603 " }; "
9604 " }; "
9605 " "
9606 " return "
9607 " [ "
9608 " (s0 == depth_to_str(depth)) and "
9609 " (sum(v0 == depth) == v0[]) "
9610 " ]; ",
9611
9612 " recursive(15) "
9613 ),
9614
9615 std::make_pair
9616 (
9617 " if (depth < 2) "
9618 " depth; "
9619 " else "
9620 " recursive(depth - 1) + "
9621 " recursive(depth - 2) ; ",
9622
9623 " var n := 20; "
9624 " var total := 0; "
9625 " "
9626 " for (var i := 0; i < n; i += 1) "
9627 " { "
9628 " total += recursive(i); "
9629 " }; "
9630 " "
9631 " total == 10945; "
9632 )
9633 };
9634
9635 const std::size_t test_funcprog_size = sizeof(test_funcprog) / sizeof(std::pair<std::string,std::string>);
9636 const std::size_t rounds = 5;
9637
9638 bool result = true;
9639
9640 for (std::size_t r = 0; r < rounds; ++r)
9641 {
9642 for (std::size_t i = 0; i < test_funcprog_size; ++i)
9643 {
9644 depth_to_str<T> dts;
9645
9646 symbol_table_t symbol_table;
9647 symbol_table.add_function("depth_to_str",dts);
9648
9649 compositor_t compositor(symbol_table);
9650
9651 const bool comp_result = compositor.add(
9652 function_t("recursive")
9653 .var("depth")
9654 .expression
9655 ( test_funcprog[i].first ));
9656
9657 if (!comp_result)
9658 {
9659 printf("run_test19() - Compositor Error: %s\nfunction: %s\n",
9660 compositor.error().c_str(),
9661 test_funcprog[i].first.c_str());
9662
9663 result = false;
9664 continue;
9665 }
9666
9667 expression_t expression;
9668 expression.register_symbol_table(symbol_table);
9669
9670 parser_t parser;
9671
9672 if (!parser.compile(test_funcprog[i].second, expression))
9673 {
9674 printf("run_test19() - Error: %s Expression: %s\n",
9675 parser.error().c_str(),
9676 test_funcprog[i].second.c_str());
9677
9678 result = false;
9679 continue;
9680 }
9681
9682 if (T(1) != expression.value())
9683 {
9684 printf("run_test19() - Evaluation Error: test_funcprog %d function: %s\n",
9685 static_cast<int>(i),
9686 test_funcprog[i].second.c_str());
9687
9688 result = false;
9689 continue;
9690 }
9691 }
9692
9693 if (!result)
9694 {
9695 return false;
9696 }
9697 }
9698 }
9699
9700 {
9701 symbol_table_t symbol_table;
9702
9703 symbol_table.add_constants();
9704
9705 const std::string expression_string =
9706 " var sieve[10^7] := [false]; "
9707 " var m := trunc(sqrt(sieve[])); "
9708 " "
9709 " sieve[0] := true; "
9710 " sieve[1] := true; "
9711 " "
9712 " for (var i := 0; i <= m; i += 1) "
9713 " { "
9714 " if (false == sieve[i]) "
9715 " { "
9716 " for (var j := (i * i); j < sieve[]; j += i) "
9717 " { "
9718 " sieve[j] := true; "
9719 " } "
9720 " } "
9721 " }; "
9722 " "
9723 " var prime_count := 0; "
9724 " for (var i := 0; i < sieve[]; i += 1) "
9725 " { "
9726 " if (false == sieve[i]) "
9727 " { "
9728 " prime_count += 1; "
9729 " }; "
9730 " }; "
9731 " "
9732 " prime_count == 664579; ";
9733
9734 expression_t expression;
9735
9736 expression.register_symbol_table(symbol_table);
9737
9738 parser_t parser;
9739
9740 if (!parser.compile(expression_string,expression))
9741 {
9742 printf("run_test19() - Error: %s Expression: %s\n",
9743 parser.error().c_str(),
9744 expression_string.c_str());
9745
9746 return false;
9747 }
9748
9749 if (T(1) != expression.value())
9750 {
9751 printf("run_test19() - Prime Sieve Computation Error");
9752
9753 return false;
9754 }
9755 }
9756
9757 {
9758 symbol_table_t symbol_table;
9759
9760 symbol_table.add_constants();
9761
9762 const std::string expression_str[] =
9763 {
9764 "var delta := 10^-7; var total := 0; for (var i := 0; i <= 3; i += delta) { total += "
9765 "erf(i) }; abs((delta * total) - (3 * erf(3) + (1 / exp(9) - 1) / sqrt(pi))) < 0.000001",
9766
9767 "var delta := 10^-7; var total := 0; for (var i := 0; i <= 3; i += delta) { total += "
9768 "erfc(i) }; abs((delta * total) - (3 * erfc(3) + ((1 - 1 / exp(9)) / sqrt(pi)))) < 0.000001"
9769 };
9770
9771 expression_t e[2];
9772
9773 parser_t parser;
9774
9775 for (std::size_t i = 0; i < 2; ++i)
9776 {
9777 e[i].register_symbol_table(symbol_table);
9778
9779 if (!parser.compile(expression_str[i],e[i]))
9780 {
9781 printf("run_test19() - Error: %s Expression: %s\n",
9782 parser.error().c_str(),
9783 expression_str[i].c_str());
9784
9785 return false;
9786 }
9787
9788 if (T(1) != e[i].value())
9789 {
9790 printf("run_test19() - erf/erfc computation error %d",
9791 static_cast<unsigned int>(i));
9792
9793 return false;
9794 }
9795 }
9796 }
9797
9798 return true;
9799}
type sqrt(const type v)

References expression_list, not_equal(), rounds, and real::sqrt().

Here is the call graph for this function:

◆ run_test20()

template<typename T >
bool run_test20 ( )
inline

Definition at line 9924 of file exprtk_real_test.cpp.

9925{
9926 typedef exprtk::expression<T> expression_t;
9927
9928 {
9929 for (std::size_t i = 0; i < 100; ++i)
9930 {
9931 exprtk::symbol_table<T> symbol_table0; // primary symbol_table
9932 exprtk::symbol_table<T> symbol_table1;
9933 exprtk::symbol_table<T> symbol_table2;
9934 exprtk::symbol_table<T> symbol_table3;
9935
9936 symbol_table0.add_constants();
9937
9938 expression_t expression;
9939 expression.register_symbol_table(symbol_table0);
9940 expression.register_symbol_table(symbol_table1);
9941 expression.register_symbol_table(symbol_table2);
9942 expression.register_symbol_table(symbol_table3);
9943
9944 exprtk::parser<T> parser;
9945
9946 my_usr<T> musr;
9947 musr.next_value(true);
9948 parser.enable_unknown_symbol_resolver(&musr);
9949
9950 std::string expr_str = "v01+c02+v03+c04+v05+c06+v07+c08+v09+c10+"
9951 "v11+c12+v13+c14+v15+c16+v17+c18+v19+c20+"
9952 "v21+c22+v23+c24+v25+c26+v27+c28+v29+c30 ";
9953
9954 if (!parser.compile(expr_str,expression))
9955 {
9956 printf("run_test20() - [1] Error: %s Expression: %s\n",
9957 parser.error().c_str(),
9958 expr_str.c_str());
9959
9960 return false;
9961 }
9962
9963 T sum_1_30 = T((1 + 30) * 15);
9964 T result = expression.value();
9965
9966 if (sum_1_30 != result)
9967 {
9968 printf("run_test20() - [1] Error in evaluation! (1) Expression: %s\n",
9969 expr_str.c_str());
9970
9971 return false;
9972 }
9973 }
9974 }
9975
9976 {
9977 for (std::size_t i = 0; i < 100; ++i)
9978 {
9979 exprtk::symbol_table<T> symbol_table0; // primary symbol_table
9980 exprtk::symbol_table<T> symbol_table1;
9981 exprtk::symbol_table<T> symbol_table2;
9982 exprtk::symbol_table<T> symbol_table3;
9983
9984 symbol_table0.add_constants();
9985
9986 expression_t expression;
9987 expression.register_symbol_table(symbol_table0);
9988 expression.register_symbol_table(symbol_table1);
9989 expression.register_symbol_table(symbol_table2);
9990 expression.register_symbol_table(symbol_table3);
9991
9992 exprtk::parser<T> parser;
9993
9994 my_usr_ext<T> musr;
9995 parser.enable_unknown_symbol_resolver(&musr);
9996
9997 std::string expr_str = "foo6(foo1(v0),foo2(c1,foo4(v2,c3,v4,c5)),foo3"
9998 "(v6,c7,foo5(v8,c9,v10,c11,v12)),c13,v14,c15) ";
9999
10000 if (!parser.compile(expr_str,expression))
10001 {
10002 printf("run_test20() - [2] Error: %s Expression: %s\n",
10003 parser.error().c_str(),
10004 expr_str.c_str());
10005
10006 return false;
10007 }
10008 }
10009 }
10010
10011 {
10012 T var;
10013 std::string str;
10014 std::vector<T> vec(10,0.0);
10015
10016 typedef exprtk::symbol_table<T> symbol_table_t;
10017 typedef exprtk::expression<T> expression_t;
10018
10019 bool result = true;
10020
10021 {
10022 symbol_table_t symbol_table;
10023
10024 symbol_table.add_variable ("val",var);
10025 symbol_table.add_stringvar("str",str);
10026 symbol_table.add_vector ("vec",vec);
10027
10028 if (symbol_table.get_variable("val") == 0 || !symbol_table.symbol_exists("val"))
10029 {
10030 printf("run_test20() - [3] Failed to get 'val' from symbol_table\n");
10031 result = false;
10032 }
10033
10034 if (symbol_table.get_stringvar("str") == 0 || !symbol_table.symbol_exists("str"))
10035 {
10036 printf("run_test20() - [3] Failed to get 'str' from symbol_table\n");
10037 result = false;
10038 }
10039
10040 if (symbol_table.get_vector("vec") == 0 || !symbol_table.symbol_exists("vec"))
10041 {
10042 printf("run_test20() - [3] Failed to get 'vec' from symbol_table\n");
10043 result = false;
10044 }
10045 }
10046
10047 if (!result)
10048 return result;
10049
10050 {
10051 symbol_table_t symbol_table;
10052
10053 symbol_table.add_variable("val",var);
10054
10055 if (symbol_table.get_variable("val") == 0 || !symbol_table.symbol_exists("val"))
10056 {
10057 printf("run_test20() - [4] Failed to get 'val' from symbol_table\n");
10058 result = false;
10059 }
10060
10061 if (symbol_table.get_stringvar("str") != 0 || symbol_table.symbol_exists("str"))
10062 {
10063 printf("run_test20() - [4] Failed to get 'str' from symbol_table\n");
10064 result = false;
10065 }
10066
10067 if (symbol_table.get_vector("vec") != 0 || symbol_table.symbol_exists("vec"))
10068 {
10069 printf("run_test20() - [4] Failed to get 'vec' from symbol_table\n");
10070 result = false;
10071 }
10072 }
10073
10074 if (!result)
10075 return result;
10076
10077 {
10078 symbol_table_t symbol_table;
10079
10080 symbol_table.add_stringvar("str",str);
10081
10082 if (symbol_table.get_stringvar("str") == 0 || !symbol_table.symbol_exists("str"))
10083 {
10084 printf("run_test20() - [5] Failed to get 'str' from symbol_table\n");
10085 result = false;
10086 }
10087
10088 if (symbol_table.get_variable("val") != 0 || symbol_table.symbol_exists("val"))
10089 {
10090 printf("run_test20() - [5] Failed to get 'val' from symbol_table\n");
10091 result = false;
10092 }
10093
10094 if (symbol_table.get_vector("vec") != 0 || symbol_table.symbol_exists("vec"))
10095 {
10096 printf("run_test20() - [5] Failed to get 'vec' from symbol_table\n");
10097 result = false;
10098 }
10099 }
10100
10101 if (!result)
10102 return result;
10103
10104 {
10105 symbol_table_t symbol_table;
10106
10107 symbol_table.add_vector("vec",vec);
10108
10109 if (symbol_table.get_vector("vec") == 0 || !symbol_table.symbol_exists("vec"))
10110 {
10111 printf("run_test20() - [6] Failed to get 'vec' from symbol_table\n");
10112 result = false;
10113 }
10114
10115 if (symbol_table.get_variable("val") != 0 || symbol_table.symbol_exists("val"))
10116 {
10117 printf("run_test20() - [6] Failed to get 'val' from symbol_table\n");
10118 result = false;
10119 }
10120
10121 if (symbol_table.get_stringvar("str") != 0 || symbol_table.symbol_exists("str"))
10122 {
10123 printf("run_test20() - [6] Failed to get 'str' from symbol_table\n");
10124 result = false;
10125 }
10126 }
10127
10128 if (!result)
10129 return result;
10130
10131 {
10132 symbol_table_t symbol_table1;
10133 symbol_table_t symbol_table2;
10134 expression_t expression;
10135
10136 if (!expression.register_symbol_table(symbol_table1))
10137 {
10138 printf("run_test20() - Failed to register symbol_table1 with expression\n");
10139 result = false;
10140 }
10141
10142 if (!expression.register_symbol_table(symbol_table2))
10143 {
10144 printf("run_test20() - Failed to register symbol_table2 with expression\n");
10145 result = false;
10146 }
10147
10148 if (expression.num_symbol_tables() != 2)
10149 {
10150 printf("run_test20() - Invalid number of symbol tables in expression [1]\n");
10151 result = false;
10152 }
10153
10154 if (expression.register_symbol_table(symbol_table1))
10155 {
10156 printf("run_test20() - Error: was able to register symbol_table1 with expression\n");
10157 result = false;
10158 }
10159
10160 if (expression.register_symbol_table(symbol_table2))
10161 {
10162 printf("run_test20() - Error: was able to register symbol_table2 with expression\n");
10163 result = false;
10164 }
10165
10166 if (expression.num_symbol_tables() != 2)
10167 {
10168 printf("run_test20() - Invalid number of symbol tables in expression [2]\n");
10169 result = false;
10170 }
10171
10172 symbol_table_t symbol_table12 = symbol_table1;
10173 symbol_table_t symbol_table22 = symbol_table2;
10174
10175 if (expression.register_symbol_table(symbol_table12))
10176 {
10177 printf("run_test20() - Error: was able to register symbol_table12 with expression\n");
10178 result = false;
10179 }
10180
10181 if (expression.register_symbol_table(symbol_table22))
10182 {
10183 printf("run_test20() - Error: was able to register symbol_table22 with expression\n");
10184 result = false;
10185 }
10186
10187 if (expression.num_symbol_tables() != 2)
10188 {
10189 printf("run_test20() - Invalid number of symbol tables in expression [3]\n");
10190 result = false;
10191 }
10192
10193 symbol_table12 = symbol_table_t();
10194 symbol_table22 = symbol_table_t();
10195
10196 if (!expression.register_symbol_table(symbol_table12))
10197 {
10198 printf("run_test20() - Failed to register symbol_table12 with expression [2]\n");
10199 result = false;
10200 }
10201
10202 if (!expression.register_symbol_table(symbol_table22))
10203 {
10204 printf("run_test20() - Failed to register symbol_table22 with expression [2]\n");
10205 result = false;
10206 }
10207
10208 if (expression.num_symbol_tables() != 4)
10209 {
10210 printf("run_test20() - Invalid number of symbol tables in expression [4]\n");
10211 result = false;
10212 }
10213 }
10214
10215 if (!result)
10216 return result;
10217
10218 }
10219
10220 return true;
10221}
void enable_unknown_symbol_resolver(unknown_symbol_resolver *usr=reinterpret_cast< unknown_symbol_resolver * >(0))
Definition exprtk.hpp:24762
T next_value(const bool reset=false)

References exprtk::symbol_table< T >::add_constants(), exprtk::parser< T >::compile(), exprtk::parser< T >::enable_unknown_symbol_resolver(), exprtk::parser< T >::error(), and my_usr< T >::next_value().

Here is the call graph for this function:

◆ run_test21()

template<typename T >
bool run_test21 ( )
inline

Definition at line 10322 of file exprtk_real_test.cpp.

10323{
10324 typedef exprtk::symbol_table<T> symbol_table_t;
10325 typedef exprtk::expression<T> expression_t;
10326 typedef exprtk::parser<T> parser_t;
10327 typedef exprtk::parser_error::type error_type;
10328
10329 {
10330 T x = T(1.1);
10331 T y = T(2.2);
10332 T z = T(3.3);
10333
10334 symbol_table_t symbol_table;
10335 symbol_table.add_constants();
10336 symbol_table.add_variable("x",x);
10337 symbol_table.add_variable("y",y);
10338 symbol_table.add_variable("z",z);
10339
10340 static const std::string expression_list[] =
10341 {
10342 "return[]; x;",
10343 "return[x]; x;",
10344 "return[x,y]; x;",
10345 "return[x + y,y - x]; x;",
10346 "return[x + y,y - x,'abc']; x;",
10347 "if (x < y) return [1,'abc1']; else return [2,'abc2',x];" ,
10348 "if (x > y) return [1,'abc1']; else return [2,'abc2',x];" ,
10349 "if (x < y) { return [1,'abc1'];} else { return [2,'abc2',x];}",
10350 "if (x > y) { return [1,'abc1'];} else { return [2,'abc2',x];}",
10351 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1]; } ",
10352 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc']; } ",
10353 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc',x]; }",
10354 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc',x,y]; }",
10355 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc',x,y,z]; }",
10356 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [2,'abc2',x]; else x += 1; }",
10357 "for(var i := 0; i < 10; i += 1) { if (i == 5) { return [1,'abc1'];} else x += 1; }"
10358 };
10359
10360 static const std::string result_list[] =
10361 {
10362 "" ,
10363 "T" ,
10364 "TT" ,
10365 "TT" ,
10366 "TTS" ,
10367 "TS" ,
10368 "TST" ,
10369 "TS" ,
10370 "TST" ,
10371 "T" ,
10372 "TS" ,
10373 "TST" ,
10374 "TSTT" ,
10375 "TSTTT",
10376 "TST" ,
10377 "TS"
10378 };
10379
10380 static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
10381
10382 bool error_found = false;
10383
10384 for (std::size_t i = 0; i < expression_list_size; ++i)
10385 {
10386 expression_t expression;
10387 expression.register_symbol_table(symbol_table);
10388
10389 parser_t parser;
10390
10391 if (!parser.compile(expression_list[i],expression))
10392 {
10393 printf("run_test21() - Error: %s Expression: %s [1]\n",
10394 parser.error().c_str(),
10395 expression_list[i].c_str());
10396
10397 error_found = true;
10398 continue;
10399 }
10400 else if (!parser.dec().return_present())
10401 {
10402 printf("run_test21() - Expected a return statement Expression: %s [1]\n",
10403 expression_list[i].c_str());
10404
10405 error_found = true;
10406 continue;
10407 }
10408
10409 expression.value();
10410
10411 std::string pattern = results_to_string<T>(expression.results());
10412
10413 if (!expression.return_invoked())
10414 {
10415 printf("run_test21() - Invalid return invoke state [1] Expression: %s\n",
10416 expression_list[i].c_str());
10417
10418 error_found = true;
10419 continue;
10420 }
10421 else if (result_list[i] != pattern)
10422 {
10423 printf("run_test21() - Invalid return results [1] Expected %s Got: %s Expression: %s\n",
10424 result_list[i].c_str(),
10425 pattern.c_str(),
10426 expression_list[i].c_str());
10427
10428 error_found = true;
10429 continue;
10430 }
10431 }
10432
10433 if (error_found)
10434 {
10435 return false;
10436 }
10437 }
10438
10439 {
10440 T x = T(1.1);
10441 T y = T(2.2);
10442 T z = T(3.3);
10443
10444 symbol_table_t symbol_table;
10445 symbol_table.add_constants();
10446 symbol_table.add_variable("x",x);
10447 symbol_table.add_variable("y",y);
10448 symbol_table.add_variable("z",z);
10449
10450 static const std::string expression_list[] =
10451 {
10452 "x := 1; x + 1; x + 2; x + 3; x + 5; x + 7; return [x + 1]; ",
10453 "x := 1; x + 1; x + 2; x + 3; x + 5; return [x + 1]; x := 7; ",
10454 "x := 1; x + 1; x + 2; x + 3; return [x + 1]; x + 5; x := 7; ",
10455 "x := 1; x + 1; x + 2; return [x + 1]; x + 3; x + 5; x := 7; ",
10456 "x := 1; x + 1; return [x + 1]; x + 2; x + 3; x + 5; x := 7; ",
10457 "x := 1; return [x + 1]; x + 1; x + 2; x + 3; x + 5; x := 7; ",
10458 "return [x + 1]; x := 1; x + 1; x + 2; x + 3; x + 5; x := 7; ",
10459 "~{x := 1; x + 1; x + 2; x + 3; x + 5; x + 7; return [x + 1]}",
10460 "~{x := 1; x + 1; x + 2; x + 3; x + 5; return [x + 1]; x := 7}",
10461 "~{x := 1; x + 1; x + 2; x + 3; return [x + 1]; x + 5; x := 7}",
10462 "~{x := 1; x + 1; x + 2; return [x + 1]; x + 3; x + 5; x := 7}",
10463 "~{x := 1; x + 1; return [x + 1]; x + 2; x + 3; x + 5; x := 7}",
10464 "~{x := 1; return [x + 1]; x + 1; x + 2; x + 3; x + 5; x := 7}",
10465 "~{return [x + 1]; x := 1; x + 1; x + 2; x + 3; x + 5; x := 7}"
10466 };
10467
10468 static const std::string result_list[] =
10469 {
10470 "T", "T", "T", "T", "T", "T", "T",
10471 "T", "T", "T", "T", "T", "T", "T",
10472 };
10473
10474 static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
10475
10476 bool error_found = false;
10477
10478 for (std::size_t i = 0; i < expression_list_size; ++i)
10479 {
10480 expression_t expression;
10481 expression.register_symbol_table(symbol_table);
10482
10483 parser_t parser;
10484
10485 if (!parser.compile(expression_list[i],expression))
10486 {
10487 printf("run_test21() - Error: %s Expression: %s [2]\n",
10488 parser.error().c_str(),
10489 expression_list[i].c_str());
10490
10491 error_found = true;
10492 continue;
10493 }
10494 else if (!parser.dec().return_present())
10495 {
10496 printf("run_test21() - Expected a return statement Expression: %s [2]\n",
10497 expression_list[i].c_str());
10498
10499 error_found = true;
10500 continue;
10501 }
10502
10503 expression.value();
10504
10505 std::string pattern = results_to_string<T>(expression.results());
10506
10507 if (!expression.return_invoked())
10508 {
10509 printf("run_test21() - Invalid return invoke state [2] Expression: %s\n",
10510 expression_list[i].c_str());
10511
10512 error_found = true;
10513 continue;
10514 }
10515 else if (result_list[i] != pattern)
10516 {
10517 printf("run_test21() - Invalid return results [2] Expected %s Got: %s Expression: %s\n",
10518 result_list[i].c_str(),
10519 pattern.c_str(),
10520 expression_list[i].c_str());
10521
10522 error_found = true;
10523 continue;
10524 }
10525 else if (!result_equal(expression.results(), x + T(1)))
10526 {
10527 printf("run_test21() - Invalid return results [2] Expected %s Got: %s Expression: %s\n",
10528 result_list[i].c_str(),
10529 pattern.c_str(),
10530 expression_list[i].c_str());
10531
10532 error_found = true;
10533 continue;
10534 }
10535 }
10536
10537 if (error_found)
10538 {
10539 return false;
10540 }
10541 }
10542
10543 {
10544 T x = 1.0;
10545 T y = 2.0;
10546 T z = 3.0;
10547
10548 T v[] = {0 , 1, 2, 3 };
10549 std::string s = "Hello ";
10550
10551 myfunc<T> mf;
10552
10553 symbol_table_t symbol_table;
10554 expression_t expression;
10555 parser_t parser;
10556
10557 symbol_table.add_variable ("x", x);
10558 symbol_table.add_variable ("y", y);
10559 symbol_table.add_variable ("z", z);
10560 symbol_table.add_vector ("v", v);
10561 symbol_table.add_stringvar("s", s);
10562
10563 expression.register_symbol_table(symbol_table);
10564
10565 const std::string expression_str =
10566 " if (x > y) "
10567 " return [1]; "
10568 " else "
10569 " return [ x, x + y, 2 * v, s + 'world' ]; ";
10570
10571 if (!parser.compile(expression_str, expression))
10572 {
10573 printf("run_test21() - ERROR: %s\tExpression: %s\n",
10574 parser.error().c_str(),
10575 expression_str.c_str());
10576 return false;
10577 }
10578
10579 expression.value();
10580
10581 typedef exprtk::results_context<T> results_context_t;
10582 const results_context_t& results = expression.results();
10583
10584 if (results.count() != 4)
10585 {
10586 printf("run_test21() - ERROR Expected 4 return results, instead got: %d\n",
10587 static_cast<unsigned int>(results.count()));
10588 return false;
10589 }
10590
10591 T result_x0;
10592 T result_x1;
10593 std::string result_s;
10594 std::vector<T> result_v;
10595
10596 const T expected_result_v[] = {0 , 2, 4, 6 };
10597 const std::string expected_result_s = "Hello world";
10598
10599 if (!results.get_scalar(0,result_x0))
10600 {
10601 printf("run_test21() - ERROR Failed to get scalar index0 from return result!\n");
10602 return false;
10603 }
10604 else if (result_x0 != T(1))
10605 {
10606 printf("run_test21() - ERROR result_x0 is not expected value!\n");
10607 return false;
10608 }
10609 else if (!results.get_scalar(1,result_x1))
10610 {
10611 printf("run_test21() - ERROR Failed to get scalar index1 from return result!\n");
10612 return false;
10613 }
10614 else if (result_x1 != T(3))
10615 {
10616 printf("run_test21() - ERROR result_x1 is not expected value!\n");
10617 return false;
10618 }
10619 else if (!results.get_vector(2,result_v))
10620 {
10621 printf("run_test21() - ERROR Failed to get vector from return result!\n");
10622 return false;
10623 }
10624 else if (
10625 (result_v.size() != (sizeof(expected_result_v) / sizeof(T))) ||
10626 !std::equal(result_v.begin(),result_v.end(),expected_result_v)
10627 )
10628 {
10629 printf("run_test21() - ERROR result_v is not expected value!\n");
10630 return false;
10631 }
10632 else if (!results.get_string(3,result_s))
10633 {
10634 printf("run_test21() - ERROR Failed to get string from return result!\n");
10635 return false;
10636 }
10637 else if (result_s != expected_result_s)
10638 {
10639 printf("run_test21() - ERROR result_s is not expected value!\n");
10640 return false;
10641 }
10642 }
10643
10644 {
10645 const std::string invalid_expressions[] =
10646 {
10647 "x := 1",
10648 "x += 1",
10649 "v := 1 + v",
10650 "v += 1",
10651 "v += x + 1",
10652 "v += v",
10653 "v[0] += x",
10654 "v[1] += x",
10655 "v[2] += x",
10656 "v[3] += x",
10657 "v[4] += x",
10658 "var i := 2; v[i] := x",
10659 "var i := 2; v[i] += x",
10660 "s := 'abc' + s",
10661 "s[0:2] := 'abc'",
10662 "s[1:3] := 'abc'",
10663 "aa[4:4] := bb",
10664 "aa[1:3] := bb",
10665 "var i := 2; aa[i:3] := bb",
10666 "var i := 2; aa[i+1:3] := bb",
10667 "var i := 2; aa[0:i] := bb",
10668 "var i := 2; aa[0:i+1] := bb",
10669 "var i := 1; var j := 3; aa[i:j] := bb",
10670 "var i := 1; var j := 3; aa[i+1:j] := bb",
10671 "var i := 1; var j := 3; aa[i:j+1] := bb",
10672 "var i := 1; var j := 3; aa[i+1:j+1] := bb",
10673 };
10674
10675 const std::size_t invalid_expressions_size = sizeof(invalid_expressions) / sizeof(std::string);
10676
10677 for (std::size_t i = 0; i < invalid_expressions_size; ++i)
10678 {
10679 symbol_table_t mutable_symbol_table;
10680 symbol_table_t immutable_symbol_table(symbol_table_t::e_immutable);
10681
10682 T x = 0.0;
10683 T v[5];
10684 std::string s = "xyz";
10685 std::string aa = "0123456789";
10686 std::string bb = "A";
10687
10688 T x_ = 0.0;
10689 T v_[5];
10690 std::string s_ = "xyz";
10691
10692 std::string a_ = "0123456789";
10693 std::string b_ = "A";
10694
10695 immutable_symbol_table.add_variable ("x" , x );
10696 immutable_symbol_table.add_vector ("v" , v );
10697 immutable_symbol_table.add_stringvar("s" , s );
10698 immutable_symbol_table.add_stringvar("aa", aa);
10699 immutable_symbol_table.add_stringvar("bb", bb);
10700
10701 mutable_symbol_table.add_variable ("x_", x_);
10702 mutable_symbol_table.add_vector ("v_", v_);
10703 mutable_symbol_table.add_stringvar ("s_", s_);
10704 mutable_symbol_table.add_stringvar ("a_", a_);
10705 mutable_symbol_table.add_stringvar ("b_", b_);
10706
10707 const std::string& expression_str = invalid_expressions[i];
10708 expression_t expression;
10709 expression.register_symbol_table(immutable_symbol_table);
10710 expression.register_symbol_table(mutable_symbol_table );
10711
10712 parser_t parser;
10713 const bool compile_result = parser.compile(expression_str, expression);
10714
10715 if (compile_result)
10716 {
10717 expression.value();
10718 printf("run_test21() - Invalid expression due to immutability was successfully compiled. Expression: %s\n",
10719 expression_str.c_str());
10720 }
10721 }
10722 }
10723
10724 {
10725 T x = 1.1;
10726 T y = 2.2;
10727 T z = 3.3;
10728 T w = 4.4;
10729
10730 symbol_table_t mutable_symbol_table;
10731 symbol_table_t immutable_symbol_table(symbol_table_t::e_immutable);
10732
10733 mutable_symbol_table.add_variable("x", x);
10734 mutable_symbol_table.add_variable("y", y);
10735
10736 immutable_symbol_table.add_variable("w", w);
10737 immutable_symbol_table.add_variable("z", z);
10738
10739 expression_t expression;
10740 expression.register_symbol_table(mutable_symbol_table );
10741 expression.register_symbol_table(immutable_symbol_table);
10742
10743 parser_t parser;
10744
10745 typedef std::pair<std::string,bool> local_test_t;
10746
10747 const local_test_t expressions[] =
10748 {
10749 std::make_pair<std::string,bool>("x := y + (z / w)" , true ),
10750 std::make_pair<std::string,bool>("y := y / x + (z / w)" , true ),
10751 std::make_pair<std::string,bool>("z := y + x - w" , false),
10752 std::make_pair<std::string,bool>("z == (w += y / x)" , false)
10753 };
10754
10755 const std::size_t expressions_size = sizeof(expressions) / sizeof(local_test_t);
10756
10757 bool error_found = false;
10758
10759 for (std::size_t i = 0; i < expressions_size; ++i)
10760 {
10761 const std::string expression_str = expressions[i].first;
10762 const bool expected_compile_result = expressions[i].second;
10763
10764 if (expected_compile_result != parser.compile(expression_str, expression))
10765 {
10766 printf("run_test21() - Invalid compilation of expression. Expected compile result: %c Expression: %s\n",
10767 expected_compile_result ? 'T' : 'F',
10768 expression_str.c_str());
10769
10770 error_found = true;
10771 }
10772
10773 x += 1.1;
10774 y += 2.2;
10775 z += 3.3;
10776 w += 4.4;
10777
10778 expression.value();
10779 }
10780
10781 if (error_found)
10782 {
10783 return false;
10784 }
10785 }
10786
10787 {
10788 typedef typename parser_t::settings_store settings_t;
10789
10790 const std::string expressions[] =
10791 {
10792 "var result := 0; if (true) { result := 2 } if (true) { result := 3 }; result",
10793 "var result := 0; if (true) { result := 2 }; if (true) { result := 3 } result",
10794 "var result := 0; if (true) { result := 2 } if (true) { result := 3 } result",
10795 "var result := 0; var x:=1; if (x > 0) { result := 2 } else if (x > 0) { result := 3 } result",
10796 "var result := 0; var x := 1; if (x > 0) { result := 2 } if (x > 0) { result := 3 }; result",
10797 "var result := 0; var x := 1; if (x > 0) { result := 2 }; if (x > 0) { result := 3 } result",
10798 "var result := 0; var x := 1; if (x > 0) { result := 2 } if (x > 0) { result := 3 } result",
10799 "var result := 0; var x := 1; if (x > 0) { result := 2 } else if (x > 0) { result := 3 } result",
10800 "var result := 0; var x := 1; if (x > 0) result := 2 else if (x > 0) { result := 3 } result",
10801 "var result := 0; var x := 1; if (x > 0) {result := 2 } else if (x > 0) result := 3 result"
10802 };
10803
10804 const std::size_t expressions_size = sizeof(expressions) / sizeof(std::string);
10805
10806 static const std::size_t compile_options =
10807 settings_t::e_replacer +
10808 settings_t::e_joiner +
10809 settings_t::e_numeric_check +
10810 settings_t::e_bracket_check +
10811 settings_t::e_sequence_check +
10812 settings_t::e_strength_reduction;
10813
10814 const settings_t settings(compile_options);
10815 parser_t parser(settings);
10816
10817 bool error_found = false;
10818
10819 for (std::size_t e = 0; e < expressions_size; ++e)
10820 {
10821 const std::string& expression_string = expressions[e];
10822 expression_t expression;
10823
10824 if (parser.compile(expression_string,expression))
10825 {
10826 printf("run_test21() - Expected compilation error for expression: %s\n",
10827 expression_string.c_str());
10828 error_found = true;
10829 continue;
10830 }
10831
10832 expression.value();
10833 }
10834
10835 if (error_found)
10836 {
10837 return false;
10838 }
10839 }
10840
10841 {
10842 const std::string expressions[] =
10843 {
10844 // conditional_vector_node
10845 "var x := 2; sum(if (x > 1) { vv8 } else { vv7 }) == sum(vv8)",
10846 "var x := 2; sum(if (x > 1) { vv8 + 1 } else { vv8 + 2 }) == sum(vv8 + 1)",
10847
10848 // unary_vector_node
10849 "var v[8] := {1,1,1,1,1,1,1,1}; vv8 += 1; sgn(vv8) == v",
10850 "abs(-1 * vv8) == vv8",
10851 "abs(vv8 * -1) == vv8",
10852 "var x := -1; abs(x * vv8) == vv8",
10853 "var x := -1; abs(vv8 * x) == vv8",
10854 "var x := 1; abs(-x * vv8) == vv8",
10855 "var x := 1; abs(vv8 * -x) == vv8",
10856 "var x := -2; abs(x * vv8) == 2vv8",
10857 "var x := -2; abs(vv8 * x) == 2vv8",
10858 "var x := 2; abs(-x * vv8) == 2vv8",
10859 "var x := 2; abs(vv8 * -x) == 2vv8",
10860 "var x := -2; abs(x * vv8) == -x * vv8",
10861 "var x := -2; abs(vv8 * x) == -x * vv8",
10862 "var x := 2; abs(-x * vv8) == x * vv8",
10863 "var x := 2; abs(vv8 * -x) == x * vv8",
10864 "var x := -2; abs(x * vv8) == vv8 * -x",
10865 "var x := -2; abs(vv8 * x) == vv8 * -x",
10866 "var x := 2; abs(-x * vv8) == vv8 * x",
10867 "var x := 2; abs(vv8 * -x) == vv8 * x",
10868 "var x := -2; abs(x * vv8) == abs(x) * vv8",
10869 "var x := -2; abs(vv8 * x) == abs(x) * vv8",
10870 "var x := -2; abs(x * vv8) == vv8 * abs(x)",
10871 "var x := -2; abs(vv8 * x) == vv8 * abs(x)",
10872
10873 // vec_binop_vecval_node and vec_binop_valvec_node
10874 "var v[8] := {1,2,3,4,5,6,7,8}; var x := 1; (vv8 + x) == v",
10875 "var v[7] := {1,2,3,4,5,6,7}; var x := 1; (vv8 + x) == v",
10876 "var v[6] := {1,2,3,4,5,6}; var x := 1; (vv8 + x) == v",
10877 "var v[5] := {1,2,3,4,5}; var x := 1; (vv8 + x) == v",
10878 "var v[4] := {1,2,3,4}; var x := 1; (vv8 + x) == v",
10879 "var v[3] := {1,2,3}; var x := 1; (vv8 + x) == v",
10880 "var v[2] := {1,2}; var x := 1; (vv8 + x) == v",
10881 "var v[1] := {1}; var x := 1; (vv8 + x) == v",
10882 "var v[8] := {1,2,3,4,5,6,7,8}; var x := 1; (x + vv8) == v",
10883 "var v[7] := {1,2,3,4,5,6,7}; var x := 1; (x + vv8) == v",
10884 "var v[6] := {1,2,3,4,5,6}; var x := 1; (x + vv8) == v",
10885 "var v[5] := {1,2,3,4,5}; var x := 1; (x + vv8) == v",
10886 "var v[4] := {1,2,3,4}; var x := 1; (x + vv8) == v",
10887 "var v[3] := {1,2,3}; var x := 1; (x + vv8) == v",
10888 "var v[2] := {1,2}; var x := 1; (x + vv8) == v",
10889 "var v[1] := {1}; var x := 1; (x + vv8) == v",
10890
10891 // vec_binop_vecvec_node
10892 "var v[8] := [-1]; v < vv8",
10893 "var v[7] := [-1]; v < vv8",
10894 "var v[3] := [-1]; v < vv8",
10895 "var v[2] := [-1]; v < vv8",
10896 "var v[1] := [-1]; v < vv8",
10897
10898 // assignment_vecvec_op_node
10899 "var vv8sum := sum(vv8); vv8 += (vv8 + 1); sum(vv8) == (2 * sum(vv8sum) + vv8[] * 1)",
10900 "var vv8sum := sum(vv8); vv8 += (vv8 - 1); sum(vv8) == (2 * sum(vv8sum) - vv8[] * 1)",
10901 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + x); sum(vv8) == (2 * sum(vv8sum) + vv8[] * 1)",
10902 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 - x); sum(vv8) == (2 * sum(vv8sum) - vv8[] * 1)",
10903 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + (vv8 + x)); sum(vv8) == (3 * sum(vv8sum) + vv8[] * 1)",
10904 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + (vv8 - x)); sum(vv8) == (3 * sum(vv8sum) - vv8[] * 1)",
10905 "var vv8sum := sum(vv8); vv8 += (vv8 += 1); sum(vv8) == (2 * vv8sum + 2 * (vv8[] * 1))",
10906 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 += x); sum(vv8) == (2 * vv8sum + 2 * (vv8[] * x))",
10907 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 -= x); sum(vv8) == (2 * vv8sum - 2 * (vv8[] * x))",
10908 "var vv8sum := sum(vv8); vv8 += (vv8 + 1); sum(vv8) == (2 * sum(vv8sum) + vv8[] * 1);",
10909 "var vv8sum := sum(vv8); vv8 += (vv8 - 1); sum(vv8) == (2 * sum(vv8sum) - vv8[] * 1);",
10910 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + x); sum(vv8) == (2 * sum(vv8sum) + vv8[] * 1);",
10911 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 - x); sum(vv8) == (2 * sum(vv8sum) - vv8[] * 1);",
10912 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + (vv8 + x)); sum(vv8) == (3 * sum(vv8sum) + vv8[] * 1);",
10913 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + (vv8 - x)); sum(vv8) == (3 * sum(vv8sum) - vv8[] * 1);",
10914 "var vv8sum := sum(vv8); vv8 += (vv8 += 1); sum(vv8) == (2 * vv8sum + 2 * (vv8[] * 1));",
10915 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 += x); sum(vv8) == (2 * vv8sum + 2 * (vv8[] * x));",
10916 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 -= x); sum(vv8) == (2 * vv8sum - 2 * (vv8[] * x));",
10917 "var vv3sum := sum(vv3); vv3 += (vv3 + 1); sum(vv3) == (2 * sum(vv3sum) + vv3[] * 1)",
10918 "var vv3sum := sum(vv3); vv3 += (vv3 - 1); sum(vv3) == (2 * sum(vv3sum) - vv3[] * 1)",
10919 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + x); sum(vv3) == (2 * sum(vv3sum) + vv3[] * 1)",
10920 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 - x); sum(vv3) == (2 * sum(vv3sum) - vv3[] * 1)",
10921 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + (vv3 + x)); sum(vv3) == (3 * sum(vv3sum) + vv3[] * 1)",
10922 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + (vv3 - x)); sum(vv3) == (3 * sum(vv3sum) - vv3[] * 1)",
10923 "var vv3sum := sum(vv3); vv3 += (vv3 += 1); sum(vv3) == (2 * vv3sum + 2 * (vv3[] * 1))",
10924 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 += x); sum(vv3) == (2 * vv3sum + 2 * (vv3[] * x))",
10925 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 -= x); sum(vv3) == (2 * vv3sum - 2 * (vv3[] * x))",
10926 "var vv3sum := sum(vv3); vv3 += (vv3 + 1); sum(vv3) == (2 * sum(vv3sum) + vv3[] * 1);",
10927 "var vv3sum := sum(vv3); vv3 += (vv3 - 1); sum(vv3) == (2 * sum(vv3sum) - vv3[] * 1);",
10928 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + x); sum(vv3) == (2 * sum(vv3sum) + vv3[] * 1);",
10929 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 - x); sum(vv3) == (2 * sum(vv3sum) - vv3[] * 1);",
10930 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + (vv3 + x)); sum(vv3) == (3 * sum(vv3sum) + vv3[] * 1);",
10931 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + (vv3 - x)); sum(vv3) == (3 * sum(vv3sum) - vv3[] * 1);",
10932 "var vv3sum := sum(vv3); vv3 += (vv3 += 1); sum(vv3) == (2 * vv3sum + 2 * (vv3[] * 1));",
10933 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 += x); sum(vv3) == (2 * vv3sum + 2 * (vv3[] * x));",
10934 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 -= x); sum(vv3) == (2 * vv3sum - 2 * (vv3[] * x));",
10935
10936 // assignment_vec_op_node
10937 "var vv8sum := sum(vv8); vv8 += 1; sum(vv8) == (vv8sum + vv8[] * 1)",
10938 "var vv7sum := sum(vv7); vv7 += 1; sum(vv7) == (vv7sum + vv7[] * 1)",
10939 "var vv6sum := sum(vv6); vv6 += 1; sum(vv6) == (vv6sum + vv6[] * 1)",
10940 "var vv5sum := sum(vv5); vv5 += 1; sum(vv5) == (vv5sum + vv5[] * 1)",
10941 "var vv4sum := sum(vv4); vv4 += 1; sum(vv4) == (vv4sum + vv4[] * 1)",
10942 "var vv3sum := sum(vv3); vv3 += 1; sum(vv3) == (vv3sum + vv3[] * 1)",
10943 "var vv2sum := sum(vv2); vv2 += 1; sum(vv2) == (vv2sum + vv2[] * 1)",
10944 "var vv1sum := sum(vv1); vv1 += 1; sum(vv1) == (vv1sum + vv1[] * 1)",
10945 "var vv8sum := sum(vv8); var x := 7; vv8 += (x - 1) / 2; sum(vv8) == (vv8sum + vv8[] * 3)",
10946 "var vv7sum := sum(vv7); var x := 7; vv7 += (x - 1) / 2; sum(vv7) == (vv7sum + vv7[] * 3)",
10947 "var vv6sum := sum(vv6); var x := 7; vv6 += (x - 1) / 2; sum(vv6) == (vv6sum + vv6[] * 3)",
10948 "var vv5sum := sum(vv5); var x := 7; vv5 += (x - 1) / 2; sum(vv5) == (vv5sum + vv5[] * 3)",
10949 "var vv4sum := sum(vv4); var x := 7; vv4 += (x - 1) / 2; sum(vv4) == (vv4sum + vv4[] * 3)",
10950 "var vv3sum := sum(vv3); var x := 7; vv3 += (x - 1) / 2; sum(vv3) == (vv3sum + vv3[] * 3)",
10951 "var vv2sum := sum(vv2); var x := 7; vv2 += (x - 1) / 2; sum(vv2) == (vv2sum + vv2[] * 3)",
10952 "var vv1sum := sum(vv1); var x := 7; vv1 += (x - 1) / 2; sum(vv1) == (vv1sum + vv1[] * 3)",
10953
10954 // assignment_vecvec_node
10955 "var v[8] := [-1]; vv8 := v; sum(vv8) == (-1 * 8 + 0)",
10956 "var v[7] := [-1]; vv8 := v; sum(vv8) == (-1 * 7 + (7))",
10957 "var v[6] := [-1]; vv8 := v; sum(vv8) == (-1 * 6 + (6+7))",
10958 "var v[5] := [-1]; vv8 := v; sum(vv8) == (-1 * 5 + (5+6+7))",
10959 "var v[4] := [-1]; vv8 := v; sum(vv8) == (-1 * 4 + (4+5+6+7))",
10960 "var v[3] := [-1]; vv8 := v; sum(vv8) == (-1 * 3 + (3+4+5+6+7))",
10961 "var v[2] := [-1]; vv8 := v; sum(vv8) == (-1 * 2 + (2+3+4+5+6+7))",
10962 "var v[1] := [-1]; vv8 := v; sum(vv8) == (-1 * 1 + (1+2+3+4+5+6+7))",
10963 "var v[8] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, -1, -1, -1, -1 }; x == vv8",
10964 "var v[7] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, -1, -1, -1, 7 }; x == vv8",
10965 "var v[6] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, -1, -1, 6, 7 }; x == vv8",
10966 "var v[5] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, -1, 5, 6, 7 }; x == vv8",
10967 "var v[4] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, 4, 5, 6, 7 }; x == vv8",
10968 "var v[3] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, 3, 4, 5, 6, 7 }; x == vv8",
10969 "var v[2] := [-1]; vv8 := v; var x[8] := { -1, -1, 2, 3, 4, 5, 6, 7 }; x == vv8",
10970 "var v[1] := [-1]; vv8 := v; var x[8] := { -1, 1, 2, 3, 4, 5, 6, 7 }; x == vv8",
10971 "var v[3] := [-1]; vv3 := v; sum(vv3) == (-1 * 3 + (0))",
10972 "var v[2] := [-1]; vv3 := v; sum(vv3) == (-1 * 2 + (2))",
10973 "var v[1] := [-1]; vv3 := v; sum(vv3) == (-1 * 1 + (1+2))",
10974 "var v[3] := [-1]; vv3 := v; var x[3] := { -1, -1, -1}; x == vv3",
10975 "var v[2] := [-1]; vv3 := v; var x[3] := { -1, -1, 2}; x == vv3",
10976 "var v[1] := [-1]; vv3 := v; var x[3] := { -1, 1, 2}; x == vv3",
10977 "vv8 := vv7; sum(vv8) == (sum(vv7) + 7)",
10978 "vv8 := vv6; sum(vv8) == (sum(vv6) + 6+ 7)",
10979 "vv8 := vv5; sum(vv8) == (sum(vv5) + 5 + 6 + 7)",
10980 "vv8 := vv4; sum(vv8) == (sum(vv4) + 4 + 5 + 6 + 7)",
10981 "vv8 := vv3; sum(vv8) == (sum(vv3) + 3 + 4 + 5 + 6 + 7)",
10982 "vv8 := vv2; sum(vv8) == (sum(vv2) + 2 + 3 + 4 + 5 + 6 + 7)",
10983 "vv8 := vv1; sum(vv8) == (sum(vv1) + 1 + 2 + 3 + 4 + 5 + 6 + 7)",
10984 "vv8 := vv7 + vv7; sum(vv8) == (2 * sum(vv7) + 7)",
10985 "vv8 := vv6 + vv6; sum(vv8) == (2 * sum(vv6) + 6+ 7)",
10986 "vv8 := vv5 + vv5; sum(vv8) == (2 * sum(vv5) + 5 + 6 + 7)",
10987 "vv8 := vv4 + vv4; sum(vv8) == (2 * sum(vv4) + 4 + 5 + 6 + 7)",
10988 "vv8 := vv3 + vv3; sum(vv8) == (2 * sum(vv3) + 3 + 4 + 5 + 6 + 7)",
10989 "vv8 := vv2 + vv2; sum(vv8) == (2 * sum(vv2) + 2 + 3 + 4 + 5 + 6 + 7)",
10990 "vv8 := vv1 + vv1; sum(vv8) == (2 * sum(vv1) + 1 + 2 + 3 + 4 + 5 + 6 + 7)",
10991
10992 // assignment_vec_node
10993 "var x := 3; vv8 := 2*x+1; sum(vv8) == (vv8[] * 7)",
10994 "var x := 3; vv7 := 2*x+1; sum(vv7) == (vv7[] * 7)",
10995 "var x := 3; vv6 := 2*x+1; sum(vv6) == (vv6[] * 7)",
10996 "var x := 3; vv5 := 2*x+1; sum(vv5) == (vv5[] * 7)",
10997 "var x := 3; vv4 := 2*x+1; sum(vv4) == (vv4[] * 7)",
10998 "var x := 3; vv3 := 2*x+1; sum(vv3) == (vv3[] * 7)",
10999 "var x := 3; vv2 := 2*x+1; sum(vv2) == (vv2[] * 7)",
11000 "var x := 3; vv1 := 2*x+1; sum(vv1) == (vv1[] * 7)",
11001 "var x[3] := [3]; vv8 := 2x[0]+1; sum(vv8) == (vv8[] * 7)",
11002 "var x[3] := [3]; vv7 := 2x[1]+1; sum(vv7) == (vv7[] * 7)",
11003 "var x[3] := [3]; vv6 := 2x[2]+1; sum(vv6) == (vv6[] * 7)",
11004 "var x[3] := [3]; vv5 := 2x[0]+1; sum(vv5) == (vv5[] * 7)",
11005 "var x[3] := [3]; vv4 := 2x[1]+1; sum(vv4) == (vv4[] * 7)",
11006 "var x[3] := [3]; vv3 := 2x[2]+1; sum(vv3) == (vv3[] * 7)",
11007 "var x[3] := [3]; vv2 := 2x[0]+1; sum(vv2) == (vv2[] * 7)",
11008 "var x[3] := [3]; vv1 := 2x[1]+1; sum(vv1) == (vv1[] * 7)",
11009 "var x[3] := [3]; var y[3] := [1]; vv8 := 2x[0]+y[0]; sum(vv8) == (vv8[] * 7)",
11010 "var x[3] := [3]; var y[3] := [1]; vv7 := 2x[1]+y[1]; sum(vv7) == (vv7[] * 7)",
11011 "var x[3] := [3]; var y[3] := [1]; vv6 := 2x[2]+y[2]; sum(vv6) == (vv6[] * 7)",
11012 "var x[3] := [3]; var y[3] := [1]; vv5 := 2x[0]+y[0]; sum(vv5) == (vv5[] * 7)",
11013 "var x[3] := [3]; var y[3] := [1]; vv4 := 2x[1]+y[1]; sum(vv4) == (vv4[] * 7)",
11014 "var x[3] := [3]; var y[3] := [1]; vv3 := 2x[2]+y[2]; sum(vv3) == (vv3[] * 7)",
11015 "var x[3] := [3]; var y[3] := [1]; vv2 := 2x[0]+y[0]; sum(vv2) == (vv2[] * 7)",
11016 "var x[3] := [3]; var y[3] := [1]; vv1 := 2x[1]+y[1]; sum(vv1) == (vv1[] * 7)",
11017
11018 // swap vec vec node
11019 "var v[8] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 8 + 0)",
11020 "var v[7] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 7 + (7))",
11021 "var v[6] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 6 + (6+7))",
11022 "var v[5] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 5 + (5+6+7))",
11023 "var v[4] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 4 + (4+5+6+7))",
11024 "var v[3] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 3 + (3+4+5+6+7))",
11025 "var v[2] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 2 + (2+3+4+5+6+7))",
11026 "var v[1] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 1 + (1+2+3+4+5+6+7))",
11027 "var v[8] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, -1, -1, -1, -1 }; x == vv8",
11028 "var v[7] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, -1, -1, -1, 7 }; x == vv8",
11029 "var v[6] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, -1, -1, 6, 7 }; x == vv8",
11030 "var v[5] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, -1, 5, 6, 7 }; x == vv8",
11031 "var v[4] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, 4, 5, 6, 7 }; x == vv8",
11032 "var v[3] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, 3, 4, 5, 6, 7 }; x == vv8",
11033 "var v[2] := [-1]; vv8 <=> v; var x[8] := { -1, -1, 2, 3, 4, 5, 6, 7 }; x == vv8",
11034 "var v[1] := [-1]; vv8 <=> v; var x[8] := { -1, 1, 2, 3, 4, 5, 6, 7 }; x == vv8",
11035 "var v[3] := [-1]; vv3 <=> v; sum(vv3) == (-1 * 3 + (0))",
11036 "var v[2] := [-1]; vv3 <=> v; sum(vv3) == (-1 * 2 + (2))",
11037 "var v[1] := [-1]; vv3 <=> v; sum(vv3) == (-1 * 1 + (1+2))",
11038 "var v[3] := [-1]; vv3 <=> v; var x[3] := { -1, -1, -1}; x == vv3",
11039 "var v[2] := [-1]; vv3 <=> v; var x[3] := { -1, -1, 2}; x == vv3",
11040 "var v[1] := [-1]; vv3 <=> v; var x[3] := { -1, 1, 2}; x == vv3",
11041
11042 // rebasevector_elem_node
11043 "vv8[0] == 0",
11044 "vv8[2 - 2] == 0",
11045 "vv8[vv8[] - 1] == vv8[] - 1",
11046 "var vec_sum := 0; for (var i := 0; i < vv8[]; i +=1) { vec_sum += vv8[i]; }; vec_sum == (vv8[] - 1) * vv8[] / 2",
11047 "var vec_sum := 0; for (var i := 0; i < vv8[]; i +=1) { vec_sum += vv8[2i / 2]; }; vec_sum == (vv8[] - 1) * vv8[] / 2",
11048 "var x:= 1; var y:= 1; (vv8 + x)[y / x] == 2",
11049 "var x:= 1; var y:= 1; (vv8 + x - y)[y / x] == 1",
11050 "var x:= 1; (x + vv8)[1] == 2",
11051 "var x:= 1; var y:= 1; (x + vv8)[y / x] == 2",
11052 "var x:= 1; var y:= 1; (x + vv8 - y)[y / x] == 1",
11053 "var successes := 0; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + 1)[i] == i + 1; }; successes == vv8[]",
11054 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + x)[i] == i + x; }; successes == vv8[]",
11055 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (x + vv8)[i] == i + x; }; successes == vv8[]",
11056 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + x)[i / x] == i + x; }; successes == vv8[]",
11057 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (x + vv8)[i / x] == i + x; }; successes == vv8[]",
11058 "(1 + vv8)[1] == 2",
11059 "(vv8 + 1)[1] == 2",
11060 "(vv8 + 1)[2 / 2] == 2",
11061 "(1 + vv8)[2 / 2] == 2",
11062 "var x:= 1; (x + vv8)[1] == 2",
11063 "var x:= 1; (vv8 + x)[1] == 2",
11064 "var x:= 1; var y:= 1; (x + vv8)[y] == 2",
11065 "var x:= 1; var y:= 1; (vv8 + x)[y] == 2",
11066 "var x:= 1; var y:= 1; (vv8 + x)[y / x] == 2",
11067 "var x:= 1; var y:= 1; (vv8 + x - y)[y / x] == 1",
11068 "var x:= 1; var y:= 1; (x + vv8)[y / x] == 2",
11069 "var x:= 1; var y:= 1; (x + vv8 - y)[y / x] == 1",
11070 "(abs(vv8 + 1))[1] == 2",
11071 "(abs(1 + vv8))[1] == 2",
11072 "(abs(vv8 + 1))[2 / 2] == 2",
11073 "(abs(1 + vv8))[2 / 2] == 2",
11074 "(abs(vv8 + 1)/2)[1] == 1",
11075 "(abs(1 + vv8)/2)[1] == 1",
11076 "(abs(vv8 + 1)/2)[2 / 2] == 1",
11077 "(abs(1 + vv8)/2)[2 / 2] == 1",
11078 "(abs(abs(vv8 + 1)) - 1)[1] == 1",
11079 "(abs(2 * abs(vv8 + 1)) - 1)[1] == 3",
11080 "(abs(abs(vv8 + 1) * 2) - 1)[1] == 3",
11081 "(abs(2abs(vv8 + 1)) - 1)[1] == 3",
11082 "(abs(abs(vv8 + 1)2) - 1)[1] == 3",
11083 "var x:= 1; (abs(x + vv8))[1] == 2",
11084 "var x:= 1; (abs(vv8 + x))[1] == 2",
11085 "var x:= 1; var y:= 1; (abs(x + vv8))[y] == 2",
11086 "var x:= 1; var y:= 1; (abs(vv8 + x))[y] == 2",
11087 "var x:= 1; var y:= 1; (abs(vv8 + x))[y / x] == 2",
11088 "var x:= 1; var y:= 1; (abs(vv8 + x - y))[y / x] == 1",
11089 "var x:= 1; var y:= 1; (abs(x + vv8))[y / x] == 2",
11090 "var x:= 1; var y:= 1; (abs(x + vv8 - y))[y / x] == 1",
11091 "var x:= 1; (abs(x + vv8)/2)[1] == 1",
11092 "var x:= 1; (abs(vv8 + x)/2)[1] == 1",
11093 "var x:= 1; var y:= 1; (abs(x + vv8)/2)[y] == 1",
11094 "var x:= 1; var y:= 1; (abs(vv8 + x)/2)[y] == 1",
11095 "var x:= 1; var y:= 1; (abs(vv8 + x)/2)[y / x] == 1",
11096 "var x:= 1; var y:= 1; (abs(x + vv8)/2)[y / x] == 1",
11097 "var x := 1; (abs(abs(vv8 + x)) - x)[1] == 1",
11098 "var x := 1; (abs(2 * abs(vv8 + x)) - x)[1] == 3",
11099 "var x := 1; (abs(abs(vv8 + x) * 2) - x)[1] == 3",
11100 "var x := 1; (abs(2abs(vv8 + x)) - x)[1] == 3",
11101 "var x := 1; (abs(abs(vv8 + x)2) - x)[1] == 3",
11102 "var x := 1; var y := 1; (abs(abs(vv8 + x)) - x)[y] == 1",
11103 "var x := 1; var y := 1; (abs(2 * abs(vv8 + x)) - x)[y] == 3",
11104 "var x := 1; var y := 1; (abs(abs(vv8 + x) * 2) - x)[y] == 3",
11105 "var x := 1; var y := 1; (abs(2abs(vv8 + x)) - x)[y] == 3",
11106 "var x := 1; var y := 1; (abs(abs(vv8 + x)2) - x)[y] == 3",
11107 "var x := 1; var y := 1; (abs(abs(vv8 + x)) - x)[x / y] == 1",
11108 "var x := 1; var y := 1; (abs(2 * abs(vv8 + x)) - x)[x / y] == 3",
11109 "var x := 1; var y := 1; (abs(abs(vv8 + x) * 2) - x)[x / y] == 3",
11110 "var x := 1; var y := 1; (abs(2abs(vv8 + x)) - x)[x / y] == 3",
11111 "var x := 1; var y := 1; (abs(abs(vv8 + x)2) - x)[x / y] == 3",
11112 "var successes := 0; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + 1)[i] == i + 1; }; successes == vv8[]",
11113 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + x)[i] == i + x; }; successes == vv8[]",
11114 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (x + vv8)[i] == i + x; }; successes == vv8[]",
11115 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + x)[i / x] == i + x; }; successes == vv8[]",
11116 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (x + vv8)[i / x] == i + x; }; successes == vv8[]",
11117 "var successes := 0; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(vv8 + 1))[i] == i + 1; }; successes == vv8[]",
11118 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(vv8 + x))[i] == i + x; }; successes == vv8[]",
11119 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(x + vv8))[i] == i + x; }; successes == vv8[]",
11120 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(vv8 + x))[i / x] == i + x; }; successes == vv8[]",
11121 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(x + vv8))[i / x] == i + x; }; successes == vv8[]",
11122 };
11123
11124 bool error_found = false;
11125
11126 for (std::size_t e = 0; e < sizeof(expressions)/sizeof(std::string); ++e)
11127 {
11128 T vs8[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
11129 T vs7[] = { 0, 1, 2, 3, 4, 5, 6 };
11130 T vs6[] = { 0, 1, 2, 3, 4, 5 };
11131 T vs5[] = { 0, 1, 2, 3, 4 };
11132 T vs4[] = { 0, 1, 2, 3 };
11133 T vs3[] = { 0, 1, 2 };
11134 T vs2[] = { 0, 1 };
11135 T vs1[] = { 0 };
11136
11145
11146 symbol_table_t symbol_table;
11147
11148 symbol_table.add_vector("vv1", vv1);
11149 symbol_table.add_vector("vv2", vv2);
11150 symbol_table.add_vector("vv3", vv3);
11151 symbol_table.add_vector("vv4", vv4);
11152 symbol_table.add_vector("vv5", vv5);
11153 symbol_table.add_vector("vv6", vv6);
11154 symbol_table.add_vector("vv7", vv7);
11155 symbol_table.add_vector("vv8", vv8);
11156
11157 parser_t parser;
11158
11159 const std::string& expression_string = expressions[e];
11160 expression_t expression;
11161 expression.register_symbol_table(symbol_table);
11162
11163 if (!parser.compile(expression_string,expression))
11164 {
11165 printf("run_test21() - vector_veiw expression compilation error. Expression: %s\n",
11166 expression_string.c_str());
11167
11168 for (std::size_t i = 0; i < parser.error_count(); ++i)
11169 {
11170 error_type error = parser.get_error(i);
11171 exprtk::parser_error::update_error(error,expression_string);
11172
11173 printf("run_test21() - Exp[%02d] Error[%02d] Position: %02d line: %d column: %d Type: [%14s] Msg: %s\n",
11174 static_cast<unsigned int>(e),
11175 static_cast<unsigned int>(i),
11176 static_cast<unsigned int>(error.token.position),
11177 static_cast<unsigned int>(error.line_no),
11178 static_cast<unsigned int>(error.column_no),
11179 exprtk::parser_error::to_str(error.mode).c_str(),
11180 error.diagnostic.c_str());
11181 }
11182
11183 error_found = true;
11184
11185 continue;
11186 }
11187
11188 const T result = expression.value();
11189
11190 if (result != T(1.0))
11191 {
11192 error_found = true;
11193
11194 printf("run_test21() - Error: Exp[%02d] Expression result: %5.3f expected: 1 expression: %s\n",
11195 static_cast<unsigned int>(e),
11196 static_cast<double>(result),
11197 expression_string.c_str());
11198 }
11199 }
11200
11201 if (error_found)
11202 {
11203 return false;
11204 }
11205 }
11206
11207 {
11208 const std::string expressions[] =
11209 {
11210 "vv0[] == vv0_size",
11211 "sum(vv0) == (vv0[] * (vv0[] + 1) / 2) and (vv0[] == vv0_size)",
11212 "(min(vv0) == 1) and (vv0[] == vv0_size)",
11213 "(max(vv0) == vv0[]) and (vv0[] == vv0_size)",
11214 "(avg(vv0) == (min(vv0) + max(vv0)) / 2) and (vv0[] == vv0_size)",
11215 "(sum(vv0 + 1) == (vv0[] * (vv0[] + 1) / 2 + (vv0[] * 1))) and (vv0[] == vv0_size)",
11216 "(sum(vv0 - 1) == (vv0[] * (vv0[] + 1) / 2 - (vv0[] * 1))) and (vv0[] == vv0_size)",
11217 "(sum(1 + vv0) == (vv0[] * (vv0[] + 1) / 2 + (vv0[] * 1))) and (vv0[] == vv0_size)",
11218 "(sum(-1 + vv0) == (vv0[] * (vv0[] + 1) / 2 - (vv0[] * 1))) and (vv0[] == vv0_size)",
11219 "var x:= 1; sum(vv0 + x) == (vv0[] * (vv0[] + 1) / 2 + (vv0[] * x)) and (vv0[] == vv0_size)",
11220 "var x:= 1; sum(vv0 - x) == (vv0[] * (vv0[] + 1) / 2 - (vv0[] * x)) and (vv0[] == vv0_size)",
11221 "sum(2vv0) == (vv0[] * (vv0[] + 1)) and (vv0[] == vv0_size)",
11222 "sum(vv0 * 2) == (vv0[] * (vv0[] + 1)) and (vv0[] == vv0_size)",
11223 "sum(2vv0 + 1) == (vv0[] * (vv0[] + 1) + vv0[]) and (vv0[] == vv0_size)",
11224 "sum(1 + 2vv0) == (vv0[] * (vv0[] + 1) + vv0[]) and (vv0[] == vv0_size)",
11225 "var x := 1; sum(2vv0 + x) == (vv0[] * (vv0[] + 1) + x * vv0[]) and (vv0[] == vv0_size)",
11226 "var x := 1; sum(x + 2vv0) == (vv0[] * (vv0[] + 1) + x * vv0[]) and (vv0[] == vv0_size)",
11227 "sum(vv0 += 1) == (vv0[] * (vv0[] + 1) / 2 + vv0[]) and (vv0[] == vv0_size)",
11228 "var x:= 1; sum(vv0 += x) == (vv0[] * (vv0[] + 1) / 2 + x * vv0[]) and (vv0[] == vv0_size)",
11229 "var x:= 1; sum(vv0 -= x) == (vv0[] * (vv0[] + 1 - 2x) / 2) and (vv0[] == vv0_size)",
11230 "(sum(2vv0) == 2 * sum(vv0)) and (vv0[] == vv0_size)",
11231 "(sum(vv0 * 2) == 2 * sum(vv0)) and (vv0[] == vv0_size)",
11232 "var x:= 1; sum(2vv0) == (vv0[] * (vv0[] + 1)) and (vv0[] == vv0_size)",
11233 "var x := 2; sum(if (x > 1) { vv0 } else { vv1 }) == sum(vv0)",
11234 "dot(2 * vv0,vv1 - 1) + dot(2 * vv0,vv1 - 1) == 2sum(2vv0 * (vv1 - 1))",
11235 "(0 * dot(2 * vv0,vv1 - 1)) == 0"
11236 };
11237
11238 bool error_found = false;
11239
11240 for (std::size_t e = 0; e < sizeof(expressions) / sizeof(std::string); ++e)
11241 {
11242 const T vanilla[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
11243 const std::size_t vanilla_size = sizeof(vanilla) / sizeof(T);
11244
11245 std::vector<T> v0(vanilla, vanilla + vanilla_size);
11247
11248 std::vector<T> v1(vanilla, vanilla + vanilla_size);
11250
11251 T vv0_size = T(0.0);
11252
11253 symbol_table_t symbol_table;
11254 symbol_table.add_variable("vv0_size", vv0_size);
11255 symbol_table.add_vector ("vv0" , vv0 );
11256 symbol_table.add_vector ("vv1" , vv1 );
11257
11258 exprtk::rtl::vecops::package<T> vector_package;
11259 exprtk::rtl::io::package<T> io_package;
11260
11261 symbol_table.add_package( vector_package );
11262 symbol_table.add_package( io_package );
11263
11264 const std::string& expression_string = expressions[e];
11265 expression_t expression;
11266 expression.register_symbol_table(symbol_table);
11267
11268 parser_t parser;
11269
11270 if (!parser.compile(expression_string, expression))
11271 {
11272 printf("run_test21() - Error: %s\tExpression: %s\n",
11273 parser.error().c_str(),
11274 expression_string.c_str());
11275
11276 for (std::size_t i = 0; i < parser.error_count(); ++i)
11277 {
11278 error_type error = parser.get_error(i);
11279 exprtk::parser_error::update_error(error,expression_string);
11280
11281 printf("run_test21() - Exp[%02d] Error[%02d] Position: %02d line: %d column: %d Type: [%14s] Msg: %s\n",
11282 static_cast<unsigned int>(e),
11283 static_cast<unsigned int>(i),
11284 static_cast<unsigned int>(error.token.position),
11285 static_cast<unsigned int>(error.line_no),
11286 static_cast<unsigned int>(error.column_no),
11287 exprtk::parser_error::to_str(error.mode).c_str(),
11288 error.diagnostic.c_str());
11289 }
11290
11291 continue;
11292 }
11293
11294 for (std::size_t i = 1; i <= vv0.base_size(); ++i)
11295 {
11296 v0.assign(vanilla, vanilla + vanilla_size);
11297 v1.assign(vanilla, vanilla + vanilla_size);
11298
11299 vv0_size = T(i);
11300 vv0.set_size(i);
11301
11302 const T result = expression.value();
11303
11304 if (result != 1)
11305 {
11306 printf("run_test21() - Exp[%02d] Error: size: %d expected 1 instead got: %f expr:%s\n",
11307 static_cast<unsigned int>(e),
11308 static_cast<unsigned int>(i),
11309 static_cast<double>(result),
11310 expression_string.c_str());
11311 }
11312 }
11313
11314 vv1.rebase(v0.data());
11315 vv0.rebase(v1.data());
11316 expression.value();
11317
11318 vv0.rebase(v0.data());
11319 vv1.rebase(v1.data());
11320 expression.value();
11321
11322 expression.release();
11323 }
11324
11325 if (error_found)
11326 {
11327 return false;
11328 }
11329 }
11330
11331 {
11332 const T vanilla[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
11333 const std::size_t vanilla_size = sizeof(vanilla) / sizeof(T);
11334
11335 std::vector<T> v0(vanilla, vanilla + vanilla_size);
11336 std::vector<T> v1(vanilla, vanilla + vanilla_size);
11337
11339
11340 vv_size_handler_t<T> vv_size_handler;
11341 vv_size_handler.register_vector_view(vv);
11342
11343 symbol_table_t symbol_table;
11344 symbol_table.add_vector("v", vv);
11345
11346 exprtk::rtl::vecops::package<T> vector_package;
11347 exprtk::rtl::io::package<T> io_package;
11348
11349 symbol_table.add_package( vector_package );
11350 symbol_table.add_package( io_package );
11351 symbol_table.add_function("resize", vv_size_handler);
11352
11353 expression_t expression;
11354 expression.register_symbol_table(symbol_table);
11355
11356 parser_t parser;
11357
11358 const std::string resize_expression =
11359 " var vec_original_size := v[]; "
11360 " var success_count := 0; "
11361 " "
11362 " for (var i := 1; i <= vec_original_size; i += 1) "
11363 " { "
11364 " if (resize(v,i) == true and v[] == i) "
11365 " { "
11366 " success_count += 1; "
11367 " } "
11368 " }; "
11369 " "
11370 " success_count == vec_original_size ";
11371
11372 if (!parser.compile(resize_expression, expression))
11373 {
11374 printf("run_test21() - Error: %s\tExpression: %s\n",
11375 parser.error().c_str(),
11376 resize_expression.c_str());
11377
11378 for (std::size_t i = 0; i < parser.error_count(); ++i)
11379 {
11380 error_type error = parser.get_error(i);
11381 exprtk::parser_error::update_error(error,resize_expression);
11382
11383 printf("run_test21() - Error[%02d] Position: %02d line: %d column: %d Type: [%14s] Msg: %s\n",
11384 static_cast<unsigned int>(i),
11385 static_cast<unsigned int>(error.token.position),
11386 static_cast<unsigned int>(error.line_no),
11387 static_cast<unsigned int>(error.column_no),
11388 exprtk::parser_error::to_str(error.mode).c_str(),
11389 error.diagnostic.c_str());
11390 }
11391
11392 return false;
11393 }
11394
11395 const T value0 = expression.value();
11396
11397 if (expression.value() != T(1))
11398 {
11399 printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (1)\n", static_cast<double>(value0));
11400 }
11401
11402 vv.rebase(v1.data());
11403 vv_size_handler.register_vector_view(vv);
11404
11405 const T value1 = expression.value();
11406
11407 if (expression.value() != T(1))
11408 {
11409 printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (1)\n", static_cast<double>(value1));
11410 }
11411
11412 vv.rebase(v0.data());
11413 vv_size_handler.register_vector_view(vv);
11414
11415 expression.release();
11416 }
11417
11418 {
11419 const T vanilla[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
11420 const std::size_t vanilla_size = sizeof(vanilla) / sizeof(T);
11421
11422 std::vector<T> v0(vanilla, vanilla + vanilla_size);
11423 std::vector<T> v1(vanilla, vanilla + vanilla_size);
11424
11426
11427 vv_size_handler_t<T> vv_size_handler;
11428 vv_size_handler.register_vector_view(vv);
11429
11430 symbol_table_t symbol_table;
11431 symbol_table.add_vector("v", vv);
11432
11433 exprtk::rtl::vecops::package<T> vector_package;
11434 exprtk::rtl::io::package<T> io_package;
11435
11436 symbol_table.add_package( vector_package );
11437 symbol_table.add_package( io_package );
11438 symbol_table.add_function("resize", vv_size_handler);
11439
11440 expression_t expression;
11441 expression.register_symbol_table(symbol_table);
11442
11443 parser_t parser;
11444
11445 const std::string resize_expression =
11446 " var vec_original_size := v[]; "
11447 " var failure_count := 0; "
11448 " "
11449 " for (var i := vec_original_size + 1; i <= 2 * vec_original_size; i += 1) "
11450 " { "
11451 " if (resize(v,i) == false or v[] != i) "
11452 " { "
11453 " failure_count += 1 "
11454 " } "
11455 " }; "
11456 " "
11457 " failure_count == vec_original_size ";
11458
11459 if (!parser.compile(resize_expression, expression))
11460 {
11461 printf("run_test21() - Error: %s\tExpression: %s\n",
11462 parser.error().c_str(),
11463 resize_expression.c_str());
11464
11465 for (std::size_t i = 0; i < parser.error_count(); ++i)
11466 {
11467 error_type error = parser.get_error(i);
11468 exprtk::parser_error::update_error(error,resize_expression);
11469
11470 printf("run_test21() - Error[%02d] Position: %02d line: %d column: %d Type: [%14s] Msg: %s\n",
11471 static_cast<unsigned int>(i),
11472 static_cast<unsigned int>(error.token.position),
11473 static_cast<unsigned int>(error.line_no),
11474 static_cast<unsigned int>(error.column_no),
11475 exprtk::parser_error::to_str(error.mode).c_str(),
11476 error.diagnostic.c_str());
11477 }
11478
11479 return false;
11480 }
11481
11482 const T value0 = expression.value();
11483
11484 if (expression.value() != T(1))
11485 {
11486 printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (2)\n", static_cast<double>(value0));
11487 }
11488
11489 vv.rebase(v1.data());
11490 vv_size_handler.register_vector_view(vv);
11491
11492 const T value1 = expression.value();
11493
11494 if (expression.value() != T(1))
11495 {
11496 printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (2)\n", static_cast<double>(value1));
11497 }
11498
11499 vv.rebase(v0.data());
11500 vv_size_handler.register_vector_view(vv);
11501
11502 expression.release();
11503 }
11504
11505 return true;
11506}
std::size_t base_size() const
Definition exprtk.hpp:4594
bool set_size(const std::size_t new_size)
Definition exprtk.hpp:4634
void register_vector_view(exprtk::vector_view< T > &vec_view)
bool result_equal(const exprtk::results_context< T > &results, const T &value)
bool update_error(type &error, const std::string &expression)
Definition exprtk.hpp:22114
std::string to_str(error_mode mode)
Definition exprtk.hpp:22098

References exprtk::vector_view< T >::base_size(), expression_list, expression_list_size, exprtk::make_vector_view(), exprtk::vector_view< T >::rebase(), vv_size_handler_t< T >::register_vector_view(), result_equal(), exprtk::vector_view< T >::set_size(), exprtk::parser_error::to_str(), and exprtk::parser_error::update_error().

Here is the call graph for this function:

◆ run_test22()

template<typename T >
bool run_test22 ( )
inline

Definition at line 11518 of file exprtk_real_test.cpp.

11519{
11520 typedef exprtk::symbol_table<T> symbol_table_t;
11521 typedef exprtk::expression<T> expression_t;
11522 typedef exprtk::parser<T> parser_t;
11523
11524 bool result = true;
11525
11526 {
11527 const std::string expressions[] =
11528 {
11529 " assert(1 > 1); ",
11530 " assert(1 > 2, 'assert statement 2'); ",
11531 " assert(1 > 3, 'assert ' + 'statement 3'); ",
11532 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); ",
11533 " assert(1 > 5, 'assert ' + 'statement 5'); ",
11534 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); "
11535 };
11536
11537 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11538
11539 for (std::size_t i = 0; i < expression_count; ++i)
11540 {
11541 expression_t expression;
11542 parser_t parser;
11543
11544 if (!parser.compile(expressions[i], expression))
11545 {
11546 printf("run_test22() - Error: %s\tExpression: %s [1]\n",
11547 parser.error().c_str(),
11548 expressions[i].c_str());
11549 result = false;
11550 continue;
11551 }
11552 else if (!exprtk::expression_helper<T>::is_null(expression))
11553 {
11554 printf("run_test22() - Error: Expression is not null! expression: %s [1]\n",
11555 expressions[i].c_str());
11556 result = false;
11557 continue;
11558 }
11559
11560 expression.value();
11561 }
11562 }
11563
11564 {
11565 const std::string expressions[] =
11566 {
11567 " assert(1 > 1); 1 + 0 ",
11568 " assert(1 > 2, 'assert statement 2'); 2 + 0 ",
11569 " assert(1 > 3, 'assert ' + 'statement 3'); 3 + 0 ",
11570 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 4 + 0 ",
11571 " assert(1 > 5, 'assert ' + 'statement 5'); 5 + 0 ",
11572 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0 "
11573 };
11574
11575 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11576
11577 for (std::size_t i = 0; i < expression_count; ++i)
11578 {
11579 expression_t expression;
11580 parser_t parser;
11581
11582 if (!parser.compile(expressions[i], expression))
11583 {
11584 printf("run_test22() - Error: %s\tExpression: %s [2]\n",
11585 parser.error().c_str(),
11586 expressions[i].c_str());
11587 result = false;
11588 continue;
11589 }
11590 else if (!exprtk::expression_helper<T>::is_literal(expression))
11591 {
11592 printf("run_test22() - Error: Expression is not constant! expression: %s [2]\n",
11593 expressions[i].c_str());
11594 continue;
11595 }
11596
11597 expression.value();
11598 }
11599 }
11600
11601 {
11602 const std::string expressions[] =
11603 {
11604 " assert(1 > 1); "
11605 " assert(1 > 2, 'assert statement 2'); "
11606 " assert(1 > 3, 'assert ' + 'statement 3'); "
11607 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); "
11608 " assert(1 > 5, 'assert ' + 'statement 5'); "
11609 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); "
11610 };
11611
11612 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11613
11614 for (std::size_t i = 0; i < expression_count; ++i)
11615 {
11616 expression_t expression;
11617 parser_t parser;
11618 assert_handler handler;
11619
11620 handler.assert_count = 0;
11621
11622 parser.register_assert_check(handler);
11623
11624 if (!parser.compile(expressions[i], expression))
11625 {
11626 printf("run_test22() - Error: %s\tExpression: %s [3]\n",
11627 parser.error().c_str(),
11628 expressions[i].c_str());
11629 result = false;
11630 continue;
11631 }
11632
11633 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
11634
11635 typedef typename exprtk::expression_helper<T> et_t;
11636 type_sequence.push_back(et_t::e_assert);
11637 type_sequence.push_back(et_t::e_assert);
11638 type_sequence.push_back(et_t::e_assert);
11639 type_sequence.push_back(et_t::e_assert);
11640 type_sequence.push_back(et_t::e_assert);
11641 type_sequence.push_back(et_t::e_assert);
11642
11643 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
11644 {
11645 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [3]\n",
11646 expressions[i].c_str());
11647 result = false;
11648 continue;
11649 }
11650
11651 expression.value();
11652
11653 if (6 != handler.assert_count)
11654 {
11655 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [3]\n",
11656 static_cast<int>(handler.assert_count),
11657 expressions[i].c_str());
11658 result = false;
11659 continue;
11660 }
11661 }
11662 }
11663
11664 {
11665 const std::string expressions[] =
11666 {
11667 " assert(1 > 1); 1 ",
11668 " assert(1 > 2, 'assert statement 2'); 2 ",
11669 " assert(1 > 3, 'assert ' + 'statement 3'); 3 ",
11670 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 4 ",
11671 " assert(1 > 5, 'assert ' + 'statement 5'); 5 ",
11672 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 6 "
11673 };
11674
11675 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11676
11677 for (std::size_t i = 0; i < expression_count; ++i)
11678 {
11679 expression_t expression;
11680 parser_t parser;
11681 assert_handler handler;
11682
11683 handler.assert_count = 0;
11684
11685 parser.register_assert_check(handler);
11686
11687 if (!parser.compile(expressions[i], expression))
11688 {
11689 printf("run_test22() - Error: %s\tExpression: %s [4]\n",
11690 parser.error().c_str(),
11691 expressions[i].c_str());
11692 result = false;
11693 continue;
11694 }
11695
11696 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
11697
11698 typedef typename exprtk::expression_helper<T> et_t;
11699 type_sequence.push_back(et_t::e_assert );
11700 type_sequence.push_back(et_t::e_literal);
11701
11702 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
11703 {
11704 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [4]\n",
11705 expressions[i].c_str());
11706 result = false;
11707 continue;
11708 }
11709
11710 expression.value();
11711
11712 if (1 != handler.assert_count)
11713 {
11714 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [4]\n",
11715 static_cast<int>(handler.assert_count),
11716 expressions[i].c_str());
11717 result = false;
11718 continue;
11719 }
11720 }
11721 }
11722
11723 {
11724 const std::string expressions[] =
11725 {
11726 " assert(1 > 1); 1 + 0 ",
11727 " assert(1 > 2, 'assert statement 2'); 2 + 0 ",
11728 " assert(1 > 3, 'assert ' + 'statement 3'); 3 + 0 ",
11729 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 4 + 0 ",
11730 " assert(1 > 5, 'assert ' + 'statement 5'); 5 + 0 ",
11731 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0 "
11732 };
11733
11734 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11735
11736 for (std::size_t i = 0; i < expression_count; ++i)
11737 {
11738 expression_t expression;
11739 parser_t parser;
11740 assert_handler handler;
11741
11742 handler.assert_count = 0;
11743
11744 parser.register_assert_check(handler);
11745
11746 if (!parser.compile(expressions[i], expression))
11747 {
11748 printf("run_test22() - Error: %s\tExpression: %s [5]\n",
11749 parser.error().c_str(),
11750 expressions[i].c_str());
11751 result = false;
11752 continue;
11753 }
11754
11755 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
11756
11757 typedef typename exprtk::expression_helper<T> et_t;
11758 type_sequence.push_back(et_t::e_assert );
11759 type_sequence.push_back(et_t::e_literal);
11760
11761 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
11762 {
11763 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [5]\n",
11764 expressions[i].c_str());
11765 result = false;
11766 continue;
11767 }
11768
11769 expression.value();
11770
11771 if (1 != handler.assert_count)
11772 {
11773 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [5]\n",
11774 static_cast<int>(handler.assert_count),
11775 expressions[i].c_str());
11776 result = false;
11777 continue;
11778 }
11779 }
11780 }
11781
11782 {
11783 const std::string expressions[] =
11784 {
11785 " assert(1 > 1); 'assert statement 0001' ",
11786 " assert(1 > 2, 'assert statement 2'); 'assert statement 0002' ",
11787 " assert(1 > 3, 'assert ' + 'statement 3'); 'assert statement 0003' ",
11788 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 'assert statement 0004' ",
11789 " assert(1 > 5, 'assert ' + 'statement 5'); 'assert statement 0005' ",
11790 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert statement 0006' "
11791 };
11792
11793 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11794
11795 for (std::size_t i = 0; i < expression_count; ++i)
11796 {
11797 expression_t expression;
11798 parser_t parser;
11799 assert_handler handler;
11800
11801 handler.assert_count = 0;
11802
11803 parser.register_assert_check(handler);
11804
11805 if (!parser.compile(expressions[i], expression))
11806 {
11807 printf("run_test22() - Error: %s\tExpression: %s [6]\n",
11808 parser.error().c_str(),
11809 expressions[i].c_str());
11810 result = false;
11811 continue;
11812 }
11813
11814 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
11815
11816 typedef typename exprtk::expression_helper<T> et_t;
11817 type_sequence.push_back(et_t::e_assert);
11818 type_sequence.push_back(et_t::e_string);
11819
11820 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
11821 {
11822 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [6]\n",
11823 expressions[i].c_str());
11824 result = false;
11825 continue;
11826 }
11827
11828 expression.value();
11829
11830 if (1 != handler.assert_count)
11831 {
11832 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [6]\n",
11833 static_cast<int>(handler.assert_count),
11834 expressions[i].c_str());
11835 result = false;
11836 continue;
11837 }
11838 }
11839 }
11840
11841 {
11842 const std::string expressions[] =
11843 {
11844 " assert(1 > 1); 'assert statement' + '0001' ",
11845 " assert(1 > 2, 'assert statement 2'); 'assert statement' + '0002' ",
11846 " assert(1 > 3, 'assert ' + 'statement 3'); 'assert statement' + '0003' ",
11847 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 'assert statement' + '0004' ",
11848 " assert(1 > 5, 'assert ' + 'statement 5'); 'assert statement' + '0005' ",
11849 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert statement' + '0006' "
11850 };
11851
11852 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11853
11854 for (std::size_t i = 0; i < expression_count; ++i)
11855 {
11856 expression_t expression;
11857 parser_t parser;
11858 assert_handler handler;
11859
11860 handler.assert_count = 0;
11861
11862 parser.register_assert_check(handler);
11863
11864 if (!parser.compile(expressions[i], expression))
11865 {
11866 printf("run_test22() - Error: %s\tExpression: %s [7]\n",
11867 parser.error().c_str(),
11868 expressions[i].c_str());
11869 result = false;
11870 continue;
11871 }
11872
11873 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
11874
11875 typedef typename exprtk::expression_helper<T> et_t;
11876 type_sequence.push_back(et_t::e_assert);
11877 type_sequence.push_back(et_t::e_string);
11878
11879 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
11880 {
11881 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [7]\n",
11882 expressions[i].c_str());
11883 result = false;
11884 continue;
11885 }
11886
11887 expression.value();
11888
11889 if (1 != handler.assert_count)
11890 {
11891 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [7]\n",
11892 static_cast<int>(handler.assert_count),
11893 expressions[i].c_str());
11894 result = false;
11895 continue;
11896 }
11897 }
11898 }
11899
11900 {
11901 const std::string expressions[] =
11902 {
11903 " assert(x > y); ",
11904 " assert(x > y, 'assert statement 2'); ",
11905 " assert(x > y, 'assert ' + 'statement 3'); ",
11906 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); ",
11907 " assert(x > y, 'assert ' + 'statement 5'); ",
11908 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); "
11909 };
11910
11911 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11912
11913 for (std::size_t i = 0; i < expression_count; ++i)
11914 {
11915 T x = T(1);
11916 T y = T(2);
11917
11918 symbol_table_t symbol_table;
11919 expression_t expression;
11920 parser_t parser;
11921
11922 symbol_table.add_variable("x", x);
11923 symbol_table.add_variable("y", y);
11924 expression.register_symbol_table(symbol_table);
11925
11926 if (!parser.compile(expressions[i], expression))
11927 {
11928 printf("run_test22() - Error: %s\tExpression: %s [8]\n",
11929 parser.error().c_str(),
11930 expressions[i].c_str());
11931 result = false;
11932 continue;
11933 }
11934 else if (!exprtk::expression_helper<T>::is_null(expression))
11935 {
11936 printf("run_test22() - Error: Expression is not null! expression: %s [8]\n",
11937 expressions[i].c_str());
11938 result = false;
11939 continue;
11940 }
11941
11942 expression.value();
11943 }
11944 }
11945
11946 {
11947 const std::string expressions[] =
11948 {
11949 " assert(x > y); 1 + 0 ",
11950 " assert(x > y, 'assert statement 2'); 2 + 0 ",
11951 " assert(x > y, 'assert ' + 'statement 3'); 3 + 0 ",
11952 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 4 + 0 ",
11953 " assert(x > y, 'assert ' + 'statement 5'); 5 + 0 ",
11954 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0 "
11955 };
11956
11957 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11958
11959 for (std::size_t i = 0; i < expression_count; ++i)
11960 {
11961 T x = T(1);
11962 T y = T(2);
11963
11964 symbol_table_t symbol_table;
11965 expression_t expression;
11966 parser_t parser;
11967
11968 symbol_table.add_variable("x", x);
11969 symbol_table.add_variable("y", y);
11970 expression.register_symbol_table(symbol_table);
11971
11972 if (!parser.compile(expressions[i], expression))
11973 {
11974 printf("run_test22() - Error: %s\tExpression: %s [9]\n",
11975 parser.error().c_str(),
11976 expressions[i].c_str());
11977 result = false;
11978 continue;
11979 }
11980 else if (!exprtk::expression_helper<T>::is_literal(expression))
11981 {
11982 printf("run_test22() - Error: Expression is not constant! expression: %s [9]\n",
11983 expressions[i].c_str());
11984 continue;
11985 }
11986
11987 expression.value();
11988 }
11989 }
11990
11991 {
11992 const std::string expressions[] =
11993 {
11994 " assert(x > y); "
11995 " assert(x > y, 'assert statement 2'); "
11996 " assert(x > y, 'assert ' + 'statement 3'); "
11997 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); "
11998 " assert(x > y, 'assert ' + 'statement 5'); "
11999 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); "
12000 };
12001
12002 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12003
12004 for (std::size_t i = 0; i < expression_count; ++i)
12005 {
12006 T x = T(1);
12007 T y = T(2);
12008
12009 symbol_table_t symbol_table;
12010 expression_t expression;
12011 parser_t parser;
12012 assert_handler handler;
12013
12014 handler.assert_count = 0;
12015
12016 symbol_table.add_variable("x", x);
12017 symbol_table.add_variable("y", y);
12018 expression.register_symbol_table(symbol_table);
12019
12020 parser.register_assert_check(handler);
12021
12022 if (!parser.compile(expressions[i], expression))
12023 {
12024 printf("run_test22() - Error: %s\tExpression: %s [10]\n",
12025 parser.error().c_str(),
12026 expressions[i].c_str());
12027 result = false;
12028 continue;
12029 }
12030
12031 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12032
12033 typedef typename exprtk::expression_helper<T> et_t;
12034 type_sequence.push_back(et_t::e_assert);
12035 type_sequence.push_back(et_t::e_assert);
12036 type_sequence.push_back(et_t::e_assert);
12037 type_sequence.push_back(et_t::e_assert);
12038 type_sequence.push_back(et_t::e_assert);
12039 type_sequence.push_back(et_t::e_assert);
12040
12041 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12042 {
12043 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [10]\n",
12044 expressions[i].c_str());
12045 result = false;
12046 continue;
12047 }
12048
12049 expression.value();
12050
12051 if (6 != handler.assert_count)
12052 {
12053 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [10]\n",
12054 static_cast<int>(handler.assert_count),
12055 expressions[i].c_str());
12056 result = false;
12057 continue;
12058 }
12059 }
12060 }
12061
12062 {
12063 const std::string expressions[] =
12064 {
12065 " assert(x > y); 1 ",
12066 " assert(x > y, 'assert statement 2'); 2 ",
12067 " assert(x > y, 'assert ' + 'statement 3'); 3 ",
12068 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 4 ",
12069 " assert(x > y, 'assert ' + 'statement 5'); 5 ",
12070 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 6 "
12071 };
12072
12073 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12074
12075 for (std::size_t i = 0; i < expression_count; ++i)
12076 {
12077 T x = T(1);
12078 T y = T(2);
12079
12080 symbol_table_t symbol_table;
12081 expression_t expression;
12082 parser_t parser;
12083 assert_handler handler;
12084
12085 handler.assert_count = 0;
12086
12087 symbol_table.add_variable("x", x);
12088 symbol_table.add_variable("y", y);
12089 expression.register_symbol_table(symbol_table);
12090
12091 parser.register_assert_check(handler);
12092
12093 if (!parser.compile(expressions[i], expression))
12094 {
12095 printf("run_test22() - Error: %s\tExpression: %s [11]\n",
12096 parser.error().c_str(),
12097 expressions[i].c_str());
12098 result = false;
12099 continue;
12100 }
12101
12102 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12103
12104 typedef typename exprtk::expression_helper<T> et_t;
12105 type_sequence.push_back(et_t::e_assert );
12106 type_sequence.push_back(et_t::e_literal);
12107
12108 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12109 {
12110 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [11]\n",
12111 expressions[i].c_str());
12112 result = false;
12113 continue;
12114 }
12115
12116 expression.value();
12117
12118 if (1 != handler.assert_count)
12119 {
12120 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [11]\n",
12121 static_cast<int>(handler.assert_count),
12122 expressions[i].c_str());
12123 result = false;
12124 continue;
12125 }
12126
12127 }
12128 }
12129
12130 {
12131 const std::string expressions[] =
12132 {
12133 " assert(x > y); 1 + 0 ",
12134 " assert(x > y, 'assert statement 2'); 2 + 0 ",
12135 " assert(x > y, 'assert ' + 'statement 3'); 3 + 0 ",
12136 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 4 + 0 ",
12137 " assert(x > y, 'assert ' + 'statement 5'); 5 + 0 ",
12138 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0 "
12139 };
12140
12141 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12142
12143 for (std::size_t i = 0; i < expression_count; ++i)
12144 {
12145 T x = T(1);
12146 T y = T(2);
12147
12148 symbol_table_t symbol_table;
12149 expression_t expression;
12150 parser_t parser;
12151 assert_handler handler;
12152
12153 handler.assert_count = 0;
12154
12155 symbol_table.add_variable("x", x);
12156 symbol_table.add_variable("y", y);
12157 expression.register_symbol_table(symbol_table);
12158
12159 parser.register_assert_check(handler);
12160
12161 if (!parser.compile(expressions[i], expression))
12162 {
12163 printf("run_test22() - Error: %s\tExpression: %s [12]\n",
12164 parser.error().c_str(),
12165 expressions[i].c_str());
12166 result = false;
12167 continue;
12168 }
12169
12170 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12171
12172 typedef typename exprtk::expression_helper<T> et_t;
12173 type_sequence.push_back(et_t::e_assert );
12174 type_sequence.push_back(et_t::e_literal);
12175
12176 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12177 {
12178 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [12]\n",
12179 expressions[i].c_str());
12180 result = false;
12181 continue;
12182 }
12183
12184 expression.value();
12185
12186 if (1 != handler.assert_count)
12187 {
12188 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [12]\n",
12189 static_cast<int>(handler.assert_count),
12190 expressions[i].c_str());
12191 result = false;
12192 continue;
12193 }
12194 }
12195 }
12196
12197 {
12198 const std::string expressions[] =
12199 {
12200 " assert(x > y); 'assert statement 0001' ",
12201 " assert(x > y, 'assert statement 2'); 'assert statement 0002' ",
12202 " assert(x > y, 'assert ' + 'statement 3'); 'assert statement 0003' ",
12203 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 'assert statement 0004' ",
12204 " assert(x > y, 'assert ' + 'statement 5'); 'assert statement 0005' ",
12205 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert statement 0006' "
12206 };
12207
12208 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12209
12210 for (std::size_t i = 0; i < expression_count; ++i)
12211 {
12212 T x = T(1);
12213 T y = T(2);
12214
12215 symbol_table_t symbol_table;
12216 expression_t expression;
12217 parser_t parser;
12218 assert_handler handler;
12219
12220 handler.assert_count = 0;
12221
12222 symbol_table.add_variable("x", x);
12223 symbol_table.add_variable("y", y);
12224 expression.register_symbol_table(symbol_table);
12225
12226 parser.register_assert_check(handler);
12227
12228 if (!parser.compile(expressions[i], expression))
12229 {
12230 printf("run_test22() - Error: %s\tExpression: %s [13]\n",
12231 parser.error().c_str(),
12232 expressions[i].c_str());
12233 result = false;
12234 continue;
12235 }
12236
12237 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12238
12239 typedef typename exprtk::expression_helper<T> et_t;
12240 type_sequence.push_back(et_t::e_assert);
12241 type_sequence.push_back(et_t::e_string);
12242
12243 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12244 {
12245 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [13]\n",
12246 expressions[i].c_str());
12247 result = false;
12248 continue;
12249 }
12250
12251 expression.value();
12252
12253 if (1 != handler.assert_count)
12254 {
12255 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [13]\n",
12256 static_cast<int>(handler.assert_count),
12257 expressions[i].c_str());
12258 result = false;
12259 continue;
12260 }
12261 }
12262 }
12263
12264 {
12265 const std::string expressions[] =
12266 {
12267 " assert(x > y); 'assert statement' + '0001' ",
12268 " assert(x > y, 'assert statement 2'); 'assert statement' + '0002' ",
12269 " assert(x > y, 'assert ' + 'statement 3'); 'assert statement' + '0003' ",
12270 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 'assert statement' + '0004' ",
12271 " assert(x > y, 'assert ' + 'statement 5'); 'assert statement' + '0005' ",
12272 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert statement' + '0006' "
12273 };
12274
12275 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12276
12277 for (std::size_t i = 0; i < expression_count; ++i)
12278 {
12279 T x = T(1);
12280 T y = T(2);
12281
12282 symbol_table_t symbol_table;
12283 expression_t expression;
12284 parser_t parser;
12285 assert_handler handler;
12286
12287 handler.assert_count = 0;
12288
12289 symbol_table.add_variable("x", x);
12290 symbol_table.add_variable("y", y);
12291 expression.register_symbol_table(symbol_table);
12292
12293 parser.register_assert_check(handler);
12294
12295 if (!parser.compile(expressions[i], expression))
12296 {
12297 printf("run_test22() - Error: %s\tExpression: %s [14]\n",
12298 parser.error().c_str(),
12299 expressions[i].c_str());
12300 result = false;
12301 continue;
12302 }
12303
12304 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12305
12306 typedef typename exprtk::expression_helper<T> et_t;
12307 type_sequence.push_back(et_t::e_assert);
12308 type_sequence.push_back(et_t::e_string);
12309
12310 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12311 {
12312 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [14]\n",
12313 expressions[i].c_str());
12314 result = false;
12315 continue;
12316 }
12317
12318 expression.value();
12319
12320 if (1 != handler.assert_count)
12321 {
12322 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [14]\n",
12323 static_cast<int>(handler.assert_count),
12324 expressions[i].c_str());
12325 result = false;
12326 continue;
12327 }
12328 }
12329 }
12330
12331 {
12332 const std::string expressions[] =
12333 {
12334 " assert(1 > 1); 1 + 0; "
12335 " assert(1 > 2, 'assert statement 2'); 2 + 0; "
12336 " assert(1 > 3, 'assert ' + 'statement 3'); 3 + 0; "
12337 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 4 + 0; "
12338 " assert(1 > 5, 'assert ' + 'statement 5'); 5 + 0 "
12339 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0; "
12340 };
12341
12342 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12343
12344 for (std::size_t i = 0; i < expression_count; ++i)
12345 {
12346 expression_t expression;
12347 parser_t parser;
12348 assert_handler handler;
12349
12350 handler.assert_count = 0;
12351
12352 parser.register_assert_check(handler);
12353
12354 if (!parser.compile(expressions[i], expression))
12355 {
12356 printf("run_test22() - Error: %s\tExpression: %s [15]\n",
12357 parser.error().c_str(),
12358 expressions[i].c_str());
12359 result = false;
12360 continue;
12361 }
12362
12363 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12364
12365 typedef typename exprtk::expression_helper<T> et_t;
12366 type_sequence.push_back(et_t::e_assert );
12367 type_sequence.push_back(et_t::e_assert );
12368 type_sequence.push_back(et_t::e_assert );
12369 type_sequence.push_back(et_t::e_assert );
12370 type_sequence.push_back(et_t::e_assert );
12371 type_sequence.push_back(et_t::e_assert );
12372 type_sequence.push_back(et_t::e_literal);
12373
12374 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12375 {
12376 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [15]\n",
12377 expressions[i].c_str());
12378 result = false;
12379 continue;
12380 }
12381
12382 expression.value();
12383
12384 if (6 != handler.assert_count)
12385 {
12386 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [15]\n",
12387 static_cast<int>(handler.assert_count),
12388 expressions[i].c_str());
12389 result = false;
12390 continue;
12391 }
12392 }
12393 }
12394
12395 {
12396 const std::string expressions[] =
12397 {
12398 " assert(1 > 1); 'assert' + '01'; "
12399 " assert(1 > 2, 'assert statement 2'); 'assert' + '02'; "
12400 " assert(1 > 3, 'assert ' + 'statement 3'); 'assert' + '03'; "
12401 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 'assert' + '04'; "
12402 " assert(1 > 5, 'assert ' + 'statement 5'); 'assert' + '05'; "
12403 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert' + '06'; "
12404 };
12405
12406 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12407
12408 for (std::size_t i = 0; i < expression_count; ++i)
12409 {
12410 expression_t expression;
12411 parser_t parser;
12412 assert_handler handler;
12413
12414 handler.assert_count = 0;
12415
12416 parser.register_assert_check(handler);
12417
12418 if (!parser.compile(expressions[i], expression))
12419 {
12420 printf("run_test22() - Error: %s\tExpression: %s [16]\n",
12421 parser.error().c_str(),
12422 expressions[i].c_str());
12423 result = false;
12424 continue;
12425 }
12426
12427 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12428
12429 typedef typename exprtk::expression_helper<T> et_t;
12430 type_sequence.push_back(et_t::e_assert);
12431 type_sequence.push_back(et_t::e_assert);
12432 type_sequence.push_back(et_t::e_assert);
12433 type_sequence.push_back(et_t::e_assert);
12434 type_sequence.push_back(et_t::e_assert);
12435 type_sequence.push_back(et_t::e_assert);
12436 type_sequence.push_back(et_t::e_string);
12437
12438 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12439 {
12440 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [16]\n",
12441 expressions[i].c_str());
12442 result = false;
12443 continue;
12444 }
12445
12446 expression.value();
12447
12448 if (6 != handler.assert_count)
12449 {
12450 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [16]\n",
12451 static_cast<int>(handler.assert_count),
12452 expressions[i].c_str());
12453 result = false;
12454 continue;
12455 }
12456 }
12457 }
12458
12459 {
12460 const std::string expressions[] =
12461 {
12462 " assert(x > y); x + y + 1; "
12463 " assert(x > y, 'assert statement 2'); x + y + 1; "
12464 " assert(x > y, 'assert ' + 'statement 3'); x + y + 1; "
12465 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); x + y + 1; "
12466 " assert(x > y, 'assert ' + 'statement 5'); x + y + 1; "
12467 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); x + y + 1; "
12468 };
12469
12470 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12471
12472 for (std::size_t i = 0; i < expression_count; ++i)
12473 {
12474 T x = T(1);
12475 T y = T(2);
12476
12477 symbol_table_t symbol_table;
12478 expression_t expression;
12479 parser_t parser;
12480 assert_handler handler;
12481
12482 handler.assert_count = 0;
12483
12484 symbol_table.add_variable("x", x);
12485 symbol_table.add_variable("y", y);
12486 expression.register_symbol_table(symbol_table);
12487
12488 parser.register_assert_check(handler);
12489
12490 if (!parser.compile(expressions[i], expression))
12491 {
12492 printf("run_test22() - Error: %s\tExpression: %s [17]\n",
12493 parser.error().c_str(),
12494 expressions[i].c_str());
12495 result = false;
12496 continue;
12497 }
12498
12499 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12500
12501 typedef typename exprtk::expression_helper<T> et_t;
12502 type_sequence.push_back(et_t::e_assert);
12503 type_sequence.push_back(et_t::e_assert);
12504 type_sequence.push_back(et_t::e_assert);
12505 type_sequence.push_back(et_t::e_assert);
12506 type_sequence.push_back(et_t::e_assert);
12507 type_sequence.push_back(et_t::e_assert);
12508 type_sequence.push_back(et_t::e_sf3ext);
12509
12510 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12511 {
12512 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [17]\n",
12513 expressions[i].c_str());
12514 result = false;
12515 continue;
12516 }
12517
12518 expression.value();
12519
12520 if (6 != handler.assert_count)
12521 {
12522 printf("run_test22() - Error: Invalid assert count of %d expected 6. Expression: %s [17]\n",
12523 static_cast<int>(handler.assert_count),
12524 expressions[i].c_str());
12525 result = false;
12526 continue;
12527 }
12528 }
12529 }
12530
12531 {
12532 const std::string expressions[] =
12533 {
12534 " assert(x > y); 'assert' + ((x < y) ? '01' : 'XYZ'); "
12535 " assert(x > y, 'assert statement 2'); 'assert' + ((x < y) ? '02' : 'XYZ'); "
12536 " assert(x > y, 'assert ' + 'statement 3'); 'assert' + ((x < y) ? '03' : 'XYZ'); "
12537 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 'assert' + ((x < y) ? '04' : 'XYZ'); "
12538 " assert(x > y, 'assert ' + 'statement 5'); 'assert' + ((x < y) ? '05' : 'XYZ'); "
12539 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert' + ((x < y) ? '06' : 'XYZ'); "
12540 };
12541
12542 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12543
12544 for (std::size_t i = 0; i < expression_count; ++i)
12545 {
12546 T x = T(1);
12547 T y = T(2);
12548
12549 symbol_table_t symbol_table;
12550 expression_t expression;
12551 parser_t parser;
12552 assert_handler handler;
12553
12554 handler.assert_count = 0;
12555
12556 symbol_table.add_variable("x", x);
12557 symbol_table.add_variable("y", y);
12558 expression.register_symbol_table(symbol_table);
12559
12560 parser.register_assert_check(handler);
12561
12562 if (!parser.compile(expressions[i], expression))
12563 {
12564 printf("run_test22() - Error: %s\tExpression: %s [18]\n",
12565 parser.error().c_str(),
12566 expressions[i].c_str());
12567 result = false;
12568 continue;
12569 }
12570
12571 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12572
12573 typedef typename exprtk::expression_helper<T> et_t;
12574 type_sequence.push_back(et_t::e_assert);
12575 type_sequence.push_back(et_t::e_assert);
12576 type_sequence.push_back(et_t::e_assert);
12577 type_sequence.push_back(et_t::e_assert);
12578 type_sequence.push_back(et_t::e_assert);
12579 type_sequence.push_back(et_t::e_assert);
12580 type_sequence.push_back(et_t::e_string);
12581
12582 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12583 {
12584 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [18]\n",
12585 expressions[i].c_str());
12586 result = false;
12587 continue;
12588 }
12589
12590 expression.value();
12591
12592 if (6 != handler.assert_count)
12593 {
12594 printf("run_test22() - Error: Invalid assert count of %d expected 6. Expression: %s [18]\n",
12595 static_cast<int>(handler.assert_count),
12596 expressions[i].c_str());
12597 result = false;
12598 continue;
12599 }
12600 }
12601 }
12602
12603 return result;
12604}

References assert_handler::assert_count.

◆ test_expression()

template<typename T >
bool test_expression ( const std::string &  expression_string,
const T &  expected_result 
)
inline

Definition at line 1153 of file exprtk_real_test.cpp.

1154{
1155 exprtk::symbol_table<T> symbol_table;
1156 symbol_table.add_constants();
1157
1170
1171 symbol_table.add_function("poly01", poly01);
1172 symbol_table.add_function("poly02", poly02);
1173 symbol_table.add_function("poly03", poly03);
1174 symbol_table.add_function("poly04", poly04);
1175 symbol_table.add_function("poly05", poly05);
1176 symbol_table.add_function("poly06", poly06);
1177 symbol_table.add_function("poly07", poly07);
1178 symbol_table.add_function("poly08", poly08);
1179 symbol_table.add_function("poly09", poly09);
1180 symbol_table.add_function("poly10", poly10);
1181 symbol_table.add_function("poly11", poly11);
1182 symbol_table.add_function("poly12", poly12);
1183
1184 exprtk::expression<T> expression;
1185 expression.register_symbol_table(symbol_table);
1186
1187 {
1188 exprtk::parser<T> parser;
1189
1190 if (!parser.compile(expression_string,expression))
1191 {
1192 printf("test_expression() - Error: %s Expression: %s\n",
1193 parser.error().c_str(),
1194 expression_string.c_str());
1195
1196 return false;
1197 }
1198 }
1199
1201 {
1202 printf("test_expression() - Error: Expression did not compile to a constant! Expression: %s\n",
1203 expression_string.c_str());
1204
1205 return false;
1206 }
1207
1208 const T result = expression.value();
1209
1210 if (not_equal(result,expected_result))
1211 {
1212 printf("test_expression() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
1213 expression_string.c_str(),
1214 static_cast<double>(expected_result),
1215 static_cast<double>(result));
1216
1217 return false;
1218 }
1219
1220 return true;
1221}

References exprtk::symbol_table< T >::add_constants(), exprtk::symbol_table< T >::add_function(), exprtk::parser< T >::compile(), exprtk::parser< T >::error(), not_equal(), exprtk::expression< T >::register_symbol_table(), and exprtk::expression< T >::value().

Here is the call graph for this function:

Variable Documentation

◆ global_test_list

const test_t global_test_list[]
static

Definition at line 48 of file exprtk_real_test.cpp.

49{
50 // Note: Each of following tests must compile down
51 // to a single literal node.
52 test_t("0",0.0),
53 test_t("1",1.0),
54 test_t("2",2.0),
55 test_t("3",3.0),
56 test_t("4",4.0),
57 test_t("5",5.0),
58 test_t("6",6.0),
59 test_t("7",7.0),
60 test_t("8",8.0),
61 test_t("9",9.0),
62 test_t("12.12",12.12),
63 test_t("123.123",123.123),
64 test_t("1234.1234",1234.1234),
65 test_t("12345.12345",12345.12345),
66 test_t("123456.123456",123456.123456),
67 test_t("0.0",0.0),
68 test_t("1.0",1.0),
69 test_t("2.0",2.0),
70 test_t("3.0",3.0),
71 test_t("4.0",4.0),
72 test_t("5.0",5.0),
73 test_t("6.0",6.0),
74 test_t("7.0",7.0),
75 test_t("8.0",8.0),
76 test_t("9.0",9.0),
77 test_t("0.0",0.0),
78 test_t("1.1",1.1),
79 test_t("2.2",2.2),
80 test_t("3.3",3.3),
81 test_t("4.4",4.4),
82 test_t("5.5",5.5),
83 test_t("6.6",6.6),
84 test_t("7.7",7.7),
85 test_t("8.8",8.8),
86 test_t("9.9",9.9),
87 test_t("+0",0.0),
88 test_t("+1",1.0),
89 test_t("+2",2.0),
90 test_t("+3",3.0),
91 test_t("+4",4.0),
92 test_t("+5",5.0),
93 test_t("+6",6.0),
94 test_t("+7",7.0),
95 test_t("+8",8.0),
96 test_t("+9",9.0),
97 test_t("+0.0",0.0),
98 test_t("+1.0",1.0),
99 test_t("+2.0",2.0),
100 test_t("+3.0",3.0),
101 test_t("+4.0",4.0),
102 test_t("+5.0",5.0),
103 test_t("+6.0",6.0),
104 test_t("+7.0",7.0),
105 test_t("+8.0",8.0),
106 test_t("+9.0",9.0),
107 test_t("+0.0",0.0),
108 test_t("+1.1",1.1),
109 test_t("+2.2",2.2),
110 test_t("+3.3",3.3),
111 test_t("+4.4",4.4),
112 test_t("+5.5",5.5),
113 test_t("+6.6",6.6),
114 test_t("+7.7",7.7),
115 test_t("+8.8",8.8),
116 test_t("+9.9",9.9),
117 test_t("-0",-0.0),
118 test_t("-1",-1.0),
119 test_t("-2",-2.0),
120 test_t("-3",-3.0),
121 test_t("-4",-4.0),
122 test_t("-5",-5.0),
123 test_t("-6",-6.0),
124 test_t("-7",-7.0),
125 test_t("-8",-8.0),
126 test_t("-9",-9.0),
127 test_t("-0.0",-0.0),
128 test_t("-1.0",-1.0),
129 test_t("-2.0",-2.0),
130 test_t("-3.0",-3.0),
131 test_t("-4.0",-4.0),
132 test_t("-5.0",-5.0),
133 test_t("-6.0",-6.0),
134 test_t("-7.0",-7.0),
135 test_t("-8.0",-8.0),
136 test_t("-9.0",-9.0),
137 test_t("-0.0",-0.0),
138 test_t("-1.1",-1.1),
139 test_t("-2.2",-2.2),
140 test_t("-3.3",-3.3),
141 test_t("-4.4",-4.4),
142 test_t("-5.5",-5.5),
143 test_t("-6.6",-6.6),
144 test_t("-7.7",-7.7),
145 test_t("-8.8",-8.8),
146 test_t("-9.9",-9.9),
147 test_t("0.0e+0" ,+0.0e+0),
148 test_t("1.1e+1" ,+1.1e+1),
149 test_t("2.2e+2" ,+2.2e+2),
150 test_t("3.3e+3" ,+3.3e+3),
151 test_t("4.4e+4" ,+4.4e+4),
152 test_t("5.5e+5" ,+5.5e+5),
153 test_t("6.6e+6" ,+6.6e+6),
154 test_t("7.7e+7" ,+7.7e+7),
155 test_t("8.8e+8" ,+8.8e+8),
156 test_t("9.9e+9" ,+9.9e+9),
157 test_t("-0.0e+0",-0.0e+0),
158 test_t("-1.1e+1",-1.1e+1),
159 test_t("-2.2e+2",-2.2e+2),
160 test_t("-3.3e+3",-3.3e+3),
161 test_t("-4.4e+4",-4.4e+4),
162 test_t("-5.5e+5",-5.5e+5),
163 test_t("-6.6e+6",-6.6e+6),
164 test_t("-7.7e+7",-7.7e+7),
165 test_t("-8.8e+8",-8.8e+8),
166 test_t("-9.9e+9",-9.9e+9),
167 test_t("0.0E+0" ,+0.0E+0),
168 test_t("1.1E+1" ,+1.1E+1),
169 test_t("2.2E+2" ,+2.2E+2),
170 test_t("3.3E+3" ,+3.3E+3),
171 test_t("4.4E+4" ,+4.4E+4),
172 test_t("5.5E+5" ,+5.5E+5),
173 test_t("6.6E+6" ,+6.6E+6),
174 test_t("7.7E+7" ,+7.7E+7),
175 test_t("8.8E+8" ,+8.8E+8),
176 test_t("9.9E+9" ,+9.9E+9),
177 test_t("-0.0E+0",-0.0E+0),
178 test_t("-1.1E+1",-1.1E+1),
179 test_t("-2.2E+2",-2.2E+2),
180 test_t("-3.3E+3",-3.3E+3),
181 test_t("-4.4E+4",-4.4E+4),
182 test_t("-5.5E+5",-5.5E+5),
183 test_t("-6.6E+6",-6.6E+6),
184 test_t("-7.7E+7",-7.7E+7),
185 test_t("-8.8E+8",-8.8E+8),
186 test_t("-9.9E+9",-9.9E+9),
187 test_t("(0)",0.0),
188 test_t("(1)",1.0),
189 test_t("(2)",2.0),
190 test_t("(3)",3.0),
191 test_t("(4)",4.0),
192 test_t("(5)",5.0),
193 test_t("(6)",6.0),
194 test_t("(7)",7.0),
195 test_t("(8)",8.0),
196 test_t("(9)",9.0),
197 test_t("(0.0)",0.0),
198 test_t("(1.0)",1.0),
199 test_t("(2.0)",2.0),
200 test_t("(3.0)",3.0),
201 test_t("(4.0)",4.0),
202 test_t("(5.0)",5.0),
203 test_t("(6.0)",6.0),
204 test_t("(7.0)",7.0),
205 test_t("(8.0)",8.0),
206 test_t("(9.0)",9.0),
207 test_t("(0.0)",0.0),
208 test_t("(1.1)",1.1),
209 test_t("(2.2)",2.2),
210 test_t("(3.3)",3.3),
211 test_t("(4.4)",4.4),
212 test_t("(5.5)",5.5),
213 test_t("(6.6)",6.6),
214 test_t("(7.7)",7.7),
215 test_t("(8.8)",8.8),
216 test_t("(9.9)",9.9),
217 test_t("(+0)" ,0.0),
218 test_t("(+1)" ,1.0),
219 test_t("(+2)" ,2.0),
220 test_t("(+3)" ,3.0),
221 test_t("(+4)" ,4.0),
222 test_t("(+5)" ,5.0),
223 test_t("(+6)" ,6.0),
224 test_t("(+7)" ,7.0),
225 test_t("(+8)" ,8.0),
226 test_t("(+9)" ,9.0),
227 test_t("(+0.0)",0.0),
228 test_t("(+1.0)",1.0),
229 test_t("(+2.0)",2.0),
230 test_t("(+3.0)",3.0),
231 test_t("(+4.0)",4.0),
232 test_t("(+5.0)",5.0),
233 test_t("(+6.0)",6.0),
234 test_t("(+7.0)",7.0),
235 test_t("(+8.0)",8.0),
236 test_t("(+9.0)",9.0),
237 test_t("(+0.0)",0.0),
238 test_t("(+1.1)",1.1),
239 test_t("(+2.2)",2.2),
240 test_t("(+3.3)",3.3),
241 test_t("(+4.4)",4.4),
242 test_t("(+5.5)",5.5),
243 test_t("(+6.6)",6.6),
244 test_t("(+7.7)",7.7),
245 test_t("(+8.8)",8.8),
246 test_t("(+9.9)",9.9),
247 test_t("(-0)" ,-0.0),
248 test_t("(-1)" ,-1.0),
249 test_t("(-2)" ,-2.0),
250 test_t("(-3)" ,-3.0),
251 test_t("(-4)" ,-4.0),
252 test_t("(-5)" ,-5.0),
253 test_t("(-6)" ,-6.0),
254 test_t("(-7)" ,-7.0),
255 test_t("(-8)" ,-8.0),
256 test_t("(-9)" ,-9.0),
257 test_t("(-0.0)",-0.0),
258 test_t("(-1.0)",-1.0),
259 test_t("(-2.0)",-2.0),
260 test_t("(-3.0)",-3.0),
261 test_t("(-4.0)",-4.0),
262 test_t("(-5.0)",-5.0),
263 test_t("(-6.0)",-6.0),
264 test_t("(-7.0)",-7.0),
265 test_t("(-8.0)",-8.0),
266 test_t("(-9.0)",-9.0),
267 test_t("(-0.0)",-0.0),
268 test_t("(-1.1)",-1.1),
269 test_t("(-2.2)",-2.2),
270 test_t("(-3.3)",-3.3),
271 test_t("(-4.4)",-4.4),
272 test_t("(-5.5)",-5.5),
273 test_t("(-6.6)",-6.6),
274 test_t("(-7.7)",-7.7),
275 test_t("(-8.8)",-8.8),
276 test_t("(-9.9)",-9.9),
277 test_t("-(1.1)",-1.1),
278 test_t("-(1.1+2.2)",-3.3),
279 test_t("1234567890",1234567890),
280 test_t("123456789.0",123456789.0),
281 test_t("+1234567890",1234567890),
282 test_t("+123456789.0",123456789.0),
283 test_t("-1234567890",-1234567890),
284 test_t("-123456789.0",-123456789.0),
285 test_t("1234.567890",1234.567890),
286 test_t("-1234.567890",-1234.567890),
287 test_t("0+9",9.0),
288 test_t("1+8",9.0),
289 test_t("2+7",9.0),
290 test_t("3+6",9.0),
291 test_t("4+5",9.0),
292 test_t("5+4",9.0),
293 test_t("6+3",9.0),
294 test_t("7+2",9.0),
295 test_t("8+1",9.0),
296 test_t("9+0",9.0),
297 test_t(" 0 + 9 ",9.0),
298 test_t(" 1 + 8 ",9.0),
299 test_t(" 2 + 7 ",9.0),
300 test_t(" 3 + 6 ",9.0),
301 test_t(" 4 + 5 ",9.0),
302 test_t(" 5 + 4 ",9.0),
303 test_t(" 6 + 3 ",9.0),
304 test_t(" 7 + 2 ",9.0),
305 test_t(" 8 + 1 ",9.0),
306 test_t(" 9 + 0 ",9.0),
307 test_t("( 0 + 9 )",9.0),
308 test_t("( 1 + 8 )",9.0),
309 test_t("( 2 + 7 )",9.0),
310 test_t("( 3 + 6 )",9.0),
311 test_t("( 4 + 5 )",9.0),
312 test_t("( 5 + 4 )",9.0),
313 test_t("( 6 + 3 )",9.0),
314 test_t("( 7 + 2 )",9.0),
315 test_t("( 8 + 1 )",9.0),
316 test_t("( 9 + 0 )",9.0),
317 test_t("1E1+1",11.0),
318 test_t("1e1+1",11.0),
319 test_t("1E1-1", 9.0),
320 test_t("1e1-1", 9.0),
321 test_t("1E01+1",11.0),
322 test_t("1e01+1",11.0),
323 test_t("1E01-1", 9.0),
324 test_t("1e01-1", 9.0),
325 test_t("1+2",+3.0),
326 test_t("1-2",-1.0),
327 test_t("1*2",+2.0),
328 test_t("1/2",+0.5),
329 test_t("1.1+2.2", +3.3),
330 test_t("1.1-2.2", -1.1),
331 test_t("1.1*2.2",+2.42),
332 test_t("1.1/2.2", +0.5),
333 test_t("0-9",-9.0),
334 test_t("1-8",-7.0),
335 test_t("2-7",-5.0),
336 test_t("3-6",-3.0),
337 test_t("4-5",-1.0),
338 test_t("5-4",+1.0),
339 test_t("6-3",+3.0),
340 test_t("7-2",+5.0),
341 test_t("8-1",+7.0),
342 test_t("9-0",+9.0),
343 test_t("2.*3",+6.0),
344 test_t("2.*3.",+6.0),
345 test_t("2.+3",+5.0),
346 test_t("2.+3.",+5.0),
347 test_t("123.*456.",+56088.0),
348 test_t(" 0 - 9 ",-9.0),
349 test_t(" 1 - 8 ",-7.0),
350 test_t(" 2 - 7 ",-5.0),
351 test_t(" 3 - 6 ",-3.0),
352 test_t(" 4 - 5 ",-1.0),
353 test_t(" 5 - 4 ",+1.0),
354 test_t(" 6 - 3 ",+3.0),
355 test_t(" 7 - 2 ",+5.0),
356 test_t(" 8 - 1 ",+7.0),
357 test_t(" 9 - 0 ",+9.0),
358 test_t("( 0 - 9 )",-9.0),
359 test_t("( 1 - 8 )",-7.0),
360 test_t("( 2 - 7 )",-5.0),
361 test_t("( 3 - 6 )",-3.0),
362 test_t("( 4 - 5 )",-1.0),
363 test_t("( 5 - 4 )",+1.0),
364 test_t("( 6 - 3 )",+3.0),
365 test_t("( 7 - 2 )",+5.0),
366 test_t("( 8 - 1 )",+7.0),
367 test_t("( 9 - 0 )",+9.0),
368 test_t("1 - -1" , 2.0),
369 test_t("1 --1" , 2.0),
370 test_t("1-- 1" , 2.0),
371 test_t("1--1" , 2.0),
372 test_t("1 -- -1", 0.0),
373 test_t("1 + -1" , 0.0),
374 test_t("1 +-1" , 0.0),
375 test_t("1+- 1" , 0.0),
376 test_t("1+-1" , 0.0),
377 test_t("1 +- -1", 2.0),
378 test_t("1 + +1" , 2.0),
379 test_t("1 ++1" , 2.0),
380 test_t("1 - -1 + 1" , 3.0),
381 test_t("1 --1 + 1" , 3.0),
382 test_t("1-- 1 + 1" , 3.0),
383 test_t("1--1 + 1" , 3.0),
384 test_t("1 -- -1 + 1", 1.0),
385 test_t("1 + -1 + 1" , 1.0),
386 test_t("1 +-1 + 1" , 1.0),
387 test_t("1+- 1 + 1" , 1.0),
388 test_t("1+-1 + 1" , 1.0),
389 test_t("1 +- -1 + 1", 3.0),
390 test_t("1 + +1 + 1" , 3.0),
391 test_t("1 ++1 + 1" , 3.0),
392 test_t("1 - -1 - 1" , 1.0),
393 test_t("1 --1 - 1" , 1.0),
394 test_t("1-- 1 - 1" , 1.0),
395 test_t("1--1 - 1" , 1.0),
396 test_t("1 -- -1 - 1", -1.0),
397 test_t("1 + -1 - 1" , -1.0),
398 test_t("1 +-1 - 1" , -1.0),
399 test_t("1+- 1 - 1" , -1.0),
400 test_t("1+-1 - 1" , -1.0),
401 test_t("1 +- -1 - 1", 1.0),
402 test_t("1 + +1 - 1" , 1.0),
403 test_t("1 ++1 - 1" , 1.0),
404 test_t("-(1+2)",-3.0),
405 test_t("+(1+2)",+3.0),
406 test_t("+(1-2)",-1.0),
407 test_t("-(1-2)",+1.0),
408 test_t("(-3*-6)",+18.0),
409 test_t("(-6*-3)",+18.0),
410 test_t("-(-3*-6)",-18.0),
411 test_t("-(-6*-3)",-18.0),
412 test_t("1.1+2.2+3.3",+6.6),
413 test_t("+1.1+2.2+3.3",+6.6),
414 test_t("-1.1-2.2-3.3",-6.6),
415 test_t("1.1*2.2*3.3",+7.986),
416 test_t("+1.1*2.2*3.3",+7.986),
417 test_t("-1.1*-2.2*-3.3",-7.986),
418 test_t("1 + 1/2",+1.5),
419 test_t("1 + (1/2)",+1.5),
420 test_t("1.1 + 1.1/2.2",+1.6),
421 test_t("1.1 + (1.1/2.2)",+1.6),
422 test_t("2 * 1/2",+1.0),
423 test_t("2 * (1/2)",+1.0),
424 test_t("2.2 * 1.1/2.2",+1.1),
425 test_t("2.2 * (1.1/2.2)",+1.1),
426 test_t("1^2",1.0),
427 test_t("2^1",2.0),
428 test_t("2^3",8.0),
429 test_t("-2^3",-8.0),
430 test_t("-2^4",-16.0),
431 test_t("(-2)^3",-8.0),
432 test_t("(-2)^4",+16.0),
433 test_t("3^2^4",43046721.0),
434 test_t("1.1^2.2",1.23328630055466251099),
435 test_t("2.2^1.1",2.3804822576003541627),
436 test_t("2.2^3.3",13.48946876053338489127),
437 test_t("3.3^2.2^1.1",17.15193942371376191362),
438 test_t("+3.3^2.2^1.1",17.15193942371376191362),
439 test_t("3.3^+2.2^1.1",17.15193942371376191362),
440 test_t("3.3^2.2^+1.1",17.15193942371376191362),
441 test_t("3.3^2.2^-1.1",1.65127293793867959137),
442 test_t("+3.3^+2.2^-1.1",1.65127293793867959137),
443 test_t("1.1^(1.1 * 2.2)",1.25941916576299080582),
444 test_t("2.2^(1.1 * 3.3)",17.49823848953534759743),
445 test_t("3.3^(1.1 * 2.2)",17.98058156638874965269),
446 test_t("1.1^-2.2/1.1",0.73712884727743375853),
447 test_t("1.1^+2.2/1.1",1.121169364140602282717273261774),
448 test_t("1.1^2.2/+1.1",1.121169364140602282717273261774),
449 test_t("1.1^+2.2/+1.1",1.121169364140602282717273261774),
450 test_t("1.1^+2.2/-1.1",-1.121169364140602282717273261774),
451 test_t("1.1^2.2/-1.1",-1.121169364140602282717273261774),
452 test_t("1.1^+2.2/-1.1",-1.121169364140602282717273261774),
453 test_t("+1.1^-2.2/1.1",0.73712884727743375853),
454 test_t("+1.1^+2.2/1.1",1.121169364140602282717273261774),
455 test_t("+1.1^2.2/+1.1",1.121169364140602282717273261774),
456 test_t("+1.1^+2.2/+1.1",1.121169364140602282717273261774),
457 test_t("+1.1^+2.2/-1.1",-1.121169364140602282717273261774),
458 test_t("+1.1^2.2/-1.1",-1.121169364140602282717273261774),
459 test_t("+1.1^+2.2/-1.1",-1.121169364140602282717273261774),
460 test_t("equal(1.23^3,(1.23 * 1.23 * 1.23))",1.0),
461 test_t("equal(1.23^-3,1/(1.23 * 1.23 * 1.23))",1.0),
462 test_t("equal((2.1 + 1.23^3),(2.1 + [1.23 * 1.23 * 1.23]))",1.0),
463 test_t("equal((2.1 - 1.23^3),(2.1 - [1.23 * 1.23 * 1.23]))",1.0),
464 test_t("equal((2.1 * 1.23^3),(2.1 * [1.23 * 1.23 * 1.23]))",1.0),
465 test_t("equal((2.1 / 1.23^3),(2.1 / [1.23 * 1.23 * 1.23]))",1.0),
466 test_t("equal((1.23^3 + 2.1),({1.23 * 1.23 * 1.23} + 2.1))",1.0),
467 test_t("equal((1.23^3 - 2.1),({1.23 * 1.23 * 1.23} - 2.1))",1.0),
468 test_t("equal((1.23^3 * 2.1),({1.23 * 1.23 * 1.23} * 2.1))",1.0),
469 test_t("equal((1.23^3 / 2.1),({1.23 * 1.23 * 1.23} / 2.1))",1.0),
470 test_t("equal(1.0^(1.0/2.0),sqrt(1.0))",1.0),
471 test_t("equal(1.0^(1.0/2.0),root(1.0,2.0))",1.0),
472 test_t("equal(1.0^(1.0/3.0),root(1.0,3.0))",1.0),
473 test_t("equal(1.0^(1.0/4.0),root(1.0,4.0))",1.0),
474 test_t("equal(1.0^(1.0/5.0),root(1.0,5.0))",1.0),
475 test_t("equal(1.0^(1.0/6.0),root(1.0,6.0))",1.0),
476 test_t("equal(1.0^(1.0/7.0),root(1.0,7.0))",1.0),
477 test_t("equal(1.0^(1.0/8.0),root(1.0,8.0))",1.0),
478 test_t("equal(1.0^(1.0/9.0),root(1.0,9.0))",1.0),
479 test_t("equal(2.0^(1.0/2.0),sqrt(2.0))",1.0),
480 test_t("equal(2.0^(1.0/2.0),root(2.0,2.0))",1.0),
481 test_t("equal(3.0^(1.0/3.0),root(3.0,3.0))",1.0),
482 test_t("equal(4.0^(1.0/4.0),root(4.0,4.0))",1.0),
483 test_t("equal(5.0^(1.0/5.0),root(5.0,5.0))",1.0),
484 test_t("equal(6.0^(1.0/6.0),root(6.0,6.0))",1.0),
485 test_t("equal(7.0^(1.0/7.0),root(7.0,7.0))",1.0),
486 test_t("equal(8.0^(1.0/8.0),root(8.0,8.0))",1.0),
487 test_t("equal(9.0^(1.0/9.0),root(9.0,9.0))",1.0),
488 test_t("1 < 2", 1.0),
489 test_t("1 <= 2", 1.0),
490 test_t("1.1 <= 2.2", 1.0),
491 test_t("(1.0 + 0.1) <= (2.0 + 0.2)", 1.0),
492 test_t("1 > 2", 0.0),
493 test_t("1 >= 2", 0.0),
494 test_t("1.1 >= 2.2", 0.0),
495 test_t("(1.0 + 0.1) >= (2.0 + 0.2)", 0.0),
496 test_t("1 <> 2", 1.0),
497 test_t("1 != 2", 1.0),
498 test_t("1.1 <> 2.2", 1.0),
499 test_t("1.1 != 2.2", 1.0),
500 test_t("(1.0 + 0.1) <> (2.0 + 0.2)", 1.0),
501 test_t("(1.0 + 0.1) != (2.0 + 0.2)", 1.0),
502 test_t("1 == 1", 1.0),
503 test_t("1.1 == 1.1", 1.0),
504 test_t("1 = 1", 1.0),
505 test_t("1.1 = 1.1", 1.0),
506 test_t("1 <> 1", 0.0),
507 test_t("1 != 1", 0.0),
508 test_t("1.1 <> 1.1", 0.0),
509 test_t("1.1 != 1.1", 0.0),
510 test_t("(1.0 + 0.1) <> (1.0 + 0.1)", 0.0),
511 test_t("(1.0 + 0.1) != (1.0 + 0.1)", 0.0),
512 test_t("equal(1.1,1.1)",1.0),
513 test_t("equal(1.1,2.2)",0.0),
514 test_t("not_equal(1.1,1.1)",0.0),
515 test_t("not_equal(1.1,2.2)",1.0),
516 test_t("1 and 1",1.0),
517 test_t("1 and 0",0.0),
518 test_t("0 and 1",0.0),
519 test_t("0 and 0",0.0),
520 test_t("1.0 and 1.0",1.0),
521 test_t("1.0 and 0.0",0.0),
522 test_t("0.0 and 1.0",0.0),
523 test_t("0.0 and 0.0",0.0),
524 test_t("(1 and 1)",1.0),
525 test_t("(1 and 0)",0.0),
526 test_t("(0 and 1)",0.0),
527 test_t("(0 and 0)",0.0),
528 test_t("(1.0 and 1.0)",1.0),
529 test_t("(1.0 and 0.0)",0.0),
530 test_t("(0.0 and 1.0)",0.0),
531 test_t("(0.0 and 0.0)",0.0),
532 test_t("1 or 1",1.0),
533 test_t("1 or 0",1.0),
534 test_t("0 or 1",1.0),
535 test_t("0 or 0",0.0),
536 test_t("1.0 or 1.0",1.0),
537 test_t("1.0 or 0.0",1.0),
538 test_t("0.0 or 1.0",1.0),
539 test_t("0.0 or 0.0",0.0),
540 test_t("(1 or 1)",1.0),
541 test_t("(1 or 0)",1.0),
542 test_t("(0 or 1)",1.0),
543 test_t("(0 or 0)",0.0),
544 test_t("(1.0 or 1.0)",1.0),
545 test_t("(1.0 or 0.0)",1.0),
546 test_t("(0.0 or 1.0)",1.0),
547 test_t("(0.0 or 0.0)",0.0),
548 test_t("1 nand 1",0.0),
549 test_t("1 nand 0",1.0),
550 test_t("0 nand 1",1.0),
551 test_t("0 nand 0",1.0),
552 test_t("1.0 nand 1.0",0.0),
553 test_t("1.0 nand 0.0",1.0),
554 test_t("0.0 nand 1.0",1.0),
555 test_t("0.0 nand 0.0",1.0),
556 test_t("(1 nand 1)",0.0),
557 test_t("(1 nand 0)",1.0),
558 test_t("(0 nand 1)",1.0),
559 test_t("(0 nand 0)",1.0),
560 test_t("(1.0 nand 1.0)",0.0),
561 test_t("(1.0 nand 0.0)",1.0),
562 test_t("(0.0 nand 1.0)",1.0),
563 test_t("(0.0 nand 0.0)",1.0),
564 test_t("1 nor 1",0.0),
565 test_t("1 nor 0",0.0),
566 test_t("0 nor 1",0.0),
567 test_t("0 nor 0",1.0),
568 test_t("1.0 nor 1.0",0.0),
569 test_t("1.0 nor 0.0",0.0),
570 test_t("0.0 nor 1.0",0.0),
571 test_t("0.0 nor 0.0",1.0),
572 test_t("(1 nor 1)",0.0),
573 test_t("(1 nor 0)",0.0),
574 test_t("(0 nor 1)",0.0),
575 test_t("(0 nor 0)",1.0),
576 test_t("(1.0 nor 1.0)",0.0),
577 test_t("(1.0 nor 0.0)",0.0),
578 test_t("(0.0 nor 1.0)",0.0),
579 test_t("(0.0 nor 0.0)",1.0),
580 test_t("0 xor 0",0.0),
581 test_t("0 xor 1",1.0),
582 test_t("1 xor 0",1.0),
583 test_t("1 xor 1",0.0),
584 test_t("0.0 xor 0.0",0.0),
585 test_t("0.0 xor 1.0",1.0),
586 test_t("1.0 xor 0.0",1.0),
587 test_t("1.0 xor 1.0",0.0),
588 test_t("(0 xor 0)",0.0),
589 test_t("(0 xor 1)",1.0),
590 test_t("(1 xor 0)",1.0),
591 test_t("(1 xor 1)",0.0),
592 test_t("(0.0 xor 0.0)",0.0),
593 test_t("(0.0 xor 1.0)",1.0),
594 test_t("(1.0 xor 0.0)",1.0),
595 test_t("(1.0 xor 1.0)",0.0),
596 test_t("1 & 1",1.0),
597 test_t("1 & 0",0.0),
598 test_t("0 & 1",0.0),
599 test_t("0 & 0",0.0),
600 test_t("1.0 & 1.0",1.0),
601 test_t("1.0 & 0.0",0.0),
602 test_t("0.0 & 1.0",0.0),
603 test_t("0.0 & 0.0",0.0),
604 test_t("(1 & 1)",1.0),
605 test_t("(1 & 0)",0.0),
606 test_t("(0 & 1)",0.0),
607 test_t("(0 & 0)",0.0),
608 test_t("(1.0 & 1.0)",1.0),
609 test_t("(1.0 & 0.0)",0.0),
610 test_t("(0.0 & 1.0)",0.0),
611 test_t("(0.0 & 0.0)",0.0),
612 test_t("1 | 1",1.0),
613 test_t("1 | 0",1.0),
614 test_t("0 | 1",1.0),
615 test_t("0 | 0",0.0),
616 test_t("1.0 | 1.0",1.0),
617 test_t("1.0 | 0.0",1.0),
618 test_t("0.0 | 1.0",1.0),
619 test_t("0.0 | 0.0",0.0),
620 test_t("(1 | 1)",1.0),
621 test_t("(1 | 0)",1.0),
622 test_t("(0 | 1)",1.0),
623 test_t("(0 | 0)",0.0),
624 test_t("(1.0 | 1.0)",1.0),
625 test_t("(1.0 | 0.0)",1.0),
626 test_t("(0.0 | 1.0)",1.0),
627 test_t("(0.0 | 0.0)",0.0),
628 test_t("(1 nand 1) == not(1 and 1)",1.0),
629 test_t("(1 nand 0) == not(1 and 0)",1.0),
630 test_t("(0 nand 1) == not(0 and 1)",1.0),
631 test_t("(0 nand 0) == not(0 and 0)",1.0),
632 test_t("(1 nor 1) == not(1 or 1)",1.0),
633 test_t("(1 nor 0) == not(1 or 0)",1.0),
634 test_t("(0 nor 1) == not(0 or 1)",1.0),
635 test_t("(0 nor 0) == not(0 or 0)",1.0),
636 test_t("(1.0 nand 1.0) == not(1.0 and 1.0)",1.0),
637 test_t("(1.0 nand 0.0) == not(1.0 and 0.0)",1.0),
638 test_t("(0.0 nand 1.0) == not(0.0 and 1.0)",1.0),
639 test_t("(0.0 nand 0.0) == not(0.0 and 0.0)",1.0),
640 test_t("(1.0 nor 1.0) == not(1.0 or 1.0)",1.0),
641 test_t("(1.0 nor 0.0) == not(1.0 or 0.0)",1.0),
642 test_t("(0.0 nor 1.0) == not(0.0 or 1.0)",1.0),
643 test_t("(0.0 nor 0.0) == not(0.0 or 0.0)",1.0),
644 test_t("(1 nand 1) == not(1 & 1)",1.0),
645 test_t("(1 nand 0) == not(1 & 0)",1.0),
646 test_t("(0 nand 1) == not(0 & 1)",1.0),
647 test_t("(0 nand 0) == not(0 & 0)",1.0),
648 test_t("(1 nor 1) == not(1 | 1)",1.0),
649 test_t("(1 nor 0) == not(1 | 0)",1.0),
650 test_t("(0 nor 1) == not(0 | 1)",1.0),
651 test_t("(0 nor 0) == not(0 | 0)",1.0),
652 test_t("(1.0 nand 1.0) == not(1.0 & 1.0)",1.0),
653 test_t("(1.0 nand 0.0) == not(1.0 & 0.0)",1.0),
654 test_t("(0.0 nand 1.0) == not(0.0 & 1.0)",1.0),
655 test_t("(0.0 nand 0.0) == not(0.0 & 0.0)",1.0),
656 test_t("(1.0 nor 1.0) == not(1.0 | 1.0)",1.0),
657 test_t("(1.0 nor 0.0) == not(1.0 | 0.0)",1.0),
658 test_t("(0.0 nor 1.0) == not(0.0 | 1.0)",1.0),
659 test_t("(0.0 nor 0.0) == not(0.0 | 0.0)",1.0),
660 test_t("mand(1,1)",1.0),
661 test_t("mand(1,0)",0.0),
662 test_t("mand(0,1)",0.0),
663 test_t("mand(0,0)",0.0),
664 test_t("mand(1.0,1.0)",1.0),
665 test_t("mand(1.0,0.0)",0.0),
666 test_t("mand(0.0,1.0)",0.0),
667 test_t("mand(0.0,0.0)",0.0),
668 test_t("mor(1,1)",1.0),
669 test_t("mor(1,0)",1.0),
670 test_t("mor(0,1)",1.0),
671 test_t("mor(0,0)",0.0),
672 test_t("mor(1.0,1.0)",1.0),
673 test_t("mor(1.0,0.0)",1.0),
674 test_t("mor(0.0,1.0)",1.0),
675 test_t("mor(0.0,0.0)",0.0),
676 test_t("(1 nand 1) == not(mand(1,1))",1.0),
677 test_t("(1 nand 0) == not(mand(1,0))",1.0),
678 test_t("(0 nand 1) == not(mand(0,1))",1.0),
679 test_t("(0 nand 0) == not(mand(0,0))",1.0),
680 test_t("(1 nor 1) == not(mor(1,1))",1.0),
681 test_t("(1 nor 0) == not(mor(1,0))",1.0),
682 test_t("(0 nor 1) == not(mor(0,1))",1.0),
683 test_t("(0 nor 0) == not(mor(0,0))",1.0),
684 test_t("(1.0 nand 1.0) == not(mand(1.0,1.0))",1.0),
685 test_t("(1.0 nand 0.0) == not(mand(1.0,0.0))",1.0),
686 test_t("(0.0 nand 1.0) == not(mand(0.0,1.0))",1.0),
687 test_t("(0.0 nand 0.0) == not(mand(0.0,0.0))",1.0),
688 test_t("(1.0 nor 1.0) == not(mor(1.0,1.0))",1.0),
689 test_t("(1.0 nor 0.0) == not(mor(1.0,0.0))",1.0),
690 test_t("(0.0 nor 1.0) == not(mor(0.0,1.0))",1.0),
691 test_t("(0.0 nor 0.0) == not(mor(0.0,0.0))",1.0),
692 test_t("abs(1)",1.0),
693 test_t("abs(-1)",1.0),
694 test_t("abs(1.0)",1.0),
695 test_t("abs(-1.0)",1.0),
696 test_t("min(1,2)",1.0),
697 test_t("min(1,2,3)",1.0),
698 test_t("min(1,2,3,4)",1.0),
699 test_t("min(1,2,3,4,5)",1.0),
700 test_t("min(1,2,3,4,5,6)",1.0),
701 test_t("min(1.1,2.2)",1.1),
702 test_t("min(1.1,2.2,3.3)",1.1),
703 test_t("min(1.1,2.2,3.3,4.4)",1.1),
704 test_t("min(1.1,2.2,3.3,4.4,5.5)",1.1),
705 test_t("min(1.1,2.2,3.3,4.4,5.5,6.6)",1.1),
706 test_t("min(min(1,2),min(3,4))",1.0),
707 test_t("max(1,2)",2.0),
708 test_t("max(1,2,3)",3.0),
709 test_t("max(1,2,3,4)",4.0),
710 test_t("max(1,2,3,4,5)",5.0),
711 test_t("max(1,2,3,4,5,6)",6.0),
712 test_t("max(1.1,2.2)",2.2),
713 test_t("max(1.1,2.2,3.3)",3.3),
714 test_t("max(1.1,2.2,3.3,4.4)",4.4),
715 test_t("max(1.1,2.2,3.3,4.4,5.5)",5.5),
716 test_t("max(1.1,2.2,3.3,4.4,5.5,6.6)",6.6),
717 test_t("max(max(1,2),max(3,4))",4.0),
718 test_t("avg(1,2)",1.5),
719 test_t("avg(1,2,3)",2.0),
720 test_t("avg(1,2,3,4)",2.5),
721 test_t("avg(1,2,3,4,5)",3.0),
722 test_t("avg(1.1,2.2)",1.65),
723 test_t("avg(1.1,2.2,3.3)",2.2),
724 test_t("avg(1.1,2.2,3.3,4.4)",2.75),
725 test_t("avg(1.1,2.2,3.3,4.4,5.5)",3.3),
726 test_t("avg(1.1,2.2,3.3,4.4,5.5,6.6)",3.85),
727 test_t("sum(1,2)",3.0),
728 test_t("sum(1,2,3)",6.0),
729 test_t("sum(1,2,3,4)",10),
730 test_t("sum(1,2,3,4,5)",15.0),
731 test_t("sum(1,2,3,4,5,6)",21),
732 test_t("sum(1.1,2.2)",3.3),
733 test_t("sum(1.1,2.2,3.3)",6.6),
734 test_t("sum(1.1,2.2,3.3,4.4)",11.0),
735 test_t("sum(1.1,2.2,3.3,4.4,5.5)",16.5),
736 test_t("sum(1.1,2.2,3.3,4.4,5.5,6.6)",23.1),
737 test_t("mul(1,2)",2.0),
738 test_t("mul(1,2,3)",6.0),
739 test_t("mul(1,2,3,4)",24.0),
740 test_t("mul(1,2,3,4,5)",120.0),
741 test_t("mul(1,2,3,4,5,6)",720.0),
742 test_t("mul(1.1,2.2)",2.42),
743 test_t("mul(1.1,2.2,3.3)",7.986),
744 test_t("mul(1.1,2.2,3.3,4.4)",35.1384),
745 test_t("mul(1.1,2.2,3.3,4.4,5.5)",193.2612),
746 test_t("mul(1.1,2.2,3.3,4.4,5.5,6.6)",1275.52392),
747 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),
748 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),
749 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),
750 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),
751 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),
752 test_t("floor(1.0)",1.0),
753 test_t("floor(1.1)",1.0),
754 test_t("floor(-1.0)",-1.0),
755 test_t("floor(-1.1)",-2.0),
756 test_t("ceil(1.0)",1.0),
757 test_t("ceil(1.1)",2.0),
758 test_t("ceil(-1.0)",-1.0),
759 test_t("ceil(-1.1)",-1.0),
760 test_t("round(1.1)",1.0),
761 test_t("round(1.49)",1.0),
762 test_t("round(1.5)",2.0),
763 test_t("round(1.9)",2.0),
764 test_t("roundn(1/3,2)",0.33),
765 test_t("roundn(1/3,5)",0.33333),
766 test_t("roundn(2/3,2)",0.67),
767 test_t("roundn(2/3,5)",0.66667),
768 test_t("roundn(1.0/3.0,2.0)",0.33),
769 test_t("roundn(1.0/3.0,5.0)",0.33333),
770 test_t("roundn(2.0/3.0,2.0)",0.67),
771 test_t("roundn(2.0/3.0,5.0)",0.66667),
772 test_t("cos(0.0)",1.0),
773 test_t("sin(0.0)",0.0),
774 test_t("equal(sin(pi/4.0),cos(pi/4.0))",1.0),
775 test_t("equal(sin(pi/6.0),cos(pi/3.0))",1.0),
776 test_t("(sin(pi/4.0) - cos(pi/4.0)) <= epsilon",1.0),
777 test_t("(cos(pi/3.0) - sin(pi/6.0)) <= epsilon",1.0),
778 test_t("sin(deg2rad(30))",0.5),
779 test_t("cos(deg2rad(60))",0.5),
780 test_t("sin(deg2rad(30)) + cos(deg2rad(60))",1.0),
781 test_t("equal(sin(deg2rad(30))/cos(deg2rad(30)),tan(deg2rad(30)))",1.0),
782 test_t("equal(sinh(pi),11.5487393572577483779773343153884) ",1.0),
783 test_t("equal(asinh(11.5487393572577483779773343153884),pi)",1.0),
784 test_t("equal(cosh(pi),11.5919532755215206277517520525601) ",1.0),
785 test_t("equal(acosh(11.5919532755215206277517520525601),pi)",1.0),
786 test_t("equal(tanh(pi),0.99627207622074994426469058001253) ",1.0),
787 test_t("equal(atanh(0.99627207622074994426469058001253),pi)",1.0),
788 test_t("exp(1.0)",2.71828182845904523536028747135266249775724),
789 test_t("exp(0.0)",1.0),
790 test_t("log(2.7182818284590451)",1.0),
791 test_t("log10(10.0)",1.0),
792 test_t("frac(12.34) + trunc(12.34)",12.34),
793 test_t("hypot(3.0,4.0)",5.0),
794 test_t("hypot(1.0,sqrt(3.0))",2.0),
795 test_t("if(1 < 2, 3, 4)",3.0),
796 test_t("if(1.1 < 2.2, 3.3, 4.4)",3.3),
797 test_t("if((1.0+1.1) < (2.0+1.2), 3.3, 4.4)",3.3),
798 test_t("if(1 = 2, 3, 4)",4.0),
799 test_t("if(1.1 = 2.2, 3.3, 4.4)",4.4),
800 test_t("if((1.0+1.1) = (2.0+1.2), 3.3, 4.4)",4.4),
801 test_t("if(1 == 2, 3, 4)",4.0),
802 test_t("if(1.1 == 2.2, 3.3, 4.4)",4.4),
803 test_t("if((1.0+1.1) == (2.0+1.2), 3.3, 4.4)",4.4),
804 test_t("if(1 >= 2, 3, 4)",4.0),
805 test_t("if(1.1 >= 2.2, 3.3, 4.4)",4.4),
806 test_t("if((1.0+1.1) >= (2.0+1.2), 3.3, 4.4)",4.4),
807 test_t("if(((1.0 + 2.0) == 3.0) and ((4.0 + 5.0) < 9.0),1,2)",2.0),
808 test_t("(3.0 - 1.0 - 2.0) == ((3.0 - 1.0) - 2.0)",1.0),
809 test_t("true == true",1.0),
810 test_t("false == false",1.0),
811 test_t("true != false",1.0),
812 test_t("false != true",1.0),
813 test_t("(1 < 2) == true",1.0),
814 test_t("(1 > 2) == false",1.0),
815 test_t("true == (1 < 2)",1.0),
816 test_t("false == (1 > 2)",1.0),
817 test_t("(1 > 2) != true",1.0),
818 test_t("(1 < 2) != false",1.0),
819 test_t("true != (1 > 2)",1.0),
820 test_t("false != (1 < 2)",1.0),
821 test_t("(true and true) == true",1.0),
822 test_t("(false and false) == false",1.0),
823 test_t("(true or true) == true",1.0),
824 test_t("(false or false) == false",1.0),
825 test_t("(true and false) == false",1.0),
826 test_t("(false and true) == false",1.0),
827 test_t("(true or false) == true",1.0),
828 test_t("(false or true) == true",1.0),
829 test_t("(true & true) == true",1.0),
830 test_t("(false & false) == false",1.0),
831 test_t("(true | true) == true",1.0),
832 test_t("(false | false) == false",1.0),
833 test_t("(true & false) == false",1.0),
834 test_t("(false & true) == false",1.0),
835 test_t("(true | false) == true",1.0),
836 test_t("(false | true) == true",1.0),
837 test_t("clamp(-1,1,+1)",1.0),
838 test_t("clamp(-1,-1.5,+1.0)",-1.0),
839 test_t("clamp(-1,+1.5,+1.0)",+1.0),
840 test_t("clamp(-1,-1.5,+1.0) + clamp(-1,+1.5,+1.0)",0.0),
841 test_t("inrange(-2,1,+2) == ((-2 <= 1) and (1 <= +2))",1.0),
842 test_t("inrange(-2,1,+2) == if(({-2 <= 1} and [1 <= +2]),1.0,0.0)",1.0),
843 test_t("sgn( 0)", 0.0),
844 test_t("sgn(+3)",+1.0),
845 test_t("sgn(-3)",-1.0),
846 test_t("equal($f00(1.1,2.2,3.3),(1.1+2.2)/3.3)",1.0),
847 test_t("equal($f01(1.1,2.2,3.3),(1.1+2.2)*3.3)",1.0),
848 test_t("equal($f02(1.1,2.2,3.3),(1.1+2.2)-3.3)",1.0),
849 test_t("equal($f03(1.1,2.2,3.3),(1.1+2.2)+3.3)",1.0),
850 test_t("equal($f04(1.1,2.2,3.3),(1.1-2.2)+3.3)",1.0),
851 test_t("equal($f05(1.1,2.2,3.3),(1.1-2.2)/3.3)",1.0),
852 test_t("equal($f06(1.1,2.2,3.3),(1.1-2.2)*3.3)",1.0),
853 test_t("equal($f07(1.1,2.2,3.3),(1.1*2.2)+3.3)",1.0),
854 test_t("equal($f08(1.1,2.2,3.3),(1.1*2.2)-3.3)",1.0),
855 test_t("equal($f09(1.1,2.2,3.3),(1.1*2.2)/3.3)",1.0),
856 test_t("equal($f10(1.1,2.2,3.3),(1.1*2.2)*3.3)",1.0),
857 test_t("equal($f11(1.1,2.2,3.3),(1.1/2.2)+3.3)",1.0),
858 test_t("equal($f12(1.1,2.2,3.3),(1.1/2.2)-3.3)",1.0),
859 test_t("equal($f13(1.1,2.2,3.3),(1.1/2.2)/3.3)",1.0),
860 test_t("equal($f14(1.1,2.2,3.3),(1.1/2.2)*3.3)",1.0),
861 test_t("equal($f15(1.1,2.2,3.3),1.1/(2.2+3.3))",1.0),
862 test_t("equal($f16(1.1,2.2,3.3),1.1/(2.2-3.3))",1.0),
863 test_t("equal($f17(1.1,2.2,3.3),1.1/(2.2*3.3))",1.0),
864 test_t("equal($f18(1.1,2.2,3.3),1.1/(2.2/3.3))",1.0),
865 test_t("equal($f19(1.1,2.2,3.3),1.1*(2.2+3.3))",1.0),
866 test_t("equal($f20(1.1,2.2,3.3),1.1*(2.2-3.3))",1.0),
867 test_t("equal($f21(1.1,2.2,3.3),1.1*(2.2*3.3))",1.0),
868 test_t("equal($f22(1.1,2.2,3.3),1.1*(2.2/3.3))",1.0),
869 test_t("equal($f23(1.1,2.2,3.3),1.1-(2.2+3.3))",1.0),
870 test_t("equal($f24(1.1,2.2,3.3),1.1-(2.2-3.3))",1.0),
871 test_t("equal($f25(1.1,2.2,3.3),1.1-(2.2/3.3))",1.0),
872 test_t("equal($f26(1.1,2.2,3.3),1.1-(2.2*3.3))",1.0),
873 test_t("equal($f27(1.1,2.2,3.3),1.1+(2.2*3.3))",1.0),
874 test_t("equal($f28(1.1,2.2,3.3),1.1+(2.2/3.3))",1.0),
875 test_t("equal($f29(1.1,2.2,3.3),1.1+(2.2+3.3))",1.0),
876 test_t("equal($f30(1.1,2.2,3.3),1.1+(2.2-3.3))",1.0),
877 test_t("equal($f31(1.1,2.2,3.3),1.1*2.2^2+3.3)",1.0),
878 test_t("equal($f32(1.1,2.2,3.3),1.1*2.2^3+3.3)",1.0),
879 test_t("equal($f33(1.1,2.2,3.3),1.1*2.2^4+3.3)",1.0),
880 test_t("equal($f34(1.1,2.2,3.3),1.1*2.2^5+3.3)",1.0),
881 test_t("equal($f35(1.1,2.2,3.3),1.1*2.2^6+3.3)",1.0),
882 test_t("equal($f36(1.1,2.2,3.3),1.1*2.2^7+3.3)",1.0),
883 test_t("equal($f37(1.1,2.2,3.3),1.1*2.2^8+3.3)",1.0),
884 test_t("equal($f38(1.1,2.2,3.3),1.1*2.2^9+3.3)",1.0),
885 test_t("equal($f39(1.1,2.2,3.3),1.1*log(2.2)+3.3)",1.0),
886 test_t("equal($f40(1.1,2.2,3.3),1.1*log(2.2)-3.3)",1.0),
887 test_t("equal($f41(1.1,2.2,3.3),1.1*log10(2.2)+3.3)",1.0),
888 test_t("equal($f42(1.1,2.2,3.3),1.1*log10(2.2)-3.3)",1.0),
889 test_t("equal($f43(1.1,2.2,3.3),1.1*sin(2.2)+3.3)",1.0),
890 test_t("equal($f44(1.1,2.2,3.3),1.1*sin(2.2)-3.3)",1.0),
891 test_t("equal($f45(1.1,2.2,3.3),1.1*cos(2.2)+3.3)",1.0),
892 test_t("equal($f46(1.1,2.2,3.3),1.1*cos(2.2)-3.3)",1.0),
893 test_t("equal($f47(1.1,2.2,3.3),if(0!=1.1,2.2,3.3))",1.0),
894 test_t("equal($f48(1.1,2.2,3.3,4.4),1.1+((2.2+3.3)/4.4))",1.0),
895 test_t("equal($f49(1.1,2.2,3.3,4.4),1.1+((2.2+3.3)*4.4))",1.0),
896 test_t("equal($f50(1.1,2.2,3.3,4.4),1.1+((2.2-3.3)/4.4))",1.0),
897 test_t("equal($f51(1.1,2.2,3.3,4.4),1.1+((2.2-3.3)*4.4))",1.0),
898 test_t("equal($f52(1.1,2.2,3.3,4.4),1.1+((2.2*3.3)/4.4))",1.0),
899 test_t("equal($f53(1.1,2.2,3.3,4.4),1.1+((2.2*3.3)*4.4))",1.0),
900 test_t("equal($f54(1.1,2.2,3.3,4.4),1.1+((2.2/3.3)+4.4))",1.0),
901 test_t("equal($f55(1.1,2.2,3.3,4.4),1.1+((2.2/3.3)/4.4))",1.0),
902 test_t("equal($f56(1.1,2.2,3.3,4.4),1.1+((2.2/3.3)*4.4))",1.0),
903 test_t("equal($f57(1.1,2.2,3.3,4.4),1.1-((2.2+3.3)/4.4))",1.0),
904 test_t("equal($f58(1.1,2.2,3.3,4.4),1.1-((2.2+3.3)*4.4))",1.0),
905 test_t("equal($f59(1.1,2.2,3.3,4.4),1.1-((2.2-3.3)/4.4))",1.0),
906 test_t("equal($f60(1.1,2.2,3.3,4.4),1.1-((2.2-3.3)*4.4))",1.0),
907 test_t("equal($f61(1.1,2.2,3.3,4.4),1.1-((2.2*3.3)/4.4))",1.0),
908 test_t("equal($f62(1.1,2.2,3.3,4.4),1.1-((2.2*3.3)*4.4))",1.0),
909 test_t("equal($f63(1.1,2.2,3.3,4.4),1.1-((2.2/3.3)/4.4))",1.0),
910 test_t("equal($f64(1.1,2.2,3.3,4.4),1.1-((2.2/3.3)*4.4))",1.0),
911 test_t("equal($f65(1.1,2.2,3.3,4.4),((1.1+2.2)*3.3)-4.4)",1.0),
912 test_t("equal($f66(1.1,2.2,3.3,4.4),((1.1-2.2)*3.3)-4.4)",1.0),
913 test_t("equal($f67(1.1,2.2,3.3,4.4),((1.1*2.2)*3.3)-4.4)",1.0),
914 test_t("equal($f68(1.1,2.2,3.3,4.4),((1.1/2.2)*3.3)-4.4)",1.0),
915 test_t("equal($f69(1.1,2.2,3.3,4.4),((1.1+2.2)/3.3)-4.4)",1.0),
916 test_t("equal($f70(1.1,2.2,3.3,4.4),((1.1-2.2)/3.3)-4.4)",1.0),
917 test_t("equal($f71(1.1,2.2,3.3,4.4),((1.1*2.2)/3.3)-4.4)",1.0),
918 test_t("equal($f72(1.1,2.2,3.3,4.4),((1.1/2.2)/3.3)-4.4)",1.0),
919 test_t("equal($f73(1.1,2.2,3.3,4.4),(1.1*2.2)+(3.3*4.4))",1.0),
920 test_t("equal($f74(1.1,2.2,3.3,4.4),(1.1*2.2)-(3.3*4.4))",1.0),
921 test_t("equal($f75(1.1,2.2,3.3,4.4),(1.1*2.2)+(3.3/4.4))",1.0),
922 test_t("equal($f76(1.1,2.2,3.3,4.4),(1.1*2.2)-(3.3/4.4))",1.0),
923 test_t("equal($f77(1.1,2.2,3.3,4.4),(1.1/2.2)+(3.3/4.4))",1.0),
924 test_t("equal($f78(1.1,2.2,3.3,4.4),(1.1/2.2)-(3.3/4.4))",1.0),
925 test_t("equal($f79(1.1,2.2,3.3,4.4),(1.1/2.2)-(3.3*4.4))",1.0),
926 test_t("equal($f80(1.1,2.2,3.3,4.4),1.1/(2.2+(3.3*4.4)))",1.0),
927 test_t("equal($f81(1.1,2.2,3.3,4.4),1.1/(2.2-(3.3*4.4)))",1.0),
928 test_t("equal($f82(1.1,2.2,3.3,4.4),1.1*(2.2+(3.3*4.4)))",1.0),
929 test_t("equal($f83(1.1,2.2,3.3,4.4),1.1*(2.2-(3.3*4.4)))",1.0),
930 test_t("equal($f84(1.1,2.2,3.3,4.4),1.1*2.2^2+3.3*4.4^2)",1.0),
931 test_t("equal($f85(1.1,2.2,3.3,4.4),1.1*2.2^3+3.3*4.4^3)",1.0),
932 test_t("equal($f86(1.1,2.2,3.3,4.4),1.1*2.2^4+3.3*4.4^4)",1.0),
933 test_t("equal($f87(1.1,2.2,3.3,4.4),1.1*2.2^5+3.3*4.4^5)",1.0),
934 test_t("equal($f88(1.1,2.2,3.3,4.4),1.1*2.2^6+3.3*4.4^6)",1.0),
935 test_t("equal($f89(1.1,2.2,3.3,4.4),1.1*2.2^7+3.3*4.4^7)",1.0),
936 test_t("equal($f90(1.1,2.2,3.3,4.4),1.1*2.2^8+3.3*4.4^8)",1.0),
937 test_t("equal($f91(1.1,2.2,3.3,4.4),1.1*2.2^9+3.3*4.4^9)",1.0),
938 test_t("equal($f92(1.1,2.2,3.3,4.4),if(1.1 and 2.2,3.3,4.4))",1.0),
939 test_t("equal($f93(1.1,2.2,3.3,4.4),if(1.1 or 2.2,3.3,4.4))",1.0),
940 test_t("equal($f94(1.1,2.2,3.3,4.4),if(1.1 < 2.2,3.3,4.4))",1.0),
941 test_t("equal($f95(1.1,2.2,3.3,4.4),if(1.1 <= 2.2,3.3,4.4))",1.0),
942 test_t("equal($f96(1.1,2.2,3.3,4.4),if(1.1 > 2.2,3.3,4.4))",1.0),
943 test_t("equal($f97(1.1,2.2,3.3,4.4),if(1.1 >= 2.2,3.3,4.4))",1.0),
944 test_t("equal($f98(1.1,2.2,3.3,4.4),if(equal(1.1,2.2),3.3,4.4))",1.0),
945 test_t("equal($f99(1.1,2.2,3.3,4.4),1.1*sin(2.2)+3.3*cos(4.4))",1.0),
946 test_t("equal((48.0/2.0*(9.0+3.0)),288.0)",1.0),
947 test_t("equal((48.0/2.0(9.0+3.0)),288.0)",1.0),
948 test_t("equal((6.0/2.0(1.0+2.0)),9.0)",1.0),
949 test_t("1+2+3+4+5+6+7+8+9+0",45.0),
950 test_t("1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0",45.0),
951 test_t("1.0 + 2.0 + 3.0 + 4.0 + 5.0 + 6.0 + 7.0 + 8.0 + 9.0 + 0.0",45.0),
952 test_t("(1+2)+(3+4)+(5+6)+(7+8)+(9+0)",45.0),
953 test_t("(1-2)+(3-4)+(5-6)+(7-8)+(9-0)",+5.0),
954 test_t("(1+2)-(3+4)-(5+6)-(7+8)-(9+0)",-39.0),
955 test_t("(1.0+2.0)+(3.0+4.0)+(5.0+6.0)+(7.0+8.0)+(9.0+0.0)",45.0),
956 test_t("(1.0-2.0)+(3.0-4.0)+(5.0-6.0)+(7.0-8.0)+(9.0-0.0)",+5.0),
957 test_t("(1.0+2.0)-(3.0+4.0)-(5.0+6.0)-(7.0+8.0)-(9.0+0.0)",-39.0),
958 test_t("[(1.0+2.0)+[3.0+4.0]+(5.0+6.0)]+([7.0+8.0]+(9.0+0.0))",45.0),
959 test_t("([1.0-2.0]+(3.0-4.0)+[5.0-6.0])+[(7.0-8.0)+[9.0-0.0]]",+5.0),
960 test_t("((1.0+2.0))-[(3.0+4.0)]-((5.0+6.0))-[(7.0+8.0)]-((9.0+0.0))",-39.0),
961 test_t("{[(1.0+2.0)+[3.0+4.0]+({5.0+6.0})]}+({[7.0+8.0]+(9.0+0.0)})",45.0),
962 test_t("{([1.0-2.0]+(3.0-4.0)+[5.0-6.0])}+[({+7.0}-{+8.0})+[{+9.0-0.0}]]",+5.0),
963 test_t("((+1.0+2.0))-[({+3.0+4.0})]-(({+5.0+6.0}))-[({+7.0}+8.0)]-(({+9.0}+{0.0}))",-39.0),
964 test_t("1+2-3*4/5+6-7*8/9+0",0.37777777777777777778),
965 test_t("1.1+2.2-3.3*4.4/5.5+6.6-7.7*8.8/9.9+0.0",0.41555555555555555556),
966 test_t("(1+2)-(3*4)/(5+6)-(7*8)/(9+0)",-4.31313131313131313131),
967 test_t("1/1+1/2+1/3+1/4+1/5+1/6+1/7+1/8+1/9",2.82896825396825396825),
968 test_t("(1/1)+(1/2)+(1/3)+(1/4)+(1/5)+(1/6)+(1/7)+(1/8)+(1/9)",2.82896825396825396825),
969 test_t("1.0/1.0+1.0/2.0+1.0/3.0+1.0/4.0+1.0/5.0+1.0/6.0+1.0/7.0+1.0/8.0+1.0/9",2.82896825396825396825),
970 test_t("(1.0/1.0)+(1.0/2.0)+(1.0/3.0)+(1.0/4.0)+(1.0/5.0)+(1.0/6.0)+(1.0/7.0)+(1.0/8.0)+(1.0/9)",2.82896825396825396825),
971 test_t("1/1*1/2*1/3*1/4*1/5*1/6*1/7*1/8*1/9",0.00000275573192239859),
972 test_t("(1/1)*(1/2)*(1/3)*(1/4)*(1/5)*(1/6)*(1/7)*(1/8)*(1/9)",0.00000275573192239859),
973 test_t("1.0/1.0*1.0/2.0*1.0/3.0*1.0/4.0*1.0/5.0*1.0/6.0*1.0/7.0*1.0/8.0*1.0/9",0.00000275573192239859),
974 test_t("(1.0/1.0)*(1.0/2.0)*(1.0/3.0)*(1.0/4.0)*(1.0/5.0)*(1.0/6.0)*(1.0/7.0)*(1.0/8.0)*(1.0/9)",0.00000275573192239859),
975 test_t("equal(poly01(1.2345,2.2,1.1),(2.2*1.2345^1+1.1))",1.0),
976 test_t("equal(poly02(1.2345,3.3,2.2,1.1),(3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
977 test_t("equal(poly03(1.2345,4.4,3.3,2.2,1.1),(4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
978 test_t("equal(poly04(1.2345,5.5,4.4,3.3,2.2,1.1),(5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
979 test_t("equal(poly05(1.2345,6.6,5.5,4.4,3.3,2.2,1.1),(6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
980 test_t("equal(poly06(1.2345,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(7.7*1.2345^6+6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
981 test_t("equal(poly07(1.2345,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(8.8*1.2345^7+7.7*1.2345^6+6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
982 test_t("equal(poly08(1.2345,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(9.9*1.2345^8+8.8*1.2345^7+7.7*1.2345^6+6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
983 test_t("equal(poly09(1.2345,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(1.1*1.2345^9+9.9*1.2345^8+8.8*1.2345^7+7.7*1.2345^6+6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
984 test_t("equal(poly10(1.37,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(2.2*1.37^10+1.1*1.37^9+9.9*1.37^8+8.8*1.37^7+7.7*1.37^6+6.6*1.37^5+5.5*1.37^4+4.4*1.37^3+3.3*1.37^2+2.2*1.37^1+1.1))",1.0),
985 test_t("equal(poly11(1.37,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(3.3*1.37^11+2.2*1.37^10+1.1*1.37^9+9.9*1.37^8+8.8*1.37^7+7.7*1.37^6+6.6*1.37^5+5.5*1.37^4+4.4*1.37^3+3.3*1.37^2+2.2*1.37^1+1.1))",1.0),
986 test_t("equal(poly12(1.37,4.4,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(4.4*1.37^12+3.3*1.37^11+2.2*1.37^10+1.1*1.37^9+9.9*1.37^8+8.8*1.37^7+7.7*1.37^6+6.6*1.37^5+5.5*1.37^4+4.4*1.37^3+3.3*1.37^2+2.2*1.37^1+1.1))",1.0),
987 test_t("equal(\t \n(\n \r1.1\t\t - \n\n 2.2\n\n/\r3.3\t),(1.1-2.2/3.3))",1.0),
988 test_t("equal((pi^2^3),(pi^8))",1.0),
989 test_t("equal((pi^(2^3)),(pi^8))",1.0),
990 test_t("equal(pi^2^3-pi^8,0)",1.0),
991 test_t("equal((2*pi^2^3),2*(pi^8))",1.0),
992 test_t("equal((pi^2^3*2),2*(pi^8))",1.0),
993 test_t("equal((pi^2^3/2),(pi^8)/2)",1.0),
994 test_t("equal((pi^2.2^3.3),(pi^13.4894687605338489))",1.0),
995 test_t("equal((pi^(2.2^3.3)),(pi^13.4894687605338489))",1.0),
996 test_t("equal((2.2*pi^2.2^3.3),2.2*(pi^13.4894687605338489))",1.0),
997 test_t("equal((pi^2.2^3.3*2),2*(pi^13.4894687605338489))",1.0),
998 test_t("equal((pi^2.2^3.3/2.2),(pi^13.4894687605338489)/2.2)",1.0),
999 test_t("equal((pi^-2^3),1/(pi^8))",1.0),
1000 test_t("equal((pi^(-2^3)),1/(pi^8))",1.0),
1001 test_t("equal((pi^2^-3),(pi^(1/8)))",1.0),
1002 test_t("equal((pi^(2^-3)),(pi^(1/8)))",1.0),
1003 test_t("equal((pi^-2^-3),1/(pi^(1/8)))",1.0),
1004 test_t("equal((pi^(-2^-3)),1/(pi^(1/8)))",1.0),
1005 test_t("equal((-pi^2^3),(-pi^8))",1.0),
1006 test_t("equal((-pi^(2^3)),(-pi^8))",1.0),
1007 test_t("equal(-pi^2^3--pi^8,0)",1.0),
1008 test_t("equal((2*-pi^2^3),2*(-pi^8))",1.0),
1009 test_t("equal((-pi^2^3*2),2*(-pi^8))",1.0),
1010 test_t("equal((-pi^2^3/2),(-pi^8)/2)",1.0),
1011 test_t("equal((-pi^2.2^3.3),(-pi^13.4894687605338489))",1.0),
1012 test_t("equal((-pi^(2.2^3.3)),(-pi^13.4894687605338489))",1.0),
1013 test_t("equal((2.2*-pi^2.2^3.3),2.2*(-pi^13.4894687605338489))",1.0),
1014 test_t("equal((-pi^2.2^3.3*2),2*(-pi^13.4894687605338489))",1.0),
1015 test_t("equal((-pi^2.2^3.3/2.2),(-pi^13.4894687605338489)/2.2)",1.0),
1016 test_t("equal((-pi^-2^3),1/(-pi^8))",1.0),
1017 test_t("equal((-pi^(-2^3)),1/(-pi^8))",1.0),
1018 test_t("equal((-pi^2^-3),(-pi^(1/8)))",1.0),
1019 test_t("equal((-pi^(2^-3)),(-pi^(1/8)))",1.0),
1020 test_t("equal((-pi^-2^-3),1/(-pi^(1/8)))",1.0),
1021 test_t("equal((-pi^(-2^-3)),1/(-pi^(1/8)))",1.0),
1022 test_t("equal((+pi^+2^+3),(+pi^+8))",1.0),
1023 test_t("equal((+pi^(2^3)),(+pi^+8))",1.0),
1024 test_t("equal(+pi^+2^+3-+pi^+8,0)",1.0),
1025 test_t("equal((+2*+pi^+2^+3),+2*(+pi^+8))",1.0),
1026 test_t("equal((+pi^+2^+3*+2),+2*(+pi^+8))",1.0),
1027 test_t("equal((+pi^+2^+3/+2),(+pi^+8)/+2)",1.0),
1028 test_t("equal((+pi^+2.2^+3.3),(+pi^+13.4894687605338489))",1.0),
1029 test_t("equal((+pi^(+2.2^+3.3)),(+pi^+13.4894687605338489))",1.0),
1030 test_t("equal((+2.2*+pi^+2.2^+3.3),+2.2*(+pi^+13.4894687605338489))",1.0),
1031 test_t("equal((+pi^+2.2^+3.3*+2),+2*(+pi^+13.4894687605338489))",1.0),
1032 test_t("equal((+pi^+2.2^+3.3/+2.2),(+pi^+13.4894687605338489)/+2.2)",1.0),
1033 test_t("equal((+pi^-2^3),1/(+pi^+8))",1.0),
1034 test_t("equal((+pi^(-2^3)),1/(+pi^+8))",1.0),
1035 test_t("equal((+pi^2^-3),(+pi^(+1/+8)))",1.0),
1036 test_t("equal((+pi^(2^-3)),(+pi^(+1/+8)))",1.0),
1037 test_t("equal((+pi^-2^-3),1/(+pi^(+1/+8)))",1.0),
1038 test_t("equal((+pi^(-2^-3)),1/(+pi^(+1/+8)))",1.0),
1039 test_t("equal((-pi^+2^+3),(-pi^+8))",1.0),
1040 test_t("equal((-pi^(2^3)),(-pi^+8))",1.0),
1041 test_t("equal(-pi^+2^+3--pi^+8,0)",1.0),
1042 test_t("equal((+2*-pi^+2^+3),2*(-pi^+8))",1.0),
1043 test_t("equal((-pi^+2^+3*2),2*(-pi^+8))",1.0),
1044 test_t("equal((-pi^+2^+3/+2),(-pi^+8)/+2)",1.0),
1045 test_t("equal((-pi^+2.2^+3.3),(-pi^+13.4894687605338489))",1.0),
1046 test_t("equal((-pi^(2.2^3.3)),(-pi^+13.4894687605338489))",1.0),
1047 test_t("equal((+2.2*-pi^+2.2^+3.3),2.2*(-pi^+13.4894687605338489))",1.0),
1048 test_t("equal((-pi^+2.2^+3.3*2),2*(-pi^+13.4894687605338489))",1.0),
1049 test_t("equal((-pi^+2.2^+3.3/+2.2),(-pi^+13.4894687605338489)/+2.2)",1.0),
1050 test_t("equal((-pi^-2^3),1/(-pi^+8))",1.0),
1051 test_t("equal((-pi^(-2^3)),1/(-pi^+8))",1.0),
1052 test_t("equal((-pi^2^-3),(-pi^(+1/+8)))",1.0),
1053 test_t("equal((-pi^(2^-3)),(-pi^(+1/+8)))",1.0),
1054 test_t("equal((-pi^-2^-3),1/(-pi^(+1/+8)))",1.0),
1055 test_t("equal((-pi^(-2^-3)),1/(-pi^(+1/+8)))",1.0),
1056 test_t("switch { case (1 <= 2) : 1; default: 1.12345; }",1.0),
1057 test_t("switch { case (1 > 2) : 0; case (1 <= 2) : 1; default: 1.12345; }",1.0),
1058 test_t("switch { case (1 <= 2) : switch { case (1 <= 2) : 1; default: 1.12345; }; default: 1.12345; }",1.0),
1059 test_t("switch { case [1 <= 2] : 1; default: 1.12345; }",1.0),
1060 test_t("switch { case [1 > 2] : 0; case [1 <= 2] : 1; default: 1.12345; }",1.0),
1061 test_t("switch { case [1 <= 2] : switch { case [1 <= 2] : 1; default: 1.12345; }; default: 1.12345; }",1.0),
1062 test_t("switch { case {1 <= 2} : 1; default: 1.12345; }",1.0),
1063 test_t("switch { case {1 > 2} : 0; case {1 <= 2} : 1; default: 1.12345; }",1.0),
1064 test_t("switch { case {1 <= 2} : switch { case {1 <= 2} : 1; default: 1.12345; }; default: 1.12345; }",1.0),
1065 test_t("switch { case [(1 <= 2)] : {1}; default: 1.12345; }",1.0),
1066 test_t("switch { case ([1 > 2]) : [0]; case ([1 <= 2]) : 1; default: 1.12345; }",1.0),
1067 test_t("switch { case {(1 <= 2)} : switch { case ({1 <= 2}) : 1; default: 1.12345; }; default: 1.12345; }",1.0),
1068 test_t("switch { case 1 > 1 : 1; case 2 > 2 : 2; case 3 = 3 : 3; case 4 > 4 : 4; default : 5; }",3.0),
1069 test_t("repeat 1.1 + 2.2 until (1 < 2)",3.3),
1070 test_t("repeat (1.1 + 2.2) until (1 < 2)",3.3),
1071 test_t("repeat 1.1 + 2.2; until (1 < 2)",3.3),
1072 test_t("repeat (1.1 + 2.2); until (1 < 2)",3.3),
1073 test_t("repeat 1.1234; 1 < 2; 1.1 + 2.2 until (1 < 2)",3.3),
1074 test_t("repeat 1.1234; 1 < 2; (1.1 + 2.2) until (1 < 2)",3.3),
1075 test_t("repeat 1.1234; 1 < 2; 1.1 + 2.2; until (1 < 2)",3.3),
1076 test_t("repeat 1.1234; 1 < 2; (1.1 + 2.2); until (1 < 2)",3.3),
1077 test_t("[*] { case 1 < 2 : 1 / 2; case (1 < 3) : 2 / 2; case 1 < 4 : 3 / 2; case (1 < 5) : 4 / 2; }",2.0),
1078 test_t(" 0 ? 1 : 2",2.0),
1079 test_t(" 1 ? 3 : 4",3.0),
1080 test_t("(0 ? 1 : 2) == 2",1.0),
1081 test_t("(1 ? 3 : 4) == 3",1.0),
1082 test_t("[(0)] ? [(1)] : [(2)]",2.0),
1083 test_t("([(0)] ? [(1)] : [(2)]) == 2",1.0),
1084 test_t("([(1)] ? [(3)] : [(4)]) == 3",1.0),
1085 test_t("(1 < 2 ? 3 : 4) == 3",1.0),
1086 test_t("(1 > 2 ? 3 : 4) == 4",1.0),
1087 test_t("(1 < 2 ? 3 + 5 : 4) == 8",1.0),
1088 test_t("(1 > 2 ? 3 : 4 + 5) == 9",1.0),
1089 test_t("(2 < 3 + 3 ? 7 : 9) == 7",1.0),
1090 test_t("(1 + 1 < 3 ? 7 : 9) == 7",1.0),
1091 test_t("(1 + 1 < 3 + 3 ? 7 : 9) == 7",1.0),
1092 test_t("(2 > 3 + 3 ? 7 : 9) == 9",1.0),
1093 test_t("(1 + 1 > 3 ? 7 : 9) == 9",1.0),
1094 test_t("(1 + 1 > 3 + 3 ? 7 : 9) == 9",1.0),
1095 test_t("(2 < (3 + 3) ? 7 : 9) == 7",1.0),
1096 test_t("((1 + 1) < 3 ? 7 : 9) == 7",1.0),
1097 test_t("((1 + 1) < (3 + 3) ? 7 : 9) == 7",1.0),
1098 test_t("(min(1,2) ? 1 + 3 : 1 + 4) == 4",1.0),
1099 test_t("(min(0,1) ? 1 + 3 : 1 + 4) == 5",1.0),
1100 test_t("if (1 < 2) 3; == 3",1.0),
1101 test_t("if (1 > 2) 3; == null",1.0),
1102 test_t("if (1 < 2) 3; else 4; == 3",1.0),
1103 test_t("if (1 > 2) 3; else 4; == 4",1.0),
1104 test_t("if (1 < 2) 3; else {1+2; 4;} == 3",1.0),
1105 test_t("if (1 > 2) 3; else {1+2; 4;} == 4",1.0),
1106 test_t("if (1 < 2) 3; else if (1 < 2) 4; == 3",1.0),
1107 test_t("if (1 > 2) 3; else if (1 < 2) 4; == 4",1.0),
1108 test_t("if (1 > 2) 3; else if (1 > 2) 4; == null",1.0),
1109 test_t("if (1 < 2) 3; else if (1 < 2) {1+2; 4;} == 3",1.0),
1110 test_t("if (1 > 2) 3; else if (1 < 2) {1+2; 4;} == 4",1.0),
1111 test_t("if (1 > 2) 3; else if (1 > 2) {1+2; 4;} == null",1.0),
1112 test_t("if (1 < 2) { 1+2; 3;} == 3",1.0),
1113 test_t("if (1 > 2) { 1+2; 3;} == null",1.0),
1114 test_t("if (1 < 2) { 1+2; 3;} else 4; == 3",1.0),
1115 test_t("if (1 > 2) { 1+2; 3;} else 4; == 4",1.0),
1116 test_t("if (1 < 2) { 1+2; 3;} else {1+2; 4;} == 3",1.0),
1117 test_t("if (1 > 2) { 1+2; 3;} else {1+2; 4;} == 4",1.0),
1118 test_t("if (1 < 2) { 1+2; 3;} else if (1 < 2) 4; == 3",1.0),
1119 test_t("if (1 > 2) { 1+2; 3;} else if (1 < 2) 4; == 4",1.0),
1120 test_t("if (1 > 2) { 1+2; 3;} else if (1 > 2) 4; == null",1.0),
1121 test_t("if (1 < 2) { 1+2; 3;} else if (1 < 2) {1+2; 4;} == 3",1.0),
1122 test_t("if (1 > 2) { 1+2; 3;} else if (1 < 2) {1+2; 4;} == 4",1.0),
1123 test_t("if (1 > 2) { 1+2; 3;} else if (1 > 2) {1+2; 4;} == null",1.0)
1124};
std::pair< std::string, numeric_type > test_t

Referenced by run_test00().

◆ global_test_list_size

const std::size_t global_test_list_size = sizeof(global_test_list) / sizeof(test_t)
static

Definition at line 1126 of file exprtk_real_test.cpp.

Referenced by run_test00().