From 3d27e02ac1a4434278bae1b5c414b7a9620be948 Mon Sep 17 00:00:00 2001 From: 7H3LaughingMan <7H3LaughingMan@proton.me> Date: Tue, 29 Apr 2025 13:42:47 -0500 Subject: [PATCH 1/5] Use Already Defined Helper Functions --- .../Serialization/Tmx/TmxReaderBase.Data.cs | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/src/DotTiled/Serialization/Tmx/TmxReaderBase.Data.cs b/src/DotTiled/Serialization/Tmx/TmxReaderBase.Data.cs index 1566936..e60f641 100644 --- a/src/DotTiled/Serialization/Tmx/TmxReaderBase.Data.cs +++ b/src/DotTiled/Serialization/Tmx/TmxReaderBase.Data.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.IO.Compression; using System.Linq; using System.Xml; @@ -76,8 +75,8 @@ public abstract partial class TmxReaderBase var decompressed = compression.Value switch { - DataCompression.GZip => DecompressGZip(bytes), - DataCompression.ZLib => DecompressZLib(bytes), + DataCompression.GZip => Helpers.DecompressGZip(bytes), + DataCompression.ZLib => Helpers.DecompressZLib(bytes), DataCompression.ZStd => throw new NotSupportedException("ZStd compression is not supported."), _ => throw new XmlException("Invalid compression") }; @@ -105,16 +104,4 @@ public abstract partial class TmxReaderBase } return finalValues.ToArray(); } - - internal static uint[] DecompressGZip(MemoryStream stream) - { - using var decompressedStream = new GZipStream(stream, CompressionMode.Decompress); - return ReadMemoryStreamAsInt32Array(decompressedStream); - } - - internal static uint[] DecompressZLib(MemoryStream stream) - { - using var decompressedStream = new ZLibStream(stream, CompressionMode.Decompress); - return ReadMemoryStreamAsInt32Array(decompressedStream); - } } From c74e913ea964249cee1e1012dd47d8df3488b6e5 Mon Sep 17 00:00:00 2001 From: 7H3LaughingMan <7H3LaughingMan@proton.me> Date: Tue, 29 Apr 2025 13:43:06 -0500 Subject: [PATCH 2/5] Base64 Tests --- .../default-map-base64/default-map-base64.cs | 51 +++++++++++++++++++ .../default-map-base64/default-map-base64.tmj | 30 +++++++++++ .../default-map-base64/default-map-base64.tmx | 8 +++ 3 files changed, 89 insertions(+) create mode 100644 src/DotTiled.Tests/TestData/Maps/default-map-base64/default-map-base64.cs create mode 100644 src/DotTiled.Tests/TestData/Maps/default-map-base64/default-map-base64.tmj create mode 100644 src/DotTiled.Tests/TestData/Maps/default-map-base64/default-map-base64.tmx diff --git a/src/DotTiled.Tests/TestData/Maps/default-map-base64/default-map-base64.cs b/src/DotTiled.Tests/TestData/Maps/default-map-base64/default-map-base64.cs new file mode 100644 index 0000000..43f5dce --- /dev/null +++ b/src/DotTiled.Tests/TestData/Maps/default-map-base64/default-map-base64.cs @@ -0,0 +1,51 @@ +namespace DotTiled.Tests; + +public partial class TestData +{ + public static Map DefaultMapBase64() => new Map + { + Class = "", + Orientation = MapOrientation.Orthogonal, + Width = 5, + Height = 5, + TileWidth = 32, + TileHeight = 32, + Infinite = false, + ParallaxOriginX = 0, + ParallaxOriginY = 0, + RenderOrder = RenderOrder.RightDown, + CompressionLevel = -1, + BackgroundColor = new TiledColor { R = 0, G = 0, B = 0, A = 0 }, + Version = "1.10", + TiledVersion = "1.11.2", + NextLayerID = 2, + NextObjectID = 1, + Layers = [ + new TileLayer + { + ID = 1, + Name = "Tile Layer 1", + Width = 5, + Height = 5, + Data = new Data + { + Encoding = DataEncoding.Base64, + GlobalTileIDs = new Optional([ + 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 = new Optional([ + 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/src/DotTiled.Tests/TestData/Maps/default-map-base64/default-map-base64.tmj b/src/DotTiled.Tests/TestData/Maps/default-map-base64/default-map-base64.tmj new file mode 100644 index 0000000..6cc40b5 --- /dev/null +++ b/src/DotTiled.Tests/TestData/Maps/default-map-base64/default-map-base64.tmj @@ -0,0 +1,30 @@ +{ "compressionlevel":-1, + "height":5, + "infinite":false, + "layers":[ + { + "compression":"", + "data":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "encoding":"base64", + "height":5, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":5, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"orthogonal", + "renderorder":"right-down", + "tiledversion":"1.11.2", + "tileheight":32, + "tilesets":[], + "tilewidth":32, + "type":"map", + "version":"1.10", + "width":5 +} \ No newline at end of file diff --git a/src/DotTiled.Tests/TestData/Maps/default-map-base64/default-map-base64.tmx b/src/DotTiled.Tests/TestData/Maps/default-map-base64/default-map-base64.tmx new file mode 100644 index 0000000..de7b1de --- /dev/null +++ b/src/DotTiled.Tests/TestData/Maps/default-map-base64/default-map-base64.tmx @@ -0,0 +1,8 @@ + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + From 4647b45e51a22342721b4e503f0a9b59ab376ceb Mon Sep 17 00:00:00 2001 From: 7H3LaughingMan <7H3LaughingMan@proton.me> Date: Tue, 29 Apr 2025 13:43:20 -0500 Subject: [PATCH 3/5] Gzip Tests --- .../default-map-base64-gzip.cs | 52 +++++++++++++++++++ .../default-map-base64-gzip.tmj | 30 +++++++++++ .../default-map-base64-gzip.tmx | 8 +++ 3 files changed, 90 insertions(+) create mode 100644 src/DotTiled.Tests/TestData/Maps/default-map-base64-gzip/default-map-base64-gzip.cs create mode 100644 src/DotTiled.Tests/TestData/Maps/default-map-base64-gzip/default-map-base64-gzip.tmj create mode 100644 src/DotTiled.Tests/TestData/Maps/default-map-base64-gzip/default-map-base64-gzip.tmx diff --git a/src/DotTiled.Tests/TestData/Maps/default-map-base64-gzip/default-map-base64-gzip.cs b/src/DotTiled.Tests/TestData/Maps/default-map-base64-gzip/default-map-base64-gzip.cs new file mode 100644 index 0000000..7b613b7 --- /dev/null +++ b/src/DotTiled.Tests/TestData/Maps/default-map-base64-gzip/default-map-base64-gzip.cs @@ -0,0 +1,52 @@ +namespace DotTiled.Tests; + +public partial class TestData +{ + public static Map DefaultMapBase64GZip() => new Map + { + Class = "", + Orientation = MapOrientation.Orthogonal, + Width = 5, + Height = 5, + TileWidth = 32, + TileHeight = 32, + Infinite = false, + ParallaxOriginX = 0, + ParallaxOriginY = 0, + RenderOrder = RenderOrder.RightDown, + CompressionLevel = -1, + BackgroundColor = new TiledColor { R = 0, G = 0, B = 0, A = 0 }, + Version = "1.10", + TiledVersion = "1.11.2", + NextLayerID = 2, + NextObjectID = 1, + Layers = [ + new TileLayer + { + ID = 1, + Name = "Tile Layer 1", + Width = 5, + Height = 5, + Data = new Data + { + Encoding = DataEncoding.Base64, + Compression = DataCompression.GZip, + GlobalTileIDs = new Optional([ + 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 = new Optional([ + 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/src/DotTiled.Tests/TestData/Maps/default-map-base64-gzip/default-map-base64-gzip.tmj b/src/DotTiled.Tests/TestData/Maps/default-map-base64-gzip/default-map-base64-gzip.tmj new file mode 100644 index 0000000..febd249 --- /dev/null +++ b/src/DotTiled.Tests/TestData/Maps/default-map-base64-gzip/default-map-base64-gzip.tmj @@ -0,0 +1,30 @@ +{ "compressionlevel":-1, + "height":5, + "infinite":false, + "layers":[ + { + "compression":"gzip", + "data":"H4sIAAAAAAAACmNgoD0AAMrGiJlkAAAA", + "encoding":"base64", + "height":5, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":5, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"orthogonal", + "renderorder":"right-down", + "tiledversion":"1.11.2", + "tileheight":32, + "tilesets":[], + "tilewidth":32, + "type":"map", + "version":"1.10", + "width":5 +} \ No newline at end of file diff --git a/src/DotTiled.Tests/TestData/Maps/default-map-base64-gzip/default-map-base64-gzip.tmx b/src/DotTiled.Tests/TestData/Maps/default-map-base64-gzip/default-map-base64-gzip.tmx new file mode 100644 index 0000000..b2c82fb --- /dev/null +++ b/src/DotTiled.Tests/TestData/Maps/default-map-base64-gzip/default-map-base64-gzip.tmx @@ -0,0 +1,8 @@ + + + + + H4sIAAAAAAAACmNgoD0AAMrGiJlkAAAA + + + From f99b8d4dacd510cee74e80a2e4ab09bae2d9635d Mon Sep 17 00:00:00 2001 From: 7H3LaughingMan <7H3LaughingMan@proton.me> Date: Tue, 29 Apr 2025 13:43:29 -0500 Subject: [PATCH 4/5] ZLib Tests --- .../default-map-base64-zlib.cs | 52 +++++++++++++++++++ .../default-map-base64-zlib.tmj | 30 +++++++++++ .../default-map-base64-zlib.tmx | 8 +++ 3 files changed, 90 insertions(+) create mode 100644 src/DotTiled.Tests/TestData/Maps/default-map-base64-zlib/default-map-base64-zlib.cs create mode 100644 src/DotTiled.Tests/TestData/Maps/default-map-base64-zlib/default-map-base64-zlib.tmj create mode 100644 src/DotTiled.Tests/TestData/Maps/default-map-base64-zlib/default-map-base64-zlib.tmx diff --git a/src/DotTiled.Tests/TestData/Maps/default-map-base64-zlib/default-map-base64-zlib.cs b/src/DotTiled.Tests/TestData/Maps/default-map-base64-zlib/default-map-base64-zlib.cs new file mode 100644 index 0000000..1657916 --- /dev/null +++ b/src/DotTiled.Tests/TestData/Maps/default-map-base64-zlib/default-map-base64-zlib.cs @@ -0,0 +1,52 @@ +namespace DotTiled.Tests; + +public partial class TestData +{ + public static Map DefaultMapBase64ZLib() => new Map + { + Class = "", + Orientation = MapOrientation.Orthogonal, + Width = 5, + Height = 5, + TileWidth = 32, + TileHeight = 32, + Infinite = false, + ParallaxOriginX = 0, + ParallaxOriginY = 0, + RenderOrder = RenderOrder.RightDown, + CompressionLevel = -1, + BackgroundColor = new TiledColor { R = 0, G = 0, B = 0, A = 0 }, + Version = "1.10", + TiledVersion = "1.11.2", + NextLayerID = 2, + NextObjectID = 1, + Layers = [ + new TileLayer + { + ID = 1, + Name = "Tile Layer 1", + Width = 5, + Height = 5, + Data = new Data + { + Encoding = DataEncoding.Base64, + Compression = DataCompression.ZLib, + GlobalTileIDs = new Optional([ + 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 = new Optional([ + 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/src/DotTiled.Tests/TestData/Maps/default-map-base64-zlib/default-map-base64-zlib.tmj b/src/DotTiled.Tests/TestData/Maps/default-map-base64-zlib/default-map-base64-zlib.tmj new file mode 100644 index 0000000..f527b98 --- /dev/null +++ b/src/DotTiled.Tests/TestData/Maps/default-map-base64-zlib/default-map-base64-zlib.tmj @@ -0,0 +1,30 @@ +{ "compressionlevel":-1, + "height":5, + "infinite":false, + "layers":[ + { + "compression":"zlib", + "data":"eJxjYKA9AAAAZAAB", + "encoding":"base64", + "height":5, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":5, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"orthogonal", + "renderorder":"right-down", + "tiledversion":"1.11.2", + "tileheight":32, + "tilesets":[], + "tilewidth":32, + "type":"map", + "version":"1.10", + "width":5 +} \ No newline at end of file diff --git a/src/DotTiled.Tests/TestData/Maps/default-map-base64-zlib/default-map-base64-zlib.tmx b/src/DotTiled.Tests/TestData/Maps/default-map-base64-zlib/default-map-base64-zlib.tmx new file mode 100644 index 0000000..17295d1 --- /dev/null +++ b/src/DotTiled.Tests/TestData/Maps/default-map-base64-zlib/default-map-base64-zlib.tmx @@ -0,0 +1,8 @@ + + + + + eJxjYKA9AAAAZAAB + + + From 45ac13819a71fb42af0e229a9ddd6b9c3abf4d13 Mon Sep 17 00:00:00 2001 From: 7H3LaughingMan <7H3LaughingMan@proton.me> Date: Tue, 29 Apr 2025 13:43:47 -0500 Subject: [PATCH 5/5] Use New Tests --- src/DotTiled.Tests/UnitTests/Serialization/TestData.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/DotTiled.Tests/UnitTests/Serialization/TestData.cs b/src/DotTiled.Tests/UnitTests/Serialization/TestData.cs index 2d59b39..2256f83 100644 --- a/src/DotTiled.Tests/UnitTests/Serialization/TestData.cs +++ b/src/DotTiled.Tests/UnitTests/Serialization/TestData.cs @@ -34,6 +34,9 @@ public static partial class TestData public static IEnumerable MapTests => [ [GetMapPath("default-map"), (string f) => DefaultMap(), Array.Empty()], + [GetMapPath("default-map-base64"), (string f) => DefaultMapBase64(), Array.Empty()], + [GetMapPath("default-map-base64-gzip"), (string f) => DefaultMapBase64GZip(), Array.Empty()], + [GetMapPath("default-map-base64-zlib"), (string f) => DefaultMapBase64ZLib(), Array.Empty()], [GetMapPath("map-duplicate-object-id-bug"), (string f) => MapDuplicateObjectIdBug(f), Array.Empty()], [GetMapPath("map-with-common-props"), (string f) => MapWithCommonProps(), Array.Empty()], [GetMapPath("map-with-custom-type-props"), (string f) => MapWithCustomTypeProps(), MapWithCustomTypePropsCustomTypeDefinitions()],