assert('BasicObject') do
assert_equal(Class, BasicObject.class)
end
assert('BasicObject superclass') do
assert_nil(BasicObject.superclass)
end
assert('BasicObject reopened at the top level is the class Object inherits from') do
reopened = class BasicObject
def basic_object_reopen_probe; :reopened; end
self
end
begin
assert_same(Object.superclass, reopened)
assert_nil(reopened.superclass)
assert_equal(:reopened, nil.basic_object_reopen_probe)
assert_equal(:reopened, Class.new(BasicObject).new.basic_object_reopen_probe)
ensure
class BasicObject
undef_method :basic_object_reopen_probe
end
end
end
assert('BasicObject#== defined by a class is asked about the receiver itself') do
plain = Object.new
assert_true plain == plain
own = Class.new { def ==(other); :own; end }
o = own.new
assert_equal :own, o == o
assert_false o != o
after = Class.new(own).new
assert_equal :own, after == after
base = Class.new
before = Class.new(base).new
base.class_eval { def ==(other); :base; end }
assert_equal :base, before == before
single = Object.new
def single.==(other); :single; end
assert_equal :single, single == single
aliased = Class.new { def same?(other); :aliased; end; alias_method :==, :same? }.new
assert_equal :aliased, aliased == aliased
defined = Class.new { define_method(:==) {|other| :defined } }.new
assert_equal :defined, defined == defined
mod = Module.new { def ==(other); :mod; end }
included = Class.new { include mod }.new
assert_equal :mod, included == included
prepended = Class.new { prepend mod }.new
assert_equal :mod, prepended == prepended
late = Module.new
with_late = Class.new { include late }
early = with_late.new
late.module_eval { def ==(other); :late; end }
assert_equal :late, early == early
via_sub = Class.new(with_late).new
assert_equal :late, via_sub == via_sub
cmp = Class.new { include Comparable; def <=>(other); nil; end }.new
assert_true cmp == cmp
end
assert('BasicObject#== defined on NilClass, TrueClass or FalseClass') do
assert_true nil == nil
assert_true true == true
assert_true false == false
answers = []
[[NilClass, nil, :nil_eq], [TrueClass, true, :true_eq],
[FalseClass, false, :false_eq]].each do |klass, value, answer|
klass.class_eval { alias_method :__eq_before_test, :== }
begin
klass.class_eval { define_method(:==) {|other| answer } }
answers << (value == value) << (value == 1)
answers << (1 == 1) << (:a == :a) << (:a == :b)
ensure
klass.class_eval { alias_method :==, :__eq_before_test }
end
answers << (value == value)
end
assert_equal [:nil_eq, :nil_eq, true, true, false, true,
:true_eq, :true_eq, true, true, false, true,
:false_eq, :false_eq, true, true, false, true], answers
end