public void CreatorShouldThrowAnArgumentOutOfRangeExceptionWhenTheSourceFieldIsNotAPropertyOfTheModel()
        {
            // arrange
            var creator = new StringContainsExpressionCreator();

            var columnMock = new Mock <IColumn>();

            columnMock.SetupGet(model => model.Field).Returns("UnknownField");

            var searchMock = new Mock <ISearch>();

            var parameterExpression = Expression.Parameter(typeof(TestModel));

            // act & assert
            Assert.Throws <ArgumentOutOfRangeException>(() => creator.CreateExpression <TestModel>(columnMock.Object, searchMock.Object, parameterExpression));
        }
        public void CreatorShouldThrowNotSupportedExceptionWhenTheSearchQueryIsBasedOnARegularExpression()
        {
            // arrange
            var creator = new StringContainsExpressionCreator();

            var columnMock = new Mock <IColumn>();

            columnMock.SetupGet(model => model.Field).Returns(nameof(TestModel.StringProp));

            var searchMock = new Mock <ISearch>();

            searchMock.SetupGet(search => search.IsRegex).Returns(true);

            var parameterExpression = Expression.Parameter(typeof(TestModel));

            // act & assert
            Assert.Throws <NotSupportedException>(() => creator.CreateExpression <TestModel>(columnMock.Object, searchMock.Object, parameterExpression));
        }
        public void CreatorShouldReturnAnExpressionThatCorrectlyFiltersAListUsingContainsMethod()
        {
            // arrange
            var creator = new StringContainsExpressionCreator();

            var columnMock = new Mock <IColumn>();

            columnMock.SetupGet(model => model.Field).Returns(nameof(TestModel.StringProp));

            var searchMock = new Mock <ISearch>();

            searchMock.SetupGet(search => search.IsRegex).Returns(false);
            searchMock.SetupGet(search => search.Value).Returns("Test");

            var parameterExpression = Expression.Parameter(typeof(TestModel));

            var testItemToBeFound = new TestModel()
            {
                StringProp = "This is a test."
            };
            var testItemNotToBeFound = new TestModel()
            {
                StringProp = "And this one shouldn't be found."
            };

            var testList = new List <TestModel>()
            {
                testItemToBeFound,
                testItemNotToBeFound
            };

            // act
            var searchExpression = creator.CreateExpression <TestModel>(columnMock.Object, searchMock.Object, parameterExpression);
            var searchResults    = testList.Where(searchExpression.Compile());

            // assert
            Assert.Collection(searchResults, searchHit => Assert.Equal(testItemToBeFound, searchHit));
        }