public void Mocks_inherit_custom_default_value_provider_from_MockRepository()
        {
            var customDefaultValueProvider = new ConstantDefaultValueProvider(null);
            var mockRepository             = new MockRepository(MockBehavior.Default)
            {
                DefaultValueProvider = customDefaultValueProvider
            };

            var mock = mockRepository.Create <IFoo>();

            Assert.Equal(DefaultValue.Custom, mock.DefaultValue);
            Assert.Same(customDefaultValueProvider, mock.DefaultValueProvider);
        }
        public void Custom_DefaultValueProvider_gets_invoked()
        {
            const int expectedReturnValue          = 42;
            var       constantDefaultValueProvider = new ConstantDefaultValueProvider(expectedReturnValue);
            var       mock = new Mock <IFoo>()
            {
                DefaultValueProvider = constantDefaultValueProvider
            };

            var actualReturnValue = mock.Object.GetValue();

            Assert.Equal(expectedReturnValue, actualReturnValue);
        }
        public void FluentMockContext_properly_restores_custom_default_value_provider()
        {
            var customDefaultValueProvider = new ConstantDefaultValueProvider(42);
            var mock = new Mock <IFoo>()
            {
                DefaultValueProvider = customDefaultValueProvider
            };

            mock.VerifySet(m => m.Inner.Value = 1, Times.Never);
            //             ^^^^^^^^^^^^^^^^^^^^^^
            // Moq has to execute this action to analyze what is being set. Because this is a multi-dot expression,
            // it temporarily switches to DefaultValue.Mock. Once it's done, it should switch back to the one we
            // set up above.

            Assert.Same(customDefaultValueProvider, mock.DefaultValueProvider);
        }
        public void Inner_mocks_inherit_custom_default_value_provider_from_outer_mock()
        {
            const int expectedReturnValue        = 42;
            var       customDefaultValueProvider = new ConstantDefaultValueProvider(expectedReturnValue);
            var       outerMock = new Mock <IFoo>()
            {
                DefaultValueProvider = customDefaultValueProvider
            };

            outerMock.Setup(om => om.Inner.GetValues());             // we don't care about GetValues, all we want here is a multi-dot expression
            var inner     = outerMock.Object.Inner;
            var innerMock = Mock.Get(inner);

            Assert.Same(outerMock.DefaultValueProvider, innerMock.DefaultValueProvider);

            var actualReturnValue = inner.GetValue();

            Assert.Equal(expectedReturnValue, actualReturnValue);
        }
        public void Custom_default_value_provider_does_not_interfere_with_recursive_mocking()
        {
            var nullDefaultValueProvider = new ConstantDefaultValueProvider(null);
            var outerMock = new Mock <IFoo>()
            {
                DefaultValueProvider = nullDefaultValueProvider
            };

            outerMock.Setup(om => om.Inner.GetValue());
            //                      ^^^^^^
            // If the custom default value provider were used to determine this value,
            // then it would be `null` instead of a mocked `IFoo` instance. Multi-dot expressions
            // must always use `MockDefaultValueProvider`, regardless of the outermost mock's
            // configured default value provider.
            var inner = outerMock.Object.Inner;

            Assert.NotNull(inner);
            Assert.IsAssignableFrom <IFoo>(inner);
        }
        public void Custom_DefaultValueProvider_implementations_have_Kind_Custom()
        {
            var customDefaultValueProvider = new ConstantDefaultValueProvider(null);

            Assert.Equal(DefaultValue.Custom, customDefaultValueProvider.Kind);
        }