summaryrefslogtreecommitdiff
path: root/scripts/t/100_Dpkg_Version.t
blob: b36db1ca85fde1c3deffd072d7cdb0c7cb98a3e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# -*- mode: cperl;-*-

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) + 2) + 1;

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', qw(vercmp compare_versions));

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,
    },
};

foreach my $case (@tests) {
    my ($a, $b, $res) = split " ", $case;
    my $va = Dpkg::Version->new($a);
    my $vb = Dpkg::Version->new($b);

    is(vercmp($a, $b), $res, "$a cmp $b => $res");
    is($va <=> $vb, $res, "Dpkg::Version($a) <=> Dpkg::Version($b) => $res");
    foreach my $op (@ops) {
	if ($truth->{$res}{$op}) {
	    ok(compare_versions($a, $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(!compare_versions($a, $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:foo foo 1
0:foo foo 0
foo foo 0
foo- foo 0
foo- foo-0 0
foo fo 1
foo- foo+ -1
foo~1 foo -1
foo~foo+Bar foo~foo+bar -1
foo~~ foo~ -1
1~ 1 -1
12345+that-really-is-some-ver-0 12345+that-really-is-some-ver-10 -1
foo-0 foo-01 -1
foo.bar foobar 1
foo.bar foo1bar 1
foo.bar foo0bar 1
1foo-1 foo-1 -1
foo2.0 foo2 1
foo2.0.0 foo2.10.0 -1
foo2.0 foo2.0.0 -1
foo2.0 foo2.10 -1
foo2.1 foo2.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