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
|
require "testing_env"
require "dependency"
class DependencyExpansionTests < Homebrew::TestCase
def build_dep(name, tags = [], deps = [])
dep = Dependency.new(name.to_s, tags)
dep.stubs(:to_formula).returns(stub(:deps => deps, :name => name))
dep
end
def setup
@foo = build_dep(:foo)
@bar = build_dep(:bar)
@baz = build_dep(:baz)
@qux = build_dep(:qux)
@deps = [@foo, @bar, @baz, @qux]
@f = stub(:deps => @deps, :name => "f")
end
def test_expand_yields_dependent_and_dep_pairs
i = 0
Dependency.expand(@f) do |dependent, dep|
assert_equal @f, dependent
assert_equal dep, @deps[i]
i += 1
end
end
def test_expand_no_block
assert_equal @deps, Dependency.expand(@f)
end
def test_expand_prune_all
assert_empty Dependency.expand(@f) { Dependency.prune }
end
def test_expand_selective_pruning
deps = Dependency.expand(@f) do |_, dep|
Dependency.prune if dep.name == "foo"
end
assert_equal [@bar, @baz, @qux], deps
end
def test_expand_preserves_dependency_order
@foo.stubs(:to_formula).returns(stub(:name => "f", :deps => [@qux, @baz]))
assert_equal [@qux, @baz, @foo, @bar], Dependency.expand(@f)
end
def test_expand_skips_optionals_by_default
deps = [build_dep(:foo, [:optional]), @bar, @baz, @qux]
f = stub(:deps => deps, :build => stub(:with? => false), :name => "f")
assert_equal [@bar, @baz, @qux], Dependency.expand(f)
end
def test_expand_keeps_recommendeds_by_default
deps = [build_dep(:foo, [:recommended]), @bar, @baz, @qux]
f = stub(:deps => deps, :build => stub(:with? => true), :name => "f")
assert_equal deps, Dependency.expand(f)
end
def test_merges_repeated_deps_with_differing_options
@foo2 = build_dep(:foo, ["option"])
@baz2 = build_dep(:baz, ["option"])
@deps << @foo2 << @baz2
deps = [@foo2, @bar, @baz2, @qux]
deps.zip(Dependency.expand(@f)) do |expected, actual|
assert_equal expected.tags, actual.tags
assert_equal expected, actual
end
end
def test_merger_preserves_env_proc
env_proc = stub
dep = Dependency.new("foo", [], env_proc)
dep.stubs(:to_formula).returns(stub(:deps => [], :name => "foo"))
@deps.replace [dep]
assert_equal env_proc, Dependency.expand(@f).first.env_proc
end
def test_merged_tags_no_dupes
@foo2 = build_dep(:foo, ["option"])
@foo3 = build_dep(:foo, ["option"])
@deps << @foo2 << @foo3
assert_equal %w[option], Dependency.expand(@f).first.tags
end
def test_skip_skips_parent_but_yields_children
f = stub(
:name => "f",
:deps => [
build_dep(:foo, [], [@bar, @baz]),
build_dep(:foo, [], [@baz]),
]
)
deps = Dependency.expand(f) do |_dependent, dep|
Dependency.skip if %w[foo qux].include? dep.name
end
assert_equal [@bar, @baz], deps
end
def test_keep_dep_but_prune_recursive_deps
foo = build_dep(:foo, [:build], @bar)
baz = build_dep(:baz, [:build])
f = stub(:name => "f", :deps => [foo, baz])
deps = Dependency.expand(f) do |_dependent, dep|
Dependency.keep_but_prune_recursive_deps if dep.build?
end
assert_equal [foo, baz], deps
end
def test_deps_with_collection_argument
assert_equal [@foo, @bar, @baz, @qux], @f.deps
assert_equal [@bar, @baz], Dependency.expand(@f, [@bar, @baz])
end
def test_cyclic_dependency
foo = build_dep(:foo)
bar = build_dep(:bar, [], [foo])
foo.stubs(:to_formula).returns(stub(:deps => [bar], :name => "foo"))
f = stub(:name => "f", :deps => [foo, bar])
assert_nothing_raised { Dependency.expand(f) }
end
def test_clean_expand_stack
foo = build_dep(:foo)
foo.stubs(:to_formula).raises(FormulaUnavailableError, "foo")
f = stub(:name => "f", :deps => [foo])
assert_raises(FormulaUnavailableError) { Dependency.expand(f) }
assert_empty Dependency.instance_variable_get(:@expand_stack)
end
end
|