| 
									
										
										
										
											2017-02-21 05:37:08 +01:00
										 |  |  | require "compilers" | 
					
						
							|  |  |  | require "software_spec" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe CompilerSelector do | 
					
						
							|  |  |  |   subject { described_class.new(software_spec, versions, compilers) } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-22 16:28:07 +01:00
										 |  |  |   let(:compilers) { [:clang, :gcc, :gnu] } | 
					
						
							| 
									
										
										
										
											2017-02-21 05:37:08 +01:00
										 |  |  |   let(:software_spec) { SoftwareSpec.new } | 
					
						
							|  |  |  |   let(:cc) { :clang } | 
					
						
							|  |  |  |   let(:versions) do | 
					
						
							|  |  |  |     double( | 
					
						
							|  |  |  |       gcc_4_0_build_version: Version::NULL, | 
					
						
							|  |  |  |       gcc_build_version: Version.create("5666"), | 
					
						
							|  |  |  |       llvm_build_version: Version::NULL, | 
					
						
							|  |  |  |       clang_build_version: Version.create("425"), | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  |   before do | 
					
						
							| 
									
										
										
										
											2017-02-21 05:37:08 +01:00
										 |  |  |     allow(versions).to receive(:non_apple_gcc_version) do |name| | 
					
						
							|  |  |  |       case name | 
					
						
							|  |  |  |       when "gcc-4.8" then Version.create("4.8.1") | 
					
						
							|  |  |  |       when "gcc-4.7" then Version.create("4.7.1") | 
					
						
							|  |  |  |       else Version::NULL | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "#compiler" do | 
					
						
							|  |  |  |     it "raises an error if no matching compiler can be found" do | 
					
						
							|  |  |  |       software_spec.fails_with(:clang) | 
					
						
							|  |  |  |       software_spec.fails_with(:gcc) | 
					
						
							|  |  |  |       software_spec.fails_with(gcc: "4.8") | 
					
						
							|  |  |  |       software_spec.fails_with(gcc: "4.7") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect { subject.compiler }.to raise_error(CompilerSelectionError) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "defaults to cc" do | 
					
						
							|  |  |  |       expect(subject.compiler).to eq(cc) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "returns gcc if it fails with clang" do | 
					
						
							|  |  |  |       software_spec.fails_with(:clang) | 
					
						
							|  |  |  |       expect(subject.compiler).to eq(:gcc) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "returns clang if it fails with gcc" do | 
					
						
							|  |  |  |       software_spec.fails_with(:gcc) | 
					
						
							|  |  |  |       expect(subject.compiler).to eq(:clang) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "returns clang if it fails with non-Apple gcc" do | 
					
						
							|  |  |  |       software_spec.fails_with(gcc: "4.8") | 
					
						
							|  |  |  |       expect(subject.compiler).to eq(:clang) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "still returns gcc-4.8 if it fails with gcc without a specific version" do | 
					
						
							|  |  |  |       software_spec.fails_with(:clang) | 
					
						
							|  |  |  |       software_spec.fails_with(:gcc) | 
					
						
							|  |  |  |       expect(subject.compiler).to eq("gcc-4.8") | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "returns gcc if it fails with clang and llvm" do | 
					
						
							|  |  |  |       software_spec.fails_with(:clang) | 
					
						
							|  |  |  |       expect(subject.compiler).to eq(:gcc) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "returns clang if it fails with gcc and llvm" do | 
					
						
							|  |  |  |       software_spec.fails_with(:gcc) | 
					
						
							|  |  |  |       expect(subject.compiler).to eq(:clang) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     example "returns gcc if it fails with a specific gcc version" do | 
					
						
							|  |  |  |       software_spec.fails_with(:clang) | 
					
						
							|  |  |  |       software_spec.fails_with(gcc: "4.8") | 
					
						
							|  |  |  |       expect(subject.compiler).to eq(:gcc) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     example "returns a lower version of gcc if it fails with the highest version" do | 
					
						
							|  |  |  |       software_spec.fails_with(:clang) | 
					
						
							|  |  |  |       software_spec.fails_with(:gcc) | 
					
						
							|  |  |  |       software_spec.fails_with(gcc: "4.8") | 
					
						
							|  |  |  |       expect(subject.compiler).to eq("gcc-4.7") | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "prefers gcc" do | 
					
						
							|  |  |  |       software_spec.fails_with(:clang) | 
					
						
							|  |  |  |       software_spec.fails_with(:gcc) | 
					
						
							|  |  |  |       expect(subject.compiler).to eq("gcc-4.8") | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "raises an error when gcc is missing" do | 
					
						
							|  |  |  |       allow(versions).to receive(:gcc_build_version).and_return(Version::NULL) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       software_spec.fails_with(:clang) | 
					
						
							|  |  |  |       software_spec.fails_with(gcc: "4.8") | 
					
						
							|  |  |  |       software_spec.fails_with(gcc: "4.7") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect { subject.compiler }.to raise_error(CompilerSelectionError) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "raises an error when llvm and gcc are missing" do | 
					
						
							|  |  |  |       allow(versions).to receive(:gcc_build_version).and_return(Version::NULL) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       software_spec.fails_with(:clang) | 
					
						
							|  |  |  |       software_spec.fails_with(gcc: "4.8") | 
					
						
							|  |  |  |       software_spec.fails_with(gcc: "4.7") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect { subject.compiler }.to raise_error(CompilerSelectionError) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |