arithmetic_tests.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*=============================================================================
  2. Copyright (c) 2001-2007 Joel de Guzman
  3. Copyright (c) 2015 John Fletcher
  4. Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. ==============================================================================*/
  7. #include <boost/core/lightweight_test.hpp>
  8. #include <boost/phoenix/core.hpp>
  9. #include <boost/phoenix/operator.hpp>
  10. #include <boost/bind.hpp>
  11. namespace phoenix = boost::phoenix;
  12. int
  13. main()
  14. {
  15. using phoenix::ref;
  16. using phoenix::val;
  17. {
  18. int x = 123;
  19. BOOST_TEST((ref(x) += 456)() == (123 + 456));
  20. BOOST_TEST(x == 123 + 456);
  21. BOOST_TEST((ref(x) -= 456)() == 123);
  22. BOOST_TEST(x == 123);
  23. BOOST_TEST((ref(x) *= 456)() == 123 * 456);
  24. BOOST_TEST(x == 123 * 456);
  25. BOOST_TEST((ref(x) /= 456)() == 123);
  26. BOOST_TEST(x == 123);
  27. int& r1 = (ref(x) += 456)(); // should be an lvalue
  28. int& r2 = (ref(x) -= 456)(); // should be an lvalue
  29. int& r3 = (ref(x) *= 456)(); // should be an lvalue
  30. int& r4 = (ref(x) /= 456)(); // should be an lvalue
  31. BOOST_TEST(r1 == 123 && r2 == 123 && r3 == 123 && r4 == 123);
  32. BOOST_TEST((ref(x) %= 456)() == 123 % 456);
  33. BOOST_TEST(x == 123 % 456);
  34. }
  35. {
  36. BOOST_TEST((-val(123))() == -123);
  37. BOOST_TEST((val(123) + 456)() == 123 + 456);
  38. BOOST_TEST((val(123) - 456)() == 123 - 456);
  39. BOOST_TEST((val(123) * 456)() == 123 * 456);
  40. BOOST_TEST((val(123) / 456)() == 123 / 456);
  41. BOOST_TEST((val(123) % 456)() == 123 % 456);
  42. BOOST_TEST((123 + val(456))() == 123 + 456);
  43. BOOST_TEST((123 - val(456))() == 123 - 456);
  44. BOOST_TEST((123 * val(456))() == 123 * 456);
  45. BOOST_TEST((123 / val(456))() == 123 / 456);
  46. BOOST_TEST((123 % val(456))() == 123 % 456);
  47. }
  48. {
  49. // Testcase contributed from Philipp Reh, failed in Phoenix V2
  50. using boost::phoenix::arg_names::arg1;
  51. using boost::phoenix::arg_names::arg2;
  52. int x[2];
  53. BOOST_TEST((&arg1 - &arg2)(x[0], x[1]) == &x[0] - &x[1]);
  54. BOOST_TEST((arg1 - arg2)(&x[0], &x[1]) == &x[0] - &x[1]);
  55. }
  56. return boost::report_errors();
  57. }