1// Copyright (C) 2016-2018 T. Zachary Laine
2//
3// Distributed under the Boost Software License, Version 1.0. (See
4// accompanying file LICENSE_1_0.txt or copy at
5// http://www.boost.org/LICENSE_1_0.txt)
6#include <boost/yap/expression.hpp>
7
8#include <boost/core/lightweight_test.hpp>
9
10
11template<typename T>
12using term = boost::yap::terminal<boost::yap::expression, T>;
13
14template<typename T>
15using ref = boost::yap::expression_ref<boost::yap::expression, T>;
16
17namespace yap = boost::yap;
18namespace bh = boost::hana;
19
20
21int main()
22{
23 {
24 term<double> unity{1.0};
25 int i_ = 42;
26 term<int &&> i{std::move(i_)};
27 yap::expression<
28 yap::expr_kind::minus,
29 bh::tuple<ref<term<double> &>, term<int &&>>>
30 expr = unity - std::move(i);
31 yap::expression<
32 yap::expr_kind::plus,
33 bh::tuple<
34 ref<term<double> &>,
35 yap::expression<
36 yap::expr_kind::minus,
37 bh::tuple<ref<term<double> &>, term<int &&>>>>>
38 unevaluated_expr_1 = unity + std::move(expr);
39
40 yap::expression<
41 yap::expr_kind::plus,
42 bh::tuple<ref<term<double> &>, ref<term<double> &>>>
43 unevaluated_expr_2 = unity + unity;
44
45 term<double> const const_unity{1.0};
46 yap::expression<
47 yap::expr_kind::plus,
48 bh::tuple<ref<term<double> &>, ref<term<double> const &>>>
49 unevaluated_expr_3 = unity + const_unity;
50
51 {
52 double result = evaluate(expr&: unity);
53 BOOST_TEST(result == 1);
54 }
55
56 {
57 double result = evaluate(expr);
58 BOOST_TEST(result == -41);
59 }
60
61 {
62 double result = evaluate(expr&: unevaluated_expr_1);
63 BOOST_TEST(result == -40);
64 }
65
66 {
67 double result = evaluate(expr&: unevaluated_expr_2);
68 BOOST_TEST(result == 2);
69 }
70
71 {
72 double result = evaluate(expr&: unevaluated_expr_3);
73 BOOST_TEST(result == 2);
74 }
75
76 {
77 double result = evaluate(expr&: unity, t: 5, t: 6, t: 7);
78 BOOST_TEST(result == 1);
79 }
80
81 {
82 double result = evaluate(expr);
83 BOOST_TEST(result == -41);
84 }
85
86 {
87 double result = evaluate(expr&: unevaluated_expr_1, t: std::string("15"));
88 BOOST_TEST(result == -40);
89 }
90
91 {
92 double result = evaluate(expr&: unevaluated_expr_2, t: std::string("15"));
93 BOOST_TEST(result == 2);
94 }
95
96 {
97 double result = evaluate(expr&: unevaluated_expr_3, t: std::string("15"));
98 BOOST_TEST(result == 2);
99 }
100 }
101
102 return boost::report_errors();
103}
104

source code of boost/libs/yap/test/default_eval.cpp