From 46debcdcbe934bb532a6f0fd2c6d109771589cfa Mon Sep 17 00:00:00 2001 From: connorivy <43247197+connorivy@users.noreply.github.com> Date: Fri, 3 Jan 2025 18:43:01 -0600 Subject: [PATCH] Merge dev into main (#25) * adds support for .net 9 * fixes bug with post build event not being able to handle spaces in the assembly path --------- Co-authored-by: Douglas Gaskell <1400380+douglasg14b@users.noreply.github.com> --- .github/workflows/buildAndTest.yml | 23 +++++++++------ .gitmodules | 3 ++ CodeCoverage.runsettings | 2 ++ Harmony | 1 + MockMe.sln | 7 +++++ src/MockMe.Generator/MockStoreGenerator.cs | 28 +------------------ src/MockMe.PostBuild/Program.cs | 2 -- src/MockMe/Build/MockMe.targets | 11 ++++---- src/MockMe/MockMe.csproj | 3 +- tests/Directory.Build.props | 9 ++++++ .../MockMe Tests With Path Spaces.csproj | 21 ++++++++++++++ .../PathSpacesTests.cs | 26 +++++++++++++++++ .../Directory.Build.props | 4 +-- .../MockMe.Tests.ExampleClasses.csproj | 9 ------ .../MockMe.Tests.Overloads.Interface.csproj | 1 - .../MockMe.Tests.Overloads.Sealed.csproj | 1 - .../AllOverloads.cs | 4 ++- .../MockMe.Tests.Overloads.Virtual.csproj | 1 - .../MockMe.Tests.Runner.csproj | 1 - tests/MockMe.Tests.slnf | 1 + tests/MockMe.Tests/MockMe.Tests.csproj | 2 -- wiki/AdvancedUsage.md | 2 +- wiki/QuickStart.md | 26 +++++++++++++++++ 23 files changed, 125 insertions(+), 63 deletions(-) create mode 100644 .gitmodules create mode 160000 Harmony create mode 100644 tests/MockMe Tests With Path Spaces/MockMe Tests With Path Spaces.csproj create mode 100644 tests/MockMe Tests With Path Spaces/PathSpacesTests.cs diff --git a/.github/workflows/buildAndTest.yml b/.github/workflows/buildAndTest.yml index 9999f99..6e1eb2c 100644 --- a/.github/workflows/buildAndTest.yml +++ b/.github/workflows/buildAndTest.yml @@ -11,15 +11,22 @@ jobs: steps: - name: Checkout Code uses: actions/checkout@v4 + with: + submodules: true - name: Setup .NET 9 uses: actions/setup-dotnet@v3 with: dotnet-version: '9.0.x' + - name: Build harmony + run: | + dotnet build ./Harmony/Harmony/Harmony.csproj -c ReleaseThin + - name: Test And Collect CodeCov run: | dotnet tool install --global dotnet-coverage + export PATH="$PATH:/root/.dotnet/tools" dotnet-coverage collect "dotnet run --project ./tests/MockMe.Tests.Runner/" -f cobertura -s ./CodeCoverage.runsettings - name: Generate report @@ -28,7 +35,6 @@ jobs: reports: './output.cobertura.xml' targetdir: './tests/TestResults' reporttypes: 'lcov' - # reporttypes: 'html' - name: Coveralls uses: coverallsapp/github-action@master @@ -76,17 +82,18 @@ jobs: - name: Create local package feed run: dotnet nuget add source ${{ github.workspace }}/packages --name localNuGet - - name: Print NuGet Sources - run: dotnet nuget list source - - - name: Restore dependencies - run: dotnet restore /p:MockMeNugetPackageVersion="0.0.1-dev" + - name: Clean previous build artifacts + run: | + find . -type d -name 'bin' -exec rm -rf {} + + find . -type d -name 'obj' -exec rm -rf {} + + # stack overflow thread for why I'm using maxcpucount + # https://stackoverflow.com/questions/72267139/msbuild-error-msb4018-cannot-access-project-assets-json-in-net-5-build - name: Build - run: dotnet build ./tests/MockMe.Tests.slnf --no-restore -c Release /p:MockMeNugetPackageVersion="0.0.1-dev" + run: dotnet build ./tests/MockMe.Tests.slnf -c Release /p:MockMeNugetPackageVersion="0.0.1-dev" /p:MockMeTestsTargetFramework=net${{ matrix.dotnet }} -f net${{ matrix.dotnet }} -maxcpucount:1 - name: Test - run: dotnet test ./tests/MockMe.Tests.slnf --no-build -c Release --verbosity normal + run: dotnet test ./tests/MockMe.Tests.slnf --no-build -c Release --verbosity normal /p:MockMeTestsTargetFramework=net${{ matrix.dotnet }} -f net${{ matrix.dotnet }} # test-windows: # runs-on: windows-latest diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..1ca5c66 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "Harmony"] + path = Harmony + url = https://github.com/connorivy/Harmony diff --git a/CodeCoverage.runsettings b/CodeCoverage.runsettings index c39597c..31efd4e 100644 --- a/CodeCoverage.runsettings +++ b/CodeCoverage.runsettings @@ -10,6 +10,8 @@ .MockMe.Tests.ExampleClasses.dll$ + .0Harmony.dll$ + .MockMe.Generator.dll$ diff --git a/Harmony b/Harmony new file mode 160000 index 0000000..4e34880 --- /dev/null +++ b/Harmony @@ -0,0 +1 @@ +Subproject commit 4e348803276233e033178e3292cad8eea4a274a7 diff --git a/MockMe.sln b/MockMe.sln index 9b6d1a3..2f5d090 100644 --- a/MockMe.sln +++ b/MockMe.sln @@ -52,6 +52,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MockMe.Tests.Overloads.Virt EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MockMe.Tests.Runner", "tests\MockMe.Tests.Runner\MockMe.Tests.Runner.csproj", "{71009957-1245-48AD-BE28-7377CF50DA6B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MockMe Tests With Path Spaces", "tests\MockMe Tests With Path Spaces\MockMe Tests With Path Spaces.csproj", "{21B57A75-EE1A-D96F-57EF-82EAF1A767EE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -98,6 +100,10 @@ Global {71009957-1245-48AD-BE28-7377CF50DA6B}.Debug|Any CPU.Build.0 = Debug|Any CPU {71009957-1245-48AD-BE28-7377CF50DA6B}.Release|Any CPU.ActiveCfg = Release|Any CPU {71009957-1245-48AD-BE28-7377CF50DA6B}.Release|Any CPU.Build.0 = Release|Any CPU + {21B57A75-EE1A-D96F-57EF-82EAF1A767EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21B57A75-EE1A-D96F-57EF-82EAF1A767EE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21B57A75-EE1A-D96F-57EF-82EAF1A767EE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21B57A75-EE1A-D96F-57EF-82EAF1A767EE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -114,6 +120,7 @@ Global {E08ADBB1-7CB8-4BFF-9BAC-485DC7822719} = {134D18E2-ECAC-4571-B7BE-0C10796D5555} {2F9424F6-0BB5-4BD8-92A7-3625A666111F} = {134D18E2-ECAC-4571-B7BE-0C10796D5555} {71009957-1245-48AD-BE28-7377CF50DA6B} = {134D18E2-ECAC-4571-B7BE-0C10796D5555} + {21B57A75-EE1A-D96F-57EF-82EAF1A767EE} = {134D18E2-ECAC-4571-B7BE-0C10796D5555} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {CF07A0CA-1140-44DC-9E7E-F99E65D9EF97} diff --git a/src/MockMe.Generator/MockStoreGenerator.cs b/src/MockMe.Generator/MockStoreGenerator.cs index cbd2475..41e6dc7 100644 --- a/src/MockMe.Generator/MockStoreGenerator.cs +++ b/src/MockMe.Generator/MockStoreGenerator.cs @@ -210,36 +210,10 @@ internal static partial class {StoreClassName} }} }} #pragma warning restore"; + context.AddSource( "Mock.DummyDeclaration.g.cs", SourceText.From(mockStoreSource, Encoding.UTF8) ); - - //AppDomain.CurrentDomain.TypeResolve += new ResolveEventHandler(HandleTypeResolve); - //// Load the assembly - //var assemblyPath = Path.Combine( - // Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), - // "MockMe.SampleMocks.dll" - //); - //var assembly = AssemblyDefinition.ReadAssembly(assemblyPath); - //// Find the type to delete - //// - //var typeToRemove = assembly.MainModule.Types.FirstOrDefault(t => t.Name == "Calculator"); - //if (typeToRemove != null) - //{ - // assembly.MainModule.Types.Remove(typeToRemove); - //} - //var outputPath = "MockMe.SampleMocks.dll"; } - - //static Assembly HandleTypeResolve(object sender, ResolveEventArgs args) - //{ - // Console.WriteLine("TypeResolve event handler."); - - // // Save the dynamic assembly, and then load it using its - // // display name. Return the loaded assembly. - // // - // //ab.Save(moduleName); - // return Assembly.Load(Assembly.GetExecutingAssembly().Location); - //} } diff --git a/src/MockMe.PostBuild/Program.cs b/src/MockMe.PostBuild/Program.cs index d811977..8c7a421 100644 --- a/src/MockMe.PostBuild/Program.cs +++ b/src/MockMe.PostBuild/Program.cs @@ -8,8 +8,6 @@ //System.Diagnostics.Debugger.Launch(); # endif -Console.WriteLine("Hello, Task!"); - var testAssemblyPath = args[0]; var binLocation = Path.GetDirectoryName(testAssemblyPath) diff --git a/src/MockMe/Build/MockMe.targets b/src/MockMe/Build/MockMe.targets index 1bd0912..aea0556 100644 --- a/src/MockMe/Build/MockMe.targets +++ b/src/MockMe/Build/MockMe.targets @@ -7,21 +7,20 @@ $(MockMePath)MockMe.dll - + - + - + diff --git a/src/MockMe/MockMe.csproj b/src/MockMe/MockMe.csproj index 9b611b3..e331317 100644 --- a/src/MockMe/MockMe.csproj +++ b/src/MockMe/MockMe.csproj @@ -17,10 +17,10 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -54,6 +54,7 @@ + diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 8c8e045..d2cddcf 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -3,11 +3,15 @@ + net6.0 + $(MockMeTestsTargetFramework) 10 major True CA1822; + CA1861; + IDE0060; IDE0161; IDE0130; IDE0034; @@ -26,10 +30,15 @@ + + + ..\..\Harmony\Harmony\bin\ReleaseThin\net6.0\0Harmony.dll + $(MSBuildProjectDirectory)\bin\$(Configuration)\$(TargetFramework)\ + true diff --git a/tests/MockMe Tests With Path Spaces/MockMe Tests With Path Spaces.csproj b/tests/MockMe Tests With Path Spaces/MockMe Tests With Path Spaces.csproj new file mode 100644 index 0000000..d7b7f3d --- /dev/null +++ b/tests/MockMe Tests With Path Spaces/MockMe Tests With Path Spaces.csproj @@ -0,0 +1,21 @@ + + + + enable + + false + true + + + + + + + + + + + + + + diff --git a/tests/MockMe Tests With Path Spaces/PathSpacesTests.cs b/tests/MockMe Tests With Path Spaces/PathSpacesTests.cs new file mode 100644 index 0000000..5c35beb --- /dev/null +++ b/tests/MockMe Tests With Path Spaces/PathSpacesTests.cs @@ -0,0 +1,26 @@ +using MockMe; +using MockMe.Tests.ExampleClasses; +using Xunit; + +namespace MockMe_Tests_With_Path_Spaces; + +public class PathSpacesTests +{ + /// + /// Regression test for this issue building projects when the project path contained a space + /// https://github.com/connorivy/MockMe/issues/20 + /// + [Fact] + public void AssemblyWithPathSpaces_ThatUsesGenericMethodMock_ShouldWork() + { + var mock = Mock.Me(default(ClassWithGenericMethods)); + + mock.Setup.ThreeGenericTypes(Arg.Any(), Arg.Any(), Arg.Any()) + .Returns("asdf"); + + ClassWithGenericMethods obj = mock; + + var result = obj.ThreeGenericTypes("Hello", 1, 9.9); + Assert.Equal("asdf", result); + } +} diff --git a/tests/MockMe.Tests.ExampleClasses/Directory.Build.props b/tests/MockMe.Tests.ExampleClasses/Directory.Build.props index 9e4d16e..21d98a3 100644 --- a/tests/MockMe.Tests.ExampleClasses/Directory.Build.props +++ b/tests/MockMe.Tests.ExampleClasses/Directory.Build.props @@ -1,8 +1,8 @@ - + diff --git a/tests/MockMe.Tests.ExampleClasses/MockMe.Tests.ExampleClasses.csproj b/tests/MockMe.Tests.ExampleClasses/MockMe.Tests.ExampleClasses.csproj index ca115d7..b92b65a 100644 --- a/tests/MockMe.Tests.ExampleClasses/MockMe.Tests.ExampleClasses.csproj +++ b/tests/MockMe.Tests.ExampleClasses/MockMe.Tests.ExampleClasses.csproj @@ -1,12 +1,3 @@  - - - net6.0 - - - - - - diff --git a/tests/MockMe.Tests.Overloads.Interface/MockMe.Tests.Overloads.Interface.csproj b/tests/MockMe.Tests.Overloads.Interface/MockMe.Tests.Overloads.Interface.csproj index 11bd4ec..b04b320 100644 --- a/tests/MockMe.Tests.Overloads.Interface/MockMe.Tests.Overloads.Interface.csproj +++ b/tests/MockMe.Tests.Overloads.Interface/MockMe.Tests.Overloads.Interface.csproj @@ -1,7 +1,6 @@  - net6.0 enable false diff --git a/tests/MockMe.Tests.Overloads.Sealed/MockMe.Tests.Overloads.Sealed.csproj b/tests/MockMe.Tests.Overloads.Sealed/MockMe.Tests.Overloads.Sealed.csproj index d391a89..12193b1 100644 --- a/tests/MockMe.Tests.Overloads.Sealed/MockMe.Tests.Overloads.Sealed.csproj +++ b/tests/MockMe.Tests.Overloads.Sealed/MockMe.Tests.Overloads.Sealed.csproj @@ -1,7 +1,6 @@  - net6.0 enable false diff --git a/tests/MockMe.Tests.Overloads.Virtual/AllOverloads.cs b/tests/MockMe.Tests.Overloads.Virtual/AllOverloads.cs index 0b353f1..db7cf12 100644 --- a/tests/MockMe.Tests.Overloads.Virtual/AllOverloads.cs +++ b/tests/MockMe.Tests.Overloads.Virtual/AllOverloads.cs @@ -3,11 +3,13 @@ using System.Threading.Tasks; #pragma warning disable CA1716 // Using reserved word in namespace +#pragma warning disable IDE0130 // Namespace does not match folder structure namespace MockMe.Tests.Overloads +#pragma warning restore IDE0130 // Namespace does not match folder structure #pragma warning restore CA1716 // Using reserved word in namespace { [ExcludeFromCodeCoverage] - internal class AllOverloads + public class AllOverloads { public int OutArgument(out int arg) => throw new NotImplementedException(); diff --git a/tests/MockMe.Tests.Overloads.Virtual/MockMe.Tests.Overloads.Virtual.csproj b/tests/MockMe.Tests.Overloads.Virtual/MockMe.Tests.Overloads.Virtual.csproj index 11bd4ec..b04b320 100644 --- a/tests/MockMe.Tests.Overloads.Virtual/MockMe.Tests.Overloads.Virtual.csproj +++ b/tests/MockMe.Tests.Overloads.Virtual/MockMe.Tests.Overloads.Virtual.csproj @@ -1,7 +1,6 @@  - net6.0 enable false diff --git a/tests/MockMe.Tests.Runner/MockMe.Tests.Runner.csproj b/tests/MockMe.Tests.Runner/MockMe.Tests.Runner.csproj index 74abf5c..068627b 100644 --- a/tests/MockMe.Tests.Runner/MockMe.Tests.Runner.csproj +++ b/tests/MockMe.Tests.Runner/MockMe.Tests.Runner.csproj @@ -2,7 +2,6 @@ Exe - net6.0 enable enable diff --git a/tests/MockMe.Tests.slnf b/tests/MockMe.Tests.slnf index 4997fbe..72e8949 100644 --- a/tests/MockMe.Tests.slnf +++ b/tests/MockMe.Tests.slnf @@ -2,6 +2,7 @@ "solution": { "path": "..\\MockMe.sln", "projects": [ + "tests\\MockMe Tests With Path Spaces\\MockMe Tests With Path Spaces.csproj", "tests\\MockMe.Tests.ExampleClasses\\MockMe.Tests.ExampleClasses.csproj", "tests\\MockMe.Tests.Overloads.Interface\\MockMe.Tests.Overloads.Interface.csproj", "tests\\MockMe.Tests.Overloads.Sealed\\MockMe.Tests.Overloads.Sealed.csproj", diff --git a/tests/MockMe.Tests/MockMe.Tests.csproj b/tests/MockMe.Tests/MockMe.Tests.csproj index bedfa53..d4c5a31 100644 --- a/tests/MockMe.Tests/MockMe.Tests.csproj +++ b/tests/MockMe.Tests/MockMe.Tests.csproj @@ -1,7 +1,6 @@  - net6.0 enable false @@ -13,7 +12,6 @@ --> - diff --git a/wiki/AdvancedUsage.md b/wiki/AdvancedUsage.md index 35d2bed..288062a 100644 --- a/wiki/AdvancedUsage.md +++ b/wiki/AdvancedUsage.md @@ -11,7 +11,7 @@ class MyCoolClass var mock = Mock.Me(default(MyCoolClass)); -// the out parameter can be discarded, as it doesn't do anything here. +// the out parameter can be discarded, as it doesn't do anything when used by the Setup or Assert property methods. // the only reason it is here is because dropping it could lead to conflicts with other method overloads mock.Setup.TryGetVal(Arg.Any(), out _).Returns(args => { diff --git a/wiki/QuickStart.md b/wiki/QuickStart.md index 027f81a..cfefed0 100644 --- a/wiki/QuickStart.md +++ b/wiki/QuickStart.md @@ -1,3 +1,29 @@ +# Example class to mock + +The following examples assume you are mocking a `Calculator` class which looks like this +```csharp +public sealed class Calculator +{ + public int Add(int x, int y) { } + + public Task AddAsync(int x, int y) { } + + public CalculatorType CalculatorType { get; set; } + + public double this[string index] + { + get { } + set { } + } +} + +public enum CalculatorType +{ + Standard, + Scientific, + Graphing, +} +``` # Controlling Return Value You can control the return value of public methods and properties by using the 'Setup' property combined with the 'Returns' method.