| # -*- mode: cperl;-*- |
| # |
| # This program is free software; you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation; either version 2 of the License, or |
| # (at your option) any later version. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program. If not, see <http://www.gnu.org/licenses/>. |
| |
| use Test::More; |
| use Dpkg::ErrorHandling; |
| |
| use strict; |
| use warnings; |
| |
| report_options(quiet_warnings => 1); |
| |
| my @tests = <DATA>; |
| my @ops = ("<", "<<", "lt", |
| "<=", "le", |
| "=", "eq", |
| ">=", "ge", |
| ">", ">>", "gt"); |
| |
| plan tests => scalar(@tests) * (3 * scalar(@ops) + 4) + 13; |
| |
| sub dpkg_vercmp { |
| my ($a, $cmp, $b) = @_; |
| return system('dpkg', '--compare-versions', '--', $a, $cmp, $b) == 0; |
| } |
| |
| sub obj_vercmp { |
| my ($a, $cmp, $b) = @_; |
| return $a < $b if $cmp eq "<<"; |
| return $a lt $b if $cmp eq "lt"; |
| return $a <= $b if $cmp eq "<=" or $cmp eq "<"; |
| return $a le $b if $cmp eq "le"; |
| return $a == $b if $cmp eq "="; |
| return $a eq $b if $cmp eq "eq"; |
| return $a >= $b if $cmp eq ">=" or $cmp eq ">"; |
| return $a ge $b if $cmp eq "ge"; |
| return $a > $b if $cmp eq ">>"; |
| return $a gt $b if $cmp eq "gt"; |
| } |
| |
| use_ok('Dpkg::Version'); |
| |
| my $truth = { |
| "-1" => { |
| "<<" => 1, "lt" => 1, |
| "<=" => 1, "le" => 1, "<" => 1, |
| "=" => 0, "eq" => 0, |
| ">=" => 0, "ge" => 0, ">" => 0, |
| ">>" => 0, "gt" => 0, |
| }, |
| "0" => { |
| "<<" => 0, "lt" => 0, |
| "<=" => 1, "le" => 1, "<" => 1, |
| "=" => 1, "eq" => 1, |
| ">=" => 1, "ge" => 1, ">" => 1, |
| ">>" => 0, "gt" => 0, |
| }, |
| "1" => { |
| "<<" => 0, "lt" => 0, |
| "<=" => 0, "le" => 0, "<" => 0, |
| "=" => 0, "eq" => 0, |
| ">=" => 1, "ge" => 1, ">" => 1, |
| ">>" => 1, "gt" => 1, |
| }, |
| }; |
| |
| # Handling of empty/invalid versions |
| my $empty = Dpkg::Version->new(""); |
| ok($empty eq "", "Dpkg::Version->new('') eq ''"); |
| ok($empty->as_string() eq "", "Dpkg::Version->new('')->as_string() eq ''"); |
| ok(!$empty->is_valid(), "empty version is invalid"); |
| my $ver = Dpkg::Version->new("10a:5.2"); |
| ok(!$ver->is_valid(), "bad epoch is invalid"); |
| ok(!$ver, "bool eval of invalid leads to false"); |
| ok($ver eq '10a:5.2', "invalid still same string 1/2"); |
| $ver = Dpkg::Version->new('5.2@3-2'); |
| ok($ver eq '5.2@3-2', "invalid still same string 2/2"); |
| ok(!$ver->is_valid(), "illegal character is invalid"); |
| $ver = Dpkg::Version->new('foo5.2'); |
| ok(!$ver->is_valid(), "version does not start with digit 1/2"); |
| $ver = Dpkg::Version->new('0:foo5.2'); |
| ok(!$ver->is_valid(), "version does not start with digit 2/2"); |
| |
| # Other tests |
| $ver = Dpkg::Version->new('1.2.3-4'); |
| is($ver || 'default', '1.2.3-4', "bool eval returns string representation"); |
| $ver = Dpkg::Version->new('0'); |
| is($ver || 'default', 'default', "bool eval of version 0 is still false..."); |
| |
| # Comparisons |
| foreach my $case (@tests) { |
| my ($a, $b, $res) = split " ", $case; |
| my $va = Dpkg::Version->new($a, check => 1); |
| my $vb = Dpkg::Version->new($b, check => 1); |
| |
| is("$va", $a, "String representation of Dpkg::Version($a) is $a"); |
| is("$vb", $b, "String representation of Dpkg::Version($b) is $b"); |
| |
| is(version_compare($a, $b), $res, "$a cmp $b => $res"); |
| is($va <=> $vb, $res, "Dpkg::Version($a) <=> Dpkg::Version($b) => $res"); |
| foreach my $op (@ops) { |
| my $norm_op = version_normalize_relation($op); |
| if ($truth->{$res}{$op}) { |
| ok(version_compare_relation($a, $norm_op, $b), "$a $op $b => true"); |
| ok(obj_vercmp($va, $op, $vb), "Dpkg::Version($a) $op Dpkg::Version($b) => true"); |
| ok(dpkg_vercmp($a, $op, $b), "dpkg --compare-versions -- $a $op $b => true"); |
| } else { |
| ok(!version_compare_relation($a, $norm_op, $b), "$a $op $b => false"); |
| ok(!obj_vercmp($va, $op, $vb), "Dpkg::Version($a) $op Dpkg::Version($b) => false"); |
| ok(!dpkg_vercmp($a, $op, $b), "dpkg --compare-versions -- $a $op $b => false"); |
| } |
| } |
| } |
| |
| __DATA__ |
| 1.0-1 2.0-2 -1 |
| 2.2~rc-4 2.2-1 -1 |
| 2.2-1 2.2~rc-4 1 |
| 1.0000-1 1.0-1 0 |
| 1 0:1 0 |
| 0 0:0-0 0 |
| 2:2.5 1:7.5 1 |
| 1:0foo 0foo 1 |
| 0:0foo 0foo 0 |
| 0foo 0foo 0 |
| 0foo- 0foo 0 |
| 0foo- 0foo-0 0 |
| 0foo 0fo 1 |
| 0foo- 0foo+ -1 |
| 0foo~1 0foo -1 |
| 0foo~foo+Bar 0foo~foo+bar -1 |
| 0foo~~ 0foo~ -1 |
| 1~ 1 -1 |
| 12345+that-really-is-some-ver-0 12345+that-really-is-some-ver-10 -1 |
| 0foo-0 0foo-01 -1 |
| 0foo.bar 0foobar 1 |
| 0foo.bar 0foo1bar 1 |
| 0foo.bar 0foo0bar 1 |
| 0foo1bar-1 0foobar-1 -1 |
| 0foo2.0 0foo2 1 |
| 0foo2.0.0 0foo2.10.0 -1 |
| 0foo2.0 0foo2.0.0 -1 |
| 0foo2.0 0foo2.10 -1 |
| 0foo2.1 0foo2.10 -1 |
| 1.09 1.9 0 |
| 1.0.8+nmu1 1.0.8 1 |
| 3.11 3.10+nmu1 1 |
| 0.9j-20080306-4 0.9i-20070324-2 1 |
| 1.2.0~b7-1 1.2.0~b6-1 1 |
| 1.011-1 1.06-2 1 |
| 0.0.9+dfsg1-1 0.0.8+dfsg1-3 1 |
| 4.6.99+svn6582-1 4.6.99+svn6496-1 1 |
| 53 52 1 |
| 0.9.9~pre122-1 0.9.9~pre111-1 1 |
| 2:2.3.2-2+lenny2 2:2.3.2-2 1 |
| 1:3.8.1-1 3.8.GA-1 1 |
| 1.0.1+gpl-1 1.0.1-2 1 |
| 1a 1000a -1 |
| -0.6.5 0.9.1 -1 |