diff --git a/DotTiled.Benchmark/DotTiled.Benchmark.csproj b/DotTiled.Benchmark/DotTiled.Benchmark.csproj
index 3fc12d3..739d619 100644
--- a/DotTiled.Benchmark/DotTiled.Benchmark.csproj
+++ b/DotTiled.Benchmark/DotTiled.Benchmark.csproj
@@ -9,6 +9,7 @@
+
diff --git a/DotTiled.Benchmark/Program.cs b/DotTiled.Benchmark/Program.cs
index c44b79b..1abb982 100644
--- a/DotTiled.Benchmark/Program.cs
+++ b/DotTiled.Benchmark/Program.cs
@@ -1,26 +1,81 @@
using System;
+using System.Collections.Immutable;
using System.Security.Cryptography;
+using System.Text;
+using System.Xml;
using BenchmarkDotNet.Attributes;
+using BenchmarkDotNet.Columns;
+using BenchmarkDotNet.Configs;
+using BenchmarkDotNet.Order;
+using BenchmarkDotNet.Reports;
using BenchmarkDotNet.Running;
namespace MyBenchmarks
{
- public class MapLoader
+ [GroupBenchmarksBy(BenchmarkLogicalGroupRule.ByCategory)]
+ [CategoriesColumn]
+ [Orderer(SummaryOrderPolicy.FastestToSlowest)]
+ public class MapLoading
{
- public MapLoader()
+ private string _tmxPath = @"C:\Users\Daniel\winrepos\DotTiled\DotTiled.Tests\Serialization\Tmx\TestData\Map\empty-map-csv.tmx";
+ private string _tmxContents = "";
+
+ public MapLoading()
{
+ _tmxContents = System.IO.File.ReadAllText(_tmxPath);
}
- [Benchmark]
- public DotTiled.Map LoadWithDotTiled()
+ [BenchmarkCategory("MapFromInMemoryTmxString")]
+ [Benchmark(Baseline = true, Description = "DotTiled")]
+ public DotTiled.Map LoadWithDotTiledFromInMemoryString()
{
- throw new NotImplementedException();
+ using var stringReader = new StringReader(_tmxContents);
+ using var xmlReader = XmlReader.Create(stringReader);
+ using var mapReader = new DotTiled.TmxMapReader(xmlReader, _ => throw new Exception(), _ => throw new Exception());
+ return mapReader.ReadMap();
}
- [Benchmark]
- public TiledLib.Map LoadWithTiledLib()
+ [BenchmarkCategory("MapFromTmxFile")]
+ [Benchmark(Baseline = true, Description = "DotTiled")]
+ public DotTiled.Map LoadWithDotTiledFromFile()
{
- throw new NotImplementedException();
+ using var fileStream = System.IO.File.OpenRead(_tmxPath);
+ using var xmlReader = XmlReader.Create(fileStream);
+ using var mapReader = new DotTiled.TmxMapReader(xmlReader, _ => throw new Exception(), _ => throw new Exception());
+ return mapReader.ReadMap();
+ }
+
+ [BenchmarkCategory("MapFromInMemoryTmxString")]
+ [Benchmark(Description = "TiledLib")]
+ public TiledLib.Map LoadWithTiledLibFromInMemoryString()
+ {
+ using var memStream = new MemoryStream(Encoding.UTF8.GetBytes(_tmxContents));
+ return TiledLib.Map.FromStream(memStream);
+ }
+
+ [BenchmarkCategory("MapFromTmxFile")]
+ [Benchmark(Description = "TiledLib")]
+ public TiledLib.Map LoadWithTiledLibFromFile()
+ {
+ using var fileStream = System.IO.File.OpenRead(_tmxPath);
+ var map = TiledLib.Map.FromStream(fileStream);
+ return map;
+ }
+
+ [BenchmarkCategory("MapFromInMemoryTmxString")]
+ [Benchmark(Description = "TiledCSPlus")]
+ public TiledCSPlus.TiledMap LoadWithTiledCSPlusFromInMemoryString()
+ {
+ using var memStream = new MemoryStream(Encoding.UTF8.GetBytes(_tmxContents));
+ return new TiledCSPlus.TiledMap(memStream);
+ }
+
+ [BenchmarkCategory("MapFromTmxFile")]
+ [Benchmark(Description = "TiledCSPlus")]
+ public TiledCSPlus.TiledMap LoadWithTiledCSPlusFromFile()
+ {
+ using var fileStream = System.IO.File.OpenRead(_tmxPath);
+ return new TiledCSPlus.TiledMap(fileStream);
}
}
@@ -28,7 +83,10 @@ namespace MyBenchmarks
{
public static void Main(string[] args)
{
- //var summary = BenchmarkRunner.Run();
+ var config = BenchmarkDotNet.Configs.DefaultConfig.Instance
+ .WithOptions(ConfigOptions.DisableOptimizationsValidator)
+ .AddDiagnoser(BenchmarkDotNet.Diagnosers.MemoryDiagnoser.Default);
+ var summary = BenchmarkRunner.Run(config);
}
}
}
diff --git a/DotTiled.Tests/TmxSerializer/TmxSerializer.DataTests.cs b/DotTiled.Tests/Assert/AssertData.cs
similarity index 80%
rename from DotTiled.Tests/TmxSerializer/TmxSerializer.DataTests.cs
rename to DotTiled.Tests/Assert/AssertData.cs
index e08d402..d4b54f0 100644
--- a/DotTiled.Tests/TmxSerializer/TmxSerializer.DataTests.cs
+++ b/DotTiled.Tests/Assert/AssertData.cs
@@ -1,8 +1,8 @@
namespace DotTiled.Tests;
-public partial class TmxSerializerDataTests
+public static partial class DotTiledAssert
{
- public static void AssertData(Data? actual, Data? expected)
+ internal static void AssertData(Data? expected, Data? actual)
{
if (expected is null)
{
@@ -24,11 +24,11 @@ public partial class TmxSerializerDataTests
Assert.NotNull(actual.Chunks);
Assert.Equal(expected.Chunks.Length, actual.Chunks.Length);
for (var i = 0; i < expected.Chunks.Length; i++)
- AssertChunk(actual.Chunks[i], expected.Chunks[i]);
+ AssertChunk(expected.Chunks[i], actual.Chunks[i]);
}
}
- private static void AssertChunk(Chunk actual, Chunk expected)
+ private static void AssertChunk(Chunk expected, Chunk actual)
{
// Attributes
Assert.Equal(expected.X, actual.X);
diff --git a/DotTiled.Tests/TmxSerializer/TmxSerializer.ImageTests.cs b/DotTiled.Tests/Assert/AssertImage.cs
similarity index 79%
rename from DotTiled.Tests/TmxSerializer/TmxSerializer.ImageTests.cs
rename to DotTiled.Tests/Assert/AssertImage.cs
index 7d00713..9943c46 100644
--- a/DotTiled.Tests/TmxSerializer/TmxSerializer.ImageTests.cs
+++ b/DotTiled.Tests/Assert/AssertImage.cs
@@ -1,8 +1,8 @@
namespace DotTiled.Tests;
-public partial class TmxSerializerImageTests
+public static partial class DotTiledAssert
{
- public static void AssertImage(Image? actual, Image? expected)
+ internal static void AssertImage(Image? expected, Image? actual)
{
if (expected is null)
{
diff --git a/DotTiled.Tests/TmxSerializer/TmxSerializer.LayerTests.cs b/DotTiled.Tests/Assert/AssertLayer.cs
similarity index 66%
rename from DotTiled.Tests/TmxSerializer/TmxSerializer.LayerTests.cs
rename to DotTiled.Tests/Assert/AssertLayer.cs
index c3289a4..57df04d 100644
--- a/DotTiled.Tests/TmxSerializer/TmxSerializer.LayerTests.cs
+++ b/DotTiled.Tests/Assert/AssertLayer.cs
@@ -1,8 +1,8 @@
namespace DotTiled.Tests;
-public partial class TmxSerializerLayerTests
+public static partial class DotTiledAssert
{
- public static void AssertLayer(BaseLayer? actual, BaseLayer? expected)
+ internal static void AssertLayer(BaseLayer? expected, BaseLayer? actual)
{
if (expected is null)
{
@@ -23,11 +23,11 @@ public partial class TmxSerializerLayerTests
Assert.Equal(expected.ParallaxX, actual.ParallaxX);
Assert.Equal(expected.ParallaxY, actual.ParallaxY);
- TmxSerializerPropertiesTests.AssertProperties(actual.Properties, expected.Properties);
- AssertLayer((dynamic)actual, (dynamic)expected);
+ AssertProperties(expected.Properties, actual.Properties);
+ AssertLayer((dynamic)expected, (dynamic)actual);
}
- private static void AssertLayer(TileLayer actual, TileLayer expected)
+ private static void AssertLayer(TileLayer expected, TileLayer actual)
{
// Attributes
Assert.Equal(expected.Width, actual.Width);
@@ -36,10 +36,10 @@ public partial class TmxSerializerLayerTests
Assert.Equal(expected.Y, actual.Y);
Assert.NotNull(actual.Data);
- TmxSerializerDataTests.AssertData(actual.Data, expected.Data);
+ AssertData(expected.Data, actual.Data);
}
- private static void AssertLayer(ObjectLayer actual, ObjectLayer expected)
+ private static void AssertLayer(ObjectLayer expected, ObjectLayer actual)
{
// Attributes
Assert.Equal(expected.DrawOrder, actual.DrawOrder);
@@ -49,10 +49,10 @@ public partial class TmxSerializerLayerTests
Assert.NotNull(actual.Objects);
Assert.Equal(expected.Objects.Count, actual.Objects.Count);
for (var i = 0; i < expected.Objects.Count; i++)
- TmxSerializerObjectTests.AssertObject(actual.Objects[i], expected.Objects[i]);
+ AssertObject(expected.Objects[i], actual.Objects[i]);
}
- private static void AssertLayer(ImageLayer actual, ImageLayer expected)
+ private static void AssertLayer(ImageLayer expected, ImageLayer actual)
{
// Attributes
Assert.Equal(expected.RepeatX, actual.RepeatX);
@@ -61,15 +61,15 @@ public partial class TmxSerializerLayerTests
Assert.Equal(expected.Y, actual.Y);
Assert.NotNull(actual.Image);
- TmxSerializerImageTests.AssertImage(actual.Image, expected.Image);
+ AssertImage(expected.Image, actual.Image);
}
- private static void AssertLayer(Group actual, Group expected)
+ private static void AssertLayer(Group expected, Group actual)
{
// Attributes
Assert.NotNull(actual.Layers);
Assert.Equal(expected.Layers.Count, actual.Layers.Count);
for (var i = 0; i < expected.Layers.Count; i++)
- AssertLayer(actual.Layers[i], expected.Layers[i]);
+ AssertLayer(expected.Layers[i], actual.Layers[i]);
}
}
diff --git a/DotTiled.Tests/Assert/AssertMap.cs b/DotTiled.Tests/Assert/AssertMap.cs
new file mode 100644
index 0000000..167d0ad
--- /dev/null
+++ b/DotTiled.Tests/Assert/AssertMap.cs
@@ -0,0 +1,40 @@
+namespace DotTiled.Tests;
+
+public static partial class DotTiledAssert
+{
+ internal static void AssertMap(Map expected, Map actual)
+ {
+ // Attributes
+ Assert.Equal(expected.Version, actual.Version);
+ Assert.Equal(expected.TiledVersion, actual.TiledVersion);
+ Assert.Equal(expected.Class, actual.Class);
+ Assert.Equal(expected.Orientation, actual.Orientation);
+ Assert.Equal(expected.RenderOrder, actual.RenderOrder);
+ Assert.Equal(expected.CompressionLevel, actual.CompressionLevel);
+ Assert.Equal(expected.Width, actual.Width);
+ Assert.Equal(expected.Height, actual.Height);
+ Assert.Equal(expected.TileWidth, actual.TileWidth);
+ Assert.Equal(expected.TileHeight, actual.TileHeight);
+ Assert.Equal(expected.HexSideLength, actual.HexSideLength);
+ Assert.Equal(expected.StaggerAxis, actual.StaggerAxis);
+ Assert.Equal(expected.StaggerIndex, actual.StaggerIndex);
+ Assert.Equal(expected.ParallaxOriginX, actual.ParallaxOriginX);
+ Assert.Equal(expected.ParallaxOriginY, actual.ParallaxOriginY);
+ Assert.Equal(expected.BackgroundColor, actual.BackgroundColor);
+ Assert.Equal(expected.NextLayerID, actual.NextLayerID);
+ Assert.Equal(expected.NextObjectID, actual.NextObjectID);
+ Assert.Equal(expected.Infinite, actual.Infinite);
+
+ AssertProperties(actual.Properties, expected.Properties);
+
+ Assert.NotNull(actual.Tilesets);
+ Assert.Equal(expected.Tilesets.Count, actual.Tilesets.Count);
+ for (var i = 0; i < expected.Tilesets.Count; i++)
+ AssertTileset(actual.Tilesets[i], expected.Tilesets[i]);
+
+ Assert.NotNull(actual.Layers);
+ Assert.Equal(expected.Layers.Count, actual.Layers.Count);
+ for (var i = 0; i < expected.Layers.Count; i++)
+ AssertLayer(actual.Layers[i], expected.Layers[i]);
+ }
+}
diff --git a/DotTiled.Tests/TmxSerializer/TmxSerializer.ObjectTests.cs b/DotTiled.Tests/Assert/AssertObject.cs
similarity index 68%
rename from DotTiled.Tests/TmxSerializer/TmxSerializer.ObjectTests.cs
rename to DotTiled.Tests/Assert/AssertObject.cs
index c593074..68d74eb 100644
--- a/DotTiled.Tests/TmxSerializer/TmxSerializer.ObjectTests.cs
+++ b/DotTiled.Tests/Assert/AssertObject.cs
@@ -1,8 +1,8 @@
namespace DotTiled.Tests;
-public partial class TmxSerializerObjectTests
+public static partial class DotTiledAssert
{
- public static void AssertObject(Object actual, Object expected)
+ internal static void AssertObject(Object expected, Object actual)
{
// Attributes
Assert.Equal(expected.ID, actual.ID);
@@ -17,36 +17,36 @@ public partial class TmxSerializerObjectTests
Assert.Equal(expected.Visible, actual.Visible);
Assert.Equal(expected.Template, actual.Template);
- TmxSerializerPropertiesTests.AssertProperties(actual.Properties, expected.Properties);
- AssertObject((dynamic)actual, (dynamic)expected);
+ AssertProperties(actual.Properties, expected.Properties);
+ AssertObject((dynamic)expected, (dynamic)actual);
}
- private static void AssertObject(RectangleObject actual, RectangleObject expected)
+ private static void AssertObject(RectangleObject expected, RectangleObject actual)
{
Assert.True(true); // A rectangle object is the same as the abstract Object
}
- private static void AssertObject(EllipseObject actual, EllipseObject expected)
+ private static void AssertObject(EllipseObject expected, EllipseObject actual)
{
Assert.True(true); // An ellipse object is the same as the abstract Object
}
- private static void AssertObject(PointObject actual, PointObject expected)
+ private static void AssertObject(PointObject expected, PointObject actual)
{
Assert.True(true); // A point object is the same as the abstract Object
}
- private static void AssertObject(PolygonObject actual, PolygonObject expected)
+ private static void AssertObject(PolygonObject expected, PolygonObject actual)
{
Assert.Equal(expected.Points, actual.Points);
}
- private static void AssertObject(PolylineObject actual, PolylineObject expected)
+ private static void AssertObject(PolylineObject expected, PolylineObject actual)
{
Assert.Equal(expected.Points, actual.Points);
}
- private static void AssertObject(TextObject actual, TextObject expected)
+ private static void AssertObject(TextObject expected, TextObject actual)
{
// Attributes
Assert.Equal(expected.FontFamily, actual.FontFamily);
diff --git a/DotTiled.Tests/TmxSerializer/TmxSerializer.PropertiesTests.cs b/DotTiled.Tests/Assert/AssertProperties.cs
similarity index 91%
rename from DotTiled.Tests/TmxSerializer/TmxSerializer.PropertiesTests.cs
rename to DotTiled.Tests/Assert/AssertProperties.cs
index e22e5b9..d0a8269 100644
--- a/DotTiled.Tests/TmxSerializer/TmxSerializer.PropertiesTests.cs
+++ b/DotTiled.Tests/Assert/AssertProperties.cs
@@ -1,8 +1,8 @@
namespace DotTiled.Tests;
-public partial class TmxSerializerPropertiesTests
+public static partial class DotTiledAssert
{
- public static void AssertProperties(Dictionary? actual, Dictionary? expected)
+ internal static void AssertProperties(Dictionary? expected, Dictionary? actual)
{
if (expected is null)
{
diff --git a/DotTiled.Tests/TmxSerializer/TmxSerializer.TilesetTests.cs b/DotTiled.Tests/Assert/AssertTileset.cs
similarity index 68%
rename from DotTiled.Tests/TmxSerializer/TmxSerializer.TilesetTests.cs
rename to DotTiled.Tests/Assert/AssertTileset.cs
index 04bb54b..8421bd0 100644
--- a/DotTiled.Tests/TmxSerializer/TmxSerializer.TilesetTests.cs
+++ b/DotTiled.Tests/Assert/AssertTileset.cs
@@ -1,8 +1,8 @@
namespace DotTiled.Tests;
-public partial class TmxSerializerTilesetTests
+public static partial class DotTiledAssert
{
- public static void AssertTileset(Tileset actual, Tileset expected)
+ internal static void AssertTileset(Tileset expected, Tileset actual)
{
// Attributes
Assert.Equal(expected.Version, actual.Version);
@@ -22,28 +22,28 @@ public partial class TmxSerializerTilesetTests
Assert.Equal(expected.FillMode, actual.FillMode);
// At most one of
- TmxSerializerImageTests.AssertImage(actual.Image, expected.Image);
- AssertTileOffset(actual.TileOffset, expected.TileOffset);
- AssertGrid(actual.Grid, expected.Grid);
- TmxSerializerPropertiesTests.AssertProperties(actual.Properties, expected.Properties);
+ AssertImage(expected.Image, actual.Image);
+ AssertTileOffset(expected.TileOffset, actual.TileOffset);
+ AssertGrid(expected.Grid, actual.Grid);
+ AssertProperties(expected.Properties, actual.Properties);
// TODO: AssertTerrainTypes(actual.TerrainTypes, expected.TerrainTypes);
if (expected.Wangsets is not null)
{
Assert.NotNull(actual.Wangsets);
Assert.Equal(expected.Wangsets.Count, actual.Wangsets.Count);
for (var i = 0; i < expected.Wangsets.Count; i++)
- AssertWangset(actual.Wangsets[i], expected.Wangsets[i]);
+ AssertWangset(expected.Wangsets[i], actual.Wangsets[i]);
}
- AssertTransformations(actual.Transformations, expected.Transformations);
+ AssertTransformations(expected.Transformations, actual.Transformations);
// Any number of
Assert.NotNull(actual.Tiles);
Assert.Equal(expected.Tiles.Count, actual.Tiles.Count);
for (var i = 0; i < expected.Tiles.Count; i++)
- AssertTile(actual.Tiles[i], expected.Tiles[i]);
+ AssertTile(expected.Tiles[i], actual.Tiles[i]);
}
- private static void AssertTileOffset(TileOffset? actual, TileOffset? expected)
+ private static void AssertTileOffset(TileOffset? expected, TileOffset? actual)
{
if (expected is null)
{
@@ -57,7 +57,7 @@ public partial class TmxSerializerTilesetTests
Assert.Equal(expected.Y, actual.Y);
}
- private static void AssertGrid(Grid? actual, Grid? expected)
+ private static void AssertGrid(Grid? expected, Grid? actual)
{
if (expected is null)
{
@@ -72,7 +72,7 @@ public partial class TmxSerializerTilesetTests
Assert.Equal(expected.Height, actual.Height);
}
- private static void AssertWangset(Wangset actual, Wangset expected)
+ private static void AssertWangset(Wangset expected, Wangset actual)
{
// Attributes
Assert.Equal(expected.Name, actual.Name);
@@ -80,19 +80,19 @@ public partial class TmxSerializerTilesetTests
Assert.Equal(expected.Tile, actual.Tile);
// At most one of
- TmxSerializerPropertiesTests.AssertProperties(actual.Properties, expected.Properties);
+ AssertProperties(expected.Properties, actual.Properties);
if (expected.WangColors is not null)
{
Assert.NotNull(actual.WangColors);
Assert.Equal(expected.WangColors.Count, actual.WangColors.Count);
for (var i = 0; i < expected.WangColors.Count; i++)
- AssertWangColor(actual.WangColors[i], expected.WangColors[i]);
+ AssertWangColor(expected.WangColors[i], actual.WangColors[i]);
}
for (var i = 0; i < expected.WangTiles.Count; i++)
- AssertWangTile(actual.WangTiles[i], expected.WangTiles[i]);
+ AssertWangTile(expected.WangTiles[i], actual.WangTiles[i]);
}
- private static void AssertWangColor(WangColor actual, WangColor expected)
+ private static void AssertWangColor(WangColor expected, WangColor actual)
{
// Attributes
Assert.Equal(expected.Name, actual.Name);
@@ -101,17 +101,17 @@ public partial class TmxSerializerTilesetTests
Assert.Equal(expected.Tile, actual.Tile);
Assert.Equal(expected.Probability, actual.Probability);
- TmxSerializerPropertiesTests.AssertProperties(actual.Properties, expected.Properties);
+ AssertProperties(expected.Properties, actual.Properties);
}
- private static void AssertWangTile(WangTile actual, WangTile expected)
+ private static void AssertWangTile(WangTile expected, WangTile actual)
{
// Attributes
Assert.Equal(expected.TileID, actual.TileID);
Assert.Equal(expected.WangID, actual.WangID);
}
- private static void AssertTransformations(Transformations? actual, Transformations? expected)
+ private static void AssertTransformations(Transformations? expected, Transformations? actual)
{
if (expected is null)
{
@@ -127,7 +127,7 @@ public partial class TmxSerializerTilesetTests
Assert.Equal(expected.PreferUntransformed, actual.PreferUntransformed);
}
- private static void AssertTile(Tile actual, Tile expected)
+ private static void AssertTile(Tile expected, Tile actual)
{
// Attributes
Assert.Equal(expected.ID, actual.ID);
@@ -139,19 +139,19 @@ public partial class TmxSerializerTilesetTests
Assert.Equal(expected.Height, actual.Height);
// Elements
- TmxSerializerPropertiesTests.AssertProperties(actual.Properties, expected.Properties);
- TmxSerializerImageTests.AssertImage(actual.Image, expected.Image);
- TmxSerializerLayerTests.AssertLayer(actual.ObjectLayer, expected.ObjectLayer);
+ AssertProperties(actual.Properties, expected.Properties);
+ AssertImage(actual.Image, expected.Image);
+ AssertLayer((BaseLayer?)actual.ObjectLayer, (BaseLayer?)expected.ObjectLayer);
if (expected.Animation is not null)
{
Assert.NotNull(actual.Animation);
Assert.Equal(expected.Animation.Count, actual.Animation.Count);
for (var i = 0; i < expected.Animation.Count; i++)
- AssertFrame(actual.Animation[i], expected.Animation[i]);
+ AssertFrame(expected.Animation[i], actual.Animation[i]);
}
}
- private static void AssertFrame(Frame actual, Frame expected)
+ private static void AssertFrame(Frame expected, Frame actual)
{
// Attributes
Assert.Equal(expected.TileID, actual.TileID);
diff --git a/DotTiled.Tests/DotTiled.Tests.csproj b/DotTiled.Tests/DotTiled.Tests.csproj
index 44236af..5e36559 100644
--- a/DotTiled.Tests/DotTiled.Tests.csproj
+++ b/DotTiled.Tests/DotTiled.Tests.csproj
@@ -26,7 +26,7 @@
-
+
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-base64-gzip.tmx b/DotTiled.Tests/Serialization/Tmx/TestData/Map/empty-map-base64-gzip.tmx
similarity index 100%
rename from DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-base64-gzip.tmx
rename to DotTiled.Tests/Serialization/Tmx/TestData/Map/empty-map-base64-gzip.tmx
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-base64-zlib.tmx b/DotTiled.Tests/Serialization/Tmx/TestData/Map/empty-map-base64-zlib.tmx
similarity index 100%
rename from DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-base64-zlib.tmx
rename to DotTiled.Tests/Serialization/Tmx/TestData/Map/empty-map-base64-zlib.tmx
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-base64.tmx b/DotTiled.Tests/Serialization/Tmx/TestData/Map/empty-map-base64.tmx
similarity index 100%
rename from DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-base64.tmx
rename to DotTiled.Tests/Serialization/Tmx/TestData/Map/empty-map-base64.tmx
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-csv.tmx b/DotTiled.Tests/Serialization/Tmx/TestData/Map/empty-map-csv.tmx
similarity index 100%
rename from DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-csv.tmx
rename to DotTiled.Tests/Serialization/Tmx/TestData/Map/empty-map-csv.tmx
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-properties.cs b/DotTiled.Tests/Serialization/Tmx/TestData/Map/empty-map-properties.cs
similarity index 97%
rename from DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-properties.cs
rename to DotTiled.Tests/Serialization/Tmx/TestData/Map/empty-map-properties.cs
index c87c183..795b920 100644
--- a/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-properties.cs
+++ b/DotTiled.Tests/Serialization/Tmx/TestData/Map/empty-map-properties.cs
@@ -1,6 +1,6 @@
namespace DotTiled.Tests;
-public partial class TmxSerializerMapTests
+public partial class TmxMapReaderTests
{
private static Map EmptyMapWithProperties() => new Map
{
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-properties.tmx b/DotTiled.Tests/Serialization/Tmx/TestData/Map/empty-map-properties.tmx
similarity index 100%
rename from DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-properties.tmx
rename to DotTiled.Tests/Serialization/Tmx/TestData/Map/empty-map-properties.tmx
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map.cs b/DotTiled.Tests/Serialization/Tmx/TestData/Map/empty-map.cs
similarity index 97%
rename from DotTiled.Tests/TmxSerializer/TestData/Map/empty-map.cs
rename to DotTiled.Tests/Serialization/Tmx/TestData/Map/empty-map.cs
index e01516b..12cfc00 100644
--- a/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map.cs
+++ b/DotTiled.Tests/Serialization/Tmx/TestData/Map/empty-map.cs
@@ -1,6 +1,6 @@
namespace DotTiled.Tests;
-public partial class TmxSerializerMapTests
+public partial class TmxMapReaderTests
{
private static Map EmptyMapWithEncodingAndCompression(DataEncoding dataEncoding, DataCompression? compression) => new Map
{
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/map-with-group.cs b/DotTiled.Tests/Serialization/Tmx/TestData/Map/map-with-group.cs
similarity index 98%
rename from DotTiled.Tests/TmxSerializer/TestData/Map/map-with-group.cs
rename to DotTiled.Tests/Serialization/Tmx/TestData/Map/map-with-group.cs
index 0bac69e..515312e 100644
--- a/DotTiled.Tests/TmxSerializer/TestData/Map/map-with-group.cs
+++ b/DotTiled.Tests/Serialization/Tmx/TestData/Map/map-with-group.cs
@@ -1,6 +1,6 @@
namespace DotTiled.Tests;
-public partial class TmxSerializerMapTests
+public partial class TmxMapReaderTests
{
private static Map MapWithGroup() => new Map
{
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/map-with-group.tmx b/DotTiled.Tests/Serialization/Tmx/TestData/Map/map-with-group.tmx
similarity index 100%
rename from DotTiled.Tests/TmxSerializer/TestData/Map/map-with-group.tmx
rename to DotTiled.Tests/Serialization/Tmx/TestData/Map/map-with-group.tmx
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/map-with-object-template.cs b/DotTiled.Tests/Serialization/Tmx/TestData/Map/map-with-object-template.cs
similarity index 98%
rename from DotTiled.Tests/TmxSerializer/TestData/Map/map-with-object-template.cs
rename to DotTiled.Tests/Serialization/Tmx/TestData/Map/map-with-object-template.cs
index 31a658e..8f4459e 100644
--- a/DotTiled.Tests/TmxSerializer/TestData/Map/map-with-object-template.cs
+++ b/DotTiled.Tests/Serialization/Tmx/TestData/Map/map-with-object-template.cs
@@ -1,6 +1,6 @@
namespace DotTiled.Tests;
-public partial class TmxSerializerMapTests
+public partial class TmxMapReaderTests
{
private static Map MapWithObjectTemplate() => new Map
{
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/map-with-object-template.tmx b/DotTiled.Tests/Serialization/Tmx/TestData/Map/map-with-object-template.tmx
similarity index 100%
rename from DotTiled.Tests/TmxSerializer/TestData/Map/map-with-object-template.tmx
rename to DotTiled.Tests/Serialization/Tmx/TestData/Map/map-with-object-template.tmx
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/simple-tileset-embed.cs b/DotTiled.Tests/Serialization/Tmx/TestData/Map/simple-tileset-embed.cs
similarity index 97%
rename from DotTiled.Tests/TmxSerializer/TestData/Map/simple-tileset-embed.cs
rename to DotTiled.Tests/Serialization/Tmx/TestData/Map/simple-tileset-embed.cs
index ad27d8e..7dfb740 100644
--- a/DotTiled.Tests/TmxSerializer/TestData/Map/simple-tileset-embed.cs
+++ b/DotTiled.Tests/Serialization/Tmx/TestData/Map/simple-tileset-embed.cs
@@ -1,6 +1,6 @@
namespace DotTiled.Tests;
-public partial class TmxSerializerMapTests
+public partial class TmxMapReaderTests
{
private static Map SimpleMapWithEmbeddedTileset() => new Map
{
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/simple-tileset-embed.tmx b/DotTiled.Tests/Serialization/Tmx/TestData/Map/simple-tileset-embed.tmx
similarity index 100%
rename from DotTiled.Tests/TmxSerializer/TestData/Map/simple-tileset-embed.tmx
rename to DotTiled.Tests/Serialization/Tmx/TestData/Map/simple-tileset-embed.tmx
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Template/map-with-object-template.tx b/DotTiled.Tests/Serialization/Tmx/TestData/Template/map-with-object-template.tx
similarity index 100%
rename from DotTiled.Tests/TmxSerializer/TestData/Template/map-with-object-template.tx
rename to DotTiled.Tests/Serialization/Tmx/TestData/Template/map-with-object-template.tx
diff --git a/DotTiled.Tests/TmxSerializer/TestData/TestData.cs b/DotTiled.Tests/Serialization/Tmx/TestData/TestData.cs
similarity index 70%
rename from DotTiled.Tests/TmxSerializer/TestData/TestData.cs
rename to DotTiled.Tests/Serialization/Tmx/TestData/TestData.cs
index 7dbc2ad..667fec0 100644
--- a/DotTiled.Tests/TmxSerializer/TestData/TestData.cs
+++ b/DotTiled.Tests/Serialization/Tmx/TestData/TestData.cs
@@ -2,12 +2,12 @@ using System.Xml;
namespace DotTiled.Tests;
-public static class TmxSerializerTestData
+public static class TmxMapReaderTestData
{
- public static XmlReader GetReaderFor(string testDataFile)
+ public static XmlReader GetXmlReaderFor(string testDataFile)
{
var fullyQualifiedTestDataFile = $"DotTiled.Tests.{testDataFile}";
- using var stream = typeof(TmxSerializerTestData).Assembly.GetManifestResourceStream(fullyQualifiedTestDataFile)
+ using var stream = typeof(TmxMapReaderTestData).Assembly.GetManifestResourceStream(fullyQualifiedTestDataFile)
?? throw new ArgumentException($"Test data file '{fullyQualifiedTestDataFile}' not found");
using var stringReader = new StreamReader(stream);
@@ -19,7 +19,7 @@ public static class TmxSerializerTestData
public static string GetRawStringFor(string testDataFile)
{
var fullyQualifiedTestDataFile = $"DotTiled.Tests.{testDataFile}";
- using var stream = typeof(TmxSerializerTestData).Assembly.GetManifestResourceStream(fullyQualifiedTestDataFile)
+ using var stream = typeof(TmxMapReaderTestData).Assembly.GetManifestResourceStream(fullyQualifiedTestDataFile)
?? throw new ArgumentException($"Test data file '{fullyQualifiedTestDataFile}' not found");
using var stringReader = new StreamReader(stream);
diff --git a/DotTiled.Tests/Serialization/Tmx/TmxMapReaderTests.cs b/DotTiled.Tests/Serialization/Tmx/TmxMapReaderTests.cs
new file mode 100644
index 0000000..1924ac2
--- /dev/null
+++ b/DotTiled.Tests/Serialization/Tmx/TmxMapReaderTests.cs
@@ -0,0 +1,150 @@
+using System.Xml;
+
+namespace DotTiled.Tests;
+
+public partial class TmxMapReaderTests
+{
+ [Fact]
+ public void TmxMapReaderConstructor_XmlReaderIsNull_ThrowsArgumentNullException()
+ {
+ // Arrange
+ XmlReader xmlReader = null!;
+ Func externalTilesetResolver = (_) => new Tileset();
+ Func externalTemplateResolver = (_) => new Template { Object = new RectangleObject { } };
+
+ // Act
+ Action act = () =>
+ {
+ using var _ = new TmxMapReader(xmlReader, externalTilesetResolver, externalTemplateResolver);
+ };
+
+ // Assert
+ Assert.Throws(act);
+ }
+
+ [Fact]
+ public void TmxMapReaderConstructor_ExternalTilesetResolverIsNull_ThrowsArgumentNullException()
+ {
+ // Arrange
+ using var stringReader = new StringReader("");
+ using var xmlReader = XmlReader.Create(stringReader);
+ Func externalTilesetResolver = null!;
+ Func externalTemplateResolver = (_) => new Template { Object = new RectangleObject { } };
+
+ // Act
+ Action act = () =>
+ {
+ using var _ = new TmxMapReader(xmlReader, externalTilesetResolver, externalTemplateResolver);
+ };
+
+ // Assert
+ Assert.Throws(act);
+ }
+
+ [Fact]
+ public void TmxMapReaderConstructor_ExternalTemplateResolverIsNull_ThrowsArgumentNullException()
+ {
+ // Arrange
+ using var stringReader = new StringReader("");
+ using var xmlReader = XmlReader.Create(stringReader);
+ Func externalTilesetResolver = (_) => new Tileset();
+ Func externalTemplateResolver = null!;
+
+ // Act
+ Action act = () =>
+ {
+ using var _ = new TmxMapReader(xmlReader, externalTilesetResolver, externalTemplateResolver);
+ };
+
+ // Assert
+ Assert.Throws(act);
+ }
+
+ [Fact]
+ public void TmxMapReaderConstructor_NoneNull_DoesNotThrow()
+ {
+ // Arrange
+ using var stringReader = new StringReader("");
+ using var xmlReader = XmlReader.Create(stringReader);
+ Func externalTilesetResolver = (_) => new Tileset();
+ Func externalTemplateResolver = (_) => new Template { Object = new RectangleObject { } };
+
+ // Act
+ using var tmxMapReader = new TmxMapReader(xmlReader, externalTilesetResolver, externalTemplateResolver);
+
+ // Assert
+ Assert.NotNull(tmxMapReader);
+ }
+
+ public static IEnumerable