The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

# $Id: FSM-start_rule.t,v 1.1 2011/04/16 20:20:44 Paulo Exp $

use strict;
use warnings;

use Test::More;

use_ok 'Parse::FSM';
require_ok 't/utils.pl';

unlink 'Parser.pm';

my $fsm;
my $parser;

#------------------------------------------------------------------------------
$fsm = new_ok('Parse::FSM');
$fsm->add_rule("name",   "NAME", '', '{$item[0][1]}');
$fsm->add_rule("number", "NUM",  '', '{$item[0][1]}');
$fsm->write_module('Parser', 'Parser.pm');
use_ok 'Parser';

#------------------------------------------------------------------------------
$parser = new_ok('Parser', [input => make_lexer("")]);
eval {$parser->parse};
is $@, "Expected NAME at EOF\n";

#------------------------------------------------------------------------------
$parser = new_ok('Parser', [input => make_lexer("")]);
eval {$parser->parse("name")};
is $@, "Expected NAME at EOF\n";

#------------------------------------------------------------------------------
$parser = new_ok('Parser', [input => make_lexer("")]);
eval {$parser->parse_name};
is $@, "Expected NAME at EOF\n";

#------------------------------------------------------------------------------
$parser = new_ok('Parser', [input => make_lexer("")]);
eval {$parser->parse("number")};
is $@, "Expected NUM at EOF\n";

#------------------------------------------------------------------------------
$parser = new_ok('Parser', [input => make_lexer("")]);
eval {$parser->parse_number};
is $@, "Expected NUM at EOF\n";

#------------------------------------------------------------------------------
$parser = new_ok('Parser', [input => make_lexer("")]);
eval {$parser->parse("no_rule")};
like $@, qr/Rule no_rule not found at t.FSM-start_rule.t/;

#------------------------------------------------------------------------------
$parser = new_ok('Parser', [input => make_lexer("a")]);
is_deeply $parser->parse, "a";

#------------------------------------------------------------------------------
$parser = new_ok('Parser', [input => make_lexer("a")]);
is_deeply $parser->parse("name"), "a";

#------------------------------------------------------------------------------
$parser = new_ok('Parser', [input => make_lexer("a")]);
is_deeply $parser->parse_name, "a";

#------------------------------------------------------------------------------
$parser = new_ok('Parser', [input => make_lexer("a")]);
eval {$parser->parse("number")};
is $@, "Expected NUM at NAME\n";

#------------------------------------------------------------------------------
$parser = new_ok('Parser', [input => make_lexer("a")]);
eval {$parser->parse_number};
is $@, "Expected NUM at NAME\n";

#------------------------------------------------------------------------------
$parser = new_ok('Parser', [input => make_lexer(24)]);
is_deeply $parser->parse_number, 24;

#------------------------------------------------------------------------------
$parser = new_ok('Parser', [input => make_lexer(24)]);
is_deeply $parser->parse("number"), 24;

#------------------------------------------------------------------------------
$parser = new_ok('Parser', [input => make_lexer(24)]);
eval {$parser->parse};
is $@, "Expected NAME at NUM\n";

#------------------------------------------------------------------------------
$parser = new_ok('Parser', [input => make_lexer(24)]);
eval {$parser->parse_name};
is $@, "Expected NAME at NUM\n";

#------------------------------------------------------------------------------
$parser = new_ok('Parser', [input => make_lexer(24)]);
eval {$parser->parse("name")};
is $@, "Expected NAME at NUM\n";

#------------------------------------------------------------------------------
# clean-up
unlink 'Parser.pm';

done_testing;