public void EqualsReturnsCorrectResult(
            bool typeResult,
            bool nameResult,
            bool expected)
        {
            var field = typeof(string).GetField("Empty");
            var typeCriterion = new DelegatingCriterion<Type>
            {
                OnEquals = t =>
                {
                    Assert.Equal(field.FieldType, t);
                    return typeResult;
                }
            };
            var nameCriterion = new DelegatingCriterion<string>
            {
                OnEquals = n =>
                {
                    Assert.Equal(field.Name, n);
                    return nameResult;
                }
            };
            var sut =
                new FieldTypeAndNameCriterion(
                    typeCriterion,
                    nameCriterion);

            var actual = sut.Equals(field);

            Assert.Equal(expected, actual);
        }
        public void EqualsReturnsCorrectResult(
            bool typeResult,
            bool nameResult,
            bool expected)
        {
            var parameter = 
                typeof(string).GetMethod("Contains").GetParameters().First();
            var typeCriterion = new DelegatingCriterion<Type>
            {
                OnEquals = t =>
                {
                    Assert.Equal(parameter.ParameterType, t);
                    return typeResult;
                }
            };
            var nameCriterion = new DelegatingCriterion<string>
            {
                OnEquals = n =>
                {
                    Assert.Equal(parameter.Name, n);
                    return nameResult;
                }
            };
            var sut =
                new ParameterTypeAndNameCriterion(
                    typeCriterion,
                    nameCriterion);

            var actual = sut.Equals(parameter);

            Assert.Equal(expected, actual);
        }
        public void EqualsReturnsCorrectResult(
            bool typeResult,
            bool nameResult,
            bool expected)
        {
            var prop = typeof(string).GetProperty("Length");
            var typeCriterion = new DelegatingCriterion<Type>
            {
                OnEquals = t =>
                {
                    Assert.Equal(prop.PropertyType, t);
                    return typeResult;
                }
            };
            var nameCriterion = new DelegatingCriterion<string>
            {
                OnEquals = n =>
                {
                    Assert.Equal(prop.Name, n);
                    return nameResult;
                }
            };
            var sut = 
                new PropertyTypeAndNameCriterion(
                    typeCriterion,
                    nameCriterion);

            var actual = sut.Equals(prop);

            Assert.Equal(expected, actual);
        }
        public void IsSatisfiedByReturnsCorrectResultAccordingToTarget(
            bool expected)
        {
            var field = typeof(string).GetField("Empty");
            var target = new DelegatingCriterion<FieldInfo>
            {
                OnEquals = f =>
                {
                    Assert.Equal(field, f);
                    return expected;
                }
            };
            var sut = new FieldSpecification(target);

            var actual = sut.IsSatisfiedBy(field);

            Assert.Equal(expected, actual);
        }
        public void SutEqualsIdenticalValue()
        {
            var typeCriterion = new DelegatingCriterion<Type>();
            var nameCriterion = new DelegatingCriterion<string>();
            var sut =
                new FieldTypeAndNameCriterion(typeCriterion, nameCriterion);

            var other =
                new FieldTypeAndNameCriterion(typeCriterion, nameCriterion);
            var actual = sut.Equals(other);

            Assert.True(actual, "Expected structural equality to hold.");
        }
        public void NameCriterionIsCorrect()
        {
            var expected = new DelegatingCriterion<string>();
            var sut = new FieldTypeAndNameCriterion(
                new DelegatingCriterion<Type>(),
                expected);

            IEquatable<string> actual = sut.NameCriterion;

            Assert.Equal(expected, actual);
        }
        public void SutDoesNotEqualOtherWhenNameCriterionDiffers()
        {
            var typeCriterion = new DelegatingCriterion<Type>();
            var sut = new FieldTypeAndNameCriterion(
                typeCriterion,
                new DelegatingCriterion<string>());

            var other = new FieldTypeAndNameCriterion(
                typeCriterion,
                new DelegatingCriterion<string>());
            var actual = sut.Equals(other);

            Assert.False(
                actual,
                "SUT should not equal other when name criterion differs.");
        }
        public void IsSatisfiedByReturnsCorrectResultAccordingToTarget(
            bool expected)
        {
            var prop = typeof(string).GetProperty("Length");
            var target = new DelegatingCriterion<PropertyInfo>
            {
                OnEquals = p =>
                {
                    Assert.Equal(prop, p);
                    return expected;
                }
            };
            var sut = new PropertySpecification(target);

            var actual = sut.IsSatisfiedBy(prop);

            Assert.Equal(expected, actual);
        }
        public void TypeCriterionIsCorrect()
        {
            var expected = new DelegatingCriterion<Type>();
            var sut = new ParameterTypeAndNameCriterion(
                expected,
                new DelegatingCriterion<string>());

            IEquatable<Type> actual = sut.TypeCriterion;

            Assert.Equal(expected, actual);
        }
        public void IsSatisfiedByReturnsCorrectResultAccordingToTarget(
            bool expected)
        {
            var parameter =
                typeof(string).GetMethod("Contains").GetParameters().First();
            var target = new DelegatingCriterion<ParameterInfo>
            {
                OnEquals = f =>
                {
                    Assert.Equal(parameter, f);
                    return expected;
                }
            };
            var sut = new ParameterSpecification(target);

            var actual = sut.IsSatisfiedBy(parameter);

            Assert.Equal(expected, actual);
        }