1require 'rubygems/test_case'
2require "rubygems/version"
3
4class TestGemVersion < Gem::TestCase
5
6  def test_bump
7    assert_bumped_version_equal "5.3", "5.2.4"
8  end
9
10  def test_bump_alpha
11    assert_bumped_version_equal "5.3", "5.2.4.a"
12  end
13
14  def test_bump_alphanumeric
15    assert_bumped_version_equal "5.3", "5.2.4.a10"
16  end
17
18  def test_bump_trailing_zeros
19    assert_bumped_version_equal "5.1", "5.0.0"
20  end
21
22  def test_bump_one_level
23    assert_bumped_version_equal "6", "5"
24  end
25
26  # A Gem::Version is already a Gem::Version and therefore not transformed by
27  # Gem::Version.create
28
29  def test_class_create
30    real = Gem::Version.new(1.0)
31
32    assert_same  real, Gem::Version.create(real)
33    assert_nil   Gem::Version.create(nil)
34    assert_equal v("5.1"), Gem::Version.create("5.1")
35
36    ver = '1.1'.freeze
37    assert_equal v('1.1'), Gem::Version.create(ver)
38  end
39
40  def test_eql_eh
41    assert_version_eql "1.2",    "1.2"
42    refute_version_eql "1.2",    "1.2.0"
43    refute_version_eql "1.2",    "1.3"
44    refute_version_eql "1.2.b1", "1.2.b.1"
45  end
46
47  def test_equals2
48    assert_version_equal "1.2",    "1.2"
49    refute_version_equal "1.2",    "1.3"
50    assert_version_equal "1.2.b1", "1.2.b.1"
51  end
52
53  # REVISIT: consider removing as too impl-bound
54  def test_hash
55    assert_equal v("1.2").hash, v("1.2").hash
56    refute_equal v("1.2").hash, v("1.3").hash
57    refute_equal v("1.2").hash, v("1.2.0").hash
58  end
59
60  def test_initialize
61    ["1.0", "1.0 ", " 1.0 ", "1.0\n", "\n1.0\n", "1.0".freeze].each do |good|
62      assert_version_equal "1.0", good
63    end
64
65    assert_version_equal "1", 1
66  end
67
68  def test_initialize_bad
69    %W[
70      junk
71      1.0\n2.0
72      1..2
73      1.2\ 3.4
74      1-2-3
75    ].each do |bad|
76      e = assert_raises ArgumentError, bad do
77        Gem::Version.new bad
78      end
79
80      assert_equal "Malformed version number string #{bad}", e.message, bad
81    end
82  end
83
84  def test_prerelease
85    assert_prerelease "1.2.0.a"
86    assert_prerelease "2.9.b"
87    assert_prerelease "22.1.50.0.d"
88    assert_prerelease "1.2.d.42"
89
90    assert_prerelease '1.A'
91
92    refute_prerelease "1.2.0"
93    refute_prerelease "2.9"
94    refute_prerelease "22.1.50.0"
95  end
96
97  def test_release
98    assert_release_equal "1.2.0", "1.2.0.a"
99    assert_release_equal "1.1",   "1.1.rc10"
100    assert_release_equal "1.9.3", "1.9.3.alpha.5"
101    assert_release_equal "1.9.3", "1.9.3"
102  end
103
104  def test_spaceship
105    assert_equal( 0, v("1.0")       <=> v("1.0.0"))
106    assert_equal( 1, v("1.0")       <=> v("1.0.a"))
107    assert_equal( 1, v("1.8.2")     <=> v("0.0.0"))
108    assert_equal( 1, v("1.8.2")     <=> v("1.8.2.a"))
109    assert_equal( 1, v("1.8.2.b")   <=> v("1.8.2.a"))
110    assert_equal(-1, v("1.8.2.a")   <=> v("1.8.2"))
111    assert_equal( 1, v("1.8.2.a10") <=> v("1.8.2.a9"))
112    assert_equal( 0, v("")          <=> v("0"))
113
114    assert_nil v("1.0") <=> "whatever"
115  end
116
117  def test_approximate_recommendation
118    assert_approximate_equal "~> 1.0", "1"
119    assert_approximate_equal "~> 1.0", "1.0"
120    assert_approximate_equal "~> 1.2", "1.2"
121    assert_approximate_equal "~> 1.2", "1.2.0"
122    assert_approximate_equal "~> 1.2", "1.2.3"
123    assert_approximate_equal "~> 1.2", "1.2.3.a.4"
124  end
125
126  def test_to_s
127    assert_equal "5.2.4", v("5.2.4").to_s
128  end
129
130  # Asserts that +version+ is a prerelease.
131
132  def assert_prerelease version
133    assert v(version).prerelease?, "#{version} is a prerelease"
134  end
135
136  # Assert that +expected+ is the "approximate" recommendation for +version".
137
138  def assert_approximate_equal expected, version
139    assert_equal expected, v(version).approximate_recommendation
140  end
141
142  # Assert that bumping the +unbumped+ version yields the +expected+.
143
144  def assert_bumped_version_equal expected, unbumped
145    assert_version_equal expected, v(unbumped).bump
146  end
147
148  # Assert that +release+ is the correct non-prerelease +version+.
149
150  def assert_release_equal release, version
151    assert_version_equal release, v(version).release
152  end
153
154  # Assert that two versions are equal. Handles strings or
155  # Gem::Version instances.
156
157  def assert_version_equal expected, actual
158    assert_equal v(expected), v(actual)
159  end
160
161  # Assert that two versions are eql?. Checks both directions.
162
163  def assert_version_eql first, second
164    first, second = v(first), v(second)
165    assert first.eql?(second), "#{first} is eql? #{second}"
166    assert second.eql?(first), "#{second} is eql? #{first}"
167  end
168
169  # Refute the assumption that +version+ is a prerelease.
170
171  def refute_prerelease version
172    refute v(version).prerelease?, "#{version} is NOT a prerelease"
173  end
174
175  # Refute the assumption that two versions are eql?. Checks both
176  # directions.
177
178  def refute_version_eql first, second
179    first, second = v(first), v(second)
180    refute first.eql?(second), "#{first} is NOT eql? #{second}"
181    refute second.eql?(first), "#{second} is NOT eql? #{first}"
182  end
183
184  # Refute the assumption that the two versions are equal?.
185
186  def refute_version_equal unexpected, actual
187    refute_equal v(unexpected), v(actual)
188  end
189end
190