using System; using System.Collections.Generic; using System.Linq; using UnityEngine.Rendering; namespace UnityEditor.TestTools.TestRunner { internal class TestSettings : ITestSettings { private readonly TestSetting[] m_Settings = { new TestSetting( settings => settings.scriptingBackend, () => PlayerSettings.GetScriptingBackend(EditorUserBuildSettings.activeBuildTargetGroup), implementation => PlayerSettings.SetScriptingBackend(EditorUserBuildSettings.activeBuildTargetGroup, implementation.Value)), new TestSetting( settings => settings.Architecture, () => EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android ? PlayerSettings.Android.targetArchitectures.ToString() : null, architecture => { if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android) { if (!string.IsNullOrEmpty(architecture)) { var targetArchitectures = (AndroidArchitecture)Enum.Parse(typeof(AndroidArchitecture), architecture, true); PlayerSettings.Android.targetArchitectures = targetArchitectures; } } }), new TestSetting( settings => settings.apiProfile, () => PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup), implementation => { if (Enum.IsDefined(typeof(ApiCompatibilityLevel), implementation.Value)) { PlayerSettings.SetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup, implementation.Value); } }), new TestSetting( settings => settings.appleEnableAutomaticSigning, () => PlayerSettings.iOS.appleEnableAutomaticSigning, enableAutomaticSigning => { if (enableAutomaticSigning != null) PlayerSettings.iOS.appleEnableAutomaticSigning = enableAutomaticSigning.Value; }), new TestSetting( settings => settings.appleDeveloperTeamID, () => PlayerSettings.iOS.appleDeveloperTeamID, developerTeam => { if (developerTeam != null) PlayerSettings.iOS.appleDeveloperTeamID = developerTeam; }), new TestSetting( settings => settings.iOSManualProvisioningProfileType, () => PlayerSettings.iOS.iOSManualProvisioningProfileType, profileType => { if (profileType != null) PlayerSettings.iOS.iOSManualProvisioningProfileType = profileType.Value; }), new TestSetting( settings => settings.iOSManualProvisioningProfileID, () => PlayerSettings.iOS.iOSManualProvisioningProfileID, provisioningUUID => { if (provisioningUUID != null) PlayerSettings.iOS.iOSManualProvisioningProfileID = provisioningUUID; }), new TestSetting( settings => settings.tvOSManualProvisioningProfileType, () => PlayerSettings.iOS.tvOSManualProvisioningProfileType, profileType => { if (profileType != null) PlayerSettings.iOS.tvOSManualProvisioningProfileType = profileType.Value; }), new TestSetting( settings => settings.tvOSManualProvisioningProfileID, () => PlayerSettings.iOS.tvOSManualProvisioningProfileID, provisioningUUID => { if (provisioningUUID != null) PlayerSettings.iOS.tvOSManualProvisioningProfileID = provisioningUUID; }), new TestSetting( settings => settings.autoGraphicsAPIs, () => PlayerSettings.GetUseDefaultGraphicsAPIs(EditorUserBuildSettings.activeBuildTarget), autoGraphicsAPIs => { PlayerSettings.SetUseDefaultGraphicsAPIs(EditorUserBuildSettings.activeBuildTarget, autoGraphicsAPIs); }), new TestSetting( settings => settings.playerGraphicsAPIs, () => PlayerSettings.GetGraphicsAPIs(EditorUserBuildSettings.activeBuildTarget).Select(api => api.ToString()).ToArray(), playerGraphicsAPIs => { if (playerGraphicsAPIs != null && playerGraphicsAPIs.Length > 0) { var graphicsAPIs = new List(); foreach (var graphicsAPI in playerGraphicsAPIs) { if (GraphicsDeviceType.TryParse(graphicsAPI, true, out GraphicsDeviceType playerGraphicsAPI)) graphicsAPIs.Add(playerGraphicsAPI); } if (graphicsAPIs.Count > 0) PlayerSettings.SetGraphicsAPIs(EditorUserBuildSettings.activeBuildTarget, graphicsAPIs.ToArray()); } }), new TestSetting( settings => settings.androidBuildAppBundle, () => EditorUserBuildSettings.buildAppBundle, androidAppBundle => { EditorUserBuildSettings.buildAppBundle = androidAppBundle.Value; PlayerSettings.Android.useAPKExpansionFiles = androidAppBundle.Value; }) }; private bool m_Disposed; public ScriptingImplementation? scriptingBackend { get; set; } public string Architecture { get; set; } public ApiCompatibilityLevel? apiProfile { get; set; } public bool? appleEnableAutomaticSigning { get; set; } public string appleDeveloperTeamID { get; set; } public ProvisioningProfileType? iOSManualProvisioningProfileType { get; set; } public string iOSManualProvisioningProfileID { get; set; } public ProvisioningProfileType? tvOSManualProvisioningProfileType { get; set; } public string tvOSManualProvisioningProfileID { get; set; } public string[] playerGraphicsAPIs { get; set; } public bool autoGraphicsAPIs { get; set; } public bool? androidBuildAppBundle { get; set; } public void Dispose() { if (!m_Disposed) { foreach (var testSetting in m_Settings) { testSetting.Cleanup(); } m_Disposed = true; } } public void SetupProjectParameters() { foreach (var testSetting in m_Settings) { testSetting.Setup(this); } } private abstract class TestSetting { public abstract void Setup(TestSettings settings); public abstract void Cleanup(); } private class TestSetting : TestSetting { private T m_ValueBeforeSetup; private Func m_GetFromSettings; private Func m_GetCurrentValue; private Action m_SetValue; public TestSetting(Func getFromSettings, Func getCurrentValue, Action setValue) { m_GetFromSettings = getFromSettings; m_GetCurrentValue = getCurrentValue; m_SetValue = setValue; } public override void Setup(TestSettings settings) { m_ValueBeforeSetup = m_GetCurrentValue(); var newValue = m_GetFromSettings(settings); if (newValue != null) { m_SetValue(newValue); } } public override void Cleanup() { m_SetValue(m_ValueBeforeSetup); } } } }