1 // Copyright Louis Dionne 2013-2016
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_EXT_BOOST_FUSION_TESTS_HPP
6 #define BOOST_HANA_TEST_EXT_BOOST_FUSION_TESTS_HPP
8 #include <boost/hana/assert.hpp>
9 #include <boost/hana/at.hpp>
10 #include <boost/hana/concept/sequence.hpp>
11 #include <boost/hana/core/make.hpp>
12 #include <boost/hana/drop_front.hpp>
13 #include <boost/hana/equal.hpp>
14 #include <boost/hana/integral_constant.hpp>
15 #include <boost/hana/is_empty.hpp>
16 #include <boost/hana/length.hpp>
17 #include <boost/hana/not.hpp>
19 #include <laws/base.hpp>
20 namespace hana = boost::hana;
21 using hana::test::ct_eq;
25 // Before including this header, define the following macros:
28 // Must expand to a sequence holding __VA_ARGS__. A valid definition
29 // would be hana::make_tuple(__VA_ARGS__).
32 // Must expand to the type of a sequence holding objects of type __VA_ARGS__.
33 // A valid definition would be hana::tuple<__VA_ARGS__>.
36 // Must expand to the tag of the sequence. A valid definition would
37 // be hana::tuple_tag.
44 //////////////////////////////////////////////////////////////////////////
46 //////////////////////////////////////////////////////////////////////////
48 BOOST_HANA_CONSTANT_CHECK(hana::equal(
50 hana::make<TUPLE_TAG>()
53 BOOST_HANA_CONSTANT_CHECK(hana::equal(
54 MAKE_TUPLE(ct_eq<0>{}),
55 hana::make<TUPLE_TAG>(ct_eq<0>{})
58 BOOST_HANA_CONSTANT_CHECK(hana::equal(
59 MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}),
60 hana::make<TUPLE_TAG>(ct_eq<0>{}, ct_eq<1>{})
63 BOOST_HANA_CONSTANT_CHECK(hana::equal(
64 MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}),
65 hana::make<TUPLE_TAG>(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})
69 //////////////////////////////////////////////////////////////////////////
71 //////////////////////////////////////////////////////////////////////////
73 BOOST_HANA_CONSTANT_CHECK(hana::equal(
74 hana::drop_front(MAKE_TUPLE(ct_eq<0>{})),
78 BOOST_HANA_CONSTANT_CHECK(hana::equal(
79 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})),
80 MAKE_TUPLE(ct_eq<1>{})
83 BOOST_HANA_CONSTANT_CHECK(hana::equal(
84 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})),
85 MAKE_TUPLE(ct_eq<1>{}, ct_eq<2>{})
88 BOOST_HANA_CONSTANT_CHECK(hana::equal(
89 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{})),
90 MAKE_TUPLE(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{})
94 BOOST_HANA_CONSTANT_CHECK(hana::equal(
95 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}), hana::size_c<2>),
96 MAKE_TUPLE(ct_eq<2>{})
99 BOOST_HANA_CONSTANT_CHECK(hana::equal(
100 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}), hana::size_c<2>),
101 MAKE_TUPLE(ct_eq<2>{}, ct_eq<3>{})
104 BOOST_HANA_CONSTANT_CHECK(hana::equal(
105 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}), hana::size_c<3>),
106 MAKE_TUPLE(ct_eq<3>{})
109 BOOST_HANA_CONSTANT_CHECK(hana::equal(
110 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}), hana::size_c<5>),
115 //////////////////////////////////////////////////////////////////////////
117 //////////////////////////////////////////////////////////////////////////
119 BOOST_HANA_CONSTANT_CHECK(hana::equal(
120 hana::at_c<0>(MAKE_TUPLE(ct_eq<0>{})),
124 BOOST_HANA_CONSTANT_CHECK(hana::equal(
125 hana::at_c<0>(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})),
128 BOOST_HANA_CONSTANT_CHECK(hana::equal(
129 hana::at_c<1>(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})),
133 BOOST_HANA_CONSTANT_CHECK(hana::equal(
134 hana::at_c<0>(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})),
137 BOOST_HANA_CONSTANT_CHECK(hana::equal(
138 hana::at_c<1>(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})),
141 BOOST_HANA_CONSTANT_CHECK(hana::equal(
142 hana::at_c<2>(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})),
147 //////////////////////////////////////////////////////////////////////////
149 //////////////////////////////////////////////////////////////////////////
151 BOOST_HANA_CONSTANT_CHECK(hana::is_empty(
155 BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::is_empty(
156 MAKE_TUPLE(undefined{})
159 BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::is_empty(
160 MAKE_TUPLE(undefined{}, undefined{})
164 //////////////////////////////////////////////////////////////////////////
166 //////////////////////////////////////////////////////////////////////////
168 BOOST_HANA_CONSTANT_CHECK(hana::equal(
169 hana::length(MAKE_TUPLE()),
173 BOOST_HANA_CONSTANT_CHECK(hana::equal(
174 hana::length(MAKE_TUPLE(undefined{})),
178 BOOST_HANA_CONSTANT_CHECK(hana::equal(
179 hana::length(MAKE_TUPLE(undefined{}, undefined{})),
183 BOOST_HANA_CONSTANT_CHECK(hana::equal(
184 hana::length(MAKE_TUPLE(undefined{}, undefined{}, undefined{})),
189 //////////////////////////////////////////////////////////////////////////
191 //////////////////////////////////////////////////////////////////////////
193 static_assert(hana::Sequence<TUPLE_TAG>::value, "");
197 #endif // !BOOST_HANA_TEST_EXT_BOOST_FUSION_TESTS_HPP