The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# BEGIN { $TestML::Test::Differences = 1 }
# BEGIN { $Pegex::Parser::Debug = 1 }

use TestML -run,
    -require_or_skip => 'YAML::XS';

use Pegex::Compiler;
use Pegex::Bootstrap;
use YAML::XS;

# BEGIN { XXX \%INC}

sub pegex_compile {
    my $grammar_text = (shift)->value;
    Pegex::Compiler->new->parse($grammar_text)->tree;
}

sub bootstrap_compile {
    my $grammar_text = (shift)->value;
    Pegex::Bootstrap->new->parse($grammar_text)->tree;
}

sub compress {
    my $grammar_text = (shift)->value;
    chomp($grammar_text);
    $grammar_text =~ s/(?<!;)\n(\w+\s*:)/;$1/g;
    $grammar_text =~ s/\s//g;
    return "$grammar_text\n";
}

sub yaml {
    return YAML::XS::Dump((shift)->value);
}

__DATA__
%TestML 1.0

Plan = 60;

test = (grammar) {
    Label = '$BlockLabel - Does the compiler output match the bootstrap?';
    grammar.pegex_compile.yaml
      == grammar.bootstrap_compile.yaml;

    Label = '$BlockLabel - Does the compressed grammar compile the same?';
    grammar.compress.pegex_compile.yaml
      == grammar.compress.bootstrap_compile.yaml;

    Label =
        '$BlockLabel - Does the compressed grammar match the uncompressed?';
    grammar.compress.pegex_compile.yaml
      == grammar.pegex_compile.yaml;
};

test(*grammar);


=== Single Regex
--- grammar
a: /x/

=== Single Reference
--- grammar
a: <b>

=== Single Error
--- grammar
a: `b`

=== Simple All Group
--- grammar
a: /b/ <c>

=== Simple Any Group
--- grammar
a: <b> | <c>

=== Bracketed All Group
--- grammar
a: ( <b> /c/ )

=== Bracketed Any Group
--- grammar
a: ( <b> | /c/ | `d` )

=== Bracketed Group in Unbracketed Group
--- grammar
a: <b> ( <c> | <d> )

=== Multiple Rules
--- grammar
a: <b>
b: <c>

=== Simple Grammar
--- grammar
a: ( <b> <c>* )
b: /x/
c: /y+/

=== Semicolons OK
--- grammar
a: <b>;
b: <c>
c: /d/;

=== Unbracketed
--- grammar
a: <b> <c> <d>
b: <c> | <d>

=== Not Rule
--- grammar
a: !<b> <c>

=== Multiline
--- grammar
a: <b>
   <c>
b:
    /c/ <d>
    <e>;
c:
    <d> |
    ( /e/ <f> )
    | `g`

=== Various Groups
--- grammar
a: <b> ( <c> | <d> )
b: ( <c> | <d> ) <e>
c: <d> | ( <e> <f>) | <g>
d: <e> | (<f> <g>) | <h> | ( `i` )
e: ( <f> )

=== Modifiers
--- grammar
a: !<a> =<b>
b: ( /c/ <d> )+
c: ( /c/ <d> )+

=== Any Group Plus Rule
--- grammar
a: /w/ ( <x>+ | <y>* ) <z>?

=== Equivalent
--- grammar
a: <b>
c: !<d>

=== Failing Test
--- grammar
a_b: /c/ <d>

=== Failures to test later
--- grammar
a: <b> ( <c>* | <d>+ )+
e: ( <f> !<g> )?

=== Failures to test later
--- SKIP
--- grammar
b: ( /x/ )+