| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  | require "testing_env" | 
					
						
							|  |  |  | require "dependency" | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-18 20:32:51 -05:00
										 |  |  | class DependencyExpansionTests < Homebrew::TestCase | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def build_dep(name, tags = [], deps = []) | 
					
						
							| 
									
										
										
										
											2013-06-07 22:27:30 -05:00
										 |  |  |     dep = Dependency.new(name.to_s, tags) | 
					
						
							| 
									
										
										
										
											2014-02-27 14:22:42 -06:00
										 |  |  |     dep.stubs(:to_formula).returns(stub(:deps => deps, :name => name)) | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |     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] | 
					
						
							| 
									
										
										
										
											2014-02-27 14:22:42 -06:00
										 |  |  |     @f    = stub(:deps => @deps, :name => "f") | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |   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| | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       Dependency.prune if dep.name == "foo" | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert_equal [@bar, @baz, @qux], deps | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def test_expand_preserves_dependency_order | 
					
						
							| 
									
										
										
										
											2014-02-27 14:22:42 -06:00
										 |  |  |     @foo.stubs(:to_formula).returns(stub(:name => "f", :deps => [@qux, @baz])) | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |     assert_equal [@qux, @baz, @foo, @bar], Dependency.expand(@f) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def test_expand_skips_optionals_by_default | 
					
						
							| 
									
										
										
										
											2015-12-15 10:27:19 +01:00
										 |  |  |     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) | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def test_expand_keeps_recommendeds_by_default | 
					
						
							| 
									
										
										
										
											2015-12-15 10:27:19 +01:00
										 |  |  |     deps = [build_dep(:foo, [:recommended]), @bar, @baz, @qux] | 
					
						
							|  |  |  |     f = stub(:deps => deps, :build => stub(:with? => true), :name => "f") | 
					
						
							|  |  |  |     assert_equal deps, Dependency.expand(f) | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-06-07 22:27:30 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def test_merges_repeated_deps_with_differing_options | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     @foo2 = build_dep(:foo, ["option"]) | 
					
						
							|  |  |  |     @baz2 = build_dep(:baz, ["option"]) | 
					
						
							| 
									
										
										
										
											2013-06-07 22:27:30 -05:00
										 |  |  |     @deps << @foo2 << @baz2 | 
					
						
							|  |  |  |     deps = [@foo2, @bar, @baz2, @qux] | 
					
						
							| 
									
										
										
										
											2013-06-24 08:52:41 -05:00
										 |  |  |     deps.zip(Dependency.expand(@f)) do |expected, actual| | 
					
						
							|  |  |  |       assert_equal expected.tags, actual.tags | 
					
						
							|  |  |  |       assert_equal expected, actual | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-06-07 22:27:30 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-06-24 08:52:41 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def test_merger_preserves_env_proc | 
					
						
							| 
									
										
										
										
											2014-02-27 14:22:43 -06:00
										 |  |  |     env_proc = stub | 
					
						
							|  |  |  |     dep = Dependency.new("foo", [], env_proc) | 
					
						
							| 
									
										
										
										
											2016-01-18 08:59:43 +00:00
										 |  |  |     dep.stubs(:to_formula).returns(stub(:deps => [], :name => "foo")) | 
					
						
							| 
									
										
										
										
											2014-02-27 14:22:43 -06:00
										 |  |  |     @deps.replace [dep] | 
					
						
							| 
									
										
										
										
											2013-06-24 08:52:41 -05:00
										 |  |  |     assert_equal env_proc, Dependency.expand(@f).first.env_proc | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-06-25 10:12:14 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def test_merged_tags_no_dupes | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     @foo2 = build_dep(:foo, ["option"]) | 
					
						
							|  |  |  |     @foo3 = build_dep(:foo, ["option"]) | 
					
						
							| 
									
										
										
										
											2013-06-25 10:12:14 -05:00
										 |  |  |     @deps << @foo2 << @foo3 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     assert_equal %w[option], Dependency.expand(@f).first.tags | 
					
						
							| 
									
										
										
										
											2013-06-25 10:12:14 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-07-22 21:36:11 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def test_skip_skips_parent_but_yields_children | 
					
						
							| 
									
										
										
										
											2014-02-27 14:22:42 -06:00
										 |  |  |     f = stub(:name => "f", :deps => [ | 
					
						
							| 
									
										
										
										
											2013-07-22 21:36:11 -05:00
										 |  |  |       build_dep(:foo, [], [@bar, @baz]), | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       build_dep(:foo, [], [@baz]) | 
					
						
							| 
									
										
										
										
											2013-07-22 21:36:11 -05:00
										 |  |  |     ]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     deps = Dependency.expand(f) do |_dependent, dep| | 
					
						
							|  |  |  |       Dependency.skip if %w[foo qux].include? dep.name | 
					
						
							| 
									
										
										
										
											2013-07-22 21:36:11 -05:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert_equal [@bar, @baz], deps | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-11-13 10:38:14 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def test_keep_dep_but_prune_recursive_deps | 
					
						
							| 
									
										
										
										
											2014-11-21 16:08:37 -06:00
										 |  |  |     foo = build_dep(:foo, [:build], @bar) | 
					
						
							|  |  |  |     baz = build_dep(:baz, [:build]) | 
					
						
							|  |  |  |     f = stub(:name => "f", :deps => [foo, baz]) | 
					
						
							| 
									
										
										
										
											2013-11-13 10:38:14 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     deps = Dependency.expand(f) do |_dependent, dep| | 
					
						
							| 
									
										
										
										
											2013-11-13 10:38:14 -06:00
										 |  |  |       Dependency.keep_but_prune_recursive_deps if dep.build? | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-21 16:08:37 -06:00
										 |  |  |     assert_equal [foo, baz], deps | 
					
						
							| 
									
										
										
										
											2013-11-13 10:38:14 -06:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-12-09 14:36:10 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def test_deps_with_collection_argument | 
					
						
							|  |  |  |     assert_equal [@foo, @bar, @baz, @qux], @f.deps | 
					
						
							|  |  |  |     assert_equal [@bar, @baz], Dependency.expand(@f, [@bar, @baz]) | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-02-06 14:14:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   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 | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  | end |