1 # Before `make install' is performed this script should be runnable with
2 # `make test'. After `make install' it should work as `perl base.t'
6 use Algorithm::Diff qw(diff LCS traverse_sequences traverse_balanced sdiff);
14 $SIG{__DIE__} = sub # breakpoint on die
17 $DB::single = 1; # avoid complaint
22 my @a = qw(a b c e h j l m n p);
23 my @b = qw(b c d e f j k l m r s t);
24 my @correctResult = qw(b c e j l m);
25 my $correctResult = join(' ', @correctResult);
26 my $skippedA = 'a h n p';
27 my $skippedB = 'd f k r s t';
29 # From the Algorithm::Diff manpage:
30 my $correctDiffResult = [
35 [ [ '-', 4, 'h' ], [ '+', 4, 'f' ] ],
48 # Result of LCS must be as long as @a
49 my @result = Algorithm::Diff::_longestCommonSubsequence( \@a, \@b );
50 ok( scalar(grep { defined } @result),
51 scalar(@correctResult),
52 "length of _longestCommonSubsequence" );
54 # result has b[] line#s keyed by a[] line#
55 # print "result =", join(" ", map { defined($_) ? $_ : 'undef' } @result), "\n";
57 my @aresult = map { defined( $result[$_] ) ? $a[$_] : () } 0 .. $#result;
59 map { defined( $result[$_] ) ? $b[ $result[$_] ] : () } 0 .. $#result;
61 ok( "@aresult", $correctResult, "A results" );
62 ok( "@bresult", $correctResult, "B results" );
64 my ( @matchedA, @matchedB, @discardsA, @discardsB, $finishedA, $finishedB );
69 push ( @matchedA, $a[$a] );
70 push ( @matchedB, $b[$b] );
76 push ( @discardsB, $b[$b] );
82 push ( @discardsA, $a[$a] );
102 DISCARD_A => \&discard_a,
103 DISCARD_B => \&discard_b
107 ok( "@matchedA", $correctResult);
108 ok( "@matchedB", $correctResult);
109 ok( "@discardsA", $skippedA);
110 ok( "@discardsB", $skippedB);
112 @matchedA = @matchedB = @discardsA = @discardsB = ();
113 $finishedA = $finishedB = undef;
120 DISCARD_A => \&discard_a,
121 DISCARD_B => \&discard_b,
122 A_FINISHED => \&finished_a,
123 B_FINISHED => \&finished_b,
127 ok( "@matchedA", $correctResult);
128 ok( "@matchedB", $correctResult);
129 ok( "@discardsA", $skippedA);
130 ok( "@discardsB", $skippedB);
131 ok( $finishedA, 9, "index of finishedA" );
132 ok( $finishedB, undef, "index of finishedB" );
134 my @lcs = LCS( \@a, \@b );
135 ok( "@lcs", $correctResult );
137 # Compare the diff output with the one from the Algorithm::Diff manpage.
138 my $diff = diff( \@a, \@b );
139 $Data::Dumper::Indent = 0;
140 my $cds = Dumper($correctDiffResult);
141 my $dds = Dumper($diff);
144 ##################################################
145 # <Mike Schilli> m@perlmeister.com 03/23/2002:
146 # Tests for sdiff-interface
147 #################################################
149 @a = qw(abc def yyy xxx ghi jkl);
150 @b = qw(abc dxf xxx ghi jkl);
151 $correctDiffResult = [ ['u', 'abc', 'abc'],
156 ['u', 'jkl', 'jkl'] ];
157 @result = sdiff(\@a, \@b);
158 ok(Dumper(\@result), Dumper($correctDiffResult));
161 #################################################
162 @a = qw(a b c e h j l m n p);
163 @b = qw(b c d e f j k l m r s t);
164 $correctDiffResult = [ ['-', 'a', '' ],
178 @result = sdiff(\@a, \@b);
179 ok(Dumper(\@result), Dumper($correctDiffResult));
181 #################################################
184 $correctDiffResult = [ ['u', 'a', 'a' ],
190 @result = sdiff(\@a, \@b);
191 ok(Dumper(\@result), Dumper($correctDiffResult));
193 #################################################
196 $correctDiffResult = [ ['u', 'a', 'a' ],
202 @result = sdiff(\@a, \@b);
203 ok(Dumper(\@result), Dumper($correctDiffResult));
205 #################################################
207 @b = qw(w y a b c d e);
208 $correctDiffResult = [
217 @result = sdiff(\@a, \@b);
218 ok(Dumper(\@result), Dumper($correctDiffResult));
220 #################################################
223 $correctDiffResult = [
231 @result = sdiff(\@a, \@b);
232 ok(Dumper(\@result), Dumper($correctDiffResult));
234 #################################################
236 @b = qw(x a b c d e);
237 $correctDiffResult = [
245 @result = sdiff(\@a, \@b);
246 ok(Dumper(\@result), Dumper($correctDiffResult));
248 #################################################
250 @b = qw(x a b c d e w x);
251 $correctDiffResult = [
261 @result = sdiff(\@a, \@b);
262 ok(Dumper(\@result), Dumper($correctDiffResult));
264 #################################################
267 $correctDiffResult = [
272 @result = sdiff(\@a, \@b);
273 ok(Dumper(\@result), Dumper($correctDiffResult));
275 #################################################
278 $correctDiffResult = [
283 @result = sdiff(\@a, \@b);
284 ok(Dumper(\@result), Dumper($correctDiffResult));
286 #################################################
289 $correctDiffResult = [
294 @result = sdiff(\@a, \@b);
295 ok(Dumper(\@result), Dumper($correctDiffResult));
297 #################################################
300 $correctDiffResult = [
305 @result = sdiff(\@a, \@b);
306 ok(Dumper(\@result), Dumper($correctDiffResult));
308 #################################################
312 traverse_balanced( \@a, \@b,
313 { MATCH => sub { $r .= "M @_";},
314 DISCARD_A => sub { $r .= "DA @_";},
315 DISCARD_B => sub { $r .= "DB @_";},
316 CHANGE => sub { $r .= "C @_";},
318 ok($r, "M 0 0C 1 1M 2 2");
320 #################################################
321 # No CHANGE callback => use discard_a/b instead
325 traverse_balanced( \@a, \@b,
326 { MATCH => sub { $r .= "M @_";},
327 DISCARD_A => sub { $r .= "DA @_";},
328 DISCARD_B => sub { $r .= "DB @_";},
330 ok($r, "M 0 0DA 1 1DB 2 1M 2 2");
332 #################################################
336 traverse_balanced( \@a, \@b,
337 { MATCH => sub { $r .= "M @_";},
338 DISCARD_A => sub { $r .= "DA @_";},
339 DISCARD_B => sub { $r .= "DB @_";},
340 CHANGE => sub { $r .= "C @_";},
342 ok($r, "M 0 0C 1 1C 2 2M 3 3");
344 #################################################
348 traverse_balanced( \@a, \@b,
349 { MATCH => sub { $r .= "M @_";},
350 DISCARD_A => sub { $r .= "DA @_";},
351 DISCARD_B => sub { $r .= "DB @_";},
352 CHANGE => sub { $r .= "C @_";},
354 ok($r, "C 0 0C 1 1M 2 2");
356 #################################################
360 traverse_balanced( \@a, \@b,
361 { MATCH => sub { $r .= "M @_";},
362 DISCARD_A => sub { $r .= "DA @_";},
363 DISCARD_B => sub { $r .= "DB @_";},
364 CHANGE => sub { $r .= "C @_";},
366 ok($r, "C 0 0C 1 1C 2 2DA 3 3");
368 #################################################
372 traverse_balanced( \@a, \@b,
373 { MATCH => sub { $r .= "M @_";},
374 DISCARD_A => sub { $r .= "DA @_";},
375 DISCARD_B => sub { $r .= "DB @_";},
376 CHANGE => sub { $r .= "C @_";},
378 ok($r, "M 0 0DA 1 1");
380 #################################################
384 traverse_balanced( \@a, \@b,
385 { MATCH => sub { $r .= "M @_";},
386 DISCARD_A => sub { $r .= "DA @_";},
387 DISCARD_B => sub { $r .= "DB @_";},
388 CHANGE => sub { $r .= "C @_";},
390 ok($r, "DA 0 0M 1 0");
392 #################################################
396 traverse_balanced( \@a, \@b,
397 { MATCH => sub { $r .= "M @_";},
398 DISCARD_A => sub { $r .= "DA @_";},
399 DISCARD_B => sub { $r .= "DB @_";},
400 CHANGE => sub { $r .= "C @_";},
402 ok($r, "C 0 0C 1 1C 2 2");