126 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require 'testing_env'
 | |
| require 'compilers'
 | |
| 
 | |
| class CompilerSelectorTests < Homebrew::TestCase
 | |
|   class Double
 | |
|     attr_reader :name
 | |
| 
 | |
|     def initialize
 | |
|       @failures = []
 | |
|       @name = "double"
 | |
|     end
 | |
| 
 | |
|     def <<(cc)
 | |
|       @failures << cc
 | |
|     end
 | |
| 
 | |
|     def fails_with?(cc)
 | |
|       return false if cc.nil?
 | |
|       @failures.include?(cc.name)
 | |
|     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 = CompilerVersions.new(: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 = CompilerVersions.new( :gcc_build_version => nil)
 | |
|     @f << :clang << :llvm << 'gcc-4.8'
 | |
|     assert_raises(CompilerSelectionError) { actual_cc }
 | |
|   end
 | |
| 
 | |
|   def test_missing_llvm_and_gcc
 | |
|     @versions = CompilerVersions.new(
 | |
|       :gcc_build_version => nil,
 | |
|       :llvm_build_version => nil
 | |
|     )
 | |
|     @f << :clang << 'gcc-4.8'
 | |
|     assert_raises(CompilerSelectionError) { actual_cc }
 | |
|   end
 | |
| end
 | 
