diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-base64-gzip.tmx b/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-base64-gzip.tmx
new file mode 100644
index 0000000..d3e0f29
--- /dev/null
+++ b/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-base64-gzip.tmx
@@ -0,0 +1,8 @@
+
+
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-base64-zlib.tmx b/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-base64-zlib.tmx
new file mode 100644
index 0000000..d35b438
--- /dev/null
+++ b/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-base64-zlib.tmx
@@ -0,0 +1,8 @@
+
+
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-base64.tmx b/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-base64.tmx
new file mode 100644
index 0000000..0e98f67
--- /dev/null
+++ b/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-base64.tmx
@@ -0,0 +1,8 @@
+
+
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map.tmx b/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-csv.tmx
similarity index 100%
rename from DotTiled.Tests/TmxSerializer/TestData/Map/empty-map.tmx
rename to DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-csv.tmx
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-properties.cs b/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-properties.cs
new file mode 100644
index 0000000..c87c183
--- /dev/null
+++ b/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-properties.cs
@@ -0,0 +1,56 @@
+namespace DotTiled.Tests;
+
+public partial class TmxSerializerMapTests
+{
+ private static Map EmptyMapWithProperties() => 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 = 2,
+ NextObjectID = 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
+ ]
+ }
+ }
+ ],
+ Properties = new Dictionary
+ {
+ ["MapBool"] = new BoolProperty { Name = "MapBool", Value = true },
+ ["MapColor"] = new ColorProperty { Name = "MapColor", Value = new Color { R = 255, G = 0, B = 0, A = 255 } },
+ ["MapFile"] = new FileProperty { Name = "MapFile", Value = "file.png" },
+ ["MapFloat"] = new FloatProperty { Name = "MapFloat", Value = 5.2f },
+ ["MapInt"] = new IntProperty { Name = "MapInt", Value = 42 },
+ ["MapObject"] = new ObjectProperty { Name = "MapObject", Value = 5 },
+ ["MapString"] = new StringProperty { Name = "MapString", Value = "string in map" }
+ }
+ };
+}
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-properties.tmx b/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-properties.tmx
new file mode 100644
index 0000000..5a14d94
--- /dev/null
+++ b/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map-properties.tmx
@@ -0,0 +1,21 @@
+
+
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map.cs b/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map.cs
index 077c573..e01516b 100644
--- a/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map.cs
+++ b/DotTiled.Tests/TmxSerializer/TestData/Map/empty-map.cs
@@ -2,7 +2,7 @@ namespace DotTiled.Tests;
public partial class TmxSerializerMapTests
{
- private readonly static Map EmptyMap = new Map
+ private static Map EmptyMapWithEncodingAndCompression(DataEncoding dataEncoding, DataCompression? compression) => new Map
{
Version = "1.10",
TiledVersion = "1.11.0",
@@ -24,7 +24,8 @@ public partial class TmxSerializerMapTests
Height = 5,
Data = new Data
{
- Encoding = DataEncoding.Csv,
+ Encoding = dataEncoding,
+ Compression = compression,
GlobalTileIDs = [
0,0,0,0,0,
0,0,0,0,0,
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/simple-tileset-embed.cs b/DotTiled.Tests/TmxSerializer/TestData/Map/simple-tileset-embed.cs
new file mode 100644
index 0000000..ad27d8e
--- /dev/null
+++ b/DotTiled.Tests/TmxSerializer/TestData/Map/simple-tileset-embed.cs
@@ -0,0 +1,64 @@
+namespace DotTiled.Tests;
+
+public partial class TmxSerializerMapTests
+{
+ private static Map SimpleMapWithEmbeddedTileset() => 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 = 2,
+ NextObjectID = 1,
+ Tilesets = [
+ new Tileset
+ {
+ FirstGID = 1,
+ Name = "Tileset 1",
+ TileWidth = 32,
+ TileHeight = 32,
+ TileCount = 8,
+ Columns = 4,
+ Image = new Image
+ {
+ Source = "tiles.png",
+ Width = 128,
+ Height = 64
+ }
+ }
+ ],
+ Layers = [
+ new TileLayer
+ {
+ ID = 1,
+ Name = "Tile Layer 1",
+ Width = 5,
+ Height = 5,
+ Data = new Data
+ {
+ Encoding = DataEncoding.Csv,
+ Compression = null,
+ GlobalTileIDs = [
+ 1,1,1,1,1,
+ 1,1,1,1,1,
+ 1,1,1,1,1,
+ 2,2,2,2,2,
+ 2,2,2,2,2
+ ],
+ 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
+ ]
+ },
+ }
+ ]
+ };
+}
diff --git a/DotTiled.Tests/TmxSerializer/TestData/Map/simple-tileset-embed.tmx b/DotTiled.Tests/TmxSerializer/TestData/Map/simple-tileset-embed.tmx
new file mode 100644
index 0000000..3d91b9d
--- /dev/null
+++ b/DotTiled.Tests/TmxSerializer/TestData/Map/simple-tileset-embed.tmx
@@ -0,0 +1,15 @@
+
+
diff --git a/DotTiled.Tests/TmxSerializer/TmxSerializer.DataTests.cs b/DotTiled.Tests/TmxSerializer/TmxSerializer.DataTests.cs
new file mode 100644
index 0000000..e08d402
--- /dev/null
+++ b/DotTiled.Tests/TmxSerializer/TmxSerializer.DataTests.cs
@@ -0,0 +1,43 @@
+namespace DotTiled.Tests;
+
+public partial class TmxSerializerDataTests
+{
+ public static void AssertData(Data? actual, Data? expected)
+ {
+ if (expected is null)
+ {
+ Assert.Null(actual);
+ return;
+ }
+
+ // Attributes
+ Assert.NotNull(actual);
+ Assert.Equal(expected.Encoding, actual.Encoding);
+ Assert.Equal(expected.Compression, actual.Compression);
+
+ // Data
+ Assert.Equal(expected.GlobalTileIDs, actual.GlobalTileIDs);
+ Assert.Equal(expected.FlippingFlags, actual.FlippingFlags);
+
+ if (expected.Chunks is not null)
+ {
+ 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]);
+ }
+ }
+
+ private static void AssertChunk(Chunk actual, Chunk expected)
+ {
+ // Attributes
+ Assert.Equal(expected.X, actual.X);
+ Assert.Equal(expected.Y, actual.Y);
+ Assert.Equal(expected.Width, actual.Width);
+ Assert.Equal(expected.Height, actual.Height);
+
+ // Data
+ Assert.Equal(expected.GlobalTileIDs, actual.GlobalTileIDs);
+ Assert.Equal(expected.FlippingFlags, actual.FlippingFlags);
+ }
+}
diff --git a/DotTiled.Tests/TmxSerializer/TmxSerializer.ImageTests.cs b/DotTiled.Tests/TmxSerializer/TmxSerializer.ImageTests.cs
new file mode 100644
index 0000000..7d00713
--- /dev/null
+++ b/DotTiled.Tests/TmxSerializer/TmxSerializer.ImageTests.cs
@@ -0,0 +1,21 @@
+namespace DotTiled.Tests;
+
+public partial class TmxSerializerImageTests
+{
+ public static void AssertImage(Image? actual, Image? expected)
+ {
+ if (expected is null)
+ {
+ Assert.Null(actual);
+ return;
+ }
+
+ // Attributes
+ Assert.NotNull(actual);
+ Assert.Equal(expected.Format, actual.Format);
+ Assert.Equal(expected.Source, actual.Source);
+ Assert.Equal(expected.TransparentColor, actual.TransparentColor);
+ Assert.Equal(expected.Width, actual.Width);
+ Assert.Equal(expected.Height, actual.Height);
+ }
+}
diff --git a/DotTiled.Tests/TmxSerializer/TmxSerializer.LayerTests.cs b/DotTiled.Tests/TmxSerializer/TmxSerializer.LayerTests.cs
new file mode 100644
index 0000000..5e36b95
--- /dev/null
+++ b/DotTiled.Tests/TmxSerializer/TmxSerializer.LayerTests.cs
@@ -0,0 +1,62 @@
+namespace DotTiled.Tests;
+
+public partial class TmxSerializerLayerTests
+{
+ public static void AssertLayer(BaseLayer? actual, BaseLayer? expected)
+ {
+ if (expected is null)
+ {
+ Assert.Null(actual);
+ return;
+ }
+
+ // Attributes
+ Assert.NotNull(actual);
+ 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);
+ Assert.Equal(expected.OffsetX, actual.OffsetX);
+ Assert.Equal(expected.OffsetY, actual.OffsetY);
+ Assert.Equal(expected.ParallaxX, actual.ParallaxX);
+ Assert.Equal(expected.ParallaxY, actual.ParallaxY);
+
+ TmxSerializerPropertiesTests.AssertProperties(actual.Properties, expected.Properties);
+ AssertLayer((dynamic)actual, (dynamic)expected);
+ }
+
+ private static void AssertLayer(TileLayer actual, TileLayer expected)
+ {
+ // Attributes
+ Assert.Equal(expected.Width, actual.Width);
+ Assert.Equal(expected.Height, actual.Height);
+
+ Assert.NotNull(actual.Data);
+ TmxSerializerDataTests.AssertData(actual.Data, expected.Data);
+ }
+
+ private static void AssertLayer(ObjectLayer actual, ObjectLayer expected)
+ {
+ // Attributes
+ Assert.Equal(expected.DrawOrder, actual.DrawOrder);
+
+ 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]);
+ }
+
+ private static void AssertLayer(ImageLayer actual, ImageLayer expected)
+ {
+ // Attributes
+ Assert.Equal(expected.RepeatX, actual.RepeatX);
+ Assert.Equal(expected.RepeatY, actual.RepeatY);
+
+ Assert.NotNull(actual.Image);
+ TmxSerializerImageTests.AssertImage(actual.Image, expected.Image);
+ }
+}
diff --git a/DotTiled.Tests/TmxSerializer/TmxSerializer.MapTests.cs b/DotTiled.Tests/TmxSerializer/TmxSerializer.MapTests.cs
index e875438..ec3f0e8 100644
--- a/DotTiled.Tests/TmxSerializer/TmxSerializer.MapTests.cs
+++ b/DotTiled.Tests/TmxSerializer/TmxSerializer.MapTests.cs
@@ -24,16 +24,33 @@ public partial class TmxSerializerMapTests
Assert.Equal(expected.NextLayerID, actual.NextLayerID);
Assert.Equal(expected.NextObjectID, actual.NextObjectID);
Assert.Equal(expected.Infinite, actual.Infinite);
+
+ TmxSerializerPropertiesTests.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++)
+ TmxSerializerTilesetTests.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++)
+ TmxSerializerLayerTests.AssertLayer(actual.Layers[i], expected.Layers[i]);
}
public static IEnumerable