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

Go to the source code of this file.

Classes

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

Macros

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

Typedefs

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

Variables

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

Macro Definition Documentation

◆ define_free_functions

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

Definition at line 3723 of file exprtk_mpfr_test.cpp.

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

◆ exprtk_test_delete

#define exprtk_test_delete

Definition at line 46 of file exprtk_mpfr_test.cpp.

◆ exprtk_test_final

#define exprtk_test_final

Definition at line 45 of file exprtk_mpfr_test.cpp.

◆ exprtk_test_override

#define exprtk_test_override

Definition at line 44 of file exprtk_mpfr_test.cpp.

◆ pb [1/4]

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

◆ pb [2/4]

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

◆ pb [3/4]

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

◆ pb [4/4]

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

◆ perform_test

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

Typedef Documentation

◆ numeric_type

typedef mpfr::mpreal numeric_type

Definition at line 37 of file exprtk_mpfr_test.cpp.

◆ test_t

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

Definition at line 49 of file exprtk_mpfr_test.cpp.

Function Documentation

◆ clamp()

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

Definition at line 3237 of file exprtk_mpfr_test.cpp.

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

◆ foo1()

numeric_type foo1 ( numeric_type  v0)
inline

Definition at line 3731 of file exprtk_mpfr_test.cpp.

Referenced by run_test09(), and run_test18().

Here is the caller graph for this function:

◆ foo2()

numeric_type foo2 ( numeric_type  v0,
numeric_type  v1 
)
inline

Definition at line 3731 of file exprtk_mpfr_test.cpp.

Referenced by run_test09(), and run_test18().

Here is the caller graph for this function:

◆ foo3()

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

Definition at line 3731 of file exprtk_mpfr_test.cpp.

Referenced by run_test09(), and run_test18().

Here is the caller graph for this function:

◆ foo4()

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

Definition at line 3731 of file exprtk_mpfr_test.cpp.

Referenced by run_test09(), and run_test18().

Here is the caller graph for this function:

◆ foo5()

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

Definition at line 3731 of file exprtk_mpfr_test.cpp.

Referenced by run_test09(), and run_test18().

Here is the caller graph for this function:

◆ foo6()

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

Definition at line 3731 of file exprtk_mpfr_test.cpp.

Referenced by run_test09(), and run_test18().

Here is the caller graph for this function:

◆ load_expressions()

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

Definition at line 5560 of file exprtk_mpfr_test.cpp.

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

Referenced by run_test14().

Here is the caller graph for this function:

◆ main()

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

Definition at line 12611 of file exprtk_mpfr_test.cpp.

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

References perform_test.

◆ not_equal()

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

Definition at line 1144 of file exprtk_mpfr_test.cpp.

1146{
1147 return not_equal_impl(t0,t1,epsilon);
1148}
bool not_equal_impl(const T &t1, const T &t2, const T &epsilon=0.000000000001)

References not_equal_impl().

Referenced by run_test01(), run_test02(), run_test04(), run_test05(), run_test06(), run_test07(), run_test09(), run_test10(), 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.000000000001 
)
inline

Definition at line 1132 of file exprtk_mpfr_test.cpp.

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

Referenced by 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 10256 of file exprtk_mpfr_test.cpp.

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

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

Referenced by run_test21().

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

◆ results_to_string()

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

Definition at line 10226 of file exprtk_mpfr_test.cpp.

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

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

Here is the call graph for this function:

◆ run_test00()

template<typename T >
bool run_test00 ( )
inline

Definition at line 1242 of file exprtk_mpfr_test.cpp.

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

References global_test_list, global_test_list_size, and rounds.

◆ run_test01()

template<typename T >
bool run_test01 ( )
inline

Definition at line 1321 of file exprtk_mpfr_test.cpp.

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

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

Here is the call graph for this function:

◆ run_test02()

template<typename T >
bool run_test02 ( )
inline

Definition at line 2098 of file exprtk_mpfr_test.cpp.

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

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

Here is the call graph for this function:

◆ run_test03()

template<typename T >
bool run_test03 ( )
inline

Definition at line 2939 of file exprtk_mpfr_test.cpp.

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

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

Here is the call graph for this function:

◆ run_test04()

template<typename T >
bool run_test04 ( )
inline

Definition at line 3243 of file exprtk_mpfr_test.cpp.

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

Definition at line 3300 of file exprtk_mpfr_test.cpp.

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

Definition at line 3372 of file exprtk_mpfr_test.cpp.

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

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

Here is the call graph for this function:

◆ run_test07()

template<typename T >
bool run_test07 ( )
inline

Definition at line 3421 of file exprtk_mpfr_test.cpp.

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

References exprtk::symbol_table< T >::add_variable(), exprtk::parser< T >::compile(), delta, 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 ( )
inline

Definition at line 3522 of file exprtk_mpfr_test.cpp.

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

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

Here is the call graph for this function:

◆ run_test09()

template<typename T >
bool run_test09 ( )
inline

Definition at line 3735 of file exprtk_mpfr_test.cpp.

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

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

Here is the call graph for this function:

◆ run_test10()

template<typename T >
bool run_test10 ( )
inline

Definition at line 3881 of file exprtk_mpfr_test.cpp.

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

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

Here is the call graph for this function:

◆ run_test11()

template<typename T >
bool run_test11 ( )
inline

Definition at line 5215 of file exprtk_mpfr_test.cpp.

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

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

Here is the call graph for this function:

◆ run_test12()

template<typename T >
bool run_test12 ( )
inline

Definition at line 5287 of file exprtk_mpfr_test.cpp.

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

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

Here is the call graph for this function:

◆ run_test13()

template<typename T >
bool run_test13 ( )
inline

Definition at line 5416 of file exprtk_mpfr_test.cpp.

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

References rounds.

◆ run_test14()

template<typename T >
bool run_test14 ( )
inline

Definition at line 5587 of file exprtk_mpfr_test.cpp.

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

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

Here is the call graph for this function:

◆ run_test15()

template<typename T >
bool run_test15 ( )
inline

Definition at line 5701 of file exprtk_mpfr_test.cpp.

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

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

Here is the call graph for this function:

◆ run_test16()

template<typename T >
bool run_test16 ( )
inline

Definition at line 5821 of file exprtk_mpfr_test.cpp.

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

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

Here is the call graph for this function:

◆ run_test17()

template<typename T >
bool run_test17 ( )
inline

Definition at line 5959 of file exprtk_mpfr_test.cpp.

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

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

Here is the call graph for this function:

◆ run_test18()

template<typename T >
bool run_test18 ( )
inline

Definition at line 6426 of file exprtk_mpfr_test.cpp.

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

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

Here is the call graph for this function:

◆ run_test19()

template<typename T >
bool run_test19 ( )
inline

Definition at line 8443 of file exprtk_mpfr_test.cpp.

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

References expression_list, not_equal(), and rounds.

Here is the call graph for this function:

◆ run_test20()

template<typename T >
bool run_test20 ( )
inline

Definition at line 9926 of file exprtk_mpfr_test.cpp.

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

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

Here is the call graph for this function:

◆ run_test21()

template<typename T >
bool run_test21 ( )
inline

Definition at line 10324 of file exprtk_mpfr_test.cpp.

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

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

Here is the call graph for this function:

◆ run_test22()

template<typename T >
bool run_test22 ( )
inline

Definition at line 11520 of file exprtk_mpfr_test.cpp.

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

References assert_handler::assert_count.

◆ test_expression()

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

Definition at line 1151 of file exprtk_mpfr_test.cpp.

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

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_mpfr_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.15193942371376191362472354210675542022),
441 test_t("+3.3^2.2^1.1",17.15193942371376191362472354210675542022),
442 test_t("3.3^+2.2^1.1",17.15193942371376191362472354210675542022),
443 test_t("3.3^2.2^+1.1",17.15193942371376191362472354210675542022),
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.48946876053338489126547661922171945249366318331656582663329188))",1.0),
998 test_t("equal((pi^(2.2^3.3)),(pi^13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
999 test_t("equal((2.2*pi^2.2^3.3),2.2*(pi^13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1000 test_t("equal((pi^2.2^3.3*2),2*(pi^13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1001 test_t("equal((pi^2.2^3.3/2.2),(pi^13.48946876053338489126547661922171945249366318331656582663329188)/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.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1015 test_t("equal((-pi^(2.2^3.3)),(-pi^13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1016 test_t("equal((2.2*-pi^2.2^3.3),2.2*(-pi^13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1017 test_t("equal((-pi^2.2^3.3*2),2*(-pi^13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1018 test_t("equal((-pi^2.2^3.3/2.2),(-pi^13.48946876053338489126547661922171945249366318331656582663329188)/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.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1032 test_t("equal((+pi^(+2.2^+3.3)),(+pi^+13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1033 test_t("equal((+2.2*+pi^+2.2^+3.3),+2.2*(+pi^+13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1034 test_t("equal((+pi^+2.2^+3.3*+2),+2*(+pi^+13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1035 test_t("equal((+pi^+2.2^+3.3/+2.2),(+pi^+13.48946876053338489126547661922171945249366318331656582663329188)/+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.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1049 test_t("equal((-pi^(2.2^3.3)),(-pi^+13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1050 test_t("equal((+2.2*-pi^+2.2^+3.3),2.2*(-pi^+13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1051 test_t("equal((-pi^+2.2^+3.3*2),2*(-pi^+13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1052 test_t("equal((-pi^+2.2^+3.3/+2.2),(-pi^+13.48946876053338489126547661922171945249366318331656582663329188)/+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_mpfr_test.cpp.

Referenced by run_test00().