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, &center);
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