using System.Collections; using System.Collections.Generic; using ModestTree; using UnityEngine; using UnityEngine.TestTools; using Zenject.Tests.Bindings.DiContainerMethods; namespace Zenject.Tests.Bindings { public class TestDiContainerMethods : ZenjectIntegrationTestFixture { const string ResourcePrefix = "TestDiContainerMethods/"; GameObject FooPrefab { get { return GetPrefab("Foo"); } } GameObject GorpPrefab { get { return GetPrefab("Gorp"); } } GameObject CameraPrefab { get { return GetPrefab("Camera"); } } [UnityTest] public IEnumerator TestInstantiateComponent() { SkipInstall(); var gameObject = new GameObject(); var foo = Container.InstantiateComponent(gameObject); Assert.That(foo.WasInjected); yield break; } [UnityTest] public IEnumerator TestInstantiateComponentArgs() { SkipInstall(); var gameObject = new GameObject(); Assert.Throws(() => Container.InstantiateComponent(gameObject)); var gorp = Container.InstantiateComponent(gameObject, new object[] { "zxcv" }); Assert.IsEqual(gorp.Arg, "zxcv"); yield break; } [UnityTest] public IEnumerator TestInstantiateComponentOnNewGameObject() { SkipInstall(); var foo = Container.InstantiateComponentOnNewGameObject(); Assert.That(foo.WasInjected); yield break; } [UnityTest] public IEnumerator TestInstantiateComponentOnNewGameObjectArgs() { SkipInstall(); Assert.Throws(() => Container.InstantiateComponentOnNewGameObject()); var gorp = Container.InstantiateComponentOnNewGameObject("sdf", new object[] { "zxcv" }); Assert.IsEqual(gorp.Arg, "zxcv"); yield break; } [UnityTest] public IEnumerator TestInstantiatePrefab() { SkipInstall(); var go = Container.InstantiatePrefab(FooPrefab); var foo = go.GetComponentInChildren(); Assert.That(foo.WasInjected); yield break; } [UnityTest] public IEnumerator TestInstantiatePrefabForMonoBehaviour() { SkipInstall(); Assert.Throws(() => Container.InstantiatePrefab(GorpPrefab)); var gorp = Container.InstantiatePrefabForComponent(GorpPrefab, new object[] { "asdf" }); Assert.IsEqual(gorp.Arg, "asdf"); yield break; } [UnityTest] public IEnumerator TestInstantiatePrefabResource() { SkipInstall(); Assert.Throws(() => Container.InstantiatePrefabResource(ResourcePrefix + "Gorp")); var gorp = Container.InstantiatePrefabResourceForComponent(ResourcePrefix + "Gorp", new object[] { "asdf" }); Assert.IsEqual(gorp.Arg, "asdf"); yield break; } [UnityTest] public IEnumerator TestInstantiatePrefabForComponent() { SkipInstall(); var camera = Container.InstantiatePrefabForComponent(CameraPrefab, new object[0]); Assert.IsNotNull(camera); yield break; } [UnityTest] public IEnumerator TestInstantiatePrefabForComponentMistake() { SkipInstall(); Assert.Throws(() => Container.InstantiatePrefabForComponent(CameraPrefab, new object[] { "sdf" })); yield break; } [UnityTest] public IEnumerator TestInstantiateScriptableObjectResource() { SkipInstall(); var foo = Container.InstantiateScriptableObjectResource(ResourcePrefix + "Foo2"); Assert.That(foo.WasInjected); yield break; } [UnityTest] public IEnumerator TestInstantiateScriptableObjectResourceArgs() { SkipInstall(); Assert.Throws(() => Container.InstantiateScriptableObjectResource(ResourcePrefix + "Gorp2")); var gorp = Container.InstantiateScriptableObjectResource(ResourcePrefix + "Gorp2", new object[] { "asdf" }); Assert.IsEqual(gorp.Arg, "asdf"); yield break; } [UnityTest] public IEnumerator TestInjectGameObject() { SkipInstall(); var go = GameObject.Instantiate(FooPrefab); var foo = go.GetComponentInChildren(); Assert.That(!foo.WasInjected); Container.InjectGameObject(go); Assert.That(foo.WasInjected); yield break; } [UnityTest] public IEnumerator TestInjectGameObjectForMonoBehaviour() { SkipInstall(); var go = GameObject.Instantiate(GorpPrefab); Assert.Throws(() => Container.InjectGameObject(go)); var gorp = Container.InjectGameObjectForComponent(go, new object[] { "asdf" }); Assert.IsEqual(gorp.Arg, "asdf"); yield break; } [UnityTest] public IEnumerator TestInjectGameObjectForComponent() { SkipInstall(); var go = GameObject.Instantiate(CameraPrefab); Container.InjectGameObjectForComponent(go, new object[0]); yield break; } [UnityTest] public IEnumerator TestInjectGameObjectForComponentMistake() { SkipInstall(); var go = GameObject.Instantiate(CameraPrefab); Assert.Throws(() => Container.InjectGameObjectForComponent(go, new object[] { "sdf" })); yield break; } [UnityTest] public IEnumerator TestLazyInstanceInjectorFail() { PreInstall(); Qux.WasInjected = false; var qux = new Qux(); Container.BindInstance(qux); Assert.That(!Qux.WasInjected); PostInstall(); Assert.That(!Qux.WasInjected); yield break; } [UnityTest] public IEnumerator TestLazyInstanceInjectorSuccess() { PreInstall(); Qux.WasInjected = false; var qux = new Qux(); Container.BindInstance(qux); Container.QueueForInject(qux); Assert.That(!Qux.WasInjected); PostInstall(); Assert.That(Qux.WasInjected); yield break; } [UnityTest] public IEnumerator TestInstantiatePrefabForComponentExplicit() { SkipInstall(); var parentGameObject = new GameObject(); parentGameObject.transform.position = new Vector3(100, 100, 100); var parentTransform = parentGameObject.transform; var go = (Foo)Container.InstantiatePrefabForComponentExplicit(typeof(Foo), FooPrefab, new List(), new GameObjectCreationParameters { ParentTransform = parentTransform }); var foo = go.GetComponentInChildren(); Assert.IsEqual(foo.transform.position, new Vector3(100, 100, 100)); yield break; } [UnityTest] public IEnumerator TestInstantiatePrefabForComponentWithPositionExplicit() { SkipInstall(); var parentGameObject = new GameObject(); parentGameObject.transform.position = new Vector3(100, 100, 100); parentGameObject.transform.rotation = Quaternion.Euler(10, 10, 10); var parentTransform = parentGameObject.transform; var go = (Foo)Container.InstantiatePrefabForComponentExplicit(typeof(Foo), FooPrefab, new List(), new GameObjectCreationParameters { ParentTransform = parentTransform, Position = new Vector3(50, 50, 50), Rotation = Quaternion.Euler(20, 20, 20) }); var foo = go.GetComponentInChildren(); Assert.That(Approximately(foo.transform.position, new Vector3(50, 50, 50))); Assert.That(Approximately(foo.transform.rotation.eulerAngles, new Vector3(20, 20, 20))); yield break; } static bool Approximately(Vector3 left, Vector3 right) { return Mathf.Approximately(left.x, right.x) && Mathf.Approximately(left.y, right.y) && Mathf.Approximately(left.z, right.z); } public class Qux { public static bool WasInjected { get; set; } [Inject] public void Construct() { WasInjected = true; } } GameObject GetPrefab(string name) { return FixtureUtil.GetPrefab(ResourcePrefix + name); } } }