TilemapTests.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. using Microsoft.Xna.Framework;
  2. using MonoGame.Extended.Tilemaps;
  3. namespace MonoGame.Extended.Tests;
  4. public sealed class TilemapTests
  5. {
  6. #region Orthogonal Coordinate Tesets
  7. [Fact]
  8. public void TileToWorldPosition_Orthogonal_Origin_ReturnsZero()
  9. {
  10. var tilemap = new Tilemap("test", 10, 10, 32, 32, TilemapOrientation.Orthogonal);
  11. var worldPos = tilemap.TileToWorldPosition(0, 0);
  12. Assert.Equal(new Point(0, 0), worldPos);
  13. }
  14. [Theory]
  15. [InlineData(0, 0, 0, 0)]
  16. [InlineData(1, 0, 32, 0)]
  17. [InlineData(0, 1, 0, 32)]
  18. [InlineData(1, 1, 32, 32)]
  19. [InlineData(5, 3, 160, 96)]
  20. [InlineData(10, 10, 320, 320)]
  21. public void TileToWorldPosition_Orthogonal_VariousCoodinates_ReturnsExpectedPositions(int tileX, int tileY, int expectedworldX, int expectedWorldY)
  22. {
  23. var tilemap = new Tilemap("test", 20, 20, 32, 32, TilemapOrientation.Orthogonal);
  24. var worldPos = tilemap.TileToWorldPosition(tileX, tileY);
  25. Assert.Equal(new Point(expectedworldX, expectedWorldY), worldPos);
  26. }
  27. [Fact]
  28. public void WorldToTilePosition_Orthogonal_Origin_ReturnsZero()
  29. {
  30. var tilemap = new Tilemap("test", 10, 10, 32, 32, TilemapOrientation.Orthogonal);
  31. var tilePos = tilemap.WorldToTilePosition(Vector2.Zero);
  32. Assert.Equal(Point.Zero, tilePos);
  33. }
  34. [Theory]
  35. [InlineData(0, 0, 0, 0)]
  36. [InlineData(32, 0, 1, 0)]
  37. [InlineData(0, 32, 0, 1)]
  38. [InlineData(32, 32, 1, 1)]
  39. [InlineData(160, 96, 5, 3)]
  40. [InlineData(320, 320, 10, 10)]
  41. public void WorldToTilePosition_Orthogonal_VariousPositions_ReturnsExpectedCoordinates(float worldX, float worldY, int expectedTileX, int expectedTileY)
  42. {
  43. var tilemap = new Tilemap("test", 20, 20, 32, 32, TilemapOrientation.Orthogonal);
  44. var tilePos = tilemap.WorldToTilePosition(new Vector2(worldX, worldY));
  45. Assert.Equal(new Point(expectedTileX, expectedTileY), tilePos);
  46. }
  47. [Fact]
  48. public void CoordinateTransformation_Orthogonal_RoundTrip_PreservesCoordinates()
  49. {
  50. var tilemap = new Tilemap("test", 20, 20, 32, 32, TilemapOrientation.Orthogonal);
  51. var originalTile = new Point(5, 7);
  52. var worldPos = tilemap.TileToWorldPosition(originalTile.X, originalTile.Y);
  53. var backToTile = tilemap.WorldToTilePosition(new Vector2(worldPos.X, worldPos.Y));
  54. Assert.Equal(originalTile, backToTile);
  55. }
  56. [Fact]
  57. public void WorldBounds_Orthogonal_ReturnsCorrectBounds()
  58. {
  59. var tilemap = new Tilemap("test", 10, 8, 32, 32, TilemapOrientation.Orthogonal);
  60. var bounds = tilemap.WorldBounds;
  61. Assert.Equal(new Rectangle(0, 0, 320, 256), bounds);
  62. }
  63. #endregion
  64. #region Isometric Coordinate Tests
  65. [Fact]
  66. public void TileToWorldPosition_Isometric_Origin_ReturnsZero()
  67. {
  68. var tilemap = new Tilemap("test", 10, 10, 64, 32, TilemapOrientation.Isometric);
  69. var worldPos = tilemap.TileToWorldPosition(0, 0);
  70. Assert.Equal(Point.Zero, worldPos);
  71. }
  72. [Theory]
  73. [InlineData(1, 0, 32, 16)] // (1-0)*(64/2), (1+0)*(32/2)
  74. [InlineData(0, 1, -32, 16)] // (0-1)*(64/2), (0+1)*(32/2)
  75. [InlineData(1, 1, 0, 32)] // (1-1)*(64/2), (1+1)*(32/2)
  76. [InlineData(2, 1, 32, 48)] // (2-1)*(64/2), (2+1)*(32/2)
  77. public void TileToWorldPosition_Isometric_VariousCoordinates_ReturnsExpectedPositions(int tileX, int tileY, int expectedWorldX, int expectedWorldY)
  78. {
  79. var tilemap = new Tilemap("test", 10, 10, 64, 32, TilemapOrientation.Isometric);
  80. var worldPos = tilemap.TileToWorldPosition(tileX, tileY);
  81. Assert.Equal(new Point(expectedWorldX, expectedWorldY), worldPos);
  82. }
  83. [Fact]
  84. public void WorldToTilePosition_Isometric_Origin_ReturnsZero()
  85. {
  86. var tilemap = new Tilemap("test", 10, 10, 64, 32, TilemapOrientation.Isometric);
  87. var tilePos = tilemap.WorldToTilePosition(new Vector2(0, 0));
  88. Assert.Equal(Point.Zero, tilePos);
  89. }
  90. [Fact]
  91. public void CoordinateTransformation_Isometric_RoundTrip_PreservesCoordinates()
  92. {
  93. var tilemap = new Tilemap("test", 10, 10, 64, 32, TilemapOrientation.Isometric);
  94. var originalTile = new Point(5, 3);
  95. var worldPos = tilemap.TileToWorldPosition(originalTile.X, originalTile.Y);
  96. var backToTile = tilemap.WorldToTilePosition(new Vector2(worldPos.X, worldPos.Y));
  97. Assert.Equal(originalTile, backToTile);
  98. }
  99. [Fact]
  100. public void WorldBounds_Isometric_ReturnsCorrectBounds()
  101. {
  102. var tilemap = new Tilemap("test", 10, 8, 64, 32, TilemapOrientation.Isometric);
  103. var bounds = tilemap.WorldBounds;
  104. // (10 + 8) * (64/2) = 18 * 32 = 576 width
  105. // (10 + 8) * (32/2) = 18 * 16 = 288 height
  106. Assert.Equal(new Rectangle(0, 0, 576, 288), bounds);
  107. }
  108. #endregion
  109. #region Different Tile Sizes
  110. [Theory]
  111. [InlineData(16, 16)]
  112. [InlineData(32, 32)]
  113. [InlineData(64, 64)]
  114. [InlineData(48, 24)]
  115. public void TileToWorldPosition_Orthogonal_DifferentTileSizes_WorksCorrectly(int tileWidth, int tileHeight)
  116. {
  117. var tilemap = new Tilemap("test", 10, 10, tileWidth, tileHeight, TilemapOrientation.Orthogonal);
  118. var worldPos = tilemap.TileToWorldPosition(3, 2);
  119. Assert.Equal(new Point(3 * tileWidth, 2 * tileHeight), worldPos);
  120. }
  121. #endregion
  122. #region Edge Cases
  123. [Fact]
  124. public void TileToWorldPosition_NegativeCoordinates_HandlesCorrectly()
  125. {
  126. var tilemap = new Tilemap("test", 10, 10, 32, 32, TilemapOrientation.Orthogonal);
  127. var worldPos = tilemap.TileToWorldPosition(-1, -2);
  128. Assert.Equal(new Point(-32, -64), worldPos);
  129. }
  130. [Fact]
  131. public void WorldToTilePosition_NegativeWorldPosition_HandlesCorrectly()
  132. {
  133. var tilemap = new Tilemap("test", 10, 10, 32, 32, TilemapOrientation.Orthogonal);
  134. var tilePos = tilemap.WorldToTilePosition(new Vector2(-32, -64));
  135. Assert.Equal(new Point(-1, -2), tilePos);
  136. }
  137. [Fact]
  138. public void WorldToTilePosition_FractionalWorldPosition_TruncatesDown()
  139. {
  140. var tilemap = new Tilemap("test", 10, 10, 32, 32, TilemapOrientation.Orthogonal);
  141. var tilePos = tilemap.WorldToTilePosition(new Vector2(50.7f, 70.9f));
  142. // 50/32 = 1.5 -> 1
  143. // 70/32 = 2.1 -> 2
  144. Assert.Equal(new Point(1, 2), tilePos);
  145. }
  146. #endregion
  147. }