1 # Before `make install' is performed this script should be runnable with
2 # `make test'. After `make install' it should work as `perl oo.t'
5 use lib qw( blib lib );
6 use Algorithm::Diff qw( compact_diff );
8 use Test qw( plan ok $ntest );
14 $SIG{__DIE__} = sub # breakpoint on die
20 $SIG{__WARN__} = sub # breakpoint on warn
27 sub Ok($$) { @_= reverse @_; goto &ok }
29 my( $first, $a, $b, $hunks );
31 [ "a b c e h j l m n p",
32 " b c d e f j k l m r s t", 9 ],
36 [ "a b", "x y z", 1 ],
37 [ " c e h j l m n p r",
38 "a b c d f g j k l m s t", 7 ],
51 ( $a, $b, $hunks )= @$pair;
52 my @a = split ' ', $a;
53 my @b = split ' ', $b;
55 my $d = Algorithm::Diff->new( \@a, \@b );
58 print "1: $a$/2: $b$/";
60 printf "%10s %s %s$/",
61 join(' ',$d->Items(1)),
62 $d->Same() ? '=' : '|',
63 join(' ',$d->Items(2));
68 Ok( 0, $d->Base(undef) );
70 Ok( 1, $d->Base(undef) );
73 ok( ! eval { $d->Diff(); 1 } );
74 ok( $@, qr/\breset\b/i );
75 ok( ! eval { $d->Same(); 1 } );
76 ok( $@, qr/\breset\b/i );
77 ok( ! eval { $d->Items(1); 1 } );
78 ok( $@, qr/\breset\b/i );
79 ok( ! eval { $d->Range(2); 1 } );
80 ok( $@, qr/\breset\b/i );
81 ok( ! eval { $d->Min(1); 1 } );
82 ok( $@, qr/\breset\b/i );
83 ok( ! eval { $d->Max(2); 1 } );
84 ok( $@, qr/\breset\b/i );
85 ok( ! eval { $d->Get('Min1'); 1 } );
86 ok( $@, qr/\breset\b/i );
89 ok( ! eval { $d->Same(); 1 } );
90 ok( $@, qr/\breset\b/i );
91 Ok( 1, $d->Next() ) if 0 < $hunks;
92 Ok( 2, $d->Next(undef) ) if 1 < $hunks;
93 Ok( 3, $d->Next(1) ) if 2 < $hunks;
94 Ok( 2, $d->Next(-1) ) if 1 < $hunks;
96 ok( ! eval { $d->Same(); 1 } );
97 ok( $@, qr/\breset\b/i );
100 ok( ! eval { $d->Same(); 1 } );
101 ok( $@, qr/\breset\b/i );
102 Ok( -1, $d->Prev() ) if 0 < $hunks;
103 Ok( -2, $d->Prev(undef) ) if 1 < $hunks;
104 Ok( -3, $d->Prev(1) ) if 2 < $hunks;
105 Ok( -2, $d->Prev(-1) ) if 1 < $hunks;
106 ok( ! $d->Prev(-2) );
108 Ok( 1, $d->Next() ) if 0 < $hunks;
110 Ok( 1, $d->Next() ) if 0 < $hunks;
112 Ok( -1, $d->Prev() ) if 0 < $hunks;
114 Ok( -1, $d->Prev() ) if 0 < $hunks;
117 Ok( 1, $d->Next() ) if 0 < $hunks;
118 Ok( $d, $d->Reset() );
120 Ok( 3, $d->Reset(3)->Next(0) ) if 2 < $hunks;
121 Ok( -3, $d->Reset(-2)->Prev() ) if 2 < $hunks;
122 Ok( $hunks || !1, $d->Reset(0)->Next(-1) );
125 ok( $c->Base(), $d->Base() );
126 ok( $c->Next(0), $d->Next(0) );
127 ok( $d->Copy(-4)->Next(0),
128 $d->Copy()->Reset(-4)->Next(0) );
130 $c = $d->Copy( undef, 1 );
132 ok( $c->Next(0), $d->Next(0) );
136 while( $d->Next() ) {
139 ok( $d->Same(), $d->Range(2) );
140 ok( $d->Items(2), $d->Range(1) );
141 ok( "@{[$d->Same()]}",
142 "@{[$d->Items(1)]}" );
143 ok( "@{[$d->Items(1)]}",
144 "@{[$d->Items(2)]}" );
145 ok( "@{[$d->Items(2)]}",
146 "@a[$d->Range(1)]" );
147 ok( "@a[$d->Range(1,0)]",
148 "@b[$d->Range(2)]" );
150 push @B, @b[$d->Range(2)];
153 ok( $d->Diff() & 1, 1*!!$d->Range(1) );
154 ok( $d->Diff() & 2, 2*!!$d->Range(2) );
155 ok( "@{[$d->Items(1)]}",
156 "@a[$d->Range(1)]" );
157 ok( "@{[$d->Items(2)]}",
158 "@b[$d->Range(2,0)]" );
159 push @A, @a[$d->Range(1)];
160 push @B, $d->Items(2);
170 ok( ! eval { $d->Items(); 1 } ); }
171 ok( ! eval { $d->Items(0); 1 } );
173 ok( ! eval { $d->Range(); 1 } ); }
174 ok( ! eval { $d->Range(3); 1 } );
176 ok( ! eval { $d->Min(); 1 } ); }
177 ok( ! eval { $d->Min(-1); 1 } );
179 ok( ! eval { $d->Max(); 1 } ); }
180 ok( ! eval { $d->Max(9); 1 } );
183 $c= $d->Copy(undef,1);
184 ok( "@a[$d->Range(1)]",
185 "@{[(0,@a)[$c->Range(1)]]}" );
186 ok( "@b[$c->Range(2,0)]",
187 "@{[(0,@b)[$d->Range(2,1)]]}" );
188 ok( "@a[$d->Get('min1')..$d->Get('0Max1')]",
189 "@{[(0,@a)[$d->Get('1MIN1')..$c->Get('MAX1')]]}" );
191 ok( "@{[$c->Min(1),$c->Max(2,0)]}",
192 "@{[$c->Get('Min1','0Max2')]}" );
193 ok( ! eval { scalar $c->Get('Min1','0Max2'); 1 } );
194 ok( "@{[0+$d->Same(),$d->Diff(),$d->Base()]}",
195 "@{[$d->Get(qq<same Diff BASE>)]}" );
196 ok( "@{[0+$d->Range(1),0+$d->Range(2)]}",
197 "@{[$d->Get(qq<Range1 rAnGe2>)]}" );
199 ok( ! eval { $c->Get('range'); 1 } );
200 ok( ! eval { $c->Get('min'); 1 } );
201 ok( ! eval { $c->Get('max'); 1 } ); }
205 my $tests= $ntest - $first;
206 print "$hunks hunks, $tests tests.$/";
210 # $d = Algorithm::Diff->new( \@a, \@b, {KeyGen=>sub...} );
212 # @cdiffs = compact_diff( \@seq1, \@seq2 );