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