1 // Boost.Polygon library voronoi_structures_test.cpp file
2
3 // Copyright Andrii Sydorchuk 2010-2012.
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 // See http://www.boost.org for updates, documentation, and revision history.
9
10 #include <functional>
11 #include <vector>
12
13 #define BOOST_TEST_MODULE voronoi_structures_test
14 #include <boost/test/test_case_template.hpp>
15 #include <boost/polygon/detail/voronoi_structures.hpp>
16 using namespace boost::polygon::detail;
17
18 #include <boost/polygon/voronoi_geometry_type.hpp>
19 using namespace boost::polygon;
20
21 typedef point_2d<int> point_type;
22 typedef site_event<int> site_type;
23 typedef circle_event<int> circle_type;
24 typedef ordered_queue<int, std::greater<int> > ordered_queue_type;
25 typedef beach_line_node_key<int> node_key_type;
26 typedef beach_line_node_data<int, int> node_data_type;
27
BOOST_AUTO_TEST_CASE(point_2d_test1)28 BOOST_AUTO_TEST_CASE(point_2d_test1) {
29 point_type p(1, 2);
30 BOOST_CHECK_EQUAL(1, p.x());
31 BOOST_CHECK_EQUAL(2, p.y());
32 p.x(3);
33 BOOST_CHECK_EQUAL(3, p.x());
34 p.y(4);
35 BOOST_CHECK_EQUAL(4, p.y());
36 }
37
BOOST_AUTO_TEST_CASE(site_event_test1)38 BOOST_AUTO_TEST_CASE(site_event_test1) {
39 site_type s(1, 2);
40 s.sorted_index(1);
41 s.initial_index(2);
42 s.source_category(SOURCE_CATEGORY_SEGMENT_START_POINT);
43 BOOST_CHECK_EQUAL(1, s.x0());
44 BOOST_CHECK_EQUAL(1, s.x1());
45 BOOST_CHECK_EQUAL(2, s.y0());
46 BOOST_CHECK_EQUAL(2, s.y1());
47 BOOST_CHECK(s.is_point());
48 BOOST_CHECK(!s.is_segment());
49 BOOST_CHECK(!s.is_inverse());
50 BOOST_CHECK_EQUAL(1, s.sorted_index());
51 BOOST_CHECK_EQUAL(2, s.initial_index());
52 BOOST_CHECK_EQUAL(SOURCE_CATEGORY_SEGMENT_START_POINT, s.source_category());
53 }
54
BOOST_AUTO_TEST_CASE(site_event_test2)55 BOOST_AUTO_TEST_CASE(site_event_test2) {
56 site_type s(1, 2, 3, 4);
57 s.sorted_index(1);
58 s.initial_index(2);
59 s.source_category(SOURCE_CATEGORY_INITIAL_SEGMENT);
60 BOOST_CHECK_EQUAL(1, s.x0());
61 BOOST_CHECK_EQUAL(2, s.y0());
62 BOOST_CHECK_EQUAL(3, s.x1());
63 BOOST_CHECK_EQUAL(4, s.y1());
64 BOOST_CHECK(!s.is_point());
65 BOOST_CHECK(s.is_segment());
66 BOOST_CHECK(!s.is_inverse());
67 BOOST_CHECK_EQUAL(SOURCE_CATEGORY_INITIAL_SEGMENT, s.source_category());
68
69 s.inverse();
70 BOOST_CHECK_EQUAL(3, s.x0());
71 BOOST_CHECK_EQUAL(4, s.y0());
72 BOOST_CHECK_EQUAL(1, s.x1());
73 BOOST_CHECK_EQUAL(2, s.y1());
74 BOOST_CHECK(s.is_inverse());
75 BOOST_CHECK_EQUAL(SOURCE_CATEGORY_INITIAL_SEGMENT, s.source_category());
76 }
77
BOOST_AUTO_TEST_CASE(circle_event_test)78 BOOST_AUTO_TEST_CASE(circle_event_test) {
79 circle_type c(0, 1, 2);
80 BOOST_CHECK_EQUAL(0, c.x());
81 BOOST_CHECK_EQUAL(1, c.y());
82 BOOST_CHECK_EQUAL(2, c.lower_x());
83 BOOST_CHECK_EQUAL(1, c.lower_y());
84 BOOST_CHECK(c.is_active());
85 c.x(3);
86 c.y(4);
87 c.lower_x(5);
88 BOOST_CHECK_EQUAL(3, c.x());
89 BOOST_CHECK_EQUAL(4, c.y());
90 BOOST_CHECK_EQUAL(5, c.lower_x());
91 BOOST_CHECK_EQUAL(4, c.lower_y());
92 c.deactivate();
93 BOOST_CHECK(!c.is_active());
94 }
95
BOOST_AUTO_TEST_CASE(ordered_queue_test)96 BOOST_AUTO_TEST_CASE(ordered_queue_test) {
97 ordered_queue_type q;
98 BOOST_CHECK(q.empty());
99 std::vector<int*> vi;
100 for (int i = 0; i < 20; ++i)
101 vi.push_back(&q.push(i));
102 for (int i = 0; i < 20; ++i)
103 *vi[i] <<= 1;
104 BOOST_CHECK(!q.empty());
105 for (int i = 0; i < 20; ++i, q.pop())
106 BOOST_CHECK_EQUAL(i << 1, q.top());
107 BOOST_CHECK(q.empty());
108 }
109
BOOST_AUTO_TEST_CASE(beach_line_node_key_test)110 BOOST_AUTO_TEST_CASE(beach_line_node_key_test) {
111 node_key_type key(1);
112 BOOST_CHECK_EQUAL(1, key.left_site());
113 BOOST_CHECK_EQUAL(1, key.right_site());
114 key.left_site(2);
115 BOOST_CHECK_EQUAL(2, key.left_site());
116 BOOST_CHECK_EQUAL(1, key.right_site());
117 key.right_site(3);
118 BOOST_CHECK_EQUAL(2, key.left_site());
119 BOOST_CHECK_EQUAL(3, key.right_site());
120 }
121
BOOST_AUTO_TEST_CASE(beach_line_node_data_test)122 BOOST_AUTO_TEST_CASE(beach_line_node_data_test) {
123 node_data_type node_data(NULL);
124 BOOST_CHECK(node_data.edge() == NULL);
125 BOOST_CHECK(node_data.circle_event() == NULL);
126 int data = 4;
127 node_data.circle_event(&data);
128 BOOST_CHECK(node_data.edge() == NULL);
129 BOOST_CHECK(node_data.circle_event() == &data);
130 node_data.edge(&data);
131 BOOST_CHECK(node_data.edge() == &data);
132 BOOST_CHECK(node_data.circle_event() == &data);
133 }
134