diff --git a/Pipeline/Build.FrameworkTest.cs b/Pipeline/Build.FrameworkTest.cs index 5f9b3f765..0fb8f80ad 100644 --- a/Pipeline/Build.FrameworkTest.cs +++ b/Pipeline/Build.FrameworkTest.cs @@ -18,8 +18,8 @@ partial class Build Solution.Tests.Frameworks.aweXpect_Frameworks_MsTest_Tests, Solution.Tests.Frameworks.aweXpect_Frameworks_NUnit4_Tests, Solution.Tests.Frameworks.aweXpect_Frameworks_NUnit3_Tests, - Solution.Tests.Frameworks.aweXpect_Frameworks_XUnit2_Tests, - Solution.Tests.Frameworks.aweXpect_Frameworks_XUnit3_Core_Tests, + Solution.Tests.Frameworks.aweXpect_Frameworks_Xunit2_Tests, + Solution.Tests.Frameworks.aweXpect_Frameworks_Xunit3_Core_Tests, ]; Target TestFrameworks => _ => _ @@ -70,7 +70,7 @@ from framework in supportedFrameworks { Project[] projects = [ - Solution.Tests.Frameworks.aweXpect_Frameworks_TUnit_Tests, + Solution.Tests.Frameworks.aweXpect_Frameworks_Tunit_Tests, ]; var testCombinations = @@ -113,7 +113,7 @@ from framework in frameworks { Project[] projects = [ - Solution.Tests.Frameworks.aweXpect_Frameworks_XUnit3_Tests, + Solution.Tests.Frameworks.aweXpect_Frameworks_Xunit3_Tests, ]; var testCombinations = diff --git a/Pipeline/Build.cs b/Pipeline/Build.cs index dc06fb472..6cd56e4ed 100644 --- a/Pipeline/Build.cs +++ b/Pipeline/Build.cs @@ -20,7 +20,7 @@ partial class Build : NukeBuild /// /// Afterward, you can update the package reference in `Directory.Packages.props` and reset this flag. /// - readonly BuildScope BuildScope = BuildScope.Default; + readonly BuildScope BuildScope = BuildScope.MainOnly; [Parameter("Github Token")] readonly string GithubToken; [GitRepository] readonly GitRepository Repository; diff --git a/Source/aweXpect.Core/Core/Adapters/MsTestAdapter.cs b/Source/aweXpect.Core/Core/Adapters/MsTestAdapter.cs deleted file mode 100644 index 6ff75aa9d..000000000 --- a/Source/aweXpect.Core/Core/Adapters/MsTestAdapter.cs +++ /dev/null @@ -1,17 +0,0 @@ -// ReSharper disable UnusedType.Global - -namespace aweXpect.Core.Adapters; - -/// -/// Implements the MS test framework adapter. -/// -/// -/// -/// -// ReSharper disable once UnusedMember.Global -internal class MsTestAdapter() : TestFrameworkAdapter( - "Microsoft.VisualStudio.TestPlatform.TestFramework,", - (a, m) => FromType("Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException", a, m), - (a, m) => FromType("Microsoft.VisualStudio.TestTools.UnitTesting.AssertInconclusiveException", a, m), - (a, m) => FromType("Microsoft.VisualStudio.TestTools.UnitTesting.AssertInconclusiveException", a, m) -); diff --git a/Source/aweXpect.Core/Core/Adapters/NUnitAdapter.cs b/Source/aweXpect.Core/Core/Adapters/NUnitAdapter.cs deleted file mode 100644 index 28e912605..000000000 --- a/Source/aweXpect.Core/Core/Adapters/NUnitAdapter.cs +++ /dev/null @@ -1,16 +0,0 @@ -// ReSharper disable UnusedType.Global - -namespace aweXpect.Core.Adapters; - -/// -/// Implements the NUnit test framework adapter. -/// -/// -/// -/// -internal class NUnitAdapter() : TestFrameworkAdapter( - "nunit.framework,", - (a, m) => FromType("NUnit.Framework.AssertionException", a, m), - (a, m) => FromType("NUnit.Framework.IgnoreException", a, m), - (a, m) => FromType("NUnit.Framework.InconclusiveException", a, m) -); diff --git a/Source/aweXpect.Core/Core/Adapters/TUnitAdapter.cs b/Source/aweXpect.Core/Core/Adapters/TUnitAdapter.cs deleted file mode 100644 index 738398671..000000000 --- a/Source/aweXpect.Core/Core/Adapters/TUnitAdapter.cs +++ /dev/null @@ -1,89 +0,0 @@ -#if NET8_0_OR_GREATER -using System; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Reflection; - -// ReSharper disable UnusedType.Global - -namespace aweXpect.Core.Adapters; - -/// -/// Implements the TUnit test framework adapter. -/// -/// -/// -/// -[ExcludeFromCodeCoverage] -internal class TUnitAdapter : ITestFrameworkAdapter -{ - private Assembly? _assertionsAssembly; - private Assembly? _coreAssembly; - - #region ITestFrameworkAdapter Members - - /// - public bool IsAvailable - { - get - { - try - { - // For netfx the assembly is not in AppDomain by default, so we can't just scan AppDomain.CurrentDomain - _coreAssembly = Assembly.Load(new AssemblyName("TUnit.Core")); - _assertionsAssembly = Assembly.Load(new AssemblyName("TUnit.Assertions")); - return _coreAssembly is not null; - } - catch - { - return false; - } - } - } - - /// - [DoesNotReturn] - [StackTraceHidden] - public void Fail(string message) - { - if (_assertionsAssembly == null) - { - // When TUnit is used without its assertions library, use the default exception. - throw new FailException(message); - } - - Type exceptionType = - _assertionsAssembly.GetType("TUnit.Assertions.Exceptions.AssertionException") - ?? throw new NotSupportedException( - "Failed to create the TUnit fail assertion type"); - - throw (Exception)Activator.CreateInstance(exceptionType, message)!; - } - - /// - [DoesNotReturn] - [StackTraceHidden] - public void Inconclusive(string message) - { - Type exceptionType = _coreAssembly?.GetType("TUnit.Core.Exceptions.InconclusiveTestException") - ?? throw new NotSupportedException( - "Failed to create the TUnit inconclusive assertion type"); - - throw (Exception)Activator.CreateInstance(exceptionType, message, null)!; - } - - /// - [DoesNotReturn] - [StackTraceHidden] - public void Skip(string message) - { - Type exceptionType = _coreAssembly?.GetType("TUnit.Core.Exceptions.SkipTestException") - ?? throw new NotSupportedException( - "Failed to create the TUnit skip assertion type"); - - throw (Exception)Activator.CreateInstance(exceptionType, message)!; - } - - #endregion -} -#endif diff --git a/Source/aweXpect.Core/Core/Adapters/TestFrameworkAdapter.cs b/Source/aweXpect.Core/Core/Adapters/TestFrameworkAdapter.cs deleted file mode 100644 index ca345cc92..000000000 --- a/Source/aweXpect.Core/Core/Adapters/TestFrameworkAdapter.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Reflection; - -namespace aweXpect.Core.Adapters; - -internal abstract class TestFrameworkAdapter( - string assemblyName, - Func failException, - Func skipException, - Func inconclusiveException) - : ITestFrameworkAdapter -{ - private Assembly? _assembly; - - protected static Exception? FromType(string typeName, Assembly assembly, string message) - { - Type? exceptionType = assembly.GetType(typeName); - if (exceptionType is null) - { - return null; - } - - return (Exception?)Activator.CreateInstance(exceptionType, message); - } - - #region ITestFrameworkAdapter Members - - /// - public bool IsAvailable - { - get - { - try - { - // For netfx the assembly is not in AppDomain by default, so we can't just scan AppDomain.CurrentDomain - _assembly = AppDomain.CurrentDomain.GetAssemblies() - .First(a => a.FullName?.StartsWith(assemblyName, StringComparison.OrdinalIgnoreCase) == true); - } - catch - { - // Ignore any exception while trying to load the assembly - } - - return _assembly is not null; - } - } - - /// - [DoesNotReturn] - [StackTraceHidden] - public void Fail(string message) - { - if (_assembly is null) - { - throw new NotSupportedException("Failed to create the fail assertion type"); - } - - throw failException(_assembly, message) - ?? new NotSupportedException("Failed to create the fail assertion type"); - } - - /// - [DoesNotReturn] - [StackTraceHidden] - public void Skip(string message) - { - if (_assembly is null) - { - throw new NotSupportedException("Failed to create the skip assertion type"); - } - - throw skipException(_assembly, message) - ?? new NotSupportedException("Failed to create the skip assertion type"); - } - - /// - [DoesNotReturn] - [StackTraceHidden] - public void Inconclusive(string message) - { - if (_assembly is null) - { - throw new NotSupportedException("Failed to create the inconclusive assertion type"); - } - - throw inconclusiveException(_assembly, message) - ?? new NotSupportedException("Failed to create the inconclusive assertion type"); - } - - #endregion -} diff --git a/Source/aweXpect.Core/Core/Adapters/XUnit2Adapter.cs b/Source/aweXpect.Core/Core/Adapters/XUnit2Adapter.cs deleted file mode 100644 index 000b13cdb..000000000 --- a/Source/aweXpect.Core/Core/Adapters/XUnit2Adapter.cs +++ /dev/null @@ -1,16 +0,0 @@ -// ReSharper disable UnusedType.Global - -namespace aweXpect.Core.Adapters; - -/// -/// Implements the XUnit v2 test framework adapter. -/// -/// -/// -/// -internal class XUnit2Adapter() : TestFrameworkAdapter( - "xunit.assert", - (a, m) => FromType("Xunit.Sdk.XunitException", a, m), - (_, m) => new SkipException($"SKIPPED: {m} (xunit v2 does not support skipping test)"), - (_, m) => new InconclusiveException(m) -); diff --git a/Source/aweXpect.Core/Core/Adapters/XUnit3Adapter.cs b/Source/aweXpect.Core/Core/Adapters/XUnit3Adapter.cs deleted file mode 100644 index 949f153dc..000000000 --- a/Source/aweXpect.Core/Core/Adapters/XUnit3Adapter.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Diagnostics.CodeAnalysis; - -// ReSharper disable UnusedType.Global - -namespace aweXpect.Core.Adapters; - -/// -/// Implements the XUnit v3 test framework adapter. -/// -/// -/// -/// -[ExcludeFromCodeCoverage] -internal class XUnit3Adapter() : TestFrameworkAdapter( - "xunit.v3.assert", - (a, m) => FromType("Xunit.Sdk.XunitException", a, m), - (_, m) => new SkipException($"$XunitDynamicSkip${m}"), - (_, m) => new XunitTimeoutException(m)) -{ - internal class XUnit3CoreAdapter() : TestFrameworkAdapter( - "xunit.v3.core", - (_, m) => new XunitException(m), - (_, m) => new SkipException($"$XunitDynamicSkip${m}"), - (_, m) => new XunitTimeoutException(m)) - { - /// - /// Interface is required by xunit v3 to identify an assertion exception. - /// - private interface IAssertionException; - -#pragma warning disable S3871 // Exception types should be "public" - private sealed class XunitException(string message) - : Exception(message), IAssertionException; -#pragma warning restore S3871 // Exception types should be "public" - } - -#pragma warning disable S3871 // Exception types should be "public" - private sealed class XunitTimeoutException(string message) - : InconclusiveException(message), ITestTimeoutException; -#pragma warning restore S3871 // Exception types should be "public" - private interface ITestTimeoutException; -} diff --git a/Source/aweXpect.Frameworks/FrameworkGenerator.cs b/Source/aweXpect.Frameworks/FrameworkGenerator.cs new file mode 100644 index 000000000..6865c2f40 --- /dev/null +++ b/Source/aweXpect.Frameworks/FrameworkGenerator.cs @@ -0,0 +1,285 @@ +using Microsoft.CodeAnalysis; + +namespace aweXpect.Frameworks; + +/// +/// The for generating test framework adapters. +/// +[Generator] +public class FrameworkGenerator : IIncrementalGenerator +{ + private static string MsTestAdapter => + """ + using System.Diagnostics; + using System.Diagnostics.CodeAnalysis; + using aweXpect.Core.Adapters; + + namespace aweXpect.Frameworks; + + internal class MsTestAdapter() : ITestFrameworkAdapter + { + /// + public bool IsAvailable { get; } = true; + + /// + [DoesNotReturn] + [StackTraceHidden] + public void Skip(string message) + => throw new Microsoft.VisualStudio.TestTools.UnitTesting.AssertInconclusiveException(message); + + /// + [DoesNotReturn] + [StackTraceHidden] + public void Fail(string message) + => throw new Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException(message); + + /// + [DoesNotReturn] + [StackTraceHidden] + public void Inconclusive(string message) + => throw new Microsoft.VisualStudio.TestTools.UnitTesting.AssertInconclusiveException(message); + } + """; + + private static string NunitAdapter => + """ + using System.Diagnostics; + using System.Diagnostics.CodeAnalysis; + using aweXpect.Core.Adapters; + + namespace aweXpect.Frameworks; + + internal class NunitAdapter() : ITestFrameworkAdapter + { + /// + public bool IsAvailable { get; } = true; + + /// + [DoesNotReturn] + [StackTraceHidden] + public void Skip(string message) + => throw new NUnit.Framework.IgnoreException(message); + + /// + [DoesNotReturn] + [StackTraceHidden] + public void Fail(string message) + => throw new NUnit.Framework.AssertionException(message); + + /// + [DoesNotReturn] + [StackTraceHidden] + public void Inconclusive(string message) + => throw new NUnit.Framework.InconclusiveException(message); + } + """; + + private static string TUnitAdapter => + """ + using System.Diagnostics; + using System.Diagnostics.CodeAnalysis; + using aweXpect.Core.Adapters; + + namespace aweXpect.Frameworks; + + internal class TUnitAdapter() : ITestFrameworkAdapter + { + /// + public bool IsAvailable { get; } = true; + + /// + [DoesNotReturn] + [StackTraceHidden] + public void Skip(string message) + => throw new TUnit.Core.Exceptions.SkipTestException(message); + + /// + [DoesNotReturn] + [StackTraceHidden] + public void Fail(string message) + => throw new TUnit.Assertions.Exceptions.AssertionException(message); + + /// + [DoesNotReturn] + [StackTraceHidden] + public void Inconclusive(string message) + => throw new TUnit.Core.Exceptions.InconclusiveTestException(message, null); + } + """; + + private static string Xunit2Adapter => + """ + using System.Diagnostics; + using System.Diagnostics.CodeAnalysis; + using aweXpect.Core.Adapters; + + namespace aweXpect.Frameworks; + + internal class Xunit2Adapter() : ITestFrameworkAdapter + { + /// + public bool IsAvailable { get; } = true; + + /// + [DoesNotReturn] + [StackTraceHidden] + public void Skip(string message) + => throw new SkipException($"SKIPPED: {message} (xunit v2 does not support skipping test)"); + + /// + [DoesNotReturn] + [StackTraceHidden] + public void Fail(string message) + => throw new Xunit.Sdk.XunitException(message); + + /// + [DoesNotReturn] + [StackTraceHidden] + public void Inconclusive(string message) + => throw new InconclusiveException(message); + } + """; + + private static string Xunit3CoreAdapter => + """ + using System; + using System.Diagnostics; + using System.Diagnostics.CodeAnalysis; + using aweXpect; + using aweXpect.Core.Adapters; + + namespace aweXpect.Frameworks; + + internal class Xunit3Adapter() : ITestFrameworkAdapter + { + /// + public bool IsAvailable { get; } = true; + + /// + [DoesNotReturn] + [StackTraceHidden] + public void Skip(string message) + => throw new SkipException($"$XunitDynamicSkip${message}"); + + /// + [DoesNotReturn] + [StackTraceHidden] + public void Fail(string message) + => throw new XunitException(message); + + /// + [DoesNotReturn] + [StackTraceHidden] + public void Inconclusive(string message) + => throw new XunitTimeoutException(message); + + /// + /// Interface is required by xunit v3 to identify an assertion exception. + /// + private interface IAssertionException; + + #pragma warning disable S3871 // Exception types should be "public" + private sealed class XunitException(string message) + : Exception(message), IAssertionException; + #pragma warning restore S3871 // Exception types should be "public" + + #pragma warning disable S3871 // Exception types should be "public" + private sealed class XunitTimeoutException(string message) + : InconclusiveException(message), ITestTimeoutException; + #pragma warning restore S3871 // Exception types should be "public" + private interface ITestTimeoutException; + } + """; + + private static string Xunit3AssertAdapter => + """ + using System; + using System.Diagnostics; + using System.Diagnostics.CodeAnalysis; + using aweXpect; + using aweXpect.Core.Adapters; + + namespace aweXpect.Frameworks; + + internal class Xunit3Adapter() : ITestFrameworkAdapter + { + /// + public bool IsAvailable { get; } = true; + + /// + [DoesNotReturn] + [StackTraceHidden] + public void Skip(string message) + => throw new SkipException($"$XunitDynamicSkip${message}"); + + /// + [DoesNotReturn] + [StackTraceHidden] + public void Fail(string message) + => throw new Xunit.Sdk.XunitException(message); + + /// + [DoesNotReturn] + [StackTraceHidden] + public void Inconclusive(string message) + => throw new XunitTimeoutException(message); + + #pragma warning disable S3871 // Exception types should be "public" + private sealed class XunitTimeoutException(string message) + : InconclusiveException(message), ITestTimeoutException; + #pragma warning restore S3871 // Exception types should be "public" + private interface ITestTimeoutException; + } + """; + + void IIncrementalGenerator.Initialize(IncrementalGeneratorInitializationContext context) + { + IncrementalValueProvider<(bool hasMsTest, bool hasNunit, bool hasTUnit, bool hasXunit2, bool hasXunit3Core, bool + hasXunit3Assert)> settings = context.CompilationProvider + .Select((c, _) => + { + bool hasMsTest = + c.ReferencedAssemblyNames.Any(x => x.Name == "Microsoft.VisualStudio.TestPlatform.TestFramework"); + bool hasNunit = c.ReferencedAssemblyNames.Any(x => x.Name == "nunit.framework"); + bool hasTUnit = c.ReferencedAssemblyNames.Any(x => x.Name == "TUnit.Core") && + c.ReferencedAssemblyNames.Any(x => x.Name == "TUnit.Assertions"); + bool hasXunit2 = c.ReferencedAssemblyNames.Any(x => x.Name == "xunit.assert"); + bool hasXunit3Core = c.ReferencedAssemblyNames.Any(x => x.Name == "xunit.v3.core"); + bool hasXunit3Assert = c.ReferencedAssemblyNames.Any(x => x.Name == "xunit.v3.assert"); + return (hasMsTest, hasNunit, hasTUnit, hasXunit2, hasXunit3Core, hasXunit3Assert); + }); + + // Generate the source from the captured values + context.RegisterSourceOutput(settings, static (spc, opts) => + { + if (opts.hasMsTest) + { + spc.AddSource("MsTest.g.cs", MsTestAdapter); + } + + if (opts.hasNunit) + { + spc.AddSource("Nunit.g.cs", NunitAdapter); + } + + if (opts.hasTUnit) + { + spc.AddSource("TUnit.g.cs", TUnitAdapter); + } + + if (opts.hasXunit2) + { + spc.AddSource("Xunit2.g.cs", Xunit2Adapter); + } + + if (opts.hasXunit3Assert) + { + spc.AddSource("Xunit3.g.cs", Xunit3AssertAdapter); + } + else if (opts.hasXunit3Core) + { + spc.AddSource("Xunit3.g.cs", Xunit3CoreAdapter); + } + }); + } +} diff --git a/Source/aweXpect.Frameworks/Properties/launchSettings.json b/Source/aweXpect.Frameworks/Properties/launchSettings.json new file mode 100644 index 000000000..bd75a0398 --- /dev/null +++ b/Source/aweXpect.Frameworks/Properties/launchSettings.json @@ -0,0 +1,9 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "profiles": { + "Generators": { + "commandName": "DebugRoslynComponent", + "targetProject": "../../Tests/Frameworks/aweXpect.Frameworks.TUnit.Tests/aweXpect.Frameworks.TUnit.Tests.csproj" + } + } +} diff --git a/Source/aweXpect.Frameworks/aweXpect.Frameworks.csproj b/Source/aweXpect.Frameworks/aweXpect.Frameworks.csproj new file mode 100644 index 000000000..65f42d8e5 --- /dev/null +++ b/Source/aweXpect.Frameworks/aweXpect.Frameworks.csproj @@ -0,0 +1,25 @@ + + + + netstandard2.0 + false + enable + true + preview + true + false + + + + + + + + + + + + + + + diff --git a/Source/aweXpect/aweXpect.csproj b/Source/aweXpect/aweXpect.csproj index 0b7dd50a9..430990395 100644 --- a/Source/aweXpect/aweXpect.csproj +++ b/Source/aweXpect/aweXpect.csproj @@ -21,6 +21,7 @@ + diff --git a/Tests/Frameworks/aweXpect.Frameworks.MsTest.Tests/aweXpect.Frameworks.MsTest.Tests.csproj b/Tests/Frameworks/aweXpect.Frameworks.MsTest.Tests/aweXpect.Frameworks.MsTest.Tests.csproj index dc09d3878..d04862f0f 100644 --- a/Tests/Frameworks/aweXpect.Frameworks.MsTest.Tests/aweXpect.Frameworks.MsTest.Tests.csproj +++ b/Tests/Frameworks/aweXpect.Frameworks.MsTest.Tests/aweXpect.Frameworks.MsTest.Tests.csproj @@ -6,6 +6,7 @@ + diff --git a/Tests/Frameworks/aweXpect.Frameworks.NUnit3.Tests/aweXpect.Frameworks.NUnit3.Tests.csproj b/Tests/Frameworks/aweXpect.Frameworks.NUnit3.Tests/aweXpect.Frameworks.NUnit3.Tests.csproj index 0c01d8f03..0a2cc3e8c 100644 --- a/Tests/Frameworks/aweXpect.Frameworks.NUnit3.Tests/aweXpect.Frameworks.NUnit3.Tests.csproj +++ b/Tests/Frameworks/aweXpect.Frameworks.NUnit3.Tests/aweXpect.Frameworks.NUnit3.Tests.csproj @@ -13,6 +13,7 @@ + diff --git a/Tests/Frameworks/aweXpect.Frameworks.NUnit4.Tests/aweXpect.Frameworks.NUnit4.Tests.csproj b/Tests/Frameworks/aweXpect.Frameworks.NUnit4.Tests/aweXpect.Frameworks.NUnit4.Tests.csproj index eae373b76..541677485 100644 --- a/Tests/Frameworks/aweXpect.Frameworks.NUnit4.Tests/aweXpect.Frameworks.NUnit4.Tests.csproj +++ b/Tests/Frameworks/aweXpect.Frameworks.NUnit4.Tests/aweXpect.Frameworks.NUnit4.Tests.csproj @@ -13,6 +13,7 @@ + diff --git a/Tests/Frameworks/aweXpect.Frameworks.TUnit.Tests/TUnitTestFrameworkTests.cs b/Tests/Frameworks/aweXpect.Frameworks.Tunit.Tests/TunitTestFrameworkTests.cs similarity index 90% rename from Tests/Frameworks/aweXpect.Frameworks.TUnit.Tests/TUnitTestFrameworkTests.cs rename to Tests/Frameworks/aweXpect.Frameworks.Tunit.Tests/TunitTestFrameworkTests.cs index c2f1c25e9..8417ded86 100644 --- a/Tests/Frameworks/aweXpect.Frameworks.TUnit.Tests/TUnitTestFrameworkTests.cs +++ b/Tests/Frameworks/aweXpect.Frameworks.Tunit.Tests/TunitTestFrameworkTests.cs @@ -2,9 +2,9 @@ using TUnit.Assertions.Exceptions; using TUnit.Core.Exceptions; -namespace aweXpect.Frameworks.TUnit.Tests; +namespace aweXpect.Frameworks.Tunit.Tests; -public sealed class TUnitTestFrameworkTests +public sealed class TunitTestFrameworkTests { [Test] public async Task OnFail_WhenUsingXunit2AsTestFramework_ShouldThrowXunitException() diff --git a/Tests/Frameworks/aweXpect.Frameworks.TUnit.Tests/aweXpect.Frameworks.TUnit.Tests.csproj b/Tests/Frameworks/aweXpect.Frameworks.Tunit.Tests/aweXpect.Frameworks.Tunit.Tests.csproj similarity index 70% rename from Tests/Frameworks/aweXpect.Frameworks.TUnit.Tests/aweXpect.Frameworks.TUnit.Tests.csproj rename to Tests/Frameworks/aweXpect.Frameworks.Tunit.Tests/aweXpect.Frameworks.Tunit.Tests.csproj index cfd8cb787..dc5a790e8 100644 --- a/Tests/Frameworks/aweXpect.Frameworks.TUnit.Tests/aweXpect.Frameworks.TUnit.Tests.csproj +++ b/Tests/Frameworks/aweXpect.Frameworks.Tunit.Tests/aweXpect.Frameworks.Tunit.Tests.csproj @@ -7,6 +7,7 @@ + diff --git a/Tests/Frameworks/aweXpect.Frameworks.XUnit2.Tests/XUnit2TestFrameworkTests.cs b/Tests/Frameworks/aweXpect.Frameworks.Xunit2.Tests/Xunit2TestFrameworkTests.cs similarity index 89% rename from Tests/Frameworks/aweXpect.Frameworks.XUnit2.Tests/XUnit2TestFrameworkTests.cs rename to Tests/Frameworks/aweXpect.Frameworks.Xunit2.Tests/Xunit2TestFrameworkTests.cs index 6e729f277..7cf569914 100644 --- a/Tests/Frameworks/aweXpect.Frameworks.XUnit2.Tests/XUnit2TestFrameworkTests.cs +++ b/Tests/Frameworks/aweXpect.Frameworks.Xunit2.Tests/Xunit2TestFrameworkTests.cs @@ -2,9 +2,9 @@ using Xunit; using Xunit.Sdk; -namespace aweXpect.Frameworks.XUnit2.Tests; +namespace aweXpect.Frameworks.Xunit2.Tests; -public sealed class XUnit2TestFrameworkTests +public sealed class Xunit2TestFrameworkTests { [Fact] public async Task OnFail_WhenUsingXunit2AsTestFramework_ShouldThrowXunitException() diff --git a/Tests/Frameworks/aweXpect.Frameworks.XUnit2.Tests/aweXpect.Frameworks.XUnit2.Tests.csproj b/Tests/Frameworks/aweXpect.Frameworks.Xunit2.Tests/aweXpect.Frameworks.Xunit2.Tests.csproj similarity index 82% rename from Tests/Frameworks/aweXpect.Frameworks.XUnit2.Tests/aweXpect.Frameworks.XUnit2.Tests.csproj rename to Tests/Frameworks/aweXpect.Frameworks.Xunit2.Tests/aweXpect.Frameworks.Xunit2.Tests.csproj index a31415ea2..8cfffbd60 100644 --- a/Tests/Frameworks/aweXpect.Frameworks.XUnit2.Tests/aweXpect.Frameworks.XUnit2.Tests.csproj +++ b/Tests/Frameworks/aweXpect.Frameworks.Xunit2.Tests/aweXpect.Frameworks.Xunit2.Tests.csproj @@ -9,6 +9,7 @@ + diff --git a/Tests/Frameworks/aweXpect.Frameworks.XUnit3.Core.Tests/XUnit3CoreTestFrameworkTests.cs b/Tests/Frameworks/aweXpect.Frameworks.Xunit3.Core.Tests/Xunit3CoreTestFrameworkTests.cs similarity index 92% rename from Tests/Frameworks/aweXpect.Frameworks.XUnit3.Core.Tests/XUnit3CoreTestFrameworkTests.cs rename to Tests/Frameworks/aweXpect.Frameworks.Xunit3.Core.Tests/Xunit3CoreTestFrameworkTests.cs index 7ae6ee9b2..72e0e3b6a 100644 --- a/Tests/Frameworks/aweXpect.Frameworks.XUnit3.Core.Tests/XUnit3CoreTestFrameworkTests.cs +++ b/Tests/Frameworks/aweXpect.Frameworks.Xunit3.Core.Tests/Xunit3CoreTestFrameworkTests.cs @@ -3,9 +3,9 @@ using System.Threading.Tasks; using Xunit; -namespace aweXpect.Frameworks.XUnit3.Core.Tests; +namespace aweXpect.Frameworks.Xunit3.Core.Tests; -public class XUnit3TestFrameworkTests +public class Xunit3TestFrameworkTests { [Fact] public async Task OnFail_WhenUsingXunit3AsTestFramework_ShouldThrowXunitException() diff --git a/Tests/Frameworks/aweXpect.Frameworks.XUnit3.Core.Tests/aweXpect.Frameworks.XUnit3.Core.Tests.csproj b/Tests/Frameworks/aweXpect.Frameworks.Xunit3.Core.Tests/aweXpect.Frameworks.Xunit3.Core.Tests.csproj similarity index 84% rename from Tests/Frameworks/aweXpect.Frameworks.XUnit3.Core.Tests/aweXpect.Frameworks.XUnit3.Core.Tests.csproj rename to Tests/Frameworks/aweXpect.Frameworks.Xunit3.Core.Tests/aweXpect.Frameworks.Xunit3.Core.Tests.csproj index 1d784b0dd..3526de4e6 100644 --- a/Tests/Frameworks/aweXpect.Frameworks.XUnit3.Core.Tests/aweXpect.Frameworks.XUnit3.Core.Tests.csproj +++ b/Tests/Frameworks/aweXpect.Frameworks.Xunit3.Core.Tests/aweXpect.Frameworks.Xunit3.Core.Tests.csproj @@ -12,6 +12,7 @@ + diff --git a/Tests/Frameworks/aweXpect.Frameworks.XUnit3.Tests/XUnit3TestFrameworkTests.cs b/Tests/Frameworks/aweXpect.Frameworks.Xunit3.Tests/Xunit3TestFrameworkTests.cs similarity index 91% rename from Tests/Frameworks/aweXpect.Frameworks.XUnit3.Tests/XUnit3TestFrameworkTests.cs rename to Tests/Frameworks/aweXpect.Frameworks.Xunit3.Tests/Xunit3TestFrameworkTests.cs index 15e2a8388..d56ad2cb6 100644 --- a/Tests/Frameworks/aweXpect.Frameworks.XUnit3.Tests/XUnit3TestFrameworkTests.cs +++ b/Tests/Frameworks/aweXpect.Frameworks.Xunit3.Tests/Xunit3TestFrameworkTests.cs @@ -3,9 +3,9 @@ using Xunit; using Xunit.Sdk; -namespace aweXpect.Frameworks.XUnit3.Tests; +namespace aweXpect.Frameworks.Xunit3.Tests; -public class XUnit3TestFrameworkTests +public class Xunit3TestFrameworkTests { [Fact] public async Task OnFail_WhenUsingXunit3AsTestFramework_ShouldThrowXunitException() diff --git a/Tests/Frameworks/aweXpect.Frameworks.XUnit3.Tests/aweXpect.Frameworks.XUnit3.Tests.csproj b/Tests/Frameworks/aweXpect.Frameworks.Xunit3.Tests/aweXpect.Frameworks.Xunit3.Tests.csproj similarity index 77% rename from Tests/Frameworks/aweXpect.Frameworks.XUnit3.Tests/aweXpect.Frameworks.XUnit3.Tests.csproj rename to Tests/Frameworks/aweXpect.Frameworks.Xunit3.Tests/aweXpect.Frameworks.Xunit3.Tests.csproj index e6203d2ba..02c917d56 100644 --- a/Tests/Frameworks/aweXpect.Frameworks.XUnit3.Tests/aweXpect.Frameworks.XUnit3.Tests.csproj +++ b/Tests/Frameworks/aweXpect.Frameworks.Xunit3.Tests/aweXpect.Frameworks.Xunit3.Tests.csproj @@ -12,6 +12,7 @@ + diff --git a/Tests/aweXpect.Core.Tests/Core/Adapters/TestFrameworkAdapterTests.cs b/Tests/aweXpect.Core.Tests/Core/Adapters/TestFrameworkAdapterTests.cs deleted file mode 100644 index 8a15a0cb3..000000000 --- a/Tests/aweXpect.Core.Tests/Core/Adapters/TestFrameworkAdapterTests.cs +++ /dev/null @@ -1,165 +0,0 @@ -using System.Reflection; -using aweXpect.Core.Adapters; -using aweXpect.Core.Tests.TestHelpers; -using Xunit.Abstractions; - -namespace aweXpect.Core.Tests.Core.Adapters; - -public sealed class TestFrameworkAdapterTests : IDisposable -{ - private readonly XunitTraceWriter _writer; - - public TestFrameworkAdapterTests(ITestOutputHelper testOutputHelper) - { - _writer = new XunitTraceWriter(testOutputHelper); - } - - public void Dispose() => _writer.Dispose(); - - [Fact] - public async Task FromType_WhenNameDoesNotExist_ShouldReturnNull() - { - string typeName = "type-that-does-not-exist"; - Assembly assembly = typeof(TestFrameworkAdapterTests).Assembly; - - Exception? exception = MyTestFrameworkAdapter.FromTypeWrapper(typeName, assembly, "foo"); - - await That(exception).IsNull(); - } - - [Fact] - public async Task Inconclusive_MissingAssemblyName_ShouldThrowNotSupportedException() - { - MyTestFrameworkAdapter adapter = new(MissingAssembly, skipException: new MyException()); - _ = adapter.IsAvailable; - - await That(() => adapter.Inconclusive("foo")).Throws() - .WithMessage("Failed to create the inconclusive assertion type"); - } - - [Fact] - public async Task Inconclusive_ValidAssemblyName_ShouldThrowNotSupportedException() - { - MyTestFrameworkAdapter adapter = new(ExistingAssembly); - _ = adapter.IsAvailable; - - await That(() => adapter.Inconclusive("foo")).Throws() - .WithMessage("Failed to create the inconclusive assertion type"); - } - - [Fact] - public async Task Inconclusive_ValidAssemblyName_WithException_ShouldThrowProvidedException() - { - MyException exception = new("my-message"); - MyTestFrameworkAdapter adapter = new(ExistingAssembly, inconclusiveException: exception); - _ = adapter.IsAvailable; - - await That(() => adapter.Inconclusive("foo")).Throws() - .WithMessage("my-message"); - } - - [Fact] - public async Task MissingAssemblyName_ShouldNotBeAvailable() - { - MyTestFrameworkAdapter adapter = new(MissingAssembly); - _ = adapter.IsAvailable; - - await That(adapter.IsAvailable).IsFalse(); - } - - [Fact] - public async Task Skip_MissingAssemblyName_ShouldThrowNotSupportedException() - { - MyTestFrameworkAdapter adapter = new(MissingAssembly, skipException: new MyException()); - _ = adapter.IsAvailable; - - await That(() => adapter.Skip("foo")).Throws() - .WithMessage("Failed to create the skip assertion type"); - } - - [Fact] - public async Task Skip_ValidAssemblyName_ShouldThrowNotSupportedException() - { - MyTestFrameworkAdapter adapter = new(ExistingAssembly); - _ = adapter.IsAvailable; - - await That(() => adapter.Skip("foo")).Throws() - .WithMessage("Failed to create the skip assertion type"); - } - - [Fact] - public async Task Skip_ValidAssemblyName_WithException_ShouldThrowProvidedException() - { - MyException exception = new("my-message"); - MyTestFrameworkAdapter adapter = new(ExistingAssembly, skipException: exception); - _ = adapter.IsAvailable; - - await That(() => adapter.Skip("foo")).Throws() - .WithMessage("my-message"); - } - - [Fact] - public async Task Throw_MissingAssemblyName_ShouldThrowNotSupportedException() - { - MyTestFrameworkAdapter adapter = new(MissingAssembly, new MyException()); - _ = adapter.IsAvailable; - - await That(() => adapter.Fail("foo")).Throws() - .WithMessage("Failed to create the fail assertion type"); - } - - [Fact] - public async Task Throw_ValidAssemblyName_ShouldThrowNotSupportedException() - { - MyTestFrameworkAdapter adapter = new(ExistingAssembly); - _ = adapter.IsAvailable; - - await That(() => adapter.Fail("foo")).Throws() - .WithMessage("Failed to create the fail assertion type"); - } - - [Fact] - public async Task Throw_ValidAssemblyName_WithException_ShouldThrowProvidedException() - { - MyException exception = new("my-message"); - MyTestFrameworkAdapter adapter = new(ExistingAssembly, exception); - _ = adapter.IsAvailable; - - await That(() => adapter.Fail("foo")).Throws() - .WithMessage("my-message"); - } - - [Fact] - public async Task ValidAssemblyName_ShouldBeAvailable() - { - MyTestFrameworkAdapter adapter = new(ExistingAssembly); - _ = adapter.IsAvailable; - - await That(adapter.IsAvailable).IsTrue(); - } - - private const string ExistingAssembly = "aweXpect.Core.Tests"; - private const string MissingAssembly = "this-assembly-does-not-exist"; - - private sealed class MyTestFrameworkAdapter : TestFrameworkAdapter - { - public MyTestFrameworkAdapter() : this(MissingAssembly) - { - // An empty constructor is required in order to avoid an exception in the ambient initialization "DetectFramework" method! - } - - public MyTestFrameworkAdapter(string assemblyName, - Exception? failException = null, - Exception? skipException = null, - Exception? inconclusiveException = null) - : base(assemblyName, - (_, _) => failException, - (_, _) => skipException, - (_, _) => inconclusiveException) - { - } - - public static Exception? FromTypeWrapper(string typeName, Assembly assembly, string message) - => FromType(typeName, assembly, message); - } -} diff --git a/Tests/aweXpect.Core.Tests/aweXpect.Core.Tests.csproj b/Tests/aweXpect.Core.Tests/aweXpect.Core.Tests.csproj index 45082cec7..83538e681 100644 --- a/Tests/aweXpect.Core.Tests/aweXpect.Core.Tests.csproj +++ b/Tests/aweXpect.Core.Tests/aweXpect.Core.Tests.csproj @@ -8,6 +8,7 @@ + diff --git a/Tests/aweXpect.Internal.Tests/aweXpect.Internal.Tests.csproj b/Tests/aweXpect.Internal.Tests/aweXpect.Internal.Tests.csproj index 69923f4d0..2a11e1a0a 100644 --- a/Tests/aweXpect.Internal.Tests/aweXpect.Internal.Tests.csproj +++ b/Tests/aweXpect.Internal.Tests/aweXpect.Internal.Tests.csproj @@ -1,6 +1,7 @@ + diff --git a/Tests/aweXpect.Tests/aweXpect.Tests.csproj b/Tests/aweXpect.Tests/aweXpect.Tests.csproj index e03cda6ab..b8f2543ba 100644 --- a/Tests/aweXpect.Tests/aweXpect.Tests.csproj +++ b/Tests/aweXpect.Tests/aweXpect.Tests.csproj @@ -1,6 +1,7 @@ + diff --git a/aweXpect.sln b/aweXpect.sln index 21085e6fe..bbe94e9bb 100644 --- a/aweXpect.sln +++ b/aweXpect.sln @@ -67,9 +67,9 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "aweXpect.Frameworks.NUnit3. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "aweXpect.Frameworks.NUnit4.Tests", "Tests\Frameworks\aweXpect.Frameworks.NUnit4.Tests\aweXpect.Frameworks.NUnit4.Tests.csproj", "{9ABF8E11-7975-43F2-8418-1F6D9E5E4D37}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "aweXpect.Frameworks.TUnit.Tests", "Tests\Frameworks\aweXpect.Frameworks.TUnit.Tests\aweXpect.Frameworks.TUnit.Tests.csproj", "{532FAE88-3327-4B1B-B3B7-43D439A7CEE8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "aweXpect.Frameworks.Tunit.Tests", "Tests\Frameworks\aweXpect.Frameworks.Tunit.Tests\aweXpect.Frameworks.Tunit.Tests.csproj", "{532FAE88-3327-4B1B-B3B7-43D439A7CEE8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "aweXpect.Frameworks.XUnit2.Tests", "Tests\Frameworks\aweXpect.Frameworks.XUnit2.Tests\aweXpect.Frameworks.XUnit2.Tests.csproj", "{3E369992-EC14-4874-B793-7FCF5D9DB660}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "aweXpect.Frameworks.Xunit2.Tests", "Tests\Frameworks\aweXpect.Frameworks.Xunit2.Tests\aweXpect.Frameworks.Xunit2.Tests.csproj", "{3E369992-EC14-4874-B793-7FCF5D9DB660}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Benchmarks", "Benchmarks", "{FA002813-92DA-46AC-8F34-DA739B4380C8}" EndProject @@ -79,9 +79,9 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "aweXpect.Frameworks.Fallbac EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "aweXpect.Frameworks.MsTest.Tests", "Tests\Frameworks\aweXpect.Frameworks.MsTest.Tests\aweXpect.Frameworks.MsTest.Tests.csproj", "{1EC393AD-DE25-4C0E-A8B5-B19A2843A4E2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "aweXpect.Frameworks.XUnit3.Tests", "Tests\Frameworks\aweXpect.Frameworks.XUnit3.Tests\aweXpect.Frameworks.XUnit3.Tests.csproj", "{5D0060AC-986B-4C28-A871-BA0EC9223DA7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "aweXpect.Frameworks.Xunit3.Tests", "Tests\Frameworks\aweXpect.Frameworks.Xunit3.Tests\aweXpect.Frameworks.Xunit3.Tests.csproj", "{5D0060AC-986B-4C28-A871-BA0EC9223DA7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "aweXpect.Frameworks.XUnit3.Core.Tests", "Tests\Frameworks\aweXpect.Frameworks.XUnit3.Core.Tests\aweXpect.Frameworks.XUnit3.Core.Tests.csproj", "{A815B631-402C-44B0-80B3-50B6EAFD8078}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "aweXpect.Frameworks.Xunit3.Core.Tests", "Tests\Frameworks\aweXpect.Frameworks.Xunit3.Core.Tests\aweXpect.Frameworks.Xunit3.Core.Tests.csproj", "{A815B631-402C-44B0-80B3-50B6EAFD8078}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "aweXpect.Internal.Tests", "Tests\aweXpect.Internal.Tests\aweXpect.Internal.Tests.csproj", "{4A940BE9-D9E0-4004-89D4-5D6E8CB37208}" EndProject @@ -95,6 +95,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "aweXpect.Analyzers.CodeFixe EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "aweXpect.SourceGenerators", "Source\aweXpect.SourceGenerators\aweXpect.SourceGenerators.csproj", "{C4F90F26-54CD-447E-870D-6F1C05729155}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "aweXpect.Frameworks", "Source\aweXpect.Frameworks\aweXpect.Frameworks.csproj", "{75E57A42-1C09-4923-B1E1-A27937189E9A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -183,6 +185,10 @@ Global {C4F90F26-54CD-447E-870D-6F1C05729155}.Debug|Any CPU.Build.0 = Debug|Any CPU {C4F90F26-54CD-447E-870D-6F1C05729155}.Release|Any CPU.ActiveCfg = Release|Any CPU {C4F90F26-54CD-447E-870D-6F1C05729155}.Release|Any CPU.Build.0 = Release|Any CPU + {75E57A42-1C09-4923-B1E1-A27937189E9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {75E57A42-1C09-4923-B1E1-A27937189E9A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75E57A42-1C09-4923-B1E1-A27937189E9A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {75E57A42-1C09-4923-B1E1-A27937189E9A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {97D64B45-D97E-4A94-9EF0-37BF25310EBA} = {9CC57AD0-4984-4618-96EA-01FFFCCD84FA}