UnityGame/Library/PackageCache/com.unity.test-framework/UnityEditor.TestRunner/GUI/TestAssets/FolderPathTestCompilationContextProvider.cs
2024-10-27 10:53:47 +03:00

94 lines
4.6 KiB
C#

using System;
using System.Linq;
using UnityEditor.Scripting.ScriptCompilation;
namespace UnityEditor.TestTools.TestRunner.GUI.TestAssets
{
/// <inheritdoc />
internal class FolderPathTestCompilationContextProvider : IFolderPathTestCompilationContextProvider
{
internal const string nUnitLibraryFilename = "nunit.framework.dll";
private static ICustomScriptAssemblyMappingFinder s_CustomScriptAssemblyMappingFinder;
internal static ICustomScriptAssemblyMappingFinder CustomScriptAssemblyMappingFinder
{
private get => s_CustomScriptAssemblyMappingFinder ?? (s_CustomScriptAssemblyMappingFinder = new CustomScriptAssemblyMappingFinder());
set => s_CustomScriptAssemblyMappingFinder = value;
}
/// <summary>
/// Checks if the provided folder path belongs to a Custom Test Assembly.
/// A Custom Test Assembly is defined by a valid reference to the precompiled NUnit library.
/// </summary>
/// <param name="folderPath">The folder path to check.</param>
/// <returns>True if a custom test assembly associated with the provided folder can be found; false otherwise.</returns>
/// <exception cref="ArgumentNullException">The <paramref name="folderPath" /> string argument is null.</exception>
public bool FolderPathBelongsToCustomTestAssembly(string folderPath)
{
if (folderPath == null)
{
throw new ArgumentNullException(nameof(folderPath));
}
var customScriptAssembly = CustomScriptAssemblyMappingFinder.FindCustomScriptAssemblyFromFolderPath(folderPath);
var assemblyIsCustomTestAssembly = customScriptAssembly != null
&& customScriptAssembly.HasPrecompiledReference(nUnitLibraryFilename);
return assemblyIsCustomTestAssembly;
}
/// <summary>
/// Checks if the provided folder path belongs to an assembly capable of compiling Test Scripts.
/// Unless the <see cref="PlayerSettings.playModeTestRunnerEnabled" /> setting is enabled,
/// a Test Script can only be compiled in a Custom Test Assembly
/// or an (implicit or explicit) <see cref="AssemblyFlags.EditorOnly" /> assembly.
/// </summary>
/// <param name="folderPath">The folder path to check.</param>
/// <returns>True if Test Scripts can be successfully compiled when added to this folder path; false otherwise.</returns>
/// <exception cref="ArgumentNullException">The <paramref name="folderPath" /> string argument is null.</exception>
public bool TestScriptWillCompileInFolderPath(string folderPath)
{
if (folderPath == null)
{
throw new ArgumentNullException(nameof(folderPath));
}
if (PlayerSettings.playModeTestRunnerEnabled)
{
return true;
}
var customScriptAssembly = CustomScriptAssemblyMappingFinder.FindCustomScriptAssemblyFromFolderPath(folderPath);
if (customScriptAssembly != null)
{
var assemblyCanCompileTestScripts = customScriptAssembly.HasPrecompiledReference(nUnitLibraryFilename)
|| customScriptAssembly.HasAssemblyFlag(AssemblyFlags.EditorOnly);
return assemblyCanCompileTestScripts;
}
var isImplicitEditorAssembly = FolderPathBelongsToImplicitEditorAssembly(folderPath);
return isImplicitEditorAssembly;
}
/// <summary>
/// Checks if the provided folder path is a special editor path that belongs to an implicit editor assembly.
/// </summary>
/// <param name="folderPath">The folder path to check.</param>
/// <returns>True if the folder path belongs to an implicit editor assembly; false otherwise.</returns>
/// <exception cref="ArgumentNullException">The <paramref name="folderPath" /> string argument is null.</exception>
internal static bool FolderPathBelongsToImplicitEditorAssembly(string folderPath)
{
if (folderPath == null)
{
throw new ArgumentNullException(nameof(folderPath));
}
const char unityPathSeparator = '/';
var unityFormatPath = folderPath.Replace('\\', unityPathSeparator);
var folderComponents = unityFormatPath.Split(unityPathSeparator);
var folderComponentsIncludeEditorFolder = folderComponents.Any(n => n.ToLower().Equals("editor"));
return folderComponentsIncludeEditorFolder;
}
}
}