| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- using Microsoft.Xna.Framework;
- using MonoGame.Extended.Tilemaps;
- namespace MonoGame.Extended.Tests;
- public sealed class TilemapTests
- {
- #region Orthogonal Coordinate Tesets
- [Fact]
- public void TileToWorldPosition_Orthogonal_Origin_ReturnsZero()
- {
- var tilemap = new Tilemap("test", 10, 10, 32, 32, TilemapOrientation.Orthogonal);
- var worldPos = tilemap.TileToWorldPosition(0, 0);
- Assert.Equal(new Point(0, 0), worldPos);
- }
- [Theory]
- [InlineData(0, 0, 0, 0)]
- [InlineData(1, 0, 32, 0)]
- [InlineData(0, 1, 0, 32)]
- [InlineData(1, 1, 32, 32)]
- [InlineData(5, 3, 160, 96)]
- [InlineData(10, 10, 320, 320)]
- public void TileToWorldPosition_Orthogonal_VariousCoodinates_ReturnsExpectedPositions(int tileX, int tileY, int expectedworldX, int expectedWorldY)
- {
- var tilemap = new Tilemap("test", 20, 20, 32, 32, TilemapOrientation.Orthogonal);
- var worldPos = tilemap.TileToWorldPosition(tileX, tileY);
- Assert.Equal(new Point(expectedworldX, expectedWorldY), worldPos);
- }
- [Fact]
- public void WorldToTilePosition_Orthogonal_Origin_ReturnsZero()
- {
- var tilemap = new Tilemap("test", 10, 10, 32, 32, TilemapOrientation.Orthogonal);
- var tilePos = tilemap.WorldToTilePosition(Vector2.Zero);
- Assert.Equal(Point.Zero, tilePos);
- }
- [Theory]
- [InlineData(0, 0, 0, 0)]
- [InlineData(32, 0, 1, 0)]
- [InlineData(0, 32, 0, 1)]
- [InlineData(32, 32, 1, 1)]
- [InlineData(160, 96, 5, 3)]
- [InlineData(320, 320, 10, 10)]
- public void WorldToTilePosition_Orthogonal_VariousPositions_ReturnsExpectedCoordinates(float worldX, float worldY, int expectedTileX, int expectedTileY)
- {
- var tilemap = new Tilemap("test", 20, 20, 32, 32, TilemapOrientation.Orthogonal);
- var tilePos = tilemap.WorldToTilePosition(new Vector2(worldX, worldY));
- Assert.Equal(new Point(expectedTileX, expectedTileY), tilePos);
- }
- [Fact]
- public void CoordinateTransformation_Orthogonal_RoundTrip_PreservesCoordinates()
- {
- var tilemap = new Tilemap("test", 20, 20, 32, 32, TilemapOrientation.Orthogonal);
- var originalTile = new Point(5, 7);
- var worldPos = tilemap.TileToWorldPosition(originalTile.X, originalTile.Y);
- var backToTile = tilemap.WorldToTilePosition(new Vector2(worldPos.X, worldPos.Y));
- Assert.Equal(originalTile, backToTile);
- }
- [Fact]
- public void WorldBounds_Orthogonal_ReturnsCorrectBounds()
- {
- var tilemap = new Tilemap("test", 10, 8, 32, 32, TilemapOrientation.Orthogonal);
- var bounds = tilemap.WorldBounds;
- Assert.Equal(new Rectangle(0, 0, 320, 256), bounds);
- }
- #endregion
- #region Isometric Coordinate Tests
- [Fact]
- public void TileToWorldPosition_Isometric_Origin_ReturnsZero()
- {
- var tilemap = new Tilemap("test", 10, 10, 64, 32, TilemapOrientation.Isometric);
- var worldPos = tilemap.TileToWorldPosition(0, 0);
- Assert.Equal(Point.Zero, worldPos);
- }
- [Theory]
- [InlineData(1, 0, 32, 16)] // (1-0)*(64/2), (1+0)*(32/2)
- [InlineData(0, 1, -32, 16)] // (0-1)*(64/2), (0+1)*(32/2)
- [InlineData(1, 1, 0, 32)] // (1-1)*(64/2), (1+1)*(32/2)
- [InlineData(2, 1, 32, 48)] // (2-1)*(64/2), (2+1)*(32/2)
- public void TileToWorldPosition_Isometric_VariousCoordinates_ReturnsExpectedPositions(int tileX, int tileY, int expectedWorldX, int expectedWorldY)
- {
- var tilemap = new Tilemap("test", 10, 10, 64, 32, TilemapOrientation.Isometric);
- var worldPos = tilemap.TileToWorldPosition(tileX, tileY);
- Assert.Equal(new Point(expectedWorldX, expectedWorldY), worldPos);
- }
- [Fact]
- public void WorldToTilePosition_Isometric_Origin_ReturnsZero()
- {
- var tilemap = new Tilemap("test", 10, 10, 64, 32, TilemapOrientation.Isometric);
- var tilePos = tilemap.WorldToTilePosition(new Vector2(0, 0));
- Assert.Equal(Point.Zero, tilePos);
- }
- [Fact]
- public void CoordinateTransformation_Isometric_RoundTrip_PreservesCoordinates()
- {
- var tilemap = new Tilemap("test", 10, 10, 64, 32, TilemapOrientation.Isometric);
- var originalTile = new Point(5, 3);
- var worldPos = tilemap.TileToWorldPosition(originalTile.X, originalTile.Y);
- var backToTile = tilemap.WorldToTilePosition(new Vector2(worldPos.X, worldPos.Y));
- Assert.Equal(originalTile, backToTile);
- }
- [Fact]
- public void WorldBounds_Isometric_ReturnsCorrectBounds()
- {
- var tilemap = new Tilemap("test", 10, 8, 64, 32, TilemapOrientation.Isometric);
- var bounds = tilemap.WorldBounds;
- // (10 + 8) * (64/2) = 18 * 32 = 576 width
- // (10 + 8) * (32/2) = 18 * 16 = 288 height
- Assert.Equal(new Rectangle(0, 0, 576, 288), bounds);
- }
- #endregion
- #region Different Tile Sizes
- [Theory]
- [InlineData(16, 16)]
- [InlineData(32, 32)]
- [InlineData(64, 64)]
- [InlineData(48, 24)]
- public void TileToWorldPosition_Orthogonal_DifferentTileSizes_WorksCorrectly(int tileWidth, int tileHeight)
- {
- var tilemap = new Tilemap("test", 10, 10, tileWidth, tileHeight, TilemapOrientation.Orthogonal);
- var worldPos = tilemap.TileToWorldPosition(3, 2);
- Assert.Equal(new Point(3 * tileWidth, 2 * tileHeight), worldPos);
- }
- #endregion
- #region Edge Cases
- [Fact]
- public void TileToWorldPosition_NegativeCoordinates_HandlesCorrectly()
- {
- var tilemap = new Tilemap("test", 10, 10, 32, 32, TilemapOrientation.Orthogonal);
- var worldPos = tilemap.TileToWorldPosition(-1, -2);
- Assert.Equal(new Point(-32, -64), worldPos);
- }
- [Fact]
- public void WorldToTilePosition_NegativeWorldPosition_HandlesCorrectly()
- {
- var tilemap = new Tilemap("test", 10, 10, 32, 32, TilemapOrientation.Orthogonal);
- var tilePos = tilemap.WorldToTilePosition(new Vector2(-32, -64));
- Assert.Equal(new Point(-1, -2), tilePos);
- }
- [Fact]
- public void WorldToTilePosition_FractionalWorldPosition_TruncatesDown()
- {
- var tilemap = new Tilemap("test", 10, 10, 32, 32, TilemapOrientation.Orthogonal);
- var tilePos = tilemap.WorldToTilePosition(new Vector2(50.7f, 70.9f));
- // 50/32 = 1.5 -> 1
- // 70/32 = 2.1 -> 2
- Assert.Equal(new Point(1, 2), tilePos);
- }
- #endregion
- }
|