##
# Bootstrap tests for blocks

assert('BS Block 1') do
  1.times{
    begin
      a = 1
    ensure
      foo = nil
    end
  } == 1
end

assert('BS Block 2') do
  [1,2,3].find{|x| x == 2} == 2
end

assert('BS Block 3') do
  class E
    include Enumerable
    def each(&block)
      [1, 2, 3].each(&block)
    end
  end
  E.new.find {|x| x == 2 } == 2
end

assert('BS Block 3') do
  sum = 0
  for x in [1, 2, 3]
    sum += x
  end
  sum == 6
end

assert('BS Block 4') do
  sum = 0
  for x in (1..5)
    sum += x
  end
  sum == 15
end

assert('BS Block 5') do
  sum = 0
  for x in []
    sum += x
  end
  sum == 0
end

assert('BS Block 6') do
  ans = []
  1.times{
    for n in 1..3
      a = n
      ans << a
    end
  } == 1
end

assert('BS Block 7') do
  ans = []
  for m in 1..3
    for n in 1..3
      a = [m, n]
      ans << a
    end
  end == 1..3
end

assert('BS Block 8') do
  (1..3).to_a == [1, 2, 3]
end

assert('BS Block 9') do
  (1..3).map{|e|
    e * 4
  } == [4, 8, 12]
end

assert('BS Block 10') do
  def m
    yield
  end
  def n
    yield
  end

  m{
    n{
      100
    }
  } == 100
end

assert('BS Block 11') do
  def m
    yield 1
  end

  m{|ib|
    m{|jb|
      i = 20
    }
  } == 20
end

assert('BS Block 12') do
  def m
    yield 1
  end

  m{|ib|
    m{|jb|
      ib = 20
      kb = 2
    }
  } == 2
end

assert('BS Block 13') do
  def iter1
    iter2{
      yield
    }
  end

  def iter2
    yield
  end

  iter1{
    jb = 2
    iter1{
      jb = 3
    }
    jb
  } == 3
end

assert('BS Block 14') do
  def iter1
    iter2{
      yield
    }
  end

  def iter2
    yield
  end

  iter1{
    jb = 2
    iter1{
      jb
    }
    jb
  } == 2
end

assert('BS Block 15') do
  def m
    yield 1
  end
  m{|ib|
    ib*2
  } == 2
end

assert('BS Block 16') do
  def m
    yield 12345, 67890
  end
  m{|ib,jb|
    ib*2+jb
  } == 92580
end

assert('BS Block 17') do
  def iter
    yield 10
  end

  a = nil
  [iter{|a|
    a
  }, a] == [10, nil]
end

assert('BS Block 18') do
  def iter
    yield 10
  end

  iter{|a|
    iter{|a|
      a + 1
    } + a
  } == 21
end

assert('BS Block 19') do
  def iter
    yield 10, 20, 30, 40
  end

  a = b = c = d = nil
  iter{|a, b, c, d|
    [a, b, c, d]
  } + [a, b, c, d] == [10, 20, 30, 40, nil, nil, nil, nil]
end

assert('BS Block 20') do
  def iter
    yield 10, 20, 30, 40
  end

  a = b = nil
  iter{|a, b, c, d|
    [a, b, c, d]
  } + [a, b] == [10, 20, 30, 40, nil, nil]
end

assert('BS Block 21') do
  def iter
    yield 1, 2
  end

  iter{|a, *b|
    [a, b]
  } == [1, [2]]
end

assert('BS Block 22') do
  def iter
    yield 1, 2
  end

  iter{|*a|
    [a]
  } == [[1, 2]]
end

assert('BS Block 23') do
  def iter
    yield 1, 2
  end

  iter{|a, b, *c|
    [a, b, c]
  } == [1, 2, []]
end

assert('BS Block 24') do
  def m
    yield
  end
  m{
    1
  } == 1
end

assert('BS Block 25') do
  def m
    yield 123
  end
  m{|ib|
    m{|jb|
      ib*jb
    }
  } == 15129
end

assert('BS Block 26') do
  def m a
    yield a
  end
  m(1){|ib|
    m(2){|jb|
      ib*jb
    }
  } == 2
end

assert('BS Block 27') do
  sum = 0
  3.times{|ib|
    2.times{|jb|
      sum += ib + jb
    }}
  sum == 9
end

assert('BS Block 28') do
  3.times{|bl|
    break 10
  } == 10
end

assert('BS Block 29') do
  def iter
    yield 1,2,3
  end

  iter{|i, j|
    [i, j]
  } == [1, 2]
end

assert('BS Block 30') do
  def iter
    yield 1
  end

  iter{|i, j|
    [i, j]
  } == [1, nil]
end

assert('BS Block [ruby-dev:31147]') do
  def m
    yield
  end
  m{|&b| b} == nil
end

assert('BS Block [ruby-dev:31160]') do
  def m()
    yield
  end
  m {|(v,(*))|} == nil
end

assert('BS Block 31') do
  def m()
    yield
  end
  m {|((*))|} == nil
end

assert('BS Block [ruby-dev:31440]') do
  def m
    yield [0]
  end
  m{|v, &b| v} == [0]
end

assert('BS Block 32') do
  r = false; 1.times{|&b| r = b}; r.class == NilClass
end

assert('BS Block [ruby-core:14395]') do
  class Controller
    def respond_to(&block)
      responder = Responder.new
      block.call(responder)
      responder.respond
    end
    def test_for_bug
      respond_to{|format|
        format.js{
          "in test"
          render{|obj|
            obj
          }
        }
      }
    end
    def render(&block)
      "in render"
    end
  end

  class Responder
    def method_missing(symbol, &block)
      "enter method_missing"
      @response = Proc.new{
        'in method missing'
        block.call
      }
      "leave method_missing"
    end
    def respond
      @response.call
    end
  end
  t = Controller.new
  t.test_for_bug
end
