Add Raylib example project and helper methods for resolving tilesets and finding source rectangles of tiles

This commit is contained in:
Daniel Cronqvist 2025-04-24 08:15:50 +02:00
parent 84e75b93b7
commit 57e69f691e
8 changed files with 598 additions and 0 deletions

View file

@ -0,0 +1,132 @@
namespace DotTiled.Tests.UnitTests;
public class MapTests
{
[Fact]
public void ResolveTilesetForGlobalTileID_NoTilesets_ThrowsException()
{
// Arrange
var map = new Map
{
Version = "version",
Orientation = MapOrientation.Orthogonal,
Width = 10,
Height = 10,
TileWidth = 16,
TileHeight = 16,
NextLayerID = 1,
NextObjectID = 1
};
// Act & Assert
Assert.Throws<ArgumentException>(() => map.ResolveTilesetForGlobalTileID(1, out var _));
}
[Fact]
public void ResolveTilesetForGlobalTileID_GlobalTileIDOutOfRange_ThrowsException()
{
// Arrange
var map = new Map
{
Version = "version",
Orientation = MapOrientation.Orthogonal,
Width = 10,
Height = 10,
TileWidth = 16,
TileHeight = 16,
NextLayerID = 1,
NextObjectID = 1,
Tilesets = [
new Tileset
{
FirstGID = 1,
Name = "Tileset1",
TileWidth = 16,
TileHeight = 16,
TileCount = 5,
Columns = 5
}
]
};
// Act & Assert
Assert.Throws<ArgumentException>(() => map.ResolveTilesetForGlobalTileID(6, out var _));
}
[Fact]
public void ResolveTilesetForGlobalTileID_GlobalTileIDInRangeOfOnlyTileset_ReturnsTileset()
{
// Arrange
var tileset = new Tileset
{
FirstGID = 1,
Name = "Tileset1",
TileWidth = 16,
TileHeight = 16,
TileCount = 5,
Columns = 5
};
var map = new Map
{
Version = "version",
Orientation = MapOrientation.Orthogonal,
Width = 10,
Height = 10,
TileWidth = 16,
TileHeight = 16,
NextLayerID = 1,
NextObjectID = 1,
Tilesets = [tileset]
};
// Act
var result = map.ResolveTilesetForGlobalTileID(3, out var localTileID);
// Assert
Assert.Equal(tileset, result);
Assert.Equal(2, (int)localTileID); // 3 - 1 = 2 (local tile ID)
}
[Fact]
public void ResolveTilesetForGlobalTileID_GlobalTileIDInRangeOfMultipleTilesets_ReturnsCorrectTileset()
{
// Arrange
var tileset1 = new Tileset
{
FirstGID = 1,
Name = "Tileset1",
TileWidth = 16,
TileHeight = 16,
TileCount = 5,
Columns = 5
};
var tileset2 = new Tileset
{
FirstGID = 6,
Name = "Tileset2",
TileWidth = 16,
TileHeight = 16,
TileCount = 5,
Columns = 5
};
var map = new Map
{
Version = "version",
Orientation = MapOrientation.Orthogonal,
Width = 10,
Height = 10,
TileWidth = 16,
TileHeight = 16,
NextLayerID = 1,
NextObjectID = 1,
Tilesets = [tileset1, tileset2]
};
// Act
var result = map.ResolveTilesetForGlobalTileID(8, out var localTileID);
// Assert
Assert.Equal(tileset2, result);
Assert.Equal(2, (int)localTileID); // 8 - 6 = 2 (local tile ID)
}
}

View file

@ -0,0 +1,114 @@
namespace DotTiled.Tests.UnitTests;
public class TilesetTests
{
[Fact]
public void GetSourceRectangleForLocalTileID_TileIDOutOfRange_ThrowsException()
{
// Arrange
var tileset = new Tileset
{
FirstGID = 0,
Name = "Tileset1",
TileWidth = 16,
TileHeight = 16,
TileCount = 5,
Columns = 5
};
// Act & Assert
Assert.Throws<ArgumentException>(() => tileset.GetSourceRectangleForLocalTileID(6));
}
[Fact]
public void GetSourceRectangleForLocalTileID_ValidTileIDIsInTilesList_ReturnsCorrectRectangle()
{
// Arrange
var tileset = new Tileset
{
FirstGID = 0,
Name = "Tileset1",
TileWidth = 16,
TileHeight = 16,
TileCount = 2,
Columns = 2,
Tiles = [
new Tile
{
ID = 0,
X = 0,
Y = 0,
Width = 16,
Height = 16,
},
new Tile
{
ID = 1,
X = 16,
Y = 0,
Width = 16,
Height = 16,
}
]
};
// Act
var rectangle = tileset.GetSourceRectangleForLocalTileID(1);
// Assert
Assert.Equal(16, rectangle.X);
Assert.Equal(0, rectangle.Y);
Assert.Equal(16, rectangle.Width);
Assert.Equal(16, rectangle.Height);
}
[Fact]
public void GetSourceRectangleForLocalTileID_ValidTileIDIsNotInTilesListNoMarginNoSpacing_ReturnsCorrectRectangle()
{
// Arrange
var tileset = new Tileset
{
FirstGID = 0,
Name = "Tileset1",
TileWidth = 16,
TileHeight = 16,
TileCount = 5,
Columns = 5,
};
// Act
var rectangle = tileset.GetSourceRectangleForLocalTileID(3);
// Assert
Assert.Equal(48, rectangle.X);
Assert.Equal(0, rectangle.Y);
Assert.Equal(16, rectangle.Width);
Assert.Equal(16, rectangle.Height);
}
[Fact]
public void GetSourceRectangleForLocalTileID_ValidTileIDIsNotInTilesListWithMarginAndSpacing_ReturnsCorrectRectangle()
{
// Arrange
var tileset = new Tileset
{
FirstGID = 0,
Name = "Tileset1",
TileWidth = 16,
TileHeight = 16,
TileCount = 5,
Columns = 5,
Margin = 3,
Spacing = 1
};
// Act
var rectangle = tileset.GetSourceRectangleForLocalTileID(3);
// Assert
Assert.Equal(54, rectangle.X);
Assert.Equal(3, rectangle.Y);
Assert.Equal(16, rectangle.Width);
Assert.Equal(16, rectangle.Height);
}
}