321 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			321 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 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<ScriptingImplementation?>(
 | |
|                 settings => settings.scriptingBackend,
 | |
|                 () => PlayerSettings.GetScriptingBackend(NamedBuildTarget.FromBuildTargetGroup(EditorUserBuildSettings.activeBuildTargetGroup)),
 | |
|                 implementation => PlayerSettings.SetScriptingBackend(NamedBuildTarget.FromBuildTargetGroup(EditorUserBuildSettings.activeBuildTargetGroup), implementation.Value)),
 | |
| #else
 | |
|             new TestSetting<ScriptingImplementation?>(
 | |
|                 settings => settings.scriptingBackend,
 | |
|                 () => PlayerSettings.GetScriptingBackend(EditorUserBuildSettings.activeBuildTargetGroup),
 | |
|                 implementation => PlayerSettings.SetScriptingBackend(EditorUserBuildSettings.activeBuildTargetGroup, implementation.Value)),
 | |
| #endif
 | |
|             new TestSetting<string>(
 | |
|                 settings => settings.Architecture,
 | |
|                 () =>
 | |
|                 {
 | |
|                     switch (EditorUserBuildSettings.activeBuildTarget)
 | |
|                     {
 | |
|                         case BuildTarget.Android:
 | |
|                             return PlayerSettings.Android.targetArchitectures.ToString();
 | |
|                         case BuildTarget.StandaloneOSX:
 | |
|                             return EditorUserBuildSettings.GetPlatformSettings(BuildPipeline.GetBuildTargetName(BuildTarget.StandaloneOSX), "Architecture");
 | |
|                         case BuildTarget.StandaloneWindows64:
 | |
|                             return EditorUserBuildSettings.GetPlatformSettings(BuildPipeline.GetBuildTargetName(BuildTarget.StandaloneWindows64), "Architecture");
 | |
|                         default:
 | |
|                             return null;
 | |
|                     }
 | |
|                 },
 | |
|                 architecture =>
 | |
|                 {
 | |
|                     if (string.IsNullOrEmpty(architecture))
 | |
|                         return;
 | |
|                     
 | |
|                     switch (EditorUserBuildSettings.activeBuildTarget)
 | |
|                     {
 | |
|                         case BuildTarget.Android:
 | |
|                             var targetArchitectures = (AndroidArchitecture)Enum.Parse(typeof(AndroidArchitecture), architecture, true);
 | |
|                             PlayerSettings.Android.targetArchitectures = targetArchitectures;
 | |
|                             break;
 | |
|                         case BuildTarget.StandaloneOSX:
 | |
|                             EditorUserBuildSettings.SetPlatformSettings(BuildPipeline.GetBuildTargetName(BuildTarget.StandaloneOSX), "Architecture", architecture.ToLower());
 | |
|                             break;
 | |
|                         case BuildTarget.StandaloneWindows64:
 | |
|                             EditorUserBuildSettings.SetPlatformSettings(BuildPipeline.GetBuildTargetName(BuildTarget.StandaloneWindows64), "Architecture", architecture.ToLower());
 | |
|                             break;
 | |
|                     }
 | |
|                 }),
 | |
| #if UNITY_2021_2_OR_NEWER
 | |
|             new TestSetting<ApiCompatibilityLevel?>(
 | |
|                 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<ApiCompatibilityLevel?>(
 | |
|                 settings => settings.apiProfile,
 | |
|                 () => PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup),
 | |
|                 implementation =>
 | |
|                 {
 | |
|                     if (Enum.IsDefined(typeof(ApiCompatibilityLevel), implementation.Value))
 | |
|                     {
 | |
|                         PlayerSettings.SetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup,
 | |
|                             implementation.Value);
 | |
|                     }
 | |
|                 }),
 | |
| #endif
 | |
|             new TestSetting<bool?>(
 | |
|                 settings => settings.appleEnableAutomaticSigning,
 | |
|                 () => PlayerSettings.iOS.appleEnableAutomaticSigning,
 | |
|                 enableAutomaticSigning =>
 | |
|                 {
 | |
|                     if (enableAutomaticSigning != null)
 | |
|                         PlayerSettings.iOS.appleEnableAutomaticSigning = enableAutomaticSigning.Value;
 | |
|                 }),
 | |
|             new TestSetting<string>(
 | |
|                 settings => settings.appleDeveloperTeamID,
 | |
|                 () => PlayerSettings.iOS.appleDeveloperTeamID,
 | |
|                 developerTeam =>
 | |
|                 {
 | |
|                     if (developerTeam != null)
 | |
|                         PlayerSettings.iOS.appleDeveloperTeamID = developerTeam;
 | |
|                 }),
 | |
|             new TestSetting<ProvisioningProfileType?>(
 | |
|                 settings => settings.iOSManualProvisioningProfileType,
 | |
|                 () => PlayerSettings.iOS.iOSManualProvisioningProfileType,
 | |
|                 profileType =>
 | |
|                 {
 | |
|                     if (profileType != null)
 | |
|                         PlayerSettings.iOS.iOSManualProvisioningProfileType = profileType.Value;
 | |
|                 }),
 | |
|             new TestSetting<string>(
 | |
|                 settings => settings.iOSManualProvisioningProfileID,
 | |
|                 () => PlayerSettings.iOS.iOSManualProvisioningProfileID,
 | |
|                 provisioningUUID =>
 | |
|                 {
 | |
|                     if (provisioningUUID != null)
 | |
|                         PlayerSettings.iOS.iOSManualProvisioningProfileID = provisioningUUID;
 | |
|                 }),
 | |
|             new TestSetting<string>(
 | |
|                 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<ProvisioningProfileType?>(
 | |
|                 settings => settings.tvOSManualProvisioningProfileType,
 | |
|                 () => PlayerSettings.iOS.tvOSManualProvisioningProfileType,
 | |
|                 profileType =>
 | |
|                 {
 | |
|                     if (profileType != null)
 | |
|                         PlayerSettings.iOS.tvOSManualProvisioningProfileType = profileType.Value;
 | |
|                 }),
 | |
|             new TestSetting<string>(
 | |
|                 settings => settings.tvOSManualProvisioningProfileID,
 | |
|                 () => PlayerSettings.iOS.tvOSManualProvisioningProfileID,
 | |
|                 provisioningUUID =>
 | |
|                 {
 | |
|                     if (provisioningUUID != null)
 | |
|                         PlayerSettings.iOS.tvOSManualProvisioningProfileID = provisioningUUID;
 | |
|                 }),
 | |
|             new TestSetting<string>(
 | |
|                 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<bool>(
 | |
|                 settings => settings.autoGraphicsAPIs,
 | |
|                 () => PlayerSettings.GetUseDefaultGraphicsAPIs(EditorUserBuildSettings.activeBuildTarget),
 | |
|                 autoGraphicsAPIs =>
 | |
|                 {
 | |
|                     PlayerSettings.SetUseDefaultGraphicsAPIs(EditorUserBuildSettings.activeBuildTarget, autoGraphicsAPIs);
 | |
|                 }),
 | |
|             new TestSetting<string[]>(
 | |
|                 settings => settings.playerGraphicsAPIs,
 | |
|                 () => PlayerSettings.GetGraphicsAPIs(EditorUserBuildSettings.activeBuildTarget).Select(api => api.ToString()).ToArray(),
 | |
|                 playerGraphicsAPIs =>
 | |
|                 {
 | |
|                     if (playerGraphicsAPIs != null && playerGraphicsAPIs.Length > 0)
 | |
|                     {
 | |
|                         var graphicsAPIs = new List<GraphicsDeviceType>();
 | |
|                         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<bool?>(
 | |
|                 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<bool?>(
 | |
|                 settings => settings.featureFlags.requiresSplashScreen,
 | |
|                 () => PlayerSettings.SplashScreen.show,
 | |
|                 requiresSplashScreen =>
 | |
|                 {
 | |
|                     if (requiresSplashScreen != null)
 | |
|                     {
 | |
|                         PlayerSettings.SplashScreen.show = requiresSplashScreen.Value;
 | |
|                     }
 | |
|                 }),
 | |
|             new TestSetting<bool?>(
 | |
|                 settings => settings.featureFlags.requiresSplashScreen,
 | |
|                 () => PlayerSettings.SplashScreen.showUnityLogo,
 | |
|                 requiresSplashScreen =>
 | |
|                 {
 | |
|                     if (requiresSplashScreen != null)
 | |
|                     {
 | |
|                         PlayerSettings.SplashScreen.showUnityLogo = requiresSplashScreen.Value;
 | |
|                     }
 | |
|                 }),
 | |
| #if UNITY_2023_2_OR_NEWER
 | |
|             new TestSetting<WebGLClientBrowserType?>(
 | |
|                 settings => settings.webGLClientBrowserType,
 | |
|                 () => EditorUserBuildSettings.webGLClientBrowserType,
 | |
|                 browserType =>
 | |
|                 {
 | |
|                     if (browserType != null)
 | |
|                         EditorUserBuildSettings.webGLClientBrowserType = browserType.Value;
 | |
|                 }),
 | |
|             new TestSetting<string>(
 | |
|                 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<T> : TestSetting
 | |
|         {
 | |
|             private T m_ValueBeforeSetup;
 | |
|             private Func<TestSettings, T> m_GetFromSettings;
 | |
|             private Func<T> m_GetCurrentValue;
 | |
|             private Action<T> m_SetValue;
 | |
| 
 | |
|             public TestSetting(Func<TestSettings, T> getFromSettings, Func<T> getCurrentValue, Action<T> 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);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |