100 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			100 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
|   | # typed: false | ||
|  | # frozen_string_literal: true | ||
|  | 
 | ||
|  | require "utils/topological_hash" | ||
|  | 
 | ||
|  | describe Utils::TopologicalHash do | ||
|  |   describe "#tsort" do | ||
|  |     it "returns a topologically sorted array" do | ||
|  |       hash = described_class.new | ||
|  |       hash[1] = [2, 3] | ||
|  |       hash[2] = [3] | ||
|  |       hash[3] = [] | ||
|  |       hash[4] = [] | ||
|  |       expect(hash.tsort).to eq [3, 2, 1, 4] | ||
|  |     end | ||
|  |   end | ||
|  | 
 | ||
|  |   describe "#strongly_connected_components" do | ||
|  |     it "returns an array of arrays" do | ||
|  |       hash = described_class.new | ||
|  |       hash[1] = [2] | ||
|  |       hash[2] = [3, 4] | ||
|  |       hash[3] = [2] | ||
|  |       hash[4] = [] | ||
|  |       expect(hash.strongly_connected_components).to eq [[4], [2, 3], [1]] | ||
|  |     end | ||
|  |   end | ||
|  | 
 | ||
|  |   describe "::graph_package_dependencies" do | ||
|  |     it "returns a topological hash" do | ||
|  |       formula1 = formula "homebrew-test-formula1" do | ||
|  |         url "foo" | ||
|  |         version "0.5" | ||
|  |       end | ||
|  | 
 | ||
|  |       formula2 = formula "homebrew-test-formula2" do | ||
|  |         url "foo" | ||
|  |         version "0.5" | ||
|  |         depends_on "homebrew-test-formula1" | ||
|  |       end | ||
|  | 
 | ||
|  |       formula3 = formula "homebrew-test-formula3" do | ||
|  |         url "foo" | ||
|  |         version "0.5" | ||
|  |         depends_on "homebrew-test-formula4" | ||
|  |       end | ||
|  | 
 | ||
|  |       formula4 = formula "homebrew-test-formula4" do | ||
|  |         url "foo" | ||
|  |         version "0.5" | ||
|  |         depends_on "homebrew-test-formula3" | ||
|  |       end | ||
|  | 
 | ||
|  |       cask1 = Cask::Cask.new("homebrew-test-cask1") do | ||
|  |         url "foo" | ||
|  |         version "1.2.3" | ||
|  |       end | ||
|  | 
 | ||
|  |       cask2 = Cask::Cask.new("homebrew-test-cask2") do | ||
|  |         url "foo" | ||
|  |         version "1.2.3" | ||
|  |         depends_on cask: "homebrew-test-cask1" | ||
|  |         depends_on formula: "homebrew-test-formula1" | ||
|  |       end | ||
|  | 
 | ||
|  |       cask3 = Cask::Cask.new("homebrew-test-cask3") do | ||
|  |         url "foo" | ||
|  |         version "1.2.3" | ||
|  |         depends_on cask: "homebrew-test-cask2" | ||
|  |       end | ||
|  | 
 | ||
|  |       stub_formula_loader formula1 | ||
|  |       stub_formula_loader formula2 | ||
|  |       stub_formula_loader formula3 | ||
|  |       stub_formula_loader formula4 | ||
|  | 
 | ||
|  |       stub_cask_loader cask1 | ||
|  |       stub_cask_loader cask2 | ||
|  |       stub_cask_loader cask3 | ||
|  | 
 | ||
|  |       packages = [formula1, formula2, formula3, formula4, cask1, cask2, cask3] | ||
|  |       expect(described_class.graph_package_dependencies(packages)).to eq({ | ||
|  |         formula1 => [], | ||
|  |         formula2 => [formula1], | ||
|  |         formula3 => [formula4], | ||
|  |         formula4 => [formula3], | ||
|  |         cask1    => [], | ||
|  |         cask2    => [formula1, cask1], | ||
|  |         cask3    => [cask2], | ||
|  |       }) | ||
|  | 
 | ||
|  |       sorted = [formula1, cask1, cask2, cask3, formula2] | ||
|  |       expect(described_class.graph_package_dependencies([cask3, cask2, cask1, formula2, formula1]).tsort).to eq sorted | ||
|  |       expect(described_class.graph_package_dependencies([cask3, formula2]).tsort).to eq sorted | ||
|  | 
 | ||
|  |       expect { described_class.graph_package_dependencies([formula3, formula4]).tsort }.to raise_error TSort::Cyclic | ||
|  |     end | ||
|  |   end | ||
|  | end |