Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 86 additions & 1 deletion tests/GameUtils.Tests/Types/Camera2DTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,36 @@ namespace GameUtils.Tests.Types
[TestClass]
public class Camera2DTests
{
private const float Delta = 1e-4f;

[TestMethod]
public void Constructor_WithViewSize_SetsDefaultProperties()
{
var viewSize = new Vector2(800, 600);
var camera = new Camera2D(viewSize);

Assert.AreEqual(Vector2.Zero, camera.Position);
Assert.AreEqual(viewSize, camera.ViewSize);
Assert.AreEqual(1f, camera.Zoom);
Assert.AreEqual(0f, camera.Rotation);
}

[TestMethod]
public void Constructor_WithFullParameters_SetsProperties()
{
var pos = new Vector2(100, 200);
var viewSize = new Vector2(1920, 1080);
var zoom = 2f;
var rotation = MathF.PI / 4f;

var camera = new Camera2D(pos, viewSize, zoom, rotation);

Assert.AreEqual(pos, camera.Position);
Assert.AreEqual(viewSize, camera.ViewSize);
Assert.AreEqual(zoom, camera.Zoom);
Assert.AreEqual(rotation, camera.Rotation);
}

[TestMethod]
[DataRow(0f)]
[DataRow(-1f)]
Expand All @@ -18,7 +48,7 @@ public void Zoom_SetInvalidValue_ThrowsArgumentOutOfRangeException(float invalid
var camera = new Camera2D(new Vector2(800, 600));
Assert.ThrowsExactly<ArgumentOutOfRangeException>(() => camera.Zoom = invalidZoom);
}

[TestMethod]
[DataRow(0f)]
[DataRow(-1f)]
Expand All @@ -30,6 +60,61 @@ public void Constructor_InvalidZoom_ThrowsArgumentOutOfRangeException(float inva
new Camera2D(Vector2.Zero, new Vector2(800, 600), invalidZoom));
}

[TestMethod]
public void Zoom_ValidValue_UpdatesZoom()
{
var camera = new Camera2D(new Vector2(800, 600));
camera.Zoom = 2.5f;
Assert.AreEqual(2.5f, camera.Zoom);
}

[TestMethod]
public void WorldToScreen_IdentityCamera_TransformsCorrectly()
{
var camera = new Camera2D(Vector2.Zero, new Vector2(800, 600), 1f, 0f);
var world = new Vector2(0, 0);
var screen = camera.WorldToScreen(world);

Assert.AreEqual(400f, screen.X, Delta);
Assert.AreEqual(300f, screen.Y, Delta);
}

[TestMethod]
public void ScreenToWorld_IdentityCamera_TransformsCorrectly()
{
var camera = new Camera2D(Vector2.Zero, new Vector2(800, 600), 1f, 0f);
var screen = new Vector2(400, 300);
var world = camera.ScreenToWorld(screen);

Assert.AreEqual(0f, world.X, Delta);
Assert.AreEqual(0f, world.Y, Delta);
}

[TestMethod]
public void WorldToScreen_And_ScreenToWorld_RoundTrip()
{
var camera = new Camera2D(new Vector2(150, -50), new Vector2(1024, 768), 1.5f, MathF.PI / 6f);
var originalWorld = new Vector2(200, 100);

var screen = camera.WorldToScreen(originalWorld);
var worldRoundTrip = camera.ScreenToWorld(screen);

Assert.AreEqual(originalWorld.X, worldRoundTrip.X, Delta);
Assert.AreEqual(originalWorld.Y, worldRoundTrip.Y, Delta);
}

[TestMethod]
public void GetVisibleBounds_CalculatesCorrectAABB()
{
var camera = new Camera2D(new Vector2(100, 200), new Vector2(800, 600), 2f, 0f);
var bounds = camera.GetVisibleBounds();

Assert.AreEqual(-100f, bounds.Min.X, Delta);
Assert.AreEqual(50f, bounds.Min.Y, Delta);
Assert.AreEqual(300f, bounds.Max.X, Delta);
Assert.AreEqual(350f, bounds.Max.Y, Delta);
}

[TestMethod]
[DataRow(1f)]
[DataRow(2.5f)]
Expand Down
Loading