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