public void SetUp()
 {
     containingObject    = new GameObject();
     container           = new RuleContainer();
     subject             = containingObject.AddComponent <ActiveInHierarchyRule>();
     container.Interface = subject;
 }
        public IEnumerator OnlActiveTargetsFollowSourceNoOffsets()
        {
            UnityEventListenerMock preprocessedMock = new UnityEventListenerMock();
            UnityEventListenerMock processedMock    = new UnityEventListenerMock();

            subject.Preprocessed.AddListener(preprocessedMock.Listen);
            subject.Processed.AddListener(processedMock.Listen);

            GameObject source = new GameObject("playAreaAlias");

            GameObject target1 = new GameObject("SDK1PlayArea");
            GameObject target2 = new GameObject("SDK2PlayArea");
            GameObject target3 = new GameObject("SDK3PlayArea");

            subject.Sources = containingObject.AddComponent <GameObjectObservableList>();
            subject.Targets = containingObject.AddComponent <GameObjectObservableList>();
            yield return(null);

            source.transform.position = Vector3.one;

            target1.transform.position = Vector3.one * 2f;
            target2.transform.position = Vector3.one * 3f;
            target3.transform.position = Vector3.one * 4f;

            subject.Sources.Add(source);
            subject.Targets.Add(target1);
            subject.Targets.Add(target2);
            subject.Targets.Add(target3);

            subject.gameObject.AddComponent <RuleStub>();
            ActiveInHierarchyRule activeInHierarchyRule = subject.gameObject.AddComponent <ActiveInHierarchyRule>();

            subject.TargetValidity = new RuleContainer
            {
                Interface = activeInHierarchyRule
            };

            target1.SetActive(false);
            target2.SetActive(true);
            target3.SetActive(true);

            FollowModifierMock followModifierMock = containingObject.AddComponent <FollowModifierMock>();

            subject.FollowModifier = followModifierMock;

            subject.Process();

            Assert.IsTrue(preprocessedMock.Received);
            Assert.IsTrue(processedMock.Received);
            Assert.AreNotEqual(source.transform.position, target1.transform.position);
            Assert.AreEqual(source.transform.position, target2.transform.position);
            Assert.AreEqual(source.transform.position, target3.transform.position);

            Object.DestroyImmediate(source);
            Object.DestroyImmediate(target1);
            Object.DestroyImmediate(target2);
            Object.DestroyImmediate(target3);
        }
        public void TargetFollowsFirstActiveSourceNoOffsets()
        {
            /// The first active SDK HMD moves and the target HMD alias follows

            UnityEventListenerMock preprocessedMock = new UnityEventListenerMock();
            UnityEventListenerMock processedMock    = new UnityEventListenerMock();

            subject.Preprocessed.AddListener(preprocessedMock.Listen);
            subject.Processed.AddListener(processedMock.Listen);

            GameObject source1 = new GameObject("SDK1HMD");
            GameObject source2 = new GameObject("SDK2HMD");
            GameObject source3 = new GameObject("SDK3HMD");
            GameObject target  = new GameObject("HMDAlias");

            source1.transform.position = Vector3.one;
            source2.transform.position = Vector3.one * 2f;
            source3.transform.position = Vector3.one * 3f;

            target.transform.position = Vector3.zero;

            subject.AddSource(source1);
            subject.AddSource(source2);
            subject.AddSource(source3);
            subject.AddTarget(target);

            subject.ceaseAfterFirstSourceProcessed = true;
            subject.gameObject.AddComponent <RuleStub>();
            ActiveInHierarchyRule activeInHierarchyRule = subject.gameObject.AddComponent <ActiveInHierarchyRule>();

            subject.sourceValidity = new RuleContainer
            {
                Interface = activeInHierarchyRule
            };

            source1.SetActive(false);
            source2.SetActive(true);
            source3.SetActive(true);

            FollowModifierMock followModifierMock = containingObject.AddComponent <FollowModifierMock>();

            subject.followModifier = followModifierMock;

            subject.Process();

            Assert.IsTrue(preprocessedMock.Received);
            Assert.IsTrue(processedMock.Received);

            Assert.AreNotEqual(source1.transform.position, target.transform.position);
            Assert.AreEqual(source2.transform.position, target.transform.position);
            Assert.AreNotEqual(source3.transform.position, target.transform.position);

            Object.DestroyImmediate(source1);
            Object.DestroyImmediate(source2);
            Object.DestroyImmediate(source3);
            Object.DestroyImmediate(target);
        }
        public void ProcessFirstActiveSourceAgainstValidTargetThenCease()
        {
            GameObject source1 = new GameObject("source1");
            GameObject source2 = new GameObject("source2");
            GameObject source3 = new GameObject("source3");
            GameObject target1 = new GameObject("target1");
            GameObject target2 = new GameObject("target2");
            GameObject target3 = new GameObject("target3");

            subject.ceaseAfterFirstSourceProcessed = true;

            subject.gameObject.AddComponent <RuleStub>();
            ActiveInHierarchyRule activeInHierarchyRule = subject.gameObject.AddComponent <ActiveInHierarchyRule>();

            subject.sourceValidity = new RuleContainer
            {
                Interface = activeInHierarchyRule
            };
            subject.targetValidity = new RuleContainer
            {
                Interface = activeInHierarchyRule
            };

            subject.AddSource(source1);
            subject.AddSource(source2);
            subject.AddSource(source3);
            subject.AddTarget(target1);
            subject.AddTarget(target2);
            subject.AddTarget(target3);

            Assert.AreEqual("source1", source1.name);
            Assert.AreEqual("source2", source2.name);
            Assert.AreEqual("source3", source3.name);
            Assert.AreEqual("target1", target1.name);
            Assert.AreEqual("target2", target2.name);
            Assert.AreEqual("target3", target3.name);

            source1.SetActive(false);
            source2.SetActive(true);
            source3.SetActive(true);

            target1.SetActive(false);
            target2.SetActive(true);
            target3.SetActive(true);

            subject.Process();

            Assert.AreEqual("source1", source1.name);
            Assert.AreEqual("source2", source2.name);
            Assert.AreEqual("source3", source3.name);
            Assert.AreEqual("target1", target1.name);
            Assert.AreEqual("source2", target2.name);
            Assert.AreEqual("source2", target3.name);

            source1.SetActive(false);
            source2.SetActive(false);
            source3.SetActive(true);

            target1.SetActive(false);
            target2.SetActive(true);
            target3.SetActive(false);

            subject.Process();

            Assert.AreEqual("source1", source1.name);
            Assert.AreEqual("source2", source2.name);
            Assert.AreEqual("source3", source3.name);
            Assert.AreEqual("target1", target1.name);
            Assert.AreEqual("source3", target2.name);
            Assert.AreEqual("source2", target3.name);

            source1.SetActive(true);
            source2.SetActive(true);
            source3.SetActive(true);

            target1.SetActive(true);
            target2.SetActive(true);
            target3.SetActive(true);

            subject.Process();

            Assert.AreEqual("source1", source1.name);
            Assert.AreEqual("source2", source2.name);
            Assert.AreEqual("source3", source3.name);
            Assert.AreEqual("source1", target1.name);
            Assert.AreEqual("source1", target2.name);
            Assert.AreEqual("source1", target3.name);

            Object.DestroyImmediate(source1);
            Object.DestroyImmediate(source2);
            Object.DestroyImmediate(source3);
            Object.DestroyImmediate(target1);
            Object.DestroyImmediate(target2);
            Object.DestroyImmediate(target3);
        }
        public IEnumerator ProcessFirstActiveSourceAgainstValidTargetThenCease()
        {
            GameObject source1 = new GameObject("source1");
            GameObject source2 = new GameObject("source2");
            GameObject source3 = new GameObject("source3");
            GameObject target1 = new GameObject("target1");
            GameObject target2 = new GameObject("target2");
            GameObject target3 = new GameObject("target3");

            subject.Sources = containingObject.AddComponent <GameObjectObservableList>();
            subject.Targets = containingObject.AddComponent <GameObjectObservableList>();
            yield return(null);

            subject.CeaseAfterFirstSourceProcessed = true;

            subject.gameObject.AddComponent <RuleStub>();
            ActiveInHierarchyRule activeInHierarchyRule = subject.gameObject.AddComponent <ActiveInHierarchyRule>();

            subject.SourceValidity = new RuleContainer
            {
                Interface = activeInHierarchyRule
            };
            subject.TargetValidity = new RuleContainer
            {
                Interface = activeInHierarchyRule
            };

            subject.Sources.Add(source1);
            subject.Sources.Add(source2);
            subject.Sources.Add(source3);
            subject.Targets.Add(target1);
            subject.Targets.Add(target2);
            subject.Targets.Add(target3);

            Assert.AreEqual("source1", source1.name);
            Assert.AreEqual("source2", source2.name);
            Assert.AreEqual("source3", source3.name);
            Assert.AreEqual("target1", target1.name);
            Assert.AreEqual("target2", target2.name);
            Assert.AreEqual("target3", target3.name);

            source1.SetActive(false);
            source2.SetActive(true);
            source3.SetActive(true);

            target1.SetActive(false);
            target2.SetActive(true);
            target3.SetActive(true);

            subject.Process();

            Assert.AreEqual("source1", source1.name);
            Assert.AreEqual("source2", source2.name);
            Assert.AreEqual("source3", source3.name);
            Assert.AreEqual("target1", target1.name);
            Assert.AreEqual("source2", target2.name);
            Assert.AreEqual("source2", target3.name);

            source1.SetActive(false);
            source2.SetActive(false);
            source3.SetActive(true);

            target1.SetActive(false);
            target2.SetActive(true);
            target3.SetActive(false);

            subject.Process();

            Assert.AreEqual("source1", source1.name);
            Assert.AreEqual("source2", source2.name);
            Assert.AreEqual("source3", source3.name);
            Assert.AreEqual("target1", target1.name);
            Assert.AreEqual("source3", target2.name);
            Assert.AreEqual("source2", target3.name);

            source1.SetActive(true);
            source2.SetActive(true);
            source3.SetActive(true);

            target1.SetActive(true);
            target2.SetActive(true);
            target3.SetActive(true);

            subject.Process();

            Assert.AreEqual("source1", source1.name);
            Assert.AreEqual("source2", source2.name);
            Assert.AreEqual("source3", source3.name);
            Assert.AreEqual("source1", target1.name);
            Assert.AreEqual("source1", target2.name);
            Assert.AreEqual("source1", target3.name);

            Object.DestroyImmediate(source1);
            Object.DestroyImmediate(source2);
            Object.DestroyImmediate(source3);
            Object.DestroyImmediate(target1);
            Object.DestroyImmediate(target2);
            Object.DestroyImmediate(target3);
        }
        public IEnumerator ProcessFirstActiveSourceAgainstTargetThenCease()
        {
            GameObject source1 = new GameObject("source1");
            GameObject source2 = new GameObject("source2");
            GameObject source3 = new GameObject("source3");
            GameObject target1 = new GameObject("target1");

            subject.Sources = containingObject.AddComponent <GameObjectObservableList>();
            subject.Targets = containingObject.AddComponent <GameObjectObservableList>();
            UnityEventListenerMock activeSourceChangedListenerMock = new UnityEventListenerMock();

            subject.ActiveSourceChanging.AddListener(activeSourceChangedListenerMock.Listen);
            yield return(null);

            subject.CeaseAfterFirstSourceProcessed = true;

            subject.gameObject.AddComponent <RuleStub>();
            ActiveInHierarchyRule activeInHierarchyRule = subject.gameObject.AddComponent <ActiveInHierarchyRule>();

            subject.SourceValidity = new RuleContainer
            {
                Interface = activeInHierarchyRule
            };

            subject.Sources.Add(source1);
            subject.Sources.Add(source2);
            subject.Sources.Add(source3);
            subject.Targets.Add(target1);

            Assert.AreEqual("source1", source1.name);
            Assert.AreEqual("source2", source2.name);
            Assert.AreEqual("source3", source3.name);
            Assert.AreEqual("target1", target1.name);

            source1.SetActive(false);
            source2.SetActive(true);
            source3.SetActive(true);

            Assert.IsNull(subject.ActiveSource);
            Assert.IsFalse(activeSourceChangedListenerMock.Received);
            subject.Process();
            Assert.IsTrue(activeSourceChangedListenerMock.Received);
            Assert.AreEqual("source2", subject.ActiveSource.name);

            Assert.AreEqual("source1", source1.name);
            Assert.AreEqual("source2", source2.name);
            Assert.AreEqual("source3", source3.name);
            Assert.AreEqual("source2", target1.name);

            source1.SetActive(false);
            source2.SetActive(false);
            source3.SetActive(true);

            activeSourceChangedListenerMock.Reset();
            subject.Process();
            Assert.IsTrue(activeSourceChangedListenerMock.Received);
            Assert.AreEqual("source3", subject.ActiveSource.name);

            Assert.AreEqual("source1", source1.name);
            Assert.AreEqual("source2", source2.name);
            Assert.AreEqual("source3", source3.name);
            Assert.AreEqual("source3", target1.name);

            source1.SetActive(true);
            source2.SetActive(true);
            source3.SetActive(true);

            activeSourceChangedListenerMock.Reset();
            subject.Process();
            Assert.IsTrue(activeSourceChangedListenerMock.Received);
            Assert.AreEqual("source1", subject.ActiveSource.name);

            Assert.AreEqual("source1", source1.name);
            Assert.AreEqual("source2", source2.name);
            Assert.AreEqual("source3", source3.name);
            Assert.AreEqual("source1", target1.name);

            activeSourceChangedListenerMock.Reset();
            subject.Process();
            Assert.IsFalse(activeSourceChangedListenerMock.Received);
            Assert.AreEqual("source1", subject.ActiveSource.name);

            Object.DestroyImmediate(source1);
            Object.DestroyImmediate(source2);
            Object.DestroyImmediate(source3);
            Object.DestroyImmediate(target1);
        }