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)
5 #ifndef BOOST_HANA_TEST_AUTO_GROUP_HPP
6 #define BOOST_HANA_TEST_AUTO_GROUP_HPP
8 #include <boost/hana/assert.hpp>
9 #include <boost/hana/equal.hpp>
10 #include <boost/hana/group.hpp>
12 #include "test_case.hpp"
13 #include <laws/base.hpp>
14 #include <support/equivalence_class.hpp>
17 TestCase test_group{[]{
18 namespace hana = boost::hana;
19 using hana::test::ct_eq;
23 // Test without a custom predicate
25 BOOST_HANA_CONSTANT_CHECK(hana::equal(
26 hana::group(MAKE_TUPLE()),
30 BOOST_HANA_CONSTANT_CHECK(hana::equal(
31 hana::group(MAKE_TUPLE(ct_eq<0>{})),
33 MAKE_TUPLE(ct_eq<0>{}))
36 BOOST_HANA_CONSTANT_CHECK(hana::equal(
37 hana::group(MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{})),
39 MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{}))
41 BOOST_HANA_CONSTANT_CHECK(hana::equal(
42 hana::group(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})),
44 MAKE_TUPLE(ct_eq<0>{}),
45 MAKE_TUPLE(ct_eq<1>{}))
48 BOOST_HANA_CONSTANT_CHECK(hana::equal(
49 hana::group(MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{}, ct_eq<0>{})),
51 MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{}, ct_eq<0>{}))
53 BOOST_HANA_CONSTANT_CHECK(hana::equal(
54 hana::group(MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{}, ct_eq<1>{})),
56 MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{}),
57 MAKE_TUPLE(ct_eq<1>{}))
59 BOOST_HANA_CONSTANT_CHECK(hana::equal(
60 hana::group(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<0>{})),
62 MAKE_TUPLE(ct_eq<0>{}),
63 MAKE_TUPLE(ct_eq<1>{}),
64 MAKE_TUPLE(ct_eq<0>{}))
66 BOOST_HANA_CONSTANT_CHECK(hana::equal(
67 hana::group(MAKE_TUPLE(ct_eq<1>{}, ct_eq<0>{}, ct_eq<0>{})),
69 MAKE_TUPLE(ct_eq<1>{}),
70 MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{}))
73 BOOST_HANA_CONSTANT_CHECK(hana::equal(
74 hana::group(MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{}, ct_eq<1>{}, ct_eq<1>{})),
75 MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{}),
76 MAKE_TUPLE(ct_eq<1>{}, ct_eq<1>{}))
78 BOOST_HANA_CONSTANT_CHECK(hana::equal(
79 hana::group(MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{}, ct_eq<1>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<2>{}, ct_eq<2>{})),
81 MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{}),
82 MAKE_TUPLE(ct_eq<1>{}, ct_eq<1>{}),
83 MAKE_TUPLE(ct_eq<2>{}, ct_eq<2>{}, ct_eq<2>{}))
87 // Test with a custom predicate
89 auto a = [](auto z) { return ::equivalence_class(ct_eq<999>{}, z); };
90 auto b = [](auto z) { return ::equivalence_class(ct_eq<888>{}, z); };
92 auto pred = [](auto x, auto y) {
93 return hana::equal(x.unwrap, y.unwrap);
96 BOOST_HANA_CONSTANT_CHECK(hana::equal(
97 hana::group(MAKE_TUPLE(), undefined{}),
101 BOOST_HANA_CONSTANT_CHECK(hana::equal(
102 hana::group(MAKE_TUPLE(a(ct_eq<0>{})), pred),
104 MAKE_TUPLE(a(ct_eq<0>{})))
106 BOOST_HANA_CONSTANT_CHECK(hana::equal(
107 hana::group(MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<0>{})), pred),
109 MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<0>{})))
111 BOOST_HANA_CONSTANT_CHECK(hana::equal(
112 hana::group(MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<0>{}), a(ct_eq<1>{})), pred),
114 MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<0>{})),
115 MAKE_TUPLE(a(ct_eq<1>{})))
117 BOOST_HANA_CONSTANT_CHECK(hana::equal(
118 hana::group(MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<0>{}), a(ct_eq<1>{}), b(ct_eq<1>{})), pred),
120 MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<0>{})),
121 MAKE_TUPLE(a(ct_eq<1>{}), b(ct_eq<1>{})))
123 BOOST_HANA_CONSTANT_CHECK(hana::equal(
124 hana::group(MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<0>{}), a(ct_eq<1>{}), b(ct_eq<1>{}), b(ct_eq<0>{})), pred),
126 MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<0>{})),
127 MAKE_TUPLE(a(ct_eq<1>{}), b(ct_eq<1>{})),
128 MAKE_TUPLE(b(ct_eq<0>{})))
131 // Test group.by syntactic sugar
132 BOOST_HANA_CONSTANT_CHECK(hana::equal(
133 hana::group.by(pred, MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<0>{}), a(ct_eq<1>{}), b(ct_eq<1>{}), b(ct_eq<0>{}))),
135 MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<0>{})),
136 MAKE_TUPLE(a(ct_eq<1>{}), b(ct_eq<1>{})),
137 MAKE_TUPLE(b(ct_eq<0>{})))
140 BOOST_HANA_CONSTANT_CHECK(hana::equal(
141 hana::group.by(pred)(MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<0>{}), a(ct_eq<1>{}), b(ct_eq<1>{}), b(ct_eq<0>{}))),
143 MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<0>{})),
144 MAKE_TUPLE(a(ct_eq<1>{}), b(ct_eq<1>{})),
145 MAKE_TUPLE(b(ct_eq<0>{})))
150 #endif // !BOOST_HANA_TEST_AUTO_GROUP_HPP