##
# Kernel ISO Test

assert('Kernel', '15.3.1') do
  Kernel.class == Module
end

assert('Kernel.block_given?', '15.3.1.2.2') do
  def bg_try(&b)
    if Kernel.block_given?
      yield
    else
      "no block"
    end
  end

  (Kernel.block_given? == false) and
    # test without block
    (bg_try == "no block") and
    # test with block
    ((bg_try { "block" }) == "block") and
    # test with block
    ((bg_try do "block" end) == "block")
end

assert('Kernel.global_variables', '15.3.1.2.4') do
  Kernel.global_variables.class == Array
end

assert('Kernel.iterator?', '15.3.1.2.5') do
  Kernel.iterator? == false
end

assert('Kernel.lambda', '15.3.1.2.6') do
  l = Kernel.lambda do
    true
  end

  l.call and l.class == Proc
end

# Not implemented at the moment
#assert('Kernel.local_variables', '15.3.1.2.7') do
#  Kernel.local_variables.class == Array
#end

assert('Kernel.loop', '15.3.1.2.8') do
  i = 0

  Kernel.loop do
    i += 1
    break if i == 100
  end

  i == 100
end

assert('Kernel.p', '15.3.1.2.9') do
  # TODO search for a way to test p to stdio
  true
end

assert('Kernel.print', '15.3.1.2.10') do
  # TODO search for a way to test print to stdio
  true
end

assert('Kernel.puts', '15.3.1.2.11') do
  # TODO search for a way to test puts to stdio
  true
end

assert('Kernel.raise', '15.3.1.2.12') do
  e_list = []

  begin
    Kernel.raise
  rescue => e
    e_list << e
  end

  begin
    Kernel.raise RuntimeError.new
  rescue => e
    e_list << e
  end

  # result without argument
  e_list[0].class == RuntimeError and
    # result with RuntimeError argument
    e_list[1].class == RuntimeError
end

assert('Kernel#__id__', '15.3.1.3.3') do
  __id__.class == Fixnum
end

assert('Kernel#__send__', '15.3.1.3.4') do
  # test with block
  l = __send__(:lambda) do
    true
  end
 
  l.call and l.class == Proc and
    # test with argument
    __send__(:respond_to?, :nil?) and
    # test without argument and without block
    __send__(:public_methods).class == Array
end

assert('Kernel#block_given?', '15.3.1.3.6') do
  def bg_try(&b)
    if block_given?
      yield
    else
      "no block"
    end
  end

  (block_given? == false) and
    (bg_try == "no block") and
    ((bg_try { "block" }) == "block") and
    ((bg_try do "block" end) == "block")
end

assert('Kernel#class', '15.3.1.3.7') do
  Kernel.class == Module
end

assert('Kernel#clone', '15.3.1.3.8') do
  class KernelCloneTest
    def initialize
      @v = 0
    end

    def get
      @v
    end

    def set(v)
      @v = v
    end
  end

  a = KernelCloneTest.new
  a.set(1)
  b = a.clone

  def a.test
  end
  a.set(2)
  c = a.clone

  a.get == 2 and b.get == 1 and c.get == 2 &&
    a.respond_to?(:test) == true and
    b.respond_to?(:test) == false and
    c.respond_to?(:test) == true
end

assert('Kernel#dup', '15.3.1.3.9') do
  class KernelDupTest
    def initialize
      @v = 0
    end

    def get
      @v
    end

    def set(v)
      @v = v
    end
  end

  a = KernelDupTest.new
  a.set(1)
  b = a.dup

  def a.test
  end
  a.set(2)
  c = a.dup

  a.get == 2 and b.get == 1 and c.get == 2 and
    a.respond_to?(:test) == true and
    b.respond_to?(:test) == false and
    c.respond_to?(:test) == false
end

assert('Kernel#global_variables', '15.3.1.3.14') do
  global_variables.class == Array
end

assert('Kernel#hash', '15.3.1.3.15') do
  hash == hash
end

assert('Kernel#inspect', '15.3.1.3.17') do
  inspect.class == String
end

assert('Kernel#instance_variables', '15.3.1.3.23') do
  instance_variables.class == Array
end

assert('Kernel#is_a?', '15.3.1.3.24') do
  is_a?(Kernel) and not is_a?(Array)
end

assert('Kernel#iterator?', '15.3.1.3.25') do
  iterator? == false
end

assert('Kernel#kind_of?', '15.3.1.3.26') do
  kind_of?(Kernel) and not kind_of?(Array)
end

assert('Kernel#lambda', '15.3.1.3.27') do
  l = lambda do
    true
  end

  l.call and l.class == Proc
end

# Not implemented yet
#assert('Kernel#local_variables', '15.3.1.3.28') do
#  local_variables.class == Array
#end

assert('Kernel#loop', '15.3.1.3.29') do
  i = 0

  loop do
    i += 1
    break if i == 100
  end

  i == 100
end

assert('Kernel#methods', '15.3.1.3.31') do
  methods.class == Array
end

assert('Kernel#nil?', '15.3.1.3.32') do
  nil.nil? == true
end

assert('Kernel#object_id', '15.3.1.3.33') do
  object_id.class == Fixnum
end

assert('Kernel#private_methods', '15.3.1.3.36') do
  private_methods.class == Array
end

assert('Kernel#protected_methods', '15.3.1.3.37') do
  protected_methods.class == Array
end

assert('Kernel#public_methods', '15.3.1.3.38') do
  public_methods.class == Array
end

assert('Kernel#raise', '15.3.1.3.40') do
  e_list = []

  begin
    raise
  rescue => e
    e_list << e
  end

  begin
    raise RuntimeError.new
  rescue => e
    e_list << e
  end

  # result without argument
  e_list[0].class == RuntimeError and
    # result with RuntimeError argument
    e_list[1].class == RuntimeError
end

assert('Kernel#respond_to?', '15.3.1.3.43') do
  respond_to? :nil?
end

assert('Kernel#send', '15.3.1.3.44') do
  # test with block
  l = send(:lambda) do
    true
  end

  l.call and l.class == Proc and
    # test with argument
    send(:respond_to?, :nil?) and
    # test without argument and without block
    send(:public_methods).class == Array
end

assert('Kernel#singleton_methods', '15.3.1.3.45') do
  singleton_methods.class == Array
end

assert('Kernel#to_s', '15.3.1.3.46') do
  # TODO looks strange..
  to_s == ''
end
