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.
///