|
1 | 1 |
|
| 2 | +#include <cmath> |
| 3 | + |
2 | 4 | #include <gtest/gtest.h>
|
3 | 5 |
|
4 | 6 | #include <geoarrow.h>
|
@@ -27,8 +29,15 @@ TEST_P(TypeParameterizedTestFixture, ArrayViewTestInitType) {
|
27 | 29 | EXPECT_EQ(array_view.validity_bitmap, nullptr);
|
28 | 30 | EXPECT_EQ(array_view.n_offsets, kNumOffsets[array_view.schema_view.geometry_type]);
|
29 | 31 | EXPECT_EQ(array_view.coords.n_coords, 0);
|
30 |
| - EXPECT_EQ(array_view.coords.n_values, |
31 |
| - kNumDimensions[array_view.schema_view.dimensions]); |
| 32 | + |
| 33 | + if (array_view.schema_view.geometry_type == GEOARROW_GEOMETRY_TYPE_BOX) { |
| 34 | + EXPECT_EQ(array_view.coords.n_values, |
| 35 | + kNumDimensions[array_view.schema_view.dimensions] * 2); |
| 36 | + |
| 37 | + } else { |
| 38 | + EXPECT_EQ(array_view.coords.n_values, |
| 39 | + kNumDimensions[array_view.schema_view.dimensions]); |
| 40 | + } |
32 | 41 |
|
33 | 42 | if (array_view.schema_view.coord_type == GEOARROW_COORD_TYPE_SEPARATE) {
|
34 | 43 | EXPECT_EQ(array_view.coords.coords_stride, 1);
|
@@ -71,6 +80,8 @@ TEST_P(TypeParameterizedTestFixture, ArrayViewTestInitEmptyArray) {
|
71 | 80 | INSTANTIATE_TEST_SUITE_P(
|
72 | 81 | ArrayViewTest, TypeParameterizedTestFixture,
|
73 | 82 | ::testing::Values(
|
| 83 | + GEOARROW_TYPE_BOX, GEOARROW_TYPE_BOX_Z, GEOARROW_TYPE_BOX_M, GEOARROW_TYPE_BOX_ZM, |
| 84 | + |
74 | 85 | GEOARROW_TYPE_POINT, GEOARROW_TYPE_LINESTRING, GEOARROW_TYPE_POLYGON,
|
75 | 86 | GEOARROW_TYPE_MULTIPOINT, GEOARROW_TYPE_MULTILINESTRING,
|
76 | 87 | GEOARROW_TYPE_MULTIPOLYGON,
|
@@ -106,19 +117,36 @@ TEST(ArrayViewTest, ArrayViewTestSetArrayErrors) {
|
106 | 117 | struct GeoArrowArrayView array_view;
|
107 | 118 | struct GeoArrowError error;
|
108 | 119 | struct ArrowArray array;
|
| 120 | + struct ArrowArray dummy_childx; |
| 121 | + struct ArrowArray* children[] = {&dummy_childx, &dummy_childx, &dummy_childx, |
| 122 | + &dummy_childx}; |
109 | 123 |
|
110 |
| - ASSERT_EQ(GeoArrowArrayViewInitFromType(&array_view, GEOARROW_TYPE_POINT), GEOARROW_OK); |
| 124 | + ASSERT_EQ(GeoArrowArrayViewInitFromType(&array_view, GEOARROW_TYPE_BOX), GEOARROW_OK); |
| 125 | + array.offset = 0; |
| 126 | + array.n_children = 1; |
| 127 | + EXPECT_EQ(GeoArrowArrayViewSetArray(&array_view, &array, &error), EINVAL); |
| 128 | + EXPECT_STREQ(error.message, |
| 129 | + "Unexpected number of children for box array struct in " |
| 130 | + "GeoArrowArrayViewSetArray()"); |
| 131 | + |
| 132 | + array.n_children = 4; |
| 133 | + array.children = reinterpret_cast<struct ArrowArray**>(children); |
| 134 | + dummy_childx.n_buffers = 1; |
| 135 | + EXPECT_EQ(GeoArrowArrayViewSetArray(&array_view, &array, &error), EINVAL); |
| 136 | + EXPECT_STREQ(error.message, |
| 137 | + "Unexpected number of buffers for box array child in " |
| 138 | + "GeoArrowArrayViewSetArray()"); |
111 | 139 |
|
| 140 | + ASSERT_EQ(GeoArrowArrayViewInitFromType(&array_view, GEOARROW_TYPE_POINT), GEOARROW_OK); |
| 141 | + array.n_children = 0; |
| 142 | + array.children = nullptr; |
112 | 143 | array.offset = 0;
|
113 | 144 | array.n_children = 1;
|
114 | 145 | EXPECT_EQ(GeoArrowArrayViewSetArray(&array_view, &array, &error), EINVAL);
|
115 | 146 | EXPECT_STREQ(error.message,
|
116 | 147 | "Unexpected number of children for struct coordinate array in "
|
117 | 148 | "GeoArrowArrayViewSetArray()");
|
118 | 149 |
|
119 |
| - struct ArrowArray dummy_childx; |
120 |
| - struct ArrowArray dummy_childy; |
121 |
| - struct ArrowArray* children[] = {&dummy_childx, &dummy_childy}; |
122 | 150 | array.n_children = 2;
|
123 | 151 | array.children = reinterpret_cast<struct ArrowArray**>(children);
|
124 | 152 | dummy_childx.n_buffers = 1;
|
@@ -169,6 +197,85 @@ TEST(ArrayViewTest, ArrayViewTestSetInterleavedArrayErrors) {
|
169 | 197 | "GeoArrowArrayViewSetArray()");
|
170 | 198 | }
|
171 | 199 |
|
| 200 | +TEST(ArrayViewTest, ArrayViewTestSetArrayValidBox) { |
| 201 | + struct ArrowSchema schema; |
| 202 | + struct ArrowArray array; |
| 203 | + enum GeoArrowType type = GEOARROW_TYPE_BOX; |
| 204 | + |
| 205 | + // Build the array for [BOX (0 1 => 2 3), BOX EMPTY, null] |
| 206 | + ASSERT_EQ(GeoArrowSchemaInit(&schema, type), GEOARROW_OK); |
| 207 | + ASSERT_EQ(ArrowArrayInitFromSchema(&array, &schema, nullptr), GEOARROW_OK); |
| 208 | + ASSERT_EQ(ArrowArrayStartAppending(&array), GEOARROW_OK); |
| 209 | + |
| 210 | + ASSERT_EQ(ArrowArrayAppendDouble(array.children[0], 0), GEOARROW_OK); |
| 211 | + ASSERT_EQ(ArrowArrayAppendDouble(array.children[1], 1), GEOARROW_OK); |
| 212 | + ASSERT_EQ(ArrowArrayAppendDouble(array.children[2], 2), GEOARROW_OK); |
| 213 | + ASSERT_EQ(ArrowArrayAppendDouble(array.children[3], 3), GEOARROW_OK); |
| 214 | + ASSERT_EQ(ArrowArrayFinishElement(&array), GEOARROW_OK); |
| 215 | + |
| 216 | + ASSERT_EQ(ArrowArrayAppendDouble(array.children[0], INFINITY), GEOARROW_OK); |
| 217 | + ASSERT_EQ(ArrowArrayAppendDouble(array.children[1], INFINITY), GEOARROW_OK); |
| 218 | + ASSERT_EQ(ArrowArrayAppendDouble(array.children[2], -INFINITY), GEOARROW_OK); |
| 219 | + ASSERT_EQ(ArrowArrayAppendDouble(array.children[3], -INFINITY), GEOARROW_OK); |
| 220 | + ASSERT_EQ(ArrowArrayFinishElement(&array), GEOARROW_OK); |
| 221 | + |
| 222 | + ASSERT_EQ(ArrowArrayAppendNull(&array, 1), GEOARROW_OK); |
| 223 | + |
| 224 | + ASSERT_EQ(ArrowArrayFinishBuildingDefault(&array, nullptr), GEOARROW_OK); |
| 225 | + |
| 226 | + // Set the array view |
| 227 | + struct GeoArrowArrayView array_view; |
| 228 | + EXPECT_EQ(GeoArrowArrayViewInitFromType(&array_view, type), GEOARROW_OK); |
| 229 | + EXPECT_EQ(GeoArrowArrayViewSetArray(&array_view, &array, nullptr), GEOARROW_OK); |
| 230 | + |
| 231 | + // Check its contents |
| 232 | + EXPECT_EQ(array_view.length[0], 3); |
| 233 | + EXPECT_TRUE(ArrowBitGet(array_view.validity_bitmap, 0)); |
| 234 | + EXPECT_TRUE(ArrowBitGet(array_view.validity_bitmap, 1)); |
| 235 | + EXPECT_FALSE(ArrowBitGet(array_view.validity_bitmap, 2)); |
| 236 | + EXPECT_EQ(array_view.coords.n_values, 4); |
| 237 | + EXPECT_EQ(array_view.coords.n_coords, 3); |
| 238 | + EXPECT_EQ(array_view.coords.values[0][0], 0); |
| 239 | + EXPECT_EQ(array_view.coords.values[1][0], 1); |
| 240 | + EXPECT_EQ(array_view.coords.values[2][0], 2); |
| 241 | + EXPECT_EQ(array_view.coords.values[3][0], 3); |
| 242 | + |
| 243 | + EXPECT_EQ(array_view.coords.values[0][1], INFINITY); |
| 244 | + EXPECT_EQ(array_view.coords.values[1][1], INFINITY); |
| 245 | + EXPECT_EQ(array_view.coords.values[2][1], -INFINITY); |
| 246 | + EXPECT_EQ(array_view.coords.values[3][1], -INFINITY); |
| 247 | + |
| 248 | + WKXTester tester; |
| 249 | + EXPECT_EQ(GeoArrowArrayViewVisit(&array_view, 0, array.length, tester.WKTVisitor()), |
| 250 | + GEOARROW_OK); |
| 251 | + auto values = tester.WKTValues("<null value>"); |
| 252 | + ASSERT_EQ(values.size(), 3); |
| 253 | + EXPECT_EQ(values[0], "POLYGON ((0 1, 2 1, 2 3, 0 3, 0 1))"); |
| 254 | + EXPECT_EQ(values[1], "POLYGON EMPTY"); |
| 255 | + EXPECT_EQ(values[2], "<null value>"); |
| 256 | + |
| 257 | + schema.release(&schema); |
| 258 | + array.release(&array); |
| 259 | +} |
| 260 | + |
| 261 | +TEST(ArrayViewTest, ArrayViewTestSetArrayValidBoxNonXY) { |
| 262 | + struct ArrowSchema schema; |
| 263 | + struct ArrowArray array; |
| 264 | + struct GeoArrowError error; |
| 265 | + |
| 266 | + ASSERT_EQ(GeoArrowSchemaInit(&schema, GEOARROW_TYPE_BOX_Z), GEOARROW_OK); |
| 267 | + struct GeoArrowArrayView array_view; |
| 268 | + ASSERT_EQ(GeoArrowArrayViewInitFromType(&array_view, GEOARROW_TYPE_BOX_Z), GEOARROW_OK); |
| 269 | + |
| 270 | + struct GeoArrowVisitor v; |
| 271 | + GeoArrowVisitorInitVoid(&v); |
| 272 | + v.error = &error; |
| 273 | + ASSERT_EQ(GeoArrowArrayViewVisit(&array_view, 0, 0, &v), ENOTSUP); |
| 274 | + ASSERT_STREQ(error.message, "Can't visit box with non-XY dimensions"); |
| 275 | + |
| 276 | + ArrowSchemaRelease(&schema); |
| 277 | +} |
| 278 | + |
172 | 279 | TEST(ArrayViewTest, ArrayViewTestSetArrayValidPoint) {
|
173 | 280 | struct ArrowSchema schema;
|
174 | 281 | struct ArrowArray array;
|
|
0 commit comments