diff options
| author | Markus Reiter | 2017-02-21 05:37:08 +0100 | 
|---|---|---|
| committer | Markus Reiter | 2017-02-23 06:25:27 +0100 | 
| commit | ca4fba99c417437aca2efb36cc3c89e871d5f5a0 (patch) | |
| tree | 34023d595390d1d6e478b39bfbfa264ad582e367 /Library/Homebrew/test/compiler_selector_spec.rb | |
| parent | 76ca97b4e73bf54dc98439ac3921cf27383722e2 (diff) | |
| download | brew-ca4fba99c417437aca2efb36cc3c89e871d5f5a0.tar.bz2 | |
Convert CompilerSelector test to spec.
Diffstat (limited to 'Library/Homebrew/test/compiler_selector_spec.rb')
| -rw-r--r-- | Library/Homebrew/test/compiler_selector_spec.rb | 122 | 
1 files changed, 122 insertions, 0 deletions
| diff --git a/Library/Homebrew/test/compiler_selector_spec.rb b/Library/Homebrew/test/compiler_selector_spec.rb new file mode 100644 index 000000000..0f6f6b5f2 --- /dev/null +++ b/Library/Homebrew/test/compiler_selector_spec.rb @@ -0,0 +1,122 @@ +require "compilers" +require "software_spec" + +describe CompilerSelector do +  subject { described_class.new(software_spec, versions, compilers) } +  let(:compilers) { [:clang, :gcc, :llvm, :gnu] } +  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 + +  before(:each) do +    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(:llvm) +      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 llvm" do +      software_spec.fails_with(:llvm) +      expect(subject.compiler).to eq(:clang) +    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) +      software_spec.fails_with(:llvm) +      expect(subject.compiler).to eq(:gcc) +    end + +    it "returns clang if it fails with gcc and llvm" do +      software_spec.fails_with(:gcc) +      software_spec.fails_with(:llvm) +      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(:llvm) +      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(:llvm) +      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 | 
