1require 'rubygems/test_case'
2require 'rubygems/dependency'
3
4class TestGemDependency < Gem::TestCase
5  def test_initialize
6    d = dep "pkg", "> 1.0"
7
8    assert_equal "pkg", d.name
9    assert_equal req("> 1.0"), d.requirement
10  end
11
12  def test_initialize_type_bad
13    e = assert_raises ArgumentError do
14      Gem::Dependency.new 'monkey' => '1.0'
15    end
16
17    assert_equal 'dependency name must be a String, was {"monkey"=>"1.0"}',
18                 e.message
19  end
20
21  def test_initialize_double
22    d = dep "pkg", "> 1.0", "< 2.0"
23    assert_equal req("> 1.0", "< 2.0"), d.requirement
24  end
25
26  def test_initialize_empty
27    d = dep "pkg"
28    assert_equal req(">= 0"), d.requirement
29  end
30
31  def test_initialize_type
32    assert_equal :runtime, dep("pkg").type
33    assert_equal :development, dep("pkg", [], :development).type
34
35    assert_raises ArgumentError do
36      dep "pkg", :sometimes
37    end
38  end
39
40  def test_initialize_version
41    d = dep "pkg", v("2")
42    assert_equal req("= 2"), d.requirement
43  end
44
45  def test_equals2
46    o  = dep "other"
47    d  = dep "pkg", "> 1.0"
48    d1 = dep "pkg", "> 1.1"
49
50    assert_equal d, d.dup
51    assert_equal d.dup, d
52
53    refute_equal d, d1
54    refute_equal d1, d
55
56    refute_equal d, o
57    refute_equal o, d
58
59    refute_equal d, Object.new
60    refute_equal Object.new, d
61  end
62
63  def test_equals2_type
64    refute_equal dep("pkg", :runtime), dep("pkg", :development)
65  end
66
67  def test_equals_tilde
68    d = dep "a", "0"
69
70    assert_match d,                  d,             "match self"
71    assert_match dep("a", ">= 0"),   d,             "match version exact"
72    assert_match dep("a", ">= 0"),   dep("a", "1"), "match version"
73    refute_match dep("a"), Object.new
74
75    Gem::Deprecate.skip_during do
76      assert_match dep(/a/, ">= 0"),   d,             "match simple regexp"
77      assert_match dep(/a|b/, ">= 0"), d,             "match scary regexp"
78      refute_match dep(/a/), dep("b")
79    end
80  end
81
82  def test_equals_tilde_escape
83    refute_match dep("a|b"), dep("a", "1")
84    Gem::Deprecate.skip_during do
85      assert_match dep(/a|b/), dep("a", "1")
86    end
87  end
88
89  def test_equals_tilde_object
90    o = Object.new
91    def o.name    ; 'a' end
92    def o.version ; '0' end
93
94    assert_match dep("a"), o
95  end
96
97  def test_equals_tilde_spec
98    assert_match dep("a", ">= 0"),   spec("a", "0")
99    assert_match dep("a", "1"),      spec("a", "1")
100    Gem::Deprecate.skip_during do
101      assert_match dep(/a/, ">= 0"),   spec("a", "0")
102      assert_match dep(/a|b/, ">= 0"), spec("b", "0")
103      refute_match dep(/a/, ">= 0"),   spec("b", "0")
104    end
105  end
106
107  def test_hash
108    d = dep "pkg", "1.0"
109
110    assert_equal d.hash, d.dup.hash
111    assert_equal d.dup.hash, d.hash
112
113    refute_equal dep("pkg", "1.0").hash,   dep("pkg", "2.0").hash, "requirement"
114    refute_equal dep("pkg", "1.0").hash,   dep("abc", "1.0").hash, "name"
115    refute_equal dep("pkg", :development), dep("pkg", :runtime), "type"
116  end
117
118  def test_merge
119    a1 = dep 'a', '~> 1.0'
120    a2 = dep 'a', '= 1.0'
121
122    a3 = a1.merge a2
123
124    assert_equal dep('a', '~> 1.0', '= 1.0'), a3
125  end
126
127  def test_merge_default
128    a1 = dep 'a'
129    a2 = dep 'a', '1'
130
131    a3 = a1.merge a2
132
133    assert_equal dep('a', '1'), a3
134  end
135
136  def test_merge_name_mismatch
137    a = dep 'a'
138    b = dep 'b'
139
140    e = assert_raises ArgumentError do
141      a.merge b
142    end
143
144    assert_equal 'a (>= 0) and b (>= 0) have different names',
145                 e.message
146  end
147
148  def test_merge_other_default
149    a1 = dep 'a', '1'
150    a2 = dep 'a'
151
152    a3 = a1.merge a2
153
154    assert_equal dep('a', '1'), a3
155  end
156
157  def test_prerelease_eh
158    d = dep "pkg", "= 1"
159
160    refute d.prerelease?
161
162    d.prerelease = true
163
164    assert d.prerelease?
165
166    d = dep "pkg", "= 1.a"
167
168    assert d.prerelease?
169
170    d.prerelease = false
171
172    assert d.prerelease?
173
174    d = dep "pkg", "> 1.a", "> 2"
175
176    assert d.prerelease?
177  end
178
179  def test_specific
180    refute dep('a', '> 1').specific?
181
182    assert dep('a', '= 1').specific?
183  end
184
185  def test_to_specs_suggests_other_versions
186    a = util_spec 'a', '1.0', 'b' => '>= 1.0'
187
188    a_file = File.join a.gem_dir, 'lib', 'a_file.rb'
189
190    write_file a_file do |io|
191      io.puts '# a_file.rb'
192    end
193
194    dep = Gem::Dependency.new "a", "= 2.0"
195
196    e = assert_raises Gem::LoadError do
197      dep.to_specs
198    end
199
200    assert_equal "Could not find 'a' (= 2.0) - did find: [a-1.0]", e.message
201  end
202
203  def test_to_specs_indicates_total_gem_set_size
204    a = util_spec 'a', '1.0', 'b' => '>= 1.0'
205
206    a_file = File.join a.gem_dir, 'lib', 'a_file.rb'
207
208    write_file a_file do |io|
209      io.puts '# a_file.rb'
210    end
211
212    dep = Gem::Dependency.new "b", "= 2.0"
213
214    e = assert_raises Gem::LoadError do
215      dep.to_specs
216    end
217
218    assert_equal "Could not find 'b' (= 2.0) among 1 total gem(s)", e.message
219  end
220
221
222end
223
224