100_Dpkg_Version.t 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. # -*- mode: cperl;-*-
  2. use Test::More;
  3. use Dpkg::ErrorHandling;
  4. use strict;
  5. use warnings;
  6. report_options(quiet_warnings => 1);
  7. my @tests = <DATA>;
  8. my @ops = ("<", "<<", "lt",
  9. "<=", "le",
  10. "=", "eq",
  11. ">=", "ge",
  12. ">", ">>", "gt");
  13. plan tests => scalar(@tests) * (3 * scalar(@ops) + 4) + 1;
  14. sub dpkg_vercmp {
  15. my ($a, $cmp, $b) = @_;
  16. return system('dpkg', '--compare-versions', $a, $cmp, $b) == 0;
  17. }
  18. sub obj_vercmp {
  19. my ($a, $cmp, $b) = @_;
  20. return $a < $b if $cmp eq "<<";
  21. return $a lt $b if $cmp eq "lt";
  22. return $a <= $b if $cmp eq "<=" or $cmp eq "<";
  23. return $a le $b if $cmp eq "le";
  24. return $a == $b if $cmp eq "=";
  25. return $a eq $b if $cmp eq "eq";
  26. return $a >= $b if $cmp eq ">=" or $cmp eq ">";
  27. return $a ge $b if $cmp eq "ge";
  28. return $a > $b if $cmp eq ">>";
  29. return $a gt $b if $cmp eq "gt";
  30. }
  31. use_ok('Dpkg::Version');
  32. my $truth = {
  33. "-1" => {
  34. "<<" => 1, "lt" => 1,
  35. "<=" => 1, "le" => 1, "<" => 1,
  36. "=" => 0, "eq" => 0,
  37. ">=" => 0, "ge" => 0, ">" => 0,
  38. ">>" => 0, "gt" => 0,
  39. },
  40. "0" => {
  41. "<<" => 0, "lt" => 0,
  42. "<=" => 1, "le" => 1, "<" => 1,
  43. "=" => 1, "eq" => 1,
  44. ">=" => 1, "ge" => 1, ">" => 1,
  45. ">>" => 0, "gt" => 0,
  46. },
  47. "1" => {
  48. "<<" => 0, "lt" => 0,
  49. "<=" => 0, "le" => 0, "<" => 0,
  50. "=" => 0, "eq" => 0,
  51. ">=" => 1, "ge" => 1, ">" => 1,
  52. ">>" => 1, "gt" => 1,
  53. },
  54. };
  55. foreach my $case (@tests) {
  56. my ($a, $b, $res) = split " ", $case;
  57. my $va = Dpkg::Version->new($a);
  58. my $vb = Dpkg::Version->new($b);
  59. is("$va", $a, "String representation of Dpkg::Version($a) is $a");
  60. is("$vb", $b, "String representation of Dpkg::Version($b) is $b");
  61. is(version_compare($a, $b), $res, "$a cmp $b => $res");
  62. is($va <=> $vb, $res, "Dpkg::Version($a) <=> Dpkg::Version($b) => $res");
  63. foreach my $op (@ops) {
  64. my $norm_op = version_normalize_relation($op);
  65. if ($truth->{$res}{$op}) {
  66. ok(version_compare_relation($a, $norm_op, $b), "$a $op $b => true");
  67. ok(obj_vercmp($va, $op, $vb), "Dpkg::Version($a) $op Dpkg::Version($b) => true");
  68. ok(dpkg_vercmp($a, $op, $b), "dpkg --compare-versions $a $op $b => true");
  69. } else {
  70. ok(!version_compare_relation($a, $norm_op, $b), "$a $op $b => false");
  71. ok(!obj_vercmp($va, $op, $vb), "Dpkg::Version($a) $op Dpkg::Version($b) => false");
  72. ok(!dpkg_vercmp($a, $op, $b), "dpkg --compare-versions $a $op $b => false");
  73. }
  74. }
  75. }
  76. __DATA__
  77. 1.0-1 2.0-2 -1
  78. 2.2~rc-4 2.2-1 -1
  79. 2.2-1 2.2~rc-4 1
  80. 1.0000-1 1.0-1 0
  81. 1 0:1 0
  82. 0 0:0-0 0
  83. 2:2.5 1:7.5 1
  84. 1:foo foo 1
  85. 0:foo foo 0
  86. foo foo 0
  87. foo- foo 0
  88. foo- foo-0 0
  89. foo fo 1
  90. foo- foo+ -1
  91. foo~1 foo -1
  92. foo~foo+Bar foo~foo+bar -1
  93. foo~~ foo~ -1
  94. 1~ 1 -1
  95. 12345+that-really-is-some-ver-0 12345+that-really-is-some-ver-10 -1
  96. foo-0 foo-01 -1
  97. foo.bar foobar 1
  98. foo.bar foo1bar 1
  99. foo.bar foo0bar 1
  100. 1foo-1 foo-1 -1
  101. foo2.0 foo2 1
  102. foo2.0.0 foo2.10.0 -1
  103. foo2.0 foo2.0.0 -1
  104. foo2.0 foo2.10 -1
  105. foo2.1 foo2.10 -1
  106. 1.09 1.9 0
  107. 1.0.8+nmu1 1.0.8 1
  108. 3.11 3.10+nmu1 1
  109. 0.9j-20080306-4 0.9i-20070324-2 1
  110. 1.2.0~b7-1 1.2.0~b6-1 1
  111. 1.011-1 1.06-2 1
  112. 0.0.9+dfsg1-1 0.0.8+dfsg1-3 1
  113. 4.6.99+svn6582-1 4.6.99+svn6496-1 1
  114. 53 52 1
  115. 0.9.9~pre122-1 0.9.9~pre111-1 1
  116. 2:2.3.2-2+lenny2 2:2.3.2-2 1
  117. 1:3.8.1-1 3.8.GA-1 1
  118. 1.0.1+gpl-1 1.0.1-2 1
  119. 1a 1000a -1