using CanonSharp.Combinator; using CanonSharp.Combinator.Abstractions; using CanonSharp.Combinator.Extensions; using CanonSharp.Tests.Utils; using static CanonSharp.Combinator.ParserBuilder; namespace CanonSharp.Tests.CombinatorsTests; public class BasicParsersTests : ParserTestsBase { [Fact] public void AlternativeTest() { IParser parser = Token('a') | Token('b'); ValidateSuccessfulResult(parser, 'a', "abc"); ValidateSuccessfulResult(parser, 'b', "bcd"); ValidateFailedResult(parser, "cde"); parser = Token('a').Alternative(_ => Token('b')); ValidateSuccessfulResult(parser, 'a', "abc"); ValidateSuccessfulResult(parser, 'b', "bcd"); ValidateFailedResult(parser, "cde"); } [Fact] public void BindTest() { IParser parser = Token('a').Bind(_ => Token('b')).Bind(_ => Token('c')); ValidateSuccessfulResult(parser, 'c', "abc"); ValidateFailedResult(parser, "acd"); ValidateFailedResult(parser, "ab"); } [Fact] public void MapTest() { IParser parser = Token('a').Map(c => $"{c}"); ValidateSuccessfulResult(parser, "a", "abc"); parser = Token('a').Map("test"); ValidateSuccessfulResult(parser, "test", "abc"); } [Fact] public void NextTest() { IParser parser = Token('a').Next(_ => Token('a'), _ => Token('b')); ValidateSuccessfulResult(parser, 'a', "aaa"); ValidateSuccessfulResult(parser, 'b', "bbb"); parser = Token('a').Next(_ => Token('a'), _ => 'b'); ValidateSuccessfulResult(parser, 'b', "bbb"); parser = Token('a').Next(_ => Pure('1'), '2'); ValidateSuccessfulResult(parser, '1', "aaa"); ValidateSuccessfulResult(parser, '2', "bbb"); } [Fact] public void NextTest2() { IParser parser = Token('a').Next(_ => "123", _ => Pure("456")); ValidateSuccessfulResult(parser, "123", "aaa"); ValidateSuccessfulResult(parser, "456", "bbb"); parser = Token('a').Next(_ => "123", _ => "456"); ValidateSuccessfulResult(parser, "123", "aaa"); ValidateSuccessfulResult(parser, "456", "bbb"); parser = Token('a').Next(_ => "123", "456"); ValidateSuccessfulResult(parser, "123", "aaa"); ValidateSuccessfulResult(parser, "456", "bbb"); } [Fact] public void FixTest() { IParser parser = Fix(self => Token('a').Next(_ => self, Unit.Instance)) .Bind(_ => Token('b')); ValidateSuccessfulResult(parser, 'b', "aaaaab"); } }