diff --git a/test/renderer/style_diff.test.cpp b/test/renderer/style_diff.test.cpp new file mode 100644 index 000000000..7e2701bce --- /dev/null +++ b/test/renderer/style_diff.test.cpp @@ -0,0 +1,113 @@ +#include + +#include +#include + +using namespace mbgl; +using namespace mbgl::style; + +struct TestLayerImpl : style::Layer::Impl { + TestLayerImpl(std::string layerID, std::string sourceID) + : Impl(std::move(layerID), std::move(sourceID)) {} + + bool hasLayoutDifference(const Layer::Impl&) const override { return false; } + void stringifyLayout(rapidjson::Writer&) const override {} + + DECLARE_LAYER_TYPE_INFO; +}; + +const LayerTypeInfo* TestLayerImpl::staticTypeInfo() noexcept { + const static LayerTypeInfo typeInfo{"test", + LayerTypeInfo::Source::NotRequired, + LayerTypeInfo::Pass3D::NotRequired, + LayerTypeInfo::Layout::NotRequired, + LayerTypeInfo::FadingTiles::NotRequired, + LayerTypeInfo::CrossTileIndex::NotRequired, + LayerTypeInfo::TileKind::NotRequired}; + return &typeInfo; +} + +TEST(StyleDiff, Empty) { + auto a = makeMutable>(); + auto b = makeMutable>(); + auto diff = diffLayers(Immutable>(std::move(a)), + Immutable>(std::move(b))); + ASSERT_TRUE(diff.added.empty()); + ASSERT_TRUE(diff.removed.empty()); + ASSERT_TRUE(diff.changed.empty()); +} + +TEST(StyleDiff, Add) { + auto l1 = Immutable(makeMutable("id-1", "src-1")); + auto l2 = Immutable(makeMutable("id-2", "src-2")); + + auto a = makeMutable>(); + a->push_back(l1); + auto b = makeMutable>(); + b->push_back(l1); + b->push_back(l2); + + auto diff = diffLayers(Immutable>(std::move(a)), + Immutable>(std::move(b))); + + ASSERT_EQ(1, diff.added.size()); + ASSERT_EQ(0, diff.removed.size()); + ASSERT_EQ(0, diff.changed.size()); +} + +TEST(StyleDiff, Remove) { + auto l1 = Immutable(makeMutable("id-1", "src-1")); + auto l2 = Immutable(makeMutable("id-2", "src-2")); + + auto a = makeMutable>(); + a->push_back(l1); + a->push_back(l2); + auto b = makeMutable>(); + b->push_back(l1); + + auto diff = diffLayers(Immutable>(std::move(a)), + Immutable>(std::move(b))); + + ASSERT_EQ(0, diff.added.size()); + ASSERT_EQ(1, diff.removed.size()); + ASSERT_EQ(0, diff.changed.size()); +} + +// Different identical instances show up as changed +TEST(StyleDiff, Compare) { + auto a = makeMutable>(); + a->push_back(makeMutable("id-1", "src-1")); + a->push_back(makeMutable("id-2", "src-2")); + + auto b = makeMutable>(); + b->push_back(makeMutable("id-1", "src-1")); + b->push_back(makeMutable("id-2", "src-2")); + + auto diff = diffLayers(Immutable>(std::move(a)), + Immutable>(std::move(b))); + + ASSERT_EQ(0, diff.added.size()); + ASSERT_EQ(0, diff.removed.size()); + ASSERT_EQ(2, diff.changed.size()); +} + +// Order change shows up as add and remove +TEST(StyleDiff, Order) { + auto l1 = Immutable(makeMutable("id-1", "src-1")); + auto l2 = Immutable(makeMutable("id-2", "src-2")); + + auto a = makeMutable>(); + a->push_back(l1); + a->push_back(l2); + + auto b = makeMutable>(); + b->push_back(l2); + b->push_back(l1); + + auto diff = diffLayers(Immutable>(std::move(a)), + Immutable>(std::move(b))); + + ASSERT_EQ(1, diff.added.size()); + ASSERT_EQ(1, diff.removed.size()); + ASSERT_EQ(0, diff.changed.size()); +}