diff --git a/engine/Orbit.Engine.Tests/GameObjectTests.cs b/engine/Orbit.Engine.Tests/GameObjectTests.cs new file mode 100644 index 0000000..ada02cf --- /dev/null +++ b/engine/Orbit.Engine.Tests/GameObjectTests.cs @@ -0,0 +1,75 @@ +using Microsoft.Maui; +using Microsoft.Maui.Graphics; + +namespace Orbit.Engine.Tests; + +public class GameObjectTests +{ + [Test] + public void AddShouldCallOnAddedToNewChild() + { + var parent = new MockGameObject(); + var child = new MockGameObject(); + + child.OnAddedCount.Should().Be(0); + + parent.Add(child); + + child.OnAddedCount.Should().Be(1); + } + + [Test] + public void RemoveShouldCallOnRemovedToNewChild() + { + var parent = new MockGameObject(); + var child = new MockGameObject(); + + child.OnRemovedCount.Should().Be(0); + + parent.Add(child); + + child.OnRemovedCount.Should().Be(0); + + parent.Remove(child); + + child.OnRemovedCount.Should().Be(1); + } + + [Test] + public void RenderShouldCallRenderOnChildren() + { + var parent = new MockGameObject(); + var child = new MockGameObject(); + + parent.Render(null, RectF.Zero); + + parent.RenderCount.Should().Be(1); + child.RenderCount.Should().Be(0); + + parent.Add(child); + + parent.Render(null, RectF.Zero); + + parent.RenderCount.Should().Be(2); + child.RenderCount.Should().Be(1); + } + + [Test] + public void UpdateShouldCallUpdateOnChildren() + { + var parent = new MockGameObject(); + var child = new MockGameObject(); + + parent.Update(16); + + parent.UpdateCount.Should().Be(1); + child.UpdateCount.Should().Be(0); + + parent.Add(child); + + parent.Update(16); + + parent.UpdateCount.Should().Be(2); + child.UpdateCount.Should().Be(1); + } +} \ No newline at end of file diff --git a/engine/Orbit.Engine.Tests/GameSceneManagerTests.cs b/engine/Orbit.Engine.Tests/GameSceneManagerTests.cs index 29de20c..cd3a369 100644 --- a/engine/Orbit.Engine.Tests/GameSceneManagerTests.cs +++ b/engine/Orbit.Engine.Tests/GameSceneManagerTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using NUnit.Framework; using Orbit.Engine.Tests.Mocks; @@ -31,4 +31,54 @@ public void LoadSceneShouldChangeStateToLoaded() manager.CurrentScene.Should().Be(sceneInstance); } + + [Test] + public void CompleteShouldMoveStateToCompleted() + { + GameSceneManager manager = new(new MockDispatcher(), null); + + manager.Complete(); + + manager.State.Should().Be(GameState.Completed); + } + + [Test] + public void GameOverShouldMoveStateToGameOver() + { + GameSceneManager manager = new(new MockDispatcher(), null); + + manager.GameOver(); + + manager.State.Should().Be(GameState.GameOver); + } + + [Test] + public void PauseShouldMoveStateToPaused() + { + GameSceneManager manager = new(new MockDispatcher(), null); + + manager.Pause(); + + manager.State.Should().Be(GameState.Paused); + } + + [Test] + public void StartShouldMoveStateToStarted() + { + GameSceneManager manager = new(new MockDispatcher(), null); + + manager.Start(); + + manager.State.Should().Be(GameState.Started); + } + + [Test] + public void StopShouldMoveStateToLoaded() + { + GameSceneManager manager = new(new MockDispatcher(), null); + + manager.Stop(); + + manager.State.Should().Be(GameState.Loaded); + } } \ No newline at end of file diff --git a/engine/Orbit.Engine.Tests/Mocks/MockGameObject.cs b/engine/Orbit.Engine.Tests/Mocks/MockGameObject.cs new file mode 100644 index 0000000..6c833dc --- /dev/null +++ b/engine/Orbit.Engine.Tests/Mocks/MockGameObject.cs @@ -0,0 +1,36 @@ +using Orbit.Engine; + +namespace Orbit.Engine.Tests; + +public class MockGameObject : GameObject +{ + internal int OnAddedCount { get; private set; } + + internal int OnRemovedCount { get; private set; } + + internal int RenderCount { get; private set; } + + internal int UpdateCount { get; private set; } + + public override void OnAdded() + { + } + + public override void OnRemoved() + { + } + + public override void Render(ICanvas canvas, RectF dimensions) + { + base.Render(canvas, dimensions); + + RenderCount++; + } + + public override void Update(double millisecondsSinceLastUpdate) + { + base.Update(millisecondsSinceLastUpdate); + + UpdateCount++; + } +} \ No newline at end of file diff --git a/engine/Orbit.Engine/GameObject.cs b/engine/Orbit.Engine/GameObject.cs index 78ba7aa..f2aba02 100644 --- a/engine/Orbit.Engine/GameObject.cs +++ b/engine/Orbit.Engine/GameObject.cs @@ -10,7 +10,7 @@ namespace Orbit.Engine; /// /// Base class definition representing an object in a game. /// -public abstract class GameObject : GameObjectContainer, IGameObject, IDrawable +public abstract class GameObject : GameObjectContainer, IGameObject { private GameScene currentScene; @@ -32,15 +32,6 @@ public GameScene CurrentScene } } - void IDrawable.Draw(ICanvas canvas, RectF dirtyRect) - { - canvas.SaveState(); - - Render(canvas, dirtyRect); - - canvas.RestoreState(); - } - /// /// Lifecycle method called to inform this that it has been added to a container and ultimately a game. ///