public void Range_Filter_Should_Convert_Successfully()
        {
            // Arrange
            var filter = "(Age[between]20-30)";

            // Act
            var stringResults = new FilterParser().Parse(filter);
            var typeResults   = new FilterParser().ParseAs(filter, new TypeSearchConverter <object>());

            // Assert
            Assert.NotNull(stringResults);
            Assert.NotNull(typeResults);

            Assert.NotEmpty(stringResults);
            Assert.NotEmpty(typeResults.Criteria);

            Assert.Equal(typeof(StringSearch.Filter.RangeCriterion), stringResults.ElementAt(0).GetType());
            var stringCriterion = (StringSearch.Filter.RangeCriterion)stringResults.ElementAt(0);

            Assert.Equal("Age", stringCriterion.Name);
            Assert.Equal(ConditionOperatorType.Between, stringCriterion.Operator);
            Assert.Equal("20", stringCriterion.StartValue);
            Assert.Equal("30", stringCriterion.EndValue);

            Assert.Equal(typeof(CriteriaContainer <object>), typeResults.Criteria.ElementAt(0).GetType());
            var typeCriterion = typeResults.Criteria.ElementAt(0);

            Assert.NotNull(typeCriterion.RangeCriterion);
            var rangeCriterion = typeCriterion.RangeCriterion;

            Assert.Equal("Age", rangeCriterion.Name);
            Assert.Equal(RangeOperator.Between, rangeCriterion.Operator);
            Assert.Equal("20", rangeCriterion.StartValue);
            Assert.Equal("30", rangeCriterion.EndValue);
        }
        public void Nested_Filter_Should_Parse_Second_Tier_Successfully()
        {
            // Arrange
            var filter = "(LastName[eq]Doe)[and]((FirstName[eq]John)[or](FirstName[eq]Jane))";

            // Act
            var parseResults = new FilterParser().Parse(filter);

            // Assert
            Assert.NotNull(parseResults);
            Assert.NotEmpty(parseResults);

            Assert.Equal(typeof(NestedCriterion), parseResults.ElementAt(1).GetType());
            var nestedCriterion = (NestedCriterion)parseResults.ElementAt(1);

            Assert.Equal(typeof(Criterion), nestedCriterion.Criteria.ElementAt(0).GetType());
            var firstCriterion = (Criterion)nestedCriterion.Criteria.ElementAt(0);

            Assert.Equal(LogicOperatorType.And, firstCriterion.LogicOperator);
            Assert.Equal("FirstName", firstCriterion.Name);
            Assert.Equal(ConditionOperatorType.Equals, firstCriterion.Operator);
            Assert.Equal("John", firstCriterion.Value);

            Assert.Equal(typeof(Criterion), nestedCriterion.Criteria.ElementAt(1).GetType());
            var secondCriterion = (Criterion)nestedCriterion.Criteria.ElementAt(1);

            Assert.Equal(LogicOperatorType.Or, secondCriterion.LogicOperator);
            Assert.Equal("FirstName", secondCriterion.Name);
            Assert.Equal(ConditionOperatorType.Equals, secondCriterion.Operator);
            Assert.Equal("Jane", secondCriterion.Value);
        }
        public void Single_Filter_Should_Convert_Successfully()
        {
            // Arrange
            var filter = "(Email[like]@gmail.com)";

            // Act
            var stringResults = new FilterParser().Parse(filter);
            var typeResults   = new FilterParser().ParseAs(filter, new TypeSearchConverter <object>());

            // Assert
            Assert.NotNull(stringResults);
            Assert.NotNull(typeResults);

            Assert.NotEmpty(stringResults);
            Assert.NotEmpty(typeResults.Criteria);

            Assert.Equal(typeof(Criterion), stringResults.ElementAt(0).GetType());
            var stringCriterion = (Criterion)stringResults.ElementAt(0);

            Assert.Equal("Email", stringCriterion.Name);
            Assert.Equal(ConditionOperatorType.Like, stringCriterion.Operator);
            Assert.Equal("@gmail.com", stringCriterion.Value);

            Assert.Equal(typeof(CriteriaContainer <object>), typeResults.Criteria.ElementAt(0).GetType());
            var typeCriterion = typeResults.Criteria.ElementAt(0);

            Assert.NotNull(typeCriterion.SingleCriterion);
            var singleCriterion = typeCriterion.SingleCriterion;

            Assert.Equal("Email", singleCriterion.Name);
            Assert.Equal(SingleOperator.Like, singleCriterion.Operator);
            Assert.Equal("@gmail.com", singleCriterion.Value);
        }
        public void Nested_Filter_Should_Convert_First_Tier_Successfully()
        {
            // Arrange
            var filter = "(LastName[eq]Doe)[and]((FirstName[eq]John)[or](FirstName[eq]Jane))";

            // Act
            var stringResults = new FilterParser().Parse(filter);
            var typeResults   = new FilterParser().ParseAs(filter, new TypeSearchConverter <object>());

            // Assert
            Assert.NotNull(stringResults);
            Assert.NotNull(typeResults);

            Assert.NotEmpty(stringResults);
            Assert.NotEmpty(typeResults.Criteria);

            Assert.Equal(typeof(Criterion), stringResults.ElementAt(0).GetType());
            var stringCriterion = (Criterion)stringResults.ElementAt(0);

            Assert.Equal("LastName", stringCriterion.Name);
            Assert.Equal(ConditionOperatorType.Equals, stringCriterion.Operator);
            Assert.Equal("Doe", stringCriterion.Value);

            Assert.Equal(typeof(CriteriaContainer <object>), typeResults.Criteria.ElementAt(0).GetType());
            var typeCriterion = typeResults.Criteria.ElementAt(0);

            Assert.NotNull(typeCriterion.SingleCriterion);
            var singleCriterion = typeCriterion.SingleCriterion;

            Assert.Equal("LastName", singleCriterion.Name);
            Assert.Equal(SingleOperator.Equals, singleCriterion.Operator);
            Assert.Equal("Doe", singleCriterion.Value);
        }
        public void Single_Filter_Should_Parse_Property_Name_Successfully()
        {
            // Arrange
            var filter = "(Email[like]@gmail.com)";

            // Act
            var parseResults = new FilterParser().Parse(filter);

            // Assert
            Assert.NotNull(parseResults);
            Assert.NotEmpty(parseResults);
            Assert.Single(parseResults);
            Assert.Equal(typeof(Criterion), parseResults.ElementAt(0).GetType());
            Assert.Equal("Email", ((Criterion)parseResults.ElementAt(0)).Name);
        }
        public void Range_Filter_Should_Parse_Property_Name_Successfully()
        {
            // Arrange
            var filter = "(UserId[between]100-200)";

            // Act
            var parseResults = new FilterParser().Parse(filter);

            // Assert
            Assert.NotNull(parseResults);
            Assert.NotEmpty(parseResults);
            Assert.Single(parseResults);
            Assert.Equal(typeof(RangeCriterion), parseResults.ElementAt(0).GetType());
            Assert.Equal("UserId", ((RangeCriterion)parseResults.ElementAt(0)).Name);
        }
        public void Single_Filter_Should_Parse_Custom_Logic_Operator_Successfully()
        {
            // Arrange
            var filter            = "(FirstName[eq]John)[oreo](FirstName[eq]Jane)";
            var operatorOverrides = new Dictionary <OperatorType, string>()
            {
                { OperatorType.Or, "oreo" }
            };

            // Act
            var parseResults = new FilterParser(operatorOverrides).Parse(filter);

            // Assert
            Assert.NotNull(parseResults);
            Assert.NotEmpty(parseResults);
            Assert.Equal(typeof(Criterion), parseResults.ElementAt(1).GetType());
            Assert.Equal(LogicOperatorType.Or, ((Criterion)parseResults.ElementAt(1)).LogicOperator);
        }
        public void Range_Filter_Should_Parse_Custom_Logic_Operator_Successfully()
        {
            // Arrange
            var filter            = "(UserId[between]100-200)[else](UserId[between]300-400)";
            var operatorOverrides = new Dictionary <OperatorType, string>()
            {
                { OperatorType.Or, "else" }
            };

            // Act
            var parseResults = new FilterParser(operatorOverrides).Parse(filter);

            // Assert
            Assert.NotNull(parseResults);
            Assert.NotEmpty(parseResults);
            Assert.Equal(typeof(RangeCriterion), parseResults.ElementAt(1).GetType());
            Assert.Equal(LogicOperatorType.Or, ((RangeCriterion)parseResults.ElementAt(1)).LogicOperator);
        }
        public void Range_Filter_Should_Parse_Global_Custom_Operator_Successfully()
        {
            // Arrange
            var filter            = "(UserId[betwixt]100-200)";
            var operatorOverrides = new Dictionary <OperatorType, string>()
            {
                { OperatorType.Between, "betwixt" }
            };

            // Act
            var parseResults = new FilterParser(operatorOverrides).Parse(filter);

            // Assert
            Assert.NotNull(parseResults);
            Assert.NotEmpty(parseResults);
            Assert.Single(parseResults);
            Assert.Equal(typeof(RangeCriterion), parseResults.ElementAt(0).GetType());
            Assert.Equal(ConditionOperatorType.Between, ((RangeCriterion)parseResults.ElementAt(0)).Operator);
        }
        public void Single_Filter_Should_Parse_Global_Custom_Operator_Successfully()
        {
            // Arrange
            var filter            = "(Email[%]@gmail.com)";
            var operatorOverrides = new Dictionary <OperatorType, string>()
            {
                { OperatorType.Like, "%" }
            };

            // Act
            var parseResults = new FilterParser(operatorOverrides).Parse(filter);

            // Assert
            Assert.NotNull(parseResults);
            Assert.NotEmpty(parseResults);
            Assert.Single(parseResults);
            Assert.Equal(typeof(Criterion), parseResults.ElementAt(0).GetType());
            Assert.Equal(ConditionOperatorType.Like, ((Criterion)parseResults.ElementAt(0)).Operator);
        }
        public void Single_Filter_Should_Parse_Parentheses_Successfully()
        {
            // Arrange
            // "(" and ")" are used to identify groups
            var filter = "(Em)()(ail[like](@)(gmail).)((com)))))";

            // Act
            var parseResults = new FilterParser().Parse(filter);

            // Assert
            Assert.NotNull(parseResults);
            Assert.NotEmpty(parseResults);
            Assert.Single(parseResults);
            Assert.Equal(typeof(Criterion), parseResults.ElementAt(0).GetType());
            var criterion = ((Criterion)parseResults.ElementAt(0));

            Assert.Equal("Em)()(ail", criterion.Name);
            Assert.Equal(ConditionOperatorType.Like, criterion.Operator);
            Assert.Equal("(@)(gmail).)((com))))", criterion.Value);
        }
        public void Nested_Filter_Should_Parse_Property_Hierarchy_Successfully()
        {
            // Arrange
            var filter = "(LastName[eq]Doe)[and]((FirstName[eq]John)[or](FirstName[eq]Jane))";

            // Act
            var parseResults = new FilterParser().Parse(filter);

            // Assert
            Assert.NotNull(parseResults);
            Assert.NotEmpty(parseResults);

            Assert.Equal(typeof(Criterion), parseResults.ElementAt(0).GetType());

            Assert.Equal(typeof(NestedCriterion), parseResults.ElementAt(1).GetType());
            var nestedCriterion = (NestedCriterion)parseResults.ElementAt(1);

            Assert.Equal(typeof(Criterion), nestedCriterion.Criteria.ElementAt(0).GetType());
            Assert.Equal(typeof(Criterion), nestedCriterion.Criteria.ElementAt(1).GetType());
        }
        public void Single_Filter_Should_Parse_Square_Brackets_Successfully()
        {
            // Arrange
            // "[" and "]" are used to identify operators
            var filter = "(Em][][ail[like][@][gmail].][[com]]]])";

            // Act
            var parseResults = new FilterParser().Parse(filter);

            // Assert
            Assert.NotNull(parseResults);
            Assert.NotEmpty(parseResults);
            Assert.Single(parseResults);
            Assert.Equal(typeof(Criterion), parseResults.ElementAt(0).GetType());
            var criterion = ((Criterion)parseResults.ElementAt(0));

            Assert.Equal("Em][][ail", criterion.Name);
            Assert.Equal(ConditionOperatorType.Like, criterion.Operator);
            Assert.Equal("[@][gmail].][[com]]]]", criterion.Value);
        }
        public void Range_Filter_Should_Parse_Parentheses_Successfully()
        {
            // Arrange
            // "(" and ")" are used to identify groups
            var filter = "(U)s(e)r(Id[between]1(0)0-((200))))";

            // Act
            var parseResults = new FilterParser().Parse(filter);

            // Assert
            Assert.NotNull(parseResults);
            Assert.NotEmpty(parseResults);
            Assert.Single(parseResults);
            Assert.Equal(typeof(RangeCriterion), parseResults.ElementAt(0).GetType());
            var criterion = ((RangeCriterion)parseResults.ElementAt(0));

            Assert.Equal("U)s(e)r(Id", criterion.Name);
            Assert.Equal(ConditionOperatorType.Between, criterion.Operator);
            Assert.Equal("1(0)0", criterion.StartValue);
            Assert.Equal("((200)))", criterion.EndValue);
        }
        public void Range_Filter_Should_Parse_Square_Brackets_Successfully()
        {
            // Arrange
            // "[" and "]" are used to identify operators
            var filter = "(U]s[e]r[Id[between]1[0]0-[[200]]])";

            // Act
            var parseResults = new FilterParser().Parse(filter);

            // Assert
            Assert.NotNull(parseResults);
            Assert.NotEmpty(parseResults);
            Assert.Single(parseResults);
            Assert.Equal(typeof(RangeCriterion), parseResults.ElementAt(0).GetType());
            var criterion = ((RangeCriterion)parseResults.ElementAt(0));

            Assert.Equal("U]s[e]r[Id", criterion.Name);
            Assert.Equal(ConditionOperatorType.Between, criterion.Operator);
            Assert.Equal("1[0]0", criterion.StartValue);
            Assert.Equal("[[200]]]", criterion.EndValue);
        }
        public void Nested_Filter_Should_Parse_First_Tier_Successfully()
        {
            // Arrange
            var filter = "(LastName[eq]Doe)[and]((FirstName[eq]John)[or](FirstName[eq]Jane))";

            // Act
            var parseResults = new FilterParser().Parse(filter);

            // Assert
            Assert.NotNull(parseResults);
            Assert.NotEmpty(parseResults);

            Assert.Equal(typeof(Criterion), parseResults.ElementAt(0).GetType());
            var criterion = (Criterion)parseResults.ElementAt(0);

            Assert.Equal("LastName", criterion.Name);
            Assert.Equal(ConditionOperatorType.Equals, criterion.Operator);
            Assert.Equal("Doe", criterion.Value);

            Assert.Equal(typeof(NestedCriterion), parseResults.ElementAt(1).GetType());
        }
        public void Range_Filter_Should_Parse_Global_And_Local_Custom_Operator_Successfully()
        {
            // Arrange
            var filter         = "(UserId[betwixt]100-200)[and](UserId[not_in]300-400)";
            var globalOverride = new Dictionary <OperatorType, string>()
            {
                { OperatorType.Between, "betwixt" }
            };
            var localOverride = new Dictionary <OperatorType, string>()
            {
                { OperatorType.NotBetween, "not_in" }
            };

            // Act
            var parseResults = new FilterParser(globalOverride).Parse(filter, localOverride);

            // Assert
            Assert.NotNull(parseResults);
            Assert.NotEmpty(parseResults);
            Assert.Equal(typeof(RangeCriterion), parseResults.ElementAt(0).GetType());
            Assert.Equal(ConditionOperatorType.Between, ((RangeCriterion)parseResults.ElementAt(0)).Operator);
            Assert.Equal(typeof(RangeCriterion), parseResults.ElementAt(1).GetType());
            Assert.Equal(ConditionOperatorType.NotBetween, ((RangeCriterion)parseResults.ElementAt(1)).Operator);
        }
        public void Single_Filter_Should_Parse_Global_And_Local_Custom_Operator_Successfully()
        {
            // Arrange
            var filter        = "(Email[SimilarTo]@gmail.com)[or](Email[EndsWith]@gmail.com)";
            var localOverride = new Dictionary <OperatorType, string>()
            {
                { OperatorType.Like, "SimilarTo" }
            };
            var globalOverride = new Dictionary <OperatorType, string>()
            {
                { OperatorType.EndsWith, "EndsWith" }
            };

            // Act
            var parseResults = new FilterParser(globalOverride).Parse(filter, localOverride);

            // Assert
            Assert.NotNull(parseResults);
            Assert.NotEmpty(parseResults);
            Assert.Equal(typeof(Criterion), parseResults.ElementAt(0).GetType());
            Assert.Equal(ConditionOperatorType.Like, ((Criterion)parseResults.ElementAt(0)).Operator);
            Assert.Equal(typeof(Criterion), parseResults.ElementAt(1).GetType());
            Assert.Equal(ConditionOperatorType.EndsWith, ((Criterion)parseResults.ElementAt(1)).Operator);
        }
        public void Nested_Filter_Should_Convert_Second_Tier_Successfully()
        {
            // Arrange
            var filter = "(LastName[eq]Doe)[and]((FirstName[eq]John)[or](FirstName[eq]Jane))";

            // Act
            var stringResults = new FilterParser().Parse(filter);
            var typeResults   = new FilterParser().ParseAs(filter, new TypeSearchConverter <object>());

            // Assert
            Assert.NotNull(stringResults);
            Assert.NotNull(typeResults);

            Assert.NotEmpty(stringResults);
            Assert.NotEmpty(typeResults.Criteria);

            // StringSearch
            Assert.Equal(typeof(NestedCriterion), stringResults.ElementAt(1).GetType());
            var stringNestedCriterion = (NestedCriterion)stringResults.ElementAt(1);

            Assert.Equal(typeof(Criterion), stringNestedCriterion.Criteria.ElementAt(0).GetType());
            var stringFirstCriterion = (Criterion)stringNestedCriterion.Criteria.ElementAt(0);

            Assert.Equal(LogicOperatorType.And, stringFirstCriterion.LogicOperator);
            Assert.Equal("FirstName", stringFirstCriterion.Name);
            Assert.Equal(ConditionOperatorType.Equals, stringFirstCriterion.Operator);
            Assert.Equal("John", stringFirstCriterion.Value);

            Assert.Equal(typeof(Criterion), stringNestedCriterion.Criteria.ElementAt(1).GetType());
            var stringSecondCriterion = (Criterion)stringNestedCriterion.Criteria.ElementAt(1);

            Assert.Equal(LogicOperatorType.Or, stringSecondCriterion.LogicOperator);
            Assert.Equal("FirstName", stringSecondCriterion.Name);
            Assert.Equal(ConditionOperatorType.Equals, stringSecondCriterion.Operator);
            Assert.Equal("Jane", stringSecondCriterion.Value);

            // TypeSearch
            Assert.Equal(typeof(CriteriaContainer <object>), typeResults.Criteria.ElementAt(1).GetType());
            var typeCriterion = typeResults.Criteria.ElementAt(1);

            Assert.NotNull(typeCriterion.NestedFilter);
            var nestedCriteria = typeCriterion.NestedFilter;

            Assert.Equal(typeof(CriteriaContainer <object>), nestedCriteria.Criteria.ElementAt(0).GetType());
            var typeNestedCriterion1 = nestedCriteria.Criteria.ElementAt(0);

            Assert.NotNull(typeNestedCriterion1.SingleCriterion);
            var typeFirstCriterion = typeNestedCriterion1.SingleCriterion;

            Assert.Equal(LogicalOperator.And, typeNestedCriterion1.Operator);
            Assert.Equal("FirstName", typeFirstCriterion.Name);
            Assert.Equal(SingleOperator.Equals, typeFirstCriterion.Operator);
            Assert.Equal("John", typeFirstCriterion.Value);

            Assert.Equal(typeof(CriteriaContainer <object>), nestedCriteria.Criteria.ElementAt(1).GetType());
            var typeNestedCriterion2 = nestedCriteria.Criteria.ElementAt(1);

            Assert.NotNull(typeNestedCriterion2.SingleCriterion);
            var typeSecondCriterion = typeNestedCriterion2.SingleCriterion;

            Assert.Equal(LogicalOperator.Or, typeNestedCriterion2.Operator);
            Assert.Equal("FirstName", typeSecondCriterion.Name);
            Assert.Equal(SingleOperator.Equals, typeSecondCriterion.Operator);
            Assert.Equal("Jane", typeSecondCriterion.Value);
        }