diff --git a/Source/Interceptor.cs b/Source/Interceptor.cs index 4503e5175..324e628df 100644 --- a/Source/Interceptor.cs +++ b/Source/Interceptor.cs @@ -118,7 +118,7 @@ private IEnumerable InterceptionStrategies() yield return new HandleDestructor(); yield return new HandleTracking(); yield return new InterceptMockPropertyMixin(); - yield return new InterceptToStringMixin(); + yield return new InterceptObjectMethodsMixin(); yield return new AddActualInvocation(); yield return new ExtractProxyCall(); yield return new ExecuteCall(); diff --git a/Source/InterceptorStrategies.cs b/Source/InterceptorStrategies.cs index e105b0fb3..6521b31cc 100644 --- a/Source/InterceptorStrategies.cs +++ b/Source/InterceptorStrategies.cs @@ -133,25 +133,42 @@ public InterceptionAction HandleIntercept(ICallContext invocation, InterceptorCo } } - internal class InterceptToStringMixin : IInterceptStrategy + /// + /// Intercept strategy that handles `System.Object` methods. + /// + internal class InterceptObjectMethodsMixin : IInterceptStrategy { public InterceptionAction HandleIntercept(ICallContext invocation, InterceptorContext ctx, CurrentInterceptContext localctx) { var method = invocation.Method; - // Only if there is no corresponding setup - if (IsObjectToStringMethod(method) && !ctx.OrderedCalls.Select(c => IsObjectToStringMethod(c.Method)).Any()) + // Only if there is no corresponding setup for `ToString()` + if (IsObjectMethod(method, "ToString") && !ctx.OrderedCalls.Select(c => IsObjectMethod(c.Method, "ToString")).Any()) { invocation.ReturnValue = ctx.Mock.ToString() + ".Object"; return InterceptionAction.Stop; } + // Only if there is no corresponding setup for `GetHashCode()` + if (IsObjectMethod(method, "GetHashCode") && !ctx.OrderedCalls.Select(c => IsObjectMethod(c.Method, "GetHashCode")).Any()) + { + invocation.ReturnValue = ctx.Mock.GetHashCode(); + return InterceptionAction.Stop; + } + + // Only if there is no corresponding setup for `Equals()` + if (IsObjectMethod(method, "Equals") && !ctx.OrderedCalls.Select(c => IsObjectMethod(c.Method, "Equals")).Any()) + { + invocation.ReturnValue = ReferenceEquals(invocation.Arguments.First(), ctx.Mock.Object); + return InterceptionAction.Stop; + } + return InterceptionAction.Continue; } - protected bool IsObjectToStringMethod(MethodInfo method) + protected bool IsObjectMethod(MethodInfo method, string name) { - if (method.DeclaringType == typeof(object) && method.Name == "ToString") + if (method.DeclaringType == typeof(object) && method.Name == name) { return true; } diff --git a/UnitTests/Regressions/IssueReportsFixture.cs b/UnitTests/Regressions/IssueReportsFixture.cs index 56565c472..05a2e2b99 100644 --- a/UnitTests/Regressions/IssueReportsFixture.cs +++ b/UnitTests/Regressions/IssueReportsFixture.cs @@ -22,60 +22,60 @@ // NOTE class without namespace public class _181 { - [Fact] - public void ReproTest() - { - var mock = new Mock(); - mock.Object.Dispose(); - - mock.Verify(d => d.Dispose()); - } + [Fact] + public void ReproTest() + { + var mock = new Mock(); + mock.Object.Dispose(); + + mock.Verify(d => d.Dispose()); + } } #endregion namespace Moq.Tests.Regressions { - public class IssueReportsFixture - { - // @ GitHub + public class IssueReportsFixture + { + // @ GitHub - #region #54 + #region #54 - public class Issue54 - { - public interface IFoo - { - void Bar(); - } + public class Issue54 + { + public interface IFoo + { + void Bar(); + } - [Fact] - public void when_as_disposable_then_succeeds() - { - var mock = new Mock(); - mock.Setup(x => x.Bar()); - mock.As().Setup(x => x.Dispose()); + [Fact] + public void when_as_disposable_then_succeeds() + { + var mock = new Mock(); + mock.Setup(x => x.Bar()); + mock.As().Setup(x => x.Dispose()); - Action testMock = (IFoo foo) => - { - foo.Bar(); + Action testMock = (IFoo foo) => + { + foo.Bar(); - var disposable = foo as IDisposable; + var disposable = foo as IDisposable; - if (disposable != null) - { - disposable.Dispose(); - } - }; + if (disposable != null) + { + disposable.Dispose(); + } + }; - testMock(mock.Object); + testMock(mock.Object); - mock.VerifyAll(); - } - } + mock.VerifyAll(); + } + } - #endregion + #endregion #region 47 & 62 #if !SILVERLIGHT @@ -228,7 +228,7 @@ public void when_a_method_doesnt_have_generic_parameters_exception_doesnt_includ #endregion // #176 - #region #184 + #region #184 public class Issue184 { @@ -247,1756 +247,1778 @@ public void strict_mock_accepts_null_as_nullable_guid_value() } } - #endregion // #184 + #endregion // #184 + + #region #252 + + public class Issue252 + { + [Fact] + public void SetupsWithSameArgumentsInDifferentOrderShouldNotOverwriteEachOther() + { + var mock = new Mock(); + + var a = new MyClass(); + var b = new MyClass(); - #region #252 + mock.Setup(m => m.Method(a, b)).Returns(1); + mock.Setup(m => m.Method(b, a)).Returns(2); - public class Issue252 - { - [Fact] - public void SetupsWithSameArgumentsInDifferentOrderShouldNotOverwriteEachOther() - { - var mock = new Mock(); + Assert.Equal(1, mock.Object.Method(a, b)); + Assert.Equal(2, mock.Object.Method(b, a)); + } + + public interface ISimpleInterface + { + int Method(MyClass a, MyClass b); + } + + public class MyClass { } + } + + #endregion // #252 - var a = new MyClass(); - var b = new MyClass(); - - mock.Setup(m => m.Method(a, b)).Returns(1); - mock.Setup(m => m.Method(b, a)).Returns(2); + #region #273 - Assert.Equal(1, mock.Object.Method(a, b)); - Assert.Equal(2, mock.Object.Method(b, a)); - } + public class Issue273 + { + [Fact] + public void SystemObjectMethodsShouldWorkInStrictMocks() + { + var mockObject = new Mock(MockBehavior.Strict).Object; - public interface ISimpleInterface - { - int Method(MyClass a, MyClass b); - } + Assert.IsType(typeof(int), mockObject.GetHashCode()); + Assert.IsType(typeof(string), mockObject.ToString()); + Assert.False(mockObject.Equals("ImNotTheObject")); + Assert.True(mockObject.Equals(mockObject)); + } - public class MyClass { } - } + public interface IMyInterface + { + } + } - #endregion // #252 + #endregion // #252 - // Old @ Google Code + // Old @ Google Code - #region #47 + #region #47 - [Fact] - public void ShouldReturnListFromDateTimeArg() - { - var items = new List() { "Foo", "Bar" }; + [Fact] + public void ShouldReturnListFromDateTimeArg() + { + var items = new List() { "Foo", "Bar" }; - var mock = new Mock(MockBehavior.Strict); - mock - .Setup(m => m.GetValuesSince(It.IsAny())) - .Returns(items); + var mock = new Mock(MockBehavior.Strict); + mock + .Setup(m => m.GetValuesSince(It.IsAny())) + .Returns(items); - var actual = mock.Object.GetValuesSince(DateTime.Now).ToList(); + var actual = mock.Object.GetValuesSince(DateTime.Now).ToList(); - Assert.Equal(items.Count, actual.Count); - } + Assert.Equal(items.Count, actual.Count); + } - public interface IMyClass - { - IEnumerable GetValuesSince(DateTime since); - } + public interface IMyClass + { + IEnumerable GetValuesSince(DateTime since); + } - #endregion + #endregion - #region #48 + #region #48 - public class Issue48 - { - [Fact] - public void ExpectsOnIndexer() - { - var mock = new Mock(); - mock.Setup(m => m[0]).Returns("a"); - mock.Setup(m => m[1]).Returns("b"); + public class Issue48 + { + [Fact] + public void ExpectsOnIndexer() + { + var mock = new Mock(); + mock.Setup(m => m[0]).Returns("a"); + mock.Setup(m => m[1]).Returns("b"); - Assert.Equal("a", mock.Object[0]); - Assert.Equal("b", mock.Object[1]); - Assert.Equal(default(string), mock.Object[2]); - } + Assert.Equal("a", mock.Object[0]); + Assert.Equal("b", mock.Object[1]); + Assert.Equal(default(string), mock.Object[2]); + } - public interface ISomeInterface - { - string this[int index] { get; set; } - } - } + public interface ISomeInterface + { + string this[int index] { get; set; } + } + } - #endregion + #endregion - #region #52 + #region #52 - [Fact] - public void ShouldNotOverridePreviousExpectation() - { - var ids = Enumerable.Range(1, 10); - var mock = new Mock(MockBehavior.Strict); + [Fact] + public void ShouldNotOverridePreviousExpectation() + { + var ids = Enumerable.Range(1, 10); + var mock = new Mock(MockBehavior.Strict); - foreach (var id in ids) - { - mock.Setup(x => x.DoSomething(id)); - } + foreach (var id in ids) + { + mock.Setup(x => x.DoSomething(id)); + } - var component = mock.Object; + var component = mock.Object; - foreach (var id in ids) - { - component.DoSomething(id); - } - } + foreach (var id in ids) + { + component.DoSomething(id); + } + } - public interface IOverwritingMethod - { - void DoSomething(int id); - } + public interface IOverwritingMethod + { + void DoSomething(int id); + } - #endregion + #endregion - #region #62 + #region #62 - public interface ISomething - { - void DoSomething() where U : T; - } + public interface ISomething + { + void DoSomething() where U : T; + } - [Fact] - public void CreatesMockWithGenericsConstraints() - { - var mock = new Mock>(); - } + [Fact] + public void CreatesMockWithGenericsConstraints() + { + var mock = new Mock>(); + } - #endregion + #endregion - #region #60 + #region #60 - public interface IFoo - { - void DoThings(object arg); - } + public interface IFoo + { + void DoThings(object arg); + } - [Fact] - public void TwoExpectations() - { - Mock mocked = new Mock(MockBehavior.Strict); - object arg1 = new object(); - object arg2 = new object(); + [Fact] + public void TwoExpectations() + { + Mock mocked = new Mock(MockBehavior.Strict); + object arg1 = new object(); + object arg2 = new object(); - mocked.Setup(m => m.DoThings(arg1)); - mocked.Setup(m => m.DoThings(arg2)); + mocked.Setup(m => m.DoThings(arg1)); + mocked.Setup(m => m.DoThings(arg2)); - mocked.Object.DoThings(arg1); - mocked.Object.DoThings(arg2); + mocked.Object.DoThings(arg1); + mocked.Object.DoThings(arg2); - mocked.VerifyAll(); - } + mocked.VerifyAll(); + } - #endregion + #endregion - #region #21 + #region #21 - [Fact] - public void MatchesLatestExpectations() - { - var mock = new Mock(); + [Fact] + public void MatchesLatestExpectations() + { + var mock = new Mock(); - mock.Setup(m => m.Method(It.IsAny())).Returns(0); - mock.Setup(m => m.Method(It.IsInRange(0, 20, Range.Inclusive))).Returns(1); + mock.Setup(m => m.Method(It.IsAny())).Returns(0); + mock.Setup(m => m.Method(It.IsInRange(0, 20, Range.Inclusive))).Returns(1); - mock.Setup(m => m.Method(5)).Returns(2); - mock.Setup(m => m.Method(10)).Returns(3); + mock.Setup(m => m.Method(5)).Returns(2); + mock.Setup(m => m.Method(10)).Returns(3); - Assert.Equal(3, mock.Object.Method(10)); - Assert.Equal(2, mock.Object.Method(5)); - Assert.Equal(1, mock.Object.Method(6)); - Assert.Equal(0, mock.Object.Method(25)); - } + Assert.Equal(3, mock.Object.Method(10)); + Assert.Equal(2, mock.Object.Method(5)); + Assert.Equal(1, mock.Object.Method(6)); + Assert.Equal(0, mock.Object.Method(25)); + } - public interface IEvaluateLatest - { - int Method(int value); - } + public interface IEvaluateLatest + { + int Method(int value); + } - #endregion + #endregion - #region #49 + #region #49 - [Fact] - public void UsesCustomMatchersWithGenerics() - { - var mock = new Mock(); + [Fact] + public void UsesCustomMatchersWithGenerics() + { + var mock = new Mock(); - mock.Setup(e => e.Method(IsEqual.To(5))).Returns(1); - mock.Setup(e => e.Method(IsEqual.To(6, "foo"))).Returns(2); + mock.Setup(e => e.Method(IsEqual.To(5))).Returns(1); + mock.Setup(e => e.Method(IsEqual.To(6, "foo"))).Returns(2); - Assert.Equal(1, mock.Object.Method(5)); - Assert.Equal(2, mock.Object.Method(6)); - } + Assert.Equal(1, mock.Object.Method(5)); + Assert.Equal(2, mock.Object.Method(6)); + } - public static class IsEqual - { + public static class IsEqual + { #pragma warning disable 618 - [Matcher] - public static T To(T value) - { - return value; - } + [Matcher] + public static T To(T value) + { + return value; + } #pragma warning restore 618 - public static bool To(T left, T right) - { - return left.Equals(right); - } + public static bool To(T left, T right) + { + return left.Equals(right); + } #pragma warning disable 618 - [Matcher] - public static T To(T value, U value2) - { - return value; - } + [Matcher] + public static T To(T value, U value2) + { + return value; + } #pragma warning restore 618 - public static bool To(T left, T right, U value) - { - return left.Equals(right); - } - } - - #endregion - - #region #68 - - [Fact] - public void GetMockCastedToObjectThrows() - { - var mock = new Mock(); - object m = mock.Object; - - Assert.Throws(() => Mock.Get(m)); - } - - #endregion - - #region #69 - - public interface IFooPtr - { - IntPtr Get(string input); - } - - [Fact] - public void ReturnsIntPtr() - { - Mock mock = new Mock(MockBehavior.Strict); - IntPtr ret = new IntPtr(3); - - mock.Setup(m => m.Get("a")).Returns(ret); - - IntPtr ret3 = mock.Object.Get("a"); - - Assert.Equal(ret, mock.Object.Get("a")); - } - - - #endregion - - #region #85 - - public class Issue85 - { - [Fact] - public void FooTest() - { - // Setup - var fooMock = new Mock(); - fooMock.CallBase = true; - fooMock.Setup(o => o.GetBar()).Returns(new Bar()); - var bar = ((IFoolery)fooMock.Object).DoStuffToBar(); - Assert.NotNull(bar); - } - - public interface IFoolery - { - Bar DoStuffToBar(); - } - - public class Foo : IFoolery - { - public virtual Bar GetBar() - { - return new Bar(); - } - - Bar IFoolery.DoStuffToBar() - { - return DoWeirdStuffToBar(); - } - - protected internal virtual Bar DoWeirdStuffToBar() - { - var bar = GetBar(); - //Would do stuff here. - return bar; - } - } - - public class Bar - { - } - } - - #endregion - - #region #89 - - public class Issue89 - { - [Fact] - public void That_last_expectation_should_win() - { - var mock = new Mock(); - mock.Setup(s => s.Get(1)).Returns("blah"); - mock.Setup(s => s.Get(It.IsAny())).Returns("foo"); - mock.Setup(s => s.Get(1)).Returns("bar"); - Assert.Equal("bar", mock.Object.Get(1)); - } - - public interface ISample - { - string Get(int i); - } - } - - #endregion - - #region #128 - - public class Issue128 - { - [Fact] - public void That_CallBase_on_interface_should_not_throw_exception() - { - var mock = new Mock() - { - DefaultValue = DefaultValue.Mock, - CallBase = true - }; - - var service = mock.Object.GetDataService(); - - var data = service.GetData(); - var result = data.Sum(); - - Assert.Equal( 0, result ); - } - - public interface IDataServiceFactory - { - IDataService GetDataService(); - } - - public interface IDataService - { - IList GetData(); - } - } - - #endregion - - #region #134 - - public class Issue134 - { - [Fact] - public void Test() - { - var target = new Mock(); - target.Setup(t => t.Submit(It.IsAny(), It.IsAny(), It.IsAny())); - - var e = Assert.Throws(() => target.VerifyAll()); - - Assert.Contains( - "IFoo t => t.Submit(It.IsAny(), It.IsAny(), new[] { It.IsAny() })", - e.Message); - } - - public interface IFoo - { - void Submit(string mailServer, string from, params int[] toRecipient); - } - } - - #endregion - - #region #136 - - public class _136 - { - // Fixed on PropertiesFixture.cs - } - - #endregion - - #region #138 - - public class _138 - { - public interface SuperFoo - { - string Bar { get; set; } - } - public interface Foo : SuperFoo - { - string Baz { get; set; } - } - - [Fact] - public void superFooMockSetupAllProperties() - { - var repo = new MockRepository(MockBehavior.Default); - var superFooMock = repo.Create(); - superFooMock.SetupAllProperties(); + public static bool To(T left, T right, U value) + { + return left.Equals(right); + } + } + + #endregion + + #region #68 - var superFoo = superFooMock.Object; - superFoo.Bar = "Bar"; - Assert.Equal("Bar", superFoo.Bar); - } - } + [Fact] + public void GetMockCastedToObjectThrows() + { + var mock = new Mock(); + object m = mock.Object; - #endregion + Assert.Throws(() => Mock.Get(m)); + } - #region #145 + #endregion - public class _145 - { - public interface IResolver - { - string Resolve(); - } + #region #69 - public class DataWriter - { - } + public interface IFooPtr + { + IntPtr Get(string input); + } - public class DataA { } - public class DataB { } + [Fact] + public void ReturnsIntPtr() + { + Mock mock = new Mock(MockBehavior.Strict); + IntPtr ret = new IntPtr(3); - [Fact] - public void ShouldDifferentiateBetweenGenericsParams() - { - var mock = new Mock(); - mock.Setup(m => m.Resolve>()).Returns("Success A"); + mock.Setup(m => m.Get("a")).Returns(ret); - Assert.Equal("Success A", mock.Object.Resolve>()); + IntPtr ret3 = mock.Object.Get("a"); - mock.Setup(m => m.Resolve>()).Returns("Success B"); + Assert.Equal(ret, mock.Object.Get("a")); + } - Assert.Equal("Success B", mock.Object.Resolve>()); - Assert.Equal("Success A", mock.Object.Resolve>()); - } - } + #endregion - #endregion + #region #85 - #region #111 & #155 + public class Issue85 + { + [Fact] + public void FooTest() + { + // Setup + var fooMock = new Mock(); + fooMock.CallBase = true; + fooMock.Setup(o => o.GetBar()).Returns(new Bar()); + var bar = ((IFoolery)fooMock.Object).DoStuffToBar(); + Assert.NotNull(bar); + } - public class _111 - { - [Fact] - public void TestTypedParamsWithNoParams() - { - var mock = new Mock(MockBehavior.Strict); - mock.Setup(p => p.Submit(It.IsAny(), It.IsAny())); + public interface IFoolery + { + Bar DoStuffToBar(); + } - mock.Object.Submit("foo"); + public class Foo : IFoolery + { + public virtual Bar GetBar() + { + return new Bar(); + } - mock.VerifyAll(); - } + Bar IFoolery.DoStuffToBar() + { + return DoWeirdStuffToBar(); + } - [Fact] - public void TestTypedParams() - { - var mock = new Mock(MockBehavior.Strict); - mock.Setup(p => p.Submit(It.IsAny(), It.IsAny())); + protected internal virtual Bar DoWeirdStuffToBar() + { + var bar = GetBar(); + //Would do stuff here. + return bar; + } + } - mock.Object.Submit("foo", 0, 1, 2); - - mock.VerifyAll(); - } - - [Fact] - public void TestObjectParamsWithoutParams() - { - var mock = new Mock(MockBehavior.Strict); - mock.Setup(p => p.Execute(It.IsAny(), It.IsAny())); - - mock.Object.Execute(1); - - mock.VerifyAll(); - } - - [Fact] - public void TestObjectParams() - { - var mock = new Mock(MockBehavior.Strict); - mock.Setup(p => p.Execute(It.IsAny(), It.IsAny())); - - mock.Object.Execute(1, "0", "1", "2"); - - mock.VerifyAll(); - } - - [Fact] - public void TestObjectParamsWithExpectedValues() - { - var mock = new Mock(MockBehavior.Strict); - mock.Setup(p => p.Execute(5, "foo", "bar")); - - Assert.Throws(() => mock.Object.Execute(5, "bar", "foo")); - - mock.Object.Execute(5, "foo", "bar"); - - mock.Verify(p => p.Execute(5, "foo", "bar")); - } - - [Fact] - public void TestObjectParamsWithArray() - { - var mock = new Mock(); - mock.Setup(p => p.Execute(It.IsAny(), It.IsAny(), It.IsAny())); - - mock.Object.Execute(1, new string[] { "0", "1" }, 3); - - mock.Verify(p => p.Execute(It.IsAny(), It.IsAny())); - mock.Verify(p => p.Execute(It.IsAny(), It.IsAny(), It.IsAny())); - mock.Verify(p => p.Execute(It.IsAny(), It.IsAny(), It.IsAny())); - } - - [Fact] - public void TestTypedParamsInEachArgument() - { - var mock = new Mock(MockBehavior.Strict); - mock.Setup(p => p.Submit(It.IsAny(), It.IsAny(), It.IsAny())); - - mock.Object.Submit("foo", 0, 1); - - mock.Verify(p => p.Submit(It.IsAny(), It.IsAny(), It.IsAny())); - mock.Verify(p => p.Submit(It.IsAny(), It.Is(a => a.Length == 2))); - mock.VerifyAll(); - } - - [Fact] - public void TestParamsWithReturnValue() - { - var mock = new Mock(); - mock.Setup(x => x.GetValue("Matt")).Returns("SomeString"); - - var ret = mock.Object.GetValue("Matt"); - Assert.Equal("SomeString", ret); - } - - public interface IParams - { - void Submit(string name, params int[] values); - void Execute(int value, params object[] values); - string GetValue(string name, params object[] args); - } - } - - #endregion - - #region #159 - - public class _159 - { - [Fact] - public void ImplicitIntToLong() - { - int id = 1; - var mock = new Mock(); - mock.Object.SetIt(id); - mock.Verify(x => x.SetIt(id)); - } - - [Fact] - public void ImplicitInterface() - { - var barMock = new Mock(); - var baz = new Baz(barMock.Object); - baz.DoBarFoo(new Foo()); - barMock.Verify(x => x.DoFoo(It.IsAny())); - } - - public interface IFoo - { - long Id { get; set; } - void SetIt(long it); - } - - public class Foo : IFoo - { - public long Id { get; set; } - public void SetIt(long it) { } - } - - public interface IBar - { - void DoFoo(IFoo foo); - } - - public class Baz - { - private readonly IBar _bar; - public Baz(IBar bar) - { - _bar = bar; - } - - public void DoBarFoo(IFoo foo) - { - _bar.DoFoo(foo); - } - } - } - - #endregion - - #region #152 - - public class _152 - { - public enum MembershipCreateStatus { Created, Duplicated, Invalid } - public interface IMembershipService - { - int MinPasswordLength { get; } - bool ValidateUser(string userName, string password); - MembershipCreateStatus CreateUser(string userName, string password, string email); - bool ChangePassword(string userName, string oldPassword, string newPassword); - } - - [Fact] - public void ShouldReturnEnum() - { - var provider = new Mock(); - - // For some reason, this particular lambda doesn't let me specify - // a method return value for the method even though it returns a - // MembershipCreateStatus enum - provider.Setup(p => p.CreateUser(string.Empty, string.Empty, string.Empty)).Returns(MembershipCreateStatus.Invalid); - - Assert.Equal(MembershipCreateStatus.Invalid, provider.Object.CreateUser("", "", "")); - } - } - - #endregion - - #region #153 - - public class _153 - { - public struct SomeClass // Struct just to avoid having to implement Equals/GetHashCode - { - public static implicit operator SomeClass(T t) - { - return new SomeClass(); - } - - public static SomeClass From(T t) - { - return t; - } - } - - public interface IIfc - { - int Get(SomeClass id); - } - - public class ImplicitConversionProblem - { - [Fact] - public void ImplicitSetupVerifyAll_Fails() - { - const string s = "XYZ"; - var mock = new Mock(); - mock.Setup(ifc => ifc.Get(s)).Returns(17); - - var result = mock.Object.Get(s); - - mock.VerifyAll(); // MockVerificationException here - Assert.Equal(17, result); - } - - [Fact] - public void ExplicitSetupVerifyAll_Works() - { - const string s = "XYZ"; - var mock = new Mock(); - mock.Setup(ifc => ifc.Get(SomeClass.From(s))).Returns(17); - - var result = mock.Object.Get(s); - - mock.VerifyAll(); - Assert.Equal(17, result); - } - - [Fact] - public void ExplicitSetupImplicitVerification_Fails() - { - const string s = "XYZ"; - var mock = new Mock(); - mock.Setup(ifc => ifc.Get(SomeClass.From(s))).Returns(17); - - var result = mock.Object.Get(s); - - // Here the problem can be seen even in the exception message: - // Invocation was not performed on the mock: ifc => ifc.Get("XYZ") - // -----------------------------------------------------------^ - mock.Verify(ifc => ifc.Get(s)); - Assert.Equal(17, result); - } - - [Fact] - public void ImplicitSetupExplicitVerification_Fails() - { - const string s = "XYZ"; - var mock = new Mock(); - mock.Setup(ifc => ifc.Get(s)).Returns(17); - - var result = mock.Object.Get(s); - - // This verification passes oddly enough - mock.Verify(ifc => ifc.Get(SomeClass.From(s))); - - // This assert fails, indicating that the setup was not used - Assert.Equal(17, result); - } - } - } - - #endregion - - #region #146 - - public class _146 - { - public interface IFoo - { - bool Property { get; set; } - string StringProperty { get; set; } - } - - [Fact] - public void StrictMockPropertySet() - { - var mock = new Mock(MockBehavior.Strict); - - mock.SetupSet(v => v.Property = false); - - Assert.Throws(() => mock.VerifySet(v => v.Property = false)); - - mock.Object.Property = false; - - mock.VerifySet(v => v.Property = false); - } - } - - #endregion - - #region #158 - - public class _158 - { - public class Foo - { - public virtual void Boo() - { - Bar(); - Bar(); - } - - protected virtual void Bar() - { - } - } + public class Bar + { + } + } -#pragma warning disable 618 - [Fact(Skip = "This setup doesn't make sense, and xUnit does not provide this message checking capability.")] - public void ShouldRenderCustomMessage() - { - var foo = new Mock { CallBase = true }; - foo.Protected().Setup("Bar").AtMostOnce().Verifiable("Hello"); - foo.Object.Boo(); - //Assert.Throws("Hello", () => foo.Object.Boo()); - } -#pragma warning restore 618 - } + #endregion - #endregion + #region #89 - #region #160 + public class Issue89 + { + [Fact] + public void That_last_expectation_should_win() + { + var mock = new Mock(); + mock.Setup(s => s.Get(1)).Returns("blah"); + mock.Setup(s => s.Get(It.IsAny())).Returns("foo"); + mock.Setup(s => s.Get(1)).Returns("bar"); + Assert.Equal("bar", mock.Object.Get(1)); + } -#if !SILVERLIGHT - public class _160 - { - [Fact] - public void ShouldMockHtmlControl() - { - // CallBase was missing - var htmlInputTextMock = new Mock() { CallBase = true }; - Assert.True(htmlInputTextMock.Object.Visible); - } - } -#endif + public interface ISample + { + string Get(int i); + } + } + + #endregion + + #region #128 + + public class Issue128 + { + [Fact] + public void That_CallBase_on_interface_should_not_throw_exception() + { + var mock = new Mock() + { + DefaultValue = DefaultValue.Mock, + CallBase = true + }; + + var service = mock.Object.GetDataService(); + + var data = service.GetData(); + var result = data.Sum(); + + Assert.Equal(0, result); + } - #endregion + public interface IDataServiceFactory + { + IDataService GetDataService(); + } - #region #161 + public interface IDataService + { + IList GetData(); + } + } - public class _161 - { - [Fact] - public void InvertEqualObjects() - { - var foo1 = new Foo { Id = "1" }; - var foo = new Foo { Id = "2" }; + #endregion - var dependency = new Mock(); + #region #134 - dependency.Setup(x => x.DoThis(foo, foo1)) - .Returns(new Foo()); - - var f = dependency.Object.DoThis(foo, foo1); - - dependency.Verify(x => x.DoThis(foo, foo1)); - dependency.Verify(x => x.DoThis(foo1, foo), Times.Never()); - } + public class Issue134 + { + [Fact] + public void Test() + { + var target = new Mock(); + target.Setup(t => t.Submit(It.IsAny(), It.IsAny(), It.IsAny())); - [Fact(Skip = "Wrong Equals implemention in the report. Won't Fix")] - public void ExampleFailingTest() - { - var foo1 = new Foo(); - var foo = new Foo(); - - var sut = new Perfectly_fine_yet_failing_test(); - var dependency = new Mock(); - - dependency.Setup(x => x.DoThis(foo, foo1)) - .Returns(new Foo()); - - sut.Do(dependency.Object, foo, foo1); + var e = Assert.Throws(() => target.VerifyAll()); - dependency.Verify(x => x.DoThis(foo, foo1)); - dependency.Verify(x => x.DoThis(foo1, foo), Times.Never()); - } + Assert.Contains( + "IFoo t => t.Submit(It.IsAny(), It.IsAny(), new[] { It.IsAny() })", + e.Message); + } - public class Perfectly_fine_yet_failing_test - { - public void Do(IDependency dependency, Foo foo, Foo foo1) - { - var foo2 = dependency.DoThis(foo, foo1); - if (foo2 == null) - foo2 = dependency.DoThis(foo1, foo); - } - } - - public interface IDependency - { - Foo DoThis(Foo foo, Foo foo1); - } + public interface IFoo + { + void Submit(string mailServer, string from, params int[] toRecipient); + } + } - public class Foo - { - public string Id { get; set; } + #endregion - public override bool Equals(object obj) - { - return obj is Foo && ((Foo)obj).Id == Id; - } - - public override int GetHashCode() - { - return base.GetHashCode(); - } - } - } + #region #136 - #endregion + public class _136 + { + // Fixed on PropertiesFixture.cs + } - #region #174 - - public class _174 - { - [Fact] - public void Test() - { - var serviceNo1Mock = new Mock(); - var collaboratorMock = new Mock(); - - collaboratorMock.Object.Collaborate(serviceNo1Mock.Object); + #endregion - collaboratorMock.Verify(o => o.Collaborate(serviceNo1Mock.Object)); - } - - public interface ISomeCollaborator - { - void Collaborate(IServiceNo1 serviceNo1); - } - - public interface IServiceNo1 : IEnumerable - { - } - } - - #endregion - - #region #177 - - public class _177 - { - [Fact] - public void Test() - { - var mock = new Mock(); - Assert.NotNull(mock.Object); - } - - public interface IMyInterface - { - void DoStuff() where TTo : TFrom; - } - } - - #endregion - - #region #184 - - public class _184 - { - [Fact] - public void Test() - { - var fooRaised = false; - var barRaised = false; - - var fooMock = new Mock(); - var barMock = fooMock.As(); - - fooMock.Object.FooEvent += (s, e) => fooRaised = true; - barMock.Object.BarEvent += (s, e) => barRaised = true; - - fooMock.Raise(m => m.FooEvent += null, EventArgs.Empty); - barMock.Raise(m => m.BarEvent += null, EventArgs.Empty); - - Assert.True(fooRaised); - Assert.True(barRaised); - } - - public interface IFoo - { - event EventHandler FooEvent; - } - - public interface IBar - { - event EventHandler BarEvent; - } - } - - #endregion - - #region #185 - - public class _185 - { - [Fact] - public void Test() - { - var mock = new Mock>(); - Assert.Throws(() => mock.Setup(l => l.FirstOrDefault()).Returns("Hello world")); - } - } - - #endregion - - #region #187 - - public class _187 - { - [Fact] - public void Test() - { - var mock = new Mock(); - - mock.Setup(r => r.Get()).Returns(new Object()); - mock.Setup(r => r.Get()).Returns(new Object()); - - Assert.NotNull(mock.Object.Get()); - Assert.NotNull(mock.Object.Get()); - } - - public class Foo - { - public class Inner - { - } - } - - public class Bar - { - public class Inner - { - } - } - - public interface IGeneric - { - object Get() where T : new(); - } - } - - #endregion - - #region #183 - - public class _183 - { - [Fact] - public void Test() - { - var mock = new Mock(); - mock.Setup(m => m.Execute(1)); - mock.Setup(m => m.Execute(It.IsInRange(2, 20, Range.Exclusive))); - mock.Setup(m => m.Execute(3, "Caption")); - - mock.Object.Execute(3); - mock.Object.Execute(4); - mock.Object.Execute(5); - - var e = Assert.Throws(() => mock.Verify(m => m.Execute(0))); - Assert.Contains( - "\r\nConfigured setups:" + - "\r\nm => m.Execute(1), Times.Never" + - "\r\nm => m.Execute(It.IsInRange(2, 20, Range.Exclusive)), Times.Exactly(3)", - e.Message); - } - - [Fact] - public void TestGeneric() - { - var mock = new Mock(); - mock.Setup(m => m.Execute(1, 10)); - mock.Setup(m => m.Execute(1, "Foo")); - - mock.Object.Execute(1, 10); - - var e = Assert.Throws(() => mock.Verify(m => m.Execute(1, 1))); - Assert.Contains( - "\r\nConfigured setups:\r\nm => m.Execute(1, 10), Times.Once", - e.Message); - } - - [Fact] - public void TestNoSetups() - { - var mock = new Mock(); - - var e = Assert.Throws(() => mock.Verify(m => m.Execute(1))); - Assert.Contains("\r\nNo setups configured.", e.Message); - - } - - public interface IFoo - { - void Execute(int param); - void Execute(int param, string caption); - void Execute(int p, T param); - } - } - - #endregion - - #region #186 - - public class _186 - { - [Fact] - public void TestVerifyMessage() - { - var mock = new Mock(); - mock.Setup(m => m.OnExecute()); - - var e = Assert.Throws(() => mock.Verify(m => m.Execute())); - Assert.True(e.Message.StartsWith("Invalid verify")); - } - - public class Foo - { - public void Execute() - { - this.OnExecute(); - } - - public virtual void OnExecute() - { - throw new NotImplementedException(); - } - } - } - - #endregion - - #region #190 - - public class _190 - { - [Fact] - public void Test() - { - var mock = new Mock().As(); - mock.SetupAllProperties(); - - ISite site = new FooSite(); - mock.Object.Site = site; - Assert.Same(site, mock.Object.Site); - } - - public class FooSite : ISite - { - public IComponent Component - { - get { throw new NotImplementedException(); } - } - - public IContainer Container - { - get { throw new NotImplementedException(); } - } - - public bool DesignMode - { - get { throw new NotImplementedException(); } - } - - public string Name - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public object GetService(Type serviceType) - { - throw new NotImplementedException(); - } - } - - } - - #endregion - - #region #204 - - public class _204 - { - [Fact] - public void Test() - { - var mock = new Mock(); - mock.Setup(x => x.Select(u => u.Id == 100)) - .Returns(new User() { Id = 100 }); - - var user = mock.Object.Select(usr => usr.Id == 100); - Assert.Equal(100, user.Id); - mock.Verify(x => x.Select(usr => usr.Id == 100), Times.Once()); - - user = mock.Object.Select(usr => usr.Id == 101); - Assert.Null(user); - mock.Verify(x => x.Select(usr => usr.Id == 101), Times.Once()); - - mock.Verify(x => x.Select(usr => usr.Id == 102), Times.Never()); - mock.Verify(x => x.Select(It.IsAny>>()), Times.Exactly(2)); - } - - public interface IRepository - { - T Select(Expression> filter) where T : class; - } - - public class User - { - public int Id { get; set; } - } - } - - #endregion - - #region #205 - - public class _205 - { - [Fact] - public void Test() - { - new Mock().SetupAllProperties(); - } - - public interface IFoo - { - string Error { get; set; } - string this[int index] { get; set; } - } - } - - #endregion - - #region #223 - - public class _223 - { - [Fact] - public void TestSetup() - { - this.TestSetupHelper(); - } - - public void TestSetupHelper() where T : class, IFoo - { - var expected = 2; - - var target = new Mock(); - target.Setup(p => p.DoInt32(0)).Returns(expected); - target.Setup(p => p.DoGeneric(0)).Returns(expected); - - Assert.Equal(expected, target.Object.DoInt32(0)); - Assert.Equal(expected, target.Object.DoGeneric(0)); - } - - public interface IFoo - { - int DoInt32(int value); - T DoGeneric(int value); - } - - public class Foo : IFoo - { - public virtual int DoInt32(int value) - { - return 4; - } - - public virtual int DoGeneric(int value) - { - return 5; - } - } - } - - #endregion - - #region #229 - - public class _229 - { - [Fact] - public void Test() - { - var target = new Mock { CallBase = true }; - - var raised = false; - target.Object.MyEvent += (s, e) => raised = true; - target.Object.RaiseMyEvent(); - - Assert.True(raised); - } - - public class Foo - { - public virtual event EventHandler MyEvent; - - public void RaiseMyEvent() - { - if (this.MyEvent != null) - { - this.MyEvent(this, EventArgs.Empty); - } - } - } - } - - #endregion - - #region #230 - - public class _230 - { - [Fact] - public void ByteArrayCallbackArgumentShouldNotBeNull() - { - var data = new byte[] { 2, 1, 2 }; - var stream = new Mock(); - - stream.SetupGet(m => m.Length) - .Returns(data.Length); - stream.Setup(m => m.Read(It.IsAny(), It.IsAny(), It.IsAny())) - .Callback((b, o, c) => data.CopyTo(b, 0)) - .Returns(data.Length); - - var contents = new byte[stream.Object.Length]; - stream.Object.Read(contents, 0, (int)stream.Object.Length); - } - } - - #endregion - - #region #232 - - public class _232 - { - [Fact] - public void Test() - { - var repository = new Mock(); - var svc = new Service(repository.Object); - - svc.Create(); - - repository.Verify(r => r.Insert(It.IsAny()), Times.Once()); - repository.Verify(r => r.Insert(It.IsAny()), Times.Once()); - repository.Verify(r => r.Insert(It.IsAny()), Times.Exactly(2)); - } - - public interface IRepository - { - void Insert(IEntity entity); - } - - public interface IEntity - { - } - - public class Foo : IEntity - { - } - - public class Bar : IEntity - { - } - - public class Service - { - private IRepository repository; - - public Service(IRepository repository) - { - this.repository = repository; - } - - public void Create() - { - repository.Insert(new Foo()); - repository.Insert(new Bar()); - } - } - } - - #endregion - - #region #242 - - public class _242 - { - [Fact] - public void PropertyChangedTest() - { - var mock = new Mock(); - int callbacks = 0; - mock.Object.PropertyChanged += (sender, args) => callbacks++; - - mock.Raise(m => m.PropertyChanged += null, new PropertyChangedEventArgs("Foo")); - Assert.Equal(1, callbacks); - } - - public class PropertyChangedBase : INotifyPropertyChanged - { - public virtual event PropertyChangedEventHandler PropertyChanged = (s, e) => { }; - } - - public class PropertyChangedInherited : PropertyChangedBase - { - } - } - - #endregion - - #region #245 - - public class _245 - { - [Fact] - public void Test() - { - var mock = new Mock(); - - ITest instance; - instance = mock.Object; - } - - public interface ITest - { - void Do() where T2 : T1; - } - } - - #endregion - - #region #251 - - public class _251 - { - [Fact] - public void Test() - { - var repositoryMock = new Mock>(); - - var repository = repositoryMock.Object; - repository.Save("test"); - - repositoryMock.Verify(m => m.Save("test")); - } - - public interface IRepository - { - void Save(string value); - } - - public interface IRepository : IRepository - { - void Save(T value); - } - } - - #endregion - - #region #256 - - public class _256 - { - [Fact] - public void TestFinalizeNotMocked() - { - var mock = new Mock(MockBehavior.Strict); - mock.Setup(m => m.Foo).Returns(10); - mock.Setup(m => m.Bar).Returns("Hello mocked world!"); - var instance = mock.Object; - - Assert.Equal(10, instance.Foo); - } - - public class ClassWithFinalizer - { - public virtual int Foo { get; set; } - public virtual string Bar { get; set; } - - ~ClassWithFinalizer() - { - - } - } - } - - #endregion - - #region #261 - - public class _261 - { - [Fact] - public void Test() - { - var mock = new Mock(); - mock.Protected().SetupSet("Status", 42); + #region #138 - mock.Object.SetStatus(42); + public class _138 + { + public interface SuperFoo + { + string Bar { get; set; } + } + public interface Foo : SuperFoo + { + string Baz { get; set; } + } - mock.Protected().VerifySet("Status", Times.Once(), 42); - } + [Fact] + public void superFooMockSetupAllProperties() + { + var repo = new MockRepository(MockBehavior.Default); + var superFooMock = repo.Create(); + superFooMock.SetupAllProperties(); - public class Foo - { - public virtual int Status { get; protected set; } + var superFoo = superFooMock.Object; + superFoo.Bar = "Bar"; + Assert.Equal("Bar", superFoo.Bar); + } + } - internal void SetStatus(int value) - { - this.Status = value; - } - } - } - - #endregion + #endregion - #region #267 + #region #145 - public class _267 - { - public interface IPerformOperation - { - string Operation(object input); - } + public class _145 + { + public interface IResolver + { + string Resolve(); + } - public class OperationUser - { - private readonly IPerformOperation m_OperationPerformer; + public class DataWriter + { + } - public OperationUser(IPerformOperation operationPerformer) - { - m_OperationPerformer = operationPerformer; - } - - public string DoOperation(object input) - { - return m_OperationPerformer.Operation(input); - } - } + public class DataA { } + public class DataB { } - public class HelperSetup - { - private Mock m_OperationStub; + [Fact] + public void ShouldDifferentiateBetweenGenericsParams() + { + var mock = new Mock(); + mock.Setup(m => m.Resolve>()).Returns("Success A"); - public HelperSetup() - { - m_OperationStub = new Mock(); - } + Assert.Equal("Success A", mock.Object.Resolve>()); - [Fact] - public void InlineSetupTest() - { - m_OperationStub.Setup(m => m.Operation(It.IsAny())).Returns(value => "test"); - m_OperationStub.Setup(m => m.Operation(It.IsAny())).Returns(value => "25"); + mock.Setup(m => m.Resolve>()).Returns("Success B"); - var operationUser = new OperationUser(m_OperationStub.Object); + Assert.Equal("Success B", mock.Object.Resolve>()); + Assert.Equal("Success A", mock.Object.Resolve>()); + } - var intOperationResult = operationUser.DoOperation(9); - var stringOperationResult = operationUser.DoOperation("Hello"); + } - Assert.Equal("25", intOperationResult); - Assert.Equal("test", stringOperationResult); - } + #endregion - [Fact] - public void HelperSetupTest() - { - SetupOperationStub(value => "test"); - SetupOperationStub(value => "25"); + #region #111 & #155 - var operationUser = new OperationUser(m_OperationStub.Object); + public class _111 + { + [Fact] + public void TestTypedParamsWithNoParams() + { + var mock = new Mock(MockBehavior.Strict); + mock.Setup(p => p.Submit(It.IsAny(), It.IsAny())); - var intOperationResult = operationUser.DoOperation(9); - var stringOperationResult = operationUser.DoOperation("Hello"); + mock.Object.Submit("foo"); - Assert.Equal("25", intOperationResult); - Assert.Equal("test", stringOperationResult); - } + mock.VerifyAll(); + } - private void SetupOperationStub(Func valueFunction) - { - m_OperationStub.Setup(m => m.Operation(It.IsAny())).Returns(valueFunction); - } - } - } + [Fact] + public void TestTypedParams() + { + var mock = new Mock(MockBehavior.Strict); + mock.Setup(p => p.Submit(It.IsAny(), It.IsAny())); - #endregion + mock.Object.Submit("foo", 0, 1, 2); - #region #273 + mock.VerifyAll(); + } -#if !SILVERLIGHT + [Fact] + public void TestObjectParamsWithoutParams() + { + var mock = new Mock(MockBehavior.Strict); + mock.Setup(p => p.Execute(It.IsAny(), It.IsAny())); - public class _273 - { - [Fact] - public void WhenMockingAnExternalInterface_ThenItWorks() - { - Assert.NotNull(new Mock().Object); - Assert.NotNull(Mock.Of()); - Assert.NotNull(new Mock().Object); - Assert.NotNull(new Mock().Object); - Assert.NotNull(Mock.Of()); - Assert.NotNull(new Mock().Object); - Assert.NotNull(new Mock().Object); - } - - public class Baz : ClassLibrary2.Bar - { - } - } + mock.Object.Execute(1); -#endif + mock.VerifyAll(); + } + + [Fact] + public void TestObjectParams() + { + var mock = new Mock(MockBehavior.Strict); + mock.Setup(p => p.Execute(It.IsAny(), It.IsAny())); - #endregion + mock.Object.Execute(1, "0", "1", "2"); - #region #325 + mock.VerifyAll(); + } + + [Fact] + public void TestObjectParamsWithExpectedValues() + { + var mock = new Mock(MockBehavior.Strict); + mock.Setup(p => p.Execute(5, "foo", "bar")); - public class _325 - { - [Fact] - public void SubscribingWorks() - { - var target = new Mock { CallBase = true }; - target.As(); + Assert.Throws(() => mock.Object.Execute(5, "bar", "foo")); - var bar = (IBar)target.Object; - var raised = false; - bar.SomeEvent += (sender, e) => raised = true; + mock.Object.Execute(5, "foo", "bar"); - target.As().Raise(b => b.SomeEvent += null, EventArgs.Empty); + mock.Verify(p => p.Execute(5, "foo", "bar")); + } - Assert.True(raised); - } + [Fact] + public void TestObjectParamsWithArray() + { + var mock = new Mock(); + mock.Setup(p => p.Execute(It.IsAny(), It.IsAny(), It.IsAny())); - [Fact] - public void UnsubscribingWorks() - { - var target = new Mock { CallBase = true }; - target.As(); + mock.Object.Execute(1, new string[] { "0", "1" }, 3); - var bar = (IBar)target.Object; - var raised = false; - EventHandler handler = (sender, e) => raised = true; - bar.SomeEvent += handler; - bar.SomeEvent -= handler; + mock.Verify(p => p.Execute(It.IsAny(), It.IsAny())); + mock.Verify(p => p.Execute(It.IsAny(), It.IsAny(), It.IsAny())); + mock.Verify(p => p.Execute(It.IsAny(), It.IsAny(), It.IsAny())); + } - target.As().Raise(b => b.SomeEvent += null, EventArgs.Empty); + [Fact] + public void TestTypedParamsInEachArgument() + { + var mock = new Mock(MockBehavior.Strict); + mock.Setup(p => p.Submit(It.IsAny(), It.IsAny(), It.IsAny())); - Assert.False(raised); - } + mock.Object.Submit("foo", 0, 1); - public class Foo - { - } + mock.Verify(p => p.Submit(It.IsAny(), It.IsAny(), It.IsAny())); + mock.Verify(p => p.Submit(It.IsAny(), It.Is(a => a.Length == 2))); + mock.VerifyAll(); + } - public interface IBar - { - event EventHandler SomeEvent; - } + [Fact] + public void TestParamsWithReturnValue() + { + var mock = new Mock(); + mock.Setup(x => x.GetValue("Matt")).Returns("SomeString"); - } + var ret = mock.Object.GetValue("Matt"); + Assert.Equal("SomeString", ret); + } - #endregion + public interface IParams + { + void Submit(string name, params int[] values); + void Execute(int value, params object[] values); + string GetValue(string name, params object[] args); + } + } - #region #326 + #endregion -#if !SILVERLIGHT + #region #159 - public class _326 - { - [Fact] - public void ShouldSupportMockingWinFormsControl() - { - var foo = new Mock(); - var bar = foo.Object; - } - } + public class _159 + { + [Fact] + public void ImplicitIntToLong() + { + int id = 1; + var mock = new Mock(); + mock.Object.SetIt(id); + mock.Verify(x => x.SetIt(id)); + } -#endif + [Fact] + public void ImplicitInterface() + { + var barMock = new Mock(); + var baz = new Baz(barMock.Object); + baz.DoBarFoo(new Foo()); + barMock.Verify(x => x.DoFoo(It.IsAny())); + } + + public interface IFoo + { + long Id { get; set; } + void SetIt(long it); + } + + public class Foo : IFoo + { + public long Id { get; set; } + public void SetIt(long it) { } + } + + public interface IBar + { + void DoFoo(IFoo foo); + } + + public class Baz + { + private readonly IBar _bar; + public Baz(IBar bar) + { + _bar = bar; + } + + public void DoBarFoo(IFoo foo) + { + _bar.DoFoo(foo); + } + } + } + + #endregion + + #region #152 + + public class _152 + { + public enum MembershipCreateStatus { Created, Duplicated, Invalid } + public interface IMembershipService + { + int MinPasswordLength { get; } + bool ValidateUser(string userName, string password); + MembershipCreateStatus CreateUser(string userName, string password, string email); + bool ChangePassword(string userName, string oldPassword, string newPassword); + } + + [Fact] + public void ShouldReturnEnum() + { + var provider = new Mock(); + + // For some reason, this particular lambda doesn't let me specify + // a method return value for the method even though it returns a + // MembershipCreateStatus enum + provider.Setup(p => p.CreateUser(string.Empty, string.Empty, string.Empty)).Returns(MembershipCreateStatus.Invalid); - #endregion - - #region Recursive issue - - public class RecursiveFixture - { - [Fact] - public void TestRecursive() - { - var mock = new Mock() { DefaultValue = DefaultValue.Mock }; - mock.Setup(c => c.HttpContext.Response.Write("stuff")); - - mock.Object.HttpContext.Response.Write("stuff"); - mock.Object.HttpContext.Response.ShouldEncode = true; - - Assert.Throws(() => mock.VerifySet( - c => c.HttpContext.Response.ShouldEncode = It.IsAny(), - Times.Never())); - } - - public class ControllerContext - { - public virtual HttpContext HttpContext { get; set; } - } - - public abstract class HttpContext - { - protected HttpContext() - { - } - - public virtual HttpResponse Response - { - get { throw new NotImplementedException(); } - } - } - - public abstract class HttpResponse - { - protected HttpResponse() - { - } - - public virtual bool ShouldEncode - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public virtual void Write(string s) - { - throw new NotImplementedException(); - } - } - } - - #endregion - - #region #250 - - /// - /// Silverlight MethodInfo protected constructor is internal, unlike desktop .NET - /// - public class _250 - { - [Fact] - public void Test() - { - var target = new Mock(); - - Assert.NotNull(target.Object); - } - } - - #endregion - - #region Matcher should work with Convert - - public class MatcherConvertFixture - { - public interface IFoo - { - string M(long l); - } - - [Fact] - public void MatcherDoesNotIgnoreConvert() - { - var mock = new Mock(MockBehavior.Strict); - mock.Setup(x => x.M(int.Parse("2"))).Returns("OK"); - Assert.Equal("OK", mock.Object.M(2L)); - } - } - - #endregion - } + Assert.Equal(MembershipCreateStatus.Invalid, provider.Object.CreateUser("", "", "")); + } + } + + #endregion + + #region #153 + + public class _153 + { + public struct SomeClass // Struct just to avoid having to implement Equals/GetHashCode + { + public static implicit operator SomeClass(T t) + { + return new SomeClass(); + } + + public static SomeClass From(T t) + { + return t; + } + } + + public interface IIfc + { + int Get(SomeClass id); + } + + public class ImplicitConversionProblem + { + [Fact] + public void ImplicitSetupVerifyAll_Fails() + { + const string s = "XYZ"; + var mock = new Mock(); + mock.Setup(ifc => ifc.Get(s)).Returns(17); + + var result = mock.Object.Get(s); + + mock.VerifyAll(); // MockVerificationException here + Assert.Equal(17, result); + } + + [Fact] + public void ExplicitSetupVerifyAll_Works() + { + const string s = "XYZ"; + var mock = new Mock(); + mock.Setup(ifc => ifc.Get(SomeClass.From(s))).Returns(17); + + var result = mock.Object.Get(s); + + mock.VerifyAll(); + Assert.Equal(17, result); + } + + [Fact] + public void ExplicitSetupImplicitVerification_Fails() + { + const string s = "XYZ"; + var mock = new Mock(); + mock.Setup(ifc => ifc.Get(SomeClass.From(s))).Returns(17); + + var result = mock.Object.Get(s); + + // Here the problem can be seen even in the exception message: + // Invocation was not performed on the mock: ifc => ifc.Get("XYZ") + // -----------------------------------------------------------^ + mock.Verify(ifc => ifc.Get(s)); + Assert.Equal(17, result); + } + + [Fact] + public void ImplicitSetupExplicitVerification_Fails() + { + const string s = "XYZ"; + var mock = new Mock(); + mock.Setup(ifc => ifc.Get(s)).Returns(17); + + var result = mock.Object.Get(s); + + // This verification passes oddly enough + mock.Verify(ifc => ifc.Get(SomeClass.From(s))); + + // This assert fails, indicating that the setup was not used + Assert.Equal(17, result); + } + } + } + + #endregion + + #region #146 + + public class _146 + { + public interface IFoo + { + bool Property { get; set; } + string StringProperty { get; set; } + } + + [Fact] + public void StrictMockPropertySet() + { + var mock = new Mock(MockBehavior.Strict); + + mock.SetupSet(v => v.Property = false); + + Assert.Throws(() => mock.VerifySet(v => v.Property = false)); + + mock.Object.Property = false; + + mock.VerifySet(v => v.Property = false); + } + } + + #endregion + + #region #158 + + public class _158 + { + public class Foo + { + public virtual void Boo() + { + Bar(); + Bar(); + } + + protected virtual void Bar() + { + } + } + +#pragma warning disable 618 + [Fact(Skip = "This setup doesn't make sense, and xUnit does not provide this message checking capability.")] + public void ShouldRenderCustomMessage() + { + var foo = new Mock { CallBase = true }; + foo.Protected().Setup("Bar").AtMostOnce().Verifiable("Hello"); + foo.Object.Boo(); + //Assert.Throws("Hello", () => foo.Object.Boo()); + } +#pragma warning restore 618 + } + + #endregion + + #region #160 + +#if !SILVERLIGHT + public class _160 + { + [Fact] + public void ShouldMockHtmlControl() + { + // CallBase was missing + var htmlInputTextMock = new Mock() { CallBase = true }; + Assert.True(htmlInputTextMock.Object.Visible); + } + } +#endif + + #endregion + + #region #161 + + public class _161 + { + [Fact] + public void InvertEqualObjects() + { + var foo1 = new Foo { Id = "1" }; + var foo = new Foo { Id = "2" }; + + var dependency = new Mock(); + + dependency.Setup(x => x.DoThis(foo, foo1)) + .Returns(new Foo()); + + var f = dependency.Object.DoThis(foo, foo1); + + dependency.Verify(x => x.DoThis(foo, foo1)); + dependency.Verify(x => x.DoThis(foo1, foo), Times.Never()); + } + + [Fact(Skip = "Wrong Equals implemention in the report. Won't Fix")] + public void ExampleFailingTest() + { + var foo1 = new Foo(); + var foo = new Foo(); + + var sut = new Perfectly_fine_yet_failing_test(); + var dependency = new Mock(); + + dependency.Setup(x => x.DoThis(foo, foo1)) + .Returns(new Foo()); + + sut.Do(dependency.Object, foo, foo1); + + dependency.Verify(x => x.DoThis(foo, foo1)); + dependency.Verify(x => x.DoThis(foo1, foo), Times.Never()); + } + + public class Perfectly_fine_yet_failing_test + { + public void Do(IDependency dependency, Foo foo, Foo foo1) + { + var foo2 = dependency.DoThis(foo, foo1); + if (foo2 == null) + foo2 = dependency.DoThis(foo1, foo); + } + } + + public interface IDependency + { + Foo DoThis(Foo foo, Foo foo1); + } + + public class Foo + { + public string Id { get; set; } + + public override bool Equals(object obj) + { + return obj is Foo && ((Foo)obj).Id == Id; + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + } + } + + #endregion + + #region #174 + + public class _174 + { + [Fact] + public void Test() + { + var serviceNo1Mock = new Mock(); + var collaboratorMock = new Mock(); + + collaboratorMock.Object.Collaborate(serviceNo1Mock.Object); + + collaboratorMock.Verify(o => o.Collaborate(serviceNo1Mock.Object)); + } + + public interface ISomeCollaborator + { + void Collaborate(IServiceNo1 serviceNo1); + } + + public interface IServiceNo1 : IEnumerable + { + } + } + + #endregion + + #region #177 + + public class _177 + { + [Fact] + public void Test() + { + var mock = new Mock(); + Assert.NotNull(mock.Object); + } + + public interface IMyInterface + { + void DoStuff() where TTo : TFrom; + } + } + + #endregion + + #region #184 + + public class _184 + { + [Fact] + public void Test() + { + var fooRaised = false; + var barRaised = false; + + var fooMock = new Mock(); + var barMock = fooMock.As(); + + fooMock.Object.FooEvent += (s, e) => fooRaised = true; + barMock.Object.BarEvent += (s, e) => barRaised = true; + + fooMock.Raise(m => m.FooEvent += null, EventArgs.Empty); + barMock.Raise(m => m.BarEvent += null, EventArgs.Empty); + + Assert.True(fooRaised); + Assert.True(barRaised); + } + + public interface IFoo + { + event EventHandler FooEvent; + } + + public interface IBar + { + event EventHandler BarEvent; + } + } + + #endregion + + #region #185 + + public class _185 + { + [Fact] + public void Test() + { + var mock = new Mock>(); + Assert.Throws(() => mock.Setup(l => l.FirstOrDefault()).Returns("Hello world")); + } + } + + #endregion + + #region #187 + + public class _187 + { + [Fact] + public void Test() + { + var mock = new Mock(); + + mock.Setup(r => r.Get()).Returns(new Object()); + mock.Setup(r => r.Get()).Returns(new Object()); + + Assert.NotNull(mock.Object.Get()); + Assert.NotNull(mock.Object.Get()); + } + + public class Foo + { + public class Inner + { + } + } + + public class Bar + { + public class Inner + { + } + } + + public interface IGeneric + { + object Get() where T : new(); + } + } + + #endregion + + #region #183 + + public class _183 + { + [Fact] + public void Test() + { + var mock = new Mock(); + mock.Setup(m => m.Execute(1)); + mock.Setup(m => m.Execute(It.IsInRange(2, 20, Range.Exclusive))); + mock.Setup(m => m.Execute(3, "Caption")); + + mock.Object.Execute(3); + mock.Object.Execute(4); + mock.Object.Execute(5); + + var e = Assert.Throws(() => mock.Verify(m => m.Execute(0))); + Assert.Contains( + "\r\nConfigured setups:" + + "\r\nm => m.Execute(1), Times.Never" + + "\r\nm => m.Execute(It.IsInRange(2, 20, Range.Exclusive)), Times.Exactly(3)", + e.Message); + } + + [Fact] + public void TestGeneric() + { + var mock = new Mock(); + mock.Setup(m => m.Execute(1, 10)); + mock.Setup(m => m.Execute(1, "Foo")); + + mock.Object.Execute(1, 10); + + var e = Assert.Throws(() => mock.Verify(m => m.Execute(1, 1))); + Assert.Contains( + "\r\nConfigured setups:\r\nm => m.Execute(1, 10), Times.Once", + e.Message); + } + + [Fact] + public void TestNoSetups() + { + var mock = new Mock(); + + var e = Assert.Throws(() => mock.Verify(m => m.Execute(1))); + Assert.Contains("\r\nNo setups configured.", e.Message); + + } + + public interface IFoo + { + void Execute(int param); + void Execute(int param, string caption); + void Execute(int p, T param); + } + } + + #endregion + + #region #186 + + public class _186 + { + [Fact] + public void TestVerifyMessage() + { + var mock = new Mock(); + mock.Setup(m => m.OnExecute()); + + var e = Assert.Throws(() => mock.Verify(m => m.Execute())); + Assert.True(e.Message.StartsWith("Invalid verify")); + } + + public class Foo + { + public void Execute() + { + this.OnExecute(); + } + + public virtual void OnExecute() + { + throw new NotImplementedException(); + } + } + } + + #endregion + + #region #190 + + public class _190 + { + [Fact] + public void Test() + { + var mock = new Mock().As(); + mock.SetupAllProperties(); + + ISite site = new FooSite(); + mock.Object.Site = site; + Assert.Same(site, mock.Object.Site); + } + + public class FooSite : ISite + { + public IComponent Component + { + get { throw new NotImplementedException(); } + } + + public IContainer Container + { + get { throw new NotImplementedException(); } + } + + public bool DesignMode + { + get { throw new NotImplementedException(); } + } + + public string Name + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public object GetService(Type serviceType) + { + throw new NotImplementedException(); + } + } + + } + + #endregion + + #region #204 + + public class _204 + { + [Fact] + public void Test() + { + var mock = new Mock(); + mock.Setup(x => x.Select(u => u.Id == 100)) + .Returns(new User() { Id = 100 }); + + var user = mock.Object.Select(usr => usr.Id == 100); + Assert.Equal(100, user.Id); + mock.Verify(x => x.Select(usr => usr.Id == 100), Times.Once()); + + user = mock.Object.Select(usr => usr.Id == 101); + Assert.Null(user); + mock.Verify(x => x.Select(usr => usr.Id == 101), Times.Once()); + + mock.Verify(x => x.Select(usr => usr.Id == 102), Times.Never()); + mock.Verify(x => x.Select(It.IsAny>>()), Times.Exactly(2)); + } + + public interface IRepository + { + T Select(Expression> filter) where T : class; + } + + public class User + { + public int Id { get; set; } + } + } + + #endregion + + #region #205 + + public class _205 + { + [Fact] + public void Test() + { + new Mock().SetupAllProperties(); + } + + public interface IFoo + { + string Error { get; set; } + string this[int index] { get; set; } + } + } + + #endregion + + #region #223 + + public class _223 + { + [Fact] + public void TestSetup() + { + this.TestSetupHelper(); + } + + public void TestSetupHelper() where T : class, IFoo + { + var expected = 2; + + var target = new Mock(); + target.Setup(p => p.DoInt32(0)).Returns(expected); + target.Setup(p => p.DoGeneric(0)).Returns(expected); + + Assert.Equal(expected, target.Object.DoInt32(0)); + Assert.Equal(expected, target.Object.DoGeneric(0)); + } + + public interface IFoo + { + int DoInt32(int value); + T DoGeneric(int value); + } + + public class Foo : IFoo + { + public virtual int DoInt32(int value) + { + return 4; + } + + public virtual int DoGeneric(int value) + { + return 5; + } + } + } + + #endregion + + #region #229 + + public class _229 + { + [Fact] + public void Test() + { + var target = new Mock { CallBase = true }; + + var raised = false; + target.Object.MyEvent += (s, e) => raised = true; + target.Object.RaiseMyEvent(); + + Assert.True(raised); + } + + public class Foo + { + public virtual event EventHandler MyEvent; + + public void RaiseMyEvent() + { + if (this.MyEvent != null) + { + this.MyEvent(this, EventArgs.Empty); + } + } + } + } + + #endregion + + #region #230 + + public class _230 + { + [Fact] + public void ByteArrayCallbackArgumentShouldNotBeNull() + { + var data = new byte[] { 2, 1, 2 }; + var stream = new Mock(); + + stream.SetupGet(m => m.Length) + .Returns(data.Length); + stream.Setup(m => m.Read(It.IsAny(), It.IsAny(), It.IsAny())) + .Callback((b, o, c) => data.CopyTo(b, 0)) + .Returns(data.Length); + + var contents = new byte[stream.Object.Length]; + stream.Object.Read(contents, 0, (int)stream.Object.Length); + } + } + + #endregion + + #region #232 + + public class _232 + { + [Fact] + public void Test() + { + var repository = new Mock(); + var svc = new Service(repository.Object); + + svc.Create(); + + repository.Verify(r => r.Insert(It.IsAny()), Times.Once()); + repository.Verify(r => r.Insert(It.IsAny()), Times.Once()); + repository.Verify(r => r.Insert(It.IsAny()), Times.Exactly(2)); + } + + public interface IRepository + { + void Insert(IEntity entity); + } + + public interface IEntity + { + } + + public class Foo : IEntity + { + } + + public class Bar : IEntity + { + } + + public class Service + { + private IRepository repository; + + public Service(IRepository repository) + { + this.repository = repository; + } + + public void Create() + { + repository.Insert(new Foo()); + repository.Insert(new Bar()); + } + } + } + + #endregion + + #region #242 + + public class _242 + { + [Fact] + public void PropertyChangedTest() + { + var mock = new Mock(); + int callbacks = 0; + mock.Object.PropertyChanged += (sender, args) => callbacks++; + + mock.Raise(m => m.PropertyChanged += null, new PropertyChangedEventArgs("Foo")); + Assert.Equal(1, callbacks); + } + + public class PropertyChangedBase : INotifyPropertyChanged + { + public virtual event PropertyChangedEventHandler PropertyChanged = (s, e) => { }; + } + + public class PropertyChangedInherited : PropertyChangedBase + { + } + } + + #endregion + + #region #245 + + public class _245 + { + [Fact] + public void Test() + { + var mock = new Mock(); + + ITest instance; + instance = mock.Object; + } + + public interface ITest + { + void Do() where T2 : T1; + } + } + + #endregion + + #region #251 + + public class _251 + { + [Fact] + public void Test() + { + var repositoryMock = new Mock>(); + + var repository = repositoryMock.Object; + repository.Save("test"); + + repositoryMock.Verify(m => m.Save("test")); + } + + public interface IRepository + { + void Save(string value); + } + + public interface IRepository : IRepository + { + void Save(T value); + } + } + + #endregion + + #region #256 + + public class _256 + { + [Fact] + public void TestFinalizeNotMocked() + { + var mock = new Mock(MockBehavior.Strict); + mock.Setup(m => m.Foo).Returns(10); + mock.Setup(m => m.Bar).Returns("Hello mocked world!"); + var instance = mock.Object; + + Assert.Equal(10, instance.Foo); + } + + public class ClassWithFinalizer + { + public virtual int Foo { get; set; } + public virtual string Bar { get; set; } + + ~ClassWithFinalizer() + { + + } + } + } + + #endregion + + #region #261 + + public class _261 + { + [Fact] + public void Test() + { + var mock = new Mock(); + mock.Protected().SetupSet("Status", 42); + + mock.Object.SetStatus(42); + + mock.Protected().VerifySet("Status", Times.Once(), 42); + } + + public class Foo + { + public virtual int Status { get; protected set; } + + internal void SetStatus(int value) + { + this.Status = value; + } + } + } + + #endregion + + #region #267 + + public class _267 + { + public interface IPerformOperation + { + string Operation(object input); + } + + public class OperationUser + { + private readonly IPerformOperation m_OperationPerformer; + + public OperationUser(IPerformOperation operationPerformer) + { + m_OperationPerformer = operationPerformer; + } + + public string DoOperation(object input) + { + return m_OperationPerformer.Operation(input); + } + } + + public class HelperSetup + { + private Mock m_OperationStub; + + public HelperSetup() + { + m_OperationStub = new Mock(); + } + + [Fact] + public void InlineSetupTest() + { + m_OperationStub.Setup(m => m.Operation(It.IsAny())).Returns(value => "test"); + m_OperationStub.Setup(m => m.Operation(It.IsAny())).Returns(value => "25"); + + var operationUser = new OperationUser(m_OperationStub.Object); + + var intOperationResult = operationUser.DoOperation(9); + var stringOperationResult = operationUser.DoOperation("Hello"); + + Assert.Equal("25", intOperationResult); + Assert.Equal("test", stringOperationResult); + } + + [Fact] + public void HelperSetupTest() + { + SetupOperationStub(value => "test"); + SetupOperationStub(value => "25"); + + var operationUser = new OperationUser(m_OperationStub.Object); + + var intOperationResult = operationUser.DoOperation(9); + var stringOperationResult = operationUser.DoOperation("Hello"); + + Assert.Equal("25", intOperationResult); + Assert.Equal("test", stringOperationResult); + } + + private void SetupOperationStub(Func valueFunction) + { + m_OperationStub.Setup(m => m.Operation(It.IsAny())).Returns(valueFunction); + } + } + } + + #endregion + + #region #273 + +#if !SILVERLIGHT + + public class _273 + { + [Fact] + public void WhenMockingAnExternalInterface_ThenItWorks() + { + Assert.NotNull(new Mock().Object); + Assert.NotNull(Mock.Of()); + Assert.NotNull(new Mock().Object); + Assert.NotNull(new Mock().Object); + Assert.NotNull(Mock.Of()); + Assert.NotNull(new Mock().Object); + Assert.NotNull(new Mock().Object); + } + + public class Baz : ClassLibrary2.Bar + { + } + } + +#endif + + #endregion + + #region #325 + + public class _325 + { + [Fact] + public void SubscribingWorks() + { + var target = new Mock { CallBase = true }; + target.As(); + + var bar = (IBar)target.Object; + var raised = false; + bar.SomeEvent += (sender, e) => raised = true; + + target.As().Raise(b => b.SomeEvent += null, EventArgs.Empty); + + Assert.True(raised); + } + + [Fact] + public void UnsubscribingWorks() + { + var target = new Mock { CallBase = true }; + target.As(); + + var bar = (IBar)target.Object; + var raised = false; + EventHandler handler = (sender, e) => raised = true; + bar.SomeEvent += handler; + bar.SomeEvent -= handler; + + target.As().Raise(b => b.SomeEvent += null, EventArgs.Empty); + + Assert.False(raised); + } + + public class Foo + { + } + + public interface IBar + { + event EventHandler SomeEvent; + } + + } + + #endregion + + #region #326 + +#if !SILVERLIGHT + + public class _326 + { + [Fact] + public void ShouldSupportMockingWinFormsControl() + { + var foo = new Mock(); + var bar = foo.Object; + } + } + +#endif + + #endregion + + #region Recursive issue + + public class RecursiveFixture + { + [Fact] + public void TestRecursive() + { + var mock = new Mock() { DefaultValue = DefaultValue.Mock }; + mock.Setup(c => c.HttpContext.Response.Write("stuff")); + + mock.Object.HttpContext.Response.Write("stuff"); + mock.Object.HttpContext.Response.ShouldEncode = true; + + Assert.Throws(() => mock.VerifySet( + c => c.HttpContext.Response.ShouldEncode = It.IsAny(), + Times.Never())); + } + + public class ControllerContext + { + public virtual HttpContext HttpContext { get; set; } + } + + public abstract class HttpContext + { + protected HttpContext() + { + } + + public virtual HttpResponse Response + { + get { throw new NotImplementedException(); } + } + } + + public abstract class HttpResponse + { + protected HttpResponse() + { + } + + public virtual bool ShouldEncode + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public virtual void Write(string s) + { + throw new NotImplementedException(); + } + } + } + + #endregion + + #region #250 + + /// + /// Silverlight MethodInfo protected constructor is internal, unlike desktop .NET + /// + public class _250 + { + [Fact] + public void Test() + { + var target = new Mock(); + + Assert.NotNull(target.Object); + } + } + + #endregion + + #region Matcher should work with Convert + + public class MatcherConvertFixture + { + public interface IFoo + { + string M(long l); + } + + [Fact] + public void MatcherDoesNotIgnoreConvert() + { + var mock = new Mock(MockBehavior.Strict); + mock.Setup(x => x.M(int.Parse("2"))).Returns("OK"); + Assert.Equal("OK", mock.Object.M(2L)); + } + } + + #endregion + } }