laws.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // Copyright Louis Dionne 2013-2017
  2. // Distributed under the Boost Software License, Version 1.0.
  3. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
  4. #include <boost/hana/bool.hpp>
  5. #include <boost/hana/optional.hpp>
  6. #include <boost/hana/tuple.hpp>
  7. #include <laws/applicative.hpp>
  8. #include <laws/base.hpp>
  9. #include <laws/comparable.hpp>
  10. #include <laws/foldable.hpp>
  11. #include <laws/functor.hpp>
  12. #include <laws/monad.hpp>
  13. #include <laws/monad_plus.hpp>
  14. #include <laws/orderable.hpp>
  15. #include <laws/searchable.hpp>
  16. namespace hana = boost::hana;
  17. using hana::test::ct_eq;
  18. using hana::test::ct_ord;
  19. int main() {
  20. auto ords = hana::make_tuple(
  21. hana::nothing,
  22. hana::just(ct_ord<0>{}),
  23. hana::just(ct_ord<1>{}),
  24. hana::just(ct_ord<2>{})
  25. );
  26. auto eqs = hana::make_tuple(
  27. hana::nothing,
  28. hana::just(ct_eq<0>{}),
  29. hana::just(ct_eq<1>{}),
  30. hana::just(ct_eq<2>{})
  31. );
  32. auto eq_values = hana::make_tuple(ct_eq<0>{}, ct_eq<2>{}, ct_eq<3>{});
  33. auto predicates = hana::make_tuple(
  34. hana::equal.to(ct_eq<0>{}),
  35. hana::equal.to(ct_eq<2>{}),
  36. hana::equal.to(ct_eq<3>{}),
  37. hana::always(hana::false_c),
  38. hana::always(hana::true_c)
  39. );
  40. auto nested_eqs = hana::make_tuple(
  41. hana::nothing,
  42. hana::just(hana::just(ct_eq<0>{})),
  43. hana::just(hana::nothing),
  44. hana::just(hana::just(ct_eq<2>{}))
  45. );
  46. hana::test::TestComparable<hana::optional_tag>{eqs};
  47. hana::test::TestOrderable<hana::optional_tag>{ords};
  48. hana::test::TestFunctor<hana::optional_tag>{eqs, eq_values};
  49. hana::test::TestApplicative<hana::optional_tag>{eqs};
  50. hana::test::TestMonad<hana::optional_tag>{eqs, nested_eqs};
  51. hana::test::TestMonadPlus<hana::optional_tag>{eqs, predicates, eq_values};
  52. hana::test::TestSearchable<hana::optional_tag>{eqs, eq_values};
  53. hana::test::TestSearchable<hana::optional_tag>{
  54. hana::make_tuple(
  55. hana::just(hana::true_c),
  56. hana::just(hana::false_c),
  57. hana::nothing
  58. ),
  59. hana::make_tuple(hana::true_c, hana::false_c)
  60. };
  61. hana::test::TestFoldable<hana::optional_tag>{eqs};
  62. }