1#!perl 2use strict; 3use warnings; 4use Test::More tests => 27; 5 6BEGIN { 7 use_ok('Math::Symbolic'); 8 use_ok('Math::SymbolicX::ParserExtensionFactory'); 9} 10use Math::SymbolicX::ParserExtensionFactory 11 fun_func => sub { 12 Test::More::ok(1, "in fun_func"); 13 return Math::Symbolic::Constant->new(2); 14 }; 15 16SCOPE: { 17 my $parser = Math::Symbolic::Parser->new( 18 implementation => 'Yapp' 19 ); 20 21 Math::SymbolicX::ParserExtensionFactory->add_private_functions( 22 $parser, 23 myfunction => sub { 24 ok(1, 'myfunction called at the right time'); 25 ok($_[0] eq 'myargument*(2-1)'); 26 return Math::Symbolic::Constant->new(5); 27 }, 28 ); 29 30 pass('Still alive after modifying the parser.'); 31 32 my $parsed = $parser->parse('1 + myfunction(myargument*(2-1)) * myfunction(myargument*(2-1)) + fun_func(1)'); 33 34 ok(ref $parsed eq 'Math::Symbolic::Operator', 'parsed alright'); 35 36 ok($parsed->value()==28, 'works alright'); 37} 38 39SCOPE: { 40 my $parser = Math::Symbolic::Parser->new( 41 implementation => 'Yapp' 42 ); 43 44 my $parsed; 45 eval {$parsed = $parser->parse('1 + myfunction(myargument*(2-1)) * myfunction(myargument*(2-1)) + fun_func(1)'); }; 46 47 ok(!defined($parsed) || $@, 'Parse failed as expected'); 48} 49 50 51SCOPE: { 52 my $parser = Math::Symbolic::Parser->new( 53 implementation => 'RecDescent' 54 ); 55 56 Math::SymbolicX::ParserExtensionFactory->add_private_functions( 57 $parser, 58 myfunction2 => sub { 59 ok(1, 'myfunction2 called at the right time'); 60 ok($_[0] eq 'myargument*(2-1)'); 61 return Math::Symbolic::Constant->new(6); 62 }, 63 ); 64 65 pass('Still alive after modifying the parser.'); 66 67 my $parsed = $parser->parse('1 + myfunction2(myargument*(2-1)) * myfunction2(myargument*(2-1)) + fun_func(1)'); 68 69 ok(ref $parsed eq 'Math::Symbolic::Operator', 'parsed alright'); 70 71 ok($parsed->value()==39, 'works alright'); 72} 73 74SCOPE: { 75 my $parser = Math::Symbolic::Parser->new( 76 implementation => 'RecDescent' 77 ); 78 79 my $parsed; 80 eval {$parsed = $parser->parse('1 + myfunction2(myargument*(2-1)) * myfunction2(myargument*(2-1)) + fun_func(1)'); }; 81 82 ok(!defined($parsed) || $@, 'Parse failed as expected'); 83} 84 85 86SCOPE: { 87 my $parser = Math::Symbolic::Parser->new( 88 implementation => 'RecDescent' 89 ); 90 91 my $parsed; 92 eval {$parsed = $parser->parse('1 + myfunction(myargument*(2-1)) * myfunction(myargument*(2-1)) + fun_func(1)'); }; 93 94 ok(!defined($parsed) || $@, 'Parse failed as expected'); 95} 96 97 98SCOPE: { 99 my $parser = Math::Symbolic::Parser->new( 100 implementation => 'Yapp' 101 ); 102 103 my $parsed; 104 eval {$parsed = $parser->parse('1 + myfunction2(myargument*(2-1)) * myfunction2(myargument*(2-1)) + fun_func(1)'); }; 105 106 ok(!defined($parsed) || $@, 'Parse failed as expected'); 107} 108 109 110