public void TestResetData()
        {
            var manager   = new ActuatorManager();
            var actuator1 = new TestActuator(ActionSpec.MakeContinuous(3),
                                             "actuator1");
            var actuator2 = new TestActuator(ActionSpec.MakeContinuous(3), "actuator2");

            manager.Add(actuator1);
            manager.Add(actuator2);
            var continuousActionBuffer = new[] { 0f, 1f, 2f, 3f, 4f, 5f };

            manager.UpdateActions(new ActionBuffers(continuousActionBuffer,
                                                    Array.Empty <int>()));

            Assert.IsTrue(manager.StoredActions.ContinuousActions.SequenceEqual(continuousActionBuffer));
            Assert.IsTrue(manager.NumContinuousActions == 6);
            manager.ResetData();

            Assert.IsTrue(manager.StoredActions.ContinuousActions.SequenceEqual(new[] { 0f, 0f, 0f, 0f, 0f, 0f }));
        }
        public void FilenameMatch()
        {
            var config = ScriptableObject.CreateInstance <ProjectAuditorConfig>();

            config.AnalyzeEditorCode = false;

            var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(config);

            var projectReport = projectAuditor.Audit();
            var issues        = projectReport.GetIssues(IssueCategory.Code);
            var stringFilter  = new TextFilter
            {
                matchCase          = false,
                searchDependencies = false,
                searchText         = "FilterTests.cs"
            };
            var filteredIssues = issues.Where(i => stringFilter.Match(i));

            Assert.AreEqual(1, filteredIssues.Count());
        }
            public bool Run(BuildPipeline.BuildContext context)
            {
                using (var tmpWorld = new World(ConfigurationScene.Guid.ToString("N")))
                {
                    var configEntity = CopyEntity(context.WorldManager.GetConfigEntity(), context.World, tmpWorld);

                    // Insert asset scene before all other startup scenes, if there's any asset
                    if (AssetEnumerator.GetAllReferencedAssets(context.Project).Count > 0)
                    {
                        Assert.IsTrue(tmpWorld.EntityManager.HasComponent <StartupScenes>(configEntity));
                        var startupScenes = tmpWorld.EntityManager.GetBuffer <StartupScenes>(configEntity).Reinterpret <Guid>();
                        if (startupScenes.Length == 0)
                        {
                            Debug.LogWarning($"Project {context.Project.Name} contains no startup scenes.");
                        }
                        startupScenes.Insert(0, AssetsScene.Guid);
                    }

                    // Make sure components not owned by the users are removed if their assemblies are missing
                    var configArchetype    = context.Session.GetManager <IArchetypeManager>().Config;
                    var componentsToRemove = GetAllComponentTypes(configArchetype).Where(t => !DomainCache.IsIncludedInProject(context.Project, t.GetManagedType()));
                    tmpWorld.EntityManager.RemoveComponent(tmpWorld.EntityManager.UniversalQuery, new ComponentTypes(componentsToRemove.ToArray()));

                    // Export configuration scene
                    var outputFile = context.DataDirectory.GetFile(tmpWorld.Name);
                    if (!ExportWorld(outputFile, context.Project, ConfigurationScene.Path, tmpWorld))
                    {
                        return(false);
                    }

                    // Update manifest
                    context.Manifest.Add(ConfigurationScene.Guid, ConfigurationScene.Path, outputFile.AsEnumerable());

                    // Dump debug file
                    var debugFile  = context.DataDirectory.GetFile(".debug.txt");
                    var debugLines = context.Manifest.Assets.OrderBy(x => x.Value).Select(x => $"{x.Key.ToString("N")} = {x.Value.DoubleQuoted()}");
                    debugFile.WriteAllLines(debugLines.ToArray());
                }

                return(true);
            }
Exemple #4
0
        public IEnumerator MultipleScenes()
        {
            SceneManager.LoadScene("PoolingTestScene");
            yield return(new WaitForSeconds(.1f));

            var instance = Object.FindObjectOfType <BlockPooler>();

            Assert.IsNotNull(instance);
            Assert.AreEqual(instance.transform.childCount, 100);

            var request = BlockPooler.Request();

            Assert.AreEqual(instance.transform.childCount, 100);
            request.transform.SetParent(null);
            Assert.AreEqual(instance.transform.childCount, 99);
            request.transform.SetParent(instance.transform);
            Assert.AreEqual(instance.transform.childCount, 100);
            Assert.IsNotNull(request);
            BlockPooler.Return(request);
            Assert.AreEqual(instance.transform.childCount, 100);
            yield return(null);

            SceneManager.LoadScene("PoolingTestScene2");
            instance = Object.FindObjectOfType <BlockPooler>();

            Assert.IsNotNull(instance);
            Assert.AreEqual(instance.transform.childCount, 100);

            Assert.IsNotNull(BlockPooler.Request());
            yield return(null);


            SceneManager.LoadScene("PoolingTestScene");
            instance = Object.FindObjectOfType <BlockPooler>();

            Assert.IsNotNull(instance);
            Assert.AreEqual(instance.transform.childCount, 100);

            Assert.IsNotNull(BlockPooler.Request());
            yield return(null);
        }
Exemple #5
0
        public void TileData_RemoveFlag()
        {
            _tileData.Initialize();

            // 何もしてないときは 0(None)のはず
            Assert.AreEqual(_tileData.Flag, TileFlag.None, "何もしてないときはNone");

            _tileData.AddFlag(TileFlag.Wall);
            _tileData.RemoveFlag(TileFlag.Wall);

            // Removeしたので 0のはず
            Assert.AreEqual(_tileData.Flag, TileFlag.None, "RemoveしたのでNone");

            _tileData.AddFlag(TileFlag.Wall);
            _tileData.AddFlag(TileFlag.StepUp);

            _tileData.RemoveFlag(TileFlag.Wall);

            Assert.IsTrue(_tileData.HasFlag(TileFlag.StepUp), "WallをRemoveしたがStepUpはある");
            Assert.IsFalse(_tileData.HasFlag(TileFlag.Wall), "WallをRemoveしたので無い");
        }
Exemple #6
0
        public void 自作Subjectテスト()
        {
            var mySubject      = new MySubject <int>();
            var sampleObserver = new SampleObserver();

            var disposable = mySubject.Subscribe(sampleObserver);

            mySubject.OnNext(1);

            Assert.AreEqual(1, sampleObserver.Value, "受け取れてること");

            // 破棄
            disposable.Dispose();

            mySubject.OnNext(2);

            Assert.AreEqual(1, sampleObserver.Value, "破棄しているので更新されない");

            mySubject.OnCompleted();
            mySubject.Dispose();
        }
        public void LoadAssetWithNameAndTypeTest()
        {
#if UNITY_EDITOR
            AssetBundleSettings.SimulateAssetBundleInEditor = true;
#endif

            ResKit.Init();

            var resLoader = ResLoader.Allocate();

            var audioClip = resLoader.LoadSync <AudioClip>("coin_get1");

            Assert.IsTrue(audioClip);

            var gameObj = resLoader.LoadSync <GameObject>("coin_get1");

            Assert.IsTrue(gameObj);

            resLoader.Recycle2Cache();
            resLoader = null;
        }
Exemple #8
0
        public IEnumerator MergeResultObservableTest()
        {
            int  count    = 0;
            bool finished = false;

            var subject = new Subject <int>();

            subject
            // IObservable<int>からIObservable<IObservable<int>>に変換
            .Select(i => Observable.IntervalFrame(1).Take(2).Select(_ => 1))
            // IObservable<IObservable<T>>からIObservabel<T>へマージ
            .Merge()
            .Subscribe(num => count += num, () => finished = true);

            subject.OnNext(1);
            subject.OnCompleted();

            yield return(new WaitUntil(() => finished));

            Assert.AreEqual(2, count, "MergeによってIObservabvle<IObservabvle<T>>からIObservavble<T>にマージされた");
        }
Exemple #9
0
        public IEnumerator DelayIgnore() => UniTask.ToCoroutine(async() =>
        {
            var time = Time.realtimeSinceStartup;

            Time.timeScale = 0.01f;

            try
            {
                await UniTask.Delay(TimeSpan.FromSeconds(1), ignoreTimeScale: true);

                var elapsed = Time.realtimeSinceStartup - time;

                // MidpointRounding は数値の丸め処理を行うメソッドで、処理する方法を決める
                // ToEvanは数値が2つの数値の中間に位置するときに最も近い偶数方向に丸められる
                Assert.AreEqual(1, (int)Math.Round(TimeSpan.FromSeconds(elapsed).TotalSeconds, MidpointRounding.ToEven));
            }
            finally
            {
                Time.timeScale = 1.0f;
            }
        });
Exemple #10
0
        public IEnumerator IntegrationTest()
        {
            SceneManager.LoadScene(SCENE_NAME);
            yield return(null);

            var helper          = Object.FindObjectOfType <ProductionTestHelper>();
            var resourceManager = Object.FindObjectOfType <ResourceManager>();

            Assert.IsNotNull(helper);
            Assert.IsNotNull(resourceManager);

            var unit = helper.NormalFactory.ProduceUnit(0);

            unit.GetComponent <UnitMovementController>().MoveToPoint(helper.Scrapyard.GetComponent <Node>().UnitSlots[0].transform.position);
            yield return(new WaitForSeconds(5.0f));

            helper.Scrapyard.ScrapUnit(unit);
            yield return(null);

            Assert.IsNull(unit);
        }
Exemple #11
0
        private static void OnGenericWork(ref SGenericWorkItem item)
        {
            Chunk chunk = item.Chunk;

            // Perform the action
            item.Action();

            int cnt = Interlocked.Decrement(ref chunk.m_genericWorkItemsLeftToProcess);

            if (cnt <= 0)
            {
                // Something is very wrong if we go below zero
                Assert.IsTrue(cnt == 0);

                // All generic work is done
                lock (chunk.m_lock)
                {
                    OnGenericWorkDone(chunk);
                }
            }
        }
Exemple #12
0
        public void SetParentOfTransforms()
        {
            GameObject parent  = new GameObject("Parent");
            Transform  parentT = parent.transform;

            List <Transform> children = new List <Transform>();

            for (int i = 0; i < 10; ++i)
            {
                GameObject child = new GameObject($"Child-{i}");
                children.Add(child.transform);
            }

            children.SetParent(parentT);

            foreach (Transform t in children)
            {
                Assert.IsNotNull(t);
                Assert.AreEqual(parentT, t.parent);
            }
        }
Exemple #13
0
        public void WhenDispatchRestartGameSignal_RestartKeyboard()
        {
            SignalDelegate callback = null;

            _eventDispatcherService
            .When(service => service.Subscribe <RestartGameSignal>(Arg.Any <SignalDelegate>()))
            .Do(info => callback = info.Arg <SignalDelegate>());
            var inGamePresenter = new InGamePresenter(_inGameViewModel, _eventDispatcherService);

            _keyButtonViewModel.Color.Value     = "";
            _keyButtonViewModel.IsEnabled.Value = false;
            _colorObserver.ClearReceivedCalls();
            _isKetEnabledObserver.ClearReceivedCalls();

            Assert.AreNotEqual(InGameViewModel.DefaultColor, _keyButtonViewModel.Color.Value);
            Assert.AreNotEqual(true, _keyButtonViewModel.IsEnabled.Value);
            callback(new RestartGameSignal());

            _colorObserver.Received().OnNext(InGameViewModel.DefaultColor);
            _isKetEnabledObserver.Received().OnNext(true);
        }
        public void ShouldRaiseBoolGameEvent()
        {
            var tester = new GameEventTester <
                BoolGameEventListener,
                BoolGameEvent,
                BoolEvent,
                bool
                >();

            tester.SetActive(true);
            tester.RaiseGameEvent(true);

            Assert.AreEqual(true, tester.GetLastEventValue());
            Assert.AreEqual(1, tester.GetEventCount());
            tester.Clear();

            tester.SetActive(false);
            tester.RaiseGameEvent(true);

            Assert.AreEqual(0, tester.GetEventCount());
        }
Exemple #15
0
        public IEnumerator ObservableTimerTest()
        {
            bool isSubscribed = false;

            Observable.Timer(System.TimeSpan.FromSeconds(0.1))
            .Subscribe(_ => isSubscribed = true);

            yield return(new WaitUntil(() => isSubscribed));

            Assert.IsTrue(isSubscribed, "指定秒数後Subscribeされた");

            // 1秒おきにメッセージ発行
            int count = 0;

            Observable.Timer(System.TimeSpan.FromSeconds(0.1), System.TimeSpan.FromSeconds(0.1))
            .Subscribe(_ => count++);

            yield return(new WaitUntil(() => count >= 2));

            Assert.AreEqual(2, count, "0.1秒置きにイベントが呼び出された");
        }
Exemple #16
0
        public void EmptyStringMatchesAllIssues()
        {
            var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor();

            // disabling stripEngineCode will be reported as an issue
            PlayerSettings.stripEngineCode = false;

            var projectReport = projectAuditor.Audit();

            var stringFilter = new TextFilter
            {
                matchCase          = true,
                searchDependencies = false,
                searchText         = string.Empty
            };

            var issues         = projectReport.GetIssues(IssueCategory.ProjectSettings);
            var filteredIssues = issues.Where(i => stringFilter.Match(i));

            Assert.AreEqual(issues.Length, filteredIssues.Count());
        }
        public void ShouldRaiseFloatGameEvent()
        {
            var tester = new GameEventTester <
                FloatGameEventListener,
                FloatGameEvent,
                FloatEvent,
                float
                >();

            tester.SetActive(true);
            tester.RaiseGameEvent(10f);

            Assert.AreEqual(10f, tester.GetLastEventValue());
            Assert.AreEqual(1, tester.GetEventCount());
            tester.Clear();

            tester.SetActive(false);
            tester.RaiseGameEvent(10f);

            Assert.AreEqual(0, tester.GetEventCount());
        }
        public void FoundExpectedFeatureSets()
        {
            InitializeFeatureSets(false);

            string[] expectedFeatureSets = new string[] {
                KnownFeatureSetsContent.s_MicrosoftFeatureSetId
            };

            var featureSets = FeatureSetsForBuildTarget(BuildTargetGroup.Standalone);

            Assert.IsNotNull(featureSets);
            Assert.AreEqual(expectedFeatureSets.Length, featureSets.Count);

            foreach (var featureSet in featureSets)
            {
                if (Array.IndexOf(expectedFeatureSets, featureSet.featureSetId) == -1)
                {
                    Assert.IsTrue(false, $"Found unexpected feature set id {featureSet.featureSetId}!");
                }
            }
        }
        public void ShouldRaiseStringGameEventListener()
        {
            var tester = new GameEventTester <
                StringGameEventListener,
                StringGameEvent,
                StringEvent,
                string
                >();

            tester.SetActive(true);
            tester.RaiseGameEvent("foo");

            Assert.AreEqual("foo", tester.GetLastEventValue());
            Assert.AreEqual(1, tester.GetEventCount());
            tester.Clear();

            tester.SetActive(false);
            tester.RaiseGameEvent("foo");

            Assert.AreEqual(0, tester.GetEventCount());
        }
        public void ShouldRaiseVector3EventListener()
        {
            var tester = new GameEventTester <
                Vector3GameEventListener,
                Vector3GameEvent,
                Vector3Event,
                UnityEngine.Vector3
                >();

            tester.SetActive(true);
            tester.RaiseGameEvent(UnityEngine.Vector3.one);

            Assert.AreEqual(UnityEngine.Vector3.one, tester.GetLastEventValue());
            Assert.AreEqual(1, tester.GetEventCount());
            tester.Clear();

            tester.SetActive(false);
            tester.RaiseGameEvent(UnityEngine.Vector3.one);

            Assert.AreEqual(0, tester.GetEventCount());
        }
        public void ShouldRaiseIntGameEventListener()
        {
            var tester = new GameEventTester <
                IntGameEventListener,
                IntGameEvent,
                IntEvent,
                int
                >();

            tester.SetActive(true);
            tester.RaiseGameEvent(10);

            Assert.AreEqual(10, tester.GetLastEventValue());
            Assert.AreEqual(1, tester.GetEventCount());
            tester.Clear();

            tester.SetActive(false);
            tester.RaiseGameEvent(10);

            Assert.AreEqual(0, tester.GetEventCount());
        }
Exemple #22
0
        public void ReactiveCollectionTest()
        {
            int count = 0;

            var collection = new ReactiveCollection <int>();

            collection
            .ObserveAdd()
            .Subscribe(num => count += num.Value);

            collection
            .ObserveRemove()
            .Subscribe(num => count -= num.Value);

            collection.Add(1);
            collection.Add(1);
            Assert.AreEqual(2, count, "Add呼び出し時にSubscribeが呼び出されて2");

            collection.Remove(1);
            Assert.AreEqual(1, count, "removeが呼び出されて1");
        }
Exemple #23
0
        public void SaveFileTest()
        {
            Graph <NavGraphNode, GraphEdge> graph = new Graph <NavGraphNode, GraphEdge>();

            AddNodesAndEdgesToGraph(graph);

            string path = Application.streamingAssetsPath + "/testSaveFile.txt";

            graph.SaveToFile(path);
            Graph <NavGraphNode, GraphEdge> loadedGraph = Graph <NavGraphNode, GraphEdge> .LoadGraphFromFile(path);

            Assert.AreEqual(graph.GetNodesQuantity(), loadedGraph.GetNodesQuantity());

            for (int i = 0; i < graph.GetNodesQuantity(); i++)
            {
                CheckNodes(graph, loadedGraph, i);
                CheckEdges(graph, loadedGraph, i);
            }

            File.Delete(path);
        }
Exemple #24
0
        public void ErrorTest()
        {
            int  counter = 0;
            bool error   = false;
            var  subject = new Subject <string>();

            subject
            .Select(str => int.Parse(str))
            .Subscribe(
                x => { Debug.Log(x); counter++; },
                ex => { Debug.LogWarning("例外が発生しました:" + ex.Message); error = true; },
                () => Debug.Log("OnCOmpleted"));

            subject.OnNext("1");
            subject.OnNext("2");

            // int.Parseに失敗して例外が発生する
            subject.OnNext("Three");

            Assert.IsTrue(error, "エラーが発行されたのでカウンタが1");

            // OnErrorメッセージ発生により購読は終了済み
            subject.OnNext("4");

            Assert.AreNotEqual(counter, 3, "終了しているのでカウントされない");

            // ただしSubject自体が例外出したわけじゃないのでSubjectは正常稼働中
            // そのため再購読すれば利用ができる
            counter = 0;

            subject.Subscribe(
                x => { Debug.Log(x); counter = 1; },
                () => Debug.Log("Completed"));

            subject.OnNext("Hellor");
            subject.OnCompleted();
            subject.Dispose();

            Assert.AreEqual(1, counter, "再購読したらカウントが 1 になった");
        }
Exemple #25
0
        public unsafe void RigidBodyCastColliderTest()
        {
            Physics.RigidBody rigidbody = Unity.Physics.RigidBody.Zero;

            const float size         = 1.0f;
            const float convexRadius = 0.0f;
            const float sphereRadius = 1.0f;

            var rayStartOK = new float3(-10, -10, -10);
            var rayEndOK   = new float3(10, 10, 10);

            var rayStartFail = new float3(-10, 10, -10);
            var rayEndFail   = new float3(10, 10, 10);

            rigidbody.Collider = (Collider *)BoxCollider.Create(float3.zero, quaternion.identity, new float3(size), convexRadius).GetUnsafePtr();

            var colliderCastInput = new ColliderCastInput();
            var closestHit        = new ColliderCastHit();
            var allHits           = new NativeList <ColliderCastHit>(Allocator.Temp);

            // OK case : Sphere hits the box collider
            float3 rayDir = rayEndOK - rayStartOK;

            colliderCastInput.Position  = rayStartOK;
            colliderCastInput.Direction = rayDir;
            colliderCastInput.Collider  = (Collider *)SphereCollider.Create(float3.zero, sphereRadius).GetUnsafePtr();

            Assert.IsTrue(rigidbody.CastCollider(colliderCastInput));
            Assert.IsTrue(rigidbody.CastCollider(colliderCastInput, out closestHit));
            Assert.IsTrue(rigidbody.CastCollider(colliderCastInput, ref allHits));

            // Fail case : wrong direction
            rayDir = rayEndFail - rayStartFail;
            colliderCastInput.Position  = rayStartFail;
            colliderCastInput.Direction = rayDir;

            Assert.IsFalse(rigidbody.CastCollider(colliderCastInput));
            Assert.IsFalse(rigidbody.CastCollider(colliderCastInput, out closestHit));
            Assert.IsFalse(rigidbody.CastCollider(colliderCastInput, ref allHits));
        }
Exemple #26
0
        public IEnumerator DisableObject()
        {
            var boundsControl = InstantiateSceneAndDefaultBoundsControl();

            yield return(VerifyInitialBoundsCorrect(boundsControl));

            Vector3 initialScale = boundsControl.transform.localScale;

            const int numHandSteps = 1;

            Vector3  initialHandPosition = new Vector3(0, 0, 0.5f);
            var      frontRightCornerPos = boundsControl.gameObject.transform.Find("rigRoot/corner_3").position; // front right corner is corner 3
            TestHand hand = new TestHand(Handedness.Right);

            // Hands grab object at initial position
            yield return(hand.Show(initialHandPosition));

            yield return(hand.SetGesture(ArticulatedHandPose.GestureId.OpenSteadyGrabPoint));

            yield return(hand.MoveTo(frontRightCornerPos, numHandSteps));

            yield return(hand.SetGesture(ArticulatedHandPose.GestureId.Pinch));

            // Verify that scale works before deactivating
            yield return(hand.Move(Vector3.right * 0.2f, numHandSteps));

            Vector3 afterTransformScale = boundsControl.transform.localScale;

            Assert.AreNotEqual(initialScale, afterTransformScale);

            // Deactivate object and ensure that we don't scale
            boundsControl.gameObject.SetActive(false);
            yield return(null);

            boundsControl.gameObject.SetActive(true);
            yield return(hand.Move(Vector3.right * 0.2f, numHandSteps));

            Assert.AreEqual(afterTransformScale, boundsControl.transform.localScale);
        }
Exemple #27
0
        public IEnumerator WhenAllTest()
        {
            int  count      = 0;
            bool isFinished = false;

            IEnumerator CoroutineA(IObserver <int> observer)
            {
                yield return(new WaitForSeconds(0.1f));

                observer.OnNext(1);
                observer.OnCompleted();
            }

            IEnumerator CoroutineB(IObserver <int> observer)
            {
                yield return(new WaitForSeconds(0.1f));

                observer.OnNext(1);
                observer.OnCompleted();
            }

            // コルーチンAとBを同時に起動して終了を待つ
            Observable.WhenAll(
                Observable.FromCoroutine <int>(o => CoroutineA(o)),
                Observable.FromCoroutine <int>(o => CoroutineB(o))
                ).Subscribe(xi =>
            {
                foreach (var x in xi)
                {
                    count += x;
                }
            },
                            () => isFinished = true);


            yield return(new WaitUntil(() => isFinished));

            Assert.AreEqual(2, count, "WhenAllで2つのコルーチンの終了処理をした。内部でOnNextが呼び出されたので2");
        }
        public IEnumerator ScaleViaNearInteration()
        {
            const int numSteps = 2;
            var       bbox     = InstantiateSceneAndDefaultBbox();

            bbox.ScaleHandleSize = 0.1f;
            yield return(null);

            var bounds = bbox.GetComponent <BoxCollider>().bounds;

            Assert.AreEqual(new Vector3(0, 0, 1.5f), bounds.center);
            Assert.AreEqual(new Vector3(.5f, .5f, .5f), bounds.size);

            var inputSimulationService = PlayModeTestUtilities.GetInputSimulationService();

            // front right corner is corner 3
            var frontRightCornerPos = bbox.ScaleCorners[3].transform.position;

            TestHand rightHand = new TestHand(Handedness.Right);

            yield return(rightHand.Show(new Vector3(0, 0, 0.5f)));

            var delta = new Vector3(0.1f, 0.1f, 0f);

            yield return(rightHand.MoveTo(frontRightCornerPos, numSteps));

            yield return(rightHand.SetGesture(ArticulatedHandPose.GestureId.Pinch));

            yield return(rightHand.Move(delta, numSteps));

            var endBounds = bbox.GetComponent <BoxCollider>().bounds;

            TestUtilities.AssertAboutEqual(endBounds.center, new Vector3(0.033f, 0.033f, 1.467f), "endBounds incorrect center");
            TestUtilities.AssertAboutEqual(endBounds.size, Vector3.one * .567f, "endBounds incorrect size");

            GameObject.Destroy(bbox.gameObject);
            // Wait for a frame to give Unity a change to actually destroy the object
            yield return(null);
        }
        public void DisableFeatureSetDisabledFeatures()
        {
            OpenXRFeatureSetManager.InitializeFeatureSets(true);
            var extInfo = FeatureHelpersInternal.GetAllFeatureInfo(BuildTargetGroup.Standalone);

            foreach (var ext in extInfo.Features)
            {
                Assert.IsFalse(ext.Feature.enabled);
            }


            var foundFeatureSet = OpenXRFeatureSetManager.GetFeatureSetInfoWithId(BuildTargetGroup.Standalone, k_TestFeatureSetId);

            Assert.IsNotNull(foundFeatureSet);
            foundFeatureSet.isEnabled  = true;
            foundFeatureSet.wasChanged = true;
            OpenXRFeatureSetManager.SetFeaturesFromEnabledFeatureSets(BuildTargetGroup.Standalone);

            foreach (var ext in extInfo.Features)
            {
                if (String.Compare(ext.Attribute.FeatureId, MicrosoftHandInteraction.featureId, true) == 0)
                {
                    Assert.IsTrue(ext.Feature.enabled);
                }
                else
                {
                    Assert.IsFalse(ext.Feature.enabled);
                }
            }

            foundFeatureSet.isEnabled  = false;
            foundFeatureSet.wasChanged = true;
            OpenXRFeatureSetManager.SetFeaturesFromEnabledFeatureSets(BuildTargetGroup.Standalone);

            foreach (var ext in extInfo.Features)
            {
                Assert.IsFalse(ext.Feature.enabled);
            }
        }
        public void FoundExpectedFeatureSets()
        {
            string[] expectedFeatuerSets = new string[] {
                k_TestFeatureSetId,
                KnownFeatureSetsContent.s_MicrosoftFeatureSetId,
#if USE_MOCK_FEATURE_SET
                "com.unity.openxr.featureset.mockruntime",
#endif //USE_MOCK_FEATURE_SET
            };

            var featureSets = OpenXRFeatureSetManager.FeatureSetsForBuildTarget(BuildTargetGroup.Standalone);
            Assert.IsNotNull(featureSets);
            Assert.AreEqual(expectedFeatuerSets.Length, featureSets.Count);

            foreach (var featureSet in featureSets)
            {
                if (Array.IndexOf(expectedFeatuerSets, featureSet.featureSetId) == -1)
                {
                    Assert.IsTrue(false, $"Found unexpected feature set id {featureSet.featureSetId}!");
                }
            }
        }