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

Go to the source code of this file.

Classes

struct  edge_cases< T >
 
struct  edge_cases< float >
 
struct  edge_cases< double >
 
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 >
 
struct  type_name< float >
 
struct  type_name< double >
 
struct  type_name< long double >
 

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 double 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 3747 of file exprtk_test.cpp.

3748 { return v0; } \
3749inline Type N##2(Type v0, Type v1) { return v0 + v1; } \
3750inline Type N##3(Type v0, Type v1, Type v2) { return v0 + v1 + v2; } \
3751inline Type N##4(Type v0, Type v1, Type v2, Type v3) { return v0 + v1 + v2 + v3; } \
3752inline Type N##5(Type v0, Type v1, Type v2, Type v3, Type v4) { return v0 + v1 + v2 + v3 + v4; } \
3753inline Type N##6(Type v0, Type v1, Type v2, Type v3, Type v4, Type v5) { return v0 + v1 + v2 + v3 + v4 + v5; } \
3754

◆ exprtk_test_delete

#define exprtk_test_delete

Definition at line 46 of file exprtk_test.cpp.

◆ exprtk_test_final

#define exprtk_test_final

Definition at line 45 of file exprtk_test.cpp.

◆ exprtk_test_override

#define exprtk_test_override

Definition at line 44 of file exprtk_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

typedef double numeric_type

Definition at line 36 of file exprtk_test.cpp.

◆ test_t

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

Definition at line 49 of file exprtk_test.cpp.

Function Documentation

◆ clamp()

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

Definition at line 3260 of file exprtk_test.cpp.

3261{
3262 return (v < l) ? l : ((v > u) ? u : v);
3263}

◆ foo1()

numeric_type foo1 ( numeric_type  v0)
inline

Definition at line 3755 of file exprtk_test.cpp.

Referenced by my_usr_ext< T >::process(), 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 3755 of file exprtk_test.cpp.

Referenced by my_usr_ext< T >::process(), 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 3755 of file exprtk_test.cpp.

Referenced by my_usr_ext< T >::process(), 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 3755 of file exprtk_test.cpp.

Referenced by my_usr_ext< T >::process(), 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 3755 of file exprtk_test.cpp.

Referenced by my_usr_ext< T >::process(), 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 3755 of file exprtk_test.cpp.

Referenced by my_usr_ext< T >::process(), 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 5584 of file exprtk_test.cpp.

5586{
5587 std::ifstream stream(file_name.c_str());
5588
5589 if (!stream) return 0;
5590
5591 std::string buffer;
5592 buffer.reserve(1024);
5593
5594 std::size_t line_count = 0;
5595
5596 while (std::getline(stream,(buffer)))
5597 {
5598 if (buffer.empty())
5599 continue;
5600 else if ('#' == buffer[0])
5601 continue;
5602
5603 ++line_count;
5604 sequence.push_back(buffer);
5605 }
5606
5607 return line_count;
5608}

Referenced by run_test14().

Here is the caller graph for this function:

◆ main()

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

Definition at line 12640 of file exprtk_test.cpp.

12641{
12642 const std::string test_set = (argc == 2) ? std::string(argv[1]) : "";
12643
12644 #define perform_test(Type,Number) \
12645 { \
12646 const std::string test_name = "run_test"#Number; \
12647 if ( \
12648 test_set.empty() || \
12649 test_set.find(test_name) != std::string::npos \
12650 ) \
12651 { \
12652 exprtk::timer timer; \
12653 timer.start(); \
12654 if (!run_test##Number<Type>()) \
12655 { \
12656 printf("run_test"#Number" (%s) *** FAILED! ***\n", \
12657 type_name<Type>::value().c_str()); \
12658 result = EXIT_FAILURE; \
12659 } \
12660 else \
12661 { \
12662 timer.stop(); \
12663 printf("run_test"#Number" (%s) - Result: SUCCESS Time: %8.4fsec\n", \
12664 type_name<Type>::value().c_str(), \
12665 timer.time()); \
12666 } \
12667 } \
12668 } \
12669
12670 int result = 0;
12671
12695
12696 #undef perform_test
12697
12698 return result;
12699}
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 1150 of file exprtk_test.cpp.

1151{
1152 return not_equal_impl(t0,t1,epsilon);
1153}
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 1144 of file exprtk_test.cpp.

1146{
1147 return not_equal_impl(t0,t1,epsilon);
1148}

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 1132 of file exprtk_test.cpp.

1135{
1136 if (t1 != t1) return true;
1137 if (t2 != t2) return true;
1138 T diff = std::abs(t1 - t2);
1139 T eps_norm = (std::max(T(1),std::max(std::abs(t1),std::abs(t2))) * epsilon);
1140 return diff > eps_norm;
1141}

Referenced by not_equal(), and not_equal().

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 10282 of file exprtk_test.cpp.

10283{
10284 typedef exprtk::results_context<T> results_context_t;
10285 typedef typename results_context_t::type_store_t type_t;
10286 typedef typename type_t::scalar_view scalar_t;
10287
10288 if (1 != results.count())
10289 return false;
10290 else if (type_t::e_scalar != results[0].type)
10291 return false;
10292 else
10293 return (value == scalar_t(results[0])());
10294}
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 10252 of file exprtk_test.cpp.

10253{
10254 typedef exprtk::results_context<T> results_context_t;
10255 typedef typename results_context_t::type_store_t type_t;
10256
10257 std::string res_str;
10258
10259 for (std::size_t i = 0; i < results.count(); ++i)
10260 {
10261 type_t t = results[i];
10262
10263 switch (t.type)
10264 {
10265 case type_t::e_scalar : res_str += 'T';
10266 break;
10267
10268 case type_t::e_vector : res_str += 'V';
10269 break;
10270
10271 case type_t::e_string : res_str += 'S';
10272 break;
10273
10274 default : continue;
10275 }
10276 }
10277
10278 return res_str;
10279}

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

Here is the call graph for this function:

◆ run_test00()

template<typename T >
bool run_test00 ( )

Definition at line 1264 of file exprtk_test.cpp.

1265{
1266 const std::size_t rounds = 10;
1267
1268 for (std::size_t r = 0; r < rounds; ++r)
1269 {
1270 bool result = true;
1271
1272 for (std::size_t i = 0; i < global_test_list_size; ++i)
1273 {
1274 if (!test_expression<T>(global_test_list[i].first,T(global_test_list[i].second)))
1275 {
1276 result = false;
1277 }
1278 }
1279
1280 if (!result)
1281 {
1282 return false;
1283 }
1284 }
1285
1286 {
1287 const std::vector<test_t> tests = edge_cases<T>::test_cases();
1288
1289 bool result = true;
1290
1291 for (std::size_t i = 0; i < tests.size(); ++i)
1292 {
1293 if (!test_expression<T>(tests[i].first,T(tests[i].second)))
1294 {
1295 result = false;
1296 }
1297 }
1298
1299 if (!result)
1300 {
1301 return false;
1302 }
1303 }
1304
1305 return true;
1306}
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 ( )

Definition at line 1345 of file exprtk_test.cpp.

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

Definition at line 2121 of file exprtk_test.cpp.

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

Definition at line 2962 of file exprtk_test.cpp.

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

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 ( )

Definition at line 3266 of file exprtk_test.cpp.

3267{
3268 const std::string expression_string = "clamp(-1.0,sin(2 * pi * x) + cos(y / 2 * pi),+1.0)";
3269
3270 exprtk::symbol_table<T> symbol_table;
3271 exprtk::expression<T> expression;
3272
3273 T x = T(-1000);
3274 T y = T(-1000);
3275
3276 symbol_table.add_variable("x",x);
3277 symbol_table.add_variable("y",y);
3278 symbol_table.add_constants();
3279
3280 expression.register_symbol_table(symbol_table);
3281
3282 {
3283 exprtk::parser<T> parser;
3284
3285 if (!parser.compile(expression_string,expression))
3286 {
3287 printf("run_test04() - Error: %s Expression: %s\n",
3288 parser.error().c_str(),
3289 expression_string.c_str());
3290
3291 return false;
3292 }
3293 }
3294
3295 const T pi = T(3.141592653589793238462643383279502);
3296 const T increment = T(0.0001);
3297
3298 while ((x <= T(+1000)) && (y <= T(+1000)))
3299 {
3300 T result1 = expression.value();
3301 T result2 = clamp<T>(-1.0,std::sin(2 * pi * x) + std::cos(y / 2 * pi),+1.0);
3302
3303 if (not_equal(result1,result2))
3304 {
3305 printf("run_test04() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f x:%19.15f\ty:%19.15f\n",
3306 expression_string.c_str(),
3307 static_cast<double>(result1),
3308 static_cast<double>(result2),
3309 static_cast<double>(x),
3310 static_cast<double>(y));
3311
3312 return false;
3313 }
3314
3315 x += increment;
3316 y += increment;
3317 }
3318
3319 return true;
3320}
const double pi

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

Here is the call graph for this function:

◆ run_test05()

template<typename T >
bool run_test05 ( )

Definition at line 3323 of file exprtk_test.cpp.

3324{
3325 typedef exprtk::expression<T> expression_t;
3326
3327 const std::string expression_string = "clamp(-1.0,sin(2 * pi * x_var123) + cos(y_var123 / 2 * pi),+1.0)";
3328
3329 exprtk::symbol_table<T> symbol_table;
3330 std::deque<expression_t> expression_list;
3331
3332 T x = T(-1000);
3333 T y = T(-1000);
3334
3335 symbol_table.add_variable("x_var123",x);
3336 symbol_table.add_variable("y_var123",y);
3337 symbol_table.add_constants();
3338
3339 const std::size_t expression_count = 10;
3340 for (std::size_t i = 0; i < expression_count; ++i)
3341 {
3342 expression_t e;
3343 e.register_symbol_table(symbol_table);
3344
3345 {
3346 exprtk::parser<T> parser;
3347
3348 if (!parser.compile(expression_string,e))
3349 {
3350 printf("run_test05() - Error: %s Expression: %s\n",
3351 parser.error().c_str(),
3352 expression_string.c_str());
3353
3354 return false;
3355 }
3356 }
3357
3358 expression_list.push_back(e);
3359 }
3360
3361 const T pi = T(3.141592653589793238462643383279502);
3362 const T increment = T(0.001);
3363
3364 while ((x <= T(+1000)) && (y <= T(+1000)))
3365 {
3366 T real_result = clamp<T>(-1.0,std::sin(2 * pi * x) + std::cos(y / 2 * pi),+1.0);
3367
3368 for (std::size_t i = 0; i < expression_list.size(); ++i)
3369 {
3370 expression_t& expr = expression_list[i];
3371
3372 T result = expr.value();
3373
3374 if (not_equal(result,real_result))
3375 {
3376 printf("run_test05() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f x:%19.15f\ty:%19.15f\tIndex:%d\n",
3377 expression_string.c_str(),
3378 static_cast<double>(real_result),
3379 static_cast<double>(result),
3380 static_cast<double>(x),
3381 static_cast<double>(y),
3382 static_cast<unsigned int>(i));
3383
3384 return false;
3385 }
3386 }
3387
3388 x += increment;
3389 y += increment;
3390 }
3391
3392 return true;
3393}
static const std::string expression_list[]

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

Here is the call graph for this function:

◆ run_test06()

template<typename T >
bool run_test06 ( )

Definition at line 3396 of file exprtk_test.cpp.

3397{
3398 typedef exprtk::expression<T> expression_t;
3399
3400 const std::string expression_string = "sqrt(1 - (x^2))";
3401
3402 T x = T(0);
3403
3404 exprtk::symbol_table<T> symbol_table;
3405 symbol_table.add_variable("x",x);
3406
3407 expression_t expression;
3408 expression.register_symbol_table(symbol_table);
3409
3410 {
3411 exprtk::parser<T> parser;
3412
3413 if (!parser.compile(expression_string,expression))
3414 {
3415 printf("run_test06() - Error: %s Expression: %s\n",
3416 parser.error().c_str(),
3417 expression_string.c_str());
3418
3419 return false;
3420 }
3421 }
3422
3423 T total_area1 = exprtk::integrate(expression,x,T(-1),T(1));
3424 T total_area2 = exprtk::integrate(expression,"x",T(-1),T(1));
3425 const T pi = T(3.141592653589793238462643383279502);
3426
3427 if (not_equal(total_area1,total_area2,T(0.000001)))
3428 {
3429 printf("run_test06() - Integration Error: area1 != area2\n");
3430 return false;
3431 }
3432
3433 if (not_equal(total_area1,T(pi) / T(2),T(0.000001)))
3434 {
3435 printf("run_test06() - Integration Error: Expected: %19.15f\tResult: %19.15f\n",
3436 static_cast<double>(pi / T(2)),
3437 static_cast<double>(total_area1));
3438
3439 return false;
3440 }
3441
3442 return true;
3443}
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 ( )

Definition at line 3446 of file exprtk_test.cpp.

3447{
3448 typedef exprtk::expression<T> expression_t;
3449
3450 const std::string expression_string = "sin(2x + 1 / 3)";
3451
3452 T x = T(0);
3453
3454 exprtk::symbol_table<T> symbol_table;
3455 symbol_table.add_variable("x",x);
3456
3457 expression_t expression;
3458 expression.register_symbol_table(symbol_table);
3459
3460 {
3461 exprtk::parser<T> parser;
3462
3463 if (!parser.compile(expression_string,expression))
3464 {
3465 printf("run_test07() - Error: %s Expression: %s\n",
3466 parser.error().c_str(),
3467 expression_string.c_str());
3468
3469 return false;
3470 }
3471 }
3472
3473 for (x = T(-200); x < T(200); x += T(0.0001))
3474 {
3475 {
3476 T deriv1_real_result = T(2) * std::cos(T(2) * x + T(1.0 / 3.0));
3477 T deriv1_result1 = exprtk::derivative(expression,x);
3478 T deriv1_result2 = exprtk::derivative(expression,"x");
3479
3480 if (not_equal(deriv1_result1,deriv1_result2,T(0.00001)))
3481 {
3482 printf("run_test07() - 1st Derivative Error: result1 != result2\n");
3483 return false;
3484 }
3485
3486 if (not_equal(deriv1_result1,deriv1_real_result,T(0.00001)))
3487 {
3488 printf("run_test07() - 1st Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
3489 static_cast<double>(x),
3490 static_cast<double>(deriv1_real_result),
3491 static_cast<double>(deriv1_result1));
3492
3493 return false;
3494 }
3495 }
3496
3497 {
3498 T deriv2_real_result = T(-4) * std::sin(T(2) * x + T(1.0 / 3.0));
3499 T deriv2_result1 = exprtk::second_derivative(expression,x);
3500 T deriv2_result2 = exprtk::second_derivative(expression,"x");
3501
3502 if (not_equal(deriv2_result1,deriv2_result2,T(0.0000001)))
3503 {
3504 printf("run_test07() - 2nd Derivative Error: result1 != result2\n");
3505 return false;
3506 }
3507
3508 if (not_equal(deriv2_result1,deriv2_real_result,T(0.01)))
3509 {
3510 printf("run_test07() - 2nd Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
3511 static_cast<double>(x),
3512 static_cast<double>(deriv2_real_result),
3513 static_cast<double>(deriv2_result1));
3514
3515 return false;
3516 }
3517 }
3518
3519 {
3520 T deriv3_real_result = T(-8) * std::cos(T(2) * x + T(1.0 / 3.0));
3521 T deriv3_result1 = exprtk::third_derivative(expression,x);
3522 T deriv3_result2 = exprtk::third_derivative(expression,"x");
3523
3524 if (not_equal(deriv3_result1,deriv3_result2,T(0.0000001)))
3525 {
3526 printf("run_test07() - 3rd Derivative Error: result1 != result2\n");
3527 return false;
3528 }
3529
3530 if (not_equal(deriv3_result1,deriv3_real_result,T(0.01)))
3531 {
3532 printf("run_test07() - 3rd Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
3533 static_cast<double>(x),
3534 static_cast<double>(deriv3_real_result),
3535 static_cast<double>(deriv3_result1));
3536
3537 return false;
3538 }
3539 }
3540 }
3541
3542 return true;
3543}
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(), exprtk::derivative(), exprtk::parser< T >::error(), not_equal(), exprtk::second_derivative(), and exprtk::third_derivative().

Here is the call graph for this function:

◆ run_test08()

template<typename T >
bool run_test08 ( )

Definition at line 3546 of file exprtk_test.cpp.

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

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 ( )

Definition at line 3759 of file exprtk_test.cpp.

3760{
3761 {
3762 static const std::size_t rounds = 1000;
3763
3764 for (std::size_t i = 0; i < rounds; ++i)
3765 {
3766 typedef exprtk::expression<T> expression_t;
3767 const std::string expression_string =
3768 "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3769 "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3770 "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3771 "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3772 "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)+"
3773 "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3774 "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3775 "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3776 "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3777 "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)+"
3778 "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3779 "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3780 "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3781 "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3782 "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)+"
3783 "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3784 "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3785 "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3786 "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3787 "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)";
3788
3789 T x = T(1) + (i / T(10000));
3790 T y = T(2) + (i / T(10000));
3791 myfunc<T> mf;
3792
3793 exprtk::symbol_table<T> symbol_table;
3794 symbol_table.add_variable("x",x);
3795 symbol_table.add_variable("y",y);
3796 symbol_table.add_function("myfunc0",mf);
3797 symbol_table.add_function("myfunc1",mf);
3798 symbol_table.add_function("myfunc2",mf);
3799 symbol_table.add_function("myfunc3",mf);
3800 symbol_table.add_function("myfunc4",mf);
3801 symbol_table.add_function("myfunc5",mf);
3802 symbol_table.add_function("myfunc6",mf);
3803 symbol_table.add_function("myfunc7",mf);
3804 symbol_table.add_function("myfunc8",mf);
3805 symbol_table.add_function("myfunc9",mf);
3806 symbol_table.add_constants();
3807
3808 expression_t expression;
3809 expression.register_symbol_table(symbol_table);
3810
3811 {
3812 exprtk::parser<T> parser;
3813
3814 if (!parser.compile(expression_string,expression))
3815 {
3816 printf("run_test09() - Error: %s Expression: %s\n",
3817 parser.error().c_str(),
3818 expression_string.c_str());
3819
3820 return false;
3821 }
3822 }
3823
3824 const T pi = T(3.141592653589793238462643383279502);
3825
3826 const T result = expression.value();
3827
3828 const T expected =
3829 T(4) *
3830 (
3831 mf(sin(x * pi), y / T(2)) +
3832 mf(sin(x * pi), y / T(2)) +
3833 mf(sin(x * pi), y / T(2)) +
3834 mf(sin(x * pi), y / T(2)) +
3835 mf(sin(x * pi), y / T(2)) +
3836 mf(sin(x * pi), y / T(2)) +
3837 mf(sin(x * pi), y / T(2)) +
3838 mf(sin(x * pi), y / T(2)) +
3839 mf(sin(x * pi), y / T(2)) +
3840 mf(sin(x * pi), y / T(2))
3841 );
3842
3843 if (not_equal(result,expected,T(0.0000001)))
3844 {
3845 printf("run_test09() - Error Expected: %19.15f\tResult: %19.15f\n",
3846 static_cast<double>(expected),
3847 static_cast<double>(result));
3848
3849 return false;
3850 }
3851 }
3852 }
3853
3854 {
3855 typedef exprtk::expression<T> expression_t;
3856 typedef exprtk::symbol_table<T> symbol_table_t;
3857
3858 bool result = true;
3859
3860 const std::string expression_list[] =
3861 {
3862 "foo1(1) == 1",
3863 "foo2(1,2) == (1 + 2)",
3864 "foo3(1,2,3) == (1 + 2 + 3)",
3865 "foo4(1,2,3,4) == (1 + 2 + 3 + 4)",
3866 "foo5(1,2,3,4,5) == (1 + 2 + 3 + 4 + 5)",
3867 "foo6(1,2,3,4,5,6) == (1 + 2 + 3 + 4 + 5 + 6)"
3868 };
3869
3870 const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
3871
3872 symbol_table_t symbol_table;
3873
3874 symbol_table.add_function("foo1",foo1);
3875 symbol_table.add_function("foo2",foo2);
3876 symbol_table.add_function("foo3",foo3);
3877 symbol_table.add_function("foo4",foo4);
3878 symbol_table.add_function("foo5",foo5);
3879 symbol_table.add_function("foo6",foo6);
3880
3881 for (std::size_t i = 0; i < expression_list_size; ++i)
3882 {
3883 expression_t expression;
3884 expression.register_symbol_table(symbol_table);
3885
3886 exprtk::parser<T> parser;
3887
3888 if (!parser.compile(expression_list[i],expression))
3889 {
3890 printf("run_test09() - Error: %s Expression: %s\n",
3891 parser.error().c_str(),
3892 expression_list[i].c_str());
3893
3894 result = false;
3895 }
3896 }
3897
3898 if (!result)
3899 return false;
3900 }
3901
3902 return true;
3903}
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 ( )

Definition at line 3906 of file exprtk_test.cpp.

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

Definition at line 5240 of file exprtk_test.cpp.

5241{
5242 typedef exprtk::expression<T> expression_t;
5243
5244 std::string expression_string = "(x + y) / 3";
5245
5246 T x = T(1.0);
5247 T y = T(2.0);
5248
5249 exprtk::symbol_table<T> symbol_table;
5250 symbol_table.add_variable("x",x);
5251 symbol_table.add_variable("y",y);
5252
5253 expression_t expression;
5254 expression.register_symbol_table(symbol_table);
5255
5256 static const std::size_t rounds = 500;
5257
5258 for (std::size_t i = 0; i < rounds; ++i)
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 if (not_equal(expression.value(),(x + y) / T(3),T(0.000001)))
5274 {
5275 printf("run_test11() - Error in evaluation!(1)\n");
5276 return false;
5277 }
5278
5279 expression.release();
5280
5281 if (false == (!expression))
5282 {
5283 printf("run_test11() - Error in evaluation!(2)\n");
5284 return false;
5285 }
5286
5287 {
5288 exprtk::parser<T> parser;
5289
5290 if (!parser.compile(expression_string,expression))
5291 {
5292 printf("run_test11() - Error: %s Expression: %s\n",
5293 parser.error().c_str(),
5294 expression_string.c_str());
5295
5296 return false;
5297 }
5298 }
5299
5300 expression.value();
5301
5302 if (not_equal(expression.value(),(x + y) / T(3),T(0.000001)))
5303 {
5304 printf("run_test11() - Error in evaluation!(3)\n");
5305 return false;
5306 }
5307 }
5308
5309 return true;
5310}

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 ( )

Definition at line 5313 of file exprtk_test.cpp.

5314{
5315 typedef exprtk::expression<T> expression_t;
5316
5317 static const std::string expression_string[] =
5318 {
5319 "equal(poly01(x,2.2,1.1),(2.2x^1+1.1))",
5320 "equal(poly02(x,3.3,2.2,1.1),(3.3x^2+2.2x^1+1.1))",
5321 "equal(poly03(x,4.4,3.3,2.2,1.1),(4.4x^3+3.3x^2+2.2x^1+1.1))",
5322 "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))",
5323 "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))",
5324 "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))",
5325 "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))",
5326 "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))",
5327 "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))",
5328 "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))",
5329 "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))",
5330 "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))",
5331 "EquaL(Poly01(x,2.2,1.1),(2.2x^1+1.1))",
5332 "eQuAl(pOly02(x,3.3,2.2,1.1),(3.3x^2+2.2x^1+1.1))",
5333 "eqUal(poLy03(x,4.4,3.3,2.2,1.1),(4.4x^3+3.3x^2+2.2x^1+1.1))",
5334 "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))",
5335 "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))",
5336 "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))",
5337 "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))",
5338 "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))",
5339 "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))",
5340 "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))",
5341 "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))",
5342 "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))"
5343 };
5344
5345 static const std::size_t expression_string_size = sizeof(expression_string) / sizeof(std::string);
5346
5347 T x = T(1.23456);
5348
5361
5362 exprtk::symbol_table<T> symbol_table;
5363
5364 symbol_table.add_variable("x",x);
5365 symbol_table.add_function("poly01", poly01);
5366 symbol_table.add_function("poly02", poly02);
5367 symbol_table.add_function("poly03", poly03);
5368 symbol_table.add_function("poly04", poly04);
5369 symbol_table.add_function("poly05", poly05);
5370 symbol_table.add_function("poly06", poly06);
5371 symbol_table.add_function("poly07", poly07);
5372 symbol_table.add_function("poly08", poly08);
5373 symbol_table.add_function("poly09", poly09);
5374 symbol_table.add_function("poly10", poly10);
5375 symbol_table.add_function("poly11", poly11);
5376 symbol_table.add_function("poly12", poly12);
5377
5378 expression_t expression;
5379 expression.register_symbol_table(symbol_table);
5380
5381 static const std::size_t rounds = 500;
5382
5383 for (std::size_t i = 0; i < rounds; ++i)
5384 {
5385 for (std::size_t j = 0; j < expression_string_size; ++j)
5386 {
5387 const std::string& expr_str = expression_string[j];
5388
5389 {
5390 exprtk::parser<T> parser;
5391
5392 if (!parser.compile(expr_str,expression))
5393 {
5394 printf("run_test12() - Error: %s Expression: %s\n",
5395 parser.error().c_str(),
5396 expr_str.c_str());
5397
5398 return false;
5399 }
5400 }
5401
5402 if (T(1) != expression.value())
5403 {
5404 printf("run_test12() - Error in evaluation! Expression: %s\n",expr_str.c_str());
5405 return false;
5406 }
5407 }
5408 }
5409
5410 return true;
5411}

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 ( )

Definition at line 5440 of file exprtk_test.cpp.

5441{
5442 typedef exprtk::symbol_table<T> symbol_table_t;
5443 typedef exprtk::expression<T> expression_t;
5444 typedef exprtk::parser<T> parser_t;
5445
5446 static const std::string expression_string[] =
5447 {
5448 "equal(sin(30),0.5) ",
5449 "equal(cos(60),0.5) ",
5450 "equal(sin(60),sqrt(3)/2) ",
5451 "equal(cos(30),sqrt(3)/2) ",
5452 "equal(sin(x_deg),0.5) ",
5453 "equal(cos(y_deg),0.5) ",
5454 "equal(sin(y_deg),sqrt(3)/2) ",
5455 "equal(cos(x_deg),sqrt(3)/2) ",
5456 "equal(sin(30) + sin(30),1.0) ",
5457 "equal(cos(60) + cos(60),1.0) ",
5458 "equal(sin(60) + sin(60),sqrt(3)) ",
5459 "equal(cos(30) + cos(30),sqrt(3)) ",
5460 "equal(sin(x_deg) + sin(x_deg),1.0) ",
5461 "equal(cos(y_deg) + cos(y_deg),1.0) ",
5462 "equal(sin(y_deg) + sin(y_deg),sqrt(3))",
5463 "equal(cos(x_deg) + cos(x_deg),sqrt(3))"
5464 };
5465
5466 static const std::size_t expression_string_size = sizeof(expression_string) / sizeof(std::string);
5467
5468 {
5469 T x_deg = T(30);
5470 T y_deg = T(60);
5471
5472 sine_deg <T> sine;
5473 cosine_deg<T> cosine;
5474
5475 symbol_table_t symbol_table_0;
5476 symbol_table_t symbol_table_1;
5477
5478 symbol_table_0.add_variable("x_deg",x_deg);
5479 symbol_table_1.add_variable("y_deg",y_deg);
5480
5481 symbol_table_0.add_function( "sine_deg", sine);
5482 symbol_table_1.add_function("cosine_deg", cosine);
5483
5484 expression_t expression;
5485
5486 expression.register_symbol_table(symbol_table_0);
5487 expression.register_symbol_table(symbol_table_1);
5488
5489 static const std::size_t rounds = 100;
5490
5491 for (std::size_t i = 0; i < rounds; ++i)
5492 {
5493 for (std::size_t j = 0; j < expression_string_size; ++j)
5494 {
5495 const std::string& expr_str = expression_string[j];
5496
5497 {
5498 parser_t parser;
5499
5500 parser.replace_symbol("sin", "sine_deg");
5501 parser.replace_symbol("cos", "cosine_deg");
5502
5503 if (!parser.compile(expr_str,expression))
5504 {
5505 printf("run_test13() - Error: %s Expression: %s [1]\n",
5506 parser.error().c_str(),
5507 expr_str.c_str());
5508
5509 return false;
5510 }
5511 }
5512
5513 if (T(1) != expression.value())
5514 {
5515 printf("run_test13() - Error in evaluation! Expression: %s [1]\n",expr_str.c_str());
5516 return false;
5517 }
5518 }
5519 }
5520 }
5521
5522 {
5523 T x_deg = T(30);
5524 T y_deg = T(60);
5525
5526 sine_deg <T> sine;
5527 cosine_deg<T> cosine;
5528
5529 symbol_table_t symbol_table_0;
5530 symbol_table_t symbol_table_1;
5531
5532 symbol_table_0.add_variable("x_deg",x_deg);
5533 symbol_table_1.add_variable("y_deg",y_deg);
5534
5535 symbol_table_0.add_reserved_function("sin", sine);
5536 symbol_table_1.add_reserved_function("cos",cosine);
5537
5538 expression_t expression;
5539
5540 expression.register_symbol_table(symbol_table_0);
5541 expression.register_symbol_table(symbol_table_1);
5542
5543 static const std::size_t rounds = 100;
5544
5545 for (std::size_t i = 0; i < rounds; ++i)
5546 {
5547 for (std::size_t j = 0; j < expression_string_size; ++j)
5548 {
5549 const std::string& expr_str = expression_string[j];
5550
5551 {
5552 typedef typename parser_t::settings_store settings_t;
5553
5554 parser_t parser;
5555
5556 parser.settings()
5557 .disable_base_function(settings_t::e_bf_sin)
5558 .disable_base_function(settings_t::e_bf_cos);
5559
5560 if (!parser.compile(expr_str,expression))
5561 {
5562 printf("run_test13() - Error: %s Expression: %s [2]\n",
5563 parser.error().c_str(),
5564 expr_str.c_str());
5565
5566 return false;
5567 }
5568 }
5569
5570 if (T(1) != expression.value())
5571 {
5572 printf("run_test13() - Error in evaluation! Expression: %s [2]\n",expr_str.c_str());
5573 return false;
5574 }
5575 }
5576 }
5577 }
5578
5579 return true;
5580}

References rounds.

◆ run_test14()

template<typename T >
bool run_test14 ( )

Definition at line 5611 of file exprtk_test.cpp.

5612{
5613 typedef exprtk::expression<T> expression_t;
5614
5615 T x = T(0);
5616 T y = T(0);
5617 T z = T(0);
5618 T w = T(0);
5619
5632
5633 exprtk::rtl::vecops::package<T> vector_package;
5634
5635 exprtk::symbol_table<T> symbol_table;
5636 symbol_table.add_constants();
5637 symbol_table.add_variable("x",x);
5638 symbol_table.add_variable("y",y);
5639 symbol_table.add_variable("z",z);
5640 symbol_table.add_variable("w",w);
5641 symbol_table.add_function("poly01", poly01);
5642 symbol_table.add_function("poly02", poly02);
5643 symbol_table.add_function("poly03", poly03);
5644 symbol_table.add_function("poly04", poly04);
5645 symbol_table.add_function("poly05", poly05);
5646 symbol_table.add_function("poly06", poly06);
5647 symbol_table.add_function("poly07", poly07);
5648 symbol_table.add_function("poly08", poly08);
5649 symbol_table.add_function("poly09", poly09);
5650 symbol_table.add_function("poly10", poly10);
5651 symbol_table.add_function("poly11", poly11);
5652 symbol_table.add_function("poly12", poly12);
5653
5654 symbol_table.add_package(vector_package);
5655
5656 expression_t expression;
5657 expression.register_symbol_table(symbol_table);
5658
5659 exprtk::parser<T> parser;
5660
5661 std::deque<std::string> expr_str_list;
5662
5663 load_expressions("exprtk_functional_test.txt" , expr_str_list);
5664 load_expressions("exprtk_functional_ext_test.txt" , expr_str_list);
5665
5666 if (expr_str_list.empty())
5667 {
5668 return true;
5669 }
5670
5671 std::deque<exprtk::expression<T> > expression_list;
5672 bool error_found = false;
5673
5674 static const std::size_t rounds = 5;
5675
5676 for (std::size_t r = 0; r < rounds; ++r)
5677 {
5678 for (std::size_t i = 0; i < expr_str_list.size(); ++i)
5679 {
5680 exprtk::expression<T> current_expression;
5681
5682 current_expression.register_symbol_table(symbol_table);
5683
5684 if (!parser.compile(expr_str_list[i],current_expression))
5685 {
5686 printf("run_test14() - Error: %s Expression: %s\n",
5687 parser.error().c_str(),
5688 expr_str_list[i].c_str());
5689
5690 error_found = true;
5691 }
5692 else
5693 expression_list.push_back(current_expression);
5694 }
5695
5696 if (error_found)
5697 {
5698 break;
5699 }
5700
5701 for (std::size_t i = 0; i < expression_list.size(); ++i)
5702 {
5703 const T result = expression_list[i].value();
5704
5705 if (result != T(1))
5706 {
5707 error_found = true;
5708
5709 printf("run_test14() - Error with evaluation of expression: %s\n",
5710 expr_str_list[i].c_str());
5711 }
5712 }
5713
5714 expression_list.clear();
5715
5716 if (error_found)
5717 {
5718 break;
5719 }
5720 }
5721
5722 return !error_found;
5723}
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 ( )

Definition at line 5726 of file exprtk_test.cpp.

5727{
5728 typedef exprtk::expression<T> expression_t;
5729
5730 T x = T(1.1);
5731 T y = T(2.2);
5732 T z = T(3.3);
5733
5734 exprtk::symbol_table<T> symbol_table;
5735 symbol_table.add_constants();
5736 symbol_table.add_variable("x",x);
5737 symbol_table.add_variable("y",y);
5738 symbol_table.add_variable("z",z);
5739
5740 static const std::string expr_str_list[] =
5741 {
5742 "2 - (x + y) / z//Comment 01 ",
5743 "2 - (x + y) / z#Comment 02 ",
5744 "2 - (x + y) / z //Comment 03 ",
5745 "2 - (x + y) / z #Comment 04 ",
5746 "2 - (x + y) / z//Comment 05 \n",
5747 "2 - (x + y) / z#Comment 06 \n",
5748 "2 - (x + y) / z //Comment 07\n",
5749 "2 - (x + y) / z #Comment 08 \n",
5750 "/* Comment 09*/2 - (x + y) / z",
5751 "/* Comment 10*/2 - (x + y) / z\n",
5752 "/* Comment 11*/2 - (x + y) / z/* Comment 12*/",
5753 "/* Comment 13*/2 - (x + y) / z/* Comment 14*/\n",
5754 "2 - /* Comment 15 */(x + y) / z",
5755 "2 - /* Comment 16 */(x + y) /* Comment 17 *// z \n",
5756 "2 - /* Comment 18 */(x + y) /* Comment 19 */ / z //Comment 20\n",
5757 "2 - /* Comment 21 */(x + y) /* Comment 22 */ / z #Comment 23\n",
5758 "2 - /* Comment 24 */(x + y) /* Comment 25 */ / z //Comment 26",
5759 "2 - /* Comment 27 */(x + y) /* Comment 28 */ / z #Comment 29"
5760 };
5761 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
5762
5763 std::deque<expression_t> expression_list;
5764
5765 for (std::size_t i = 0; i < expr_str_list_size; ++i)
5766 {
5767 expression_t expression;
5768 expression.register_symbol_table(symbol_table);
5769
5770 exprtk::parser<T> parser;
5771
5772 if (!parser.compile(expr_str_list[i],expression))
5773 {
5774 printf("run_test15() - Error: %s Expression: %s\n",
5775 parser.error().c_str(),
5776 expr_str_list[i].c_str());
5777
5778 return false;
5779 }
5780 else
5781 expression_list.push_back(expression);
5782 }
5783
5784 expression_t base_expression;
5785 const std::string base_expr_str = "2 - (x + y) / z";
5786
5787 {
5788 base_expression.register_symbol_table(symbol_table);
5789
5790 exprtk::parser<T> parser;
5791
5792 if (!parser.compile(base_expr_str,base_expression))
5793 {
5794 printf("run_test15() - Error: %s Expression: %s\n",
5795 parser.error().c_str(),
5796 base_expr_str.c_str());
5797
5798 return false;
5799 }
5800 }
5801
5802 bool error_found = false;
5803
5804 for (std::size_t i = 0; i < expression_list.size(); ++i)
5805 {
5806 T base_result = base_expression.value();
5807 T result = expression_list[i].value();
5808
5809 if (not_equal(base_result,result))
5810 {
5811 printf("run_test15() - Error in evaluation! (1) Base: %20.10f\tResult: %20.10f\tExpression: %s\n",
5812 static_cast<double>(base_result),
5813 static_cast<double>(result),
5814 expr_str_list[i].c_str());
5815
5816 error_found = true;
5817 }
5818 }
5819
5820 return !error_found;
5821}

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 ( )

Definition at line 5846 of file exprtk_test.cpp.

5847{
5848 typedef exprtk::expression<T> expression_t;
5849
5850 T x = T(1.1);
5851 T y = T(2.2);
5852 T z = T(3.3);
5853 T w = T(4.4);
5854 T u = T(5.5);
5855
5856 test_func0<T> test_func00;
5857 test_func1<T> test_func01;
5858 test_func2<T> test_func02;
5859 test_func3<T> test_func03;
5860 test_func4<T> test_func04;
5861 test_func5<T> test_func05;
5862
5863 exprtk::symbol_table<T> symbol_table;
5864 symbol_table.add_constants();
5865 symbol_table.add_variable("x",x);
5866 symbol_table.add_variable("y",y);
5867 symbol_table.add_variable("z",z);
5868 symbol_table.add_variable("w",w);
5869 symbol_table.add_variable("u",u);
5870
5871 symbol_table.add_function("test_func0",test_func00);
5872 symbol_table.add_function("test_func1",test_func01);
5873 symbol_table.add_function("test_func2",test_func02);
5874 symbol_table.add_function("test_func3",test_func03);
5875 symbol_table.add_function("test_func4",test_func04);
5876 symbol_table.add_function("test_func5",test_func05);
5877
5878 static const std::string expr_str_list[] =
5879 {
5880 "test_func0 = test_func0()",
5881 "test_func0 == test_func0()",
5882 "equal(1.1 + test_func0,test_func0() + 1.1)",
5883 "equal(test_func0 + 1.1,1.1 + test_func0())",
5884 "equal((1.1 + test_func0),(test_func0() + 1.1))",
5885 "equal((test_func0 + 1.1),(1.1 + test_func0()))",
5886 "equal(test_func0,test_func0())",
5887 "equal(test_func0,1.1234)",
5888 "equal(test_func0(),1.1234)",
5889 "equal(test_func0 + test_func0(),2 * 1.1234)",
5890 "equal((test_func0 + test_func0()),2 * 1.1234)",
5891 "equal((test_func0) + (test_func0()),2 * 1.1234)",
5892 "equal(test_func1(x),(x))",
5893 "equal(test_func2(x,y),(x + y))",
5894 "equal(test_func3(x,y,z),(x + y + z))",
5895 "equal(test_func4(x,y,z,w),(x + y + z + w))",
5896 "equal(test_func5(x,y,z,w,u),(x + y + z + w + u))",
5897 "equal(1.1 + test_func0,1.1234 + 1.1)",
5898 "equal(1.1 + test_func0(),1.1234 + 1.1)",
5899 "equal(1.1 + test_func1(x),(x + 1.1))",
5900 "equal(1.1 + test_func2(x,y),(x + y + 1.1))",
5901 "equal(1.1 + test_func3(x,y,z),(x + y + z + 1.1))",
5902 "equal(1.1 + test_func4(x,y,z,w),(x + y + z + w + 1.1))",
5903 "equal(1.1 + test_func5(x,y,z,w,u),(x + y + z + w + u + 1.1))",
5904 "equal(test_func0 + 2.2,1.1234 + 2.2)",
5905 "equal(test_func0() + 2.2,1.1234 + 2.2)",
5906 "equal(test_func1(x) + 2.2,(x + 2.2))",
5907 "equal(test_func2(x,y) + 2.2,(x + y + 2.2))",
5908 "equal(test_func3(x,y,z) + 2.2,(x + y + z + 2.2))",
5909 "equal(test_func4(x,y,z,w) + 2.2,(x + y + z + w + 2.2))",
5910 "equal(test_func5(x,y,z,w,u) + 2.2,(x + y + z + w + u + 2.2))",
5911 "equal({[test_func1(x)]},{[(x)]})",
5912 "equal({[test_func2(x,y)]},{[(x + y)]})",
5913 "equal({[test_func3(x,y,z)]},{[(x + y + z)]})",
5914 "equal({[test_func4(x,y,z,w)]},{[(x + y + z + w)]})",
5915 "equal({[test_func5(x,y,z,w,u)]},{[(x + y + z + w + u)]})",
5916 "equal(test_func1(2.12),(2.12))",
5917 "equal(test_func2(2.12,3.12),(2.12 + 3.12))",
5918 "equal(test_func3(2.12,3.12,4.12),(2.12 + 3.12 + 4.12))",
5919 "equal(test_func4(2.12,3.12,4.12,5.12),(2.12 + 3.12 + 4.12 + 5.12))",
5920 "equal(test_func5(2.12,3.12,4.12,5.12,6.12),(2.12 + 3.12 + 4.12 + 5.12 + 6.12))",
5921 "equal(1.1 + test_func1(2.12),(2.12 + 1.1))",
5922 "equal(1.1 + test_func2(2.12,3.12),(2.12 + 3.12 + 1.1))",
5923 "equal(1.1 + test_func3(2.12,3.12,4.12),(2.12 + 3.12 + 4.12 + 1.1))",
5924 "equal(1.1 + test_func4(2.12,3.12,4.12,5.12),(2.12 + 3.12 + 4.12 + 5.12 + 1.1))",
5925 "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))",
5926 "equal(test_func1(2.12) + 2.2,(2.12 + 2.2))",
5927 "equal(test_func2(2.12,3.12) + 2.2,(2.12 + 3.12 + 2.2))",
5928 "equal(test_func3(2.12,3.12,4.12) + 2.2,(2.12 + 3.12 + 4.12 + 2.2))",
5929 "equal(test_func4(2.12,3.12,4.12,5.12) + 2.2,(2.12 + 3.12 + 4.12 + 5.12 + 2.2))",
5930 "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))",
5931 "equal({[test_func1(2.12)]},{[(2.12)]})",
5932 "equal({[test_func2(2.12,3.12)]},{[(2.12 + 3.12)]})",
5933 "equal({[test_func3(2.12,3.12,4.12)]},{[(2.12 + 3.12 + 4.12)]})",
5934 "equal({[test_func4(2.12,3.12,4.12,5.12)]},{[(2.12 + 3.12 + 4.12 + 5.12)]})",
5935 "equal({[test_func5(2.12,3.12,4.12,5.12,6.12)]},{[(2.12 + 3.12 + 4.12 + 5.12 + 6.12)]})",
5936 "TeSt_FuNc0 = tEsT_fUnC0()",
5937 "TEst_fuNC0 == tESt_fUNc0()",
5938 "EquaL(tEsT_FuNC1(x),(x))",
5939 "eQuAl(teSt_fUnc2(x,y),(x + y))",
5940 "EqUaL(tEsT_fUNc3(x,y,z),(x + y + z))",
5941 "EQUal(TEst_FunC4(x,y,z,w),(x + y + z + w))",
5942 "eqUAL(tEsT_FuNc5(x,y,z,w,u),(x + y + z + w + u))"
5943 };
5944 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
5945
5946 std::deque<expression_t> expression_list;
5947
5948 for (std::size_t i = 0; i < expr_str_list_size; ++i)
5949 {
5950 expression_t expression;
5951 expression.register_symbol_table(symbol_table);
5952
5953 exprtk::parser<T> parser;
5954
5955 if (!parser.compile(expr_str_list[i],expression))
5956 {
5957 printf("run_test16() - Error: %s Expression: %s\n",
5958 parser.error().c_str(),
5959 expr_str_list[i].c_str());
5960
5961 return false;
5962 }
5963 else
5964 expression_list.push_back(expression);
5965 }
5966
5967 bool error_found = false;
5968
5969 for (std::size_t i = 0; i < expression_list.size(); ++i)
5970 {
5971 if (T(1) != expression_list[i].value())
5972 {
5973 printf("run_test16() - Error in evaluation! (1) Expression: %s\n",
5974 expr_str_list[i].c_str());
5975
5976 error_found = true;
5977 }
5978 }
5979
5980 return !error_found;
5981}
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 ( )

Definition at line 5984 of file exprtk_test.cpp.

5985{
5986 typedef exprtk::expression<T> expression_t;
5987
5988 T x = T(1.1);
5989 T y = T(2.2);
5990 T z = T(3.3);
5991 T w = T(4.4);
5992 T u = T(5.5);
5993 T v = T(6.6);
5994 T t = T(7.7);
5995
5996 T one = T(1);
5997 T zero = T(0);
5998
5999 exprtk::symbol_table<T> symbol_table;
6000 symbol_table.add_constants();
6001 symbol_table.add_variable("x",x);
6002 symbol_table.add_variable("y",y);
6003 symbol_table.add_variable("z",z);
6004 symbol_table.add_variable("w",w);
6005 symbol_table.add_variable("u",u);
6006 symbol_table.add_variable("v",v);
6007 symbol_table.add_variable("t",t);
6008
6009 symbol_table.add_variable("one",one);
6010 symbol_table.add_variable("zero",zero);
6011
6012 static const std::string expr_str_list[] =
6013 {
6014 "equal(mand(one,one),1.0)",
6015 "equal(mand(one,zero),0.0)",
6016 "equal(mand(zero,one),0.0)",
6017 "equal(mand(zero,zero),0.0)",
6018 "equal(mand(one,one),1.0)",
6019 "equal(mand(one,one,one),1.0)",
6020 "equal(mand(one,one,one,one),1.0)",
6021 "equal(mand(one,one,one,one,one),1.0)",
6022 "equal(mand(one,one,zero),0.0)",
6023 "equal(mand(one,one,one,zero),0.0)",
6024 "equal(mand(one,one,one,one,zero),0.0)",
6025 "equal(mand(one,one,one,one,one,zero),0.0)",
6026 "equal(mor(one,one),1.0)",
6027 "equal(mor(one,zero),1.0)",
6028 "equal(mor(zero,one),1.0)",
6029 "equal(mor(zero,zero),0.0)",
6030 "equal(mor(one,one),1.0)",
6031 "equal(mor(one,one,zero),1.0)",
6032 "equal(mor(one,zero,one),1.0)",
6033 "equal(mor(one,zero,one,zero),1.0)",
6034 "equal(mor(zero,one),1.0)",
6035 "equal(mor(zero,zero,one),1.0)",
6036 "equal(mor(zero,zero,zero,zero,one),1.0)",
6037 "equal(mor(zero,zero,zero,zero,zero,one),1.0)",
6038 "equal(mor(zero,zero,zero,zero,zero,zero,zero,zero),0.0)",
6039 "equal((one nand one),not(mand(one,one)))",
6040 "equal((one nand zero),not(mand(one,zero)))",
6041 "equal((zero nand one),not(mand(zero,one)))",
6042 "equal((zero nand zero),not(mand(zero,zero)))",
6043 "equal((one nor one),not(mor(one,one)))",
6044 "equal((one nor zero),not(mor(one,zero)))",
6045 "equal((zero nor one),not(mor(zero,one)))",
6046 "equal((zero nor zero),not(mor(zero,zero)))",
6047 "equal(sum(x,y,z,w,u,v,t),(x+y+z+w+u+v+t))",
6048 "equal(sum(x+t,y+v,z+u,w+w,u+z,v+y,t+x),2*(x+y+z+w+u+v+t))",
6049 "equal(mul(x,y,z,w,u,v,t),(x*y*z*w*u*v*t))",
6050 "equal(mul(x*t,y*v,z*u,w*w,u*z,v*y,t*x),(x*y*z*w*u*v*t)^2)",
6051 "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))",
6052 "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))",
6053 "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))",
6054 "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))",
6055 "equal(min(x,y,z,w,u,v,t,zero),zero)",
6056 "equal(min(x+y,z+w,u+v,t,zero),zero)",
6057 "equal(max(one,x,y,z,w,u,v,t),t)",
6058 "equal(max(x+y,z+w,u+v,t,one),u+v)",
6059 "equal(avg(x,y,z,w,u,v,t),(x+y+z+w+u+v+t)/7.0)",
6060 "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))"
6061 };
6062 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
6063
6064 std::deque<expression_t> expression_list;
6065
6066 for (std::size_t i = 0; i < expr_str_list_size; ++i)
6067 {
6068 expression_t expression;
6069 expression.register_symbol_table(symbol_table);
6070
6071 exprtk::parser<T> parser;
6072
6073 if (!parser.compile(expr_str_list[i],expression))
6074 {
6075 printf("run_test17() - Error: %s Expression: %s\n",
6076 parser.error().c_str(),
6077 expr_str_list[i].c_str());
6078
6079 return false;
6080 }
6081 else
6082 expression_list.push_back(expression);
6083 }
6084
6085 bool error_found = false;
6086
6087 for (std::size_t i = 0; i < expression_list.size(); ++i)
6088 {
6089 if (T(1) != expression_list[i].value())
6090 {
6091 printf("run_test17() - Error in evaluation! (1) Expression: %s\n",
6092 expr_str_list[i].c_str());
6093
6094 error_found = true;
6095 }
6096 }
6097
6098 return !error_found;
6099}

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 ( )

Definition at line 6451 of file exprtk_test.cpp.

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

Definition at line 8468 of file exprtk_test.cpp.

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

References expression_list, not_equal(), and rounds.

Here is the call graph for this function:

◆ run_test20()

template<typename T >
bool run_test20 ( )

Definition at line 9952 of file exprtk_test.cpp.

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

Definition at line 10350 of file exprtk_test.cpp.

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

Definition at line 11546 of file exprtk_test.cpp.

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

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 1156 of file exprtk_test.cpp.

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

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 51 of file exprtk_test.cpp.

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

Referenced by run_test00().