diff --git a/DotTiled.Tests/DotTiled.Tests.csproj b/DotTiled.Tests/DotTiled.Tests.csproj
index c110013..44236af 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/map-with-group.cs b/DotTiled.Tests/TmxSerializer/TestData/Map/map-with-group.cs
new file mode 100644
index 0000000..0bac69e
--- /dev/null
+++ b/DotTiled.Tests/TmxSerializer/TestData/Map/map-with-group.cs
@@ -0,0 +1,94 @@
+namespace DotTiled.Tests;
+
+public partial class TmxSerializerMapTests
+{
+ private static Map MapWithGroup() => new Map
+ {
+ Version = "1.10",
+ TiledVersion = "1.11.0",
+ Orientation = MapOrientation.Orthogonal,
+ RenderOrder = RenderOrder.RightDown,
+ Width = 5,
+ Height = 5,
+ TileWidth = 32,
+ TileHeight = 32,
+ Infinite = false,
+ NextLayerID = 5,
+ NextObjectID = 2,
+ Layers = [
+ new TileLayer
+ {
+ ID = 4,
+ Name = "Tile Layer 2",
+ Width = 5,
+ Height = 5,
+ Data = new Data
+ {
+ Encoding = DataEncoding.Csv,
+ GlobalTileIDs = [
+ 0,0,0,0,0,
+ 0,0,0,0,0,
+ 0,0,0,0,0,
+ 0,0,0,0,0,
+ 0,0,0,0,0
+ ],
+ FlippingFlags = [
+ FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None,
+ FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None,
+ FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None,
+ FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None,
+ FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None
+ ]
+ }
+ },
+ new Group
+ {
+ ID = 3,
+ Name = "Group 1",
+ Layers = [
+ new TileLayer
+ {
+ ID = 1,
+ Name = "Tile Layer 1",
+ Width = 5,
+ Height = 5,
+ Data = new Data
+ {
+ Encoding = DataEncoding.Csv,
+ GlobalTileIDs = [
+ 0,0,0,0,0,
+ 0,0,0,0,0,
+ 0,0,0,0,0,
+ 0,0,0,0,0,
+ 0,0,0,0,0
+ ],
+ FlippingFlags = [
+ FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None,
+ FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None,
+ FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None,
+ FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None,
+ FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None
+ ]
+ }
+ },
+ new ObjectLayer
+ {
+ ID = 2,
+ Name = "Object Layer 1",
+ Objects = [
+ new RectangleObject
+ {
+ ID = 1,
+ Name = "Name",
+ X = 35.5f,
+ Y = 26,
+ Width = 64.5f,
+ Height = 64.5f,
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ };
+}
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/map-with-group.tmx b/DotTiled.Tests/TmxSerializer/TestData/Map/map-with-group.tmx
new file mode 100644
index 0000000..61191c4
--- /dev/null
+++ b/DotTiled.Tests/TmxSerializer/TestData/Map/map-with-group.tmx
@@ -0,0 +1,26 @@
+
+
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/map-with-object-template.cs b/DotTiled.Tests/TmxSerializer/TestData/Map/map-with-object-template.cs
new file mode 100644
index 0000000..31a658e
--- /dev/null
+++ b/DotTiled.Tests/TmxSerializer/TestData/Map/map-with-object-template.cs
@@ -0,0 +1,125 @@
+namespace DotTiled.Tests;
+
+public partial class TmxSerializerMapTests
+{
+ private static Map MapWithObjectTemplate() => new Map
+ {
+ Version = "1.10",
+ TiledVersion = "1.11.0",
+ Orientation = MapOrientation.Orthogonal,
+ RenderOrder = RenderOrder.RightDown,
+ Width = 5,
+ Height = 5,
+ TileWidth = 32,
+ TileHeight = 32,
+ Infinite = false,
+ NextLayerID = 3,
+ NextObjectID = 3,
+ Layers = [
+ new TileLayer
+ {
+ ID = 1,
+ Name = "Tile Layer 1",
+ Width = 5,
+ Height = 5,
+ Data = new Data
+ {
+ Encoding = DataEncoding.Csv,
+ GlobalTileIDs = [
+ 0,0,0,0,0,
+ 0,0,0,0,0,
+ 0,0,0,0,0,
+ 0,0,0,0,0,
+ 0,0,0,0,0
+ ],
+ FlippingFlags = [
+ FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None,
+ FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None,
+ FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None,
+ FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None,
+ FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None
+ ]
+ }
+ },
+ new ObjectLayer
+ {
+ ID = 2,
+ Name = "Object Layer 1",
+ Objects = [
+ new RectangleObject
+ {
+ ID = 1,
+ Template = "map-with-object-template.tx",
+ Name = "Thingy 2",
+ X = 94.5749f,
+ Y = 33.6842f,
+ Width = 37.0156f,
+ Height = 37.0156f,
+ Properties = new Dictionary
+ {
+ ["Bool"] = new BoolProperty { Name = "Bool", Value = true },
+ ["TestClassInTemplate"] = new ClassProperty
+ {
+ Name = "TestClassInTemplate",
+ PropertyType = "TestClass",
+ Properties = new Dictionary
+ {
+ ["Amount"] = new FloatProperty { Name = "Amount", Value = 37 },
+ ["Name"] = new StringProperty { Name = "Name", Value = "I am here" }
+ }
+ }
+ }
+ },
+ new RectangleObject
+ {
+ ID = 2,
+ Template = "map-with-object-template.tx",
+ Name = "Thingy",
+ X = 29.7976f,
+ Y = 33.8693f,
+ Width = 37.0156f,
+ Height = 37.0156f,
+ Properties = new Dictionary
+ {
+ ["Bool"] = new BoolProperty { Name = "Bool", Value = true },
+ ["TestClassInTemplate"] = new ClassProperty
+ {
+ Name = "TestClassInTemplate",
+ PropertyType = "TestClass",
+ Properties = new Dictionary
+ {
+ ["Amount"] = new FloatProperty { Name = "Amount", Value = 4.2f },
+ ["Name"] = new StringProperty { Name = "Name", Value = "Hello there" }
+ }
+ }
+ }
+ },
+ new RectangleObject
+ {
+ ID = 3,
+ Template = "map-with-object-template.tx",
+ Name = "Thingy 3",
+ X = 5,
+ Y = 5,
+ Width = 37.0156f,
+ Height = 37.0156f,
+ Properties = new Dictionary
+ {
+ ["Bool"] = new BoolProperty { Name = "Bool", Value = true },
+ ["TestClassInTemplate"] = new ClassProperty
+ {
+ Name = "TestClassInTemplate",
+ PropertyType = "TestClass",
+ Properties = new Dictionary
+ {
+ ["Amount"] = new FloatProperty { Name = "Amount", Value = 4.2f },
+ ["Name"] = new StringProperty { Name = "Name", Value = "I am here 3" }
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+ };
+}
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/map-with-object-template.tmx b/DotTiled.Tests/TmxSerializer/TestData/Map/map-with-object-template.tmx
new file mode 100644
index 0000000..83716a0
--- /dev/null
+++ b/DotTiled.Tests/TmxSerializer/TestData/Map/map-with-object-template.tmx
@@ -0,0 +1,35 @@
+
+
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Template/map-with-object-template.tx b/DotTiled.Tests/TmxSerializer/TestData/Template/map-with-object-template.tx
new file mode 100644
index 0000000..3039be2
--- /dev/null
+++ b/DotTiled.Tests/TmxSerializer/TestData/Template/map-with-object-template.tx
@@ -0,0 +1,14 @@
+
+
+
+
diff --git a/DotTiled.Tests/TmxSerializer/TmxSerializer.LayerTests.cs b/DotTiled.Tests/TmxSerializer/TmxSerializer.LayerTests.cs
index 5e36b95..c3289a4 100644
--- a/DotTiled.Tests/TmxSerializer/TmxSerializer.LayerTests.cs
+++ b/DotTiled.Tests/TmxSerializer/TmxSerializer.LayerTests.cs
@@ -15,8 +15,6 @@ public partial class TmxSerializerLayerTests
Assert.Equal(expected.ID, actual.ID);
Assert.Equal(expected.Name, actual.Name);
Assert.Equal(expected.Class, actual.Class);
- Assert.Equal(expected.X, actual.X);
- Assert.Equal(expected.Y, actual.Y);
Assert.Equal(expected.Opacity, actual.Opacity);
Assert.Equal(expected.Visible, actual.Visible);
Assert.Equal(expected.TintColor, actual.TintColor);
@@ -34,6 +32,8 @@ public partial class TmxSerializerLayerTests
// Attributes
Assert.Equal(expected.Width, actual.Width);
Assert.Equal(expected.Height, actual.Height);
+ Assert.Equal(expected.X, actual.X);
+ Assert.Equal(expected.Y, actual.Y);
Assert.NotNull(actual.Data);
TmxSerializerDataTests.AssertData(actual.Data, expected.Data);
@@ -43,6 +43,8 @@ public partial class TmxSerializerLayerTests
{
// Attributes
Assert.Equal(expected.DrawOrder, actual.DrawOrder);
+ Assert.Equal(expected.X, actual.X);
+ Assert.Equal(expected.Y, actual.Y);
Assert.NotNull(actual.Objects);
Assert.Equal(expected.Objects.Count, actual.Objects.Count);
@@ -55,8 +57,19 @@ public partial class TmxSerializerLayerTests
// Attributes
Assert.Equal(expected.RepeatX, actual.RepeatX);
Assert.Equal(expected.RepeatY, actual.RepeatY);
+ Assert.Equal(expected.X, actual.X);
+ Assert.Equal(expected.Y, actual.Y);
Assert.NotNull(actual.Image);
TmxSerializerImageTests.AssertImage(actual.Image, expected.Image);
}
+
+ private static void AssertLayer(Group actual, Group expected)
+ {
+ // 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]);
+ }
}
diff --git a/DotTiled.Tests/TmxSerializer/TmxSerializer.MapTests.cs b/DotTiled.Tests/TmxSerializer/TmxSerializer.MapTests.cs
index ceeefe4..7d513e1 100644
--- a/DotTiled.Tests/TmxSerializer/TmxSerializer.MapTests.cs
+++ b/DotTiled.Tests/TmxSerializer/TmxSerializer.MapTests.cs
@@ -50,13 +50,18 @@ public partial class TmxSerializerMapTests
[Theory]
[MemberData(nameof(DeserializeMap_ValidXmlNoExternalTilesets_ReturnsMapWithoutThrowing_Data))]
- public void DeserializeMap_ValidXmlNoExternalTilesets_ReturnsMapThatEqualsExpected(string testDataFile, Map expectedMap)
+ public void DeserializeMapFromXmlReader_ValidXmlNoExternalTilesets_ReturnsMapThatEqualsExpected(string testDataFile, Map expectedMap)
{
// Arrange
using var reader = TmxSerializerTestData.GetReaderFor(testDataFile);
var testDataFileText = TmxSerializerTestData.GetRawStringFor(testDataFile);
- Func externalTilesetResolver = (string s) => throw new NotSupportedException("External tilesets are not supported in this test");
- var tmxSerializer = new TmxSerializer(externalTilesetResolver);
+ Func externalTilesetResolver = (TmxSerializer serializer, string s) =>
+ throw new NotSupportedException("External tilesets are not supported in this test");
+ Func externalTemplateResolver = (TmxSerializer serializer, string s) =>
+ throw new NotSupportedException("External templates are not supported in this test");
+ var tmxSerializer = new TmxSerializer(
+ externalTilesetResolver,
+ externalTemplateResolver);
// Act
var map = tmxSerializer.DeserializeMap(reader);
@@ -68,5 +73,153 @@ public partial class TmxSerializerMapTests
Assert.NotNull(raw);
AssertMap(raw, expectedMap);
+
+ AssertMap(map, raw);
+ }
+
+ [Theory]
+ [MemberData(nameof(DeserializeMap_ValidXmlNoExternalTilesets_ReturnsMapWithoutThrowing_Data))]
+ public void DeserializeMapFromString_ValidXmlNoExternalTilesets_ReturnsMapThatEqualsExpected(string testDataFile, Map expectedMap)
+ {
+ // Arrange
+ var testDataFileText = TmxSerializerTestData.GetRawStringFor(testDataFile);
+ Func externalTilesetResolver = (TmxSerializer serializer, string s) =>
+ throw new NotSupportedException("External tilesets are not supported in this test");
+ Func externalTemplateResolver = (TmxSerializer serializer, string s) =>
+ throw new NotSupportedException("External templates are not supported in this test");
+ var tmxSerializer = new TmxSerializer(
+ externalTilesetResolver,
+ externalTemplateResolver);
+
+ // Act
+ var raw = tmxSerializer.DeserializeMap(testDataFileText);
+
+ // Assert
+ Assert.NotNull(raw);
+ AssertMap(raw, expectedMap);
+ }
+
+ [Theory]
+ [MemberData(nameof(DeserializeMap_ValidXmlNoExternalTilesets_ReturnsMapWithoutThrowing_Data))]
+ public void DeserializeMapFromStringFromXmlReader_ValidXmlNoExternalTilesets_Equal(string testDataFile, Map expectedMap)
+ {
+ // Arrange
+ using var reader = TmxSerializerTestData.GetReaderFor(testDataFile);
+ var testDataFileText = TmxSerializerTestData.GetRawStringFor(testDataFile);
+ Func externalTilesetResolver = (TmxSerializer serializer, string s) =>
+ throw new NotSupportedException("External tilesets are not supported in this test");
+ Func externalTemplateResolver = (TmxSerializer serializer, string s) =>
+ throw new NotSupportedException("External templates are not supported in this test");
+ var tmxSerializer = new TmxSerializer(
+ externalTilesetResolver,
+ externalTemplateResolver);
+
+ // Act
+ var map = tmxSerializer.DeserializeMap(reader);
+ var raw = tmxSerializer.DeserializeMap(testDataFileText);
+
+ // Assert
+ Assert.NotNull(map);
+ Assert.NotNull(raw);
+
+ AssertMap(map, raw);
+ AssertMap(map, expectedMap);
+ AssertMap(raw, expectedMap);
+ }
+
+ public static IEnumerable