using System; using System.IO; using UnityEditor; using UnityEditor.XR.Management; using UnityEngine; using UnityEngine.XR.Management; namespace Unity.XR.TestTooling { // Mostly borrowed from XRManagement - this should probably live in that package. public abstract class ManagementTestSetup { protected static readonly string[] s_TestGeneralSettings = { "Temp", "Test" }; protected static readonly string[] s_TempSettingsPath = {"Temp", "Test", "Settings" }; /// /// When true, AssetDatabase.AddObjectToAsset will not be called to add XRManagerSettings to XRGeneralSettings. /// protected virtual bool TestManagerUpgradePath => false; protected string testPathToGeneralSettings; protected string testPathToSettings; private UnityEngine.Object currentSettings = null; protected XRManagerSettings testManager = null; protected XRGeneralSettings xrGeneralSettings = null; protected XRGeneralSettingsPerBuildTarget buildTargetSettings = null; public virtual void SetupTest() { testManager = ScriptableObject.CreateInstance(); xrGeneralSettings = ScriptableObject.CreateInstance() as XRGeneralSettings; xrGeneralSettings.Manager = testManager; testPathToSettings = GetAssetPathForComponents(s_TempSettingsPath); testPathToSettings = Path.Combine(testPathToSettings, "Test_XRGeneralSettings.asset"); if (!string.IsNullOrEmpty(testPathToSettings)) { AssetDatabase.CreateAsset(xrGeneralSettings, testPathToSettings); if (!TestManagerUpgradePath) { AssetDatabase.AddObjectToAsset(testManager, xrGeneralSettings); } AssetDatabase.SaveAssets(); } testPathToGeneralSettings = GetAssetPathForComponents(s_TestGeneralSettings); testPathToGeneralSettings = Path.Combine(testPathToGeneralSettings, "Test_XRGeneralSettingsPerBuildTarget.asset"); buildTargetSettings = ScriptableObject.CreateInstance(); buildTargetSettings.SetSettingsForBuildTarget(BuildTargetGroup.Standalone, xrGeneralSettings); if (!string.IsNullOrEmpty(testPathToSettings)) { AssetDatabase.CreateAsset(buildTargetSettings, testPathToGeneralSettings); AssetDatabase.SaveAssets(); EditorBuildSettings.TryGetConfigObject(XRGeneralSettings.k_SettingsKey, out currentSettings); EditorBuildSettings.AddConfigObject(XRGeneralSettings.k_SettingsKey, buildTargetSettings, true); } } public virtual void TearDownTest() { EditorBuildSettings.RemoveConfigObject(XRGeneralSettings.k_SettingsKey); if (!string.IsNullOrEmpty(testPathToGeneralSettings)) { AssetDatabase.DeleteAsset(testPathToGeneralSettings); } if (!string.IsNullOrEmpty(testPathToSettings)) { AssetDatabase.DeleteAsset(testPathToSettings); } xrGeneralSettings.Manager = null; UnityEngine.Object.DestroyImmediate(xrGeneralSettings); xrGeneralSettings = null; UnityEngine.Object.DestroyImmediate(testManager); testManager = null; UnityEngine.Object.DestroyImmediate(buildTargetSettings); buildTargetSettings = null; if (currentSettings != null) EditorBuildSettings.AddConfigObject(XRGeneralSettings.k_SettingsKey, currentSettings, true); else EditorBuildSettings.RemoveConfigObject(XRGeneralSettings.k_SettingsKey); AssetDatabase.DeleteAsset(Path.Combine("Assets","Temp")); } public static string GetAssetPathForComponents(string[] pathComponents, string root = "Assets") { if (pathComponents.Length <= 0) return null; string path = root; foreach( var pc in pathComponents) { string subFolder = Path.Combine(path, pc); bool shouldCreate = true; foreach (var f in AssetDatabase.GetSubFolders(path)) { if (String.Compare(Path.GetFullPath(f), Path.GetFullPath(subFolder), true) == 0) { shouldCreate = false; break; } } if (shouldCreate) AssetDatabase.CreateFolder(path, pc); path = subFolder; } return path; } } }