1 //
2 // Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
3 //
4 // Distributed under the Boost Software License, Version 1.0
5 // See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt
7 //
8 #include <boost/gil.hpp>
9
10 #include <boost/core/lightweight_test.hpp>
11
12 #include "test_fixture.hpp"
13 #include "test_utility_output_stream.hpp"
14 #include "core/pixel/test_fixture.hpp"
15
16 namespace gil = boost::gil;
17 namespace fixture = boost::gil::test::fixture;
18
19 struct test_constructor_with_dimensions_pixel
20 {
21 template <typename Image>
operator ()test_constructor_with_dimensions_pixel22 void operator()(Image const &)
23 {
24 using image_t = Image;
25 gil::point_t const dimensions{256, 128};
26 using pixel_t = typename image_t::view_t::value_type;
27 pixel_t const rnd_pixel = fixture::pixel_generator<pixel_t>::random();
28 image_t image(dimensions, rnd_pixel);
29 BOOST_TEST_EQ(image.width(), dimensions.x);
30 BOOST_TEST_EQ(image.height(), dimensions.y);
31
32 for (pixel_t const &p : gil::view(image))
33 BOOST_TEST_EQ(p, rnd_pixel);
34 }
runtest_constructor_with_dimensions_pixel35 static void run()
36 {
37 boost::mp11::mp_for_each<fixture::image_types>(test_constructor_with_dimensions_pixel{});
38 }
39 };
40
41 struct test_constructor_from_other_image
42 {
43 template <typename Image>
operator ()test_constructor_from_other_image44 void operator()(Image const &)
45 {
46 using image_t = Image;
47 gil::point_t const dimensions{256, 128};
48 using pixel_t = typename image_t::view_t::value_type;
49 pixel_t const rnd_pixel = fixture::pixel_generator<pixel_t>::random();
50 {
51 //constructor interleaved from planar
52 gil::image<pixel_t, true> image1(dimensions, rnd_pixel);
53 image_t image2(image1);
54 BOOST_TEST_EQ(image2.dimensions(), dimensions);
55 auto v1 = gil::const_view(image1);
56 auto v2 = gil::const_view(image2);
57 BOOST_TEST_ALL_EQ(v1.begin(), v1.end(), v2.begin(), v2.end());
58 }
59 // {
60 // //constructor planar from interleaved
61 // image_t image1(dimensions, rnd_pixel);
62 // gil::image<pixel_t, true> image2(image1);
63 // BOOST_TEST_EQ(image2.dimensions(), dimensions);
64 // auto v1 = gil::const_view(image1);
65 // auto v2 = gil::const_view(image2);
66 // BOOST_TEST_ALL_EQ(v1.begin(), v1.end(), v2.begin(), v2.end());
67 // }
68 }
runtest_constructor_from_other_image69 static void run()
70 {
71 boost::mp11::mp_for_each<fixture::rgb_interleaved_image_types>(test_constructor_from_other_image{});
72 }
73 };
74
75 struct test_move_constructor
76 {
77 template <typename Image>
operator ()test_move_constructor78 void operator()(Image const&)
79 {
80 using image_t = Image;
81 gil::point_t const dimensions{256, 128};
82 {
83 image_t image(fixture::create_image<image_t>(dimensions.x, dimensions.y, 0));
84
85 image_t image2(std::move(image));
86 BOOST_TEST_EQ(image2.dimensions(), dimensions);
87 BOOST_TEST_EQ(image.dimensions(), gil::point_t{});
88 }
89 }
runtest_move_constructor90 static void run()
91 {
92 boost::mp11::mp_for_each<fixture::image_types>(test_move_constructor{});
93 }
94 };
95
96 struct test_move_assignement
97 {
98 template <typename Image>
operator ()test_move_assignement99 void operator()(Image const&)
100 {
101 using image_t = Image;
102 gil::point_t const dimensions{256, 128};
103 {
104 image_t image = fixture::create_image<image_t>(dimensions.x, dimensions.y, 0);
105 image_t image2 = fixture::create_image<image_t>(dimensions.x * 2, dimensions.y * 2, 1);
106 image2 = std::move(image);
107 BOOST_TEST_EQ(image2.dimensions(), dimensions);
108 BOOST_TEST_EQ(image.dimensions(), gil::point_t{});
109 }
110 }
runtest_move_assignement111 static void run()
112 {
113 boost::mp11::mp_for_each<fixture::image_types>(test_move_assignement{});
114 }
115 };
116
main()117 int main()
118 {
119 test_constructor_with_dimensions_pixel::run();
120 test_constructor_from_other_image::run();
121
122 test_move_constructor::run();
123 test_move_assignement::run();
124
125 return ::boost::report_errors();
126 }
127