public void IsSatisfiedBy()
        {
            var testObject = new TestObject();

            var specification = new TestObjectSpecification();

            specification.IsSatisfiedBy(testObject).ShouldBeTrue();
        }
        public void EmptySpecificationCreatesTrueSpecification()
        {
            var testObject = new TestObject();

            var specification = new TestObjectSpecification();

            var expectedResult = true;

            ExpressionSpecificationTester.TestSpecification(specification, testObject, expectedResult);
        }
        public void WhenSpecificationForPropertyIsEmptyOmitSpecification()
        {
            var testObject = new TestObject();

            var specification = new TestObjectSpecification()
                                .ByProperty(p => {});

            var expectedResult = true;

            ExpressionSpecificationTester.TestSpecification(specification, testObject, expectedResult);
        }
        public void WhenSpecificationForCollectionAllIsEmptyOmitSpecification()
        {
            var testObject = new TestObject();

            var specification = new TestObjectSpecification()
                                .CollectionAll(p => { });

            var expectedResult = true;

            ExpressionSpecificationTester.TestSpecification(specification, testObject, expectedResult);
        }
        public void WhereAddsSingleSpecification()
        {
            var testObject = new TestObject()
            {
                BooleanProperty = true
            };

            var specification = new TestObjectSpecification().BooleanProperty(true);

            var expectedResult = true;

            ExpressionSpecificationTester.TestSpecification(specification, testObject, expectedResult);
        }
        public void NotNegateSpecification()
        {
            var testObject = new TestObject()
            {
                BooleanProperty = false
            };

            var specification = new TestObjectSpecification()
                                .Not(p => p.BooleanProperty(true));

            var expectedResult = true;

            ExpressionSpecificationTester.TestSpecification(specification, testObject, expectedResult);
        }
        public void AllowsApplySpecificationForDerivedObjects()
        {
            var testObject = new DerivedFromTestObject()
            {
                AdditionalProperty = true
            };

            var specification = new TestObjectSpecification()
                                .ByDerived(p => p.AdditionalProperty(true));

            var expectedResult = true;

            ExpressionSpecificationTester.TestSpecification(specification, testObject, expectedResult);
        }
        public void OrNotThrowsWhenSpecificationIsEmpty()
        {
            var testObject = new TestObject()
            {
                BooleanProperty1 = true
            };

            var specification = new TestObjectSpecification();

            Assert.Throws <Exception>(() =>
            {
                specification.OrNot(or => or.BooleanProperty1(false));
            });
        }
        public void OrNotCombineSpecificationsByNegatedDisjunction()
        {
            var testObject = new TestObject()
            {
                BooleanProperty  = false,
                BooleanProperty1 = true
            };

            var specification = new TestObjectSpecification()
                                .BooleanProperty(true).OrNot(or => or.BooleanProperty1(false));

            var expectedResult = true;

            ExpressionSpecificationTester.TestSpecification(specification, testObject, expectedResult);
        }
        public void WhereCombineSpecificationsByConjunction()
        {
            var testObject = new TestObject()
            {
                BooleanProperty  = true,
                BooleanProperty1 = true
            };

            var specification = new TestObjectSpecification()
                                .BooleanProperty(true)
                                .BooleanProperty1(true);

            var expectedResult = true;

            ExpressionSpecificationTester.TestSpecification(specification, testObject, expectedResult);
        }
        public void OrNotWithManyParametersCombinePreviousWithExistingSpecificationByByNegatedConjunction()
        {
            var testObject = new TestObject()
            {
                BooleanProperty  = false,
                BooleanProperty1 = true
            };

            var specification = new TestObjectSpecification()
                                .BooleanProperty(false)
                                .OrNot(or => or.BooleanProperty1(false), or => or.BooleanProperty1(false));

            var expectedResult = true;

            ExpressionSpecificationTester.TestSpecification(specification, testObject, expectedResult);
        }
        public void AllowsPropertyToBeFilteredBySpecification()
        {
            var testObject = new TestObject()
            {
                Property = new TestObject()
                {
                    BooleanProperty = true
                }
            };

            var specification = new TestObjectSpecification()
                                .ByProperty(p => p.BooleanProperty(true));

            var expectedResult = true;

            ExpressionSpecificationTester.TestSpecification(specification, testObject, expectedResult);
        }
        public void AllowsCollectionToBeFilteredBySpecificationWithAnyOperator()
        {
            var testObject = new TestObject()
            {
                Collection = new List <TestObject>()
                {
                    new TestObject()
                    {
                        BooleanProperty = true
                    }
                }
            };

            var specification = new TestObjectSpecification()
                                .CollectionAny(p => p.BooleanProperty(true));

            var expectedResult = true;

            ExpressionSpecificationTester.TestSpecification(specification, testObject, expectedResult);
        }