[core] Add unit test for CrossTileSymbolIndex

This commit is contained in:
Ansis Brammanis
2017-11-15 11:44:42 -05:00
committed by Chris Loer
parent c39232a89f
commit d69c1c4806
4 changed files with 91 additions and 7 deletions

View File

@@ -22,8 +22,8 @@ set(MBGL_TEST_FILES
# gl
test/gl/bucket.test.cpp
test/gl/object.test.cpp
test/gl/context.test.cpp
test/gl/object.test.cpp
# include/mbgl
test/include/mbgl/test.hpp
@@ -111,6 +111,7 @@ set(MBGL_TEST_FILES
test/style/style_parser.test.cpp
# text
test/text/cross_tile_symbol_index.test.cpp
test/text/glyph_loader.test.cpp
test/text/glyph_pbf.test.cpp
test/text/quads.test.cpp

View File

@@ -57,9 +57,7 @@ void TileLayerIndex::findMatches(std::vector<SymbolInstance>& symbolInstances, c
CrossTileSymbolLayerIndex::CrossTileSymbolLayerIndex() {
}
uint32_t CrossTileSymbolLayerIndex::maxCrossTileID = 0;
void CrossTileSymbolLayerIndex::addBucket(const OverscaledTileID& coord, SymbolBucket& bucket) {
void CrossTileSymbolLayerIndex::addBucket(const OverscaledTileID& coord, SymbolBucket& bucket, uint32_t& maxCrossTileID) {
if (bucket.bucketInstanceId) return;
bucket.bucketInstanceId = ++maxBucketInstanceId;
@@ -149,7 +147,7 @@ bool CrossTileSymbolIndex::addLayer(RenderSymbolLayer& symbolLayer) {
if (!symbolBucket.bucketInstanceId) {
symbolBucketsChanged = true;
}
layerIndex.addBucket(renderTile.tile.id, symbolBucket);
layerIndex.addBucket(renderTile.tile.id, symbolBucket, maxCrossTileID);
currentBucketIDs.insert(symbolBucket.bucketInstanceId);
}

View File

@@ -42,12 +42,11 @@ public:
class CrossTileSymbolLayerIndex {
public:
CrossTileSymbolLayerIndex();
void addBucket(const OverscaledTileID&, SymbolBucket&);
void addBucket(const OverscaledTileID&, SymbolBucket&, uint32_t& maxCrossTileID);
bool removeStaleBuckets(const std::unordered_set<uint32_t>& currentIDs);
private:
std::map<uint8_t,std::map<OverscaledTileID,TileLayerIndex>> indexes;
uint32_t maxBucketInstanceId = 0;
static uint32_t maxCrossTileID;
};
class CrossTileSymbolIndex {
@@ -59,6 +58,7 @@ public:
void reset();
private:
std::map<std::string, CrossTileSymbolLayerIndex> layerIndexes;
uint32_t maxCrossTileID = 0;
};
} // namespace mbgl

View File

@@ -0,0 +1,85 @@
#include <mbgl/text/cross_tile_symbol_index.hpp>
#include <mbgl/renderer/buckets/symbol_bucket.hpp>
#include <mbgl/test/util.hpp>
using namespace mbgl;
SymbolInstance makeSymbolInstance(float x, float y, std::u16string key) {
GeometryCoordinates line;
GlyphPositionMap gpm;
const std::pair<Shaping, Shaping> shaping(Shaping{}, Shaping{});
style::SymbolLayoutProperties::Evaluated layout_;
IndexedSubfeature subfeature(0, "", "", 0);
Anchor anchor(x, y, 0, 0);
return {anchor, line, shaping, {}, layout_, 0, 0, 0, 0, style::SymbolPlacementType::Point, {{0, 0}}, 0, 0, {{0, 0}}, gpm, subfeature, 0, key, 0 };
}
TEST(CrossTileSymbolLayerIndex, addBucket) {
uint32_t maxCrossTileID = 0;
CrossTileSymbolLayerIndex index;
style::SymbolLayoutProperties::PossiblyEvaluated layout;
bool sdfIcons = false;
bool iconsNeedLinear = false;
bool sortFeaturesByY = false;
OverscaledTileID mainID(6, 0, 6, 8, 8);
std::vector<SymbolInstance> mainInstances;
mainInstances.push_back(makeSymbolInstance(1000, 1000, u"Detroit"));
mainInstances.push_back(makeSymbolInstance(2000, 2000, u"Toronto"));
SymbolBucket mainBucket { layout, {}, 16.0f, 1.0f, 0, sdfIcons, iconsNeedLinear, sortFeaturesByY, std::move(mainInstances) };
index.addBucket(mainID, mainBucket, maxCrossTileID);
// Assigned new IDs
ASSERT_EQ(mainBucket.symbolInstances.at(0).crossTileID, 1u);
ASSERT_EQ(mainBucket.symbolInstances.at(1).crossTileID, 2u);
OverscaledTileID childID(7, 0, 7, 16, 16);
std::vector<SymbolInstance> childInstances;
childInstances.push_back(makeSymbolInstance(2000, 2000, u"Detroit"));
childInstances.push_back(makeSymbolInstance(2000, 2000, u"Windsor"));
childInstances.push_back(makeSymbolInstance(3000, 3000, u"Toronto"));
childInstances.push_back(makeSymbolInstance(4001, 4001, u"Toronto"));
SymbolBucket childBucket { layout, {}, 16.0f, 1.0f, 0, sdfIcons, iconsNeedLinear, sortFeaturesByY, std::move(childInstances) };
index.addBucket(childID, childBucket, maxCrossTileID);
// matched parent tile
ASSERT_EQ(childBucket.symbolInstances.at(0).crossTileID, 1u);
// does not match because of different key
ASSERT_EQ(childBucket.symbolInstances.at(1).crossTileID, 3u);
// does not match because of different location
ASSERT_EQ(childBucket.symbolInstances.at(2).crossTileID, 4u);
// matches with a slightly different location
ASSERT_EQ(childBucket.symbolInstances.at(3).crossTileID, 2u);
OverscaledTileID parentID(5, 0, 5, 4, 4);
std::vector<SymbolInstance> parentInstances;
parentInstances.push_back(makeSymbolInstance(500, 500, u"Detroit"));
SymbolBucket parentBucket { layout, {}, 16.0f, 1.0f, 0, sdfIcons, iconsNeedLinear, sortFeaturesByY, std::move(parentInstances) };
index.addBucket(parentID, parentBucket, maxCrossTileID);
// matched child tile
ASSERT_EQ(parentBucket.symbolInstances.at(0).crossTileID, 1u);
std::unordered_set<uint32_t> currentIDs;
currentIDs.insert(mainBucket.bucketInstanceId);
index.removeStaleBuckets(currentIDs);
// grandchild
OverscaledTileID grandchildID(8, 0, 8, 32, 32);
std::vector<SymbolInstance> grandchildInstances;
grandchildInstances.push_back(makeSymbolInstance(4000, 4000, u"Detroit"));
grandchildInstances.push_back(makeSymbolInstance(4000, 4000, u"Windsor"));
SymbolBucket grandchildBucket { layout, {}, 16.0f, 1.0f, 0, sdfIcons, iconsNeedLinear, sortFeaturesByY, std::move(grandchildInstances) };
index.addBucket(grandchildID, grandchildBucket, maxCrossTileID);
// Matches the symbol in `mainBucket`
ASSERT_EQ(grandchildBucket.symbolInstances.at(0).crossTileID, 1u);
// Does not match the previous value for Windsor because that tile was removed
ASSERT_EQ(grandchildBucket.symbolInstances.at(1).crossTileID, 5u);
}