The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl Graph-Easy-StateMachine.t'
#########################

use Test::More;
BEGIN { plan tests => 13 };

{
    package SyntaxError;
    use Test::More;
    if (eval <<\BLAH)
use Graph::Easy::StateMachine <<ARF;
[BASE] - arf -> [B]
[B] - arf -> [C]
[B] - arf -> [D]
ARF
1;
BLAH
    {
        fail('ambiguous edge is syntax error');
    }else{
        my $E;
        $E = $@;
        like($E,qr/ambiguous/,'ambiguous edge is syntax error');
    }
}

package BibbityBoo;
use Test::More;
use Graph::Easy;
use Graph::Easy::StateMachine;

  my $graph = Graph::Easy->new( <<FSA );
      [ START ] => [ disconnected ]
      = goodconnect => [ inprogress ]
      = goodconnect => [ connected ]
      = sentrequest => [ requestsent ]
      = readresponse => [ haveresponse ]
      = done => [ END ]
      # Try pasting this into the form
      # at http://bloodgate.com/graph-demo
      [ disconnected ], [ inprogress ], [connected ] ,
      [ requestsent ] , [ haveresponse ]
      -- whoops --> [FAIL]
FSA
  my $code = $graph->as_FSA( base => 'bibbity');
  ok(eval  $code);
  my $boo = bless [], 'bibbity::START';
  ok($boo->disconnected);
  ok($boo->goodconnect);
  is(ref($boo), 'bibbity::inprogress');
  ok($boo->goodconnect);
  is(ref($boo), 'bibbity::connected');
  

  use Graph::Easy::StateMachine <<FSA ;
      [BASE] -> [ START ] = goA => [ A ]
      [ A ] = goB => [ B ]
      [ START ] = goB => [ B ]
FSA
  my $w = bless {};

  ok($w->START);
  is('BibbityBoo::B', ref ($w->goA->goB), "chaining");
  eval { $w->START };
  ok ( $@ =~ m/invalid state transition B->START/ );

  sub BibbityBoo::B::Drink { 'coffee' }
package BibbityBobbityBoo;
BEGIN { @ISA = qw/BibbityBoo/ }

use Graph::Easy::StateMachine ' [B] -> [C] ';

my $q = bless [];
$q->START->goB;
package BibbityBoo; # get back where we have Test::More imported
is('coffee', $q->Drink, "inherited state methods");

is('BibbityBobbityBoo::C', ref ($q->C), "inheritance");
eval { $w->C };
ok ($@);