From db5f016146854f2198dcc049b0b4fd812fa6c42a Mon Sep 17 00:00:00 2001 From: Zach Laine Date: Sat, 12 Nov 2016 03:13:38 -0600 Subject: [PATCH] Update user_expression_transform test to highlight an error in transform matching. --- test/user_expression_transform.cpp | 72 +++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 12 deletions(-) diff --git a/test/user_expression_transform.cpp b/test/user_expression_transform.cpp index e385072..56e747e 100644 --- a/test/user_expression_transform.cpp +++ b/test/user_expression_transform.cpp @@ -17,12 +17,18 @@ namespace user_2 { struct number { double value; + + friend number operator+ (number lhs, number rhs) + { return number{lhs.value + rhs.value}; } + + friend number operator* (number lhs, number rhs) + { return number{lhs.value * rhs.value}; } }; number naxpy (number a, number x, number y) { return number{a.value * x.value + y.value + 100.0}; } -#if 0 +#if 0 // TODO: Document this verbose form. auto eval_expression_as ( bp17::expression< bp17::expr_kind::plus, @@ -42,7 +48,8 @@ namespace user_2 { expr.elements[1_c].elements[0_c] ); } -#else +#endif + auto eval_expression_as ( decltype(term{{0.0}} * number{} + number{}) const & expr, boost::hana::basic_type, @@ -54,25 +61,69 @@ namespace user_2 { expr.right().value() ); } -#endif } TEST(user_expression_transform, test_user_expression_transform) { + term k{{2.0}}; + term a{{1.0}}; term x{{42.0}}; term y{{3.0}}; - bp17::expression< - bp17::expr_kind::plus, + { + bp17::expression< + bp17::expr_kind::plus, + bp17::expression< + bp17::expr_kind::multiplies, + bp17::expression< + bp17::expr_kind::multiplies, + term, + term + >, + term + >, + term + > expr = k * a * x + y; + + user_2::number result = expr; + EXPECT_EQ(result.value, 87); + } + + { + bp17::expression< + bp17::expr_kind::plus, + bp17::expression< + bp17::expr_kind::multiplies, + term, + term + >, + term + > expr = a * x + y; + + user_2::number result = expr; + EXPECT_EQ(result.value, 145); + } + + { bp17::expression< bp17::expr_kind::multiplies, term, - term - >, - term - > expr = a * x + y; + bp17::expression< + bp17::expr_kind::plus, + bp17::expression< + bp17::expr_kind::multiplies, + term, + term + >, + term + > + > expr = k * (a * x + y); + + user_2::number result = expr; + EXPECT_EQ(result.value, 290); + } // TODO: This was an error (user:: vs. user_2::). Document for users that // they should catch an expression in an auto var to diagnose these sorts @@ -84,7 +135,4 @@ TEST(user_expression_transform, test_user_expression_transform) term > expr = a * x; #endif - - user_2::number result = expr; - EXPECT_EQ(result.value, 145); }