The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!perl -T

use 5.006;
use strict;
use warnings;
use warnings FATAL => 'all';
use Data::Dumper;


use Test::More;

plan tests => 14;


use lib 'lib';

use Parse::Gnaw;
use Parse::Gnaw::LinkedList;

rule('rule3', 'f', thrifty('g','+'), 'h');

rule('rule2', 'c', thrifty('d','+'), call('rule3'), 'e');

rule('rule1', 'a', call('rule2'), 'b', call('rule3'), 'g' );

#print Dumper $rulebook;


ok(exists($rulebook->{rule1}), "checking the rule1 exists in rulebook");
ok(exists($rulebook->{rule1_rulefragment_1}), "checking the rule1_rulefragment_1 exists in rulebook");
ok(exists($rulebook->{rule1_rulefragment_2}), "checking the rule1_rulefragment_2 exists in rulebook");


ok(scalar(@{$rulebook->{rule1}})==3, 			"checking rule1 has 3 elements in it");
ok(scalar(@{$rulebook->{rule1_rulefragment_1}})==3, 	"checking rule1_rulefragment_1 has 3 elements in it");
ok(scalar(@{$rulebook->{rule1_rulefragment_2}})==2, 	"checking rule1_rulefragment_2 has 2 elements in it");


ok($rulebook->{rule1}->[2]->[0] 		eq 'call', 	"checking last element rule1 is call");
ok($rulebook->{rule1_rulefragment_1}->[2]->[0] 	eq 'call', 	"checking last element rule1_rulefragment_1 is call");
ok($rulebook->{rule1_rulefragment_2}->[1]->[0] 	eq 'lit', 	"checking last element rule1_rulefragment_2 is call");

ok($rulebook->{rule1}->[2]->[1] 		eq 'rule2', 	"checking last element rule1 is rule2");
ok($rulebook->{rule1_rulefragment_1}->[2]->[1] 	eq 'rule3', 	"checking last element rule1_rulefragment_1 is rule3");
ok($rulebook->{rule1_rulefragment_2}->[1]->[1] 	eq 'g', 	"checking last element rule1_rulefragment_2 is g");

ok($rulebook->{rule1}->[2]->[2]->{then_call} 			eq 'rule1_rulefragment_1', 	"checking last element rule1 is rule2");
ok($rulebook->{rule1_rulefragment_1}->[2]->[2]->{then_call} 	eq 'rule1_rulefragment_2', 	"checking last element rule1 is rule2");

__DATA__

We're verifying that the rules get fragmented correctly.

Here is what the rulebook looks like from Dumper:

$VAR1 = {
          'rule1' => [
                       [
                         'rule',
                         {
                           'methodname' => 'rule',
                           'filename' => 't/parse_rule_fragment.t',
                           'linenum' => 23,
                           'payload' => 'rule1',
                           'quantifier' => '',
                           'package' => 'main'
                         }
                       ],
                       [
                         'lit',
                         'a',
                         {
                           'methodname' => 'lit',
                           'filename' => 't/parse_rule_fragment.t',
                           'linenum' => 23,
                           'payload' => 'a',
                           'package' => 'main'
                         }
                       ],
                       [
                         'call',
                         'rule2',
                         {
                           'methodname' => 'call',
                           'filename' => 't/parse_rule_fragment.t',
                           'payload' => 'rule2',
                           'linenum' => 23,
                           'then_call' => 'rule1_rulefragment_1',
                           'package' => 'main'
                         }
                       ]
                     ],
          'rule1_rulefragment_1' => [
                                      [
                                        'rule',
                                        {
                                          'methodname' => 'rule',
                                          'filename' => 't/parse_rule_fragment.t',
                                          'payload' => 'rule1_rulefragment_1',
                                          'linenum' => 23,
                                          'quantifier' => '',
                                          'package' => 'main'
                                        }
                                      ],
                                      [
                                        'lit',
                                        'b',
                                        {
                                          'methodname' => 'lit',
                                          'filename' => 't/parse_rule_fragment.t',
                                          'payload' => 'b',
                                          'linenum' => 23,
                                          'package' => 'main'
                                        }
                                      ],
                                      [
                                        'call',
                                        'rule3',
                                        {
                                          'methodname' => 'call',
                                          'filename' => 't/parse_rule_fragment.t',
                                          'linenum' => 23,
                                          'payload' => 'rule3',
                                          'then_call' => 'rule1_rulefragment_2',
                                          'package' => 'main'
                                        }
                                      ]
                                    ],
          'rule1_rulefragment_2' => [
                                      [
                                        'rule',
                                        {
                                          'methodname' => 'rule',
                                          'filename' => 't/parse_rule_fragment.t',
                                          'payload' => 'rule1_rulefragment_2',
                                          'linenum' => 23,
                                          'quantifier' => '',
                                          'package' => 'main'
                                        }
                                      ],
                                      [
                                        'lit',
                                        'g',
                                        {
                                          'methodname' => 'lit',
                                          'filename' => 't/parse_rule_fragment.t',
                                          'linenum' => 23,
                                          'payload' => 'g',
                                          'package' => 'main'
                                        }
                                      ]
                                    ]
          'rule2' => [
                       [
                         'rule',
                         {
                           'methodname' => 'rule',
                           'filename' => 't/parse_rule_fragment.t',
                           'linenum' => 24,
                           'payload' => 'rule2',
                           'quantifier' => '',
                           'package' => 'main'
                         }
                       ],
                       [
                         'lit',
                         'c',
                         {
                           'methodname' => 'lit',
                           'filename' => 't/parse_rule_fragment.t',
                           'linenum' => 24,
                           'payload' => 'c',
                           'package' => 'main'
                         }
                       ],
                       [
                         'call',
                         'thrifty_1',
                         {
                           'min' => 1,
                           'max' => undef,
                           'then_call' => 'rule2_rulefragment_1',
                           'package' => 'main',
                           'methodname' => 'rule',
                           'filename' => 't/parse_rule_fragment.t',
                           'payload' => 'thrifty_1',
                           'linenum' => 24,
                           'quantifier' => 'thrifty'
                         }
                       ]
                     ],
          'rule2_rulefragment_1' => [
                                      [
                                        'rule',
                                        {
                                          'methodname' => 'rule',
                                          'filename' => 't/parse_rule_fragment.t',
                                          'payload' => 'rule2_rulefragment_1',
                                          'linenum' => 24,
                                          'quantifier' => '',
                                          'package' => 'main'
                                        }
                                      ],
                                      [
                                        'call',
                                        'rule3',
                                        {
                                          'methodname' => 'call',
                                          'filename' => 't/parse_rule_fragment.t',
                                          'linenum' => 24,
                                          'payload' => 'rule3',
                                          'then_call' => 'rule2_rulefragment_2',
                                          'package' => 'main'
                                        }
                                      ]
                                    ],
          'rule2_rulefragment_2' => [
                                      [
                                        'rule',
                                        {
                                          'methodname' => 'rule',
                                          'filename' => 't/parse_rule_fragment.t',
                                          'payload' => 'rule2_rulefragment_2',
                                          'linenum' => 24,
                                          'quantifier' => '',
                                          'package' => 'main'
                                        }
                                      ],
                                      [
                                        'lit',
                                        'e',
                                        {
                                          'methodname' => 'lit',
                                          'filename' => 't/parse_rule_fragment.t',
                                          'linenum' => 24,
                                          'payload' => 'e',
                                          'package' => 'main'
                                        }
                                      ]
                                    ],
          'rule3' => [
                       [
                         'rule',
                         {
                           'methodname' => 'rule',
                           'filename' => 't/parse_rule_fragment.t',
                           'linenum' => 25,
                           'payload' => 'rule3',
                           'quantifier' => '',
                           'package' => 'main'
                         }
                       ],
                       [
                         'lit',
                         'f',
                         {
                           'methodname' => 'lit',
                           'filename' => 't/parse_rule_fragment.t',
                           'linenum' => 25,
                           'payload' => 'f',
                           'package' => 'main'
                         }
                       ],
                       [
                         'call',
                         'thrifty_2',
                         {
                           'min' => 1,
                           'max' => undef,
                           'then_call' => 'rule3_rulefragment_1',
                           'package' => 'main',
                           'methodname' => 'rule',
                           'filename' => 't/parse_rule_fragment.t',
                           'payload' => 'thrifty_2',
                           'linenum' => 25,
                           'quantifier' => 'thrifty'
                         }
                       ]
                     ],
          'rule3_rulefragment_1' => [
                                      [
                                        'rule',
                                        {
                                          'methodname' => 'rule',
                                          'filename' => 't/parse_rule_fragment.t',
                                          'payload' => 'rule3_rulefragment_1',
                                          'linenum' => 25,
                                          'quantifier' => '',
                                          'package' => 'main'
                                        }
                                      ],
                                      [
                                        'lit',
                                        'h',
                                        {
                                          'methodname' => 'lit',
                                          'filename' => 't/parse_rule_fragment.t',
                                          'payload' => 'h',
                                          'linenum' => 25,
                                          'package' => 'main'
                                        }
                                      ]
                                    ],
          'thrifty_1' => [
                           [
                             'rule',
                             {
                               'min' => 1,
                               'max' => undef,
                               'package' => 'main',
                               'methodname' => 'rule',
                               'filename' => 't/parse_rule_fragment.t',
                               'linenum' => 24,
                               'payload' => 'thrifty_1',
                               'quantifier' => 'thrifty'
                             }
                           ],
                           [
                             'lit',
                             'd',
                             {
                               'methodname' => 'lit',
                               'filename' => 't/parse_rule_fragment.t',
                               'linenum' => 24,
                               'payload' => 'd',
                               'package' => 'main'
                             }
                           ]
                         ],
          'thrifty_2' => [
                           [
                             'rule',
                             {
                               'min' => 1,
                               'max' => undef,
                               'package' => 'main',
                               'methodname' => 'rule',
                               'filename' => 't/parse_rule_fragment.t',
                               'linenum' => 25,
                               'payload' => 'thrifty_2',
                               'quantifier' => 'thrifty'
                             }
                           ],
                           [
                             'lit',
                             'g',
                             {
                               'methodname' => 'lit',
                               'filename' => 't/parse_rule_fragment.t',
                               'linenum' => 25,
                               'payload' => 'g',
                               'package' => 'main'
                             }
                           ]
                         ],
        };