using Microsoft.Extensions.Logging.Abstractions; using TileServer.Domain.Tiles; using TileServer.Infrastructure.Tiles; using TileServer.Infrastructure.Tiles.Mvt; namespace TileServer.UnitTests; public sealed class VectorTileOverzoomerTests { [Fact] public void Overzoom_MapsParentPointIntoNwChild() { var parent = EncodePoint(100, 100, "poi"); var overzoomer = new VectorTileOverzoomer(NullLogger.Instance); var child = overzoomer.Overzoom(parent, new TileCoordinate(0, 0, 0), new TileCoordinate(1, 0, 0)); var decoded = MvtCodec.Decode(child); var layer = Assert.Single(decoded.Layers); Assert.Equal("poi", layer.Name); var feature = Assert.Single(layer.Features); var path = Assert.Single(MvtCodec.DecodeGeometry(feature.Geometry)); var point = Assert.Single(path); Assert.Equal(200, point.X); Assert.Equal(200, point.Y); } [Fact] public void Overzoom_DropsPointOutsideChild() { var parent = EncodePoint(100, 100, "poi"); var overzoomer = new VectorTileOverzoomer(NullLogger.Instance); var child = overzoomer.Overzoom(parent, new TileCoordinate(0, 0, 0), new TileCoordinate(1, 1, 1)); var decoded = MvtCodec.Decode(child); Assert.Empty(decoded.Layers); } private static TileData EncodePoint(int x, int y, string layerName) { var tile = new MvtTile { Layers = [ new MvtLayer { Name = layerName, Extent = 4096, Version = 2, Keys = ["class"], Values = [new MvtValue { StringValue = "test" }], Features = [ new MvtFeature { Id = 1, Type = MvtCodec.Point, Tags = [0, 0], Geometry = MvtCodec.EncodeGeometry([[(x, y)]], close: false) } ] } ] }; return MvtCodec.EncodeGzip(tile); } }