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_DROP_FRONT_HPP
6 #define BOOST_HANA_TEST_AUTO_DROP_FRONT_HPP
8 #include <boost/hana/assert.hpp>
9 #include <boost/hana/drop_front.hpp>
10 #include <boost/hana/drop_front_exactly.hpp>
11 #include <boost/hana/equal.hpp>
12 #include <boost/hana/integral_constant.hpp>
14 #include <laws/base.hpp>
15 #include "test_case.hpp"
18 TestCase test_drop_front{[]{
19 namespace hana = boost::hana;
20 using hana::test::ct_eq;
22 BOOST_HANA_CONSTANT_CHECK(hana::equal(
23 hana::drop_front(MAKE_TUPLE(), hana::size_c<0>),
26 BOOST_HANA_CONSTANT_CHECK(hana::equal(
27 hana::drop_front(MAKE_TUPLE(), hana::size_c<1>),
30 BOOST_HANA_CONSTANT_CHECK(hana::equal(
31 hana::drop_front(MAKE_TUPLE(), hana::size_c<2>),
35 BOOST_HANA_CONSTANT_CHECK(hana::equal(
36 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}), hana::size_c<0>),
37 MAKE_TUPLE(ct_eq<0>{})
39 BOOST_HANA_CONSTANT_CHECK(hana::equal(
40 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}), hana::size_c<1>),
43 BOOST_HANA_CONSTANT_CHECK(hana::equal(
44 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}), hana::size_c<2>),
48 BOOST_HANA_CONSTANT_CHECK(hana::equal(
49 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}), hana::size_c<0>),
50 MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})
52 BOOST_HANA_CONSTANT_CHECK(hana::equal(
53 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}), hana::size_c<1>),
54 MAKE_TUPLE(ct_eq<1>{})
56 BOOST_HANA_CONSTANT_CHECK(hana::equal(
57 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}), hana::size_c<2>),
61 BOOST_HANA_CONSTANT_CHECK(hana::equal(
62 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}), hana::size_c<0>),
63 MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})
65 BOOST_HANA_CONSTANT_CHECK(hana::equal(
66 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}), hana::size_c<1>),
67 MAKE_TUPLE(ct_eq<1>{}, ct_eq<2>{})
69 BOOST_HANA_CONSTANT_CHECK(hana::equal(
70 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}), hana::size_c<2>),
71 MAKE_TUPLE(ct_eq<2>{})
73 BOOST_HANA_CONSTANT_CHECK(hana::equal(
74 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}), hana::size_c<3>),
78 // make sure hana::drop_front(xs) == hana::drop_front(xs, size_c<1>)
79 BOOST_HANA_CHECK(hana::equal(
80 hana::drop_front(MAKE_TUPLE()),
81 hana::drop_front(MAKE_TUPLE(), hana::size_c<1>)
84 BOOST_HANA_CHECK(hana::equal(
85 hana::drop_front(MAKE_TUPLE(ct_eq<0>{})),
86 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}), hana::size_c<1>)
89 BOOST_HANA_CHECK(hana::equal(
90 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})),
91 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}), hana::size_c<1>)
94 BOOST_HANA_CHECK(hana::equal(
95 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}, ct_eq<2>{})),
96 hana::drop_front(MAKE_TUPLE(ct_eq<0>{}, ct_eq<2>{}), hana::size_c<1>)
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>{})),
101 MAKE_TUPLE(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{})
105 TestCase test_drop_front_exactly{[]{
106 namespace hana = boost::hana;
107 using hana::test::ct_eq;
109 BOOST_HANA_CONSTANT_CHECK(hana::equal(
110 hana::drop_front_exactly(MAKE_TUPLE(), hana::size_c<0>),
114 BOOST_HANA_CONSTANT_CHECK(hana::equal(
115 hana::drop_front_exactly(MAKE_TUPLE(ct_eq<0>{}), hana::size_c<0>),
116 MAKE_TUPLE(ct_eq<0>{})
118 BOOST_HANA_CONSTANT_CHECK(hana::equal(
119 hana::drop_front_exactly(MAKE_TUPLE(ct_eq<0>{}), hana::size_c<1>),
123 BOOST_HANA_CONSTANT_CHECK(hana::equal(
124 hana::drop_front_exactly(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}), hana::size_c<0>),
125 MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})
127 BOOST_HANA_CONSTANT_CHECK(hana::equal(
128 hana::drop_front_exactly(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}), hana::size_c<1>),
129 MAKE_TUPLE(ct_eq<1>{})
131 BOOST_HANA_CONSTANT_CHECK(hana::equal(
132 hana::drop_front_exactly(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}), hana::size_c<2>),
136 BOOST_HANA_CONSTANT_CHECK(hana::equal(
137 hana::drop_front_exactly(
138 MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{},
139 ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}), hana::size_c<4>),
140 MAKE_TUPLE(ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{})
143 // make sure drop_front_exactly(xs) == drop_front_exactly(xs, size_c<1>)
144 BOOST_HANA_CHECK(hana::equal(
145 hana::drop_front_exactly(MAKE_TUPLE(ct_eq<0>{})),
146 hana::drop_front_exactly(MAKE_TUPLE(ct_eq<0>{}), hana::size_c<1>)
149 BOOST_HANA_CHECK(hana::equal(
150 hana::drop_front_exactly(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})),
151 hana::drop_front_exactly(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}), hana::size_c<1>)
154 BOOST_HANA_CHECK(hana::equal(
155 hana::drop_front_exactly(MAKE_TUPLE(ct_eq<0>{}, ct_eq<2>{})),
156 hana::drop_front_exactly(MAKE_TUPLE(ct_eq<0>{}, ct_eq<2>{}), hana::size_c<1>)
160 #endif // !BOOST_HANA_TEST_AUTO_DROP_FRONT_HPP