1 // $Id$
2 //
3 // Test Suite for C-API GEOSGetCentroid
4
5 #include <tut/tut.hpp>
6 // geos
7 #include <geos_c.h>
8 // std
9 #include <cstdarg>
10 #include <cstdio>
11 #include <cstdlib>
12 #include <cstring>
13
14 namespace tut {
15 //
16 // Test Group
17 //
18
19 // Common data used in test cases.
20 struct test_capiminimumboundingcircle_data {
21 GEOSGeometry* geom1_;
22 GEOSGeometry* geom2_;
23 GEOSGeometry* geom3_;
24 GEOSWKTWriter* wktw_;
25 char* wkt_;
26 double area_;
27
28 static void
noticetut::test_capiminimumboundingcircle_data29 notice(const char* fmt, ...)
30 {
31 std::fprintf(stdout, "NOTICE: ");
32
33 va_list ap;
34 va_start(ap, fmt);
35 std::vfprintf(stdout, fmt, ap);
36 va_end(ap);
37
38 std::fprintf(stdout, "\n");
39 }
40
test_capiminimumboundingcircle_datatut::test_capiminimumboundingcircle_data41 test_capiminimumboundingcircle_data()
42 : geom1_(nullptr), geom2_(nullptr), geom3_(nullptr), wkt_(nullptr)
43 {
44 initGEOS(notice, notice);
45 wktw_ = GEOSWKTWriter_create();
46 GEOSWKTWriter_setTrim(wktw_, 1);
47 GEOSWKTWriter_setRoundingPrecision(wktw_, 8);
48 }
49
~test_capiminimumboundingcircle_datatut::test_capiminimumboundingcircle_data50 ~test_capiminimumboundingcircle_data()
51 {
52 GEOSGeom_destroy(geom1_);
53 GEOSGeom_destroy(geom2_);
54 GEOSGeom_destroy(geom3_);
55 GEOSWKTWriter_destroy(wktw_);
56 GEOSFree(wkt_);
57 geom1_ = nullptr;
58 geom2_ = nullptr;
59 geom3_ = nullptr;
60 wkt_ = nullptr;
61 finishGEOS();
62 }
63
64 };
65
66 typedef test_group<test_capiminimumboundingcircle_data> group;
67 typedef group::object object;
68
69 group test_capiminimumboundingcircle_group("capi::GEOSMinimumBoundingCircle");
70
71 //
72 // Test Cases
73 //
74
75 // Single point
76 template<>
77 template<>
test()78 void object::test<1>
79 ()
80 {
81 geom1_ = GEOSGeomFromWKT("POINT(10 10)");
82 ensure(nullptr != geom1_);
83 geom2_ = GEOSMinimumBoundingCircle(geom1_, NULL, NULL);
84 ensure(nullptr != geom2_);
85
86 wkt_ = GEOSWKTWriter_write(wktw_, geom2_);
87
88 ensure_equals(std::string(wkt_), std::string("POINT (10 10)"));
89 }
90
91 template<>
92 template<>
test()93 void object::test<2>
94 ()
95 {
96 geom1_ = GEOSGeomFromWKT("LINESTRING(0 10, 0 20)");
97 ensure(nullptr != geom1_);
98 geom2_ = GEOSMinimumBoundingCircle(geom1_, NULL, NULL);
99 ensure(nullptr != geom2_);
100 geom3_ = GEOSGeomFromWKT("POLYGON ((5 15, 4.9039264 14.024548, 4.6193977 13.086583, 4.1573481 12.222149, 3.5355339 11.464466, 2.7778512 10.842652, 1.9134172 10.380602, 0.97545161 10.096074, 8.0777229e-15 10, -0.97545161 10.096074, -1.9134172 10.380602, -2.7778512 10.842652, -3.5355339 11.464466, -4.1573481 12.222149, -4.6193977 13.086583, -4.9039264 14.024548, -5 15, -4.9039264 15.975452, -4.6193977 16.913417, -4.1573481 17.777851, -3.5355339 18.535534, -2.7778512 19.157348, -1.9134172 19.619398, -0.97545161 19.903926, -1.8682053e-14 20, 0.97545161 19.903926, 1.9134172 19.619398, 2.7778512 19.157348, 3.5355339 18.535534, 4.1573481 17.777851, 4.6193977 16.913417, 4.9039264 15.975452, 5 15))");
101 ensure(nullptr != geom3_);
102
103 // wkt_ = GEOSWKTWriter_write(wktw_, geom2_);
104
105 bool eq = GEOSEqualsExact(geom2_, geom3_, 0.0001) != 0;
106 ensure(eq);
107 }
108
109 template<>
110 template<>
test()111 void object::test<3>
112 ()
113 {
114 geom1_ = GEOSGeomFromWKT("LINESTRING EMPTY");
115 ensure(nullptr != geom1_);
116 geom2_ = GEOSMinimumBoundingCircle(geom1_, NULL, NULL);
117 ensure(nullptr != geom2_);
118 geom3_ = GEOSGeomFromWKT("POLYGON EMPTY");
119 ensure(nullptr != geom3_);
120
121 // wkt_ = GEOSWKTWriter_write(wktw_, geom2_);
122 // std::cout << wkt_ << std::endl;
123
124 bool eq = GEOSEqualsExact(geom2_, geom3_, 0.0001) != 0;
125 ensure(eq);
126 }
127
128 template<>
129 template<>
test()130 void object::test<4>
131 ()
132 {
133 GEOSGeometry* center;
134 GEOSGeometry* center_expected;
135 double radius;
136 geom1_ = GEOSGeomFromWKT("LINESTRING(0 10, 0 20)");
137 ensure(nullptr != geom1_);
138 geom2_ = GEOSMinimumBoundingCircle(geom1_, &radius, ¢er);
139 ensure(nullptr != geom2_);
140 geom3_ = GEOSGeomFromWKT("POLYGON ((5 15, 4.9039264 14.024548, 4.6193977 13.086583, 4.1573481 12.222149, 3.5355339 11.464466, 2.7778512 10.842652, 1.9134172 10.380602, 0.97545161 10.096074, 8.0777229e-15 10, -0.97545161 10.096074, -1.9134172 10.380602, -2.7778512 10.842652, -3.5355339 11.464466, -4.1573481 12.222149, -4.6193977 13.086583, -4.9039264 14.024548, -5 15, -4.9039264 15.975452, -4.6193977 16.913417, -4.1573481 17.777851, -3.5355339 18.535534, -2.7778512 19.157348, -1.9134172 19.619398, -0.97545161 19.903926, -1.8682053e-14 20, 0.97545161 19.903926, 1.9134172 19.619398, 2.7778512 19.157348, 3.5355339 18.535534, 4.1573481 17.777851, 4.6193977 16.913417, 4.9039264 15.975452, 5 15))");
141 ensure(nullptr != geom3_);
142 center_expected = GEOSGeomFromWKT("POINT(0 15)");
143
144 // wkt_ = GEOSWKTWriter_write(wktw_, geom2_);
145 // std::cout << wkt_ << std::endl;
146
147 bool eq;
148 eq = GEOSEqualsExact(geom2_, geom3_, 0.0001) != 0;
149 ensure(eq);
150
151 eq = GEOSEqualsExact(center, center_expected, 0.0001) != 0;
152 ensure(eq);
153 GEOSGeom_destroy(center);
154 GEOSGeom_destroy(center_expected);
155
156 ensure(fabs(radius) - 5.0 < 0.001);
157 }
158
159 } // namespace tut
160
161