No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TestSettings.cs 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEditor.Build;
  5. using UnityEditor.TestTools.TestRunner.Api;
  6. using UnityEngine.Rendering;
  7. using UnityEngine.TestRunner.NUnitExtensions.Runner;
  8. namespace UnityEditor.TestTools.TestRunner
  9. {
  10. internal class TestSettings : ITestSettings
  11. {
  12. private readonly TestSetting[] m_Settings =
  13. {
  14. #if UNITY_2021_2_OR_NEWER
  15. new TestSetting<ScriptingImplementation?>(
  16. settings => settings.scriptingBackend,
  17. () => PlayerSettings.GetScriptingBackend(NamedBuildTarget.FromBuildTargetGroup(EditorUserBuildSettings.activeBuildTargetGroup)),
  18. implementation => PlayerSettings.SetScriptingBackend(NamedBuildTarget.FromBuildTargetGroup(EditorUserBuildSettings.activeBuildTargetGroup), implementation.Value)),
  19. #else
  20. new TestSetting<ScriptingImplementation?>(
  21. settings => settings.scriptingBackend,
  22. () => PlayerSettings.GetScriptingBackend(EditorUserBuildSettings.activeBuildTargetGroup),
  23. implementation => PlayerSettings.SetScriptingBackend(EditorUserBuildSettings.activeBuildTargetGroup, implementation.Value)),
  24. #endif
  25. new TestSetting<string>(
  26. settings => settings.Architecture,
  27. () => EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android ? PlayerSettings.Android.targetArchitectures.ToString() : null,
  28. architecture =>
  29. {
  30. if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android)
  31. {
  32. if (!string.IsNullOrEmpty(architecture))
  33. {
  34. var targetArchitectures = (AndroidArchitecture)Enum.Parse(typeof(AndroidArchitecture), architecture, true);
  35. PlayerSettings.Android.targetArchitectures = targetArchitectures;
  36. }
  37. }
  38. }),
  39. #if UNITY_2021_2_OR_NEWER
  40. new TestSetting<ApiCompatibilityLevel?>(
  41. settings => settings.apiProfile,
  42. () => PlayerSettings.GetApiCompatibilityLevel(NamedBuildTarget.FromBuildTargetGroup(EditorUserBuildSettings.activeBuildTargetGroup)),
  43. implementation =>
  44. {
  45. if (Enum.IsDefined(typeof(ApiCompatibilityLevel), implementation.Value))
  46. {
  47. PlayerSettings.SetApiCompatibilityLevel(NamedBuildTarget.FromBuildTargetGroup(EditorUserBuildSettings.activeBuildTargetGroup),
  48. implementation.Value);
  49. }
  50. }),
  51. #else
  52. new TestSetting<ApiCompatibilityLevel?>(
  53. settings => settings.apiProfile,
  54. () => PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup),
  55. implementation =>
  56. {
  57. if (Enum.IsDefined(typeof(ApiCompatibilityLevel), implementation.Value))
  58. {
  59. PlayerSettings.SetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup,
  60. implementation.Value);
  61. }
  62. }),
  63. #endif
  64. new TestSetting<bool?>(
  65. settings => settings.appleEnableAutomaticSigning,
  66. () => PlayerSettings.iOS.appleEnableAutomaticSigning,
  67. enableAutomaticSigning =>
  68. {
  69. if (enableAutomaticSigning != null)
  70. PlayerSettings.iOS.appleEnableAutomaticSigning = enableAutomaticSigning.Value;
  71. }),
  72. new TestSetting<string>(
  73. settings => settings.appleDeveloperTeamID,
  74. () => PlayerSettings.iOS.appleDeveloperTeamID,
  75. developerTeam =>
  76. {
  77. if (developerTeam != null)
  78. PlayerSettings.iOS.appleDeveloperTeamID = developerTeam;
  79. }),
  80. new TestSetting<ProvisioningProfileType?>(
  81. settings => settings.iOSManualProvisioningProfileType,
  82. () => PlayerSettings.iOS.iOSManualProvisioningProfileType,
  83. profileType =>
  84. {
  85. if (profileType != null)
  86. PlayerSettings.iOS.iOSManualProvisioningProfileType = profileType.Value;
  87. }),
  88. new TestSetting<string>(
  89. settings => settings.iOSManualProvisioningProfileID,
  90. () => PlayerSettings.iOS.iOSManualProvisioningProfileID,
  91. provisioningUUID =>
  92. {
  93. if (provisioningUUID != null)
  94. PlayerSettings.iOS.iOSManualProvisioningProfileID = provisioningUUID;
  95. }),
  96. new TestSetting<string>(
  97. settings => settings.iOSTargetSDK,
  98. () => (PlayerSettings.iOS.sdkVersion).ToString(),
  99. targetSDK =>
  100. {
  101. if (targetSDK != null)
  102. {
  103. if (targetSDK == "DeviceSDK")
  104. PlayerSettings.iOS.sdkVersion = iOSSdkVersion.DeviceSDK;
  105. else if (targetSDK == "SimulatorSDK")
  106. PlayerSettings.iOS.sdkVersion = iOSSdkVersion.SimulatorSDK;
  107. }
  108. }),
  109. new TestSetting<ProvisioningProfileType?>(
  110. settings => settings.tvOSManualProvisioningProfileType,
  111. () => PlayerSettings.iOS.tvOSManualProvisioningProfileType,
  112. profileType =>
  113. {
  114. if (profileType != null)
  115. PlayerSettings.iOS.tvOSManualProvisioningProfileType = profileType.Value;
  116. }),
  117. new TestSetting<string>(
  118. settings => settings.tvOSManualProvisioningProfileID,
  119. () => PlayerSettings.iOS.tvOSManualProvisioningProfileID,
  120. provisioningUUID =>
  121. {
  122. if (provisioningUUID != null)
  123. PlayerSettings.iOS.tvOSManualProvisioningProfileID = provisioningUUID;
  124. }),
  125. new TestSetting<string>(
  126. settings => settings.tvOSTargetSDK,
  127. () => (PlayerSettings.tvOS.sdkVersion).ToString(),
  128. targetSDK =>
  129. {
  130. if (targetSDK != null)
  131. {
  132. if (targetSDK == "DeviceSDK" || targetSDK == "Device")
  133. PlayerSettings.tvOS.sdkVersion = tvOSSdkVersion.Device;
  134. else if (targetSDK == "SimulatorSDK" || targetSDK == "Simulator")
  135. PlayerSettings.tvOS.sdkVersion = tvOSSdkVersion.Simulator;
  136. }
  137. }),
  138. new TestSetting<bool>(
  139. settings => settings.autoGraphicsAPIs,
  140. () => PlayerSettings.GetUseDefaultGraphicsAPIs(EditorUserBuildSettings.activeBuildTarget),
  141. autoGraphicsAPIs =>
  142. {
  143. PlayerSettings.SetUseDefaultGraphicsAPIs(EditorUserBuildSettings.activeBuildTarget, autoGraphicsAPIs);
  144. }),
  145. new TestSetting<string[]>(
  146. settings => settings.playerGraphicsAPIs,
  147. () => PlayerSettings.GetGraphicsAPIs(EditorUserBuildSettings.activeBuildTarget).Select(api => api.ToString()).ToArray(),
  148. playerGraphicsAPIs =>
  149. {
  150. if (playerGraphicsAPIs != null && playerGraphicsAPIs.Length > 0)
  151. {
  152. var graphicsAPIs = new List<GraphicsDeviceType>();
  153. foreach (var graphicsAPI in playerGraphicsAPIs)
  154. {
  155. if (Enum.TryParse(graphicsAPI, true, out GraphicsDeviceType playerGraphicsAPI))
  156. graphicsAPIs.Add(playerGraphicsAPI);
  157. }
  158. if (graphicsAPIs.Count > 0)
  159. PlayerSettings.SetGraphicsAPIs(EditorUserBuildSettings.activeBuildTarget, graphicsAPIs.ToArray());
  160. }
  161. }),
  162. new TestSetting<bool?>(
  163. settings => settings.androidBuildAppBundle,
  164. () => EditorUserBuildSettings.buildAppBundle,
  165. androidAppBundle =>
  166. {
  167. EditorUserBuildSettings.buildAppBundle = androidAppBundle.Value;
  168. #if UNITY_2023_1_OR_NEWER
  169. PlayerSettings.Android.splitApplicationBinary = androidAppBundle.Value;
  170. #else
  171. PlayerSettings.Android.useAPKExpansionFiles = androidAppBundle.Value;
  172. #endif
  173. }),
  174. new TestSetting<bool?>(
  175. settings => settings.featureFlags.requiresSplashScreen,
  176. () => PlayerSettings.SplashScreen.show,
  177. requiresSplashScreen =>
  178. {
  179. if (requiresSplashScreen != null)
  180. {
  181. PlayerSettings.SplashScreen.show = requiresSplashScreen.Value;
  182. }
  183. }),
  184. new TestSetting<bool?>(
  185. settings => settings.featureFlags.requiresSplashScreen,
  186. () => PlayerSettings.SplashScreen.showUnityLogo,
  187. requiresSplashScreen =>
  188. {
  189. if (requiresSplashScreen != null)
  190. {
  191. PlayerSettings.SplashScreen.showUnityLogo = requiresSplashScreen.Value;
  192. }
  193. }),
  194. #if UNITY_2023_2_OR_NEWER
  195. new TestSetting<WebGLClientBrowserType?>(
  196. settings => settings.webGLClientBrowserType,
  197. () => EditorUserBuildSettings.webGLClientBrowserType,
  198. browserType =>
  199. {
  200. if (browserType != null)
  201. EditorUserBuildSettings.webGLClientBrowserType = browserType.Value;
  202. }),
  203. new TestSetting<string>(
  204. settings => settings.webGLClientBrowserPath,
  205. () => EditorUserBuildSettings.webGLClientBrowserPath,
  206. browserPath =>
  207. {
  208. if (!string.IsNullOrEmpty(browserPath))
  209. EditorUserBuildSettings.webGLClientBrowserPath = browserPath;
  210. }),
  211. #endif
  212. };
  213. private bool m_Disposed;
  214. public ScriptingImplementation? scriptingBackend { get; set; }
  215. public string Architecture { get; set; }
  216. public ApiCompatibilityLevel? apiProfile { get; set; }
  217. public bool? appleEnableAutomaticSigning { get; set; }
  218. public string appleDeveloperTeamID { get; set; }
  219. public ProvisioningProfileType? iOSManualProvisioningProfileType { get; set; }
  220. public string iOSManualProvisioningProfileID { get; set; }
  221. public string iOSTargetSDK { get; set; }
  222. public ProvisioningProfileType? tvOSManualProvisioningProfileType { get; set; }
  223. public string tvOSManualProvisioningProfileID { get; set; }
  224. public string tvOSTargetSDK { get; set; }
  225. public string[] playerGraphicsAPIs { get; set; }
  226. public bool autoGraphicsAPIs { get; set; }
  227. public bool? androidBuildAppBundle { get; set; }
  228. #if UNITY_2023_2_OR_NEWER
  229. public WebGLClientBrowserType? webGLClientBrowserType { get; set; }
  230. public string webGLClientBrowserPath { get; set; }
  231. #endif
  232. public IgnoreTest[] ignoreTests { get; set; }
  233. public FeatureFlags featureFlags { get; set; } = new FeatureFlags();
  234. public void Dispose()
  235. {
  236. if (!m_Disposed)
  237. {
  238. foreach (var testSetting in m_Settings)
  239. {
  240. testSetting.Cleanup();
  241. }
  242. m_Disposed = true;
  243. }
  244. }
  245. public void SetupProjectParameters()
  246. {
  247. foreach (var testSetting in m_Settings)
  248. {
  249. testSetting.Setup(this);
  250. }
  251. }
  252. private abstract class TestSetting
  253. {
  254. public abstract void Setup(TestSettings settings);
  255. public abstract void Cleanup();
  256. }
  257. private class TestSetting<T> : TestSetting
  258. {
  259. private T m_ValueBeforeSetup;
  260. private Func<TestSettings, T> m_GetFromSettings;
  261. private Func<T> m_GetCurrentValue;
  262. private Action<T> m_SetValue;
  263. public TestSetting(Func<TestSettings, T> getFromSettings, Func<T> getCurrentValue, Action<T> setValue)
  264. {
  265. m_GetFromSettings = getFromSettings;
  266. m_GetCurrentValue = getCurrentValue;
  267. m_SetValue = setValue;
  268. }
  269. public override void Setup(TestSettings settings)
  270. {
  271. m_ValueBeforeSetup = m_GetCurrentValue();
  272. var newValue = m_GetFromSettings(settings);
  273. if (newValue != null)
  274. {
  275. m_SetValue(newValue);
  276. }
  277. }
  278. public override void Cleanup()
  279. {
  280. m_SetValue(m_ValueBeforeSetup);
  281. }
  282. }
  283. }
  284. }