using NUnit.Framework; using UnityEngine.XR.ARSubsystems; using UnityEngine.XR.Management; namespace UnityEngine.XR.Simulation.Tests { [TestFixture] class SimulationSubsystemsTestFixture : SimulationTestSetup { [OneTimeSetUp] public void Setup() { SetupLoader(); } [OneTimeTearDown] public void TearDown() { TearDownLoader(); } void CheckSubsystemAvailable() where TXRSubsystem : class, ISubsystem, new() where TSubsystem : class, ISubsystem, new() { GetSimulationSubsystem(); } void CheckSubsystemFunctional() where TXRSubsystem : class, ISubsystem, new() where TSubsystem : class, ISubsystem, new() { var xrSubsystem = GetSimulationSubsystem(); // Initial state is not running Assert.IsFalse(xrSubsystem.running); // After start subsystem is running xrSubsystem.Start(); Assert.IsTrue(xrSubsystem.running); // After stop subsystem is not running xrSubsystem.Stop(); Assert.IsFalse(xrSubsystem.running); } static bool CheckARAvailabilitySync(TSubsystem subsystem) where TSubsystem : XRSessionSubsystem { var availabilityPromise = subsystem.GetAvailabilityAsync(); while (availabilityPromise.MoveNext()) { } var availability = availabilityPromise.result; return availability.IsSupported() && availability.IsInstalled(); } [Test] [Order(1)] public void LoaderAvailable() { // XRM is setup properly Assert.IsNotNull(m_XrGeneralSettings, $"No instance of {nameof(XRGeneralSettings)} is available."); Assert.IsNotNull(m_XrGeneralSettings.Manager, $"No instance of {nameof(XRManagerSettings)} is available."); // Simulation loader exist Assert.IsNotNull(m_Loader, $"No active {nameof(SimulationLoader)} is available."); } #region SimulationSubsystemsAvailable [Test] [Order(2)] [Category("SimulationSubsystemsAvailable")] public void SessionSubsystemAvailable() { CheckSubsystemAvailable(); } [Test] [Order(2)] [Category("SimulationSubsystemsAvailable")] public void CameraSubsystemAvailable() { CheckSubsystemAvailable(); } [Test] [Order(2)] [Category("SimulationSubsystemsAvailable")] public void InputSubsystemAvailable() { CheckSubsystemAvailable(); } [Test] [Order(2)] [Category("SimulationSubsystemsAvailable")] public void PointCloudSubsystemAvailable() { CheckSubsystemAvailable(); } [Test] [Order(2)] [Category("SimulationSubsystemsAvailable")] public void PlaneSubsystemAvailable() { CheckSubsystemAvailable(); } [Test] [Order(2)] [Category("SimulationSubsystemsAvailable")] public void ImageTrackingSubsystemAvailable() { CheckSubsystemAvailable(); } [Test] [Order(2)] [Category("SimulationSubsystemsAvailable")] public void MeshSubsystemAvailable() { CheckSubsystemAvailable(); } [Test] [Order(2)] [Category("SimulationSubsystemsAvailable")] public void RaycastSubsystemAvailable() { CheckSubsystemAvailable(); } [Test] [Order(2)] [Category("SimulationSubsystemsAvailable")] public void AnchorSubsystemAvailable() { CheckSubsystemAvailable(); } #endregion [Test] [Order(3)] public void ARSessionSupported() { // Simulation loader exist Assert.IsNotNull(m_Loader, $"No active {nameof(SimulationLoader)} is available."); var xrSubsystem = m_Loader.GetLoadedSubsystem(); // Subsystem exist Assert.IsInstanceOf(xrSubsystem, $"No active {nameof(SimulationSessionSubsystem)} is available."); var supported = CheckARAvailabilitySync(xrSubsystem); Assert.IsTrue(supported, "AR is not supported in Simulation."); } #region SimulationSubsystemsFunctional [Test] [Order(4)] [Category("SimulationSubsystemsFunctional")] public void SessionSubsystemFunctional() { AddXROrigin(); CheckSubsystemFunctional(); RemoveXROrigin(); } [Test] [Order(4)] [Category("SimulationSubsystemsFunctional")] public void CameraSubsystemFunctional() { AddXROrigin(); CheckSubsystemFunctional(); RemoveXROrigin(); } [Test] [Order(4)] [Category("SimulationSubsystemsFunctional")] public void InputSubsystemFunctional() { CheckSubsystemFunctional(); } [Test] [Order(4)] [Category("SimulationSubsystemsFunctional")] public void PointCloudSubsystemFunctional() { CheckSubsystemFunctional(); } [Test] [Order(4)] [Category("SimulationSubsystemsFunctional")] public void PlaneSubsystemFunctional() { CheckSubsystemFunctional(); } [Test] [Order(4)] [Category("SimulationSubsystemsFunctional")] public void ImageTrackingSubsystemFunctionalWithLibrary() { // Image tracking subsystem needs a image library to run var subsystem = m_Loader.GetLoadedSubsystem(); var imageLibrary = ScriptableObject.CreateInstance(); subsystem.imageLibrary = subsystem.CreateRuntimeLibrary(imageLibrary); CheckSubsystemFunctional(); } [Test] [Order(4)] [Category("SimulationSubsystemsFunctional")] public void MeshSubsystemFunctional() { CheckSubsystemFunctional(); } [Test] [Order(4)] [Category("SimulationSubsystemsFunctional")] public void RaycastSubsystemFunctional() { CheckSubsystemFunctional(); } [Test] [Order(4)] [Category("SimulationSubsystemsFunctional")] public void AnchorSubsystemFunctional() { AddXROrigin(); CheckSubsystemFunctional(); RemoveXROrigin(); } #endregion } }