1require 'rubygems/test_case'
2require "rubygems/requirement"
3
4class TestGemRequirement < Gem::TestCase
5
6  def test_equals2
7    r = req "= 1.2"
8    assert_equal r, r.dup
9    assert_equal r.dup, r
10
11    refute_requirement_equal "= 1.2", "= 1.3"
12    refute_requirement_equal "= 1.3", "= 1.2"
13
14    refute_equal Object.new, req("= 1.2")
15    refute_equal req("= 1.2"), Object.new
16  end
17
18  def test_initialize
19    assert_requirement_equal "= 2", "2"
20    assert_requirement_equal "= 2", ["2"]
21    assert_requirement_equal "= 2", v(2)
22  end
23
24  def test_empty_requirements_is_none
25    r = Gem::Requirement.new
26    assert_equal true, r.none?
27  end
28
29  def test_explicit_default_is_none
30    r = Gem::Requirement.new ">= 0"
31    assert_equal true, r.none?
32  end
33
34  def test_basic_non_none
35    r = Gem::Requirement.new "= 1"
36    assert_equal false, r.none?
37  end
38
39  def test_parse
40    assert_equal ['=', Gem::Version.new(1)], Gem::Requirement.parse('  1')
41    assert_equal ['=', Gem::Version.new(1)], Gem::Requirement.parse('= 1')
42    assert_equal ['>', Gem::Version.new(1)], Gem::Requirement.parse('> 1')
43    assert_equal ['=', Gem::Version.new(1)], Gem::Requirement.parse("=\n1")
44
45    assert_equal ['=', Gem::Version.new(2)],
46      Gem::Requirement.parse(Gem::Version.new('2'))
47  end
48
49  def test_parse_bad
50    [
51      nil,
52      '',
53      '! 1',
54      '= junk',
55      '1..2',
56    ].each do |bad|
57      e = assert_raises Gem::Requirement::BadRequirementError do
58        Gem::Requirement.parse bad
59      end
60
61      assert_equal "Illformed requirement [#{bad.inspect}]", e.message
62    end
63
64    assert_equal Gem::Requirement::BadRequirementError.superclass, ArgumentError
65  end
66
67  def test_prerelease_eh
68    r = req '= 1'
69
70    refute r.prerelease?
71
72    r = req '= 1.a'
73
74    assert r.prerelease?
75
76    r = req '> 1.a', '< 2'
77
78    assert r.prerelease?
79  end
80
81  def test_satisfied_by_eh_bang_equal
82    r = req '!= 1.2'
83
84    assert_satisfied_by "1.1", r
85    refute_satisfied_by "1.2", r
86    assert_satisfied_by "1.3", r
87
88    assert_raises ArgumentError do
89      assert_satisfied_by nil, r
90    end
91  end
92
93  def test_satisfied_by_eh_blank
94    r = req "1.2"
95
96    refute_satisfied_by "1.1", r
97    assert_satisfied_by "1.2", r
98    refute_satisfied_by "1.3", r
99
100    assert_raises ArgumentError do
101      assert_satisfied_by nil, r
102    end
103  end
104
105  def test_satisfied_by_eh_equal
106    r = req "= 1.2"
107
108    refute_satisfied_by "1.1", r
109    assert_satisfied_by "1.2", r
110    refute_satisfied_by "1.3", r
111
112    assert_raises ArgumentError do
113      assert_satisfied_by nil, r
114    end
115  end
116
117  def test_satisfied_by_eh_gt
118    r = req "> 1.2"
119
120    refute_satisfied_by "1.1", r
121    refute_satisfied_by "1.2", r
122    assert_satisfied_by "1.3", r
123
124    assert_raises ArgumentError do
125      r.satisfied_by? nil
126    end
127  end
128
129  def test_satisfied_by_eh_gte
130    r = req ">= 1.2"
131
132    refute_satisfied_by "1.1", r
133    assert_satisfied_by "1.2", r
134    assert_satisfied_by "1.3", r
135
136    assert_raises ArgumentError do
137      r.satisfied_by? nil
138    end
139  end
140
141  def test_satisfied_by_eh_list
142    r = req "> 1.1", "< 1.3"
143
144    refute_satisfied_by "1.1", r
145    assert_satisfied_by "1.2", r
146    refute_satisfied_by "1.3", r
147
148    assert_raises ArgumentError do
149      r.satisfied_by? nil
150    end
151  end
152
153  def test_satisfied_by_eh_lt
154    r = req "< 1.2"
155
156    assert_satisfied_by "1.1", r
157    refute_satisfied_by "1.2", r
158    refute_satisfied_by "1.3", r
159
160    assert_raises ArgumentError do
161      r.satisfied_by? nil
162    end
163  end
164
165  def test_satisfied_by_eh_lte
166    r = req "<= 1.2"
167
168    assert_satisfied_by "1.1", r
169    assert_satisfied_by "1.2", r
170    refute_satisfied_by "1.3", r
171
172    assert_raises ArgumentError do
173      r.satisfied_by? nil
174    end
175  end
176
177  def test_satisfied_by_eh_tilde_gt
178    r = req "~> 1.2"
179
180    refute_satisfied_by "1.1", r
181    assert_satisfied_by "1.2", r
182    assert_satisfied_by "1.3", r
183
184    assert_raises ArgumentError do
185      r.satisfied_by? nil
186    end
187  end
188
189  def test_satisfied_by_eh_good
190    assert_satisfied_by "0.2.33",      "= 0.2.33"
191    assert_satisfied_by "0.2.34",      "> 0.2.33"
192    assert_satisfied_by "1.0",         "= 1.0"
193    assert_satisfied_by "1.0",         "1.0"
194    assert_satisfied_by "1.8.2",       "> 1.8.0"
195    assert_satisfied_by "1.112",       "> 1.111"
196    assert_satisfied_by "0.2",         "> 0.0.0"
197    assert_satisfied_by "0.0.0.0.0.2", "> 0.0.0"
198    assert_satisfied_by "0.0.1.0",     "> 0.0.0.1"
199    assert_satisfied_by "10.3.2",      "> 9.3.2"
200    assert_satisfied_by "1.0.0.0",     "= 1.0"
201    assert_satisfied_by "10.3.2",      "!= 9.3.4"
202    assert_satisfied_by "10.3.2",      "> 9.3.2"
203    assert_satisfied_by "10.3.2",      "> 9.3.2"
204    assert_satisfied_by " 9.3.2",      ">= 9.3.2"
205    assert_satisfied_by "9.3.2 ",      ">= 9.3.2"
206    assert_satisfied_by "",            "= 0"
207    assert_satisfied_by "",            "< 0.1"
208    assert_satisfied_by "  ",          "< 0.1 "
209    assert_satisfied_by "",            " <  0.1"
210    assert_satisfied_by "  ",          "> 0.a "
211    assert_satisfied_by "",            " >  0.a"
212    assert_satisfied_by "3.1",         "< 3.2.rc1"
213
214    assert_satisfied_by "3.2.0",       "> 3.2.0.rc1"
215    assert_satisfied_by "3.2.0.rc2",   "> 3.2.0.rc1"
216
217    assert_satisfied_by "3.0.rc2",     "< 3.0"
218    assert_satisfied_by "3.0.rc2",     "< 3.0.0"
219    assert_satisfied_by "3.0.rc2",     "< 3.0.1"
220
221    assert_satisfied_by "3.0.rc2",     "> 0"
222  end
223
224  def test_illformed_requirements
225    [ ">>> 1.3.5", "> blah" ].each do |rq|
226      assert_raises Gem::Requirement::BadRequirementError, "req [#{rq}] should fail" do
227        Gem::Requirement.new rq
228      end
229    end
230  end
231
232  def test_satisfied_by_eh_non_versions
233    assert_raises ArgumentError do
234      req(">= 0").satisfied_by? Object.new
235    end
236
237    assert_raises ArgumentError do
238      req(">= 0").satisfied_by? Gem::Requirement.default
239    end
240  end
241
242  def test_satisfied_by_eh_boxed
243    refute_satisfied_by "1.3",     "~> 1.4"
244    assert_satisfied_by "1.4",     "~> 1.4"
245    assert_satisfied_by "1.5",     "~> 1.4"
246    refute_satisfied_by "2.0",     "~> 1.4"
247
248    refute_satisfied_by "1.3",     "~> 1.4.4"
249    refute_satisfied_by "1.4",     "~> 1.4.4"
250    assert_satisfied_by "1.4.4",   "~> 1.4.4"
251    assert_satisfied_by "1.4.5",   "~> 1.4.4"
252    refute_satisfied_by "1.5",     "~> 1.4.4"
253    refute_satisfied_by "2.0",     "~> 1.4.4"
254
255    refute_satisfied_by "1.1.pre", "~> 1.0.0"
256    refute_satisfied_by "1.1.pre", "~> 1.1"
257    refute_satisfied_by "2.0.a",   "~> 1.0"
258    refute_satisfied_by "2.0.a",   "~> 2.0"
259  end
260
261  def test_satisfied_by_eh_multiple
262    req = [">= 1.4", "<= 1.6", "!= 1.5"]
263
264    refute_satisfied_by "1.3", req
265    assert_satisfied_by "1.4", req
266    refute_satisfied_by "1.5", req
267    assert_satisfied_by "1.6", req
268    refute_satisfied_by "1.7", req
269    refute_satisfied_by "2.0", req
270  end
271
272  def test_satisfied_by_boxed
273    refute_satisfied_by "1.3",   "~> 1.4"
274    assert_satisfied_by "1.4",   "~> 1.4"
275    assert_satisfied_by "1.5",   "~> 1.4"
276    refute_satisfied_by "2.0",   "~> 1.4"
277
278    refute_satisfied_by "1.3",   "~> 1.4.4"
279    refute_satisfied_by "1.4",   "~> 1.4.4"
280    assert_satisfied_by "1.4.4", "~> 1.4.4"
281    assert_satisfied_by "1.4.5", "~> 1.4.4"
282    refute_satisfied_by "1.5",   "~> 1.4.4"
283    refute_satisfied_by "2.0",   "~> 1.4.4"
284  end
285
286  def test_specific
287    refute req('> 1') .specific?
288    refute req('>= 1').specific?
289
290    assert req('!= 1').specific?
291    assert req('< 1') .specific?
292    assert req('<= 1').specific?
293    assert req('= 1') .specific?
294    assert req('~> 1').specific?
295
296    assert req('> 1', '> 2').specific? # GIGO
297  end
298
299  def test_bad
300    refute_satisfied_by "",            "> 0.1"
301    refute_satisfied_by "1.2.3",       "!= 1.2.3"
302    refute_satisfied_by "1.2.003.0.0", "!= 1.02.3"
303    refute_satisfied_by "4.5.6",       "< 1.2.3"
304    refute_satisfied_by "1.0",         "> 1.1"
305    refute_satisfied_by "",            "= 0.1"
306    refute_satisfied_by "1.1.1",       "> 1.1.1"
307    refute_satisfied_by "1.2",         "= 1.1"
308    refute_satisfied_by "1.40",        "= 1.1"
309    refute_satisfied_by "1.3",         "= 1.40"
310    refute_satisfied_by "9.3.3",       "<= 9.3.2"
311    refute_satisfied_by "9.3.1",       ">= 9.3.2"
312    refute_satisfied_by "9.3.03",      "<= 9.3.2"
313    refute_satisfied_by "1.0.0.1",     "= 1.0"
314  end
315
316  # Assert that two requirements are equal. Handles Gem::Requirements,
317  # strings, arrays, numbers, and versions.
318
319  def assert_requirement_equal expected, actual
320    assert_equal req(expected), req(actual)
321  end
322
323  # Assert that +version+ satisfies +requirement+.
324
325  def assert_satisfied_by version, requirement
326    assert req(requirement).satisfied_by?(v(version)),
327      "#{requirement} is satisfied by #{version}"
328  end
329
330  # Refute the assumption that two requirements are equal.
331
332  def refute_requirement_equal unexpected, actual
333    refute_equal req(unexpected), req(actual)
334  end
335
336  # Refute the assumption that +version+ satisfies +requirement+.
337
338  def refute_satisfied_by version, requirement
339    refute req(requirement).satisfied_by?(v(version)),
340      "#{requirement} is not satisfied by #{version}"
341  end
342end
343