summaryrefslogtreecommitdiff
path: root/test/map/transform.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/map/transform.cpp')
-rw-r--r--test/map/transform.cpp236
1 files changed, 236 insertions, 0 deletions
diff --git a/test/map/transform.cpp b/test/map/transform.cpp
new file mode 100644
index 0000000000..4a8b685564
--- /dev/null
+++ b/test/map/transform.cpp
@@ -0,0 +1,236 @@
+#include "../fixtures/util.hpp"
+#include "../fixtures/mock_view.hpp"
+
+#include <mbgl/map/transform.hpp>
+#include <mbgl/util/geo.hpp>
+
+using namespace mbgl;
+
+TEST(Transform, InvalidScale) {
+ MockView view;
+ Transform transform(view, ConstrainMode::HeightOnly);
+
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().latitude);
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().longitude);
+ ASSERT_DOUBLE_EQ(1, transform.getScale());
+
+ transform.setScale(2 << 0);
+
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().latitude);
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().longitude);
+ ASSERT_DOUBLE_EQ(2, transform.getScale());
+
+ const double invalid = std::nan("");
+ transform.setScale(invalid);
+
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().latitude);
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().longitude);
+ ASSERT_DOUBLE_EQ(2, transform.getScale());
+
+ transform.scaleBy(invalid);
+
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().latitude);
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().longitude);
+ ASSERT_DOUBLE_EQ(2, transform.getScale());
+
+ transform.setZoom(invalid);
+
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().latitude);
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().longitude);
+ ASSERT_DOUBLE_EQ(2, transform.getScale());
+
+ transform.setLatLngZoom({ 0, 0 }, invalid);
+
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().latitude);
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().longitude);
+ ASSERT_DOUBLE_EQ(2, transform.getScale());
+}
+
+TEST(Transform, InvalidLatLng) {
+ MockView view;
+ Transform transform(view, ConstrainMode::HeightOnly);
+
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().latitude);
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().longitude);
+ ASSERT_DOUBLE_EQ(1, transform.getScale());
+
+ transform.setScale(2 << 0);
+ transform.setLatLng({ 8, 10 });
+
+ ASSERT_DOUBLE_EQ(8, transform.getLatLng().latitude);
+ ASSERT_DOUBLE_EQ(10, transform.getLatLng().longitude);
+ ASSERT_DOUBLE_EQ(2, transform.getScale());
+
+ transform.setLatLngZoom({ 10, 8 }, 2);
+
+ ASSERT_DOUBLE_EQ(10, transform.getLatLng().latitude);
+ ASSERT_DOUBLE_EQ(8, transform.getLatLng().longitude);
+ ASSERT_DOUBLE_EQ(4, transform.getScale());
+
+ const double invalid = std::nan("");
+ transform.setLatLngZoom({ invalid, 8 }, 2);
+
+ ASSERT_DOUBLE_EQ(10, transform.getLatLng().latitude);
+ ASSERT_DOUBLE_EQ(8, transform.getLatLng().longitude);
+ ASSERT_DOUBLE_EQ(4, transform.getScale());
+
+ transform.setLatLngZoom({ 10, invalid }, 2);
+
+ ASSERT_DOUBLE_EQ(10, transform.getLatLng().latitude);
+ ASSERT_DOUBLE_EQ(8, transform.getLatLng().longitude);
+ ASSERT_DOUBLE_EQ(4, transform.getScale());
+}
+
+
+TEST(Transform, InvalidBearing) {
+ MockView view;
+ Transform transform(view, ConstrainMode::HeightOnly);
+
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().latitude);
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().longitude);
+ ASSERT_DOUBLE_EQ(1, transform.getScale());
+
+ transform.setScale(2 << 0);
+ transform.setAngle(2);
+
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().latitude);
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().longitude);
+ ASSERT_DOUBLE_EQ(2, transform.getScale());
+ ASSERT_DOUBLE_EQ(2, transform.getAngle());
+
+ const double invalid = std::nan("");
+ transform.setAngle(invalid);
+
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().latitude);
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().longitude);
+ ASSERT_DOUBLE_EQ(2, transform.getScale());
+ ASSERT_DOUBLE_EQ(2, transform.getAngle());
+}
+
+TEST(Transform, PerspectiveProjection) {
+ MockView view;
+ Transform transform(view, ConstrainMode::HeightOnly);
+
+ transform.resize({{ 1000, 1000 }});
+ transform.setScale(2 << 9);
+ transform.setPitch(0.9);
+ transform.setLatLng(LatLng(38, -77));
+
+ // expected values are from mapbox-gl-js
+
+ LatLng loc = transform.getState().pointToLatLng({ 500, 500 });
+ ASSERT_NEAR(-77, loc.longitude, 0.0001);
+ ASSERT_NEAR(38, loc.latitude, 0.0001);
+
+ loc = transform.getState().pointToLatLng({ 0, 1000 });
+ ASSERT_NEAR(-77.59198961199148, loc.longitude, 0.0002);
+ ASSERT_NEAR(38.74661326302018, loc.latitude, 0.0001);
+
+ loc = transform.getState().pointToLatLng({ 1000, 0 });
+ ASSERT_NEAR(-76.75823239205641, loc.longitude, 0.0001);
+ ASSERT_NEAR(37.692872969426375, loc.latitude, 0.0001);
+
+ PrecisionPoint point = transform.getState().latLngToPoint({38.74661326302018, -77.59198961199148});
+ ASSERT_NEAR(point.x, 0, 0.01);
+ ASSERT_NEAR(point.y, 1000, 0.01);
+
+ point = transform.getState().latLngToPoint({37.692872969426375, -76.75823239205641});
+ ASSERT_NEAR(point.x, 1000, 0.02);
+ ASSERT_NEAR(point.y, 0, 0.02);
+}
+
+TEST(Transform, ConstrainHeightOnly) {
+ MockView view;
+ LatLng loc;
+ LatLngBounds bounds;
+
+ Transform transform(view, ConstrainMode::HeightOnly);
+ transform.resize({{ 1000, 1000 }});
+ transform.setScale(1024);
+
+ transform.setLatLng(bounds.sw);
+ loc = transform.getState().pointToLatLng({ 500, 500 });
+ ASSERT_NEAR(-85.021422866378714, loc.latitude, 0.0001);
+ ASSERT_NEAR(180, std::abs(loc.longitude), 0.0001);
+
+ transform.setLatLng(bounds.ne);
+ loc = transform.getState().pointToLatLng({ 500, 500 });
+ ASSERT_NEAR(85.021422866378742, loc.latitude, 0.0001);
+ ASSERT_NEAR(180, std::abs(loc.longitude), 0.0001);
+}
+
+TEST(Transform, ConstrainWidthAndHeight) {
+ MockView view;
+ LatLng loc;
+ LatLngBounds bounds;
+
+ Transform transform(view, ConstrainMode::WidthAndHeight);
+ transform.resize({{ 1000, 1000 }});
+ transform.setScale(1024);
+
+ transform.setLatLng(bounds.sw);
+ loc = transform.getState().pointToLatLng({ 500, 500 });
+ ASSERT_NEAR(-85.021422866378714, loc.latitude, 0.0001);
+ ASSERT_NEAR(-179.65667724609375, loc.longitude, 0.0001);
+
+ transform.setLatLng(bounds.ne);
+ loc = transform.getState().pointToLatLng({ 500, 500 });
+ ASSERT_NEAR(85.021422866378742, loc.latitude, 0.0001);
+ ASSERT_NEAR(179.65667724609358, std::abs(loc.longitude), 0.0001);
+}
+
+TEST(Transform, Anchor) {
+ MockView view;
+ Transform transform(view, ConstrainMode::HeightOnly);
+
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().latitude);
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().longitude);
+ ASSERT_DOUBLE_EQ(1, transform.getScale());
+
+ transform.setLatLngZoom({ 10, -100 }, 10);
+
+ ASSERT_DOUBLE_EQ(10, transform.getLatLng().latitude);
+ ASSERT_DOUBLE_EQ(-100, transform.getLatLng().longitude);
+ ASSERT_DOUBLE_EQ(10, transform.getZoom());
+ ASSERT_DOUBLE_EQ(0, transform.getAngle());
+
+ const PrecisionPoint anchorPoint = {0, 0};
+ const LatLng anchorLatLng = transform.getState().pointToLatLng(anchorPoint);
+ transform.setAngle(M_PI_4, anchorPoint);
+
+ ASSERT_NEAR(M_PI_4, transform.getAngle(), 0.000001);
+ ASSERT_NE(anchorLatLng, transform.getLatLng());
+ ASSERT_DOUBLE_EQ(anchorLatLng, transform.getState().pointToLatLng(anchorPoint));
+}
+
+TEST(Transform, Padding) {
+ MockView view;
+ Transform transform(view, ConstrainMode::HeightOnly);
+ transform.resize({{ 1000, 1000 }});
+
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().latitude);
+ ASSERT_DOUBLE_EQ(0, transform.getLatLng().longitude);
+
+ transform.setLatLngZoom({ 10, -100 }, 10);
+
+ const LatLng trueCenter = transform.getLatLng();
+ ASSERT_DOUBLE_EQ(10, trueCenter.latitude);
+ ASSERT_DOUBLE_EQ(-100, trueCenter.longitude);
+ ASSERT_DOUBLE_EQ(10, transform.getZoom());
+
+ const LatLng manualShiftedCenter = transform.getState().pointToLatLng({
+ 1000.0 / 2.0,
+ 1000.0 / 4.0,
+ });
+
+ EdgeInsets padding;
+ padding.top = 1000.0 / 2.0;
+ ASSERT_GT(padding.top, 0);
+ ASSERT_TRUE(padding);
+
+ const LatLng shiftedCenter = transform.getLatLng(padding);
+ ASSERT_NE(trueCenter.latitude, shiftedCenter.latitude);
+ ASSERT_DOUBLE_EQ(trueCenter.longitude, shiftedCenter.longitude);
+ ASSERT_DOUBLE_EQ(manualShiftedCenter.latitude, shiftedCenter.latitude);
+ ASSERT_DOUBLE_EQ(manualShiftedCenter.longitude, shiftedCenter.longitude);
+}