VMS specific cleanup and strictness for tie_sdbm.t
[p5sagit/p5-mst-13.2.git] / lib / Memoize / t / correctness.t
CommitLineData
a0cb3900 1#!/usr/bin/perl
2
5317c87c 3BEGIN {
4 chdir 't' if -d 't';
5 @INC = '../lib';
6}
a0cb3900 7use Memoize;
8
9print "1..25\n";
10
11print "# Basic\n";
12
13# A function that should only be called once.
14{ my $COUNT = 0;
15 sub no_args {
16 $FAIL++ if $COUNT++;
17 11;
18 }
19}
20
21#
22memoize('no_args');
23
24$c1 = &no_args();
25print (($c1 == 11) ? "ok 1\n" : "not ok 1\n");
26$c2 = &no_args();
27print (($c2 == 11) ? "ok 2\n" : "not ok 2\n");
28print $FAIL ? "not ok 3\n" : "ok 3\n"; # Was it really memoized?
29
30$FAIL = 0;
31$f = do { my $COUNT = 0; sub { $FAIL++ if $COUNT++; 12 } };
32$fm = memoize($f);
33
34$c1 = &$fm();
35print (($c1 == 12) ? "ok 4\n" : "not ok 4\n");
36$c2 = &$fm();
37print (($c2 == 12) ? "ok 5\n" : "not ok 5\n");
38print $FAIL ? "not ok 6\n" : "ok 6\n"; # Was it really memoized?
39
40$f = do { my $COUNT = 0; sub { $FAIL++ if $COUNT++; 13 } };
41$fm = memoize($f, INSTALL => 'another');
42
43$c1 = &another(); # Was it really installed?
44print (($c1 == 13) ? "ok 7\n" : "not ok 7\n");
45$c2 = &another();
46print (($c2 == 13) ? "ok 8\n" : "not ok 8\n");
47print $FAIL ? "not ok 9\n" : "ok 9\n"; # Was it really memoized?
48$c3 = &$fm(); # Call memoized version through returned ref
49print (($c3 == 13) ? "ok 10\n" : "not ok 10\n");
50print $FAIL ? "not ok 11\n" : "ok 11\n"; # Was it really memoized?
51$c4 = &$f(); # Call original version again
52print (($c4 == 13) ? "ok 12\n" : "not ok 12\n");
53print $FAIL ? "ok 13\n" : "not ok 13\n"; # Did we get the original?
54
55print "# Fibonacci\n";
56
57sub mt1 { # Fibonacci
58 my $n = shift;
59 return $n if $n < 2;
60 mt1($n-1) + mt2($n-2);
61}
62sub mt2 {
63 my $n = shift;
64 return $n if $n < 2;
65 mt1($n-1) + mt2($n-2);
66}
67
68@f1 = map { mt1($_) } (0 .. 15);
69@f2 = map { mt2($_) } (0 .. 15);
70memoize('mt1');
71@f3 = map { mt1($_) } (0 .. 15);
72@f4 = map { mt1($_) } (0 .. 15);
73@arrays = (\@f1, \@f2, \@f3, \@f4);
74$n = 13;
75for ($i=0; $i<3; $i++) {
76 for ($j=$i+1; $j<3; $j++) {
77 $n++;
78 print ((@{$arrays[$i]} == @{$arrays[$j]}) ? "ok $n\n" : "not ok $n\n");
79 $n++;
80 for ($k=0; $k < @{$arrays[$i]}; $k++) {
81 (print "not ok $n\n", next) if $arrays[$i][$k] != $arrays[$j][$k];
82 }
83 print "ok $n\n";
84 }
85}
86
87
88
89print "# Normalizers\n";
90
91sub fake_normalize {
92 return '';
93}
94
95sub f1 {
96 return shift;
97}
98sub f2 {
99 return shift;
100}
101sub f3 {
102 return shift;
103}
104&memoize('f1');
105&memoize('f2', NORMALIZER => 'fake_normalize');
106&memoize('f3', NORMALIZER => \&fake_normalize);
107@f1r = map { f1($_) } (1 .. 10);
108@f2r = map { f2($_) } (1 .. 10);
109@f3r = map { f3($_) } (1 .. 10);
110$n++;
111print (("@f1r" eq "1 2 3 4 5 6 7 8 9 10") ? "ok $n\n" : "not ok $n\n");
112$n++;
113print (("@f2r" eq "1 1 1 1 1 1 1 1 1 1") ? "ok $n\n" : "not ok $n\n");
114$n++;
115print (("@f3r" eq "1 1 1 1 1 1 1 1 1 1") ? "ok $n\n" : "not ok $n\n");
116
117print "# INSTALL => undef option.\n";
118{ my $i = 1;
119 sub u1 { $i++ }
120}
121my $um = memoize('u1', INSTALL => undef);
122@umr = (&$um, &$um, &$um);
123@u1r = (&u1, &u1, &u1 ); # Did *not* clobber &u1
124$n++;
125print (("@umr" eq "1 1 1") ? "ok $n\n" : "not ok $n\n"); # Increment once
126$n++;
127print (("@u1r" eq "2 3 4") ? "ok $n\n" : "not ok $n\n"); # Increment thrice
128$n++;
129print ((defined &{"undef"}) ? "not ok $n\n" : "ok $n\n"); # Just in case
130
131print "# $n tests in all.\n";
132