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