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.