1require 'test/unit' 2require_relative 'envutil.rb' 3 4class TestCase < Test::Unit::TestCase 5 def test_case 6 case 5 7 when 1, 2, 3, 4, 6, 7, 8 8 assert(false) 9 when 5 10 assert(true) 11 end 12 13 case 5 14 when 5 15 assert(true) 16 when 1..10 17 assert(false) 18 end 19 20 case 5 21 when 1..10 22 assert(true) 23 else 24 assert(false) 25 end 26 27 case 5 28 when 5 29 assert(true) 30 else 31 assert(false) 32 end 33 34 case "foobar" 35 when /^f.*r$/ 36 assert(true) 37 else 38 assert(false) 39 end 40 41 case 42 when true 43 assert(true) 44 when false, nil 45 assert(false) 46 else 47 assert(false) 48 end 49 50 case "+" 51 when *%w/. +/ 52 assert(true) 53 else 54 assert(false) 55 end 56 57 case 58 when *[], false 59 assert(false) 60 else 61 assert(true) 62 end 63 64 case 65 when *false, [] 66 assert(true) 67 else 68 assert(false) 69 end 70 71 assert_raise(NameError) do 72 case 73 when false, *x, false 74 end 75 end 76 end 77 78 def test_deoptimization 79 assert_in_out_err(['-e', <<-EOS], '', %w[42], []) 80 class Symbol; undef ===; def ===(o); p 42; true; end; end; case :foo; when :foo; end 81 EOS 82 83 assert_in_out_err(['-e', <<-EOS], '', %w[42], []) 84 class Fixnum; undef ===; def ===(o); p 42; true; end; end; case 1; when 1; end 85 EOS 86 end 87 88 def test_optimization 89 case 1 90 when 0.9, 1.1 91 assert(false) 92 when 1.0 93 assert(true) 94 else 95 assert(false) 96 end 97 case 536870912 98 when 536870911.9, 536870912.1 99 assert(false) 100 when 536870912.0 101 assert(true) 102 else 103 assert(false) 104 end 105 end 106end 107