1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
require "dependency_collector"
describe DependencyCollector do
alias_matcher :be_a_build_requirement, :be_build
def find_dependency(name)
subject.deps.find { |dep| dep.name == name }
end
def find_requirement(klass)
subject.requirements.find { |req| req.is_a? klass }
end
after(:each) do
described_class.clear_cache
end
describe "#add" do
specify "dependency creation" do
subject.add "foo" => :build
subject.add "bar" => ["--universal", :optional]
expect(find_dependency("foo")).to be_an_instance_of(Dependency)
expect(find_dependency("bar").tags.count).to eq(2)
end
it "returns the created dependency" do
expect(subject.add("foo")).to eq(Dependency.new("foo"))
end
specify "requirement creation" do
subject.add :x11
expect(find_requirement(X11Requirement)).to be_an_instance_of(X11Requirement)
end
it "deduplicates requirements" do
2.times { subject.add :x11 }
expect(subject.requirements.count).to eq(1)
end
specify "requirement tags" do
subject.add x11: "2.5.1"
subject.add xcode: :build
expect(find_requirement(X11Requirement).tags).to be_empty
expect(find_requirement(XcodeRequirement)).to be_a_build_requirement
end
specify "x11 without tag" do
subject.add :x11
expect(find_requirement(X11Requirement).tags).to be_empty
end
specify "x11 with (ignored) minimum version" do
subject.add x11: "2.5.1"
expect(find_requirement(X11Requirement).min_version.to_s).to_not eq("2.5.1")
end
specify "x11 with tag" do
subject.add x11: :optional
expect(find_requirement(X11Requirement)).to be_optional
end
specify "x11 with (ignored) minimum version and tag" do
subject.add x11: ["2.5.1", :optional]
dep = find_requirement(X11Requirement)
expect(dep.min_version.to_s).to_not eq("2.5.1")
expect(dep).to be_optional
end
it "doesn't mutate the dependency spec" do
spec = { "foo" => :optional }
copy = spec.dup
subject.add(spec)
expect(spec).to eq(copy)
end
it "creates a resource dependency from a CVS URL" do
resource = Resource.new
resource.url(":pserver:anonymous:@example.com:/cvsroot/foo/bar", using: :cvs)
expect(subject.add(resource)).to eq(Dependency.new("cvs", [:build]))
end
it "creates a resource dependency from a '.7z' URL" do
resource = Resource.new
resource.url("http://example.com/foo.7z")
expect(subject.add(resource)).to eq(Dependency.new("p7zip", [:build]))
end
it "creates a resource dependency from a '.gz' URL" do
resource = Resource.new
resource.url("http://example.com/foo.tar.gz")
expect(subject.add(resource)).to be nil
end
it "creates a resource dependency from a '.lz' URL" do
resource = Resource.new
resource.url("http://example.com/foo.lz")
expect(subject.add(resource)).to eq(Dependency.new("lzip", [:build]))
end
it "creates a resource dependency from a '.lha' URL" do
resource = Resource.new
resource.url("http://example.com/foo.lha")
expect(subject.add(resource)).to eq(Dependency.new("lha", [:build]))
end
it "creates a resource dependency from a '.lzh' URL" do
resource = Resource.new
resource.url("http://example.com/foo.lzh")
expect(subject.add(resource)).to eq(Dependency.new("lha", [:build]))
end
it "creates a resource dependency from a '.rar' URL" do
resource = Resource.new
resource.url("http://example.com/foo.rar")
expect(subject.add(resource)).to eq(Dependency.new("unrar", [:build]))
end
it "raises a TypeError for unknown classes" do
expect { subject.add(Class.new) }.to raise_error(TypeError)
end
it "raises a TypeError for unknown Types" do
expect { subject.add(Object.new) }.to raise_error(TypeError)
end
it "raises a TypeError for a Resource with an unknown download strategy" do
resource = Resource.new
resource.download_strategy = Class.new
expect { subject.add(resource) }.to raise_error(TypeError)
end
it "is deprecated when called with a language module", :needs_compat do
expect(subject).to receive(:odeprecated)
subject.add("lpeg" => :lua)
end
it "is deprecated when called with deprecated requirements", :needs_compat do
expect(subject).to receive(:odeprecated)
subject.add(:python)
end
end
end
|