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