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