using System; using System.Collections.Generic; using System.Linq; using UnityEditor.Build; using UnityEditor.TestTools.TestRunner.Api; using UnityEngine.Rendering; using UnityEngine.TestRunner.NUnitExtensions.Runner; namespace UnityEditor.TestTools.TestRunner { internal class TestSettings : ITestSettings { private readonly TestSetting[] m_Settings = { #if UNITY_2021_2_OR_NEWER new TestSetting( settings => settings.scriptingBackend, () => PlayerSettings.GetScriptingBackend(NamedBuildTarget.FromBuildTargetGroup(EditorUserBuildSettings.activeBuildTargetGroup)), implementation => PlayerSettings.SetScriptingBackend(NamedBuildTarget.FromBuildTargetGroup(EditorUserBuildSettings.activeBuildTargetGroup), implementation.Value)), #else new TestSetting( settings => settings.scriptingBackend, () => PlayerSettings.GetScriptingBackend(EditorUserBuildSettings.activeBuildTargetGroup), implementation => PlayerSettings.SetScriptingBackend(EditorUserBuildSettings.activeBuildTargetGroup, implementation.Value)), #endif 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; } } }), #if UNITY_2021_2_OR_NEWER new TestSetting( settings => settings.apiProfile, () => PlayerSettings.GetApiCompatibilityLevel(NamedBuildTarget.FromBuildTargetGroup(EditorUserBuildSettings.activeBuildTargetGroup)), implementation => { if (Enum.IsDefined(typeof(ApiCompatibilityLevel), implementation.Value)) { PlayerSettings.SetApiCompatibilityLevel(NamedBuildTarget.FromBuildTargetGroup(EditorUserBuildSettings.activeBuildTargetGroup), implementation.Value); } }), #else new TestSetting( settings => settings.apiProfile, () => PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup), implementation => { if (Enum.IsDefined(typeof(ApiCompatibilityLevel), implementation.Value)) { PlayerSettings.SetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup, implementation.Value); } }), #endif 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.iOSTargetSDK, () => (PlayerSettings.iOS.sdkVersion).ToString(), targetSDK => { if (targetSDK != null) { if (targetSDK == "DeviceSDK") PlayerSettings.iOS.sdkVersion = iOSSdkVersion.DeviceSDK; else if (targetSDK == "SimulatorSDK") PlayerSettings.iOS.sdkVersion = iOSSdkVersion.SimulatorSDK; } }), 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.tvOSTargetSDK, () => (PlayerSettings.tvOS.sdkVersion).ToString(), targetSDK => { if (targetSDK != null) { if (targetSDK == "DeviceSDK" || targetSDK == "Device") PlayerSettings.tvOS.sdkVersion = tvOSSdkVersion.Device; else if (targetSDK == "SimulatorSDK" || targetSDK == "Simulator") PlayerSettings.tvOS.sdkVersion = tvOSSdkVersion.Simulator; } }), 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 (Enum.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; #if UNITY_2023_1_OR_NEWER PlayerSettings.Android.splitApplicationBinary = androidAppBundle.Value; #else PlayerSettings.Android.useAPKExpansionFiles = androidAppBundle.Value; #endif }), new TestSetting( settings => settings.featureFlags.requiresSplashScreen, () => PlayerSettings.SplashScreen.show, requiresSplashScreen => { if (requiresSplashScreen != null) { PlayerSettings.SplashScreen.show = requiresSplashScreen.Value; } }), new TestSetting( settings => settings.featureFlags.requiresSplashScreen, () => PlayerSettings.SplashScreen.showUnityLogo, requiresSplashScreen => { if (requiresSplashScreen != null) { PlayerSettings.SplashScreen.showUnityLogo = requiresSplashScreen.Value; } }), #if UNITY_2023_2_OR_NEWER new TestSetting( settings => settings.webGLClientBrowserType, () => EditorUserBuildSettings.webGLClientBrowserType, browserType => { if (browserType != null) EditorUserBuildSettings.webGLClientBrowserType = browserType.Value; }), new TestSetting( settings => settings.webGLClientBrowserPath, () => EditorUserBuildSettings.webGLClientBrowserPath, browserPath => { if (!string.IsNullOrEmpty(browserPath)) EditorUserBuildSettings.webGLClientBrowserPath = browserPath; }), #endif }; 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 string iOSTargetSDK { get; set; } public ProvisioningProfileType? tvOSManualProvisioningProfileType { get; set; } public string tvOSManualProvisioningProfileID { get; set; } public string tvOSTargetSDK { get; set; } public string[] playerGraphicsAPIs { get; set; } public bool autoGraphicsAPIs { get; set; } public bool? androidBuildAppBundle { get; set; } #if UNITY_2023_2_OR_NEWER public WebGLClientBrowserType? webGLClientBrowserType { get; set; } public string webGLClientBrowserPath { get; set; } #endif public IgnoreTest[] ignoreTests { get; set; } public FeatureFlags featureFlags { get; set; } = new FeatureFlags(); 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); } } } }