public void Select()
        {
            SetUpElements();

            UnityEventListenerMock enterListenerMock  = new UnityEventListenerMock();
            UnityEventListenerMock exitListenerMock   = new UnityEventListenerMock();
            UnityEventListenerMock hoverListenerMock  = new UnityEventListenerMock();
            UnityEventListenerMock selectListenerMock = new UnityEventListenerMock();

            subject.Entered.AddListener(enterListenerMock.Listen);
            subject.Exited.AddListener(exitListenerMock.Listen);
            subject.Hovering.AddListener(hoverListenerMock.Listen);
            subject.Selected.AddListener(selectListenerMock.Listen);

            subject.ManualOnEnable();

            Assert.IsFalse(enterListenerMock.Received);
            Assert.IsFalse(exitListenerMock.Received);
            Assert.IsFalse(hoverListenerMock.Received);
            Assert.IsFalse(selectListenerMock.Received);

            subject.Activate();
            subject.Process();
            subject.Select();

            Assert.IsFalse(enterListenerMock.Received);
            Assert.IsFalse(exitListenerMock.Received);
            Assert.IsFalse(hoverListenerMock.Received);
            Assert.IsTrue(selectListenerMock.Received);
            Assert.IsNull(subject.HoverTarget);

            enterListenerMock.Reset();
            exitListenerMock.Reset();
            hoverListenerMock.Reset();
            selectListenerMock.Reset();

            //Now add a valid target that can be selected
            GameObject blocker = GameObject.CreatePrimitive(PrimitiveType.Cube);

            blocker.transform.position = Vector3.forward * 5f;

            List <Vector3> castPoints = new List <Vector3>
            {
                Vector3.zero,
                blocker.transform.position
            };

            PointsCast.EventData straightCast = CastPoints(castPoints, true, true, new Ray(Vector3.zero, Vector3.forward));

            subject.HandleData(straightCast);
            subject.Process();
            subject.Select();

            Assert.IsTrue(enterListenerMock.Received);
            Assert.IsFalse(exitListenerMock.Received);
            Assert.IsTrue(hoverListenerMock.Received);
            Assert.IsTrue(selectListenerMock.Received);
            Assert.AreEqual(blocker, subject.HoverTarget.CollisionData.transform.gameObject);
            Assert.AreEqual(blocker, subject.SelectedTarget.CollisionData.transform.gameObject);

            Object.DestroyImmediate(blocker);
        }
        public void Select()
        {
            SetUpElements();

            UnityEventListenerMock enterListenerMock  = new UnityEventListenerMock();
            UnityEventListenerMock exitListenerMock   = new UnityEventListenerMock();
            UnityEventListenerMock hoverListenerMock  = new UnityEventListenerMock();
            UnityEventListenerMock selectListenerMock = new UnityEventListenerMock();

            subject.Entered.AddListener(enterListenerMock.Listen);
            subject.Exited.AddListener(exitListenerMock.Listen);
            subject.Hovering.AddListener(hoverListenerMock.Listen);
            subject.Selected.AddListener(selectListenerMock.Listen);

            subject.ManualOnEnable();

            Assert.IsFalse(enterListenerMock.Received);
            Assert.IsFalse(exitListenerMock.Received);
            Assert.IsFalse(hoverListenerMock.Received);
            Assert.IsFalse(selectListenerMock.Received);

            subject.Activate();
            subject.Process();
            subject.Select();

            Assert.IsFalse(enterListenerMock.Received);
            Assert.IsFalse(exitListenerMock.Received);
            Assert.IsFalse(hoverListenerMock.Received);
            Assert.IsTrue(selectListenerMock.Received);
            Assert.IsNull(subject.HoverTarget);

            enterListenerMock.Reset();
            exitListenerMock.Reset();
            hoverListenerMock.Reset();
            selectListenerMock.Reset();

            //Now add a valid target that can be selected
            GameObject blocker = GameObject.CreatePrimitive(PrimitiveType.Cube);

            blocker.transform.position = Vector3.forward * 5f;

            List <Vector3> castPoints = new List <Vector3>
            {
                Vector3.zero,
                blocker.transform.position
            };

            PointsCast.EventData straightCast = CastPoints(castPoints, true, true, new Ray(Vector3.zero, Vector3.forward));

            subject.HandleData(straightCast);
            subject.Process();
            subject.Select();

            Assert.IsTrue(enterListenerMock.Received);
            Assert.IsFalse(exitListenerMock.Received);
            Assert.IsTrue(hoverListenerMock.Received);
            Assert.IsTrue(selectListenerMock.Received);
            Assert.AreEqual(subject.transform, subject.HoverTarget.Transform);
            Assert.AreEqual(blocker, subject.HoverTarget.CollisionData.transform.gameObject);
            Assert.AreEqual(blocker, subject.SelectedTarget.CollisionData.transform.gameObject);
            Assert.AreEqual("{ Transform = containingObject (UnityEngine.Transform) | UseLocalValues = False | PositionOverride = (0.0, 0.0, 0.0) | RotationOverride = (0.0, 0.0, 0.0, 1.0) | ScaleOverride = (1.0, 1.0, 1.0) | Origin = (0.0, 0.0, 0.0) | Direction = (0.0, 0.0, 1.0) | CollisionData = { barycentricCoordinate = (1.0, 0.0, 0.0) | Collider = Cube (UnityEngine.BoxCollider) | Distance = 4.5 | Lightmap Coord = (0.0, 0.0) | Normal = (0.0, 0.0, -1.0) | Point = (0.0, 0.0, 4.5) | Rigidbody = [null] | Texture Coord = (0.0, 0.0) | Texture Coord2 = (0.0, 0.0) | Transform = Cube (UnityEngine.Transform) | Triangle Index = -1 } | IsCurrentlyActive = True | IsCurrentlyHovering = True | CurrentHoverDuration = " + subject.SelectedTarget.CurrentHoverDuration + " | CurrentPointsCastData = { HitData = { barycentricCoordinate = (1.0, 0.0, 0.0) | Collider = Cube (UnityEngine.BoxCollider) | Distance = 4.5 | Lightmap Coord = (0.0, 0.0) | Normal = (0.0, 0.0, -1.0) | Point = (0.0, 0.0, 4.5) | Rigidbody = [null] | Texture Coord = (0.0, 0.0) | Texture Coord2 = (0.0, 0.0) | Transform = Cube (UnityEngine.Transform) | Triangle Index = -1 } | IsValid = True } }", subject.SelectedTarget.ToString());

            Object.DestroyImmediate(blocker);
        }