blob: 40a3482f8f85e29185c86246ae24e39044a1aa1b [file] [log] [blame]
##
# Kernel ISO Test
assert('Kernel', '15.3.1') do
assert_equal Module, Kernel.class
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
assert_false Kernel.block_given?
# test without block
assert_equal "no block", bg_try
# test with block
assert_equal "block" do
bg_try { "block" }
end
# test with block
assert_equal "block" do
bg_try do
"block"
end
end
end
# Kernel.eval is provided by the mruby-gem mrbgem. '15.3.1.2.3'
assert('Kernel.global_variables', '15.3.1.2.4') do
assert_equal Array, Kernel.global_variables.class
end
assert('Kernel.iterator?', '15.3.1.2.5') do
assert_false Kernel.iterator?
end
assert('Kernel.lambda', '15.3.1.2.6') do
l = Kernel.lambda do
true
end
m = Kernel.lambda(&l)
assert_true l.call
assert_equal Proc, l.class
assert_true m.call
assert_equal Proc, m.class
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
assert_equal 100, i
end
assert('Kernel.p', '15.3.1.2.9') do
# TODO search for a way to test p to stdio
assert_true true
end
assert('Kernel.print', '15.3.1.2.10') do
# TODO search for a way to test print to stdio
assert_true true
end
assert('Kernel.puts', '15.3.1.2.11') do
# TODO search for a way to test puts to stdio
assert_true true
end
assert('Kernel.raise', '15.3.1.2.12') do
assert_raise RuntimeError do
Kernel.raise
end
assert_raise RuntimeError do
Kernel.raise RuntimeError.new
end
end
assert('Kernel#__id__', '15.3.1.3.3') do
assert_equal Fixnum, __id__.class
end
assert('Kernel#__send__', '15.3.1.3.4') do
# test with block
l = __send__(:lambda) do
true
end
assert_true l.call
assert_equal Proc, l.class
# test with argument
assert_true __send__(:respond_to?, :nil?)
# test without argument and without block
assert_equal Array, __send__(:public_methods).class
end
assert('Kernel#block_given?', '15.3.1.3.6') do
def bg_try(&b)
if block_given?
yield
else
"no block"
end
end
assert_false block_given?
assert_equal "no block", bg_try
assert_equal "block" do
bg_try { "block" }
end
assert_equal "block" do
bg_try do
"block"
end
end
end
assert('Kernel#class', '15.3.1.3.7') do
assert_equal Module, Kernel.class
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
immutables = [ 1, :foo, true, false, nil ]
error_count = 0
immutables.each do |i|
begin
i.clone
rescue TypeError
error_count += 1
end
end
assert_equal 2, a.get
assert_equal 1, b.get
assert_equal 2, c.get
assert_true a.respond_to?(:test)
assert_false b.respond_to?(:test)
assert_true c.respond_to?(:test)
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
immutables = [ 1, :foo, true, false, nil ]
error_count = 0
immutables.each do |i|
begin
i.dup
rescue TypeError
error_count += 1
end
end
assert_equal immutables.size, error_count
assert_equal 2, a.get
assert_equal 1, b.get
assert_equal 2, c.get
assert_true a.respond_to?(:test)
assert_false b.respond_to?(:test)
assert_false c.respond_to?(:test)
end
assert('Kernel#dup class') do
assert_nothing_raised do
Array.dup.new(200)
Range.dup.new(2, 3)
String.dup.new("a"*50)
end
end
# Kernel#eval is provided by mruby-eval mrbgem '15.3.1.3.12'
assert('Kernel#extend', '15.3.1.3.13') do
class Test4ExtendClass
end
module Test4ExtendModule
def test_method; end
end
a = Test4ExtendClass.new
a.extend(Test4ExtendModule)
b = Test4ExtendClass.new
assert_true a.respond_to?(:test_method)
assert_false b.respond_to?(:test_method)
end
assert('Kernel#extend works on toplevel', '15.3.1.3.13') do
module Test4ExtendModule
def test_method; end
end
# This would crash...
extend(Test4ExtendModule)
assert_true respond_to?(:test_method)
end
assert('Kernel#freeze') do
obj = Object.new
assert_equal obj, obj.freeze
assert_equal 0, 0.freeze
assert_equal :a, :a.freeze
end
assert('Kernel#global_variables', '15.3.1.3.14') do
assert_equal Array, global_variables.class
end
assert('Kernel#hash', '15.3.1.3.15') do
assert_equal hash, hash
end
assert('Kernel#inspect', '15.3.1.3.17') do
s = inspect
assert_equal String, s.class
assert_equal "main", s
end
assert('Kernel#instance_variable_defined?', '15.3.1.3.20') do
o = Object.new
o.instance_variable_set(:@a, 1)
assert_true o.instance_variable_defined?("@a")
assert_false o.instance_variable_defined?("@b")
assert_true o.instance_variable_defined?("@a"[0,2])
assert_true o.instance_variable_defined?("@abc"[0,2])
end
assert('Kernel#instance_variables', '15.3.1.3.23') do
o = Object.new
o.instance_eval do
@a = 11
@b = 12
end
ivars = o.instance_variables
assert_equal Array, ivars.class,
assert_equal(2, ivars.size)
assert_true ivars.include?(:@a)
assert_true ivars.include?(:@b)
end
assert('Kernel#is_a?', '15.3.1.3.24') do
assert_true is_a?(Kernel)
assert_false is_a?(Array)
assert_raise TypeError do
42.is_a?(42)
end
end
assert('Kernel#iterator?', '15.3.1.3.25') do
assert_false iterator?
end
assert('Kernel#kind_of?', '15.3.1.3.26') do
assert_true kind_of?(Kernel)
assert_false kind_of?(Array)
end
assert('Kernel#lambda', '15.3.1.3.27') do
l = lambda do
true
end
m = lambda(&l)
assert_true l.call
assert_equal Proc, l.class
assert_true m.call
assert_equal Proc, m.class
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
assert_equal i, 100
end
assert('Kernel#method_missing', '15.3.1.3.30') do
class MMTestClass
def method_missing(sym)
"A call to #{sym}"
end
end
mm_test = MMTestClass.new
assert_equal 'A call to no_method_named_this', mm_test.no_method_named_this
a = String.new
begin
a.no_method_named_this
rescue NoMethodError => e
assert_equal "undefined method 'no_method_named_this' for \"\"", e.message
end
class ShortInspectClass
def inspect
'An inspect string'
end
end
b = ShortInspectClass.new
begin
b.no_method_named_this
rescue NoMethodError => e
assert_equal "undefined method 'no_method_named_this' for An inspect string", e.message
end
class LongInspectClass
def inspect
"A" * 70
end
end
c = LongInspectClass.new
begin
c.no_method_named_this
rescue NoMethodError => e
assert_equal "undefined method 'no_method_named_this' for #{c}", e.message
end
class NoInspectClass
undef inspect
end
d = NoInspectClass.new
begin
d.no_method_named_this
rescue NoMethodError => e
assert_equal "undefined method 'no_method_named_this' for #{d}", e.message
end
end
assert('Kernel#methods', '15.3.1.3.31') do
assert_equal Array, methods.class
end
assert('Kernel#nil?', '15.3.1.3.32') do
assert_false nil?
end
assert('Kernel#object_id', '15.3.1.3.33') do
a = ""
b = ""
assert_not_equal a.object_id, b.object_id
assert_kind_of Numeric, object_id
assert_kind_of Numeric, "".object_id
assert_kind_of Numeric, true.object_id
assert_kind_of Numeric, false.object_id
assert_kind_of Numeric, nil.object_id
assert_kind_of Numeric, :no.object_id
assert_kind_of Numeric, 1.object_id
assert_kind_of Numeric, 1.0.object_id
end
# Kernel#p is defined in mruby-print mrbgem. '15.3.1.3.34'
# Kernel#print is defined in mruby-print mrbgem. '15.3.1.3.35'
assert('Kernel#private_methods', '15.3.1.3.36') do
assert_equal Array, private_methods.class
end
assert('Kernel#protected_methods', '15.3.1.3.37') do
assert_equal Array, protected_methods.class
end
assert('Kernel#public_methods', '15.3.1.3.38') do
assert_equal Array, public_methods.class
class Foo
def foo
end
end
assert_equal [:foo], Foo.new.public_methods(false)
end
# Kernel#puts is defined in mruby-print mrbgem. '15.3.1.3.39'
assert('Kernel#raise', '15.3.1.3.40') do
assert_raise RuntimeError do
raise
end
assert_raise RuntimeError do
raise RuntimeError.new
end
end
assert('Kernel#remove_instance_variable', '15.3.1.3.41') do
class Test4RemoveInstanceVar
attr_reader :var
def initialize
@var = 99
end
def remove
remove_instance_variable(:@var)
end
end
tri = Test4RemoveInstanceVar.new
assert_equal 99, tri.var
tri.remove
assert_equal nil, tri.var
assert_raise NameError do
tri.remove
end
end
# Kernel#require is defined in mruby-require. '15.3.1.3.42'
assert('Kernel#respond_to?', '15.3.1.3.43') do
class Test4RespondTo
def valid_method; end
def test_method; end
undef test_method
end
assert_raise TypeError do
Test4RespondTo.new.respond_to?(1)
end
assert_raise ArgumentError do
Test4RespondTo.new.respond_to?
end
assert_raise ArgumentError do
Test4RespondTo.new.respond_to? :a, true, :aa
end
assert_true respond_to?(:nil?)
assert_true Test4RespondTo.new.respond_to?(:valid_method)
assert_true Test4RespondTo.new.respond_to?('valid_method')
assert_false Test4RespondTo.new.respond_to?(:test_method)
end
assert('Kernel#send', '15.3.1.3.44') do
# test with block
l = send(:lambda) do
true
end
assert_true l.call
assert_equal l.class, Proc
# test with argument
assert_true send(:respond_to?, :nil?)
# test without argument and without block
assert_equal send(:public_methods).class, Array
end
assert('Kernel#singleton_methods', '15.3.1.3.45') do
assert_equal singleton_methods.class, Array
end
assert('Kernel#to_s', '15.3.1.3.46') do
assert_equal to_s.class, String
end
assert('Kernel#to_s on primitives') do
begin
Fixnum.alias_method :to_s_, :to_s
Fixnum.remove_method :to_s
assert_nothing_raised do
# segfaults if mrb_cptr is used
1.to_s
end
ensure
Fixnum.alias_method :to_s, :to_s_
Fixnum.remove_method :to_s_
end
end
assert('Kernel.local_variables', '15.3.1.2.7') do
a, b = 0, 1
a += b
vars = Kernel.local_variables.sort
assert_equal [:a, :b, :vars], vars
assert_equal [:a, :b, :c, :vars], Proc.new { |a, b|
c = 2
Kernel.local_variables.sort
}.call(-1, -2)
end
assert('Kernel#!=') do
str1 = "hello"
str2 = str1
str3 = "world"
assert_false (str1[1] != 'e')
assert_true (str1 != str3)
assert_false (str2 != str1)
end
# operator "!~" is defined in ISO Ruby 11.4.4.
assert('Kernel#!~') do
x = "x"
def x.=~(other)
other == "x"
end
assert_false x !~ "x"
assert_true x !~ "z"
y = "y"
def y.=~(other)
other == "y"
end
def y.!~(other)
other == "not y"
end
assert_false y !~ "y"
assert_false y !~ "z"
assert_true y !~ "not y"
end
assert('Kernel#respond_to_missing?') do
class Test4RespondToMissing
def respond_to_missing?(method_name, include_private = false)
method_name == :a_method
end
end
assert_true Test4RespondToMissing.new.respond_to?(:a_method)
assert_false Test4RespondToMissing.new.respond_to?(:no_method)
end
assert('Kernel#global_variables') do
variables = global_variables
1.upto(9) do |i|
assert_equal variables.include?(:"$#{i}"), true
end
end
assert('Kernel#define_singleton_method') do
o = Object.new
ret = o.define_singleton_method(:test_method) do
:singleton_method_ok
end
assert_equal :test_method, ret
assert_equal :singleton_method_ok, o.test_method
end
assert('stack extend') do
def recurse(count, stop)
return count if count > stop
recurse(count+1, stop)
end
assert_equal 6, recurse(0, 5)
end