using System.Numerics; using DotTiled.Serialization; using NSubstitute; namespace DotTiled.Tests; public class LoaderTests { [Fact] public void LoadMap_Always_ReadsFromResourceReader() { // Arrange var resourceReader = Substitute.For(); resourceReader.Read("map.tmx").Returns( """ 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 """); var resourceCache = Substitute.For(); var customTypeDefinitions = Enumerable.Empty(); var loader = new Loader(resourceReader, resourceCache, customTypeDefinitions); // Act loader.LoadMap("map.tmx"); // Assert resourceReader.Received(1).Read("map.tmx"); } [Fact] public void LoadMap_MapReferencesExternalTileset_ReadsTilesetFromResourceReaderAndAttemptsToRetrieveFromCache() { // Arrange var resourceReader = Substitute.For(); resourceReader.Read("map.tmx").Returns( """ 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 """); resourceReader.Read("tileset.tsx").Returns( """ """); var resourceCache = Substitute.For(); resourceCache.GetTileset(Arg.Any()).Returns(Optional.Empty); resourceCache.GetTemplate(Arg.Any()).Returns(Optional.Empty); var customTypeDefinitions = Enumerable.Empty(); var loader = new Loader(resourceReader, resourceCache, customTypeDefinitions); // Act loader.LoadMap("map.tmx"); // Assert resourceReader.Received(1).Read("tileset.tsx"); resourceCache.Received(1).GetTileset("tileset.tsx"); } [Fact] public void LoadMap_MapReferencesExternalTemplate_ReadsTemplateFromResourceReaderAndAttemptsToRetrieveFromCache() { // Arrange var resourceReader = Substitute.For(); resourceReader.Read("map.tmx").Returns( """ 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 """); resourceReader.Read("tileset.tsx").Returns( """ """); resourceReader.Read("template.tx").Returns( """ """); var resourceCache = Substitute.For(); resourceCache.GetTileset(Arg.Any()).Returns(Optional.Empty); resourceCache.GetTemplate(Arg.Any()).Returns(Optional.Empty); var customTypeDefinitions = Enumerable.Empty(); var loader = new Loader(resourceReader, resourceCache, customTypeDefinitions); // Act loader.LoadMap("map.tmx"); // Assert resourceReader.Received(1).Read("template.tx"); resourceCache.Received(1).GetTemplate("template.tx"); } [Fact] public void LoadMap_CacheReturnsTileset_ReturnsTilesetFromCache() { // Arrange var resourceReader = Substitute.For(); resourceReader.Read("map.tmx").Returns( """ 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 """); var resourceCache = Substitute.For(); resourceCache.GetTileset("tileset.tsx").Returns(new Optional(new Tileset { Name = "Tileset", TileWidth = 32, TileHeight = 32, TileCount = 1, Columns = 1 })); var customTypeDefinitions = Enumerable.Empty(); var loader = new Loader(resourceReader, resourceCache, customTypeDefinitions); // Act loader.LoadMap("map.tmx"); // Assert resourceReader.DidNotReceive().Read("tileset.tsx"); } [Fact] public void LoadMap_CacheReturnsTemplate_ReturnsTemplateFromCache() { // Arrange var resourceReader = Substitute.For(); resourceReader.Read("map.tmx").Returns( """ 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 """); resourceReader.Read("tileset.tsx").Returns( """ """); var resourceCache = Substitute.For(); resourceCache.GetTileset(Arg.Any()).Returns(Optional.Empty); resourceCache.GetTemplate("template.tx").Returns(new Optional