100_Dpkg_Version.t 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. # -*- mode: cperl;-*-
  2. #
  3. # This program is free software; you can redistribute it and/or modify
  4. # it under the terms of the GNU General Public License as published by
  5. # the Free Software Foundation; either version 2 of the License, or
  6. # (at your option) any later version.
  7. #
  8. # This program is distributed in the hope that it will be useful,
  9. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. # GNU General Public License for more details.
  12. #
  13. # You should have received a copy of the GNU General Public License
  14. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. use Test::More;
  16. use Dpkg::ErrorHandling;
  17. use strict;
  18. use warnings;
  19. report_options(quiet_warnings => 1);
  20. my @tests = <DATA>;
  21. my @ops = ("<", "<<", "lt",
  22. "<=", "le",
  23. "=", "eq",
  24. ">=", "ge",
  25. ">", ">>", "gt");
  26. plan tests => scalar(@tests) * (3 * scalar(@ops) + 4) + 1;
  27. sub dpkg_vercmp {
  28. my ($a, $cmp, $b) = @_;
  29. return system('dpkg', '--compare-versions', $a, $cmp, $b) == 0;
  30. }
  31. sub obj_vercmp {
  32. my ($a, $cmp, $b) = @_;
  33. return $a < $b if $cmp eq "<<";
  34. return $a lt $b if $cmp eq "lt";
  35. return $a <= $b if $cmp eq "<=" or $cmp eq "<";
  36. return $a le $b if $cmp eq "le";
  37. return $a == $b if $cmp eq "=";
  38. return $a eq $b if $cmp eq "eq";
  39. return $a >= $b if $cmp eq ">=" or $cmp eq ">";
  40. return $a ge $b if $cmp eq "ge";
  41. return $a > $b if $cmp eq ">>";
  42. return $a gt $b if $cmp eq "gt";
  43. }
  44. use_ok('Dpkg::Version');
  45. my $truth = {
  46. "-1" => {
  47. "<<" => 1, "lt" => 1,
  48. "<=" => 1, "le" => 1, "<" => 1,
  49. "=" => 0, "eq" => 0,
  50. ">=" => 0, "ge" => 0, ">" => 0,
  51. ">>" => 0, "gt" => 0,
  52. },
  53. "0" => {
  54. "<<" => 0, "lt" => 0,
  55. "<=" => 1, "le" => 1, "<" => 1,
  56. "=" => 1, "eq" => 1,
  57. ">=" => 1, "ge" => 1, ">" => 1,
  58. ">>" => 0, "gt" => 0,
  59. },
  60. "1" => {
  61. "<<" => 0, "lt" => 0,
  62. "<=" => 0, "le" => 0, "<" => 0,
  63. "=" => 0, "eq" => 0,
  64. ">=" => 1, "ge" => 1, ">" => 1,
  65. ">>" => 1, "gt" => 1,
  66. },
  67. };
  68. foreach my $case (@tests) {
  69. my ($a, $b, $res) = split " ", $case;
  70. my $va = Dpkg::Version->new($a);
  71. my $vb = Dpkg::Version->new($b);
  72. is("$va", $a, "String representation of Dpkg::Version($a) is $a");
  73. is("$vb", $b, "String representation of Dpkg::Version($b) is $b");
  74. is(version_compare($a, $b), $res, "$a cmp $b => $res");
  75. is($va <=> $vb, $res, "Dpkg::Version($a) <=> Dpkg::Version($b) => $res");
  76. foreach my $op (@ops) {
  77. my $norm_op = version_normalize_relation($op);
  78. if ($truth->{$res}{$op}) {
  79. ok(version_compare_relation($a, $norm_op, $b), "$a $op $b => true");
  80. ok(obj_vercmp($va, $op, $vb), "Dpkg::Version($a) $op Dpkg::Version($b) => true");
  81. ok(dpkg_vercmp($a, $op, $b), "dpkg --compare-versions $a $op $b => true");
  82. } else {
  83. ok(!version_compare_relation($a, $norm_op, $b), "$a $op $b => false");
  84. ok(!obj_vercmp($va, $op, $vb), "Dpkg::Version($a) $op Dpkg::Version($b) => false");
  85. ok(!dpkg_vercmp($a, $op, $b), "dpkg --compare-versions $a $op $b => false");
  86. }
  87. }
  88. }
  89. __DATA__
  90. 1.0-1 2.0-2 -1
  91. 2.2~rc-4 2.2-1 -1
  92. 2.2-1 2.2~rc-4 1
  93. 1.0000-1 1.0-1 0
  94. 1 0:1 0
  95. 0 0:0-0 0
  96. 2:2.5 1:7.5 1
  97. 1:foo foo 1
  98. 0:foo foo 0
  99. foo foo 0
  100. foo- foo 0
  101. foo- foo-0 0
  102. foo fo 1
  103. foo- foo+ -1
  104. foo~1 foo -1
  105. foo~foo+Bar foo~foo+bar -1
  106. foo~~ foo~ -1
  107. 1~ 1 -1
  108. 12345+that-really-is-some-ver-0 12345+that-really-is-some-ver-10 -1
  109. foo-0 foo-01 -1
  110. foo.bar foobar 1
  111. foo.bar foo1bar 1
  112. foo.bar foo0bar 1
  113. 1foo-1 foo-1 -1
  114. foo2.0 foo2 1
  115. foo2.0.0 foo2.10.0 -1
  116. foo2.0 foo2.0.0 -1
  117. foo2.0 foo2.10 -1
  118. foo2.1 foo2.10 -1
  119. 1.09 1.9 0
  120. 1.0.8+nmu1 1.0.8 1
  121. 3.11 3.10+nmu1 1
  122. 0.9j-20080306-4 0.9i-20070324-2 1
  123. 1.2.0~b7-1 1.2.0~b6-1 1
  124. 1.011-1 1.06-2 1
  125. 0.0.9+dfsg1-1 0.0.8+dfsg1-3 1
  126. 4.6.99+svn6582-1 4.6.99+svn6496-1 1
  127. 53 52 1
  128. 0.9.9~pre122-1 0.9.9~pre111-1 1
  129. 2:2.3.2-2+lenny2 2:2.3.2-2 1
  130. 1:3.8.1-1 3.8.GA-1 1
  131. 1.0.1+gpl-1 1.0.1-2 1
  132. 1a 1000a -1