diff --git a/src/Assets/Plugins/Uniject/impl/TestableComponent.cs b/src/Assets/Plugins/Uniject/impl/TestableComponent.cs index 61565da..4f320f2 100644 --- a/src/Assets/Plugins/Uniject/impl/TestableComponent.cs +++ b/src/Assets/Plugins/Uniject/impl/TestableComponent.cs @@ -22,6 +22,9 @@ public void OnUpdate() { } } + public virtual void Start() { + } + public virtual void Update() { } diff --git a/src/Assets/Plugins/Uniject/impl/TestableGameObject.cs b/src/Assets/Plugins/Uniject/impl/TestableGameObject.cs index 5c99827..b16df0e 100644 --- a/src/Assets/Plugins/Uniject/impl/TestableGameObject.cs +++ b/src/Assets/Plugins/Uniject/impl/TestableGameObject.cs @@ -33,6 +33,13 @@ public virtual void Destroy () { } } + public void Start() { + for (int t = 0; t < components.Count; t++) { + TestableComponent component = components[t]; + component.Start(); + } + } + public void Update() { if (active) { for (int t = 0; t < components.Count; t++) { diff --git a/src/Assets/Plugins/Uniject/impl/UnityGameObjectBridge.cs b/src/Assets/Plugins/Uniject/impl/UnityGameObjectBridge.cs index d849869..c4c92b2 100644 --- a/src/Assets/Plugins/Uniject/impl/UnityGameObjectBridge.cs +++ b/src/Assets/Plugins/Uniject/impl/UnityGameObjectBridge.cs @@ -3,6 +3,11 @@ using UnityEngine; public class UnityGameObjectBridge : MonoBehaviour { + + public void Start() { + wrapping.Start(); + } + public void OnDestroy() { wrapping.Destroy(); } diff --git a/src/test/tests/src/Impl/framework/TestUpdatableManager.cs b/src/test/tests/src/Impl/framework/TestUpdatableManager.cs index fc47bf2..50406ef 100644 --- a/src/test/tests/src/Impl/framework/TestUpdatableManager.cs +++ b/src/test/tests/src/Impl/framework/TestUpdatableManager.cs @@ -12,6 +12,7 @@ public void step(int numUpdates) { foreach (TestableGameObject o in toAdd) { objects.Add(o); + o.Start(); } toAdd.Clear(); diff --git a/src/test/tests/src/Tests/TestUniject.cs b/src/test/tests/src/Tests/TestUniject.cs index 6b57d79..168f840 100644 --- a/src/test/tests/src/Tests/TestUniject.cs +++ b/src/test/tests/src/Tests/TestUniject.cs @@ -55,6 +55,23 @@ public HasInjectedPrefab(TestableGameObject parent, [Resource("mesh/sphere")] Te } } + public interface IStartUpdateCallback { + void OnConstructor(); + void OnStart(); + void OnUpdate(); + } + + [GameObjectBoundary] + public class HasStartUpdateCallback : TestableComponent { + public IStartUpdateCallback callback; + public HasStartUpdateCallback(TestableGameObject obj, IStartUpdateCallback callback) : base(obj) { + this.callback = callback; + this.callback.OnConstructor(); + } + public override void Start() { callback.OnStart(); } + public override void Update() { callback.OnUpdate(); } + } + /// /// Tests the testable component has its Update method called. /// @@ -67,6 +84,32 @@ public void TestTestableComponentIsUpdated() { Assert.AreEqual(1, component.updateCount); } + /// + /// Tests that the testable component has its constructor called + /// first, its Start method second, and its Update method last. + /// + [Test] + public void TestTestableComponentStartFiresBeforeUpdate() + { + Mock mockCallback = new Mock(); + mockCallback.Setup(c => c.OnConstructor()).Callback(() => { + mockCallback.Verify(c => c.OnStart(), Times.Never()); + mockCallback.Verify(c => c.OnUpdate(), Times.Never()); + }); + mockCallback.Setup(c => c.OnStart()).Callback(() => { + mockCallback.Verify(c => c.OnConstructor(), Times.Once()); + mockCallback.Verify(c => c.OnUpdate(), Times.Never()); + }); + mockCallback.Setup(c => c.OnUpdate()).Callback(() => { + mockCallback.Verify(c => c.OnConstructor(), Times.Once()); + mockCallback.Verify(c => c.OnStart(), Times.Once()); + }); + + kernel.Bind().ToMethod(context => mockCallback.Object); + HasStartUpdateCallback component = kernel.Get(); + step(); + } + [Test] public void TestDestroyedObjectsNotUpdated() { MockComponent component = kernel.Get();