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}