From 997f29fbfd8b41dc3a7534954c5be33cd053257e Mon Sep 17 00:00:00 2001 From: connorivy <43247197+connorivy@users.noreply.github.com> Date: Wed, 27 Nov 2024 11:10:27 -0600 Subject: [PATCH] More generic tests (#14) * add coverage to new test * add property tests * change arg.any to method instead of prop * generic classes working * generic classes working and fixed indexers * remove unused code * update test coverage process * no need to restore (I think?) * add props * switch up the order * clean up buildAndTest yaml * switch up NumTimes * add throws functionality * add interface overload tests * fix tests slnf * add support for internal interface calls * fix tests * add nuget icon * fix warnings * exclude dummy class from code cov * add more generic tests * Merge remote-tracking branch 'origin/main' into dev * fix errors * add tests for virtual members --- MockMe.sln | 10 +- .../GenericClassMethodPatchMethodGenerator.cs | 4 +- src/MockMe/Images/MockMeM.png | Bin 58737 -> 3717 bytes .../ClassWithGenericMethods.cs | 13 + .../AllOverloads.cs | 611 ++++++++++++++++++ .../MockMe.Tests.Overloads.Virtual.csproj | 25 + tests/MockMe.Tests.slnf | 1 + tests/MockMe.Tests/ArgTests.cs | 1 - tests/MockMe.Tests/AssertionTests.cs | 2 +- tests/MockMe.Tests/GenericClassTests.cs | 20 +- tests/MockMe.Tests/GenericMethodTests.cs | 28 +- HowDoesItWork.md => wiki/HowDoesItWork.md | 0 12 files changed, 692 insertions(+), 23 deletions(-) create mode 100644 tests/MockMe.Tests.ExampleClasses/ClassWithGenericMethods.cs create mode 100644 tests/MockMe.Tests.Overloads.Virtual/AllOverloads.cs create mode 100644 tests/MockMe.Tests.Overloads.Virtual/MockMe.Tests.Overloads.Virtual.csproj rename HowDoesItWork.md => wiki/HowDoesItWork.md (100%) diff --git a/MockMe.sln b/MockMe.sln index 368b0ae..d7a646d 100644 --- a/MockMe.sln +++ b/MockMe.sln @@ -36,7 +36,7 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "wiki", "wiki", "{4723EF4B-98A5-4F3D-BEB9-0632A3939D4D}" ProjectSection(SolutionItems) = preProject wiki\AvoidingCommonPitfalls.md = wiki\AvoidingCommonPitfalls.md - HowDoesItWork.md = HowDoesItWork.md + wiki\HowDoesItWork.md = wiki\HowDoesItWork.md wiki\QuickStart.md = wiki\QuickStart.md EndProjectSection EndProject @@ -48,6 +48,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MockMe.Tests.Overloads.Seal EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MockMe.Tests.Overloads.Interface", "tests\MockMe.Tests.Overloads.Interface\MockMe.Tests.Overloads.Interface.csproj", "{E08ADBB1-7CB8-4BFF-9BAC-485DC7822719}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MockMe.Tests.Overloads.Virtual", "tests\MockMe.Tests.Overloads.Virtual\MockMe.Tests.Overloads.Virtual.csproj", "{2F9424F6-0BB5-4BD8-92A7-3625A666111F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -86,6 +88,10 @@ Global {E08ADBB1-7CB8-4BFF-9BAC-485DC7822719}.Debug|Any CPU.Build.0 = Debug|Any CPU {E08ADBB1-7CB8-4BFF-9BAC-485DC7822719}.Release|Any CPU.ActiveCfg = Release|Any CPU {E08ADBB1-7CB8-4BFF-9BAC-485DC7822719}.Release|Any CPU.Build.0 = Release|Any CPU + {2F9424F6-0BB5-4BD8-92A7-3625A666111F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2F9424F6-0BB5-4BD8-92A7-3625A666111F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2F9424F6-0BB5-4BD8-92A7-3625A666111F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2F9424F6-0BB5-4BD8-92A7-3625A666111F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -100,12 +106,14 @@ Global {705ED000-6380-4C9E-BF2E-71BA8C390E28} = {134D18E2-ECAC-4571-B7BE-0C10796D5555} {1CDE1684-1F3F-AF84-5126-85482E225FD8} = {134D18E2-ECAC-4571-B7BE-0C10796D5555} {E08ADBB1-7CB8-4BFF-9BAC-485DC7822719} = {134D18E2-ECAC-4571-B7BE-0C10796D5555} + {2F9424F6-0BB5-4BD8-92A7-3625A666111F} = {134D18E2-ECAC-4571-B7BE-0C10796D5555} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {CF07A0CA-1140-44DC-9E7E-F99E65D9EF97} EndGlobalSection GlobalSection(SharedMSBuildProjectFiles) = preSolution tests\MockMe.Tests.Overloads\MockMe.Tests.Overloads.projitems*{1cde1684-1f3f-af84-5126-85482e225fd8}*SharedItemsImports = 5 + tests\MockMe.Tests.Overloads\MockMe.Tests.Overloads.projitems*{2f9424f6-0bb5-4bd8-92a7-3625a666111f}*SharedItemsImports = 5 tests\MockMe.Tests.Overloads\MockMe.Tests.Overloads.projitems*{705ed000-6380-4c9e-bf2e-71ba8c390e28}*SharedItemsImports = 13 tests\MockMe.Tests.Overloads\MockMe.Tests.Overloads.projitems*{e08adbb1-7cb8-4bff-9bac-485dc7822719}*SharedItemsImports = 5 EndGlobalSection diff --git a/src/MockMe.Generator/MockGenerators/PatchMethodGenerators/GenericClassMethodPatchMethodGenerator.cs b/src/MockMe.Generator/MockGenerators/PatchMethodGenerators/GenericClassMethodPatchMethodGenerator.cs index 1c6a38a..4a09aad 100644 --- a/src/MockMe.Generator/MockGenerators/PatchMethodGenerators/GenericClassMethodPatchMethodGenerator.cs +++ b/src/MockMe.Generator/MockGenerators/PatchMethodGenerators/GenericClassMethodPatchMethodGenerator.cs @@ -73,7 +73,7 @@ string typeSymbolName ) .GetValue(mock); - return ({returnType}) + {(isVoidReturnType ? "" : $"return ({returnType})")} callTracker .GetType() .GetMethod( @@ -84,7 +84,7 @@ string typeSymbolName {string.Join(", ", this.MethodSymbol.TypeParameters.Select(p => p.Name.AddOnIfNotEmpty("typeof(", ")"))) .AddOnIfNotEmpty(".MakeGenericMethod(", ")")} .Invoke(callTracker, new object[] {{ {paramString} }}); }} - return default; + return{(isVoidReturnType ? "" : " default")}; }} " ); diff --git a/src/MockMe/Images/MockMeM.png b/src/MockMe/Images/MockMeM.png index 6ace99bdd0e3a16876a7afc4641dbb9e6b373f32..e684b917d4dbba76b3db0aee265b1869ba7cea54 100644 GIT binary patch literal 3717 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 W6&D8FwHO}?z}(o{sLH@C`u_l*ny$qF literal 58737 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

ChHM$-&y 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 diff --git a/tests/MockMe.Tests.ExampleClasses/ClassWithGenericMethods.cs b/tests/MockMe.Tests.ExampleClasses/ClassWithGenericMethods.cs new file mode 100644 index 0000000..c42fe78 --- /dev/null +++ b/tests/MockMe.Tests.ExampleClasses/ClassWithGenericMethods.cs @@ -0,0 +1,13 @@ +using System; + +namespace MockMe.Tests.ExampleClasses; + +public class ClassWithGenericMethods +{ + public T OneGenericType(T t) => throw new NotImplementedException(); + + public T1 TwoGenericTypes(T1 t, T2 t2) => throw new NotImplementedException(); + + public T1 ThreeGenericTypes(T1 t, T2 t2, T3 t3) => + throw new NotImplementedException(); +} diff --git a/tests/MockMe.Tests.Overloads.Virtual/AllOverloads.cs b/tests/MockMe.Tests.Overloads.Virtual/AllOverloads.cs new file mode 100644 index 0000000..433f0a1 --- /dev/null +++ b/tests/MockMe.Tests.Overloads.Virtual/AllOverloads.cs @@ -0,0 +1,611 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using System.Threading.Tasks; + +#pragma warning disable CA1716 // Using reserved word in namespace +namespace MockMe.Tests.Overloads +#pragma warning restore CA1716 // Using reserved word in namespace +{ + [ExcludeFromCodeCoverage] + internal class AllOverloads + { + protected virtual int ProtectedProp { get; set; } + + protected virtual int ProtectedMethod() => throw new NotImplementedException(); + + internal virtual int InternalProp { get; set; } + + internal virtual int InternalMethod() => throw new NotImplementedException(); + + public virtual int Prop_GetSet { get; set; } + public virtual int Prop_GetInit { get; init; } + public virtual int Prop_GetOnly { get; } + public virtual int Prop_SetOnly + { + set => throw new NotImplementedException(); + } + + public string this[int index] + { + get => throw new NotImplementedException(); + set => throw new NotImplementedException(); + } + + public virtual int this[string index] + { + get => throw new NotImplementedException(); + set => throw new NotImplementedException(); + } + + public double this[double index] + { + set => throw new NotImplementedException(); + } + internal virtual int this[float index] + { + get => throw new NotImplementedException(); + set => throw new NotImplementedException(); + } + protected virtual int this[decimal index] + { + get => throw new NotImplementedException(); + set => throw new NotImplementedException(); + } + + public virtual void VoidReturn() => throw new NotImplementedException(); + + public virtual void VoidReturn(int p1) => throw new NotImplementedException(); + + public virtual void VoidReturn(int p1, int p2) => throw new NotImplementedException(); + + public virtual void VoidReturn(int p1, int p2, int p3) => + throw new NotImplementedException(); + + public virtual void VoidReturn(int p1, int p2, int p3, int p4) => + throw new NotImplementedException(); + + public virtual void VoidReturn(int p1, int p2, int p3, int p4, int p5) => + throw new NotImplementedException(); + + public virtual void VoidReturn(int p1, int p2, int p3, int p4, int p5, int p6) => + throw new NotImplementedException(); + + public virtual void VoidReturn(int p1, int p2, int p3, int p4, int p5, int p6, int p7) => + throw new NotImplementedException(); + + public virtual void VoidReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8 + ) => throw new NotImplementedException(); + + public virtual void VoidReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9 + ) => throw new NotImplementedException(); + + public virtual void VoidReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10 + ) => throw new NotImplementedException(); + + public virtual void VoidReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11 + ) => throw new NotImplementedException(); + + public virtual void VoidReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11, + int p12 + ) => throw new NotImplementedException(); + + public virtual void VoidReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11, + int p12, + int p13 + ) => throw new NotImplementedException(); + + public virtual void VoidReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11, + int p12, + int p13, + int p14 + ) => throw new NotImplementedException(); + + public virtual void VoidReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11, + int p12, + int p13, + int p14, + int p15 + ) => throw new NotImplementedException(); + + public virtual int SyncReturn() => throw new NotImplementedException(); + + public virtual int SyncReturn(int p1) => throw new NotImplementedException(); + + public virtual int SyncReturn(int p1, int p2) => throw new NotImplementedException(); + + public virtual int SyncReturn(int p1, int p2, int p3) => + throw new NotImplementedException(); + + public virtual int SyncReturn(int p1, int p2, int p3, int p4) => + throw new NotImplementedException(); + + public virtual int SyncReturn(int p1, int p2, int p3, int p4, int p5) => + throw new NotImplementedException(); + + public virtual int SyncReturn(int p1, int p2, int p3, int p4, int p5, int p6) => + throw new NotImplementedException(); + + public virtual int SyncReturn(int p1, int p2, int p3, int p4, int p5, int p6, int p7) => + throw new NotImplementedException(); + + public virtual int SyncReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8 + ) => throw new NotImplementedException(); + + public virtual int SyncReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9 + ) => throw new NotImplementedException(); + + public virtual int SyncReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10 + ) => throw new NotImplementedException(); + + public virtual int SyncReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11 + ) => throw new NotImplementedException(); + + public virtual int SyncReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11, + int p12 + ) => throw new NotImplementedException(); + + public virtual int SyncReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11, + int p12, + int p13 + ) => throw new NotImplementedException(); + + public virtual int SyncReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11, + int p12, + int p13, + int p14 + ) => throw new NotImplementedException(); + + public virtual int SyncReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11, + int p12, + int p13, + int p14, + int p15 + ) => throw new NotImplementedException(); + + public virtual Task AsyncReturn() => throw new NotImplementedException(); + + public virtual Task AsyncReturn(int p1) => throw new NotImplementedException(); + + public virtual Task AsyncReturn(int p1, int p2) => throw new NotImplementedException(); + + public virtual Task AsyncReturn(int p1, int p2, int p3) => + throw new NotImplementedException(); + + public virtual Task AsyncReturn(int p1, int p2, int p3, int p4) => + throw new NotImplementedException(); + + public virtual Task AsyncReturn(int p1, int p2, int p3, int p4, int p5) => + throw new NotImplementedException(); + + public virtual Task AsyncReturn(int p1, int p2, int p3, int p4, int p5, int p6) => + throw new NotImplementedException(); + + public virtual Task AsyncReturn(int p1, int p2, int p3, int p4, int p5, int p6, int p7) => + throw new NotImplementedException(); + + public virtual Task AsyncReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8 + ) => throw new NotImplementedException(); + + public virtual Task AsyncReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9 + ) => throw new NotImplementedException(); + + public virtual Task AsyncReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10 + ) => throw new NotImplementedException(); + + public virtual Task AsyncReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11 + ) => throw new NotImplementedException(); + + public virtual Task AsyncReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11, + int p12 + ) => throw new NotImplementedException(); + + public virtual Task AsyncReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11, + int p12, + int p13 + ) => throw new NotImplementedException(); + + public virtual Task AsyncReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11, + int p12, + int p13, + int p14 + ) => throw new NotImplementedException(); + + public virtual Task AsyncReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11, + int p12, + int p13, + int p14, + int p15 + ) => throw new NotImplementedException(); + + public virtual Task AsyncOfTReturn() => throw new NotImplementedException(); + + public virtual Task AsyncOfTReturn(int p1) => throw new NotImplementedException(); + + public virtual Task AsyncOfTReturn(int p1, int p2) => + throw new NotImplementedException(); + + public virtual Task AsyncOfTReturn(int p1, int p2, int p3) => + throw new NotImplementedException(); + + public virtual Task AsyncOfTReturn(int p1, int p2, int p3, int p4) => + throw new NotImplementedException(); + + public virtual Task AsyncOfTReturn(int p1, int p2, int p3, int p4, int p5) => + throw new NotImplementedException(); + + public virtual Task AsyncOfTReturn(int p1, int p2, int p3, int p4, int p5, int p6) => + throw new NotImplementedException(); + + public virtual Task AsyncOfTReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7 + ) => throw new NotImplementedException(); + + public virtual Task AsyncOfTReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8 + ) => throw new NotImplementedException(); + + public virtual Task AsyncOfTReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9 + ) => throw new NotImplementedException(); + + public virtual Task AsyncOfTReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10 + ) => throw new NotImplementedException(); + + public virtual Task AsyncOfTReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11 + ) => throw new NotImplementedException(); + + public virtual Task AsyncOfTReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11, + int p12 + ) => throw new NotImplementedException(); + + public virtual Task AsyncOfTReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11, + int p12, + int p13 + ) => throw new NotImplementedException(); + + public virtual Task AsyncOfTReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11, + int p12, + int p13, + int p14 + ) => throw new NotImplementedException(); + + public virtual Task AsyncOfTReturn( + int p1, + int p2, + int p3, + int p4, + int p5, + int p6, + int p7, + int p8, + int p9, + int p10, + int p11, + int p12, + int p13, + int p14, + int p15 + ) => 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 new file mode 100644 index 0000000..0e5239c --- /dev/null +++ b/tests/MockMe.Tests.Overloads.Virtual/MockMe.Tests.Overloads.Virtual.csproj @@ -0,0 +1,25 @@ + + + + net6.0 + enable + + false + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + diff --git a/tests/MockMe.Tests.slnf b/tests/MockMe.Tests.slnf index 1c1f0f3..4997fbe 100644 --- a/tests/MockMe.Tests.slnf +++ b/tests/MockMe.Tests.slnf @@ -5,6 +5,7 @@ "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", + "tests\\MockMe.Tests.Overloads.Virtual\\MockMe.Tests.Overloads.Virtual.csproj", "tests\\MockMe.Tests.Overloads\\MockMe.Tests.Overloads.shproj", "tests\\MockMe.Tests\\MockMe.Tests.csproj" ] diff --git a/tests/MockMe.Tests/ArgTests.cs b/tests/MockMe.Tests/ArgTests.cs index 3c01713..43cff1c 100644 --- a/tests/MockMe.Tests/ArgTests.cs +++ b/tests/MockMe.Tests/ArgTests.cs @@ -1,4 +1,3 @@ -using System; using MockMe.Asserters; using MockMe.Exceptions; using MockMe.Tests.ExampleClasses; diff --git a/tests/MockMe.Tests/AssertionTests.cs b/tests/MockMe.Tests/AssertionTests.cs index 341acf1..2d01f21 100644 --- a/tests/MockMe.Tests/AssertionTests.cs +++ b/tests/MockMe.Tests/AssertionTests.cs @@ -11,7 +11,7 @@ public class AssertionTests [Fact] public void TestWasCalled_ForMethodWithNoArgsAndNoReturnVal() { - var calculatorMock = Mock.Me(default(Calculator)); + var calculatorMock = Mock.Me(); Assert.ThrowsAny(() => calculatorMock.Assert.TurnOff().WasCalled()); diff --git a/tests/MockMe.Tests/GenericClassTests.cs b/tests/MockMe.Tests/GenericClassTests.cs index 10a3cba..ecd1e72 100644 --- a/tests/MockMe.Tests/GenericClassTests.cs +++ b/tests/MockMe.Tests/GenericClassTests.cs @@ -7,7 +7,7 @@ public class ConnorsCoolGenericType { public T GetRandomVal() => throw new NotImplementedException(); - public T MyCoolProp => throw new NotImplementedException(); + public T? MyCoolProp { get; set; } public string TakeAT(T input) => throw new NotImplementedException(); } @@ -107,5 +107,23 @@ public void MultipleReferenceTypeOverloads_ShouldReturnConfiguredValues() Assert.Equal(myObj, returnVal); Assert.Equal("returnVal", returnString); } + + [Fact] + public void PropertyOfGenericClassType_ShouldReturnConfiguredValues() + { + var mockString = Mock.Me>(); + + mockString.Setup.MyCoolProp.Get().Returns("returnVal"); + string? setVal = null; + mockString.Setup.MyCoolProp.Set(Arg.Any()).Callback(x => setVal = x); + + ConnorsCoolGenericType coolStringType = mockString; + + Assert.Equal("returnVal", coolStringType.MyCoolProp); + coolStringType.MyCoolProp = "set value"; + Assert.Equal("set value", setVal); + mockString.Assert.MyCoolProp.Get().WasCalled(); + mockString.Assert.MyCoolProp.Set("set value").WasCalled(); + } } } diff --git a/tests/MockMe.Tests/GenericMethodTests.cs b/tests/MockMe.Tests/GenericMethodTests.cs index 5cc0945..5e74a4f 100644 --- a/tests/MockMe.Tests/GenericMethodTests.cs +++ b/tests/MockMe.Tests/GenericMethodTests.cs @@ -1,5 +1,4 @@ //using MockMe.Tests.SampleClasses; -using System.Collections.Generic; using MockMe.Tests.ExampleClasses; using Xunit; @@ -17,26 +16,21 @@ public void GenericMethod_ShouldReturnConfiguredValue() ComplexCalculator calc = (ComplexCalculator)mock; var result = calc.ComputeHashForObjects(new int[] { 1, 2, 3, 4, 5 }); + Assert.Equal(99, result); } - //[Fact] - //public void GenericClass_ShouldReturnConfiguredValue() - //{ - // //var mock = Mock.Me>(); - - // var stringMock = Mock.Me>(); - - // //mock.Setup.Contains(5).Returns(true); - - // stringMock.Setup.Contains("hello").Returns(true); - - // //List list = mock; + [Fact] + public void GenericMethodWithMultipleGenericArgs_ShouldReturnConfiguredValue() + { + var mock = Mock.Me(); - // //list.set_Item(5) + mock.Setup.ThreeGenericTypes(Arg.Any(), Arg.Any(), Arg.Any()) + .Returns("asdf"); - // //var result = list.Contains(5); + ClassWithGenericMethods obj = mock; - // var x = stringMock.MockedObject.Contains("hello"); - //} + var result = obj.ThreeGenericTypes("Hello", 1, 9.9); + Assert.Equal("asdf", result); + } } } diff --git a/HowDoesItWork.md b/wiki/HowDoesItWork.md similarity index 100% rename from HowDoesItWork.md rename to wiki/HowDoesItWork.md