예제 #1
0
        public void CreatesNewCollectionWhenAddingItems()
        {
            ErrorMessageList list = ErrorMessageList.Empty.With(ErrorMessage.Expected("expectation"));

            list.ToString().ShouldBe("expectation expected");
            list.ShouldNotBeSameAs(ErrorMessageList.Empty);
        }
예제 #2
0
        public void CanIndicateSpecificExpectation()
        {
            var error = (ExpectedErrorMessage)ErrorMessage.Expected("statement");

            error.Expectation.ShouldBe("statement");
            error.ToString().ShouldBe("statement expected");
        }
예제 #3
0
        public void CanIncludeBacktrackErrors()
        {
            var deepBacktrack = ErrorMessage.Backtrack(new Position(3, 4),
                                                       ErrorMessageList.Empty
                                                       .With(ErrorMessage.Expected("A"))
                                                       .With(ErrorMessage.Expected("B")));

            var shallowBacktrack = ErrorMessage.Backtrack(new Position(2, 3),
                                                          ErrorMessageList.Empty
                                                          .With(ErrorMessage.Expected("C"))
                                                          .With(ErrorMessage.Expected("D"))
                                                          .With(deepBacktrack));

            var unrelatedBacktrack = ErrorMessage.Backtrack(new Position(1, 2),
                                                            ErrorMessageList.Empty
                                                            .With(ErrorMessage.Expected("E"))
                                                            .With(ErrorMessage.Expected("F")));

            ErrorMessageList.Empty
            .With(deepBacktrack)
            .ToString().ShouldBe("[(3, 4): A or B expected]");

            ErrorMessageList.Empty
            .With(shallowBacktrack)
            .ToString().ShouldBe("[(2, 3): C or D expected [(3, 4): A or B expected]]");

            ErrorMessageList.Empty
            .With(ErrorMessage.Expected("G"))
            .With(ErrorMessage.Expected("H"))
            .With(shallowBacktrack)
            .With(unrelatedBacktrack)
            .ToString().ShouldBe("G or H expected [(1, 2): E or F expected] [(2, 3): C or D expected [(3, 4): A or B expected]]");
        }
예제 #4
0
        public void CanIndicateMultipleErrorsAtTheCurrentPosition()
        {
            var errors = ErrorMessageList.Empty
                         .With(ErrorMessage.Expected("A"))
                         .With(ErrorMessage.Expected("B"));

            new Error <object>(endOfInput, errors).ErrorMessages.ToString().ShouldBe("A or B expected");
        }
예제 #5
0
        public void CanIndicatePotentialErrors()
        {
            var potentialErrors = ErrorMessageList.Empty
                                  .With(ErrorMessage.Expected("A"))
                                  .With(ErrorMessage.Expected("B"));

            new Parsed <object>("x", unparsed, potentialErrors).ErrorMessages.ShouldBe(potentialErrors);
        }
예제 #6
0
 public void OmitsUnknownErrorsWhenAdditionalErrorsExist()
 {
     ErrorMessageList.Empty
     .With(ErrorMessage.Expected("A"))
     .With(ErrorMessage.Expected("B"))
     .With(ErrorMessage.Unknown())
     .With(ErrorMessage.Expected("C"))
     .ToString().ShouldBe("A, B or C expected");
 }
예제 #7
0
 public void OmitsDuplicateExpectationsFromExpectationLists()
 {
     ErrorMessageList.Empty
     .With(ErrorMessage.Expected("A"))
     .With(ErrorMessage.Expected("A"))
     .With(ErrorMessage.Expected("B"))
     .With(ErrorMessage.Expected("C"))
     .With(ErrorMessage.Unknown())
     .With(ErrorMessage.Expected("C"))
     .With(ErrorMessage.Expected("C"))
     .With(ErrorMessage.Expected("A"))
     .ToString().ShouldBe("A, B or C expected");
 }
예제 #8
0
        public void CanIndicateErrorsWhichCausedBacktracking()
        {
            var position            = new Position(3, 4);
            ErrorMessageList errors = ErrorMessageList.Empty
                                      .With(ErrorMessage.Expected("a"))
                                      .With(ErrorMessage.Expected("b"));

            var error = (BacktrackErrorMessage)ErrorMessage.Backtrack(position, errors);

            error.Position.ShouldBe(position);
            error.Errors.ShouldBe(errors);
            error.ToString().ShouldBe("(3, 4): a or b expected");
        }
예제 #9
0
        public void CanMergeTwoLists()
        {
            var first = ErrorMessageList.Empty
                        .With(ErrorMessage.Expected("A"))
                        .With(ErrorMessage.Expected("B"))
                        .With(ErrorMessage.Unknown())
                        .With(ErrorMessage.Expected("C"));

            var second = ErrorMessageList.Empty
                         .With(ErrorMessage.Expected("D"))
                         .With(ErrorMessage.Expected("B"))
                         .With(ErrorMessage.Unknown())
                         .With(ErrorMessage.Expected("E"));

            first.Merge(second)
            .ToString().ShouldBe("A, B, C, D or E expected");
        }
예제 #10
0
        public void CanIncludeMultipleExpectations()
        {
            ErrorMessageList.Empty
            .With(ErrorMessage.Expected("A"))
            .With(ErrorMessage.Expected("B"))
            .ToString().ShouldBe("A or B expected");

            ErrorMessageList.Empty
            .With(ErrorMessage.Expected("A"))
            .With(ErrorMessage.Expected("B"))
            .With(ErrorMessage.Expected("C"))
            .ToString().ShouldBe("A, B or C expected");

            ErrorMessageList.Empty
            .With(ErrorMessage.Expected("A"))
            .With(ErrorMessage.Expected("B"))
            .With(ErrorMessage.Expected("C"))
            .With(ErrorMessage.Expected("D"))
            .ToString().ShouldBe("A, B, C or D expected");
        }
예제 #11
0
 public void CanIncludeUnknownErrors()
 {
     ErrorMessageList.Empty
     .With(ErrorMessage.Unknown())
     .ToString().ShouldBe("Parse error.");
 }
예제 #12
0
        public void CanIndicateGenericErrors()
        {
            var error = ErrorMessage.Unknown();

            error.ToString().ShouldBe("Parse error.");
        }
예제 #13
0
 public void ReportsErrorState()
 {
     new Error <object>(x, ErrorMessage.Unknown()).Success.ShouldBeFalse();
 }
예제 #14
0
 public void HasRemainingUnparsedTokens()
 {
     new Error <object>(x, ErrorMessage.Unknown()).UnparsedTokens.ShouldBe(x);
     new Error <object>(endOfInput, ErrorMessage.Unknown()).UnparsedTokens.ShouldBe(endOfInput);
 }
예제 #15
0
        public void ThrowsWhenAttemptingToGetParsedValue()
        {
            Func <object> inspectParsedValue = () => new Error <object>(x, ErrorMessage.Unknown()).Value;

            inspectParsedValue.ShouldThrow <MemberAccessException>("(1, 1): Parse error.");
        }
예제 #16
0
        public void CreatesParsersFromLambdas()
        {
            var succeeds = new LambdaParser <string>(tokens => new Parsed <string>("AA", tokens.Advance().Advance()));

            succeeds.PartiallyParses(new CharLexer().Tokenize("AABB")).LeavingUnparsedTokens("B", "B").WithValue("AA");

            var fails = new LambdaParser <string>(tokens => new Error <string>(tokens, ErrorMessage.Unknown()));

            fails.FailsToParse(new CharLexer().Tokenize("AABB")).LeavingUnparsedTokens("A", "A", "B", "B").WithMessage("(1, 1): Parse error.");
        }
예제 #17
0
 public void CanIndicateErrorsAtTheCurrentPosition()
 {
     new Error <object>(endOfInput, ErrorMessage.Unknown()).ErrorMessages.ToString().ShouldBe("Parse error.");
     new Error <object>(endOfInput, ErrorMessage.Expected("statement")).ErrorMessages.ToString().ShouldBe("statement expected");
 }