using System; using System.Collections; using System.Collections.Generic; using System.Linq; using NUnit.Framework; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.XR.OpenXR; using UnityEngine.XR.OpenXR.Features.Interactions; using UnityEngine.XR.OpenXR.Tests; using Assert = UnityEngine.Assertions.Assert; namespace UnityEditor.XR.OpenXR.Tests { internal class OpenXRRuntimeSelectorTests : OpenXRInputTestsBase { [Test] public void NoAvailableRuntimesTest() { List detectorList = OpenXRRuntimeSelector.GenerateRuntimeDetectorList(); Assert.IsTrue(detectorList.Count > 0); Assert.IsTrue(detectorList[0] is OpenXRRuntimeSelector.SystemDefault, "First choice should always be SystemDefault"); Assert.IsTrue(detectorList[detectorList.Count - 1] is OpenXRRuntimeSelector.OtherRuntime, "Last choice should always be Other"); } [Test] public void BuiltInRuntimesAsAvailableRuntimesTest() { // Simulate what happens if the AvailableRuntimes registry key is empty. // WindowsMR, SteamVR, and Oculus should all be added to the list. Dictionary runtimePathToValue = new Dictionary(); List detectorList = OpenXRRuntimeSelector.GenerateRuntimeDetectorList(runtimePathToValue); Assert.IsTrue(detectorList.Count > 0); Assert.IsTrue(detectorList[0] is OpenXRRuntimeSelector.SystemDefault); Assert.IsTrue(detectorList[detectorList.Count - 1] is OpenXRRuntimeSelector.OtherRuntime); bool foundWindowsMRDetector = false; bool foundSteamVRDetector = false; bool foundOculusDetector = false; foreach (var detector in detectorList) { foundWindowsMRDetector |= detector is OpenXRRuntimeSelector.WindowsMRDetector; foundSteamVRDetector |= detector is OpenXRRuntimeSelector.SteamVRDetector; foundOculusDetector |= detector is OpenXRRuntimeSelector.OculusDetector; } Assert.IsTrue(foundWindowsMRDetector); Assert.IsTrue(foundSteamVRDetector); Assert.IsTrue(foundOculusDetector); } [Test] public void DiscoveredAvailableRuntimesTest() { OpenXRRuntimeSelector.WindowsMRDetector windowsMRDetector = new OpenXRRuntimeSelector.WindowsMRDetector(); OpenXRRuntimeSelector.SteamVRDetector steamVRDetector = new OpenXRRuntimeSelector.SteamVRDetector(); OpenXRRuntimeSelector.OculusDetector oculusDetector = new OpenXRRuntimeSelector.OculusDetector(); string enabledRuntime = "enabledRuntime"; string disabledRuntime = "disabledRuntime"; Dictionary runtimePathToValue = new Dictionary() { { windowsMRDetector.jsonPath, 0}, { steamVRDetector.jsonPath, 1}, { enabledRuntime, 0 }, { disabledRuntime, 1 } }; List detectorList = OpenXRRuntimeSelector.GenerateRuntimeDetectorList(runtimePathToValue); Assert.IsTrue(detectorList.Count > 0); Assert.IsTrue(detectorList[0] is OpenXRRuntimeSelector.SystemDefault); Assert.IsTrue(detectorList[detectorList.Count - 1] is OpenXRRuntimeSelector.OtherRuntime); HashSet detectedJsons = new HashSet(); foreach (var detector in detectorList) { detectedJsons.Add(detector.jsonPath); } Assert.IsTrue(detectedJsons.Contains(windowsMRDetector.jsonPath)); Assert.IsFalse(detectedJsons.Contains(steamVRDetector.jsonPath)); Assert.IsTrue(detectedJsons.Contains(oculusDetector.jsonPath)); Assert.IsTrue(detectedJsons.Contains(enabledRuntime)); Assert.IsFalse(detectedJsons.Contains(disabledRuntime)); } [Test] public void TestSelectOtherRuntime() { // Get the OtherRuntime choice (verify that it's the last detector) var runtimeDetector = OpenXRRuntimeSelector.RuntimeDetectors[OpenXRRuntimeSelector.RuntimeDetectors.Count - 1]; OpenXRRuntimeSelector.OtherRuntime otherRuntime = runtimeDetector as OpenXRRuntimeSelector.OtherRuntime; Assert.IsTrue(otherRuntime != null); // Save data that this test will modify to restore state after the test finishes. string previousOtherJsonPath = otherRuntime.jsonPath; string previousActiveRuntime = Environment.GetEnvironmentVariable(OpenXRRuntimeSelector.RuntimeDetector.k_RuntimeEnvKey); string previousSelectedRuntime = Environment.GetEnvironmentVariable(OpenXRRuntimeSelector.k_SelectedRuntimeEnvKey); try { // Set the other runtime value and set this as the selected runtime. string jsonPath = "testJsonPath"; otherRuntime.SetOtherRuntimeJsonPath(jsonPath); OpenXRRuntimeSelector.SetSelectedRuntime(jsonPath); // Exit Edit Mode. Active runtime and Selected runtime should have the json path. OpenXRRuntimeSelector.ActivateOrDeactivateRuntime(PlayModeStateChange.ExitingEditMode); string activeRuntime = Environment.GetEnvironmentVariable(OpenXRRuntimeSelector.RuntimeDetector.k_RuntimeEnvKey); string selectedRuntime = Environment.GetEnvironmentVariable(OpenXRRuntimeSelector.k_SelectedRuntimeEnvKey); Assert.AreEqual(activeRuntime, jsonPath); Assert.AreEqual(selectedRuntime, jsonPath); // Simulate a refresh of the runtime detectors when entering play mode. // The OtherRuntime should still have the jsonPath from before. OpenXRRuntimeSelector.RefreshRuntimeDetectorList(); runtimeDetector = OpenXRRuntimeSelector.RuntimeDetectors[OpenXRRuntimeSelector.RuntimeDetectors.Count - 1]; otherRuntime = runtimeDetector as OpenXRRuntimeSelector.OtherRuntime; Assert.AreEqual(otherRuntime.jsonPath, jsonPath); // Enter Edit Mode. Active runtime should be cleared, selected runtime should still have the json path. OpenXRRuntimeSelector.ActivateOrDeactivateRuntime(PlayModeStateChange.EnteredEditMode); activeRuntime = Environment.GetEnvironmentVariable(OpenXRRuntimeSelector.RuntimeDetector.k_RuntimeEnvKey); selectedRuntime = Environment.GetEnvironmentVariable(OpenXRRuntimeSelector.k_SelectedRuntimeEnvKey); Assert.AreNotEqual(activeRuntime, jsonPath); Assert.AreEqual(selectedRuntime, jsonPath); // Refresh again. OtherRuntime and selected runtime should still have the json path. OpenXRRuntimeSelector.RefreshRuntimeDetectorList(); runtimeDetector = OpenXRRuntimeSelector.RuntimeDetectors[OpenXRRuntimeSelector.RuntimeDetectors.Count - 1]; otherRuntime = runtimeDetector as OpenXRRuntimeSelector.OtherRuntime; Assert.AreEqual(otherRuntime.jsonPath, jsonPath); } finally { otherRuntime.SetOtherRuntimeJsonPath(previousOtherJsonPath); Environment.SetEnvironmentVariable(OpenXRRuntimeSelector.RuntimeDetector.k_RuntimeEnvKey, previousActiveRuntime); Environment.SetEnvironmentVariable(OpenXRRuntimeSelector.k_SelectedRuntimeEnvKey, previousSelectedRuntime); } } } }