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 >
isnan (const T t)
 
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:43995

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:

◆ isnan()

template<typename T >
T isnan ( const T  t)
inline

Definition at line 5611 of file exprtk_test.cpp.

5612{
5613 return std::isnan(t) ? T(1) : T(0);
5614}

Referenced by run_test14().

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

13324{
13325 const std::string test_set = (argc == 2) ? std::string(argv[1]) : "";
13326
13327 #define perform_test(Type,Number) \
13328 { \
13329 const std::string test_name = "run_test"#Number; \
13330 if ( \
13331 test_set.empty() || \
13332 test_set.find(test_name) != std::string::npos \
13333 ) \
13334 { \
13335 exprtk::timer timer; \
13336 timer.start(); \
13337 if (!run_test##Number<Type>()) \
13338 { \
13339 printf("run_test"#Number" (%s) *** FAILED! ***\n", \
13340 type_name<Type>::value().c_str()); \
13341 result = EXIT_FAILURE; \
13342 } \
13343 else \
13344 { \
13345 timer.stop(); \
13346 printf("run_test"#Number" (%s) - Result: SUCCESS Time: %8.4fsec\n", \
13347 type_name<Type>::value().c_str(), \
13348 timer.time()); \
13349 } \
13350 } \
13351 } \
13352
13353 int result = 0;
13354
13378
13379 #undef perform_test
13380
13381 return result;
13382}
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 10323 of file exprtk_test.cpp.

10324{
10325 typedef exprtk::results_context<T> results_context_t;
10326 typedef typename results_context_t::type_store_t type_t;
10327 typedef typename type_t::scalar_view scalar_t;
10328
10329 if (1 != results.count())
10330 return false;
10331 else if (type_t::e_scalar != results[0].type)
10332 return false;
10333 else
10334 return (value == scalar_t(results[0])());
10335}
std::size_t count() const
Definition exprtk.hpp:5023

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

10294{
10295 typedef exprtk::results_context<T> results_context_t;
10296 typedef typename results_context_t::type_store_t type_t;
10297
10298 std::string res_str;
10299
10300 for (std::size_t i = 0; i < results.count(); ++i)
10301 {
10302 type_t t = results[i];
10303
10304 switch (t.type)
10305 {
10306 case type_t::e_scalar : res_str += 'T';
10307 break;
10308
10309 case type_t::e_vector : res_str += 'V';
10310 break;
10311
10312 case type_t::e_string : res_str += 'S';
10313 break;
10314
10315 default : continue;
10316 }
10317 }
10318
10319 return res_str;
10320}

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:21991
bool compile(const std::string &expression_string, expression< T > &expr)
Definition exprtk.hpp:24742
std::string error() const
Definition exprtk.hpp:25029
bool add_variable(const std::string &variable_name, T &t, const bool is_constant=false)
Definition exprtk.hpp:21035
bool add_vector(const std::string &vector_name, T(&v)[N])
Definition exprtk.hpp:21239
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:4762
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:21063
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:42356

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:42451
T derivative(const expression< T > &e, T &x, const T &h=T(0.00000001))
Definition exprtk.hpp:42408
T second_derivative(const expression< T > &e, T &x, const T &h=T(0.00001))
Definition exprtk.hpp:42429

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:21076
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:25044
bool remove_variable(const std::string &variable_name, const bool delete_node=true)
Definition exprtk.hpp:21294
std::size_t get_variable_list(Sequence< std::pair< std::string, T >, Allocator > &vlist) const
Definition exprtk.hpp:21370
stringvar_ptr get_stringvar(const std::string &string_name) const
Definition exprtk.hpp:20864
bool remove_stringvar(const std::string &string_name)
Definition exprtk.hpp:21303
variable_ptr get_variable(const std::string &variable_name) const
Definition exprtk.hpp:20844
bool symbol_exists(const std::string &symbol_name, const bool check_reserved_symb=true) const
Definition exprtk.hpp:21456
std::size_t get_stringvar_list(Sequence< std::pair< std::string, std::string >, Allocator > &svlist) const
Definition exprtk.hpp:21391
std::size_t stringvar_count() const
Definition exprtk.hpp:20819
bool remove_function(const std::string &function_name)
Definition exprtk.hpp:21312
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:42235
bool collect_functions(const std::string &expression, Sequence< std::string, Allocator > &symbol_list)
Definition exprtk.hpp:42296

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

5618{
5619 typedef exprtk::expression<T> expression_t;
5620 typedef exprtk::parser<T> parser_t;
5621 typedef typename parser_t::settings_store settings_t;
5622
5623 T x = T(0);
5624 T y = T(0);
5625 T z = T(0);
5626 T w = T(0);
5627
5640
5641 exprtk::rtl::vecops::package<T> vector_package;
5642
5643 exprtk::symbol_table<T> symbol_table;
5644 symbol_table.add_constants();
5645 symbol_table.add_variable("x",x);
5646 symbol_table.add_variable("y",y);
5647 symbol_table.add_variable("z",z);
5648 symbol_table.add_variable("w",w);
5649 symbol_table.add_function("poly01", poly01);
5650 symbol_table.add_function("poly02", poly02);
5651 symbol_table.add_function("poly03", poly03);
5652 symbol_table.add_function("poly04", poly04);
5653 symbol_table.add_function("poly05", poly05);
5654 symbol_table.add_function("poly06", poly06);
5655 symbol_table.add_function("poly07", poly07);
5656 symbol_table.add_function("poly08", poly08);
5657 symbol_table.add_function("poly09", poly09);
5658 symbol_table.add_function("poly10", poly10);
5659 symbol_table.add_function("poly11", poly11);
5660 symbol_table.add_function("poly12", poly12);
5661 symbol_table.add_function("isnan" , isnan );
5662
5663 symbol_table.add_package(vector_package);
5664
5665 expression_t expression;
5666 expression.register_symbol_table(symbol_table);
5667
5668 exprtk::parser<T> parser;
5669
5670 static const std::size_t secondary_compile_options =
5671 settings_t::e_replacer +
5672 settings_t::e_joiner +
5673 settings_t::e_numeric_check +
5674 settings_t::e_bracket_check +
5675 settings_t::e_sequence_check +
5676 settings_t::e_strength_reduction;
5677
5678 const settings_t settings(secondary_compile_options);
5679 parser_t secondary_parser(settings);
5680
5681 std::deque<std::string> expr_str_list;
5682 std::deque<std::string> expr_noncomm_str_list;
5683
5684 load_expressions("exprtk_functional_test.txt" , expr_str_list);
5685 load_expressions("exprtk_functional_ext_test.txt" , expr_str_list);
5686
5687 if (expr_str_list.empty())
5688 {
5689 return true;
5690 }
5691
5692 load_expressions("exprtk_noncommutative_test.txt" , expr_noncomm_str_list);
5693
5694 std::deque<exprtk::expression<T> > expression_list;
5695 bool error_found = false;
5696
5697 static const std::size_t rounds = 5;
5698
5699 for (std::size_t r = 0; r < rounds; ++r)
5700 {
5701 for (std::size_t i = 0; i < expr_str_list.size(); ++i)
5702 {
5703 exprtk::expression<T> current_expression;
5704
5705 current_expression.register_symbol_table(symbol_table);
5706
5707 if (!parser.compile(expr_str_list[i],current_expression))
5708 {
5709 printf("run_test14() - Error: %s Expression: %s\n",
5710 parser.error().c_str(),
5711 expr_str_list[i].c_str());
5712
5713 error_found = true;
5714 }
5715 else
5716 {
5717 expression_list.push_back(current_expression);
5718 }
5719 }
5720
5721 for (std::size_t i = 0; i < expr_noncomm_str_list.size(); ++i)
5722 {
5723 exprtk::expression<T> current_expression;
5724
5725 current_expression.register_symbol_table(symbol_table);
5726
5727 if (!secondary_parser.compile(expr_noncomm_str_list[i],current_expression))
5728 {
5729 printf("run_test14() - Error: %s Expression: %s [secondary parser]\n",
5730 secondary_parser.error().c_str(),
5731 expr_noncomm_str_list[i].c_str());
5732
5733 error_found = true;
5734 }
5735 }
5736
5737 if (error_found)
5738 {
5739 break;
5740 }
5741
5742 for (std::size_t i = 0; i < expression_list.size(); ++i)
5743 {
5744 const T result = expression_list[i].value();
5745
5746 if (result != T(1))
5747 {
5748 error_found = true;
5749
5750 printf("run_test14() - Error with evaluation of expression: %s\n",
5751 expr_str_list[i].c_str());
5752 }
5753 }
5754
5755 expression_list.clear();
5756
5757 if (error_found)
5758 {
5759 break;
5760 }
5761 }
5762
5763 return !error_found;
5764}
bool add_package(Package &package)
Definition exprtk.hpp:21363
T isnan(const T t)
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, isnan(), 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 5767 of file exprtk_test.cpp.

5768{
5769 typedef exprtk::expression<T> expression_t;
5770
5771 T x = T(1.1);
5772 T y = T(2.2);
5773 T z = T(3.3);
5774
5775 exprtk::symbol_table<T> symbol_table;
5776 symbol_table.add_constants();
5777 symbol_table.add_variable("x",x);
5778 symbol_table.add_variable("y",y);
5779 symbol_table.add_variable("z",z);
5780
5781 static const std::string expr_str_list[] =
5782 {
5783 "2 - (x + y) / z//Comment 01 ",
5784 "2 - (x + y) / z#Comment 02 ",
5785 "2 - (x + y) / z //Comment 03 ",
5786 "2 - (x + y) / z #Comment 04 ",
5787 "2 - (x + y) / z//Comment 05 \n",
5788 "2 - (x + y) / z#Comment 06 \n",
5789 "2 - (x + y) / z //Comment 07\n",
5790 "2 - (x + y) / z #Comment 08 \n",
5791 "/* Comment 09*/2 - (x + y) / z",
5792 "/* Comment 10*/2 - (x + y) / z\n",
5793 "/* Comment 11*/2 - (x + y) / z/* Comment 12*/",
5794 "/* Comment 13*/2 - (x + y) / z/* Comment 14*/\n",
5795 "2 - /* Comment 15 */(x + y) / z",
5796 "2 - /* Comment 16 */(x + y) /* Comment 17 *// z \n",
5797 "2 - /* Comment 18 */(x + y) /* Comment 19 */ / z //Comment 20\n",
5798 "2 - /* Comment 21 */(x + y) /* Comment 22 */ / z #Comment 23\n",
5799 "2 - /* Comment 24 */(x + y) /* Comment 25 */ / z //Comment 26",
5800 "2 - /* Comment 27 */(x + y) /* Comment 28 */ / z #Comment 29"
5801 };
5802 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
5803
5804 std::deque<expression_t> expression_list;
5805
5806 for (std::size_t i = 0; i < expr_str_list_size; ++i)
5807 {
5808 expression_t expression;
5809 expression.register_symbol_table(symbol_table);
5810
5811 exprtk::parser<T> parser;
5812
5813 if (!parser.compile(expr_str_list[i],expression))
5814 {
5815 printf("run_test15() - Error: %s Expression: %s\n",
5816 parser.error().c_str(),
5817 expr_str_list[i].c_str());
5818
5819 return false;
5820 }
5821 else
5822 expression_list.push_back(expression);
5823 }
5824
5825 expression_t base_expression;
5826 const std::string base_expr_str = "2 - (x + y) / z";
5827
5828 {
5829 base_expression.register_symbol_table(symbol_table);
5830
5831 exprtk::parser<T> parser;
5832
5833 if (!parser.compile(base_expr_str,base_expression))
5834 {
5835 printf("run_test15() - Error: %s Expression: %s\n",
5836 parser.error().c_str(),
5837 base_expr_str.c_str());
5838
5839 return false;
5840 }
5841 }
5842
5843 bool error_found = false;
5844
5845 for (std::size_t i = 0; i < expression_list.size(); ++i)
5846 {
5847 T base_result = base_expression.value();
5848 T result = expression_list[i].value();
5849
5850 if (not_equal(base_result,result))
5851 {
5852 printf("run_test15() - Error in evaluation! (1) Base: %20.10f\tResult: %20.10f\tExpression: %s\n",
5853 static_cast<double>(base_result),
5854 static_cast<double>(result),
5855 expr_str_list[i].c_str());
5856
5857 error_found = true;
5858 }
5859 }
5860
5861 return !error_found;
5862}

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

5888{
5889 typedef exprtk::expression<T> expression_t;
5890
5891 T x = T(1.1);
5892 T y = T(2.2);
5893 T z = T(3.3);
5894 T w = T(4.4);
5895 T u = T(5.5);
5896
5897 test_func0<T> test_func00;
5898 test_func1<T> test_func01;
5899 test_func2<T> test_func02;
5900 test_func3<T> test_func03;
5901 test_func4<T> test_func04;
5902 test_func5<T> test_func05;
5903
5904 exprtk::symbol_table<T> symbol_table;
5905 symbol_table.add_constants();
5906 symbol_table.add_variable("x",x);
5907 symbol_table.add_variable("y",y);
5908 symbol_table.add_variable("z",z);
5909 symbol_table.add_variable("w",w);
5910 symbol_table.add_variable("u",u);
5911
5912 symbol_table.add_function("test_func0",test_func00);
5913 symbol_table.add_function("test_func1",test_func01);
5914 symbol_table.add_function("test_func2",test_func02);
5915 symbol_table.add_function("test_func3",test_func03);
5916 symbol_table.add_function("test_func4",test_func04);
5917 symbol_table.add_function("test_func5",test_func05);
5918
5919 static const std::string expr_str_list[] =
5920 {
5921 "test_func0 = test_func0()",
5922 "test_func0 == test_func0()",
5923 "equal(1.1 + test_func0,test_func0() + 1.1)",
5924 "equal(test_func0 + 1.1,1.1 + test_func0())",
5925 "equal((1.1 + test_func0),(test_func0() + 1.1))",
5926 "equal((test_func0 + 1.1),(1.1 + test_func0()))",
5927 "equal(test_func0,test_func0())",
5928 "equal(test_func0,1.1234)",
5929 "equal(test_func0(),1.1234)",
5930 "equal(test_func0 + test_func0(),2 * 1.1234)",
5931 "equal((test_func0 + test_func0()),2 * 1.1234)",
5932 "equal((test_func0) + (test_func0()),2 * 1.1234)",
5933 "equal(test_func1(x),(x))",
5934 "equal(test_func2(x,y),(x + y))",
5935 "equal(test_func3(x,y,z),(x + y + z))",
5936 "equal(test_func4(x,y,z,w),(x + y + z + w))",
5937 "equal(test_func5(x,y,z,w,u),(x + y + z + w + u))",
5938 "equal(1.1 + test_func0,1.1234 + 1.1)",
5939 "equal(1.1 + test_func0(),1.1234 + 1.1)",
5940 "equal(1.1 + test_func1(x),(x + 1.1))",
5941 "equal(1.1 + test_func2(x,y),(x + y + 1.1))",
5942 "equal(1.1 + test_func3(x,y,z),(x + y + z + 1.1))",
5943 "equal(1.1 + test_func4(x,y,z,w),(x + y + z + w + 1.1))",
5944 "equal(1.1 + test_func5(x,y,z,w,u),(x + y + z + w + u + 1.1))",
5945 "equal(test_func0 + 2.2,1.1234 + 2.2)",
5946 "equal(test_func0() + 2.2,1.1234 + 2.2)",
5947 "equal(test_func1(x) + 2.2,(x + 2.2))",
5948 "equal(test_func2(x,y) + 2.2,(x + y + 2.2))",
5949 "equal(test_func3(x,y,z) + 2.2,(x + y + z + 2.2))",
5950 "equal(test_func4(x,y,z,w) + 2.2,(x + y + z + w + 2.2))",
5951 "equal(test_func5(x,y,z,w,u) + 2.2,(x + y + z + w + u + 2.2))",
5952 "equal({[test_func1(x)]},{[(x)]})",
5953 "equal({[test_func2(x,y)]},{[(x + y)]})",
5954 "equal({[test_func3(x,y,z)]},{[(x + y + z)]})",
5955 "equal({[test_func4(x,y,z,w)]},{[(x + y + z + w)]})",
5956 "equal({[test_func5(x,y,z,w,u)]},{[(x + y + z + w + u)]})",
5957 "equal(test_func1(2.12),(2.12))",
5958 "equal(test_func2(2.12,3.12),(2.12 + 3.12))",
5959 "equal(test_func3(2.12,3.12,4.12),(2.12 + 3.12 + 4.12))",
5960 "equal(test_func4(2.12,3.12,4.12,5.12),(2.12 + 3.12 + 4.12 + 5.12))",
5961 "equal(test_func5(2.12,3.12,4.12,5.12,6.12),(2.12 + 3.12 + 4.12 + 5.12 + 6.12))",
5962 "equal(1.1 + test_func1(2.12),(2.12 + 1.1))",
5963 "equal(1.1 + test_func2(2.12,3.12),(2.12 + 3.12 + 1.1))",
5964 "equal(1.1 + test_func3(2.12,3.12,4.12),(2.12 + 3.12 + 4.12 + 1.1))",
5965 "equal(1.1 + test_func4(2.12,3.12,4.12,5.12),(2.12 + 3.12 + 4.12 + 5.12 + 1.1))",
5966 "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))",
5967 "equal(test_func1(2.12) + 2.2,(2.12 + 2.2))",
5968 "equal(test_func2(2.12,3.12) + 2.2,(2.12 + 3.12 + 2.2))",
5969 "equal(test_func3(2.12,3.12,4.12) + 2.2,(2.12 + 3.12 + 4.12 + 2.2))",
5970 "equal(test_func4(2.12,3.12,4.12,5.12) + 2.2,(2.12 + 3.12 + 4.12 + 5.12 + 2.2))",
5971 "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))",
5972 "equal({[test_func1(2.12)]},{[(2.12)]})",
5973 "equal({[test_func2(2.12,3.12)]},{[(2.12 + 3.12)]})",
5974 "equal({[test_func3(2.12,3.12,4.12)]},{[(2.12 + 3.12 + 4.12)]})",
5975 "equal({[test_func4(2.12,3.12,4.12,5.12)]},{[(2.12 + 3.12 + 4.12 + 5.12)]})",
5976 "equal({[test_func5(2.12,3.12,4.12,5.12,6.12)]},{[(2.12 + 3.12 + 4.12 + 5.12 + 6.12)]})",
5977 "TeSt_FuNc0 = tEsT_fUnC0()",
5978 "TEst_fuNC0 == tESt_fUNc0()",
5979 "EquaL(tEsT_FuNC1(x),(x))",
5980 "eQuAl(teSt_fUnc2(x,y),(x + y))",
5981 "EqUaL(tEsT_fUNc3(x,y,z),(x + y + z))",
5982 "EQUal(TEst_FunC4(x,y,z,w),(x + y + z + w))",
5983 "eqUAL(tEsT_FuNc5(x,y,z,w,u),(x + y + z + w + u))"
5984 };
5985 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
5986
5987 std::deque<expression_t> expression_list;
5988
5989 for (std::size_t i = 0; i < expr_str_list_size; ++i)
5990 {
5991 expression_t expression;
5992 expression.register_symbol_table(symbol_table);
5993
5994 exprtk::parser<T> parser;
5995
5996 if (!parser.compile(expr_str_list[i],expression))
5997 {
5998 printf("run_test16() - Error: %s Expression: %s\n",
5999 parser.error().c_str(),
6000 expr_str_list[i].c_str());
6001
6002 return false;
6003 }
6004 else
6005 expression_list.push_back(expression);
6006 }
6007
6008 bool error_found = false;
6009
6010 for (std::size_t i = 0; i < expression_list.size(); ++i)
6011 {
6012 if (T(1) != expression_list[i].value())
6013 {
6014 printf("run_test16() - Error in evaluation! (1) Expression: %s\n",
6015 expr_str_list[i].c_str());
6016
6017 error_found = true;
6018 }
6019 }
6020
6021 return !error_found;
6022}
T value(details::expression_node< T > *n)
Definition exprtk.hpp:15948

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

6026{
6027 typedef exprtk::expression<T> expression_t;
6028
6029 T x = T(1.1);
6030 T y = T(2.2);
6031 T z = T(3.3);
6032 T w = T(4.4);
6033 T u = T(5.5);
6034 T v = T(6.6);
6035 T t = T(7.7);
6036
6037 T one = T(1);
6038 T zero = T(0);
6039
6040 exprtk::symbol_table<T> symbol_table;
6041 symbol_table.add_constants();
6042 symbol_table.add_variable("x",x);
6043 symbol_table.add_variable("y",y);
6044 symbol_table.add_variable("z",z);
6045 symbol_table.add_variable("w",w);
6046 symbol_table.add_variable("u",u);
6047 symbol_table.add_variable("v",v);
6048 symbol_table.add_variable("t",t);
6049
6050 symbol_table.add_variable("one",one);
6051 symbol_table.add_variable("zero",zero);
6052
6053 static const std::string expr_str_list[] =
6054 {
6055 "equal(mand(one,one),1.0)",
6056 "equal(mand(one,zero),0.0)",
6057 "equal(mand(zero,one),0.0)",
6058 "equal(mand(zero,zero),0.0)",
6059 "equal(mand(one,one),1.0)",
6060 "equal(mand(one,one,one),1.0)",
6061 "equal(mand(one,one,one,one),1.0)",
6062 "equal(mand(one,one,one,one,one),1.0)",
6063 "equal(mand(one,one,zero),0.0)",
6064 "equal(mand(one,one,one,zero),0.0)",
6065 "equal(mand(one,one,one,one,zero),0.0)",
6066 "equal(mand(one,one,one,one,one,zero),0.0)",
6067 "equal(mor(one,one),1.0)",
6068 "equal(mor(one,zero),1.0)",
6069 "equal(mor(zero,one),1.0)",
6070 "equal(mor(zero,zero),0.0)",
6071 "equal(mor(one,one),1.0)",
6072 "equal(mor(one,one,zero),1.0)",
6073 "equal(mor(one,zero,one),1.0)",
6074 "equal(mor(one,zero,one,zero),1.0)",
6075 "equal(mor(zero,one),1.0)",
6076 "equal(mor(zero,zero,one),1.0)",
6077 "equal(mor(zero,zero,zero,zero,one),1.0)",
6078 "equal(mor(zero,zero,zero,zero,zero,one),1.0)",
6079 "equal(mor(zero,zero,zero,zero,zero,zero,zero,zero),0.0)",
6080 "equal((one nand one),not(mand(one,one)))",
6081 "equal((one nand zero),not(mand(one,zero)))",
6082 "equal((zero nand one),not(mand(zero,one)))",
6083 "equal((zero nand zero),not(mand(zero,zero)))",
6084 "equal((one nor one),not(mor(one,one)))",
6085 "equal((one nor zero),not(mor(one,zero)))",
6086 "equal((zero nor one),not(mor(zero,one)))",
6087 "equal((zero nor zero),not(mor(zero,zero)))",
6088 "equal(sum(x,y,z,w,u,v,t),(x+y+z+w+u+v+t))",
6089 "equal(sum(x+t,y+v,z+u,w+w,u+z,v+y,t+x),2*(x+y+z+w+u+v+t))",
6090 "equal(mul(x,y,z,w,u,v,t),(x*y*z*w*u*v*t))",
6091 "equal(mul(x*t,y*v,z*u,w*w,u*z,v*y,t*x),(x*y*z*w*u*v*t)^2)",
6092 "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))",
6093 "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))",
6094 "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))",
6095 "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))",
6096 "equal(min(x,y,z,w,u,v,t,zero),zero)",
6097 "equal(min(x+y,z+w,u+v,t,zero),zero)",
6098 "equal(max(one,x,y,z,w,u,v,t),t)",
6099 "equal(max(x+y,z+w,u+v,t,one),u+v)",
6100 "equal(avg(x,y,z,w,u,v,t),(x+y+z+w+u+v+t)/7.0)",
6101 "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))"
6102 };
6103 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
6104
6105 std::deque<expression_t> expression_list;
6106
6107 for (std::size_t i = 0; i < expr_str_list_size; ++i)
6108 {
6109 expression_t expression;
6110 expression.register_symbol_table(symbol_table);
6111
6112 exprtk::parser<T> parser;
6113
6114 if (!parser.compile(expr_str_list[i],expression))
6115 {
6116 printf("run_test17() - Error: %s Expression: %s\n",
6117 parser.error().c_str(),
6118 expr_str_list[i].c_str());
6119
6120 return false;
6121 }
6122 else
6123 expression_list.push_back(expression);
6124 }
6125
6126 bool error_found = false;
6127
6128 for (std::size_t i = 0; i < expression_list.size(); ++i)
6129 {
6130 if (T(1) != expression_list[i].value())
6131 {
6132 printf("run_test17() - Error in evaluation! (1) Expression: %s\n",
6133 expr_str_list[i].c_str());
6134
6135 error_found = true;
6136 }
6137 }
6138
6139 return !error_found;
6140}

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

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

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

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

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

10392{
10393 typedef exprtk::symbol_table<T> symbol_table_t;
10394 typedef exprtk::expression<T> expression_t;
10395 typedef exprtk::parser<T> parser_t;
10396 typedef exprtk::parser_error::type error_type;
10397
10398 bool error_found = false;
10399
10400 {
10401 T x = T(1.1);
10402 T y = T(2.2);
10403 T z = T(3.3);
10404
10405 symbol_table_t symbol_table;
10406 symbol_table.add_constants();
10407 symbol_table.add_variable("x",x);
10408 symbol_table.add_variable("y",y);
10409 symbol_table.add_variable("z",z);
10410
10411 static const std::string expression_list[] =
10412 {
10413 "return[]; x;",
10414 "return[x]; x;",
10415 "return[x,y]; x;",
10416 "return[x + y,y - x]; x;",
10417 "return[x + y,y - x,'abc']; x;",
10418 "if (x < y) return [1,'abc1']; else return [2,'abc2',x];" ,
10419 "if (x > y) return [1,'abc1']; else return [2,'abc2',x];" ,
10420 "if (x < y) { return [1,'abc1'];} else { return [2,'abc2',x];}",
10421 "if (x > y) { return [1,'abc1'];} else { return [2,'abc2',x];}",
10422 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1]; } ",
10423 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc']; } ",
10424 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc',x]; }",
10425 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc',x,y]; }",
10426 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc',x,y,z]; }",
10427 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [2,'abc2',x]; else x += 1; }",
10428 "for(var i := 0; i < 10; i += 1) { if (i == 5) { return [1,'abc1'];} else x += 1; }"
10429 };
10430
10431 static const std::string result_list[] =
10432 {
10433 "" ,
10434 "T" ,
10435 "TT" ,
10436 "TT" ,
10437 "TTS" ,
10438 "TS" ,
10439 "TST" ,
10440 "TS" ,
10441 "TST" ,
10442 "T" ,
10443 "TS" ,
10444 "TST" ,
10445 "TSTT" ,
10446 "TSTTT",
10447 "TST" ,
10448 "TS"
10449 };
10450
10451 static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
10452
10453 for (std::size_t i = 0; i < expression_list_size; ++i)
10454 {
10455 expression_t expression;
10456 expression.register_symbol_table(symbol_table);
10457
10458 parser_t parser;
10459
10460 if (!parser.compile(expression_list[i],expression))
10461 {
10462 printf("run_test21() - Error: %s Expression: %s [1]\n",
10463 parser.error().c_str(),
10464 expression_list[i].c_str());
10465
10466 error_found = true;
10467 continue;
10468 }
10469 else if (!parser.dec().return_present())
10470 {
10471 printf("run_test21() - Expected a return statement Expression: %s [1]\n",
10472 expression_list[i].c_str());
10473
10474 error_found = true;
10475 continue;
10476 }
10477
10478 expression.value();
10479
10480 std::string pattern = results_to_string<T>(expression.results());
10481
10482 if (!expression.return_invoked())
10483 {
10484 printf("run_test21() - Invalid return invoke state [1] Expression: %s\n",
10485 expression_list[i].c_str());
10486
10487 error_found = true;
10488 continue;
10489 }
10490 else if (result_list[i] != pattern)
10491 {
10492 printf("run_test21() - Invalid return results [1] Expected %s Got: %s Expression: %s\n",
10493 result_list[i].c_str(),
10494 pattern.c_str(),
10495 expression_list[i].c_str());
10496
10497 error_found = true;
10498 continue;
10499 }
10500 }
10501
10502 if (error_found)
10503 {
10504 return false;
10505 }
10506 }
10507
10508 {
10509 T x = T(1.1);
10510 T y = T(2.2);
10511 T z = T(3.3);
10512
10513 symbol_table_t symbol_table;
10514 symbol_table.add_constants();
10515 symbol_table.add_variable("x",x);
10516 symbol_table.add_variable("y",y);
10517 symbol_table.add_variable("z",z);
10518
10519 static const std::string expression_list[] =
10520 {
10521 "x := 1; x + 1; x + 2; x + 3; x + 5; x + 7; return [x + 1]; ",
10522 "x := 1; x + 1; x + 2; x + 3; x + 5; return [x + 1]; x := 7; ",
10523 "x := 1; x + 1; x + 2; x + 3; return [x + 1]; x + 5; x := 7; ",
10524 "x := 1; x + 1; x + 2; return [x + 1]; x + 3; x + 5; x := 7; ",
10525 "x := 1; x + 1; return [x + 1]; x + 2; x + 3; x + 5; x := 7; ",
10526 "x := 1; return [x + 1]; x + 1; x + 2; x + 3; x + 5; x := 7; ",
10527 "return [x + 1]; x := 1; x + 1; x + 2; x + 3; x + 5; x := 7; ",
10528 "~{x := 1; x + 1; x + 2; x + 3; x + 5; x + 7; return [x + 1]}",
10529 "~{x := 1; x + 1; x + 2; x + 3; x + 5; return [x + 1]; x := 7}",
10530 "~{x := 1; x + 1; x + 2; x + 3; return [x + 1]; x + 5; x := 7}",
10531 "~{x := 1; x + 1; x + 2; return [x + 1]; x + 3; x + 5; x := 7}",
10532 "~{x := 1; x + 1; return [x + 1]; x + 2; x + 3; x + 5; x := 7}",
10533 "~{x := 1; return [x + 1]; x + 1; x + 2; x + 3; x + 5; x := 7}",
10534 "~{return [x + 1]; x := 1; x + 1; x + 2; x + 3; x + 5; x := 7}"
10535 };
10536
10537 static const std::string result_list[] =
10538 {
10539 "T", "T", "T", "T", "T", "T", "T",
10540 "T", "T", "T", "T", "T", "T", "T",
10541 };
10542
10543 static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
10544
10545 for (std::size_t i = 0; i < expression_list_size; ++i)
10546 {
10547 expression_t expression;
10548 expression.register_symbol_table(symbol_table);
10549
10550 parser_t parser;
10551
10552 if (!parser.compile(expression_list[i],expression))
10553 {
10554 printf("run_test21() - Error: %s Expression: %s [2]\n",
10555 parser.error().c_str(),
10556 expression_list[i].c_str());
10557
10558 error_found = true;
10559 continue;
10560 }
10561 else if (!parser.dec().return_present())
10562 {
10563 printf("run_test21() - Expected a return statement Expression: %s [2]\n",
10564 expression_list[i].c_str());
10565
10566 error_found = true;
10567 continue;
10568 }
10569
10570 expression.value();
10571
10572 std::string pattern = results_to_string<T>(expression.results());
10573
10574 if (!expression.return_invoked())
10575 {
10576 printf("run_test21() - Invalid return invoke state [2] Expression: %s\n",
10577 expression_list[i].c_str());
10578
10579 error_found = true;
10580 continue;
10581 }
10582 else if (result_list[i] != pattern)
10583 {
10584 printf("run_test21() - Invalid return results [2] Expected %s Got: %s Expression: %s\n",
10585 result_list[i].c_str(),
10586 pattern.c_str(),
10587 expression_list[i].c_str());
10588
10589 error_found = true;
10590 continue;
10591 }
10592 else if (!result_equal(expression.results(), x + T(1)))
10593 {
10594 printf("run_test21() - Invalid return results [2] Expected %s Got: %s Expression: %s\n",
10595 result_list[i].c_str(),
10596 pattern.c_str(),
10597 expression_list[i].c_str());
10598
10599 error_found = true;
10600 continue;
10601 }
10602 }
10603
10604 if (error_found)
10605 {
10606 return false;
10607 }
10608 }
10609
10610 {
10611 T x = 1.0;
10612 T y = 2.0;
10613 T z = 3.0;
10614
10615 T v[] = {0 , 1, 2, 3 };
10616 std::string s = "Hello ";
10617
10618 myfunc<T> mf;
10619
10620 symbol_table_t symbol_table;
10621 expression_t expression;
10622 parser_t parser;
10623
10624 symbol_table.add_variable ("x", x);
10625 symbol_table.add_variable ("y", y);
10626 symbol_table.add_variable ("z", z);
10627 symbol_table.add_vector ("v", v);
10628 symbol_table.add_stringvar("s", s);
10629
10630 expression.register_symbol_table(symbol_table);
10631
10632 const std::string expression_str =
10633 " if (x > y) "
10634 " return [1]; "
10635 " else "
10636 " return [ x, x + y, 2 * v, s + 'world' ]; ";
10637
10638 if (!parser.compile(expression_str, expression))
10639 {
10640 printf("run_test21() - ERROR: %s\tExpression: %s\n",
10641 parser.error().c_str(),
10642 expression_str.c_str());
10643 return false;
10644 }
10645
10646 expression.value();
10647
10648 typedef exprtk::results_context<T> results_context_t;
10649 const results_context_t& results = expression.results();
10650
10651 if (results.count() != 4)
10652 {
10653 printf("run_test21() - ERROR Expected 4 return results, instead got: %d\n",
10654 static_cast<unsigned int>(results.count()));
10655 return false;
10656 }
10657
10658 T result_x0;
10659 T result_x1;
10660 std::string result_s;
10661 std::vector<T> result_v;
10662
10663 const T expected_result_v[] = {0 , 2, 4, 6 };
10664 const std::string expected_result_s = "Hello world";
10665
10666 if (!results.get_scalar(0,result_x0))
10667 {
10668 printf("run_test21() - ERROR Failed to get scalar index0 from return result!\n");
10669 return false;
10670 }
10671 else if (result_x0 != T(1))
10672 {
10673 printf("run_test21() - ERROR result_x0 is not expected value!\n");
10674 return false;
10675 }
10676 else if (!results.get_scalar(1,result_x1))
10677 {
10678 printf("run_test21() - ERROR Failed to get scalar index1 from return result!\n");
10679 return false;
10680 }
10681 else if (result_x1 != T(3))
10682 {
10683 printf("run_test21() - ERROR result_x1 is not expected value!\n");
10684 return false;
10685 }
10686 else if (!results.get_vector(2,result_v))
10687 {
10688 printf("run_test21() - ERROR Failed to get vector from return result!\n");
10689 return false;
10690 }
10691 else if (
10692 (result_v.size() != (sizeof(expected_result_v) / sizeof(T))) ||
10693 !std::equal(result_v.begin(),result_v.end(),expected_result_v)
10694 )
10695 {
10696 printf("run_test21() - ERROR result_v is not expected value!\n");
10697 return false;
10698 }
10699 else if (!results.get_string(3,result_s))
10700 {
10701 printf("run_test21() - ERROR Failed to get string from return result!\n");
10702 return false;
10703 }
10704 else if (result_s != expected_result_s)
10705 {
10706 printf("run_test21() - ERROR result_s is not expected value!\n");
10707 return false;
10708 }
10709 }
10710
10711 {
10712 const std::string invalid_expressions[] =
10713 {
10714 "x := 1",
10715 "x += 1",
10716 "v := 1 + v",
10717 "v += 1",
10718 "v += x + 1",
10719 "v += v",
10720 "v[0] += x",
10721 "v[1] += x",
10722 "v[2] += x",
10723 "v[3] += x",
10724 "v[4] += x",
10725 "var i := 2; v[i] := x",
10726 "var i := 2; v[i] += x",
10727 "s := 'abc' + s",
10728 "s[0:2] := 'abc'",
10729 "s[1:3] := 'abc'",
10730 "aa[4:4] := bb",
10731 "aa[1:3] := bb",
10732 "var i := 2; aa[i:3] := bb",
10733 "var i := 2; aa[i+1:3] := bb",
10734 "var i := 2; aa[0:i] := bb",
10735 "var i := 2; aa[0:i+1] := bb",
10736 "var i := 1; var j := 3; aa[i:j] := bb",
10737 "var i := 1; var j := 3; aa[i+1:j] := bb",
10738 "var i := 1; var j := 3; aa[i:j+1] := bb",
10739 "var i := 1; var j := 3; aa[i+1:j+1] := bb",
10740 };
10741
10742 const std::size_t invalid_expressions_size = sizeof(invalid_expressions) / sizeof(std::string);
10743
10744 for (std::size_t i = 0; i < invalid_expressions_size; ++i)
10745 {
10746 symbol_table_t mutable_symbol_table;
10747 symbol_table_t immutable_symbol_table(symbol_table_t::e_immutable);
10748
10749 T x = 0.0;
10750 T v[5];
10751 std::string s = "xyz";
10752 std::string aa = "0123456789";
10753 std::string bb = "A";
10754
10755 T x_ = 0.0;
10756 T v_[5];
10757 std::string s_ = "xyz";
10758
10759 std::string a_ = "0123456789";
10760 std::string b_ = "A";
10761
10762 immutable_symbol_table.add_variable ("x" , x );
10763 immutable_symbol_table.add_vector ("v" , v );
10764 immutable_symbol_table.add_stringvar("s" , s );
10765 immutable_symbol_table.add_stringvar("aa", aa);
10766 immutable_symbol_table.add_stringvar("bb", bb);
10767
10768 mutable_symbol_table.add_variable ("x_", x_);
10769 mutable_symbol_table.add_vector ("v_", v_);
10770 mutable_symbol_table.add_stringvar ("s_", s_);
10771 mutable_symbol_table.add_stringvar ("a_", a_);
10772 mutable_symbol_table.add_stringvar ("b_", b_);
10773
10774 const std::string& expression_str = invalid_expressions[i];
10775 expression_t expression;
10776 expression.register_symbol_table(immutable_symbol_table);
10777 expression.register_symbol_table(mutable_symbol_table );
10778
10779 parser_t parser;
10780 const bool compile_result = parser.compile(expression_str, expression);
10781
10782 if (compile_result)
10783 {
10784 expression.value();
10785 printf("run_test21() - Invalid expression due to immutability was successfully compiled. Expression: %s\n",
10786 expression_str.c_str());
10787 }
10788 }
10789 }
10790
10791 {
10792 T x = 1.1;
10793 T y = 2.2;
10794 T z = 3.3;
10795 T w = 4.4;
10796
10797 symbol_table_t mutable_symbol_table;
10798 symbol_table_t immutable_symbol_table(symbol_table_t::e_immutable);
10799
10800 mutable_symbol_table.add_variable("x", x);
10801 mutable_symbol_table.add_variable("y", y);
10802
10803 immutable_symbol_table.add_variable("w", w);
10804 immutable_symbol_table.add_variable("z", z);
10805
10806 expression_t expression;
10807 expression.register_symbol_table(mutable_symbol_table );
10808 expression.register_symbol_table(immutable_symbol_table);
10809
10810 parser_t parser;
10811
10812 typedef std::pair<std::string,bool> local_test_t;
10813
10814 const local_test_t expressions[] =
10815 {
10816 std::make_pair<std::string,bool>("x := y + (z / w)" , true ),
10817 std::make_pair<std::string,bool>("y := y / x + (z / w)" , true ),
10818 std::make_pair<std::string,bool>("z := y + x - w" , false),
10819 std::make_pair<std::string,bool>("z == (w += y / x)" , false)
10820 };
10821
10822 const std::size_t expressions_size = sizeof(expressions) / sizeof(local_test_t);
10823
10824 for (std::size_t i = 0; i < expressions_size; ++i)
10825 {
10826 const std::string expression_str = expressions[i].first;
10827 const bool expected_compile_result = expressions[i].second;
10828
10829 if (expected_compile_result != parser.compile(expression_str, expression))
10830 {
10831 printf("run_test21() - Invalid compilation of expression. Expected compile result: %c Expression: %s\n",
10832 expected_compile_result ? 'T' : 'F',
10833 expression_str.c_str());
10834
10835 error_found = true;
10836 }
10837
10838 x += 1.1;
10839 y += 2.2;
10840 z += 3.3;
10841 w += 4.4;
10842
10843 expression.value();
10844 }
10845
10846 if (error_found)
10847 {
10848 return false;
10849 }
10850 }
10851
10852 {
10853 typedef typename parser_t::settings_store settings_t;
10854
10855 const std::string invalid_expressions[] =
10856 {
10857 "var result := 0; if (true) { result := 2 } if (true) { result := 3 }; result",
10858 "var result := 0; if (true) { result := 2 }; if (true) { result := 3 } result",
10859 "var result := 0; if (true) { result := 2 } if (true) { result := 3 } result",
10860 "var result := 0; var x:=1; if (x > 0) { result := 2 } else if (x > 0) { result := 3 } result",
10861 "var result := 0; var x := 1; if (x > 0) { result := 2 } if (x > 0) { result := 3 }; result",
10862 "var result := 0; var x := 1; if (x > 0) { result := 2 }; if (x > 0) { result := 3 } result",
10863 "var result := 0; var x := 1; if (x > 0) { result := 2 } if (x > 0) { result := 3 } result",
10864 "var result := 0; var x := 1; if (x > 0) { result := 2 } else if (x > 0) { result := 3 } result",
10865 "var result := 0; var x := 1; if (x > 0) result := 2 else if (x > 0) { result := 3 } result",
10866 "var result := 0; var x := 1; if (x > 0) {result := 2 } else if (x > 0) result := 3 result",
10867 "var x := 2; var y := 0; x y ",
10868 "var x := 2; x var y := 0; ",
10869 "var x := 2; var y := 0; while (y < 3) { x := x * x; y += 1; } x ",
10870 "var x := 2; var y := 0; for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; } x ",
10871 "var x := 2; var y := 0; while (y < 3) { x := x * x; y += 1; } 1 ",
10872 "var x := 2; var y := 0; for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; } 1 ",
10873 "var x := 2; var y := 0; x while (y < 3) { x := x * x; y += 1; } ",
10874 "var x := 2; var y := 0; x for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; } ",
10875 "var x := 2; var y := 0; for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; } (1 + x)",
10876 "var x := 2; var y := 0; for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; } (x + 1)",
10877 "var x := 2; var y := 0; (1 + x) for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; }",
10878 "var x := 2; var y := 0; (x + 1) for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; }",
10879 "var x := 2; var y := 0; (x + y) for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; }",
10880 "'hello' 1",
10881 "1 'hello'",
10882 "'hel' + 'lo' 1",
10883 "1 'hel' + 'lo'",
10884 "1 2",
10885 "a b",
10886 "a b c",
10887 "var x := 2; 1 2 ",
10888 "var x := 2; 1 x ",
10889 "var x := 2; x 1 ",
10890 "var x := 2; a 1 ",
10891 "var x := 2; x a ",
10892 "var x := 2; x a b ",
10893 "var x := 2; x a b c ",
10894 "var x := 2; a x ",
10895 "var x := 2; a x b ",
10896 "var x := 2; a x b c ",
10897 "var x := 2; 'hello' 1",
10898 "var x := 2; 1 'hello'",
10899 "var x := 2; 'hello' x",
10900 "var x := 2; x 'hello'",
10901 "var x := 2; (x 1) ",
10902 "var x := 2; (1 x) ",
10903 "var x := 2; 2 + (x 1) ",
10904 "var x := 2; 2 + (1 x) ",
10905 "var x := 2; x + (x 1) ",
10906 "var x := 2; x + (1 x) ",
10907 "var x := 2; (x 1) + 2 ",
10908 "var x := 2; (1 x) + 2 ",
10909 "var x := 2; (x 1) + x ",
10910 "var x := 2; (1 x) + x ",
10911 "var x := 2; var y := 3; (x y) ",
10912 "var x := 2; var y := 3; (y x) ",
10913 "var x := 2; var y := 3; 2 + (x y) ",
10914 "var x := 2; var y := 3; 2 + (y x) ",
10915 "var x := 2; var y := 3; x + (x y) ",
10916 "var x := 2; var y := 3; x + (y x) ",
10917 "var x := 2; var y := 3; (x y) + 2 ",
10918 "var x := 2; var y := 3; (y x) + 2 ",
10919 "var x := 2; var y := 3; (x y) + x ",
10920 "var x := 2; var y := 3; (y x) + x ",
10921 "var x := 2; 2 + x 1 ",
10922 "var x := 2; 2 + 1 x ",
10923 "var x := 2; x + x 1 ",
10924 "var x := 2; x + 1 x ",
10925 "var x := 2; var y := 3; 2 + x y ",
10926 "var x := 2; var y := 3; 2 + y x ",
10927 "var x := 2; var y := 3; x + x y ",
10928 "var x := 2; var y := 3; x + y x ",
10929 "~{1; 2; 3} 1 ",
10930 "1 ~{1; 2; 3} ",
10931 "var x := 2; x ~{x; 1; 2} ",
10932 "var x := 2; 1 ~{x; 1; 2} ",
10933 "var x := 2; ~{x; 1; 2} x ",
10934 "var x := 2; ~{x; 1; 2} 1 ",
10935 "~(1; 2; 3) 1 ",
10936 "1 ~(1; 2; 3) ",
10937 "var x := 2; x ~(x; 1; 2) ",
10938 "var x := 2; 1 ~(x; 1; 2) ",
10939 "var x := 2; ~(x; 1; 2) x ",
10940 "var x := 2; ~(x; 1; 2) 1 ",
10941 "var x := 2; (x + 1) ~{x; 1; 2} ",
10942 "var x := 2; (1 + x) ~{x; 1; 2} ",
10943 "var x := 2; ~{x; 1; 2} (x + 1) ",
10944 "var x := 2; ~{x; 1; 2} (1 + x) ",
10945 "var x := 2; x + 1 ~{x; 1; 2} ",
10946 "var x := 2; 1 + x ~{x; 1; 2} ",
10947 "var x := 2; ~{x; 1; 2} x + 1 ",
10948 "var x := 2; ~{x; 1; 2} 1 + x ",
10949 "~(1, 2, 3) 1 ",
10950 "1 ~(1, 2, 3) ",
10951 "var x := 2; x ~(x, 1, 2) ",
10952 "var x := 2; 1 ~(x, 1, 2) ",
10953 "var x := 2; ~(x, 1, 2) x ",
10954 "var x := 2; ~(x, 1, 2) 1 ",
10955 "var x := 2; 1 switch { case x > 1 : 1; case x < 3 : 2; default : 3; } ",
10956 "var x := 2; x switch { case x > 1 : 1; case x < 3 : 2; default : 3; } ",
10957 "var x := 2; switch { case x > 1 : 1; case x < 3 : 2; default : 3; } x ",
10958 "var x := 2; 1 [*] { case x > 1 : 1; case x < 3 : 2; } ",
10959 "var x := 2; x [*] { case x > 1 : 1; case x < 3 : 2; } ",
10960 "var x := 2; [*] { case x > 1 : 1; case x < 3 : 2; } x ",
10961 "var x := 2; (x + 1) switch { case x > 1 : 1; case x < 3 : 2; default : 3; } ",
10962 "var x := 2; switch { case x > 1 : 1; case x < 3 : 2; default : 3; } (x + 1) ",
10963 "var x := 2; (x + 1) [*] { case x > 1 : 1; case x < 3 : 2; } ",
10964 "var x := 2; [*] { case x > 1 : 1; case x < 3 : 2; } (x + 1) ",
10965 "var x := 2; for (var i := 0; i < 2; i += 1) { return [i] 1; } ",
10966 "var x := 2; for (var i := 0; i < 2; i += 1) { 1 return [i]; } ",
10967 "var x := 2; for (var i := 0; i < 2; i += 1) { return [i] i; } ",
10968 "var x := 2; for (var i := 0; i < 2; i += 1) { i return [i]; } ",
10969 "var x := 2; for (var i := 0; i < 2; i += 1) { return [i] 1 + i; } ",
10970 "var x := 2; for (var i := 0; i < 2; i += 1) { 1 + i return [i]; } ",
10971 "var x := 2; for (var i := 0; i < 2; i += 1) { return [i] i + 1; } ",
10972 "var x := 2; for (var i := 0; i < 2; i += 1) { i + 1 return [i]; } ",
10973 "var x := 2; for (var i := 0; i < 2; i += 1) { 1 if (i > 3) return [i]; } ",
10974 "var x := 2; for (var i := 0; i < 2; i += 1) { if (i > 3) return [i] 1; } ",
10975 "var x := 2; for (var i := 0; i < 2; i += 1) { x if (i > 3) return [i]; } ",
10976 "var x := 2; for (var i := 0; i < 2; i += 1) { if (i > 3) return [i] x; } ",
10977 "var x := 2; for (var i := 0; i < 2; i += 1) { x + 1 if (i > 3) return [i]; }",
10978 "var x := 2; for (var i := 0; i < 2; i += 1) { if (i > 3) return [i] x + 1; }",
10979 "var x := 2; for (var i := 0; i < 2; i += 1) { 1 + x if (i > 3) return [i]; }",
10980 "var x := 2; for (var i := 0; i < 2; i += 1) { if (i > 3) return [i] 1 + x; }",
10981 "var x := 2; for (var i := 0; i < 2; i += 1) { 1 for (var j := 0; j < 2; j += 1){} } ",
10982 "var x := 2; for (var i := 0; i < 2; i += 1) { for (var j := 0; j < 2; j += 1){} 1 } ",
10983 "var x := 2; for (var i := 0; i < 2; i += 1) { x for (var j := 0; j < 2; j += 1){} } ",
10984 "var x := 2; for (var i := 0; i < 2; i += 1) { for (var j := 0; j < 2; j += 1){} x } ",
10985 "var x := 2; for (var i := 0; i < 2; i += 1) { x + 1 for (var j := 0; j < 2; j += 1){} } ",
10986 "var x := 2; for (var i := 0; i < 2; i += 1) { for (var j := 0; j < 2; j += 1){} x + 1 } ",
10987 "var x := 2; for (var i := 0; i < 2; i += 1) { 1 + x for (var j := 0; j < 2; j += 1){} } ",
10988 "var x := 2; for (var i := 0; i < 2; i += 1) { for (var j := 0; j < 2; j += 1){} 1 + x } "
10989 };
10990
10991 const std::size_t expressions_size = sizeof(invalid_expressions) / sizeof(std::string);
10992
10993 static const std::size_t compile_options =
10994 settings_t::e_replacer +
10995 settings_t::e_joiner +
10996 settings_t::e_numeric_check +
10997 settings_t::e_bracket_check +
10998 settings_t::e_sequence_check +
10999 settings_t::e_strength_reduction;
11000
11001 const settings_t settings(compile_options);
11002 parser_t parser(settings);
11003
11004 T a = T(2222);
11005 T b = T(3333);
11006 T c = T(4444);
11007
11008 symbol_table_t symbol_table;
11009 symbol_table.add_variable("a", a);
11010 symbol_table.add_variable("b", b);
11011 symbol_table.add_variable("c", c);
11012
11013 for (std::size_t e = 0; e < expressions_size; ++e)
11014 {
11015 const std::string& expression_string = invalid_expressions[e];
11016
11017 expression_t expression;
11018 expression.register_symbol_table(symbol_table);
11019
11020 if (parser.compile(expression_string,expression))
11021 {
11022 printf("run_test21() - Expected compilation error for expression: %s\n",
11023 expression_string.c_str());
11024 error_found = true;
11025 continue;
11026 }
11027
11028 expression.value();
11029 }
11030
11031 if (error_found)
11032 {
11033 return false;
11034 }
11035 }
11036
11037 {
11038 const std::string expressions[] =
11039 {
11040 // conditional_vector_node
11041 "var x := 2; sum(if (x > 1) { vv8 } else { vv7 }) == sum(vv8)",
11042 "var x := 2; sum(if (x > 1) { vv8 + 1 } else { vv8 + 2 }) == sum(vv8 + 1)",
11043
11044 // unary_vector_node
11045 "var v[8] := {1,1,1,1,1,1,1,1}; vv8 += 1; sgn(vv8) == v",
11046 "abs(-1 * vv8) == vv8",
11047 "abs(vv8 * -1) == vv8",
11048 "var x := -1; abs(x * vv8) == vv8",
11049 "var x := -1; abs(vv8 * x) == vv8",
11050 "var x := 1; abs(-x * vv8) == vv8",
11051 "var x := 1; abs(vv8 * -x) == vv8",
11052 "var x := -2; abs(x * vv8) == 2vv8",
11053 "var x := -2; abs(vv8 * x) == 2vv8",
11054 "var x := 2; abs(-x * vv8) == 2vv8",
11055 "var x := 2; abs(vv8 * -x) == 2vv8",
11056 "var x := -2; abs(x * vv8) == -x * vv8",
11057 "var x := -2; abs(vv8 * x) == -x * vv8",
11058 "var x := 2; abs(-x * vv8) == x * vv8",
11059 "var x := 2; abs(vv8 * -x) == x * vv8",
11060 "var x := -2; abs(x * vv8) == vv8 * -x",
11061 "var x := -2; abs(vv8 * x) == vv8 * -x",
11062 "var x := 2; abs(-x * vv8) == vv8 * x",
11063 "var x := 2; abs(vv8 * -x) == vv8 * x",
11064 "var x := -2; abs(x * vv8) == abs(x) * vv8",
11065 "var x := -2; abs(vv8 * x) == abs(x) * vv8",
11066 "var x := -2; abs(x * vv8) == vv8 * abs(x)",
11067 "var x := -2; abs(vv8 * x) == vv8 * abs(x)",
11068
11069 // vec_binop_vecval_node and vec_binop_valvec_node
11070 "var v[8] := {1,2,3,4,5,6,7,8}; var x := 1; (vv8 + x) == v",
11071 "var v[7] := {1,2,3,4,5,6,7}; var x := 1; (vv8 + x) == v",
11072 "var v[6] := {1,2,3,4,5,6}; var x := 1; (vv8 + x) == v",
11073 "var v[5] := {1,2,3,4,5}; var x := 1; (vv8 + x) == v",
11074 "var v[4] := {1,2,3,4}; var x := 1; (vv8 + x) == v",
11075 "var v[3] := {1,2,3}; var x := 1; (vv8 + x) == v",
11076 "var v[2] := {1,2}; var x := 1; (vv8 + x) == v",
11077 "var v[1] := {1}; var x := 1; (vv8 + x) == v",
11078 "var v[8] := {1,2,3,4,5,6,7,8}; var x := 1; (x + vv8) == v",
11079 "var v[7] := {1,2,3,4,5,6,7}; var x := 1; (x + vv8) == v",
11080 "var v[6] := {1,2,3,4,5,6}; var x := 1; (x + vv8) == v",
11081 "var v[5] := {1,2,3,4,5}; var x := 1; (x + vv8) == v",
11082 "var v[4] := {1,2,3,4}; var x := 1; (x + vv8) == v",
11083 "var v[3] := {1,2,3}; var x := 1; (x + vv8) == v",
11084 "var v[2] := {1,2}; var x := 1; (x + vv8) == v",
11085 "var v[1] := {1}; var x := 1; (x + vv8) == v",
11086
11087 // vec_binop_vecvec_node
11088 "var v[8] := [-1]; v < vv8",
11089 "var v[7] := [-1]; v < vv8",
11090 "var v[3] := [-1]; v < vv8",
11091 "var v[2] := [-1]; v < vv8",
11092 "var v[1] := [-1]; v < vv8",
11093
11094 // assignment_vecvec_op_node
11095 "var vv8sum := sum(vv8); vv8 += (vv8 + 1); sum(vv8) == (2 * sum(vv8sum) + vv8[] * 1)",
11096 "var vv8sum := sum(vv8); vv8 += (vv8 - 1); sum(vv8) == (2 * sum(vv8sum) - vv8[] * 1)",
11097 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + x); sum(vv8) == (2 * sum(vv8sum) + vv8[] * 1)",
11098 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 - x); sum(vv8) == (2 * sum(vv8sum) - vv8[] * 1)",
11099 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + (vv8 + x)); sum(vv8) == (3 * sum(vv8sum) + vv8[] * 1)",
11100 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + (vv8 - x)); sum(vv8) == (3 * sum(vv8sum) - vv8[] * 1)",
11101 "var vv8sum := sum(vv8); vv8 += (vv8 += 1); sum(vv8) == (2 * vv8sum + 2 * (vv8[] * 1))",
11102 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 += x); sum(vv8) == (2 * vv8sum + 2 * (vv8[] * x))",
11103 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 -= x); sum(vv8) == (2 * vv8sum - 2 * (vv8[] * x))",
11104 "var vv8sum := sum(vv8); vv8 += (vv8 + 1); sum(vv8) == (2 * sum(vv8sum) + vv8[] * 1);",
11105 "var vv8sum := sum(vv8); vv8 += (vv8 - 1); sum(vv8) == (2 * sum(vv8sum) - vv8[] * 1);",
11106 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + x); sum(vv8) == (2 * sum(vv8sum) + vv8[] * 1);",
11107 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 - x); sum(vv8) == (2 * sum(vv8sum) - vv8[] * 1);",
11108 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + (vv8 + x)); sum(vv8) == (3 * sum(vv8sum) + vv8[] * 1);",
11109 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + (vv8 - x)); sum(vv8) == (3 * sum(vv8sum) - vv8[] * 1);",
11110 "var vv8sum := sum(vv8); vv8 += (vv8 += 1); sum(vv8) == (2 * vv8sum + 2 * (vv8[] * 1));",
11111 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 += x); sum(vv8) == (2 * vv8sum + 2 * (vv8[] * x));",
11112 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 -= x); sum(vv8) == (2 * vv8sum - 2 * (vv8[] * x));",
11113 "var vv3sum := sum(vv3); vv3 += (vv3 + 1); sum(vv3) == (2 * sum(vv3sum) + vv3[] * 1)",
11114 "var vv3sum := sum(vv3); vv3 += (vv3 - 1); sum(vv3) == (2 * sum(vv3sum) - vv3[] * 1)",
11115 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + x); sum(vv3) == (2 * sum(vv3sum) + vv3[] * 1)",
11116 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 - x); sum(vv3) == (2 * sum(vv3sum) - vv3[] * 1)",
11117 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + (vv3 + x)); sum(vv3) == (3 * sum(vv3sum) + vv3[] * 1)",
11118 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + (vv3 - x)); sum(vv3) == (3 * sum(vv3sum) - vv3[] * 1)",
11119 "var vv3sum := sum(vv3); vv3 += (vv3 += 1); sum(vv3) == (2 * vv3sum + 2 * (vv3[] * 1))",
11120 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 += x); sum(vv3) == (2 * vv3sum + 2 * (vv3[] * x))",
11121 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 -= x); sum(vv3) == (2 * vv3sum - 2 * (vv3[] * x))",
11122 "var vv3sum := sum(vv3); vv3 += (vv3 + 1); sum(vv3) == (2 * sum(vv3sum) + vv3[] * 1);",
11123 "var vv3sum := sum(vv3); vv3 += (vv3 - 1); sum(vv3) == (2 * sum(vv3sum) - vv3[] * 1);",
11124 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + x); sum(vv3) == (2 * sum(vv3sum) + vv3[] * 1);",
11125 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 - x); sum(vv3) == (2 * sum(vv3sum) - vv3[] * 1);",
11126 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + (vv3 + x)); sum(vv3) == (3 * sum(vv3sum) + vv3[] * 1);",
11127 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + (vv3 - x)); sum(vv3) == (3 * sum(vv3sum) - vv3[] * 1);",
11128 "var vv3sum := sum(vv3); vv3 += (vv3 += 1); sum(vv3) == (2 * vv3sum + 2 * (vv3[] * 1));",
11129 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 += x); sum(vv3) == (2 * vv3sum + 2 * (vv3[] * x));",
11130 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 -= x); sum(vv3) == (2 * vv3sum - 2 * (vv3[] * x));",
11131
11132 // assignment_vec_op_node
11133 "var vv8sum := sum(vv8); vv8 += 1; sum(vv8) == (vv8sum + vv8[] * 1)",
11134 "var vv7sum := sum(vv7); vv7 += 1; sum(vv7) == (vv7sum + vv7[] * 1)",
11135 "var vv6sum := sum(vv6); vv6 += 1; sum(vv6) == (vv6sum + vv6[] * 1)",
11136 "var vv5sum := sum(vv5); vv5 += 1; sum(vv5) == (vv5sum + vv5[] * 1)",
11137 "var vv4sum := sum(vv4); vv4 += 1; sum(vv4) == (vv4sum + vv4[] * 1)",
11138 "var vv3sum := sum(vv3); vv3 += 1; sum(vv3) == (vv3sum + vv3[] * 1)",
11139 "var vv2sum := sum(vv2); vv2 += 1; sum(vv2) == (vv2sum + vv2[] * 1)",
11140 "var vv1sum := sum(vv1); vv1 += 1; sum(vv1) == (vv1sum + vv1[] * 1)",
11141 "var vv8sum := sum(vv8); var x := 7; vv8 += (x - 1) / 2; sum(vv8) == (vv8sum + vv8[] * 3)",
11142 "var vv7sum := sum(vv7); var x := 7; vv7 += (x - 1) / 2; sum(vv7) == (vv7sum + vv7[] * 3)",
11143 "var vv6sum := sum(vv6); var x := 7; vv6 += (x - 1) / 2; sum(vv6) == (vv6sum + vv6[] * 3)",
11144 "var vv5sum := sum(vv5); var x := 7; vv5 += (x - 1) / 2; sum(vv5) == (vv5sum + vv5[] * 3)",
11145 "var vv4sum := sum(vv4); var x := 7; vv4 += (x - 1) / 2; sum(vv4) == (vv4sum + vv4[] * 3)",
11146 "var vv3sum := sum(vv3); var x := 7; vv3 += (x - 1) / 2; sum(vv3) == (vv3sum + vv3[] * 3)",
11147 "var vv2sum := sum(vv2); var x := 7; vv2 += (x - 1) / 2; sum(vv2) == (vv2sum + vv2[] * 3)",
11148 "var vv1sum := sum(vv1); var x := 7; vv1 += (x - 1) / 2; sum(vv1) == (vv1sum + vv1[] * 3)",
11149
11150 // assignment_vecvec_node
11151 "var v[8] := [-1]; vv8 := v; sum(vv8) == (-1 * 8 + 0)",
11152 "var v[7] := [-1]; vv8 := v; sum(vv8) == (-1 * 7 + (7))",
11153 "var v[6] := [-1]; vv8 := v; sum(vv8) == (-1 * 6 + (6+7))",
11154 "var v[5] := [-1]; vv8 := v; sum(vv8) == (-1 * 5 + (5+6+7))",
11155 "var v[4] := [-1]; vv8 := v; sum(vv8) == (-1 * 4 + (4+5+6+7))",
11156 "var v[3] := [-1]; vv8 := v; sum(vv8) == (-1 * 3 + (3+4+5+6+7))",
11157 "var v[2] := [-1]; vv8 := v; sum(vv8) == (-1 * 2 + (2+3+4+5+6+7))",
11158 "var v[1] := [-1]; vv8 := v; sum(vv8) == (-1 * 1 + (1+2+3+4+5+6+7))",
11159 "var v[8] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, -1, -1, -1, -1 }; x == vv8",
11160 "var v[7] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, -1, -1, -1, 7 }; x == vv8",
11161 "var v[6] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, -1, -1, 6, 7 }; x == vv8",
11162 "var v[5] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, -1, 5, 6, 7 }; x == vv8",
11163 "var v[4] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, 4, 5, 6, 7 }; x == vv8",
11164 "var v[3] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, 3, 4, 5, 6, 7 }; x == vv8",
11165 "var v[2] := [-1]; vv8 := v; var x[8] := { -1, -1, 2, 3, 4, 5, 6, 7 }; x == vv8",
11166 "var v[1] := [-1]; vv8 := v; var x[8] := { -1, 1, 2, 3, 4, 5, 6, 7 }; x == vv8",
11167 "var v[3] := [-1]; vv3 := v; sum(vv3) == (-1 * 3 + (0))",
11168 "var v[2] := [-1]; vv3 := v; sum(vv3) == (-1 * 2 + (2))",
11169 "var v[1] := [-1]; vv3 := v; sum(vv3) == (-1 * 1 + (1+2))",
11170 "var v[3] := [-1]; vv3 := v; var x[3] := { -1, -1, -1}; x == vv3",
11171 "var v[2] := [-1]; vv3 := v; var x[3] := { -1, -1, 2}; x == vv3",
11172 "var v[1] := [-1]; vv3 := v; var x[3] := { -1, 1, 2}; x == vv3",
11173 "vv8 := vv7; sum(vv8) == (sum(vv7) + 7)",
11174 "vv8 := vv6; sum(vv8) == (sum(vv6) + 6+ 7)",
11175 "vv8 := vv5; sum(vv8) == (sum(vv5) + 5 + 6 + 7)",
11176 "vv8 := vv4; sum(vv8) == (sum(vv4) + 4 + 5 + 6 + 7)",
11177 "vv8 := vv3; sum(vv8) == (sum(vv3) + 3 + 4 + 5 + 6 + 7)",
11178 "vv8 := vv2; sum(vv8) == (sum(vv2) + 2 + 3 + 4 + 5 + 6 + 7)",
11179 "vv8 := vv1; sum(vv8) == (sum(vv1) + 1 + 2 + 3 + 4 + 5 + 6 + 7)",
11180 "vv8 := vv7 + vv7; sum(vv8) == (2 * sum(vv7) + 7)",
11181 "vv8 := vv6 + vv6; sum(vv8) == (2 * sum(vv6) + 6+ 7)",
11182 "vv8 := vv5 + vv5; sum(vv8) == (2 * sum(vv5) + 5 + 6 + 7)",
11183 "vv8 := vv4 + vv4; sum(vv8) == (2 * sum(vv4) + 4 + 5 + 6 + 7)",
11184 "vv8 := vv3 + vv3; sum(vv8) == (2 * sum(vv3) + 3 + 4 + 5 + 6 + 7)",
11185 "vv8 := vv2 + vv2; sum(vv8) == (2 * sum(vv2) + 2 + 3 + 4 + 5 + 6 + 7)",
11186 "vv8 := vv1 + vv1; sum(vv8) == (2 * sum(vv1) + 1 + 2 + 3 + 4 + 5 + 6 + 7)",
11187
11188 // assignment_vec_node
11189 "var x := 3; vv8 := 2*x+1; sum(vv8) == (vv8[] * 7)",
11190 "var x := 3; vv7 := 2*x+1; sum(vv7) == (vv7[] * 7)",
11191 "var x := 3; vv6 := 2*x+1; sum(vv6) == (vv6[] * 7)",
11192 "var x := 3; vv5 := 2*x+1; sum(vv5) == (vv5[] * 7)",
11193 "var x := 3; vv4 := 2*x+1; sum(vv4) == (vv4[] * 7)",
11194 "var x := 3; vv3 := 2*x+1; sum(vv3) == (vv3[] * 7)",
11195 "var x := 3; vv2 := 2*x+1; sum(vv2) == (vv2[] * 7)",
11196 "var x := 3; vv1 := 2*x+1; sum(vv1) == (vv1[] * 7)",
11197 "var x[3] := [3]; vv8 := 2x[0]+1; sum(vv8) == (vv8[] * 7)",
11198 "var x[3] := [3]; vv7 := 2x[1]+1; sum(vv7) == (vv7[] * 7)",
11199 "var x[3] := [3]; vv6 := 2x[2]+1; sum(vv6) == (vv6[] * 7)",
11200 "var x[3] := [3]; vv5 := 2x[0]+1; sum(vv5) == (vv5[] * 7)",
11201 "var x[3] := [3]; vv4 := 2x[1]+1; sum(vv4) == (vv4[] * 7)",
11202 "var x[3] := [3]; vv3 := 2x[2]+1; sum(vv3) == (vv3[] * 7)",
11203 "var x[3] := [3]; vv2 := 2x[0]+1; sum(vv2) == (vv2[] * 7)",
11204 "var x[3] := [3]; vv1 := 2x[1]+1; sum(vv1) == (vv1[] * 7)",
11205 "var x[3] := [3]; var y[3] := [1]; vv8 := 2x[0]+y[0]; sum(vv8) == (vv8[] * 7)",
11206 "var x[3] := [3]; var y[3] := [1]; vv7 := 2x[1]+y[1]; sum(vv7) == (vv7[] * 7)",
11207 "var x[3] := [3]; var y[3] := [1]; vv6 := 2x[2]+y[2]; sum(vv6) == (vv6[] * 7)",
11208 "var x[3] := [3]; var y[3] := [1]; vv5 := 2x[0]+y[0]; sum(vv5) == (vv5[] * 7)",
11209 "var x[3] := [3]; var y[3] := [1]; vv4 := 2x[1]+y[1]; sum(vv4) == (vv4[] * 7)",
11210 "var x[3] := [3]; var y[3] := [1]; vv3 := 2x[2]+y[2]; sum(vv3) == (vv3[] * 7)",
11211 "var x[3] := [3]; var y[3] := [1]; vv2 := 2x[0]+y[0]; sum(vv2) == (vv2[] * 7)",
11212 "var x[3] := [3]; var y[3] := [1]; vv1 := 2x[1]+y[1]; sum(vv1) == (vv1[] * 7)",
11213
11214 // swap vec vec node
11215 "var v[8] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 8 + 0)",
11216 "var v[7] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 7 + (7))",
11217 "var v[6] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 6 + (6+7))",
11218 "var v[5] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 5 + (5+6+7))",
11219 "var v[4] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 4 + (4+5+6+7))",
11220 "var v[3] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 3 + (3+4+5+6+7))",
11221 "var v[2] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 2 + (2+3+4+5+6+7))",
11222 "var v[1] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 1 + (1+2+3+4+5+6+7))",
11223 "var v[8] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, -1, -1, -1, -1 }; x == vv8",
11224 "var v[7] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, -1, -1, -1, 7 }; x == vv8",
11225 "var v[6] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, -1, -1, 6, 7 }; x == vv8",
11226 "var v[5] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, -1, 5, 6, 7 }; x == vv8",
11227 "var v[4] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, 4, 5, 6, 7 }; x == vv8",
11228 "var v[3] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, 3, 4, 5, 6, 7 }; x == vv8",
11229 "var v[2] := [-1]; vv8 <=> v; var x[8] := { -1, -1, 2, 3, 4, 5, 6, 7 }; x == vv8",
11230 "var v[1] := [-1]; vv8 <=> v; var x[8] := { -1, 1, 2, 3, 4, 5, 6, 7 }; x == vv8",
11231 "var v[3] := [-1]; vv3 <=> v; sum(vv3) == (-1 * 3 + (0))",
11232 "var v[2] := [-1]; vv3 <=> v; sum(vv3) == (-1 * 2 + (2))",
11233 "var v[1] := [-1]; vv3 <=> v; sum(vv3) == (-1 * 1 + (1+2))",
11234 "var v[3] := [-1]; vv3 <=> v; var x[3] := { -1, -1, -1}; x == vv3",
11235 "var v[2] := [-1]; vv3 <=> v; var x[3] := { -1, -1, 2}; x == vv3",
11236 "var v[1] := [-1]; vv3 <=> v; var x[3] := { -1, 1, 2}; x == vv3",
11237
11238 // rebasevector_elem_node
11239 "vv8[0] == 0",
11240 "vv8[2 - 2] == 0",
11241 "vv8[vv8[] - 1] == vv8[] - 1",
11242 "var vec_sum := 0; for (var i := 0; i < vv8[]; i +=1) { vec_sum += vv8[i]; }; vec_sum == (vv8[] - 1) * vv8[] / 2",
11243 "var vec_sum := 0; for (var i := 0; i < vv8[]; i +=1) { vec_sum += vv8[2i / 2]; }; vec_sum == (vv8[] - 1) * vv8[] / 2",
11244 "var x:= 1; var y:= 1; (vv8 + x)[y / x] == 2",
11245 "var x:= 1; var y:= 1; (vv8 + x - y)[y / x] == 1",
11246 "var x:= 1; (x + vv8)[1] == 2",
11247 "var x:= 1; var y:= 1; (x + vv8)[y / x] == 2",
11248 "var x:= 1; var y:= 1; (x + vv8 - y)[y / x] == 1",
11249 "var successes := 0; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + 1)[i] == i + 1; }; successes == vv8[]",
11250 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + x)[i] == i + x; }; successes == vv8[]",
11251 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (x + vv8)[i] == i + x; }; successes == vv8[]",
11252 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + x)[i / x] == i + x; }; successes == vv8[]",
11253 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (x + vv8)[i / x] == i + x; }; successes == vv8[]",
11254 "(1 + vv8)[1] == 2",
11255 "(vv8 + 1)[1] == 2",
11256 "(vv8 + 1)[2 / 2] == 2",
11257 "(1 + vv8)[2 / 2] == 2",
11258 "var x:= 1; (x + vv8)[1] == 2",
11259 "var x:= 1; (vv8 + x)[1] == 2",
11260 "var x:= 1; var y:= 1; (x + vv8)[y] == 2",
11261 "var x:= 1; var y:= 1; (vv8 + x)[y] == 2",
11262 "var x:= 1; var y:= 1; (vv8 + x)[y / x] == 2",
11263 "var x:= 1; var y:= 1; (vv8 + x - y)[y / x] == 1",
11264 "var x:= 1; var y:= 1; (x + vv8)[y / x] == 2",
11265 "var x:= 1; var y:= 1; (x + vv8 - y)[y / x] == 1",
11266 "(abs(vv8 + 1))[1] == 2",
11267 "(abs(1 + vv8))[1] == 2",
11268 "(abs(vv8 + 1))[2 / 2] == 2",
11269 "(abs(1 + vv8))[2 / 2] == 2",
11270 "(abs(vv8 + 1)/2)[1] == 1",
11271 "(abs(1 + vv8)/2)[1] == 1",
11272 "(abs(vv8 + 1)/2)[2 / 2] == 1",
11273 "(abs(1 + vv8)/2)[2 / 2] == 1",
11274 "(abs(abs(vv8 + 1)) - 1)[1] == 1",
11275 "(abs(2 * abs(vv8 + 1)) - 1)[1] == 3",
11276 "(abs(abs(vv8 + 1) * 2) - 1)[1] == 3",
11277 "(abs(2abs(vv8 + 1)) - 1)[1] == 3",
11278 "(abs(abs(vv8 + 1)2) - 1)[1] == 3",
11279 "var x:= 1; (abs(x + vv8))[1] == 2",
11280 "var x:= 1; (abs(vv8 + x))[1] == 2",
11281 "var x:= 1; var y:= 1; (abs(x + vv8))[y] == 2",
11282 "var x:= 1; var y:= 1; (abs(vv8 + x))[y] == 2",
11283 "var x:= 1; var y:= 1; (abs(vv8 + x))[y / x] == 2",
11284 "var x:= 1; var y:= 1; (abs(vv8 + x - y))[y / x] == 1",
11285 "var x:= 1; var y:= 1; (abs(x + vv8))[y / x] == 2",
11286 "var x:= 1; var y:= 1; (abs(x + vv8 - y))[y / x] == 1",
11287 "var x:= 1; (abs(x + vv8)/2)[1] == 1",
11288 "var x:= 1; (abs(vv8 + x)/2)[1] == 1",
11289 "var x:= 1; var y:= 1; (abs(x + vv8)/2)[y] == 1",
11290 "var x:= 1; var y:= 1; (abs(vv8 + x)/2)[y] == 1",
11291 "var x:= 1; var y:= 1; (abs(vv8 + x)/2)[y / x] == 1",
11292 "var x:= 1; var y:= 1; (abs(x + vv8)/2)[y / x] == 1",
11293 "var x := 1; (abs(abs(vv8 + x)) - x)[1] == 1",
11294 "var x := 1; (abs(2 * abs(vv8 + x)) - x)[1] == 3",
11295 "var x := 1; (abs(abs(vv8 + x) * 2) - x)[1] == 3",
11296 "var x := 1; (abs(2abs(vv8 + x)) - x)[1] == 3",
11297 "var x := 1; (abs(abs(vv8 + x)2) - x)[1] == 3",
11298 "var x := 1; var y := 1; (abs(abs(vv8 + x)) - x)[y] == 1",
11299 "var x := 1; var y := 1; (abs(2 * abs(vv8 + x)) - x)[y] == 3",
11300 "var x := 1; var y := 1; (abs(abs(vv8 + x) * 2) - x)[y] == 3",
11301 "var x := 1; var y := 1; (abs(2abs(vv8 + x)) - x)[y] == 3",
11302 "var x := 1; var y := 1; (abs(abs(vv8 + x)2) - x)[y] == 3",
11303 "var x := 1; var y := 1; (abs(abs(vv8 + x)) - x)[x / y] == 1",
11304 "var x := 1; var y := 1; (abs(2 * abs(vv8 + x)) - x)[x / y] == 3",
11305 "var x := 1; var y := 1; (abs(abs(vv8 + x) * 2) - x)[x / y] == 3",
11306 "var x := 1; var y := 1; (abs(2abs(vv8 + x)) - x)[x / y] == 3",
11307 "var x := 1; var y := 1; (abs(abs(vv8 + x)2) - x)[x / y] == 3",
11308 "var successes := 0; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + 1)[i] == i + 1; }; successes == vv8[]",
11309 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + x)[i] == i + x; }; successes == vv8[]",
11310 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (x + vv8)[i] == i + x; }; successes == vv8[]",
11311 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + x)[i / x] == i + x; }; successes == vv8[]",
11312 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (x + vv8)[i / x] == i + x; }; successes == vv8[]",
11313 "var successes := 0; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(vv8 + 1))[i] == i + 1; }; successes == vv8[]",
11314 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(vv8 + x))[i] == i + x; }; successes == vv8[]",
11315 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(x + vv8))[i] == i + x; }; successes == vv8[]",
11316 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(vv8 + x))[i / x] == i + x; }; successes == vv8[]",
11317 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(x + vv8))[i / x] == i + x; }; successes == vv8[]",
11318 };
11319
11320 for (std::size_t e = 0; e < sizeof(expressions)/sizeof(std::string); ++e)
11321 {
11322 T vs8[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
11323 T vs7[] = { 0, 1, 2, 3, 4, 5, 6 };
11324 T vs6[] = { 0, 1, 2, 3, 4, 5 };
11325 T vs5[] = { 0, 1, 2, 3, 4 };
11326 T vs4[] = { 0, 1, 2, 3 };
11327 T vs3[] = { 0, 1, 2 };
11328 T vs2[] = { 0, 1 };
11329 T vs1[] = { 0 };
11330
11339
11340 symbol_table_t symbol_table;
11341
11342 symbol_table.add_vector("vv1", vv1);
11343 symbol_table.add_vector("vv2", vv2);
11344 symbol_table.add_vector("vv3", vv3);
11345 symbol_table.add_vector("vv4", vv4);
11346 symbol_table.add_vector("vv5", vv5);
11347 symbol_table.add_vector("vv6", vv6);
11348 symbol_table.add_vector("vv7", vv7);
11349 symbol_table.add_vector("vv8", vv8);
11350
11351 parser_t parser;
11352
11353 const std::string& expression_string = expressions[e];
11354 expression_t expression;
11355 expression.register_symbol_table(symbol_table);
11356
11357 if (!parser.compile(expression_string,expression))
11358 {
11359 printf("run_test21() - vector_veiw expression compilation error. Expression: %s\n",
11360 expression_string.c_str());
11361
11362 for (std::size_t i = 0; i < parser.error_count(); ++i)
11363 {
11364 error_type error = parser.get_error(i);
11365 exprtk::parser_error::update_error(error,expression_string);
11366
11367 printf("run_test21() - Exp[%02d] Error[%02d] Position: %02d line: %d column: %d Type: [%14s] Msg: %s\n",
11368 static_cast<unsigned int>(e),
11369 static_cast<unsigned int>(i),
11370 static_cast<unsigned int>(error.token.position),
11371 static_cast<unsigned int>(error.line_no),
11372 static_cast<unsigned int>(error.column_no),
11373 exprtk::parser_error::to_str(error.mode).c_str(),
11374 error.diagnostic.c_str());
11375 }
11376
11377 error_found = true;
11378
11379 continue;
11380 }
11381
11382 const T result = expression.value();
11383
11384 if (result != T(1.0))
11385 {
11386 error_found = true;
11387
11388 printf("run_test21() - Error: Exp[%02d] Expression result: %5.3f expected: 1 expression: %s\n",
11389 static_cast<unsigned int>(e),
11390 result,
11391 expression_string.c_str());
11392 }
11393 }
11394
11395 if (error_found)
11396 {
11397 return false;
11398 }
11399 }
11400
11401 {
11402 const std::string expressions[] =
11403 {
11404 "vv0[] == vv0_size",
11405 "sum(vv0) == (vv0[] * (vv0[] + 1) / 2) and (vv0[] == vv0_size)",
11406 "(min(vv0) == 1) and (vv0[] == vv0_size)",
11407 "(max(vv0) == vv0[]) and (vv0[] == vv0_size)",
11408 "(avg(vv0) == (min(vv0) + max(vv0)) / 2) and (vv0[] == vv0_size)",
11409 "(sum(vv0 + 1) == (vv0[] * (vv0[] + 1) / 2 + (vv0[] * 1))) and (vv0[] == vv0_size)",
11410 "(sum(vv0 - 1) == (vv0[] * (vv0[] + 1) / 2 - (vv0[] * 1))) and (vv0[] == vv0_size)",
11411 "(sum(1 + vv0) == (vv0[] * (vv0[] + 1) / 2 + (vv0[] * 1))) and (vv0[] == vv0_size)",
11412 "(sum(-1 + vv0) == (vv0[] * (vv0[] + 1) / 2 - (vv0[] * 1))) and (vv0[] == vv0_size)",
11413 "var x:= 1; sum(vv0 + x) == (vv0[] * (vv0[] + 1) / 2 + (vv0[] * x)) and (vv0[] == vv0_size)",
11414 "var x:= 1; sum(vv0 - x) == (vv0[] * (vv0[] + 1) / 2 - (vv0[] * x)) and (vv0[] == vv0_size)",
11415 "sum(2vv0) == (vv0[] * (vv0[] + 1)) and (vv0[] == vv0_size)",
11416 "sum(vv0 * 2) == (vv0[] * (vv0[] + 1)) and (vv0[] == vv0_size)",
11417 "sum(2vv0 + 1) == (vv0[] * (vv0[] + 1) + vv0[]) and (vv0[] == vv0_size)",
11418 "sum(1 + 2vv0) == (vv0[] * (vv0[] + 1) + vv0[]) and (vv0[] == vv0_size)",
11419 "sum((2 * vv0) + 1) == (vv0[] * (vv0[] + 1) + vv0[]) and (vv0[] == vv0_size)",
11420 "sum(1 + (2 * vv0)) == (vv0[] * (vv0[] + 1) + vv0[]) and (vv0[] == vv0_size)",
11421 "sum((vv0 * 2) + 1) == (vv0[] * (vv0[] + 1) + vv0[]) and (vv0[] == vv0_size)",
11422 "sum(1 + (vv0 * 2)) == (vv0[] * (vv0[] + 1) + vv0[]) and (vv0[] == vv0_size)",
11423 "var x := 1; sum(2vv0 + x) == (vv0[] * (vv0[] + 1) + x * vv0[]) and (vv0[] == vv0_size)",
11424 "var x := 1; sum(x + 2vv0) == (vv0[] * (vv0[] + 1) + x * vv0[]) and (vv0[] == vv0_size)",
11425 "var x := 1; sum((2 * vv0) + x) == (vv0[] * (vv0[] + 1) + x * vv0[]) and (vv0[] == vv0_size)",
11426 "var x := 1; sum(x + (2 * vv0)) == (vv0[] * (vv0[] + 1) + x * vv0[]) and (vv0[] == vv0_size)",
11427 "var x := 1; sum((vv0 * 2) + x) == (vv0[] * (vv0[] + 1) + x * vv0[]) and (vv0[] == vv0_size)",
11428 "var x := 1; sum(x + (vv0 * 2)) == (vv0[] * (vv0[] + 1) + x * vv0[]) and (vv0[] == vv0_size)",
11429 "sum(vv0 += 1) == (vv0[] * (vv0[] + 1) / 2 + vv0[]) and (vv0[] == vv0_size)",
11430 "var x:= 1; sum(vv0 += x) == (vv0[] * (vv0[] + 1) / 2 + x * vv0[]) and (vv0[] == vv0_size)",
11431 "var x:= 1; sum(vv0 -= x) == (vv0[] * (vv0[] + 1 - 2x) / 2) and (vv0[] == vv0_size)",
11432 "(sum(2vv0) == 2 * sum(vv0)) and (vv0[] == vv0_size)",
11433 "(sum(2 * vv0) == 2 * sum(vv0)) and (vv0[] == vv0_size)",
11434 "(sum(vv0 * 2) == 2 * sum(vv0)) and (vv0[] == vv0_size)",
11435 "var x:= 1; sum(2vv0) == (vv0[] * (vv0[] + 1)) and (vv0[] == vv0_size)",
11436 "var x:= 1; sum(2 * vv0) == (vv0[] * (vv0[] + 1)) and (vv0[] == vv0_size)",
11437 "var x:= 1; sum(vv0 * 2) == (vv0[] * (vv0[] + 1)) and (vv0[] == vv0_size)",
11438 "var x := 2; sum(if (x > 1) { vv0 } else { vv1 }) == sum(vv0)",
11439 "dot(2 * vv0,vv1 - 1) + dot(2 * vv0,vv1 - 1) == 2sum(2vv0 * (vv1 - 1))",
11440 "(0 * dot(2 * vv0,vv1 - 1)) == 0"
11441 };
11442
11443 for (std::size_t e = 0; e < sizeof(expressions) / sizeof(std::string); ++e)
11444 {
11445 const T vanilla[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
11446 const std::size_t vanilla_size = sizeof(vanilla) / sizeof(T);
11447
11448 std::vector<T> v0(vanilla, vanilla + vanilla_size);
11450
11451 std::vector<T> v1(vanilla, vanilla + vanilla_size);
11453
11454 T vv0_size = T(0.0);
11455
11456 symbol_table_t symbol_table;
11457 symbol_table.add_variable("vv0_size", vv0_size);
11458 symbol_table.add_vector ("vv0" , vv0 );
11459 symbol_table.add_vector ("vv1" , vv1 );
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
11467 const std::string& expression_string = expressions[e];
11468 expression_t expression;
11469 expression.register_symbol_table(symbol_table);
11470
11471 parser_t parser;
11472
11473 if (!parser.compile(expression_string, expression))
11474 {
11475 printf("run_test21() - Error: %s\tExpression: %s\n",
11476 parser.error().c_str(),
11477 expression_string.c_str());
11478
11479 for (std::size_t i = 0; i < parser.error_count(); ++i)
11480 {
11481 error_type error = parser.get_error(i);
11482 exprtk::parser_error::update_error(error,expression_string);
11483
11484 printf("run_test21() - Exp[%02d] Error[%02d] Position: %02d line: %d column: %d Type: [%14s] Msg: %s\n",
11485 static_cast<unsigned int>(e),
11486 static_cast<unsigned int>(i),
11487 static_cast<unsigned int>(error.token.position),
11488 static_cast<unsigned int>(error.line_no),
11489 static_cast<unsigned int>(error.column_no),
11490 exprtk::parser_error::to_str(error.mode).c_str(),
11491 error.diagnostic.c_str());
11492 }
11493
11494 error_found = true;
11495
11496 continue;
11497 }
11498
11499 for (std::size_t i = 1; i <= vv0.base_size(); ++i)
11500 {
11501 v0.assign(vanilla, vanilla + vanilla_size);
11502 v1.assign(vanilla, vanilla + vanilla_size);
11503
11504 vv0_size = T(i);
11505 vv0.set_size(i);
11506
11507 const T result = expression.value();
11508
11509 if (result != 1)
11510 {
11511 printf("run_test21() - Exp[%02d] Error: size: %d expected 1 instead got: %f expr:%s\n",
11512 static_cast<unsigned int>(e),
11513 static_cast<unsigned int>(i),
11514 result,
11515 expression_string.c_str());
11516
11517 error_found = true;
11518 }
11519 }
11520
11521 vv1.rebase(v0.data());
11522 vv0.rebase(v1.data());
11523 expression.value();
11524
11525 vv0.rebase(v0.data());
11526 vv1.rebase(v1.data());
11527 expression.value();
11528
11529 expression.release();
11530 }
11531
11532 if (error_found)
11533 {
11534 return false;
11535 }
11536 }
11537
11538 {
11539 const T vanilla[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
11540 const std::size_t vanilla_size = sizeof(vanilla) / sizeof(T);
11541
11542 std::vector<T> v0(vanilla, vanilla + vanilla_size);
11543 std::vector<T> v1(vanilla, vanilla + vanilla_size);
11544
11546
11547 vv_size_handler_t<T> vv_size_handler;
11548 vv_size_handler.register_vector_view(vv);
11549
11550 symbol_table_t symbol_table;
11551 symbol_table.add_vector("v", vv);
11552
11553 exprtk::rtl::vecops::package<T> vector_package;
11554 exprtk::rtl::io::package<T> io_package;
11555
11556 symbol_table.add_package( vector_package );
11557 symbol_table.add_package( io_package );
11558 symbol_table.add_function("resize", vv_size_handler);
11559
11560 expression_t expression;
11561 expression.register_symbol_table(symbol_table);
11562
11563 parser_t parser;
11564
11565 const std::string resize_expression =
11566 " var vec_original_size := v[]; "
11567 " var success_count := 0; "
11568 " "
11569 " for (var i := 1; i <= vec_original_size; i += 1) "
11570 " { "
11571 " if (resize(v,i) == true and v[] == i) "
11572 " { "
11573 " success_count += 1; "
11574 " } "
11575 " }; "
11576 " "
11577 " success_count == vec_original_size ";
11578
11579 if (!parser.compile(resize_expression, expression))
11580 {
11581 printf("run_test21() - Error: %s\tExpression: %s\n",
11582 parser.error().c_str(),
11583 resize_expression.c_str());
11584
11585 for (std::size_t i = 0; i < parser.error_count(); ++i)
11586 {
11587 error_type error = parser.get_error(i);
11588 exprtk::parser_error::update_error(error,resize_expression);
11589
11590 printf("run_test21() - Error[%02d] Position: %02d line: %d column: %d Type: [%14s] Msg: %s\n",
11591 static_cast<unsigned int>(i),
11592 static_cast<unsigned int>(error.token.position),
11593 static_cast<unsigned int>(error.line_no),
11594 static_cast<unsigned int>(error.column_no),
11595 exprtk::parser_error::to_str(error.mode).c_str(),
11596 error.diagnostic.c_str());
11597 }
11598
11599 return false;
11600 }
11601
11602 const T value0 = expression.value();
11603
11604 if (expression.value() != T(1))
11605 {
11606 printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (1)\n", value0);
11607 error_found = true;
11608 }
11609
11610 vv.rebase(v1.data());
11611 vv_size_handler.register_vector_view(vv);
11612
11613 const T value1 = expression.value();
11614
11615 if (expression.value() != T(1))
11616 {
11617 printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (1)\n", value1);
11618 error_found = true;
11619 }
11620
11621 vv.rebase(v0.data());
11622 vv_size_handler.register_vector_view(vv);
11623
11624 expression.release();
11625 }
11626
11627 {
11628 const T vanilla[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
11629 const std::size_t vanilla_size = sizeof(vanilla) / sizeof(T);
11630
11631 std::vector<T> v0(vanilla, vanilla + vanilla_size);
11632 std::vector<T> v1(vanilla, vanilla + vanilla_size);
11633
11635
11636 vv_size_handler_t<T> vv_size_handler;
11637 vv_size_handler.register_vector_view(vv);
11638
11639 symbol_table_t symbol_table;
11640 symbol_table.add_vector("v", vv);
11641
11642 exprtk::rtl::vecops::package<T> vector_package;
11643 exprtk::rtl::io::package<T> io_package;
11644
11645 symbol_table.add_package( vector_package );
11646 symbol_table.add_package( io_package );
11647 symbol_table.add_function("resize", vv_size_handler);
11648
11649 expression_t expression;
11650 expression.register_symbol_table(symbol_table);
11651
11652 parser_t parser;
11653
11654 const std::string resize_expression =
11655 " var vec_original_size := v[]; "
11656 " var failure_count := 0; "
11657 " "
11658 " for (var i := vec_original_size + 1; i <= 2 * vec_original_size; i += 1) "
11659 " { "
11660 " if (resize(v,i) == false or v[] != i) "
11661 " { "
11662 " failure_count += 1 "
11663 " } "
11664 " }; "
11665 " "
11666 " failure_count == vec_original_size ";
11667
11668 if (!parser.compile(resize_expression, expression))
11669 {
11670 printf("run_test21() - Error: %s\tExpression: %s\n",
11671 parser.error().c_str(),
11672 resize_expression.c_str());
11673
11674 for (std::size_t i = 0; i < parser.error_count(); ++i)
11675 {
11676 error_type error = parser.get_error(i);
11677 exprtk::parser_error::update_error(error,resize_expression);
11678
11679 printf("run_test21() - Error[%02d] Position: %02d line: %d column: %d Type: [%14s] Msg: %s\n",
11680 static_cast<unsigned int>(i),
11681 static_cast<unsigned int>(error.token.position),
11682 static_cast<unsigned int>(error.line_no),
11683 static_cast<unsigned int>(error.column_no),
11684 exprtk::parser_error::to_str(error.mode).c_str(),
11685 error.diagnostic.c_str());
11686 }
11687
11688 return false;
11689 }
11690
11691 const T value0 = expression.value();
11692
11693 if (expression.value() != T(1))
11694 {
11695 printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (2)\n", value0);
11696 error_found = true;
11697 }
11698
11699 vv.rebase(v1.data());
11700 vv_size_handler.register_vector_view(vv);
11701
11702 const T value1 = expression.value();
11703
11704 if (expression.value() != T(1))
11705 {
11706 printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (2)\n", value1);
11707 error_found = true;
11708 }
11709
11710 vv.rebase(v0.data());
11711 vv_size_handler.register_vector_view(vv);
11712
11713 expression.release();
11714 }
11715
11716 {
11717 const std::size_t max_vector_size = 10;
11718
11719 std::vector<T> vec1(max_vector_size, 1);
11720 std::vector<T> vec2(max_vector_size, 2);
11721 std::vector<T> vec3(max_vector_size, 3);
11722
11723 const std::string expressions[] =
11724 {
11725 "return [x + 10]",
11726 "return [10 + x]",
11727 "return [2x + 10]",
11728 "return [10 + 2x]",
11729 "return [(x * 2) + 10]",
11730 "return [10 + (x * 2)]",
11731 "return [(2 * x) + 10]",
11732 "return [10 + (2 * x)]",
11733 "return [x + k]",
11734 "return [k + x]",
11735 "return [2x + k]",
11736 "return [k + 2x]",
11737 "return [(x * 2) + k]",
11738 "return [k + (x * 2)]",
11739 "return [(2 * x) + k]",
11740 "return [k + (2 * x)]",
11741 "return [x + y]" ,
11742 "return [y + x]" ,
11743 "return [2x + y]",
11744 "return [y + 2x]",
11745 "return [2x + 2y]",
11746 "return [2y + 2x]",
11747 "return [(2 * x) + y]",
11748 "return [y + (2 * x)]",
11749 "return [(x * 2) + y]",
11750 "return [y + (x * 2)]",
11751 "return [(2 * x) + (2 * y)]",
11752 "return [(2 * y) + (2 * x)]",
11753 "return [(x * 2) + (y * 2)]",
11754 "return [(y * 2) + (x * 2)]",
11755 };
11756
11757 const T expected_values[] =
11758 {
11759 T(2 + 10),
11760 T(2 + 10),
11761 T(2 * 2 + 10),
11762 T(2 * 2 + 10),
11763 T(2 * 2 + 10),
11764 T(2 * 2 + 10),
11765 T(2 * 2 + 10),
11766 T(2 * 2 + 10),
11767 T(2 + 10),
11768 T(2 + 10),
11769 T(2 * 2 + 10),
11770 T(2 * 2 + 10),
11771 T(2 * 2 + 10),
11772 T(2 * 2 + 10),
11773 T(2 * 2 + 10),
11774 T(2 * 2 + 10),
11775 T(2 + 3),
11776 T(3 + 2),
11777 T(2 * 2 + 3),
11778 T(3 + 2 * 2),
11779 T(2 * 2 + 2 * 3),
11780 T(2 * 3 + 2 * 2),
11781 T(2 * 2 + 3),
11782 T(3 + (2 * 2)),
11783 T(2 * 2 + 3),
11784 T(3 + 2 * 2),
11785 T(2 * 2 + 2 * 3),
11786 T(2 * 3 + 2 * 2),
11787 T(2 * 2 + 3 * 2),
11788 T(3 * 2 + 2 * 2),
11789 };
11790
11791 const std::size_t expressions_size = sizeof(expressions) / sizeof(std::string);
11792
11793 for (std::size_t i = 0; i < expressions_size; ++i)
11794 {
11795 const std::string& expression_string = expressions[i];
11796
11797 exprtk::vector_view<T> x_view = exprtk::make_vector_view(vec1, vec1.size());
11798
11799 for (std::size_t vector_size = 1; vector_size <= 10; ++vector_size)
11800 {
11801 symbol_table_t symbol_table;
11802 expression_t expression;
11803 parser_t parser;
11804
11805 T k = T(10);
11806
11807 symbol_table.add_variable("k", k );
11808 symbol_table.add_vector ("x", x_view);
11809 symbol_table.add_vector ("y", vec3 );
11810
11811 expression.register_symbol_table(symbol_table);
11812
11813 if (!parser.compile(expression_string, expression))
11814 {
11815 printf("run_test21() - Error: %s\tExpression: %s\n",
11816 parser.error().c_str(),
11817 expression_string.c_str());
11818
11819 error_found = true;
11820
11821 continue;
11822 }
11823
11824 x_view.rebase(vec2.data());
11825
11826 x_view.set_size(vector_size);
11827
11828 expression.value();
11829
11830 if (!expression.return_invoked())
11831 {
11832 printf("run_test21() - Error: expected return_invoked for expression: %s\n",
11833 expression_string.c_str());
11834
11835 error_found = true;
11836
11837 continue;
11838 }
11839
11840 const exprtk::results_context<T>& results = expression.results();
11841
11842 if (results.count() != 1)
11843 {
11844 printf("run_test21() - Error: expected 1 return value, instead got: %d for expression: %s\n",
11845 static_cast<int>(results.count()),
11846 expression_string.c_str());
11847
11848 error_found = true;
11849
11850 continue;
11851 }
11852
11854 {
11855 printf("run_test21() - Error: expected vector type for return value for expression: %s\n",
11856 expression_string.c_str());
11857
11858 error_found = true;
11859
11860 continue;
11861 }
11862
11863 typename exprtk::type_store<T>::vector_view vector(results[0]);
11864
11865 if (vector.size() != vector_size)
11866 {
11867 printf("run_test21() - Error: expected vector size %d instead got: %d for expression: %s\n",
11868 static_cast<int>(vector_size),
11869 static_cast<int>(vector.size()),
11870 expression_string.c_str());
11871
11872 error_found = true;
11873
11874 continue;
11875 }
11876
11877 for (std::size_t j = 0; j < vector.size(); ++j)
11878 {
11879 if (vector[j] != expected_values[i])
11880 {
11881 printf("run_test21() - Error: expected vector[%d] expected %f instead got: %f for expression: %s\n",
11882 static_cast<int>(j),
11883 expected_values[i],
11884 vector[j],
11885 expression_string.c_str());
11886
11887 error_found = true;
11888 }
11889 }
11890 }
11891 }
11892 }
11893
11894
11895 {
11896 const std::size_t max_vector_size = 10;
11897
11898 std::vector<T> vec1(max_vector_size, 1);
11899 std::vector<T> vec2(max_vector_size, 2);
11900
11901 std::vector<T> vec3(max_vector_size / 2, 3);
11902
11903 const std::string expressions[] =
11904 {
11905 "return [x + y]" ,
11906 "return [y + x]" ,
11907 "return [2x + y]",
11908 "return [y + 2x]",
11909 "return [2x + 2y]",
11910 "return [2y + 2x]",
11911 "return [(2 * x) + y]",
11912 "return [y + (2 * x)]",
11913 "return [(x * 2) + y]",
11914 "return [y + (x * 2)]",
11915 "return [(2 * x) + (2 * y)]",
11916 "return [(2 * y) + (2 * x)]",
11917 "return [(x * 2) + (y * 2)]",
11918 "return [(y * 2) + (x * 2)]",
11919 };
11920
11921 const T expected_values[] =
11922 {
11923 T(2 + 3),
11924 T(3 + 2),
11925 T(2 * 2 + 3),
11926 T(3 + 2 * 2),
11927 T(2 * 2 + 2 * 3),
11928 T(2 * 3 + 2 * 2),
11929 T(2 * 2 + 3),
11930 T(3 + (2 * 2)),
11931 T(2 * 2 + 3),
11932 T(3 + 2 * 2),
11933 T(2 * 2 + 2 * 3),
11934 T(2 * 3 + 2 * 2),
11935 T(2 * 2 + 3 * 2),
11936 T(3 * 2 + 2 * 2),
11937 };
11938
11939 const std::size_t expressions_size = sizeof(expressions) / sizeof(std::string);
11940
11941 for (std::size_t i = 0; i < expressions_size; ++i)
11942 {
11943 const std::string& expression_string = expressions[i];
11944
11945 exprtk::vector_view<T> x_view = exprtk::make_vector_view(vec1, vec1.size());
11946
11947 for (std::size_t vector_size = vec3.size() + 1; vector_size <= 10; ++vector_size)
11948 {
11949 symbol_table_t symbol_table;
11950 expression_t expression;
11951 parser_t parser;
11952
11953 symbol_table.add_vector ("x", x_view);
11954 symbol_table.add_vector ("y", vec3 );
11955
11956 expression.register_symbol_table(symbol_table);
11957
11958 if (!parser.compile(expression_string, expression))
11959 {
11960 printf("run_test21() - Error: %s\tExpression: %s\n",
11961 parser.error().c_str(),
11962 expression_string.c_str());
11963
11964 error_found = true;
11965
11966 continue;
11967 }
11968
11969 x_view.rebase(vec2.data());
11970
11971 x_view.set_size(vector_size);
11972
11973 expression.value();
11974
11975 if (!expression.return_invoked())
11976 {
11977 printf("run_test21() - Error: expected return_invoked for expression: %s\n",
11978 expression_string.c_str());
11979
11980 error_found = true;
11981
11982 continue;
11983 }
11984
11985 const exprtk::results_context<T>& results = expression.results();
11986
11987 if (results.count() != 1)
11988 {
11989 printf("run_test21() - Error: expected 1 return value, instead got: %d for expression: %s\n",
11990 static_cast<int>(results.count()),
11991 expression_string.c_str());
11992
11993 error_found = true;
11994
11995 continue;
11996 }
11997
11999 {
12000 printf("run_test21() - Error: expected vector type for return value for expression: %s\n",
12001 expression_string.c_str());
12002
12003 error_found = true;
12004
12005 continue;
12006 }
12007
12008 typename exprtk::type_store<T>::vector_view vector(results[0]);
12009
12010 if (vector.size() != vec3.size())
12011 {
12012 printf("run_test21() - Error: expected vector size %d instead got: %d for expression: %s\n",
12013 static_cast<int>(vec3.size()),
12014 static_cast<int>(vector.size()),
12015 expression_string.c_str());
12016
12017 error_found = true;
12018
12019 continue;
12020 }
12021
12022 for (std::size_t j = 0; j < vector.size(); ++j)
12023 {
12024 if (vector[j] != expected_values[i])
12025 {
12026 printf("run_test21() - Error: expected vector[%d] expected %f instead got: %f for expression: %s\n",
12027 static_cast<int>(j),
12028 expected_values[i],
12029 vector[j],
12030 expression_string.c_str());
12031
12032 error_found = true;
12033 }
12034 }
12035 }
12036 }
12037 }
12038
12039 if (error_found)
12040 {
12041 return false;
12042 }
12043
12044 return true;
12045}
std::size_t base_size() const
Definition exprtk.hpp:4668
bool set_size(const std::size_t new_size)
Definition exprtk.hpp:4726
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:22379
std::string to_str(error_mode mode)
Definition exprtk.hpp:22363

References exprtk::vector_view< T >::base_size(), exprtk::results_context< T >::count(), 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::type_store< T >::type_view< ViewType >::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 12057 of file exprtk_test.cpp.

12058{
12059 typedef exprtk::symbol_table<T> symbol_table_t;
12060 typedef exprtk::expression<T> expression_t;
12061 typedef exprtk::parser<T> parser_t;
12062
12063 bool result = true;
12064
12065 {
12066 const std::string expressions[] =
12067 {
12068 " assert(1 > 1); ",
12069 " assert(1 > 2, 'assert statement 2'); ",
12070 " assert(1 > 3, 'assert ' + 'statement 3'); ",
12071 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); ",
12072 " assert(1 > 5, 'assert ' + 'statement 5'); ",
12073 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); "
12074 };
12075
12076 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12077
12078 for (std::size_t i = 0; i < expression_count; ++i)
12079 {
12080 expression_t expression;
12081 parser_t parser;
12082
12083 if (!parser.compile(expressions[i], expression))
12084 {
12085 printf("run_test22() - Error: %s\tExpression: %s [1]\n",
12086 parser.error().c_str(),
12087 expressions[i].c_str());
12088 result = false;
12089 continue;
12090 }
12091 else if (!exprtk::expression_helper<T>::is_null(expression))
12092 {
12093 printf("run_test22() - Error: Expression is not null! expression: %s [1]\n",
12094 expressions[i].c_str());
12095 result = false;
12096 continue;
12097 }
12098
12099 expression.value();
12100 }
12101 }
12102
12103 {
12104 const std::string expressions[] =
12105 {
12106 " assert(1 > 1); 1 + 0 ",
12107 " assert(1 > 2, 'assert statement 2'); 2 + 0 ",
12108 " assert(1 > 3, 'assert ' + 'statement 3'); 3 + 0 ",
12109 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 4 + 0 ",
12110 " assert(1 > 5, 'assert ' + 'statement 5'); 5 + 0 ",
12111 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0 "
12112 };
12113
12114 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12115
12116 for (std::size_t i = 0; i < expression_count; ++i)
12117 {
12118 expression_t expression;
12119 parser_t parser;
12120
12121 if (!parser.compile(expressions[i], expression))
12122 {
12123 printf("run_test22() - Error: %s\tExpression: %s [2]\n",
12124 parser.error().c_str(),
12125 expressions[i].c_str());
12126 result = false;
12127 continue;
12128 }
12129 else if (!exprtk::expression_helper<T>::is_literal(expression))
12130 {
12131 printf("run_test22() - Error: Expression is not constant! expression: %s [2]\n",
12132 expressions[i].c_str());
12133 continue;
12134 }
12135
12136 expression.value();
12137 }
12138 }
12139
12140 {
12141 const std::string expressions[] =
12142 {
12143 " assert(1 > 1); "
12144 " assert(1 > 2, 'assert statement 2'); "
12145 " assert(1 > 3, 'assert ' + 'statement 3'); "
12146 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); "
12147 " assert(1 > 5, 'assert ' + 'statement 5'); "
12148 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); "
12149 };
12150
12151 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12152
12153 for (std::size_t i = 0; i < expression_count; ++i)
12154 {
12155 expression_t expression;
12156 parser_t parser;
12157 assert_handler handler;
12158
12159 handler.assert_count = 0;
12160
12161 parser.register_assert_check(handler);
12162
12163 if (!parser.compile(expressions[i], expression))
12164 {
12165 printf("run_test22() - Error: %s\tExpression: %s [3]\n",
12166 parser.error().c_str(),
12167 expressions[i].c_str());
12168 result = false;
12169 continue;
12170 }
12171
12172 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12173
12174 typedef typename exprtk::expression_helper<T> et_t;
12175 type_sequence.push_back(et_t::e_assert);
12176 type_sequence.push_back(et_t::e_assert);
12177 type_sequence.push_back(et_t::e_assert);
12178 type_sequence.push_back(et_t::e_assert);
12179 type_sequence.push_back(et_t::e_assert);
12180 type_sequence.push_back(et_t::e_assert);
12181
12182 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12183 {
12184 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [3]\n",
12185 expressions[i].c_str());
12186 result = false;
12187 continue;
12188 }
12189
12190 expression.value();
12191
12192 if (6 != handler.assert_count)
12193 {
12194 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [3]\n",
12195 static_cast<int>(handler.assert_count),
12196 expressions[i].c_str());
12197 result = false;
12198 continue;
12199 }
12200 }
12201 }
12202
12203 {
12204 const std::string expressions[] =
12205 {
12206 " assert(1 > 1); 1 ",
12207 " assert(1 > 2, 'assert statement 2'); 2 ",
12208 " assert(1 > 3, 'assert ' + 'statement 3'); 3 ",
12209 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 4 ",
12210 " assert(1 > 5, 'assert ' + 'statement 5'); 5 ",
12211 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 6 "
12212 };
12213
12214 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12215
12216 for (std::size_t i = 0; i < expression_count; ++i)
12217 {
12218 expression_t expression;
12219 parser_t parser;
12220 assert_handler handler;
12221
12222 handler.assert_count = 0;
12223
12224 parser.register_assert_check(handler);
12225
12226 if (!parser.compile(expressions[i], expression))
12227 {
12228 printf("run_test22() - Error: %s\tExpression: %s [4]\n",
12229 parser.error().c_str(),
12230 expressions[i].c_str());
12231 result = false;
12232 continue;
12233 }
12234
12235 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12236
12237 typedef typename exprtk::expression_helper<T> et_t;
12238 type_sequence.push_back(et_t::e_assert );
12239 type_sequence.push_back(et_t::e_literal);
12240
12241 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12242 {
12243 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [4]\n",
12244 expressions[i].c_str());
12245 result = false;
12246 continue;
12247 }
12248
12249 expression.value();
12250
12251 if (1 != handler.assert_count)
12252 {
12253 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [4]\n",
12254 static_cast<int>(handler.assert_count),
12255 expressions[i].c_str());
12256 result = false;
12257 continue;
12258 }
12259 }
12260 }
12261
12262 {
12263 const std::string expressions[] =
12264 {
12265 " assert(1 > 1); 1 + 0 ",
12266 " assert(1 > 2, 'assert statement 2'); 2 + 0 ",
12267 " assert(1 > 3, 'assert ' + 'statement 3'); 3 + 0 ",
12268 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 4 + 0 ",
12269 " assert(1 > 5, 'assert ' + 'statement 5'); 5 + 0 ",
12270 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0 "
12271 };
12272
12273 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12274
12275 for (std::size_t i = 0; i < expression_count; ++i)
12276 {
12277 expression_t expression;
12278 parser_t parser;
12279 assert_handler handler;
12280
12281 handler.assert_count = 0;
12282
12283 parser.register_assert_check(handler);
12284
12285 if (!parser.compile(expressions[i], expression))
12286 {
12287 printf("run_test22() - Error: %s\tExpression: %s [5]\n",
12288 parser.error().c_str(),
12289 expressions[i].c_str());
12290 result = false;
12291 continue;
12292 }
12293
12294 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12295
12296 typedef typename exprtk::expression_helper<T> et_t;
12297 type_sequence.push_back(et_t::e_assert );
12298 type_sequence.push_back(et_t::e_literal);
12299
12300 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12301 {
12302 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [5]\n",
12303 expressions[i].c_str());
12304 result = false;
12305 continue;
12306 }
12307
12308 expression.value();
12309
12310 if (1 != handler.assert_count)
12311 {
12312 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [5]\n",
12313 static_cast<int>(handler.assert_count),
12314 expressions[i].c_str());
12315 result = false;
12316 continue;
12317 }
12318 }
12319 }
12320
12321 {
12322 const std::string expressions[] =
12323 {
12324 " assert(1 > 1); 'assert statement 0001' ",
12325 " assert(1 > 2, 'assert statement 2'); 'assert statement 0002' ",
12326 " assert(1 > 3, 'assert ' + 'statement 3'); 'assert statement 0003' ",
12327 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 'assert statement 0004' ",
12328 " assert(1 > 5, 'assert ' + 'statement 5'); 'assert statement 0005' ",
12329 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert statement 0006' "
12330 };
12331
12332 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12333
12334 for (std::size_t i = 0; i < expression_count; ++i)
12335 {
12336 expression_t expression;
12337 parser_t parser;
12338 assert_handler handler;
12339
12340 handler.assert_count = 0;
12341
12342 parser.register_assert_check(handler);
12343
12344 if (!parser.compile(expressions[i], expression))
12345 {
12346 printf("run_test22() - Error: %s\tExpression: %s [6]\n",
12347 parser.error().c_str(),
12348 expressions[i].c_str());
12349 result = false;
12350 continue;
12351 }
12352
12353 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12354
12355 typedef typename exprtk::expression_helper<T> et_t;
12356 type_sequence.push_back(et_t::e_assert);
12357 type_sequence.push_back(et_t::e_string);
12358
12359 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12360 {
12361 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [6]\n",
12362 expressions[i].c_str());
12363 result = false;
12364 continue;
12365 }
12366
12367 expression.value();
12368
12369 if (1 != handler.assert_count)
12370 {
12371 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [6]\n",
12372 static_cast<int>(handler.assert_count),
12373 expressions[i].c_str());
12374 result = false;
12375 continue;
12376 }
12377 }
12378 }
12379
12380 {
12381 const std::string expressions[] =
12382 {
12383 " assert(1 > 1); 'assert statement' + '0001' ",
12384 " assert(1 > 2, 'assert statement 2'); 'assert statement' + '0002' ",
12385 " assert(1 > 3, 'assert ' + 'statement 3'); 'assert statement' + '0003' ",
12386 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 'assert statement' + '0004' ",
12387 " assert(1 > 5, 'assert ' + 'statement 5'); 'assert statement' + '0005' ",
12388 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert statement' + '0006' "
12389 };
12390
12391 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12392
12393 for (std::size_t i = 0; i < expression_count; ++i)
12394 {
12395 expression_t expression;
12396 parser_t parser;
12397 assert_handler handler;
12398
12399 handler.assert_count = 0;
12400
12401 parser.register_assert_check(handler);
12402
12403 if (!parser.compile(expressions[i], expression))
12404 {
12405 printf("run_test22() - Error: %s\tExpression: %s [7]\n",
12406 parser.error().c_str(),
12407 expressions[i].c_str());
12408 result = false;
12409 continue;
12410 }
12411
12412 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12413
12414 typedef typename exprtk::expression_helper<T> et_t;
12415 type_sequence.push_back(et_t::e_assert);
12416 type_sequence.push_back(et_t::e_string);
12417
12418 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12419 {
12420 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [7]\n",
12421 expressions[i].c_str());
12422 result = false;
12423 continue;
12424 }
12425
12426 expression.value();
12427
12428 if (1 != handler.assert_count)
12429 {
12430 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [7]\n",
12431 static_cast<int>(handler.assert_count),
12432 expressions[i].c_str());
12433 result = false;
12434 continue;
12435 }
12436 }
12437 }
12438
12439 {
12440 const std::string expressions[] =
12441 {
12442 " assert(x > y); ",
12443 " assert(x > y, 'assert statement 2'); ",
12444 " assert(x > y, 'assert ' + 'statement 3'); ",
12445 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); ",
12446 " assert(x > y, 'assert ' + 'statement 5'); ",
12447 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); "
12448 };
12449
12450 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12451
12452 for (std::size_t i = 0; i < expression_count; ++i)
12453 {
12454 T x = T(1);
12455 T y = T(2);
12456
12457 symbol_table_t symbol_table;
12458 expression_t expression;
12459 parser_t parser;
12460
12461 symbol_table.add_variable("x", x);
12462 symbol_table.add_variable("y", y);
12463 expression.register_symbol_table(symbol_table);
12464
12465 if (!parser.compile(expressions[i], expression))
12466 {
12467 printf("run_test22() - Error: %s\tExpression: %s [8]\n",
12468 parser.error().c_str(),
12469 expressions[i].c_str());
12470 result = false;
12471 continue;
12472 }
12473 else if (!exprtk::expression_helper<T>::is_null(expression))
12474 {
12475 printf("run_test22() - Error: Expression is not null! expression: %s [8]\n",
12476 expressions[i].c_str());
12477 result = false;
12478 continue;
12479 }
12480
12481 expression.value();
12482 }
12483 }
12484
12485 {
12486 const std::string expressions[] =
12487 {
12488 " assert(x > y); 1 + 0 ",
12489 " assert(x > y, 'assert statement 2'); 2 + 0 ",
12490 " assert(x > y, 'assert ' + 'statement 3'); 3 + 0 ",
12491 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 4 + 0 ",
12492 " assert(x > y, 'assert ' + 'statement 5'); 5 + 0 ",
12493 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0 "
12494 };
12495
12496 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12497
12498 for (std::size_t i = 0; i < expression_count; ++i)
12499 {
12500 T x = T(1);
12501 T y = T(2);
12502
12503 symbol_table_t symbol_table;
12504 expression_t expression;
12505 parser_t parser;
12506
12507 symbol_table.add_variable("x", x);
12508 symbol_table.add_variable("y", y);
12509 expression.register_symbol_table(symbol_table);
12510
12511 if (!parser.compile(expressions[i], expression))
12512 {
12513 printf("run_test22() - Error: %s\tExpression: %s [9]\n",
12514 parser.error().c_str(),
12515 expressions[i].c_str());
12516 result = false;
12517 continue;
12518 }
12519 else if (!exprtk::expression_helper<T>::is_literal(expression))
12520 {
12521 printf("run_test22() - Error: Expression is not constant! expression: %s [9]\n",
12522 expressions[i].c_str());
12523 continue;
12524 }
12525
12526 expression.value();
12527 }
12528 }
12529
12530 {
12531 const std::string expressions[] =
12532 {
12533 " assert(x > y); "
12534 " assert(x > y, 'assert statement 2'); "
12535 " assert(x > y, 'assert ' + 'statement 3'); "
12536 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); "
12537 " assert(x > y, 'assert ' + 'statement 5'); "
12538 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); "
12539 };
12540
12541 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12542
12543 for (std::size_t i = 0; i < expression_count; ++i)
12544 {
12545 T x = T(1);
12546 T y = T(2);
12547
12548 symbol_table_t symbol_table;
12549 expression_t expression;
12550 parser_t parser;
12551 assert_handler handler;
12552
12553 handler.assert_count = 0;
12554
12555 symbol_table.add_variable("x", x);
12556 symbol_table.add_variable("y", y);
12557 expression.register_symbol_table(symbol_table);
12558
12559 parser.register_assert_check(handler);
12560
12561 if (!parser.compile(expressions[i], expression))
12562 {
12563 printf("run_test22() - Error: %s\tExpression: %s [10]\n",
12564 parser.error().c_str(),
12565 expressions[i].c_str());
12566 result = false;
12567 continue;
12568 }
12569
12570 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12571
12572 typedef typename exprtk::expression_helper<T> et_t;
12573 type_sequence.push_back(et_t::e_assert);
12574 type_sequence.push_back(et_t::e_assert);
12575 type_sequence.push_back(et_t::e_assert);
12576 type_sequence.push_back(et_t::e_assert);
12577 type_sequence.push_back(et_t::e_assert);
12578 type_sequence.push_back(et_t::e_assert);
12579
12580 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12581 {
12582 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [10]\n",
12583 expressions[i].c_str());
12584 result = false;
12585 continue;
12586 }
12587
12588 expression.value();
12589
12590 if (6 != handler.assert_count)
12591 {
12592 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [10]\n",
12593 static_cast<int>(handler.assert_count),
12594 expressions[i].c_str());
12595 result = false;
12596 continue;
12597 }
12598 }
12599 }
12600
12601 {
12602 const std::string expressions[] =
12603 {
12604 " assert(x > y); 1 ",
12605 " assert(x > y, 'assert statement 2'); 2 ",
12606 " assert(x > y, 'assert ' + 'statement 3'); 3 ",
12607 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 4 ",
12608 " assert(x > y, 'assert ' + 'statement 5'); 5 ",
12609 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 6 "
12610 };
12611
12612 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12613
12614 for (std::size_t i = 0; i < expression_count; ++i)
12615 {
12616 T x = T(1);
12617 T y = T(2);
12618
12619 symbol_table_t symbol_table;
12620 expression_t expression;
12621 parser_t parser;
12622 assert_handler handler;
12623
12624 handler.assert_count = 0;
12625
12626 symbol_table.add_variable("x", x);
12627 symbol_table.add_variable("y", y);
12628 expression.register_symbol_table(symbol_table);
12629
12630 parser.register_assert_check(handler);
12631
12632 if (!parser.compile(expressions[i], expression))
12633 {
12634 printf("run_test22() - Error: %s\tExpression: %s [11]\n",
12635 parser.error().c_str(),
12636 expressions[i].c_str());
12637 result = false;
12638 continue;
12639 }
12640
12641 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12642
12643 typedef typename exprtk::expression_helper<T> et_t;
12644 type_sequence.push_back(et_t::e_assert );
12645 type_sequence.push_back(et_t::e_literal);
12646
12647 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12648 {
12649 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [11]\n",
12650 expressions[i].c_str());
12651 result = false;
12652 continue;
12653 }
12654
12655 expression.value();
12656
12657 if (1 != handler.assert_count)
12658 {
12659 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [11]\n",
12660 static_cast<int>(handler.assert_count),
12661 expressions[i].c_str());
12662 result = false;
12663 continue;
12664 }
12665
12666 }
12667 }
12668
12669 {
12670 const std::string expressions[] =
12671 {
12672 " assert(x > y); 1 + 0 ",
12673 " assert(x > y, 'assert statement 2'); 2 + 0 ",
12674 " assert(x > y, 'assert ' + 'statement 3'); 3 + 0 ",
12675 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 4 + 0 ",
12676 " assert(x > y, 'assert ' + 'statement 5'); 5 + 0 ",
12677 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0 "
12678 };
12679
12680 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12681
12682 for (std::size_t i = 0; i < expression_count; ++i)
12683 {
12684 T x = T(1);
12685 T y = T(2);
12686
12687 symbol_table_t symbol_table;
12688 expression_t expression;
12689 parser_t parser;
12690 assert_handler handler;
12691
12692 handler.assert_count = 0;
12693
12694 symbol_table.add_variable("x", x);
12695 symbol_table.add_variable("y", y);
12696 expression.register_symbol_table(symbol_table);
12697
12698 parser.register_assert_check(handler);
12699
12700 if (!parser.compile(expressions[i], expression))
12701 {
12702 printf("run_test22() - Error: %s\tExpression: %s [12]\n",
12703 parser.error().c_str(),
12704 expressions[i].c_str());
12705 result = false;
12706 continue;
12707 }
12708
12709 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12710
12711 typedef typename exprtk::expression_helper<T> et_t;
12712 type_sequence.push_back(et_t::e_assert );
12713 type_sequence.push_back(et_t::e_literal);
12714
12715 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12716 {
12717 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [12]\n",
12718 expressions[i].c_str());
12719 result = false;
12720 continue;
12721 }
12722
12723 expression.value();
12724
12725 if (1 != handler.assert_count)
12726 {
12727 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [12]\n",
12728 static_cast<int>(handler.assert_count),
12729 expressions[i].c_str());
12730 result = false;
12731 continue;
12732 }
12733 }
12734 }
12735
12736 {
12737 const std::string expressions[] =
12738 {
12739 " assert(x > y); 'assert statement 0001' ",
12740 " assert(x > y, 'assert statement 2'); 'assert statement 0002' ",
12741 " assert(x > y, 'assert ' + 'statement 3'); 'assert statement 0003' ",
12742 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 'assert statement 0004' ",
12743 " assert(x > y, 'assert ' + 'statement 5'); 'assert statement 0005' ",
12744 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert statement 0006' "
12745 };
12746
12747 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12748
12749 for (std::size_t i = 0; i < expression_count; ++i)
12750 {
12751 T x = T(1);
12752 T y = T(2);
12753
12754 symbol_table_t symbol_table;
12755 expression_t expression;
12756 parser_t parser;
12757 assert_handler handler;
12758
12759 handler.assert_count = 0;
12760
12761 symbol_table.add_variable("x", x);
12762 symbol_table.add_variable("y", y);
12763 expression.register_symbol_table(symbol_table);
12764
12765 parser.register_assert_check(handler);
12766
12767 if (!parser.compile(expressions[i], expression))
12768 {
12769 printf("run_test22() - Error: %s\tExpression: %s [13]\n",
12770 parser.error().c_str(),
12771 expressions[i].c_str());
12772 result = false;
12773 continue;
12774 }
12775
12776 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12777
12778 typedef typename exprtk::expression_helper<T> et_t;
12779 type_sequence.push_back(et_t::e_assert);
12780 type_sequence.push_back(et_t::e_string);
12781
12782 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12783 {
12784 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [13]\n",
12785 expressions[i].c_str());
12786 result = false;
12787 continue;
12788 }
12789
12790 expression.value();
12791
12792 if (1 != handler.assert_count)
12793 {
12794 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [13]\n",
12795 static_cast<int>(handler.assert_count),
12796 expressions[i].c_str());
12797 result = false;
12798 continue;
12799 }
12800 }
12801 }
12802
12803 {
12804 const std::string expressions[] =
12805 {
12806 " assert(x > y); 'assert statement' + '0001' ",
12807 " assert(x > y, 'assert statement 2'); 'assert statement' + '0002' ",
12808 " assert(x > y, 'assert ' + 'statement 3'); 'assert statement' + '0003' ",
12809 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 'assert statement' + '0004' ",
12810 " assert(x > y, 'assert ' + 'statement 5'); 'assert statement' + '0005' ",
12811 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert statement' + '0006' "
12812 };
12813
12814 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12815
12816 for (std::size_t i = 0; i < expression_count; ++i)
12817 {
12818 T x = T(1);
12819 T y = T(2);
12820
12821 symbol_table_t symbol_table;
12822 expression_t expression;
12823 parser_t parser;
12824 assert_handler handler;
12825
12826 handler.assert_count = 0;
12827
12828 symbol_table.add_variable("x", x);
12829 symbol_table.add_variable("y", y);
12830 expression.register_symbol_table(symbol_table);
12831
12832 parser.register_assert_check(handler);
12833
12834 if (!parser.compile(expressions[i], expression))
12835 {
12836 printf("run_test22() - Error: %s\tExpression: %s [14]\n",
12837 parser.error().c_str(),
12838 expressions[i].c_str());
12839 result = false;
12840 continue;
12841 }
12842
12843 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12844
12845 typedef typename exprtk::expression_helper<T> et_t;
12846 type_sequence.push_back(et_t::e_assert);
12847 type_sequence.push_back(et_t::e_string);
12848
12849 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12850 {
12851 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [14]\n",
12852 expressions[i].c_str());
12853 result = false;
12854 continue;
12855 }
12856
12857 expression.value();
12858
12859 if (1 != handler.assert_count)
12860 {
12861 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [14]\n",
12862 static_cast<int>(handler.assert_count),
12863 expressions[i].c_str());
12864 result = false;
12865 continue;
12866 }
12867 }
12868 }
12869
12870 {
12871 const std::string expressions[] =
12872 {
12873 " assert(1 > 1); 1 + 0; "
12874 " assert(1 > 2, 'assert statement 2'); 2 + 0; "
12875 " assert(1 > 3, 'assert ' + 'statement 3'); 3 + 0; "
12876 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 4 + 0; "
12877 " assert(1 > 5, 'assert ' + 'statement 5'); 5 + 0 "
12878 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0; "
12879 };
12880
12881 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12882
12883 for (std::size_t i = 0; i < expression_count; ++i)
12884 {
12885 expression_t expression;
12886 parser_t parser;
12887 assert_handler handler;
12888
12889 handler.assert_count = 0;
12890
12891 parser.register_assert_check(handler);
12892
12893 if (!parser.compile(expressions[i], expression))
12894 {
12895 printf("run_test22() - Error: %s\tExpression: %s [15]\n",
12896 parser.error().c_str(),
12897 expressions[i].c_str());
12898 result = false;
12899 continue;
12900 }
12901
12902 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12903
12904 typedef typename exprtk::expression_helper<T> et_t;
12905 type_sequence.push_back(et_t::e_assert );
12906 type_sequence.push_back(et_t::e_assert );
12907 type_sequence.push_back(et_t::e_assert );
12908 type_sequence.push_back(et_t::e_assert );
12909 type_sequence.push_back(et_t::e_assert );
12910 type_sequence.push_back(et_t::e_assert );
12911 type_sequence.push_back(et_t::e_literal);
12912
12913 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12914 {
12915 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [15]\n",
12916 expressions[i].c_str());
12917 result = false;
12918 continue;
12919 }
12920
12921 expression.value();
12922
12923 if (6 != handler.assert_count)
12924 {
12925 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [15]\n",
12926 static_cast<int>(handler.assert_count),
12927 expressions[i].c_str());
12928 result = false;
12929 continue;
12930 }
12931 }
12932 }
12933
12934 {
12935 const std::string expressions[] =
12936 {
12937 " assert(1 > 1); 'assert' + '01'; "
12938 " assert(1 > 2, 'assert statement 2'); 'assert' + '02'; "
12939 " assert(1 > 3, 'assert ' + 'statement 3'); 'assert' + '03'; "
12940 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 'assert' + '04'; "
12941 " assert(1 > 5, 'assert ' + 'statement 5'); 'assert' + '05'; "
12942 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert' + '06'; "
12943 };
12944
12945 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12946
12947 for (std::size_t i = 0; i < expression_count; ++i)
12948 {
12949 expression_t expression;
12950 parser_t parser;
12951 assert_handler handler;
12952
12953 handler.assert_count = 0;
12954
12955 parser.register_assert_check(handler);
12956
12957 if (!parser.compile(expressions[i], expression))
12958 {
12959 printf("run_test22() - Error: %s\tExpression: %s [16]\n",
12960 parser.error().c_str(),
12961 expressions[i].c_str());
12962 result = false;
12963 continue;
12964 }
12965
12966 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12967
12968 typedef typename exprtk::expression_helper<T> et_t;
12969 type_sequence.push_back(et_t::e_assert);
12970 type_sequence.push_back(et_t::e_assert);
12971 type_sequence.push_back(et_t::e_assert);
12972 type_sequence.push_back(et_t::e_assert);
12973 type_sequence.push_back(et_t::e_assert);
12974 type_sequence.push_back(et_t::e_assert);
12975 type_sequence.push_back(et_t::e_string);
12976
12977 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12978 {
12979 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [16]\n",
12980 expressions[i].c_str());
12981 result = false;
12982 continue;
12983 }
12984
12985 expression.value();
12986
12987 if (6 != handler.assert_count)
12988 {
12989 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [16]\n",
12990 static_cast<int>(handler.assert_count),
12991 expressions[i].c_str());
12992 result = false;
12993 continue;
12994 }
12995 }
12996 }
12997
12998 {
12999 const std::string expressions[] =
13000 {
13001 " assert(x > y); x + y + 1; "
13002 " assert(x > y, 'assert statement 2'); x + y + 1; "
13003 " assert(x > y, 'assert ' + 'statement 3'); x + y + 1; "
13004 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); x + y + 1; "
13005 " assert(x > y, 'assert ' + 'statement 5'); x + y + 1; "
13006 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); x + y + 1; "
13007 };
13008
13009 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
13010
13011 for (std::size_t i = 0; i < expression_count; ++i)
13012 {
13013 T x = T(1);
13014 T y = T(2);
13015
13016 symbol_table_t symbol_table;
13017 expression_t expression;
13018 parser_t parser;
13019 assert_handler handler;
13020
13021 handler.assert_count = 0;
13022
13023 symbol_table.add_variable("x", x);
13024 symbol_table.add_variable("y", y);
13025 expression.register_symbol_table(symbol_table);
13026
13027 parser.register_assert_check(handler);
13028
13029 if (!parser.compile(expressions[i], expression))
13030 {
13031 printf("run_test22() - Error: %s\tExpression: %s [17]\n",
13032 parser.error().c_str(),
13033 expressions[i].c_str());
13034 result = false;
13035 continue;
13036 }
13037
13038 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
13039
13040 typedef typename exprtk::expression_helper<T> et_t;
13041 type_sequence.push_back(et_t::e_assert);
13042 type_sequence.push_back(et_t::e_assert);
13043 type_sequence.push_back(et_t::e_assert);
13044 type_sequence.push_back(et_t::e_assert);
13045 type_sequence.push_back(et_t::e_assert);
13046 type_sequence.push_back(et_t::e_assert);
13047 type_sequence.push_back(et_t::e_sf3ext);
13048
13049 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
13050 {
13051 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [17]\n",
13052 expressions[i].c_str());
13053 result = false;
13054 continue;
13055 }
13056
13057 expression.value();
13058
13059 if (6 != handler.assert_count)
13060 {
13061 printf("run_test22() - Error: Invalid assert count of %d expected 6. Expression: %s [17]\n",
13062 static_cast<int>(handler.assert_count),
13063 expressions[i].c_str());
13064 result = false;
13065 continue;
13066 }
13067 }
13068 }
13069
13070 {
13071 const std::string expressions[] =
13072 {
13073 " assert(x > y); 'assert' + ((x < y) ? '01' : 'XYZ'); "
13074 " assert(x > y, 'assert statement 2'); 'assert' + ((x < y) ? '02' : 'XYZ'); "
13075 " assert(x > y, 'assert ' + 'statement 3'); 'assert' + ((x < y) ? '03' : 'XYZ'); "
13076 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 'assert' + ((x < y) ? '04' : 'XYZ'); "
13077 " assert(x > y, 'assert ' + 'statement 5'); 'assert' + ((x < y) ? '05' : 'XYZ'); "
13078 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert' + ((x < y) ? '06' : 'XYZ'); "
13079 };
13080
13081 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
13082
13083 for (std::size_t i = 0; i < expression_count; ++i)
13084 {
13085 T x = T(1);
13086 T y = T(2);
13087
13088 symbol_table_t symbol_table;
13089 expression_t expression;
13090 parser_t parser;
13091 assert_handler handler;
13092
13093 handler.assert_count = 0;
13094
13095 symbol_table.add_variable("x", x);
13096 symbol_table.add_variable("y", y);
13097 expression.register_symbol_table(symbol_table);
13098
13099 parser.register_assert_check(handler);
13100
13101 if (!parser.compile(expressions[i], expression))
13102 {
13103 printf("run_test22() - Error: %s\tExpression: %s [18]\n",
13104 parser.error().c_str(),
13105 expressions[i].c_str());
13106 result = false;
13107 continue;
13108 }
13109
13110 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
13111
13112 typedef typename exprtk::expression_helper<T> et_t;
13113 type_sequence.push_back(et_t::e_assert);
13114 type_sequence.push_back(et_t::e_assert);
13115 type_sequence.push_back(et_t::e_assert);
13116 type_sequence.push_back(et_t::e_assert);
13117 type_sequence.push_back(et_t::e_assert);
13118 type_sequence.push_back(et_t::e_assert);
13119 type_sequence.push_back(et_t::e_string);
13120
13121 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
13122 {
13123 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [18]\n",
13124 expressions[i].c_str());
13125 result = false;
13126 continue;
13127 }
13128
13129 expression.value();
13130
13131 if (6 != handler.assert_count)
13132 {
13133 printf("run_test22() - Error: Invalid assert count of %d expected 6. Expression: %s [18]\n",
13134 static_cast<int>(handler.assert_count),
13135 expressions[i].c_str());
13136 result = false;
13137 continue;
13138 }
13139 }
13140 }
13141
13142 {
13143 typedef std::pair<std::string,std::size_t> exprpack_t;
13144
13145 const exprpack_t expression_list[] =
13146 {
13147 exprpack_t("var x := 1;", 1 * sizeof(T) ),
13148 exprpack_t("var x := 1; var y := 2;", 2 * sizeof(T) ),
13149 exprpack_t("var x := 1; var y := 2; var z := 2;", 3 * sizeof(T) ),
13150
13151 exprpack_t("const var x := 1;", 1 * sizeof(T) ),
13152 exprpack_t("const var x := 1; const var y := 2;", 2 * sizeof(T) ),
13153 exprpack_t("const var x := 1; const var y := 2; const var z := 2;", 3 * sizeof(T) ),
13154
13155 exprpack_t("const var x := 1;", 1 * sizeof(T) ),
13156 exprpack_t("const var x := 1; var y := 2;", 2 * sizeof(T) ),
13157 exprpack_t("const var x := 1; var y := 2; const var z := 2;", 3 * sizeof(T) ),
13158
13159 exprpack_t("var x := 1;", 1 * sizeof(T) ),
13160 exprpack_t("var x := 1; const var y := 2;", 2 * sizeof(T) ),
13161 exprpack_t("var x := 1; const var y := 2; var z := 2;", 3 * sizeof(T) ),
13162
13163 exprpack_t("var x;", 1 * sizeof(T) ),
13164 exprpack_t("var x; var y;", 2 * sizeof(T) ),
13165 exprpack_t("var x; var y; var z;", 3 * sizeof(T) ),
13166
13167 exprpack_t("var v[10];", 10 * sizeof(T) ),
13168 exprpack_t("var v[10]; var w[20];", 30 * sizeof(T) ),
13169 exprpack_t("var v[10]; var w[20]; var u[20];", 50 * sizeof(T) ),
13170
13171 exprpack_t("var x := 1; var v[10];", 11 * sizeof(T) ),
13172 exprpack_t("var x := 1; var y := 2; var v[10];", 12 * sizeof(T) ),
13173 exprpack_t("var x := 1; var y := 2; var z := 2; var v[10];", 13 * sizeof(T) ),
13174
13175 exprpack_t("var x := 1; if (x > 2) { var a := x + 1; };", 2 * sizeof(T) ),
13176 exprpack_t("var x := 1; var y := 2; if (x > 2) { var a := x + 1; };", 3 * sizeof(T) ),
13177 exprpack_t("var x := 1; var y := 2; var z := 2; if (x > 2) { var a := x + 1; };", 4 * sizeof(T) ),
13178
13179 exprpack_t("var x := 1; if (x > 2) { var a[10] := [x + 1]; };", 11 * sizeof(T) ),
13180 exprpack_t("var x := 1; var y := 2; if (x > 2) { var a[10] := [x + 1]; };", 12 * sizeof(T) ),
13181 exprpack_t("var x := 1; var y := 2; var z := 2; if (x > 2) { var a[10] := [x + 1]; };", 13 * sizeof(T) ),
13182
13183 exprpack_t("var x := 1; if (x > 2) { var a := x + 1; } else { var a := x + 2; };", 2 * sizeof(T) ),
13184 exprpack_t("var x := 1; var y := 2; if (x > 2) { var a := x + 1; } else { var a := x + 2; };", 3 * sizeof(T) ),
13185 exprpack_t("var x := 1; var y := 2; var z := 2; if (x > 2) { var a := x + 1; } else { var a := x + 2; };", 4 * sizeof(T) ),
13186
13187 exprpack_t("var x := 1; if (x > 2) { var a := x + 1; } else { var a := x + 2; var b := a; };", 3 * sizeof(T) ),
13188 exprpack_t("var x := 1; var y := 2; if (x > 2) { var a := x + 1; } else { var a := x + 2; var b := a; };", 4 * sizeof(T) ),
13189 exprpack_t("var x := 1; var y := 2; var z := 2; if (x > 2) { var a := x + 1; } else { var a := x + 2; var b := a; };", 5 * sizeof(T) ),
13190
13191 exprpack_t("var v[10]; v[7] + 1;", 10 * sizeof(T) ),
13192 };
13193
13194 const std::size_t expression_list_size = sizeof(expression_list) / sizeof(exprpack_t);
13195
13196 for (std::size_t i = 0; i < expression_list_size; ++i)
13197 {
13198 const exprpack_t& exprpack = expression_list[i];
13199
13200 expression_t expression;
13201 parser_t parser;
13202
13203 if (!parser.compile(exprpack.first, expression))
13204 {
13205 printf("run_test22() - Error: Max expression/vector size check. Diag: %s Expression: %s [01]\n",
13206 parser.error().c_str(),
13207 exprpack.first.c_str());
13208
13209 result = false;
13210 continue;
13211 }
13212
13213 if (parser.total_local_symbol_size_bytes() != exprpack.second)
13214 {
13215 printf("run_test22() - Error: Mismatch in expected expression size. Expected size: %d instead got: %d "
13216 "Expression: %s [02]\n",
13217 static_cast<int>(exprpack.second),
13218 static_cast<int>(parser.total_local_symbol_size_bytes()),
13219 exprpack.first.c_str());
13220
13221 result = false;
13222 continue;
13223 }
13224 }
13225 }
13226
13227 {
13228 typedef std::pair<std::string,std::size_t> exprpack_t;
13229
13230 const exprpack_t expression_list[] =
13231 {
13232 exprpack_t("var x := 1;", 0 * sizeof(T) ),
13233 exprpack_t("var x := 1; var y := 1;", 1 * sizeof(T) ),
13234 exprpack_t("var x := 1; var y := 1; var z := 1;", 2 * sizeof(T) ),
13235
13236 exprpack_t("var x;", 0 * sizeof(T) ),
13237 exprpack_t("var x; var y;", 1 * sizeof(T) ),
13238 exprpack_t("var x; var y; var z;", 2 * sizeof(T) ),
13239
13240 exprpack_t("var x{};", 0 * sizeof(T) ),
13241 exprpack_t("var x{}; var y{};", 1 * sizeof(T) ),
13242 exprpack_t("var x{}; var y{}; var z{};", 2 * sizeof(T) ),
13243
13244 exprpack_t("const var x := 1;", 0 * sizeof(T) ),
13245 exprpack_t("const var x := 1; const var y := 1;", 1 * sizeof(T) ),
13246 exprpack_t("const var x := 1; const var y := 1; const var z := 1;", 2 * sizeof(T) ),
13247
13248 exprpack_t("const var x := 1;", 0 * sizeof(T) ),
13249 exprpack_t("const var x := 1; var y := 1;", 1 * sizeof(T) ),
13250 exprpack_t("const var x := 1; var y := 1; const var z := 1;", 2 * sizeof(T) ),
13251
13252 exprpack_t("var x := 1;", 0 * sizeof(T) ),
13253 exprpack_t("var x := 1; const var y := 1;", 1 * sizeof(T) ),
13254 exprpack_t("var x := 1; const var y := 1; var z := 1;", 2 * sizeof(T) ),
13255
13256 exprpack_t("var v[10];", 9 * sizeof(T) ),
13257 exprpack_t("var x := 1; var v[10];", 10 * sizeof(T) ),
13258 exprpack_t("var x := 1; var y := 2; var v[10];", 11 * sizeof(T) ),
13259 exprpack_t("var x := 1; var y := 2; var z := 2; var v[10];", 12 * sizeof(T) ),
13260 };
13261
13262 const std::size_t expression_list_size = sizeof(expression_list) / sizeof(exprpack_t);
13263
13264 for (std::size_t i = 0; i < expression_list_size; ++i)
13265 {
13266 const exprpack_t& exprpack = expression_list[i];
13267
13268 expression_t expression;
13269 parser_t parser;
13270
13271 parser.settings().set_max_total_local_symbol_size_bytes(exprpack.second);
13272 parser.settings().set_max_local_vector_size(exprpack.second / sizeof(T));
13273
13274 if (parser.compile(exprpack.first, expression))
13275 {
13276 printf("run_test22() - Error: Expected the expression to fail compilation due to size check. Expression: %s [03]\n",
13277 exprpack.first.c_str());
13278
13279 result = false;
13280 continue;
13281 }
13282
13283 if (parser.total_local_symbol_size_bytes() != 0)
13284 {
13285 printf("run_test22() - Error: Expected zero size expression, instead got: %d "
13286 "Expression: %s [02]\n",
13287 static_cast<int>(parser.total_local_symbol_size_bytes()),
13288 exprpack.first.c_str());
13289
13290 result = false;
13291 continue;
13292 }
13293 }
13294 }
13295
13296 {
13297 expression_t expression;
13298 parser_t parser;
13299
13300 parser.settings().set_max_total_local_symbol_size_bytes(100);
13301 parser.settings().set_max_local_vector_size(200);
13302
13303 const std::string expression_str = "var x := 1;";
13304
13305 if (parser.compile(expression_str, expression))
13306 {
13307 printf("run_test22() - Error: Expected the expression to fail compilation due to size check. Expression: %s [04]\n",
13308 expression_str.c_str());
13309
13310 result = false;
13311 }
13312 }
13313
13314 return result;
13315}

References assert_handler::assert_count, expression_list, and expression_list_size.

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