diff --git a/Tests/HPUIGestureLogicTest.cs b/Tests/HPUIGestureLogicTest.cs index 70f60a1..2c72f89 100644 --- a/Tests/HPUIGestureLogicTest.cs +++ b/Tests/HPUIGestureLogicTest.cs @@ -15,18 +15,19 @@ public class HPUIGestureLogicTest const float SelectionRadius = 0.01f; const float OutsideSelectionRadius = 0.02f; const float InsideSelectionRadius = 0.005f; + const float dummyHeuristicValue = 0.01f; const float OutsideTapTime = 0.6f; const float InsideTapTime = 0.2f; const float OutsideDebounceWindow = 0.11f; const float InsideDebounceWindow = 0.05f; - private IHPUIInteractable lastTapInteractable, lastGestureInteractable; + private IHPUIInteractable winningTapInteractable, lastGestureInteractable; private int tapsCount = 0; private int gesturesCount = 0; void OnTapCallback(HPUITapEventArgs args) { tapsCount += 1; - lastTapInteractable = args.interactableObject; + winningTapInteractable = args.interactableObject; } void OnGestureCallback(HPUIGestureEventArgs args) @@ -39,7 +40,7 @@ private void Reset() { tapsCount = 0; gesturesCount = 0; - lastTapInteractable = null; + winningTapInteractable = null; lastGestureInteractable = null; } @@ -55,28 +56,28 @@ public IEnumerator HPUIGestureLogicTest_SimpleTap() Dictionary updates = new Dictionary(); // First tap - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out HPUIGesture gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); yield return new WaitForSeconds(InsideTapTime); - updates[i1] = new HPUIInteractionInfo(OutsideSelectionRadius, OutsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, false, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); - Assert.AreEqual(tapsCount, 1); - Assert.AreEqual(gesturesCount, 0); + Assert.AreEqual(HPUIGesture.Tap, gesture); // Second tap - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); yield return new WaitForSeconds(InsideTapTime); updates.Remove(i1); - logic.Update(interactor, updates); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); - Assert.AreEqual(tapsCount, 2); - Assert.AreEqual(gesturesCount, 0); + Assert.AreEqual(HPUIGesture.Tap, gesture); } [UnityTest] @@ -89,40 +90,39 @@ public IEnumerator HPUIGestureLogicTest_SimpleTap_DebounceIgnore() Dictionary updates = new Dictionary(); // First tap - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out HPUIGesture gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); yield return new WaitForSeconds(InsideTapTime); - updates[i1] = new HPUIInteractionInfo(OutsideSelectionRadius, OutsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, false, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); - Assert.AreEqual(tapsCount, 1); - Assert.AreEqual(gesturesCount, 0); + Assert.AreEqual(HPUIGesture.Tap, gesture); // Second tap inside debounce time window - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); yield return new WaitForSeconds(InsideDebounceWindow); updates.Remove(i1); - logic.Update(interactor, updates); - - Assert.AreEqual(tapsCount, 1); - Assert.AreEqual(gesturesCount, 0); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); // thrid tap outside debounce time window, which is also inside tap time window - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); yield return new WaitForSeconds(OutsideDebounceWindow); updates.Remove(i1); - logic.Update(interactor, updates); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); - Assert.AreEqual(tapsCount, 2); - Assert.AreEqual(gesturesCount, 0); + Assert.AreEqual(HPUIGesture.Tap, gesture); } [UnityTest] @@ -135,35 +135,44 @@ public IEnumerator HPUIGestureLogicTest_SimpleGesture() Dictionary updates = new Dictionary(); // Tap and hold - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out HPUIGesture gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); yield return new WaitForSeconds(OutsideTapTime); - logic.Update(interactor, updates); + HPUIGestureEventArgs argsToUpdate = new HPUIGestureEventArgs(); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), argsToUpdate); + Assert.AreEqual(HPUIGesture.Gesture, gesture); + Assert.AreEqual(HPUIGestureState.Started, argsToUpdate.State); updates.Remove(i1); - logic.Update(interactor, updates); - - Assert.AreEqual(tapsCount, 0); - Assert.Greater(gesturesCount, 0); + argsToUpdate = new HPUIGestureEventArgs(); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), argsToUpdate); + Assert.AreEqual(HPUIGesture.Gesture, gesture); + Assert.AreEqual(HPUIGestureState.Stopped, argsToUpdate.State); // Move - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); - i1.interactorPosition = Vector2.one * 2; - logic.Update(interactor, updates); + yield return new WaitForSeconds(InsideTapTime); + i1.interactorPosition = Vector2.right * (TapDistanceThreshold * 1.01f); + argsToUpdate = new HPUIGestureEventArgs(); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), argsToUpdate); + Assert.AreEqual(HPUIGesture.Gesture, gesture); + Assert.AreEqual(HPUIGestureState.Started, argsToUpdate.State); updates.Remove(i1); - logic.Update(interactor, updates); - - Assert.AreEqual(tapsCount, 0); - Assert.Greater(gesturesCount, 0); + argsToUpdate = new HPUIGestureEventArgs(); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), argsToUpdate); + Assert.AreEqual(HPUIGesture.Gesture, gesture); + Assert.AreEqual(HPUIGestureState.Stopped, argsToUpdate.State); } // Testing the interaction radius - [Test] - public void HPUIGestureLogicTest_OneItem_InteractionRadius() + [UnityTest] + public IEnumerator HPUIGestureLogicTest_OneItem_InteractionRadius() { Reset(); TestHPUIInteractable i1 = new TestHPUIInteractable(0, true, false, OnTapCallback, OnGestureCallback); @@ -175,30 +184,32 @@ public void HPUIGestureLogicTest_OneItem_InteractionRadius() Reset(); i1.Reset(); - updates[i1] = new HPUIInteractionInfo(OutsideSelectionRadius, OutsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, false, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out HPUIGesture gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); - updates.Remove(i1); - logic.Update(interactor, updates); + yield return new WaitForSeconds(InsideTapTime); - Assert.AreEqual(tapsCount, 0); - Assert.AreEqual(gesturesCount, 0); + updates.Remove(i1); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); // The interaction crosses radius Reset(); i1.Reset(); - updates[i1] = new HPUIInteractionInfo(OutsideSelectionRadius, OutsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); - - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, false, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); + yield return new WaitForSeconds(InsideTapTime); - updates[i1] = new HPUIInteractionInfo(OutsideSelectionRadius, OutsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); - Assert.AreEqual(tapsCount, 1); - Assert.AreEqual(gesturesCount, 0); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, false, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.Tap, gesture); } [UnityTest] @@ -211,32 +222,36 @@ public IEnumerator HPUIGestureLogicTest_TapThenGesture() Dictionary updates = new Dictionary(); // First tap - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out HPUIGesture gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); yield return new WaitForSeconds(InsideTapTime); - logic.Update(interactor, updates); - - updates[i1] = new HPUIInteractionInfo(OutsideSelectionRadius, OutsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); - Assert.AreEqual(tapsCount, 1); - Assert.AreEqual(gesturesCount, 0); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, false, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.Tap, gesture); // Gesture Reset(); updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); yield return new WaitForSeconds(OutsideTapTime); - logic.Update(interactor, updates); + HPUIGestureEventArgs argsToUpdate = new HPUIGestureEventArgs(); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), argsToUpdate); + Assert.AreEqual(HPUIGesture.Gesture, gesture); + Assert.AreEqual(HPUIGestureState.Started, argsToUpdate.State); + argsToUpdate = new HPUIGestureEventArgs(); updates[i1] = new HPUIInteractionInfo(OutsideSelectionRadius, OutsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); - - Assert.AreEqual(tapsCount, 0); - Assert.Greater(gesturesCount, 0); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), argsToUpdate); + Assert.AreEqual(HPUIGesture.Gesture, gesture); + Assert.AreEqual(HPUIGestureState.Stopped, argsToUpdate.State); } [UnityTest] @@ -249,31 +264,35 @@ public IEnumerator HPUIGestureLogicTest_GestureThenTap() Dictionary updates = new Dictionary(); // Gesture - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out HPUIGesture gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); yield return new WaitForSeconds(OutsideTapTime); - logic.Update(interactor, updates); - - updates[i1] = new HPUIInteractionInfo(OutsideSelectionRadius, OutsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + HPUIGestureEventArgs argsToUpdate = new HPUIGestureEventArgs(); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), argsToUpdate); + Assert.AreEqual(HPUIGesture.Gesture, gesture); + Assert.AreEqual(HPUIGestureState.Started, argsToUpdate.State); - Assert.AreEqual(tapsCount, 0); - Assert.Greater(gesturesCount, 0); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, false, Vector3.zero, null, 0, null); + argsToUpdate = new HPUIGestureEventArgs(); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), argsToUpdate); + Assert.AreEqual(HPUIGesture.Gesture, gesture); + Assert.AreEqual(HPUIGestureState.Stopped, argsToUpdate.State); // tap Reset(); - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); yield return new WaitForSeconds(InsideTapTime); - logic.Update(interactor, updates); - - updates[i1] = new HPUIInteractionInfo(OutsideSelectionRadius, OutsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); - Assert.AreEqual(tapsCount, 1); - Assert.AreEqual(gesturesCount, 0); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, false, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.Tap, gesture); } [UnityTest] @@ -287,19 +306,18 @@ public IEnumerator HPUIGestureLogicTest_TwoItem_tap_time() Dictionary updates = new Dictionary(); // Tap 1-2---1-2 - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - updates[i2] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + updates[i2] = new HPUIInteractionInfo(dummyHeuristicValue - 0.001f, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out HPUIGesture gesture, out winningTapInteractable, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(winningTapInteractable, null); + Assert.AreEqual(HPUIGesture.None, gesture); - updates[i1] = new HPUIInteractionInfo(OutsideSelectionRadius, OutsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - updates[i2] = new HPUIInteractionInfo(OutsideSelectionRadius, OutsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, false, Vector3.zero, null, 0, null); + updates[i2] = new HPUIInteractionInfo(dummyHeuristicValue, false, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out gesture, out winningTapInteractable, new HPUITapEventArgs(), new HPUIGestureEventArgs()); - Assert.AreEqual(tapsCount, 1); - Assert.AreEqual(gesturesCount, 0); - Assert.AreEqual(lastTapInteractable, i1); - Assert.AreEqual(i1.tapCalled, 1); - Assert.AreEqual(i2.tapCalled, 0); + Assert.AreEqual(winningTapInteractable, i2); + Assert.AreEqual(HPUIGesture.Tap, gesture); yield return new WaitForSeconds(OutsideDebounceWindow); @@ -307,19 +325,17 @@ public IEnumerator HPUIGestureLogicTest_TwoItem_tap_time() i1.Reset(); i2.Reset(); // Tap 1-2---2-1 - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - updates[i2] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); - - updates[i2] = new HPUIInteractionInfo(OutsideSelectionRadius, OutsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - updates[i1] = new HPUIInteractionInfo(OutsideSelectionRadius, OutsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); - - Assert.AreEqual(tapsCount, 1); - Assert.AreEqual(gesturesCount, 0); - Assert.AreEqual(lastTapInteractable, i1); - Assert.AreEqual(i1.tapCalled, 1); - Assert.AreEqual(i2.tapCalled, 0); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + updates[i2] = new HPUIInteractionInfo(dummyHeuristicValue - 0.1f, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out gesture, out winningTapInteractable, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(winningTapInteractable, null); + Assert.AreEqual(HPUIGesture.None, gesture); + + updates[i2] = new HPUIInteractionInfo(dummyHeuristicValue, false, Vector3.zero, null, 0, null); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, false, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out gesture, out winningTapInteractable, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(winningTapInteractable, i2); + Assert.AreEqual(HPUIGesture.Tap, gesture); } [UnityTest] @@ -333,20 +349,18 @@ public IEnumerator HPUIGestureLogicTest_TwoItem_tap_zOrder() Dictionary updates = new Dictionary(); // Tap 1-2---1-2 - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - updates[i2] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + updates[i2] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out HPUIGesture gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); - updates[i1] = new HPUIInteractionInfo(OutsideSelectionRadius, OutsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - updates[i2] = new HPUIInteractionInfo(OutsideSelectionRadius, OutsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); yield return new WaitForSeconds(OutsideDebounceWindow); - logic.Update(interactor, updates); - Assert.AreEqual(tapsCount, 1); - Assert.AreEqual(gesturesCount, 0); - Assert.AreEqual(lastTapInteractable, i1); - Assert.AreEqual(i1.tapCalled, 1); - Assert.AreEqual(i2.tapCalled, 0); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, false, Vector3.zero, null, 0, null); + updates[i2] = new HPUIInteractionInfo(dummyHeuristicValue, false, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out gesture, out winningTapInteractable, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.Tap, gesture); + Assert.AreEqual(i1, winningTapInteractable); yield return new WaitForSeconds(OutsideDebounceWindow); @@ -355,19 +369,17 @@ public IEnumerator HPUIGestureLogicTest_TwoItem_tap_zOrder() i2.Reset(); // Tap 2-1---2-1 - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - updates[i2] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates.Clear(); + updates[i2] = new HPUIInteractionInfo(dummyHeuristicValue - 0.01f, true, Vector3.zero, null, 0, null); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); yield return new WaitForSeconds(OutsideDebounceWindow); updates.Clear(); - logic.Update(interactor, updates); - - Assert.AreEqual(tapsCount, 1); - Assert.AreEqual(gesturesCount, 0); - Assert.AreEqual(lastTapInteractable, i1); - Assert.AreEqual(i1.tapCalled, 1); - Assert.AreEqual(i2.tapCalled, 0); + logic.ComputeInteraction(interactor, updates, out gesture, out winningTapInteractable, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.Tap, gesture); + Assert.AreEqual(i1, winningTapInteractable); } [UnityTest] @@ -380,21 +392,34 @@ public IEnumerator HPUIGestureLogicTest_TwoItem_gesture() HPUIGestureLogic logic = new HPUIGestureLogic(TapTimeThreshold, TapDistanceThreshold, DebounceTimeWindow); Dictionary updates = new Dictionary(); - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - updates[i2] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i2] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue - 0.01f, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out HPUIGesture gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); yield return new WaitForSeconds(OutsideTapTime); - logic.Update(interactor, updates); + HPUIGestureEventArgs argsToUpdate = new HPUIGestureEventArgs(); + logic.ComputeInteraction(interactor, updates, out gesture, out winningTapInteractable, new HPUITapEventArgs(), argsToUpdate); + Assert.AreEqual(HPUIGesture.Gesture, gesture); + Assert.AreEqual(HPUIGestureState.Started, argsToUpdate.State); + Assert.AreEqual(i1, argsToUpdate.interactableObject); + Assert.AreEqual(i1, winningTapInteractable); - updates.Clear(); - logic.Update(interactor, updates); + yield return new WaitForSeconds(InsideDebounceWindow); + argsToUpdate = new HPUIGestureEventArgs(); + logic.ComputeInteraction(interactor, updates, out gesture, out winningTapInteractable, new HPUITapEventArgs(), argsToUpdate); + Assert.AreEqual(HPUIGesture.Gesture, gesture); + Assert.AreEqual(HPUIGestureState.Updated, argsToUpdate.State); + Assert.AreEqual(i1, argsToUpdate.interactableObject); + Assert.AreEqual(i1, winningTapInteractable); - Assert.AreEqual(tapsCount, 0); - Assert.Greater(gesturesCount, 0); - Assert.AreEqual(lastGestureInteractable, i1); - Assert.Greater(i1.gestureCalled, 0); - Assert.AreEqual(i2.gestureCalled, 0); + updates.Clear(); + argsToUpdate = new HPUIGestureEventArgs(); + logic.ComputeInteraction(interactor, updates, out gesture, out winningTapInteractable, new HPUITapEventArgs(), argsToUpdate); + Assert.AreEqual(HPUIGesture.Gesture, gesture); + Assert.AreEqual(HPUIGestureState.Stopped, argsToUpdate.State); + Assert.AreEqual(i1, argsToUpdate.interactableObject); + Assert.AreEqual(i1, winningTapInteractable); } // Anything outside the priority window should not get selected @@ -408,26 +433,37 @@ public IEnumerator HPUIGestureLogicTest_TwoItem_gesture_priority_window() HPUIGestureLogic logic = new HPUIGestureLogic(TapTimeThreshold, TapDistanceThreshold, DebounceTimeWindow); Dictionary updates = new Dictionary(); - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out HPUIGesture gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); + yield return new WaitForSeconds(OutsideTapTime); - logic.Update(interactor, updates); - // Even though this has lower zOrder, this should not get selected - updates[i2] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + HPUIGestureEventArgs argsToUpdate = new HPUIGestureEventArgs(); + logic.ComputeInteraction(interactor, updates, out gesture, out winningTapInteractable, new HPUITapEventArgs(), argsToUpdate); + Assert.AreEqual(HPUIGesture.Gesture, gesture); + Assert.AreEqual(HPUIGestureState.Started, argsToUpdate.State); + Assert.AreEqual(i1, winningTapInteractable); + + // Even though this has lower zOrder and lower heuristic, this should not get selected + updates[i2] = new HPUIInteractionInfo(dummyHeuristicValue - 0.01f, true, Vector3.zero, null, 0, null); + argsToUpdate = new HPUIGestureEventArgs(); + logic.ComputeInteraction(interactor, updates, out gesture, out winningTapInteractable, new HPUITapEventArgs(), argsToUpdate); + Assert.AreEqual(HPUIGesture.Gesture, gesture); + Assert.AreEqual(HPUIGestureState.Updated, argsToUpdate.State); + Assert.AreEqual(i1, argsToUpdate.interactableObject); + Assert.AreEqual(i1, winningTapInteractable); yield return new WaitForSeconds(1); - logic.Update(interactor, updates); + logic.ComputeInteraction(interactor, updates, out gesture, out winningTapInteractable, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.Gesture, gesture); + Assert.AreEqual(i1, winningTapInteractable); updates.Clear(); - logic.Update(interactor, updates); - - Assert.AreEqual(tapsCount, 0); - Assert.Greater(gesturesCount, 0); - Assert.AreEqual(lastGestureInteractable, i1); - Assert.Greater(i1.gestureCalled, 0); - Assert.AreEqual(i2.gestureCalled, 0); + argsToUpdate = new HPUIGestureEventArgs(); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), argsToUpdate); + Assert.AreEqual(HPUIGesture.Gesture, gesture); + Assert.AreEqual(HPUIGestureState.Stopped, argsToUpdate.State); } // When an event is not handled, hand over to next item in the priority list @@ -441,39 +477,42 @@ public IEnumerator HPUIGestureLogicTest_TwoItem_gesture_handle_events() HPUIGestureLogic logic = new HPUIGestureLogic(TapTimeThreshold, TapDistanceThreshold, DebounceTimeWindow); Dictionary updates = new Dictionary(); - updates[i2] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - // even though this is coming in second, this should get the tap - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i2] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + // even though this has a higher heuristic, this should get the tap + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue + 0.1f, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out HPUIGesture gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); yield return new WaitForSeconds(InsideTapTime); updates.Clear(); - logic.Update(interactor, updates); - - Assert.AreEqual(tapsCount, 1); - Assert.AreEqual(gesturesCount, 0); - Assert.AreEqual(lastTapInteractable, i1); + logic.ComputeInteraction(interactor, updates, out gesture, out winningTapInteractable, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.Tap, gesture); + Assert.AreEqual(i1, winningTapInteractable); Reset(); i1.Reset(); i2.Reset(); - updates[i2] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); + updates[i2] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); // even though this is coming in second, this should get the gesture - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); yield return new WaitForSeconds(OutsideTapTime); - logic.Update(interactor, updates); + HPUIGestureEventArgs argsToUpdate = new HPUIGestureEventArgs(); + logic.ComputeInteraction(interactor, updates, out gesture, out winningTapInteractable, new HPUITapEventArgs(), argsToUpdate); + Assert.AreEqual(HPUIGesture.Gesture, gesture); + Assert.AreEqual(HPUIGestureState.Started, argsToUpdate.State); + Assert.AreEqual(i1, argsToUpdate.interactableObject); + Assert.AreEqual(i1, winningTapInteractable); updates.Clear(); - logic.Update(interactor, updates); - - Assert.AreEqual(tapsCount, 0); - Assert.Greater(gesturesCount, 0); - Assert.AreEqual(lastGestureInteractable, i1); - Assert.AreEqual(i2.gestureCalled, 0); - Assert.Greater(i1.gestureCalled, 0); + argsToUpdate = new HPUIGestureEventArgs(); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), argsToUpdate); + Assert.AreEqual(HPUIGesture.Gesture, gesture); + Assert.AreEqual(HPUIGestureState.Stopped, argsToUpdate.State); + Assert.AreEqual(i1, argsToUpdate.interactableObject); + Assert.AreEqual(i1, winningTapInteractable); } //There can be instances where the event is not handled by any interactable @@ -492,32 +531,45 @@ public IEnumerator HPUIGestureLogicTest_TwoItem_gesture_no_handle_events() i1.Reset(); i2.Reset(); - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - updates[i2] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + updates[i2] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out HPUIGesture gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); updates.Clear(); - logic.Update(interactor, updates); - - Assert.AreEqual(tapsCount, 0); - Assert.AreEqual(gesturesCount, 0); + HPUITapEventArgs tapArgsToPopulate = new HPUITapEventArgs(); + logic.ComputeInteraction(interactor, updates, out gesture, out winningTapInteractable, tapArgsToPopulate, new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.Tap, gesture); + Assert.AreEqual(null, tapArgsToPopulate.interactableObject); + Assert.AreEqual(null, winningTapInteractable); + Assert.AreNotEqual(null, tapArgsToPopulate.interactorObject); // Gesture not handled by any interactable Reset(); i1.Reset(); i2.Reset(); - updates[i1] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - updates[i2] = new HPUIInteractionInfo(InsideSelectionRadius, InsideSelectionRadius < SelectionRadius, Vector3.zero, null, 0, null); - logic.Update(interactor, updates); + updates[i1] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + updates[i2] = new HPUIInteractionInfo(dummyHeuristicValue, true, Vector3.zero, null, 0, null); + logic.ComputeInteraction(interactor, updates, out gesture, out IHPUIInteractable _, new HPUITapEventArgs(), new HPUIGestureEventArgs()); + Assert.AreEqual(HPUIGesture.None, gesture); yield return new WaitForSeconds(OutsideTapTime); - logic.Update(interactor, updates); + HPUIGestureEventArgs argsToUpdate = new HPUIGestureEventArgs(); + logic.ComputeInteraction(interactor, updates, out gesture, out winningTapInteractable, new HPUITapEventArgs(), argsToUpdate); + Assert.AreEqual(HPUIGesture.Gesture, gesture); + Assert.AreEqual(HPUIGestureState.Started, argsToUpdate.State); + Assert.AreEqual(null, argsToUpdate.interactableObject); + Assert.AreEqual(null, winningTapInteractable); + Assert.AreNotEqual(null, tapArgsToPopulate.interactorObject); updates.Clear(); - logic.Update(interactor, updates); - - Assert.AreEqual(tapsCount, 0); - Assert.AreEqual(gesturesCount, 0); + argsToUpdate = new HPUIGestureEventArgs(); + logic.ComputeInteraction(interactor, updates, out gesture, out winningTapInteractable, new HPUITapEventArgs(), argsToUpdate); + Assert.AreEqual(HPUIGesture.Gesture, gesture); + Assert.AreEqual(HPUIGestureState.Stopped, argsToUpdate.State); + Assert.AreEqual(null, argsToUpdate.interactableObject); + Assert.AreEqual(null, winningTapInteractable); + Assert.AreNotEqual(null, tapArgsToPopulate.interactorObject); } } } diff --git a/Tests/TestHPUIInteractor.cs b/Tests/TestHPUIInteractor.cs index 2472cb3..b82783a 100644 --- a/Tests/TestHPUIInteractor.cs +++ b/Tests/TestHPUIInteractor.cs @@ -90,16 +90,6 @@ bool IHPUIInteractor.GetDistanceInfo(IHPUIInteractable interactable, out Distanc distanceInfo = new DistanceInfo(); return true; } - - void IHPUIInteractor.OnGesture(HPUIGestureEventArgs args) - { - - } - - void IHPUIInteractor.OnTap(HPUITapEventArgs args) - { - - } #endregion #region XRI methods