public void ShouldCreateConstructorParametersIfFilterIsSatisfied(
            [Frozen]IRequestSpecification requestSpecification,
            ISpecimenContext specimenContext,
            RecordReplayConstructorSpecimensForTypeBuilder sut)
        {
            requestSpecification.IsSatisfiedBy(Arg.Any<object>()).Returns(true);

            sut.Create(typeof (SimpleType), specimenContext);

            specimenContext.Received(1).Resolve(Arg.Any<object>());
        }
        public void ShouldDelegateToDecoratedBuilderIfFilterIsNotSatisfied(
            [Frozen]IRequestSpecification requestSpecification,
            [Substitute]ISpecimenBuilder builder)
        {
            requestSpecification.IsSatisfiedBy(Arg.Any<object>()).Returns(false);

            var sut = new RecordReplayConstructorSpecimensForTypeBuilder(builder, requestSpecification);
            sut.CreateInstanceOfType(typeof (object));

            builder.Received(1).Create(Arg.Any<object>(), Arg.Any<ISpecimenContext>());
        }
        public void ShouldCreateConstructorParametersIfFilterIsSatisfied(
            [Frozen] IRequestSpecification requestSpecification,
            ISpecimenContext specimenContext,
            RecordReplayConstructorSpecimensForTypeBuilder sut)
        {
            requestSpecification.IsSatisfiedBy(Arg.Any <object>()).Returns(true);

            sut.Create(typeof(SimpleType), specimenContext);

            specimenContext.Received(1).Resolve(Arg.Any <object>());
        }
        public void ShouldUseRecordedConstructorSpecimensInSubsequentCallsForTheSameRequest(
            [Frozen]IRequestSpecification requestSpecification,
            ISpecimenContext context,
            RecordReplayConstructorSpecimensForTypeBuilder sut)
        {
            requestSpecification.IsSatisfiedBy(Arg.Any<object>()).Returns(true);

            sut.Create(typeof (SimpleType), context);
            sut.Create(typeof (SimpleType), context);

            context.Received(1).Resolve(Arg.Any<object>());
        }
        public void ShouldUseRecordedConstructorSpecimensInSubsequentCallsForTheSameRequest(
            [Frozen] IRequestSpecification requestSpecification,
            ISpecimenContext context,
            RecordReplayConstructorSpecimensForTypeBuilder sut)
        {
            requestSpecification.IsSatisfiedBy(Arg.Any <object>()).Returns(true);

            sut.Create(typeof(SimpleType), context);
            sut.Create(typeof(SimpleType), context);

            context.Received(1).Resolve(Arg.Any <object>());
        }
        public void ShouldDelegateToDecoratedBuilderIfFilterIsNotSatisfied(
            [Frozen] IRequestSpecification requestSpecification,
            [Substitute] ISpecimenBuilder builder)
        {
            requestSpecification.IsSatisfiedBy(Arg.Any <object>()).Returns(false);

            var sut = new RecordReplayConstructorSpecimensForTypeBuilder(builder, requestSpecification);

            sut.CreateInstanceOfType(typeof(object));

            builder.Received(1).Create(Arg.Any <object>(), Arg.Any <ISpecimenContext>());
        }
        public override void Verify(MethodInfo methodInfo)
        {
            if (methodInfo == null)
            {
                throw new ArgumentNullException("methodInfo");
            }

            if (methodInfo.ReflectedType == null && !methodInfo.IsObjectEqualsOverrideMethod())
            {
                return;
            }

            var recordReplayBuilder = new RecordReplayConstructorSpecimensForTypeBuilder(builder,
                new ExactTypeSpecification(methodInfo.ReflectedType));

            var firstInstance = recordReplayBuilder.CreateInstanceOfType(methodInfo.ReflectedType);
            var secondInstance = recordReplayBuilder.CreateInstanceOfType(methodInfo.ReflectedType);
            var thirdInstance = recordReplayBuilder.CreateInstanceOfType(methodInfo.ReflectedType);

            var firstToSecondComparisonResult = firstInstance.Equals(secondInstance);
            var secondToThirdComparisonResult = secondInstance.Equals(firstInstance);
            var firstToThirdComparisonResult = firstInstance.Equals(thirdInstance);

            if ((firstToSecondComparisonResult && secondToThirdComparisonResult) != true)
            {
                throw new EqualsTransitiveException(
                    "Can't check transitive property of Equals implementation due to object created with the same values doesn't result true, propably they are performing identity check instead of value check");
            }

            if ((firstToSecondComparisonResult && secondToThirdComparisonResult) != firstToThirdComparisonResult)
            {
                throw new EqualsTransitiveException(string.Format(
                    "Equals implementation of type {0} is not transitive. It breaks following rule x.Equals(y) && y.Equals(z) == true then x.Equals(z) == true",
                    methodInfo.ReflectedType));
            }
        }
        public override void Verify(MethodInfo methodInfo)
        {
            if (methodInfo == null)
            {
                throw new ArgumentNullException("methodInfo");
            }

            if (methodInfo.ReflectedType == null && !methodInfo.IsObjectEqualsOverrideMethod())
            {
                return;
            }

            var recordReplayBuilder = new RecordReplayConstructorSpecimensForTypeBuilder(builder,
                                                                                         new ExactTypeSpecification(methodInfo.ReflectedType));

            var firstInstance  = recordReplayBuilder.CreateInstanceOfType(methodInfo.ReflectedType);
            var secondInstance = recordReplayBuilder.CreateInstanceOfType(methodInfo.ReflectedType);
            var thirdInstance  = recordReplayBuilder.CreateInstanceOfType(methodInfo.ReflectedType);

            var firstToSecondComparisonResult = firstInstance.Equals(secondInstance);
            var secondToThirdComparisonResult = secondInstance.Equals(firstInstance);
            var firstToThirdComparisonResult  = firstInstance.Equals(thirdInstance);

            if ((firstToSecondComparisonResult && secondToThirdComparisonResult) != true)
            {
                throw new EqualsTransitiveException(
                          "Can't check transitive property of Equals implementation due to object created with the same values doesn't result true, propably they are performing identity check instead of value check");
            }

            if ((firstToSecondComparisonResult && secondToThirdComparisonResult) != firstToThirdComparisonResult)
            {
                throw new EqualsTransitiveException(string.Format(
                                                        "Equals implementation of type {0} is not transitive. It breaks following rule x.Equals(y) && y.Equals(z) == true then x.Equals(z) == true",
                                                        methodInfo.ReflectedType));
            }
        }
 public void ShouldBeSpecimenBuilder(RecordReplayConstructorSpecimensForTypeBuilder sut)
 {
     Assert.IsAssignableFrom<ISpecimenBuilder>(sut);
 }
 public void ShouldBeSpecimenBuilder(RecordReplayConstructorSpecimensForTypeBuilder sut)
 {
     Assert.IsAssignableFrom <ISpecimenBuilder>(sut);
 }