require 'testing_env' require 'compilers' require 'software_spec' class CompilerSelectorTests < Homebrew::TestCase class Double < SoftwareSpec def <<(cc) fails_with(cc) self end end class CompilerVersions attr_accessor :gcc_4_0_build_version, :gcc_build_version, :llvm_build_version, :clang_build_version def initialize(versions={}) { :gcc_4_0_build_version => nil, :gcc_build_version => 5666, :llvm_build_version => 2336, :clang_build_version => 425, }.merge(versions).each { |k, v| instance_variable_set("@#{k}", v) } end def non_apple_gcc_version(name) name == "gcc-4.8" ? "4.8.1" : nil end end def setup @f = Double.new @cc = :clang @versions = CompilerVersions.new end def actual_cc CompilerSelector.new(@f, @versions).compiler end def test_all_compiler_failures @f << :clang << :llvm << :gcc << { :gcc => "4.8" } assert_raises(CompilerSelectionError) { actual_cc } end def test_no_compiler_failures assert_equal @cc, actual_cc end def test_fails_with_clang @f << :clang assert_equal :gcc, actual_cc end def test_fails_with_llvm @f << :llvm assert_equal :clang, actual_cc end def test_fails_with_gcc @f << :gcc assert_equal :clang, actual_cc end def test_fails_with_non_apple_gcc @f << { :gcc => "4.8" } assert_equal :clang, actual_cc end def test_mixed_failures_1 @f << :clang << :llvm assert_equal :gcc, actual_cc end def test_mixed_failures_2 @f << :gcc << :clang << { :gcc => "4.8" } assert_equal :llvm, actual_cc end def test_mixed_failures_3 @f << :llvm << :gcc assert_equal :clang, actual_cc end def test_mixed_failures_4 @f << :clang << { :gcc => "4.8" } assert_equal :gcc, actual_cc end def test_older_clang_precedence @versions.clang_build_version = 211 @f << :gcc << { :gcc => "4.8" } assert_equal :llvm, actual_cc end def test_llvm_precedence @f << :clang << :gcc assert_equal :llvm, actual_cc end def test_missing_gcc @versions.gcc_build_version = nil @f << :clang << :llvm << { :gcc => "4.8" } assert_raises(CompilerSelectionError) { actual_cc } end def test_missing_llvm_and_gcc @versions.gcc_build_version = @versions.llvm_build_version = nil @f << :clang << { :gcc => "4.8" } assert_raises(CompilerSelectionError) { actual_cc } end end