Commit af571a61 authored by BlackAngle233's avatar BlackAngle233
Browse files

212

parent 1d9b5391
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NUnit.Framework.Interfaces; using NUnit.Framework.Interfaces;
using UnityEngine.TestTools; using UnityEngine.TestTools;
using UnityEngine.TestTools.NUnitExtensions; using UnityEngine.TestTools.NUnitExtensions;
namespace UnityEditor.TestTools.TestRunner namespace UnityEditor.TestTools.TestRunner
{ {
internal class TestListProvider : ITestListProvider internal class TestListProvider : ITestListProvider
{ {
private readonly EditorLoadedTestAssemblyProvider m_AssemblyProvider; private readonly EditorLoadedTestAssemblyProvider m_AssemblyProvider;
private readonly UnityTestAssemblyBuilder m_AssemblyBuilder; private readonly UnityTestAssemblyBuilder m_AssemblyBuilder;
public TestListProvider(EditorLoadedTestAssemblyProvider assemblyProvider, UnityTestAssemblyBuilder assemblyBuilder) public TestListProvider(EditorLoadedTestAssemblyProvider assemblyProvider, UnityTestAssemblyBuilder assemblyBuilder)
{ {
m_AssemblyProvider = assemblyProvider; m_AssemblyProvider = assemblyProvider;
m_AssemblyBuilder = assemblyBuilder; m_AssemblyBuilder = assemblyBuilder;
} }
public IEnumerator<ITest> GetTestListAsync(TestPlatform platform) public IEnumerator<ITest> GetTestListAsync(TestPlatform platform)
{ {
var assembliesTask = m_AssemblyProvider.GetAssembliesGroupedByTypeAsync(platform); var assembliesTask = m_AssemblyProvider.GetAssembliesGroupedByTypeAsync(platform);
while (assembliesTask.MoveNext()) while (assembliesTask.MoveNext())
{ {
yield return null; yield return null;
} }
var assemblies = assembliesTask.Current.Where(pair => platform.IsFlagIncluded(pair.Key)) var assemblies = assembliesTask.Current.Where(pair => platform.IsFlagIncluded(pair.Key))
.SelectMany(pair => pair.Value.Select(assemblyInfo => Tuple.Create(assemblyInfo.Assembly, pair.Key))).ToArray(); .SelectMany(pair => pair.Value.Select(assemblyInfo => Tuple.Create(assemblyInfo.Assembly, pair.Key))).ToArray();
var settings = UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(platform); var settings = UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(platform);
var test = m_AssemblyBuilder.BuildAsync(assemblies.Select(a => a.Item1).ToArray(), assemblies.Select(a => a.Item2).ToArray(), settings); var test = m_AssemblyBuilder.BuildAsync(assemblies.Select(a => a.Item1).ToArray(), assemblies.Select(a => a.Item2).ToArray(), settings);
while (test.MoveNext()) while (test.MoveNext())
{ {
yield return null; yield return null;
} }
yield return test.Current; yield return test.Current;
} }
} }
} }
fileFormatVersion: 2 fileFormatVersion: 2
guid: f15cbb987069826429540d0ea0937442 guid: f15cbb987069826429540d0ea0937442
MonoImporter: MonoImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2
defaultReferences: [] defaultReferences: []
executionOrder: 0 executionOrder: 0
icon: {instanceID: 0} icon: {instanceID: 0}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
using System; using System;
using UnityEditor.Callbacks; using UnityEditor.Callbacks;
using UnityEditor.TestTools.TestRunner.Api; using UnityEditor.TestTools.TestRunner.Api;
using UnityEditor.TestTools.TestRunner.GUI; using UnityEditor.TestTools.TestRunner.GUI;
using UnityEngine; using UnityEngine;
namespace UnityEditor.TestTools.TestRunner namespace UnityEditor.TestTools.TestRunner
{ {
[Serializable] [Serializable]
internal class TestRunnerWindow : EditorWindow, IHasCustomMenu internal class TestRunnerWindow : EditorWindow, IHasCustomMenu
{ {
internal static class Styles internal static class Styles
{ {
public static GUIStyle info; public static GUIStyle info;
public static GUIStyle testList; public static GUIStyle testList;
static Styles() static Styles()
{ {
info = new GUIStyle(EditorStyles.wordWrappedLabel); info = new GUIStyle(EditorStyles.wordWrappedLabel);
info.wordWrap = false; info.wordWrap = false;
info.stretchHeight = true; info.stretchHeight = true;
info.margin.right = 15; info.margin.right = 15;
testList = new GUIStyle("CN Box"); testList = new GUIStyle("CN Box");
testList.margin.top = 0; testList.margin.top = 0;
testList.padding.left = 3; testList.padding.left = 3;
} }
} }
private readonly GUIContent m_GUIHorizontalSplit = EditorGUIUtility.TrTextContent("Horizontal layout"); private readonly GUIContent m_GUIHorizontalSplit = EditorGUIUtility.TrTextContent("Horizontal layout");
private readonly GUIContent m_GUIVerticalSplit = EditorGUIUtility.TrTextContent("Vertical layout"); private readonly GUIContent m_GUIVerticalSplit = EditorGUIUtility.TrTextContent("Vertical layout");
private readonly GUIContent m_GUIEnableaPlaymodeTestsRunner = EditorGUIUtility.TrTextContent("Enable playmode tests for all assemblies"); private readonly GUIContent m_GUIEnableaPlaymodeTestsRunner = EditorGUIUtility.TrTextContent("Enable playmode tests for all assemblies");
private readonly GUIContent m_GUIDisablePlaymodeTestsRunner = EditorGUIUtility.TrTextContent("Disable playmode tests for all assemblies"); private readonly GUIContent m_GUIDisablePlaymodeTestsRunner = EditorGUIUtility.TrTextContent("Disable playmode tests for all assemblies");
private readonly GUIContent m_GUIRunPlayModeTestAsEditModeTests = EditorGUIUtility.TrTextContent("Run playmode tests as editmode tests"); private readonly GUIContent m_GUIRunPlayModeTestAsEditModeTests = EditorGUIUtility.TrTextContent("Run playmode tests as editmode tests");
internal static TestRunnerWindow s_Instance; internal static TestRunnerWindow s_Instance;
private bool m_IsBuilding; private bool m_IsBuilding;
[NonSerialized] [NonSerialized]
private bool m_Enabled; private bool m_Enabled;
public TestFilterSettings filterSettings; public TestFilterSettings filterSettings;
[SerializeField] [SerializeField]
private SplitterState m_Spl = new SplitterState(new float[] { 75, 25 }, new[] { 32, 32 }, null); private SplitterState m_Spl = new SplitterState(new float[] { 75, 25 }, new[] { 32, 32 }, null);
private TestRunnerWindowSettings m_Settings; private TestRunnerWindowSettings m_Settings;
private enum TestRunnerMenuLabels private enum TestRunnerMenuLabels
{ {
PlayMode = 0, PlayMode = 0,
EditMode = 1 EditMode = 1
} }
[SerializeField] [SerializeField]
private int m_TestTypeToolbarIndex = (int)TestRunnerMenuLabels.EditMode; private int m_TestTypeToolbarIndex = (int)TestRunnerMenuLabels.EditMode;
[SerializeField] [SerializeField]
private PlayModeTestListGUI m_PlayModeTestListGUI; private PlayModeTestListGUI m_PlayModeTestListGUI;
[SerializeField] [SerializeField]
private EditModeTestListGUI m_EditModeTestListGUI; private EditModeTestListGUI m_EditModeTestListGUI;
internal TestListGUI m_SelectedTestTypes; internal TestListGUI m_SelectedTestTypes;
private ITestRunnerApi m_testRunnerApi; private ITestRunnerApi m_testRunnerApi;
private WindowResultUpdater m_WindowResultUpdater; private WindowResultUpdater m_WindowResultUpdater;
[MenuItem("Window/General/Test Runner", false, 201, false)] [MenuItem("Window/General/Test Runner", false, 201, false)]
public static void ShowPlaymodeTestsRunnerWindowCodeBased() public static void ShowPlaymodeTestsRunnerWindowCodeBased()
{ {
s_Instance = GetWindow<TestRunnerWindow>("Test Runner"); s_Instance = GetWindow<TestRunnerWindow>("Test Runner");
s_Instance.Show(); s_Instance.Show();
} }
static TestRunnerWindow() static TestRunnerWindow()
{ {
InitBackgroundRunners(); InitBackgroundRunners();
} }
private static void InitBackgroundRunners() private static void InitBackgroundRunners()
{ {
EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;
EditorApplication.playModeStateChanged += OnPlayModeStateChanged; EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
} }
[DidReloadScripts] [DidReloadScripts]
private static void CompilationCallback() private static void CompilationCallback()
{ {
UpdateWindow(); UpdateWindow();
} }
private static void OnPlayModeStateChanged(PlayModeStateChange state) private static void OnPlayModeStateChanged(PlayModeStateChange state)
{ {
if (s_Instance && state == PlayModeStateChange.EnteredEditMode && s_Instance.m_SelectedTestTypes.HasTreeData()) if (s_Instance && state == PlayModeStateChange.EnteredEditMode && s_Instance.m_SelectedTestTypes.HasTreeData())
{ {
//repaint message details after exit playmode //repaint message details after exit playmode
s_Instance.m_SelectedTestTypes.TestSelectionCallback(s_Instance.m_SelectedTestTypes.m_TestListState.selectedIDs.ToArray()); s_Instance.m_SelectedTestTypes.TestSelectionCallback(s_Instance.m_SelectedTestTypes.m_TestListState.selectedIDs.ToArray());
s_Instance.Repaint(); s_Instance.Repaint();
} }
} }
public void OnDestroy() public void OnDestroy()
{ {
EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;
} }
private void OnEnable() private void OnEnable()
{ {
s_Instance = this; s_Instance = this;
SelectTestListGUI(m_TestTypeToolbarIndex); SelectTestListGUI(m_TestTypeToolbarIndex);
m_testRunnerApi = ScriptableObject.CreateInstance<TestRunnerApi>(); m_testRunnerApi = ScriptableObject.CreateInstance<TestRunnerApi>();
m_WindowResultUpdater = new WindowResultUpdater(); m_WindowResultUpdater = new WindowResultUpdater();
m_testRunnerApi.RegisterCallbacks(m_WindowResultUpdater); m_testRunnerApi.RegisterCallbacks(m_WindowResultUpdater);
} }
private void Enable() private void Enable()
{ {
m_Settings = new TestRunnerWindowSettings("UnityEditor.PlaymodeTestsRunnerWindow"); m_Settings = new TestRunnerWindowSettings("UnityEditor.PlaymodeTestsRunnerWindow");
filterSettings = new TestFilterSettings("UnityTest.IntegrationTestsRunnerWindow"); filterSettings = new TestFilterSettings("UnityTest.IntegrationTestsRunnerWindow");
if (m_SelectedTestTypes == null) if (m_SelectedTestTypes == null)
{ {
SelectTestListGUI(m_TestTypeToolbarIndex); SelectTestListGUI(m_TestTypeToolbarIndex);
} }
StartRetrieveTestList(); StartRetrieveTestList();
m_SelectedTestTypes.Reload(); m_SelectedTestTypes.Reload();
m_Enabled = true; m_Enabled = true;
} }
private void SelectTestListGUI(int testTypeToolbarIndex) private void SelectTestListGUI(int testTypeToolbarIndex)
{ {
if (testTypeToolbarIndex == (int)TestRunnerMenuLabels.PlayMode) if (testTypeToolbarIndex == (int)TestRunnerMenuLabels.PlayMode)
{ {
if (m_PlayModeTestListGUI == null) if (m_PlayModeTestListGUI == null)
{ {
m_PlayModeTestListGUI = new PlayModeTestListGUI(); m_PlayModeTestListGUI = new PlayModeTestListGUI();
} }
m_SelectedTestTypes = m_PlayModeTestListGUI; m_SelectedTestTypes = m_PlayModeTestListGUI;
} }
else if (testTypeToolbarIndex == (int)TestRunnerMenuLabels.EditMode) else if (testTypeToolbarIndex == (int)TestRunnerMenuLabels.EditMode)
{ {
if (m_EditModeTestListGUI == null) if (m_EditModeTestListGUI == null)
{ {
m_EditModeTestListGUI = new EditModeTestListGUI(); m_EditModeTestListGUI = new EditModeTestListGUI();
} }
m_SelectedTestTypes = m_EditModeTestListGUI; m_SelectedTestTypes = m_EditModeTestListGUI;
} }
} }
private void StartRetrieveTestList() private void StartRetrieveTestList()
{ {
if (!m_SelectedTestTypes.HasTreeData()) if (!m_SelectedTestTypes.HasTreeData())
{ {
m_testRunnerApi.RetrieveTestList(m_SelectedTestTypes.TestMode, (rootTest) => m_testRunnerApi.RetrieveTestList(m_SelectedTestTypes.TestMode, (rootTest) =>
{ {
m_SelectedTestTypes.Init(this, rootTest); m_SelectedTestTypes.Init(this, rootTest);
m_SelectedTestTypes.Reload(); m_SelectedTestTypes.Reload();
}); });
} }
} }
public void OnGUI() public void OnGUI()
{ {
if (!m_Enabled) if (!m_Enabled)
{ {
Enable(); Enable();
} }
if (BuildPipeline.isBuildingPlayer) if (BuildPipeline.isBuildingPlayer)
{ {
m_IsBuilding = true; m_IsBuilding = true;
} }
else if (m_IsBuilding) else if (m_IsBuilding)
{ {
m_IsBuilding = false; m_IsBuilding = false;
Repaint(); Repaint();
} }
EditorGUILayout.BeginHorizontal(); EditorGUILayout.BeginHorizontal();
GUILayout.FlexibleSpace(); GUILayout.FlexibleSpace();
var selectedIndex = m_TestTypeToolbarIndex; var selectedIndex = m_TestTypeToolbarIndex;
m_TestTypeToolbarIndex = GUILayout.Toolbar(m_TestTypeToolbarIndex, Enum.GetNames(typeof(TestRunnerMenuLabels)), "LargeButton", UnityEngine.GUI.ToolbarButtonSize.FitToContents); m_TestTypeToolbarIndex = GUILayout.Toolbar(m_TestTypeToolbarIndex, Enum.GetNames(typeof(TestRunnerMenuLabels)), "LargeButton", UnityEngine.GUI.ToolbarButtonSize.FitToContents);
GUILayout.FlexibleSpace(); GUILayout.FlexibleSpace();
EditorGUILayout.EndHorizontal(); EditorGUILayout.EndHorizontal();
if (selectedIndex != m_TestTypeToolbarIndex) if (selectedIndex != m_TestTypeToolbarIndex)
{ {
SelectTestListGUI(m_TestTypeToolbarIndex); SelectTestListGUI(m_TestTypeToolbarIndex);
StartRetrieveTestList(); StartRetrieveTestList();
} }
EditorGUILayout.BeginVertical(); EditorGUILayout.BeginVertical();
using (new EditorGUI.DisabledScope(EditorApplication.isPlayingOrWillChangePlaymode)) using (new EditorGUI.DisabledScope(EditorApplication.isPlayingOrWillChangePlaymode))
{ {
m_SelectedTestTypes.PrintHeadPanel(); m_SelectedTestTypes.PrintHeadPanel();
} }
EditorGUILayout.EndVertical(); EditorGUILayout.EndVertical();
if (m_Settings.verticalSplit) if (m_Settings.verticalSplit)
SplitterGUILayout.BeginVerticalSplit(m_Spl); SplitterGUILayout.BeginVerticalSplit(m_Spl);
else else
SplitterGUILayout.BeginHorizontalSplit(m_Spl); SplitterGUILayout.BeginHorizontalSplit(m_Spl);
EditorGUILayout.BeginVertical(); EditorGUILayout.BeginVertical();
EditorGUILayout.BeginVertical(Styles.testList); EditorGUILayout.BeginVertical(Styles.testList);
m_SelectedTestTypes.RenderTestList(); m_SelectedTestTypes.RenderTestList();
EditorGUILayout.EndVertical(); EditorGUILayout.EndVertical();
EditorGUILayout.EndVertical(); EditorGUILayout.EndVertical();
m_SelectedTestTypes.RenderDetails(); m_SelectedTestTypes.RenderDetails();
if (m_Settings.verticalSplit) if (m_Settings.verticalSplit)
SplitterGUILayout.EndVerticalSplit(); SplitterGUILayout.EndVerticalSplit();
else else
SplitterGUILayout.EndHorizontalSplit(); SplitterGUILayout.EndHorizontalSplit();
} }
public void AddItemsToMenu(GenericMenu menu) public void AddItemsToMenu(GenericMenu menu)
{ {
menu.AddItem(m_GUIVerticalSplit, m_Settings.verticalSplit, m_Settings.ToggleVerticalSplit); menu.AddItem(m_GUIVerticalSplit, m_Settings.verticalSplit, m_Settings.ToggleVerticalSplit);
menu.AddItem(m_GUIHorizontalSplit, !m_Settings.verticalSplit, m_Settings.ToggleVerticalSplit); menu.AddItem(m_GUIHorizontalSplit, !m_Settings.verticalSplit, m_Settings.ToggleVerticalSplit);
menu.AddSeparator(null); menu.AddSeparator(null);
var playModeTestRunnerEnabled = PlayerSettings.playModeTestRunnerEnabled; var playModeTestRunnerEnabled = PlayerSettings.playModeTestRunnerEnabled;
var currentActive = playModeTestRunnerEnabled ? m_GUIDisablePlaymodeTestsRunner : m_GUIEnableaPlaymodeTestsRunner; var currentActive = playModeTestRunnerEnabled ? m_GUIDisablePlaymodeTestsRunner : m_GUIEnableaPlaymodeTestsRunner;
if (EditorPrefs.GetBool("InternalMode", false)) if (EditorPrefs.GetBool("InternalMode", false))
{ {
menu.AddItem(m_GUIRunPlayModeTestAsEditModeTests, PlayerSettings.runPlayModeTestAsEditModeTest, () => menu.AddItem(m_GUIRunPlayModeTestAsEditModeTests, PlayerSettings.runPlayModeTestAsEditModeTest, () =>
{ {
PlayerSettings.runPlayModeTestAsEditModeTest = !PlayerSettings.runPlayModeTestAsEditModeTest; PlayerSettings.runPlayModeTestAsEditModeTest = !PlayerSettings.runPlayModeTestAsEditModeTest;
}); });
} }
menu.AddItem(currentActive, false, () => menu.AddItem(currentActive, false, () =>
{ {
PlayerSettings.playModeTestRunnerEnabled = !playModeTestRunnerEnabled; PlayerSettings.playModeTestRunnerEnabled = !playModeTestRunnerEnabled;
EditorUtility.DisplayDialog(currentActive.text, "You need to restart the editor now", "Ok"); EditorUtility.DisplayDialog(currentActive.text, "You need to restart the editor now", "Ok");
}); });
} }
public void RebuildUIFilter() public void RebuildUIFilter()
{ {
if (m_SelectedTestTypes != null && m_SelectedTestTypes.HasTreeData()) if (m_SelectedTestTypes != null && m_SelectedTestTypes.HasTreeData())
{ {
m_SelectedTestTypes.RebuildUIFilter(); m_SelectedTestTypes.RebuildUIFilter();
} }
} }
public static void UpdateWindow() public static void UpdateWindow()
{ {
if (s_Instance != null && s_Instance.m_SelectedTestTypes != null) if (s_Instance != null && s_Instance.m_SelectedTestTypes != null)
{ {
s_Instance.m_SelectedTestTypes.Repaint(); s_Instance.m_SelectedTestTypes.Repaint();
s_Instance.Repaint(); s_Instance.Repaint();
} }
} }
} }
} }
fileFormatVersion: 2 fileFormatVersion: 2
guid: 4dfcd3a631f61d248b7cc0b845d40345 guid: 4dfcd3a631f61d248b7cc0b845d40345
MonoImporter: MonoImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2
defaultReferences: [] defaultReferences: []
executionOrder: 0 executionOrder: 0
icon: {instanceID: 0} icon: {instanceID: 0}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
namespace UnityEditor.TestTools.TestRunner namespace UnityEditor.TestTools.TestRunner
{ {
internal class TestRunnerWindowSettings internal class TestRunnerWindowSettings
{ {
public bool verticalSplit; public bool verticalSplit;
private readonly string m_PrefsKey; private readonly string m_PrefsKey;
public TestRunnerWindowSettings(string prefsKey) public TestRunnerWindowSettings(string prefsKey)
{ {
m_PrefsKey = prefsKey; m_PrefsKey = prefsKey;
verticalSplit = EditorPrefs.GetBool(m_PrefsKey + ".verticalSplit", true); verticalSplit = EditorPrefs.GetBool(m_PrefsKey + ".verticalSplit", true);
} }
public void ToggleVerticalSplit() public void ToggleVerticalSplit()
{ {
verticalSplit = !verticalSplit; verticalSplit = !verticalSplit;
Save(); Save();
} }
private void Save() private void Save()
{ {
EditorPrefs.SetBool(m_PrefsKey + ".verticalSplit", verticalSplit); EditorPrefs.SetBool(m_PrefsKey + ".verticalSplit", verticalSplit);
} }
} }
} }
fileFormatVersion: 2 fileFormatVersion: 2
guid: 2b301b727225f1941974d69e61a55620 guid: 2b301b727225f1941974d69e61a55620
MonoImporter: MonoImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2
defaultReferences: [] defaultReferences: []
executionOrder: 0 executionOrder: 0
icon: {instanceID: 0} icon: {instanceID: 0}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
fileFormatVersion: 2 fileFormatVersion: 2
guid: 95b719082a664ea45bb56759eed1f271 guid: 95b719082a664ea45bb56759eed1f271
folderAsset: yes folderAsset: yes
DefaultImporter: DefaultImporter:
externalObjects: {} externalObjects: {}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
using System; using System;
namespace UnityEditor.TestTools.TestRunner namespace UnityEditor.TestTools.TestRunner
{ {
internal interface ITestSettings : IDisposable internal interface ITestSettings : IDisposable
{ {
ScriptingImplementation? scriptingBackend { get; set; } ScriptingImplementation? scriptingBackend { get; set; }
string Architecture { get; set; } string Architecture { get; set; }
ApiCompatibilityLevel? apiProfile { get; set; } ApiCompatibilityLevel? apiProfile { get; set; }
bool? appleEnableAutomaticSigning { get; set; } bool? appleEnableAutomaticSigning { get; set; }
string appleDeveloperTeamID { get; set; } string appleDeveloperTeamID { get; set; }
ProvisioningProfileType? iOSManualProvisioningProfileType { get; set; } ProvisioningProfileType? iOSManualProvisioningProfileType { get; set; }
string iOSManualProvisioningProfileID { get; set; } string iOSManualProvisioningProfileID { get; set; }
ProvisioningProfileType? tvOSManualProvisioningProfileType { get; set; } ProvisioningProfileType? tvOSManualProvisioningProfileType { get; set; }
string tvOSManualProvisioningProfileID { get; set; } string tvOSManualProvisioningProfileID { get; set; }
void SetupProjectParameters(); void SetupProjectParameters();
} }
} }
fileFormatVersion: 2 fileFormatVersion: 2
guid: 83eda34b7da01e04aa894f268158b0c0 guid: 83eda34b7da01e04aa894f268158b0c0
MonoImporter: MonoImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2
defaultReferences: [] defaultReferences: []
executionOrder: 0 executionOrder: 0
icon: {instanceID: 0} icon: {instanceID: 0}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
namespace UnityEditor.TestTools.TestRunner namespace UnityEditor.TestTools.TestRunner
{ {
interface ITestSettingsDeserializer interface ITestSettingsDeserializer
{ {
ITestSettings GetSettingsFromJsonFile(string jsonFilePath); ITestSettings GetSettingsFromJsonFile(string jsonFilePath);
} }
} }
fileFormatVersion: 2 fileFormatVersion: 2
guid: d208a1684f8aa6a40ad91d6aa9600c14 guid: d208a1684f8aa6a40ad91d6aa9600c14
MonoImporter: MonoImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2
defaultReferences: [] defaultReferences: []
executionOrder: 0 executionOrder: 0
icon: {instanceID: 0} icon: {instanceID: 0}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
using System; using System;
namespace UnityEditor.TestTools.TestRunner namespace UnityEditor.TestTools.TestRunner
{ {
internal class TestSettings : ITestSettings internal class TestSettings : ITestSettings
{ {
private readonly TestSetting[] m_Settings = private readonly TestSetting[] m_Settings =
{ {
new TestSetting<ScriptingImplementation?>( new TestSetting<ScriptingImplementation?>(
settings => settings.scriptingBackend, settings => settings.scriptingBackend,
() => PlayerSettings.GetScriptingBackend(EditorUserBuildSettings.activeBuildTargetGroup), () => PlayerSettings.GetScriptingBackend(EditorUserBuildSettings.activeBuildTargetGroup),
implementation => PlayerSettings.SetScriptingBackend(EditorUserBuildSettings.activeBuildTargetGroup, implementation.Value)), implementation => PlayerSettings.SetScriptingBackend(EditorUserBuildSettings.activeBuildTargetGroup, implementation.Value)),
new TestSetting<string>( new TestSetting<string>(
settings => settings.Architecture, settings => settings.Architecture,
() => EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android ? PlayerSettings.Android.targetArchitectures.ToString() : null, () => EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android ? PlayerSettings.Android.targetArchitectures.ToString() : null,
architecture => architecture =>
{ {
if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android) if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android)
{ {
if (!string.IsNullOrEmpty(architecture)) if (!string.IsNullOrEmpty(architecture))
{ {
var targetArchitectures = (AndroidArchitecture)Enum.Parse(typeof(AndroidArchitecture), architecture, true); var targetArchitectures = (AndroidArchitecture)Enum.Parse(typeof(AndroidArchitecture), architecture, true);
PlayerSettings.Android.targetArchitectures = targetArchitectures; PlayerSettings.Android.targetArchitectures = targetArchitectures;
} }
} }
}), }),
new TestSetting<ApiCompatibilityLevel?>( new TestSetting<ApiCompatibilityLevel?>(
settings => settings.apiProfile, settings => settings.apiProfile,
() => PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup), () => PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup),
implementation => implementation =>
{ {
if (Enum.IsDefined(typeof(ApiCompatibilityLevel), implementation.Value)) if (Enum.IsDefined(typeof(ApiCompatibilityLevel), implementation.Value))
{ {
PlayerSettings.SetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup, PlayerSettings.SetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup,
implementation.Value); implementation.Value);
} }
}), }),
new TestSetting<bool?>( new TestSetting<bool?>(
settings => settings.appleEnableAutomaticSigning, settings => settings.appleEnableAutomaticSigning,
() => PlayerSettings.iOS.appleEnableAutomaticSigning, () => PlayerSettings.iOS.appleEnableAutomaticSigning,
enableAutomaticSigning => enableAutomaticSigning =>
{ {
if (enableAutomaticSigning != null) if (enableAutomaticSigning != null)
PlayerSettings.iOS.appleEnableAutomaticSigning = enableAutomaticSigning.Value; PlayerSettings.iOS.appleEnableAutomaticSigning = enableAutomaticSigning.Value;
}), }),
new TestSetting<string>( new TestSetting<string>(
settings => settings.appleDeveloperTeamID, settings => settings.appleDeveloperTeamID,
() => PlayerSettings.iOS.appleDeveloperTeamID, () => PlayerSettings.iOS.appleDeveloperTeamID,
developerTeam => developerTeam =>
{ {
if (developerTeam != null) if (developerTeam != null)
PlayerSettings.iOS.appleDeveloperTeamID = developerTeam; PlayerSettings.iOS.appleDeveloperTeamID = developerTeam;
}), }),
new TestSetting<ProvisioningProfileType?>( new TestSetting<ProvisioningProfileType?>(
settings => settings.iOSManualProvisioningProfileType, settings => settings.iOSManualProvisioningProfileType,
() => PlayerSettings.iOS.iOSManualProvisioningProfileType, () => PlayerSettings.iOS.iOSManualProvisioningProfileType,
profileType => profileType =>
{ {
if (profileType != null) if (profileType != null)
PlayerSettings.iOS.iOSManualProvisioningProfileType = profileType.Value; PlayerSettings.iOS.iOSManualProvisioningProfileType = profileType.Value;
}), }),
new TestSetting<string>( new TestSetting<string>(
settings => settings.iOSManualProvisioningProfileID, settings => settings.iOSManualProvisioningProfileID,
() => PlayerSettings.iOS.iOSManualProvisioningProfileID, () => PlayerSettings.iOS.iOSManualProvisioningProfileID,
provisioningUUID => provisioningUUID =>
{ {
if (provisioningUUID != null) if (provisioningUUID != null)
PlayerSettings.iOS.iOSManualProvisioningProfileID = provisioningUUID; PlayerSettings.iOS.iOSManualProvisioningProfileID = provisioningUUID;
}), }),
new TestSetting<ProvisioningProfileType?>( new TestSetting<ProvisioningProfileType?>(
settings => settings.tvOSManualProvisioningProfileType, settings => settings.tvOSManualProvisioningProfileType,
() => PlayerSettings.iOS.tvOSManualProvisioningProfileType, () => PlayerSettings.iOS.tvOSManualProvisioningProfileType,
profileType => profileType =>
{ {
if (profileType != null) if (profileType != null)
PlayerSettings.iOS.tvOSManualProvisioningProfileType = profileType.Value; PlayerSettings.iOS.tvOSManualProvisioningProfileType = profileType.Value;
}), }),
new TestSetting<string>( new TestSetting<string>(
settings => settings.tvOSManualProvisioningProfileID, settings => settings.tvOSManualProvisioningProfileID,
() => PlayerSettings.iOS.tvOSManualProvisioningProfileID, () => PlayerSettings.iOS.tvOSManualProvisioningProfileID,
provisioningUUID => provisioningUUID =>
{ {
if (provisioningUUID != null) if (provisioningUUID != null)
PlayerSettings.iOS.tvOSManualProvisioningProfileID = provisioningUUID; PlayerSettings.iOS.tvOSManualProvisioningProfileID = provisioningUUID;
}), }),
}; };
private bool m_Disposed; private bool m_Disposed;
public ScriptingImplementation? scriptingBackend { get; set; } public ScriptingImplementation? scriptingBackend { get; set; }
public string Architecture { get; set; } public string Architecture { get; set; }
public ApiCompatibilityLevel? apiProfile { get; set; } public ApiCompatibilityLevel? apiProfile { get; set; }
public bool? appleEnableAutomaticSigning { get; set; } public bool? appleEnableAutomaticSigning { get; set; }
public string appleDeveloperTeamID { get; set; } public string appleDeveloperTeamID { get; set; }
public ProvisioningProfileType? iOSManualProvisioningProfileType { get; set; } public ProvisioningProfileType? iOSManualProvisioningProfileType { get; set; }
public string iOSManualProvisioningProfileID { get; set; } public string iOSManualProvisioningProfileID { get; set; }
public ProvisioningProfileType? tvOSManualProvisioningProfileType { get; set; } public ProvisioningProfileType? tvOSManualProvisioningProfileType { get; set; }
public string tvOSManualProvisioningProfileID { get; set; } public string tvOSManualProvisioningProfileID { get; set; }
public void Dispose() public void Dispose()
{ {
if (!m_Disposed) if (!m_Disposed)
{ {
foreach (var testSetting in m_Settings) foreach (var testSetting in m_Settings)
{ {
testSetting.Cleanup(); testSetting.Cleanup();
} }
m_Disposed = true; m_Disposed = true;
} }
} }
public void SetupProjectParameters() public void SetupProjectParameters()
{ {
foreach (var testSetting in m_Settings) foreach (var testSetting in m_Settings)
{ {
testSetting.Setup(this); testSetting.Setup(this);
} }
} }
private abstract class TestSetting private abstract class TestSetting
{ {
public abstract void Setup(TestSettings settings); public abstract void Setup(TestSettings settings);
public abstract void Cleanup(); public abstract void Cleanup();
} }
private class TestSetting<T> : TestSetting private class TestSetting<T> : TestSetting
{ {
private T m_ValueBeforeSetup; private T m_ValueBeforeSetup;
private Func<TestSettings, T> m_GetFromSettings; private Func<TestSettings, T> m_GetFromSettings;
private Func<T> m_GetCurrentValue; private Func<T> m_GetCurrentValue;
private Action<T> m_SetValue; private Action<T> m_SetValue;
public TestSetting(Func<TestSettings, T> getFromSettings, Func<T> getCurrentValue, Action<T> setValue) public TestSetting(Func<TestSettings, T> getFromSettings, Func<T> getCurrentValue, Action<T> setValue)
{ {
m_GetFromSettings = getFromSettings; m_GetFromSettings = getFromSettings;
m_GetCurrentValue = getCurrentValue; m_GetCurrentValue = getCurrentValue;
m_SetValue = setValue; m_SetValue = setValue;
} }
public override void Setup(TestSettings settings) public override void Setup(TestSettings settings)
{ {
m_ValueBeforeSetup = m_GetCurrentValue(); m_ValueBeforeSetup = m_GetCurrentValue();
var newValue = m_GetFromSettings(settings); var newValue = m_GetFromSettings(settings);
if (newValue != null) if (newValue != null)
{ {
m_SetValue(newValue); m_SetValue(newValue);
} }
} }
public override void Cleanup() public override void Cleanup()
{ {
m_SetValue(m_ValueBeforeSetup); m_SetValue(m_ValueBeforeSetup);
} }
} }
} }
} }
fileFormatVersion: 2 fileFormatVersion: 2
guid: 6b32b6725087a0d4bb1670818d26996e guid: 6b32b6725087a0d4bb1670818d26996e
MonoImporter: MonoImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2
defaultReferences: [] defaultReferences: []
executionOrder: 0 executionOrder: 0
icon: {instanceID: 0} icon: {instanceID: 0}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using UnityEngine; using UnityEngine;
namespace UnityEditor.TestTools.TestRunner namespace UnityEditor.TestTools.TestRunner
{ {
/// <summary> /// <summary>
/// Handles deserialization of TestSettings from a provided json file path. /// Handles deserialization of TestSettings from a provided json file path.
/// </summary> /// </summary>
internal class TestSettingsDeserializer : ITestSettingsDeserializer internal class TestSettingsDeserializer : ITestSettingsDeserializer
{ {
private static readonly SettingsMap[] s_SettingsMapping = private static readonly SettingsMap[] s_SettingsMapping =
{ {
new SettingsMap<ScriptingImplementation>("scriptingBackend", (settings, value) => settings.scriptingBackend = value), new SettingsMap<ScriptingImplementation>("scriptingBackend", (settings, value) => settings.scriptingBackend = value),
new SettingsMap<string>("architecture", (settings, value) => settings.Architecture = value), new SettingsMap<string>("architecture", (settings, value) => settings.Architecture = value),
new SettingsMap<ApiCompatibilityLevel>("apiProfile", (settings, value) => settings.apiProfile = value), new SettingsMap<ApiCompatibilityLevel>("apiProfile", (settings, value) => settings.apiProfile = value),
new SettingsMap<bool>("appleEnableAutomaticSigning", (settings, value) => settings.appleEnableAutomaticSigning = value), new SettingsMap<bool>("appleEnableAutomaticSigning", (settings, value) => settings.appleEnableAutomaticSigning = value),
new SettingsMap<string>("appleDeveloperTeamID", (settings, value) => settings.appleDeveloperTeamID = value), new SettingsMap<string>("appleDeveloperTeamID", (settings, value) => settings.appleDeveloperTeamID = value),
new SettingsMap<ProvisioningProfileType>("iOSManualProvisioningProfileType", (settings, value) => settings.iOSManualProvisioningProfileType = value), new SettingsMap<ProvisioningProfileType>("iOSManualProvisioningProfileType", (settings, value) => settings.iOSManualProvisioningProfileType = value),
new SettingsMap<string>("iOSManualProvisioningProfileID", (settings, value) => settings.iOSManualProvisioningProfileID = value), new SettingsMap<string>("iOSManualProvisioningProfileID", (settings, value) => settings.iOSManualProvisioningProfileID = value),
new SettingsMap<ProvisioningProfileType>("tvOSManualProvisioningProfileType", (settings, value) => settings.tvOSManualProvisioningProfileType = value), new SettingsMap<ProvisioningProfileType>("tvOSManualProvisioningProfileType", (settings, value) => settings.tvOSManualProvisioningProfileType = value),
new SettingsMap<string>("tvOSManualProvisioningProfileID", (settings, value) => settings.tvOSManualProvisioningProfileID = value), new SettingsMap<string>("tvOSManualProvisioningProfileID", (settings, value) => settings.tvOSManualProvisioningProfileID = value),
}; };
private readonly Func<ITestSettings> m_TestSettingsFactory; private readonly Func<ITestSettings> m_TestSettingsFactory;
public TestSettingsDeserializer(Func<ITestSettings> testSettingsFactory) public TestSettingsDeserializer(Func<ITestSettings> testSettingsFactory)
{ {
m_TestSettingsFactory = testSettingsFactory; m_TestSettingsFactory = testSettingsFactory;
} }
public ITestSettings GetSettingsFromJsonFile(string jsonFilePath) public ITestSettings GetSettingsFromJsonFile(string jsonFilePath)
{ {
var text = File.ReadAllText(jsonFilePath); var text = File.ReadAllText(jsonFilePath);
var settingsDictionary = Json.Deserialize(text) as Dictionary<string, object>; var settingsDictionary = Json.Deserialize(text) as Dictionary<string, object>;
var testSettings = m_TestSettingsFactory(); var testSettings = m_TestSettingsFactory();
if (settingsDictionary == null) if (settingsDictionary == null)
{ {
return testSettings; return testSettings;
} }
foreach (var settingsMap in s_SettingsMapping) foreach (var settingsMap in s_SettingsMapping)
{ {
if (!settingsDictionary.ContainsKey(settingsMap.Key)) if (!settingsDictionary.ContainsKey(settingsMap.Key))
{ {
continue; continue;
} }
if (settingsMap.Type.IsEnum) if (settingsMap.Type.IsEnum)
{ {
SetEnumValue(settingsMap.Key, settingsDictionary[settingsMap.Key], settingsMap.Type, value => settingsMap.ApplyToSettings(testSettings, value)); SetEnumValue(settingsMap.Key, settingsDictionary[settingsMap.Key], settingsMap.Type, value => settingsMap.ApplyToSettings(testSettings, value));
} }
else else
{ {
SetValue(settingsMap.Key, settingsDictionary[settingsMap.Key], settingsMap.Type, value => settingsMap.ApplyToSettings(testSettings, value)); SetValue(settingsMap.Key, settingsDictionary[settingsMap.Key], settingsMap.Type, value => settingsMap.ApplyToSettings(testSettings, value));
} }
} }
return testSettings; return testSettings;
} }
private abstract class SettingsMap private abstract class SettingsMap
{ {
public string Key { get; } public string Key { get; }
public Type Type { get; } public Type Type { get; }
protected SettingsMap(string key, Type type) protected SettingsMap(string key, Type type)
{ {
Key = key; Key = key;
Type = type; Type = type;
} }
public abstract void ApplyToSettings(ITestSettings settings, object value); public abstract void ApplyToSettings(ITestSettings settings, object value);
} }
private class SettingsMap<T> : SettingsMap private class SettingsMap<T> : SettingsMap
{ {
private Action<ITestSettings, T> m_Setter; private Action<ITestSettings, T> m_Setter;
public SettingsMap(string key, Action<ITestSettings, T> setter) : base(key, typeof(T)) public SettingsMap(string key, Action<ITestSettings, T> setter) : base(key, typeof(T))
{ {
m_Setter = setter; m_Setter = setter;
} }
public override void ApplyToSettings(ITestSettings settings, object value) public override void ApplyToSettings(ITestSettings settings, object value)
{ {
m_Setter(settings, (T)value); m_Setter(settings, (T)value);
} }
} }
private static void SetEnumValue(string key, object value, Type type, Action<object> setter) private static void SetEnumValue(string key, object value, Type type, Action<object> setter)
{ {
object enumValue; object enumValue;
if (TryGetEnum(value as string, type, out enumValue)) if (TryGetEnum(value as string, type, out enumValue))
{ {
setter(enumValue); setter(enumValue);
return; return;
} }
var acceptedValues = string.Join(", ", Enum.GetValues(type).OfType<object>().Select(val => val.ToString()).ToArray()); var acceptedValues = string.Join(", ", Enum.GetValues(type).OfType<object>().Select(val => val.ToString()).ToArray());
Debug.LogFormat("Could not convert '{0}' argument '{1}' to a valid {2}. Accepted values: {3}.", key, value, type.Name, acceptedValues); Debug.LogFormat("Could not convert '{0}' argument '{1}' to a valid {2}. Accepted values: {3}.", key, value, type.Name, acceptedValues);
} }
private static bool TryGetEnum(string value, Type type, out object enumValue) private static bool TryGetEnum(string value, Type type, out object enumValue)
{ {
try try
{ {
enumValue = Enum.Parse(type, value, true); enumValue = Enum.Parse(type, value, true);
return true; return true;
} }
catch (Exception) catch (Exception)
{ {
enumValue = null; enumValue = null;
return false; return false;
} }
} }
private static void SetValue(string key, object value, Type type, Action<object> setter) private static void SetValue(string key, object value, Type type, Action<object> setter)
{ {
if (type.IsInstanceOfType(value)) if (type.IsInstanceOfType(value))
{ {
setter(value); setter(value);
return; return;
} }
Debug.LogFormat("Could not convert '{0}' argument '{1}' to a valid {2}.", key, value, type.Name); Debug.LogFormat("Could not convert '{0}' argument '{1}' to a valid {2}.", key, value, type.Name);
} }
} }
} }
fileFormatVersion: 2 fileFormatVersion: 2
guid: 75e7d7a9a57458841a85fe42d9c9141f guid: 75e7d7a9a57458841a85fe42d9c9141f
MonoImporter: MonoImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2
defaultReferences: [] defaultReferences: []
executionOrder: 0 executionOrder: 0
icon: {instanceID: 0} icon: {instanceID: 0}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
{ {
"name": "UnityEditor.TestRunner", "name": "UnityEditor.TestRunner",
"references": [ "references": [
"UnityEngine.TestRunner" "UnityEngine.TestRunner"
], ],
"includePlatforms": [ "includePlatforms": [
"Editor" "Editor"
], ],
"excludePlatforms": [], "excludePlatforms": [],
"allowUnsafeCode": false, "allowUnsafeCode": false,
"overrideReferences": true, "overrideReferences": true,
"precompiledReferences": [ "precompiledReferences": [
"nunit.framework.dll", "nunit.framework.dll",
"Mono.Cecil.dll", "Mono.Cecil.dll",
"Mono.Cecil.Pdb.dll", "Mono.Cecil.Pdb.dll",
"Mono.Cecil.Mdb.dll", "Mono.Cecil.Mdb.dll",
"Mono.Cecil.Rocks.dll" "Mono.Cecil.Rocks.dll"
], ],
"autoReferenced": false, "autoReferenced": false,
"defineConstraints": [] "defineConstraints": []
} }
\ No newline at end of file
fileFormatVersion: 2 fileFormatVersion: 2
guid: 0acc523941302664db1f4e527237feb3 guid: 0acc523941302664db1f4e527237feb3
AssemblyDefinitionImporter: AssemblyDefinitionImporter:
externalObjects: {} externalObjects: {}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
fileFormatVersion: 2 fileFormatVersion: 2
guid: 936c6340f3468444ebb1785b4c311126 guid: 936c6340f3468444ebb1785b4c311126
folderAsset: yes folderAsset: yes
DefaultImporter: DefaultImporter:
externalObjects: {} externalObjects: {}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol
{ {
internal class AssemblyCompilationErrorsMessage : Message internal class AssemblyCompilationErrorsMessage : Message
{ {
public string assembly; public string assembly;
public string[] errors; public string[] errors;
public AssemblyCompilationErrorsMessage() public AssemblyCompilationErrorsMessage()
{ {
type = "AssemblyCompilationErrors"; type = "AssemblyCompilationErrors";
} }
} }
} }
fileFormatVersion: 2 fileFormatVersion: 2
guid: c346a7445959bba46a96de0747e77c2a guid: c346a7445959bba46a96de0747e77c2a
MonoImporter: MonoImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2
defaultReferences: [] defaultReferences: []
executionOrder: 0 executionOrder: 0
icon: {instanceID: 0} icon: {instanceID: 0}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment