• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
5 #ifndef BOOST_HANA_TEST_AUTO_GROUP_HPP
6 #define BOOST_HANA_TEST_AUTO_GROUP_HPP
7 
8 #include <boost/hana/assert.hpp>
9 #include <boost/hana/equal.hpp>
10 #include <boost/hana/group.hpp>
11 
12 #include "test_case.hpp"
13 #include <laws/base.hpp>
14 #include <support/equivalence_class.hpp>
15 
16 
__anondb933d850102null17 TestCase test_group{[]{
18     namespace hana = boost::hana;
19     using hana::test::ct_eq;
20 
21     struct undefined { };
22 
23     // Test without a custom predicate
24     {
25         BOOST_HANA_CONSTANT_CHECK(hana::equal(
26             hana::group(MAKE_TUPLE()),
27             MAKE_TUPLE()
28         ));
29 
30         BOOST_HANA_CONSTANT_CHECK(hana::equal(
31             hana::group(MAKE_TUPLE(ct_eq<0>{})),
32             MAKE_TUPLE(
33                 MAKE_TUPLE(ct_eq<0>{}))
34         ));
35 
36         BOOST_HANA_CONSTANT_CHECK(hana::equal(
37             hana::group(MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{})),
38             MAKE_TUPLE(
39                 MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{}))
40         ));
41         BOOST_HANA_CONSTANT_CHECK(hana::equal(
42             hana::group(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})),
43             MAKE_TUPLE(
44                 MAKE_TUPLE(ct_eq<0>{}),
45                 MAKE_TUPLE(ct_eq<1>{}))
46         ));
47 
48         BOOST_HANA_CONSTANT_CHECK(hana::equal(
49             hana::group(MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{}, ct_eq<0>{})),
50             MAKE_TUPLE(
51                 MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{}, ct_eq<0>{}))
52         ));
53         BOOST_HANA_CONSTANT_CHECK(hana::equal(
54             hana::group(MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{}, ct_eq<1>{})),
55             MAKE_TUPLE(
56                 MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{}),
57                 MAKE_TUPLE(ct_eq<1>{}))
58         ));
59         BOOST_HANA_CONSTANT_CHECK(hana::equal(
60             hana::group(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<0>{})),
61             MAKE_TUPLE(
62                 MAKE_TUPLE(ct_eq<0>{}),
63                 MAKE_TUPLE(ct_eq<1>{}),
64                 MAKE_TUPLE(ct_eq<0>{}))
65         ));
66         BOOST_HANA_CONSTANT_CHECK(hana::equal(
67             hana::group(MAKE_TUPLE(ct_eq<1>{}, ct_eq<0>{}, ct_eq<0>{})),
68             MAKE_TUPLE(
69                 MAKE_TUPLE(ct_eq<1>{}),
70                 MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{}))
71         ));
72 
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>{}))
77         ));
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>{})),
80             MAKE_TUPLE(
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>{}))
84         ));
85     }
86 
87     // Test with a custom predicate
88     {
89         auto a = [](auto z) { return ::equivalence_class(ct_eq<999>{}, z); };
90         auto b = [](auto z) { return ::equivalence_class(ct_eq<888>{}, z); };
91 
92         auto pred = [](auto x, auto y) {
93             return hana::equal(x.unwrap, y.unwrap);
94         };
95 
96         BOOST_HANA_CONSTANT_CHECK(hana::equal(
97             hana::group(MAKE_TUPLE(), undefined{}),
98             MAKE_TUPLE()
99         ));
100 
101         BOOST_HANA_CONSTANT_CHECK(hana::equal(
102             hana::group(MAKE_TUPLE(a(ct_eq<0>{})), pred),
103             MAKE_TUPLE(
104                 MAKE_TUPLE(a(ct_eq<0>{})))
105         ));
106         BOOST_HANA_CONSTANT_CHECK(hana::equal(
107             hana::group(MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<0>{})), pred),
108             MAKE_TUPLE(
109                 MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<0>{})))
110         ));
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),
113             MAKE_TUPLE(
114                 MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<0>{})),
115                 MAKE_TUPLE(a(ct_eq<1>{})))
116         ));
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),
119             MAKE_TUPLE(
120                 MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<0>{})),
121                 MAKE_TUPLE(a(ct_eq<1>{}), b(ct_eq<1>{})))
122         ));
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),
125             MAKE_TUPLE(
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>{})))
129         ));
130 
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>{}))),
134             MAKE_TUPLE(
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>{})))
138         ));
139 
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>{}))),
142             MAKE_TUPLE(
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>{})))
146         ));
147     }
148 }};
149 
150 #endif // !BOOST_HANA_TEST_AUTO_GROUP_HPP
151