#!/usr/bin/ruby
#
## Test reopening of built-in classes
## and built-in multimethod extensions
#
class Bool {
method +(arg) { self.to_i + arg }
method -(arg) { self.to_i - arg }
method *(arg) { self.to_i * arg }
method /(arg) { self.to_i / arg }
}
class Number {
method +(Bool arg) { self + arg.to_i }
method -(Bool arg) { self - arg.to_i }
method *(Bool arg) { self * arg.to_i }
method /(Bool arg) { self / arg.to_i }
}
class Bool {
method is_neg { false }
method is_pos { self ? true : false }
method to_i { self ? 1 : 0 }
}
assert_eq(Bool.kind_of(Number), false) # Bool is not a Number
assert_eq(Number.kind_of(Bool), false) # Number is not a Bool
assert_eq(false+42, 42)
assert_eq(true+42, 43)
assert_eq(false + 1 + false * true / 4 / false * true, Inf)
assert_eq((42+true) * 9*true / (5-true), 96.75)
assert_eq(false + true, 1)
assert_eq(42 + true, 43)
assert_eq(64 - true, 63)
assert_eq( 1 / false, Inf)
assert_eq( 5 * false, 0)
assert_eq(42 * true, 42)
say "** Test passed!"