brew/Library/Homebrew/test/compiler_selector_spec.rb
Mike McQuaid ba3c46d24f More deprecations.
Deprecate more methods. Internal APIs have been verified to be unused
elsewhere and removed. External APIs have had deprecation methods added.
Existing deprecations have been either upgraded to produce warnings or
no longer deprecated and the reasoning documented.
2017-04-22 16:28:07 +01:00

113 lines
3.3 KiB
Ruby

require "compilers"
require "software_spec"
describe CompilerSelector do
subject { described_class.new(software_spec, versions, compilers) }
let(:compilers) { [:clang, :gcc, :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(: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