public void CreateNewArrangementCollection()
        {
            // Given
            var signature = typeof(IFooFuncValueTypeParameterless <int>)
                            .GetMethod(nameof(IFooFuncValueTypeParameterless <int> .MethodWithoutParameter)) ?? throw new InvalidOperationException();
            var arrangment = new ReturnValueArrangement <int>(signature, 42);

            // When
            var arrangmentCollection = new ArrangementCollection(arrangment);

            // Then
            Assert.Single(arrangmentCollection);
            Assert.Equal(1u, arrangmentCollection.Count);
        }
        public void ApplyValueTypeReturnValueArrangement()
        {
            // Given
            var signature = typeof(IFooFuncValueTypeParameterless <int>)
                            .GetMethod(nameof(IFooFuncValueTypeParameterless <int> .MethodWithoutParameter)) ?? throw new InvalidOperationException();
            var returnValueFeature = new ReturnValueInvocation <int>();
            var invocation         = new Invocation(signature, returnValueFeature);
            var arrangment         = new ReturnValueArrangement <int>(signature, 42);

            // When
            arrangment.ApplyTo(invocation);

            // Then
            Assert.True(invocation.HasFeature <IReturnValue <int> >());
            var feature = invocation.GetFeature <IReturnValue <int> >();

            Assert.Equal(42, feature.ReturnValue);
        }
        public void EnsureNoArrangentIsAppliedToNonMatchingInvocation()
        {
            // Given
            var valueTypeSignature = typeof(IFooFuncValueTypeParameterless <int>)
                                     .GetMethod(nameof(IFooFuncValueTypeParameterless <int> .MethodWithoutParameter)) ?? throw new InvalidOperationException();
            var referenceTypeSignature = typeof(IFooFuncReferenceTypeParameterless <object>)
                                         .GetMethod(nameof(IFooFuncReferenceTypeParameterless <object> .MethodWithoutParameter)) ?? throw new InvalidOperationException();
            var returnValueFeature = new ReturnValueInvocation <int>();
            var invocation         = new Invocation(referenceTypeSignature, returnValueFeature);
            var arrangment         = new ReturnValueArrangement <int>(valueTypeSignature, 42);

            // When
            arrangment.ApplyTo(invocation);

            // Then
            Assert.True(invocation.HasFeature <IReturnValue <int> >());
            var feature = invocation.GetFeature <IReturnValue <int> >();

            Assert.Equal(default, feature.ReturnValue);
        public void CheckIfAMatchingArrangmentExists()
        {
            // Given
            var signature = typeof(IFooFuncValueTypeParameterless <int>)
                            .GetMethod(nameof(IFooFuncValueTypeParameterless <int> .MethodWithoutParameter)) ?? throw new InvalidOperationException();
            var otherSignature = typeof(IFooFuncValueTypeParameterIn <int>)
                                 .GetMethod(nameof(IFooFuncValueTypeParameterIn <int> .MethodWithOneParameter)) ?? throw new InvalidOperationException();
            var returnValueFeature   = new ReturnValueInvocation <int>();
            var invocation           = new Invocation(signature, returnValueFeature);
            var arrangment           = new ReturnValueArrangement <int>(signature, 42);
            var otherArrangment      = new ReturnValueArrangement <int>(otherSignature, 13);
            var arrangmentCollection = new ArrangementCollection(arrangment, otherArrangment);

            // When
            var hasMatchingArrangment = arrangmentCollection.CanApplyAtLeasOneArrangmentTo(invocation);

            // Then
            Assert.True(hasMatchingArrangment);
        }
        public void ApplyValueTypeGetterReturnValueArrangement()
        {
            // Given
            var signature = typeof(IFooValueTypeGetter <int>)
                            .GetProperty(nameof(IFooValueTypeGetter <int> .Getter)) ?? throw new InvalidOperationException();
            var getter = signature.GetGetMethod() ?? throw new InvalidOperationException();

            var propertyFeature    = new PropertyInvocation(signature);
            var returnValueFeature = new ReturnValueInvocation <int>();
            var invocation         = new Invocation(getter, propertyFeature, returnValueFeature);
            var arrangment         = new ReturnValueArrangement <int>(getter, 42);

            // When
            arrangment.ApplyTo(invocation);

            // Then
            Assert.True(invocation.HasFeature <IReturnValue <int> >());
            var feature = invocation.GetFeature <IReturnValue <int> >();

            Assert.Equal(42, feature.ReturnValue);
        }
        public void SuccessfullInvocationWithArrangement()
        {
            // Given
            var type             = typeof(object);
            var methodName       = nameof(object.GetHashCode);
            var signature        = type.GetMethod(methodName) ?? throw new MethodInfoException(type, methodName);
            var methodInvocation = new Invocation(signature, new ReturnValueInvocation <int>());

            var arrangement  = new ReturnValueArrangement <int>(signature, 42);
            var arrangements = new ArrangementCollection(new IArrangement[] { arrangement });
            var interceptor  = new PartialMockInterceptor(arrangements);

            // When
            var wasIntercepted = interceptor.Intercept(methodInvocation);

            // Then
            Assert.True(wasIntercepted);
            var hasFeature = methodInvocation.TryGetFeature <IReturnValue <int> >(out var feature);

            Assert.True(hasFeature);
            Assert.Equal(42, feature?.ReturnValue);
        }
        public void ApplyAsyncValueTypeTaskReturnValueArrangement()
        {
            // Given
            var signature = typeof(IFooGenericTaskValueTypeParameterless)
                            .GetMethod(nameof(IFooGenericTaskValueTypeParameterless.MethodWithoutParameterAsync)) ?? throw new InvalidOperationException();
            var asyncFeature = new AsyncGenericTaskInvocation <int>();
            var invocation   = new Invocation(signature, asyncFeature);
            var arrangment   = new ReturnValueArrangement <Task <int> >(signature, Task.FromResult(42));

            // When
            arrangment.ApplyTo(invocation);

            // Then
            Assert.True(invocation.HasFeature <IAsyncInvocation <Task <int> > >());
            var feature = invocation.GetFeature <IAsyncInvocation <Task <int> > >();

            Assert.IsAssignableFrom <Task <int> >(feature.AsyncReturnValue);

            Assert.True(invocation.HasFeature <IReturnValue <int> >());
            var returnValueFeature = invocation.GetFeature <IReturnValue <int> >();

            Assert.Equal(42, returnValueFeature.ReturnValue);
        }
        public void TryToApplyOnlyMatchingArrangements()
        {
            // Given
            var signature = typeof(IFooFuncValueTypeParameterless <int>)
                            .GetMethod(nameof(IFooFuncValueTypeParameterless <int> .MethodWithoutParameter)) ?? throw new InvalidOperationException();
            var otherSignature = typeof(IFooFuncValueTypeParameterIn <int>)
                                 .GetMethod(nameof(IFooFuncValueTypeParameterIn <int> .MethodWithOneParameter)) ?? throw new InvalidOperationException();
            var returnValueFeature   = new ReturnValueInvocation <int>();
            var invocation           = new Invocation(signature, returnValueFeature);
            var arrangment           = new ReturnValueArrangement <int>(signature, 42);
            var otherArrangment      = new ReturnValueArrangement <int>(otherSignature, 13);
            var arrangmentCollection = new ArrangementCollection(arrangment, otherArrangment);

            // When
            var hasAppliedArrangment = arrangmentCollection.TryApplyTo(invocation);

            // Then
            Assert.True(hasAppliedArrangment);
            Assert.True(invocation.HasFeature <IReturnValue <int> >());
            var feature = invocation.GetFeature <IReturnValue <int> >();

            Assert.Equal(42, feature.ReturnValue);
        }