Skip to content

Instantly share code, notes, and snippets.

@schwehr
Created September 5, 2015 15:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save schwehr/bc44b91a37cd621212c4 to your computer and use it in GitHub Desktop.
Save schwehr/bc44b91a37cd621212c4 to your computer and use it in GitHub Desktop.
GDAL autotest2 C++ vector driver test example. Far from complete.
// Tests geojson OGR driver.
//
// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// TODO(schwehr): Add a test file finding function for outside of Google.
#include <memory>
#include "gdal/autotest2/cpp/util/cpl_memory.h"
#include "gdal/ogr/ogr_api.h"
#include "gdal/ogr/ogrsf_frmts/ogrsf_frmts.h"
using std::unique_ptr;
namespace autotest2 {
namespace {
const char kTestData[] = "gdal/autotest2/cpp/ogr/"
"ogrsf_frmts/geojson/testdata/";
class GeoJsonTest : public ::testing::Test {
void SetUp() override {
RegisterOGRGeoJSON();
}
void TearDown() override {
OGRCleanupAll();
}
};
TEST_F(GeoJsonTest, Point) {
const string filepath = GetTestFilePath(
kTestData, "point.geojson");
{
// GDAL wants to use a static destroy method rather than delete.
OGRDataSource *src =
OGRSFDriverRegistrar::Open(filepath.c_str(), false, nullptr);
ASSERT_NE(nullptr, src);
OGRDataSource::DestroyDataSource(src);
}
// The destroy method just calls delete, so unique_ptr works fine.
unique_ptr<OGRDataSource> src(
OGRSFDriverRegistrar::Open(filepath.c_str(), false, nullptr));
ASSERT_NE(nullptr, src);
ASSERT_EQ(1, src->GetLayerCount());
OGRLayer *layer = src->GetLayer(0);
ASSERT_NE(nullptr, layer);
ASSERT_EQ(wkbPoint, layer->GetGeomType());
ASSERT_EQ(1, layer->GetFeatureCount());
ASSERT_STREQ("OGRGeoJSON", layer->GetName());
OGRFeatureDefn *defn = layer->GetLayerDefn();
ASSERT_EQ(0, defn->GetFieldCount());
unique_ptr<OGRFeature> feature(layer->GetNextFeature());
ASSERT_NE(nullptr, feature);
ASSERT_EQ(0, feature->GetFID());
OGRGeometry *geometry = feature->GetGeometryRef();
ASSERT_NE(nullptr, geometry);
char *wkt_tmp = nullptr;
ASSERT_EQ(OGRERR_NONE, geometry->exportToWkt(&wkt_tmp));
std::unique_ptr<char, CplFreeDeleter> wkt(wkt_tmp);
wkt_tmp = nullptr;
ASSERT_NE(nullptr, wkt);
ASSERT_STREQ("POINT (100 0)", wkt.get());
}
TEST_F(GeoJsonTest, PointFromString) {
const string geojson =
"{"
" \"type\": \"Point\","
" \"coordinates\": [100.0, 0.0]"
"}";
unique_ptr<OGRDataSource> src(
OGRSFDriverRegistrar::Open(geojson.c_str(), false, nullptr));
ASSERT_NE(nullptr, src);
ASSERT_EQ(1, src->GetLayerCount());
OGRLayer *layer = src->GetLayer(0);
ASSERT_NE(nullptr, layer);
ASSERT_EQ(wkbPoint, layer->GetGeomType());
ASSERT_EQ(1, layer->GetFeatureCount());
ASSERT_STREQ("OGRGeoJSON", layer->GetName());
unique_ptr<OGRFeature> feature(layer->GetNextFeature());
OGRGeometry *geometry = feature->GetGeometryRef();
ASSERT_NE(nullptr, geometry);
char *wkt_tmp = nullptr;
ASSERT_EQ(OGRERR_NONE, geometry->exportToWkt(&wkt_tmp));
std::unique_ptr<char, CplFreeDeleter> wkt(wkt_tmp);
wkt_tmp = nullptr;
ASSERT_STREQ("POINT (100 0)", wkt.get());
}
TEST_F(GeoJsonTest, LineWithFields) {
const string filepath = GetTestFilePath(
kTestData, "linestring.geojson");
unique_ptr<OGRDataSource> src(
OGRSFDriverRegistrar::Open(filepath.c_str(), false, nullptr));
ASSERT_NE(nullptr, src);
ASSERT_EQ(1, src->GetLayerCount());
OGRLayer *layer = src->GetLayer(0);
ASSERT_NE(nullptr, layer);
ASSERT_EQ(wkbLineString, layer->GetGeomType());
ASSERT_EQ(1, layer->GetFeatureCount());
ASSERT_STREQ("OGRGeoJSON", layer->GetName());
OGRFeatureDefn *defn = layer->GetLayerDefn();
ASSERT_EQ(2, defn->GetFieldCount());
EXPECT_STREQ("first", defn->GetFieldDefn(0)->GetNameRef());
EXPECT_EQ(OFTInteger, defn->GetFieldDefn(0)->GetType());
EXPECT_STREQ("2nd", defn->GetFieldDefn(1)->GetNameRef());
EXPECT_EQ(OFTString, defn->GetFieldDefn(1)->GetType());
unique_ptr<OGRFeature> feature(layer->GetNextFeature());
ASSERT_NE(nullptr, feature);
EXPECT_EQ(1, feature->GetFieldAsInteger(0));
EXPECT_STREQ("1", feature->GetFieldAsString(0));
EXPECT_STREQ("second", feature->GetFieldAsString(1));
OGRGeometry *geometry = feature->GetGeometryRef();
ASSERT_NE(nullptr, geometry);
char *wkt_tmp = nullptr;
ASSERT_EQ(OGRERR_NONE, geometry->exportToWkt(&wkt_tmp));
std::unique_ptr<char, CplFreeDeleter> wkt(wkt_tmp);
wkt_tmp = nullptr;
ASSERT_NE(nullptr, wkt);
EXPECT_STREQ("LINESTRING (-120.12 38.64,-90.93 45.9)", wkt.get());
}
} // namespace
} // namespace autotest2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment