Commit d105ea49 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #305 from bovi/optional-feature

Tests are executed based on available features
parents 0f2b6964 4780b653
......@@ -2,45 +2,49 @@
# Struct
#
# ISO 15.2.18
class Struct
##
# Calls the given block for each element of +self+
# and pass the respective element.
#
# ISO 15.2.18.4.4
def each(&block)
self.class.members.each{|field|
block.call(self[field])
}
self
end
if Object.const_defined?(:Struct)
class Struct
##
# Calls the given block for each element of +self+
# and pass the name and value of the respectiev
# element.
#
# ISO 15.2.18.4.5
def each_pair(&block)
self.class.members.each{|field|
block.call(field.to_sym, self[field])
}
self
end
##
# Calls the given block for each element of +self+
# and pass the respective element.
#
# ISO 15.2.18.4.4
def each(&block)
self.class.members.each{|field|
block.call(self[field])
}
self
end
##
# Calls the given block for each element of +self+
# and returns an array with all elements of which
# block is not false.
#
# ISO 15.2.18.4.7
def select(&block)
ary = []
self.class.members.each{|field|
val = self[field]
ary.push(val) if block.call(val)
}
ary
##
# Calls the given block for each element of +self+
# and pass the name and value of the respectiev
# element.
#
# ISO 15.2.18.4.5
def each_pair(&block)
self.class.members.each{|field|
block.call(field.to_sym, self[field])
}
self
end
##
# Calls the given block for each element of +self+
# and returns an array with all elements of which
# block is not false.
#
# ISO 15.2.18.4.7
def select(&block)
ary = []
self.class.members.each{|field|
val = self[field]
ary.push(val) if block.call(val)
}
ary
end
end
end
##
# Math Test
assert('Math.sin 0') do
check_float(Math.sin(0), 0)
end
if Object.const_defined?(:Math)
assert('Math.sin 0') do
check_float(Math.sin(0), 0)
end
assert('Math.sin PI/2') do
check_float(Math.sin(Math::PI / 2), 1)
end
assert('Math.sin PI/2') do
check_float(Math.sin(Math::PI / 2), 1)
end
assert('Fundamental trig identities') do
result = true
N = 15
N.times do |i|
a = Math::PI / N * i
ca = Math::PI / 2 - a
s = Math.sin(a)
c = Math.cos(a)
t = Math.tan(a)
result &= check_float(s, Math.cos(ca))
result &= check_float(t, 1 / Math.tan(ca))
result &= check_float(s ** 2 + c ** 2, 1)
result &= check_float(t ** 2 + 1, (1/c) ** 2)
result &= check_float((1/t) ** 2 + 1, (1/s) ** 2)
end
result
end
assert('Fundamental trig identities') do
result = true
N = 15
N.times do |i|
a = Math::PI / N * i
ca = Math::PI / 2 - a
s = Math.sin(a)
c = Math.cos(a)
t = Math.tan(a)
result &= check_float(s, Math.cos(ca))
result &= check_float(t, 1 / Math.tan(ca))
result &= check_float(s ** 2 + c ** 2, 1)
result &= check_float(t ** 2 + 1, (1/c) ** 2)
result &= check_float((1/t) ** 2 + 1, (1/s) ** 2)
end
result
end
assert('Math.erf 0') do
check_float(Math.erf(0), 0)
end
assert('Math.erf 0') do
check_float(Math.erf(0), 0)
end
assert('Math.exp 0') do
check_float(Math.exp(0), 1.0)
end
assert('Math.exp 0') do
check_float(Math.exp(0), 1.0)
end
assert('Math.exp 1') do
check_float(Math.exp(1), 2.718281828459045)
end
assert('Math.exp 1') do
check_float(Math.exp(1), 2.718281828459045)
end
assert('Math.exp 1.5') do
check_float(Math.exp(1.5), 4.4816890703380645)
end
assert('Math.exp 1.5') do
check_float(Math.exp(1.5), 4.4816890703380645)
end
assert('Math.log 1') do
check_float(Math.log(1), 0)
end
assert('Math.log 1') do
check_float(Math.log(1), 0)
end
assert('Math.log E') do
check_float(Math.log(Math::E), 1.0)
end
assert('Math.log E') do
check_float(Math.log(Math::E), 1.0)
end
assert('Math.log E**3') do
check_float(Math.log(Math::E**3), 3.0)
end
assert('Math.log E**3') do
check_float(Math.log(Math::E**3), 3.0)
end
assert('Math.log2 1') do
check_float(Math.log2(1), 0.0)
end
assert('Math.log2 1') do
check_float(Math.log2(1), 0.0)
end
assert('Math.log2 2') do
check_float(Math.log2(2), 1.0)
end
assert('Math.log2 2') do
check_float(Math.log2(2), 1.0)
end
assert('Math.log10 1') do
check_float(Math.log10(1), 0.0)
end
assert('Math.log10 1') do
check_float(Math.log10(1), 0.0)
end
assert('Math.log10 10') do
check_float(Math.log10(10), 1.0)
end
assert('Math.log10 10') do
check_float(Math.log10(10), 1.0)
end
assert('Math.log10 10**100') do
check_float(Math.log10(10**100), 100.0)
end
assert('Math.log10 10**100') do
check_float(Math.log10(10**100), 100.0)
end
assert('Math.sqrt') do
num = [0.0, 1.0, 2.0, 3.0, 4.0]
sqr = [0, 1, 4, 9, 16]
result = true
sqr.each_with_index do |v,i|
result &= check_float(Math.sqrt(v), num[i])
end
result
end
assert('Math.sqrt') do
num = [0.0, 1.0, 2.0, 3.0, 4.0]
sqr = [0, 1, 4, 9, 16]
result = true
sqr.each_with_index do |v,i|
result &= check_float(Math.sqrt(v), num[i])
assert('Math.cbrt') do
num = [-2.0, -1.0, 0.0, 1.0, 2.0]
cub = [-8, -1, 0, 1, 8]
result = true
cub.each_with_index do |v,i|
result &= check_float(Math.cbrt(v), num[i])
end
result
end
result
end
assert('Math.cbrt') do
num = [-2.0, -1.0, 0.0, 1.0, 2.0]
cub = [-8, -1, 0, 1, 8]
result = true
cub.each_with_index do |v,i|
result &= check_float(Math.cbrt(v), num[i])
assert('Math.hypot') do
check_float(Math.hypot(3, 4), 5.0)
end
result
end
assert('Math.hypot') do
check_float(Math.hypot(3, 4), 5.0)
end
assert('Math.frexp 1234') do
n = 1234
fraction, exponent = Math.frexp(n)
check_float(Math.ldexp(fraction, exponent), n)
end
assert('Math.frexp 1234') do
n = 1234
fraction, exponent = Math.frexp(n)
check_float(Math.ldexp(fraction, exponent), n)
end
assert('Math.erf 1') do
check_float(Math.erf(1), 0.842700792949715)
end
assert('Math.erf 1') do
check_float(Math.erf(1), 0.842700792949715)
assert('Math.erfc 1') do
check_float(Math.erfc(1), 0.157299207050285)
end
end
assert('Math.erfc 1') do
check_float(Math.erfc(1), 0.157299207050285)
end
##
# Struct ISO Test
assert('Struct', '15.2.18') do
Struct.class == Class
end
if Object.const_defined?(:Struct)
assert('Struct', '15.2.18') do
Struct.class == Class
end
assert('Struct superclass', '15.2.18.2') do
Struct.superclass == Object
end
assert('Struct superclass', '15.2.18.2') do
Struct.superclass == Object
end
assert('Struct.new', '15.2.18.3.1') do
c = Struct.new(:m1, :m2)
c.superclass == Struct and
c.members == [:m1,:m2]
end
assert('Struct.new', '15.2.18.3.1') do
c = Struct.new(:m1, :m2)
c.superclass == Struct and
c.members == [:m1,:m2]
end
assert('Struct#[]', '15.2.18.4.2') do
c = Struct.new(:m1, :m2)
cc = c.new(1,2)
cc[:m1] == 1 and cc["m2"] == 2
end
assert('Struct#[]', '15.2.18.4.2') do
c = Struct.new(:m1, :m2)
cc = c.new(1,2)
cc[:m1] == 1 and cc["m2"] == 2
end
assert('Struct#[]=', '15.2.18.4.3') do
c = Struct.new(:m1, :m2)
cc = c.new(1,2)
cc[:m1] = 3
cc[:m1] == 3
end
assert('Struct#[]=', '15.2.18.4.3') do
c = Struct.new(:m1, :m2)
cc = c.new(1,2)
cc[:m1] = 3
cc[:m1] == 3
end
assert('Struct#each', '15.2.18.4.4') do
c = Struct.new(:m1, :m2)
cc = c.new(1,2)
a = []
cc.each{|x|
a << x
}
a[0] == 1 and a[1] == 2
end
assert('Struct#each', '15.2.18.4.4') do
c = Struct.new(:m1, :m2)
cc = c.new(1,2)
a = []
cc.each{|x|
a << x
}
a[0] == 1 and a[1] == 2
end
assert('Struct#each_pair', '15.2.18.4.5') do
c = Struct.new(:m1, :m2)
cc = c.new(1,2)
a = []
cc.each_pair{|k,v|
a << [k,v]
}
a[0] == [:m1, 1] and a[1] == [:m2, 2]
end
assert('Struct#each_pair', '15.2.18.4.5') do
c = Struct.new(:m1, :m2)
cc = c.new(1,2)
a = []
cc.each_pair{|k,v|
a << [k,v]
}
a[0] == [:m1, 1] and a[1] == [:m2, 2]
end
assert('Struct#members', '15.2.18.4.6') do
c = Struct.new(:m1, :m2)
cc = c.new(1,2)
cc.members == [:m1,:m2]
end
assert('Struct#members', '15.2.18.4.6') do
c = Struct.new(:m1, :m2)
cc = c.new(1,2)
cc.members == [:m1,:m2]
end
assert('Struct#select', '15.2.18.4.7') do
c = Struct.new(:m1, :m2)
cc = c.new(1,2)
cc.select{|v| v % 2 == 0} == [2]
assert('Struct#select', '15.2.18.4.7') do
c = Struct.new(:m1, :m2)
cc = c.new(1,2)
cc.select{|v| v % 2 == 0} == [2]
end
end
##
# Time ISO Test
assert('Time.new', '15.2.3.3.3') do
Time.new.class == Time
end
if Object.const_defined?(:Time)
assert('Time.new', '15.2.3.3.3') do
Time.new.class == Time
end
assert('Time', '15.2.19') do
Time.class == Class
end
assert('Time', '15.2.19') do
Time.class == Class
end
assert('Time superclass', '15.2.19.2') do
Time.superclass == Object
end
assert('Time superclass', '15.2.19.2') do
Time.superclass == Object
end
assert('Time.at', '15.2.19.6.1') do
Time.at(1300000000.0)
end
assert('Time.at', '15.2.19.6.1') do
Time.at(1300000000.0)
end
assert('Time.gm', '15.2.19.6.2') do
Time.gm(2012, 12, 23)
end
assert('Time.gm', '15.2.19.6.2') do
Time.gm(2012, 12, 23)
end
assert('Time.local', '15.2.19.6.3') do
Time.local(2012, 12, 23)
end
assert('Time.local', '15.2.19.6.3') do
Time.local(2012, 12, 23)
end
assert('Time.mktime', '15.2.19.6.4') do
Time.mktime(2012, 12, 23)
end
assert('Time.mktime', '15.2.19.6.4') do
Time.mktime(2012, 12, 23)
end
assert('Time.now', '15.2.19.6.5') do
Time.now.class == Time
end
assert('Time.now', '15.2.19.6.5') do
Time.now.class == Time
end
assert('Time.utc', '15.2.19.6.6') do
Time.utc(2012, 12, 23)
end
assert('Time.utc', '15.2.19.6.6') do
Time.utc(2012, 12, 23)
end
assert('Time#+', '15.2.19.7.1') do
t1 = Time.at(1300000000.0)
t2 = t1.+(60)
assert('Time#+', '15.2.19.7.1') do
t1 = Time.at(1300000000.0)
t2 = t1.+(60)
t2.utc.asctime == "Sun Mar 13 07:07:40 UTC 2011"
end
t2.utc.asctime == "Sun Mar 13 07:07:40 UTC 2011"
end
assert('Time#-', '15.2.19.7.2') do
t1 = Time.at(1300000000.0)
t2 = t1.-(60)
assert('Time#-', '15.2.19.7.2') do
t1 = Time.at(1300000000.0)
t2 = t1.-(60)
t2.utc.asctime == "Sun Mar 13 07:05:40 UTC 2011"
end
t2.utc.asctime == "Sun Mar 13 07:05:40 UTC 2011"
end
assert('Time#<=>', '15.2.19.7.3') do
t1 = Time.at(1300000000.0)
t2 = Time.at(1400000000.0)
t3 = Time.at(1500000000.0)
assert('Time#<=>', '15.2.19.7.3') do
t1 = Time.at(1300000000.0)
t2 = Time.at(1400000000.0)
t3 = Time.at(1500000000.0)
t2.<=>(t1) == 1 and
t2.<=>(t2) == 0 and
t2.<=>(t3) == -1 and
t2.<=>(nil) == nil
end
t2.<=>(t1) == 1 and
t2.<=>(t2) == 0 and
t2.<=>(t3) == -1 and
t2.<=>(nil) == nil
end
assert('Time#asctime', '15.2.19.7.4') do
Time.at(1300000000.0).utc.asctime == "Sun Mar 13 07:06:40 UTC 2011"
end
assert('Time#asctime', '15.2.19.7.4') do
Time.at(1300000000.0).utc.asctime == "Sun Mar 13 07:06:40 UTC 2011"
end
assert('Time#ctime', '15.2.19.7.5') do
Time.at(1300000000.0).utc.ctime == "Sun Mar 13 07:06:40 UTC 2011"
end
assert('Time#ctime', '15.2.19.7.5') do
Time.at(1300000000.0).utc.ctime == "Sun Mar 13 07:06:40 UTC 2011"
end
assert('Time#day', '15.2.19.7.6') do
Time.gm(2012, 12, 23).day == 23
end
assert('Time#day', '15.2.19.7.6') do
Time.gm(2012, 12, 23).day == 23
end
assert('Time#dst?', '15.2.19.7.7') do
not Time.gm(2012, 12, 23).utc.dst?
end
assert('Time#dst?', '15.2.19.7.7') do
not Time.gm(2012, 12, 23).utc.dst?
end
assert('Time#getgm', '15.2.19.7.8') do
Time.at(1300000000.0).getgm.asctime == "Sun Mar 13 07:06:40 UTC 2011"
end
assert('Time#getgm', '15.2.19.7.8') do
Time.at(1300000000.0).getgm.asctime == "Sun Mar 13 07:06:40 UTC 2011"
end
assert('Time#getlocal', '15.2.19.7.9') do
t1 = Time.at(1300000000.0)
t2 = Time.at(1300000000.0)
t3 = t1.getlocal
assert('Time#getlocal', '15.2.19.7.9') do
t1 = Time.at(1300000000.0)
t2 = Time.at(1300000000.0)
t3 = t1.getlocal
t1 == t3 and t3 == t2.getlocal
end
t1 == t3 and t3 == t2.getlocal
end
assert('Time#getutc', '15.2.19.7.10') do
Time.at(1300000000.0).getutc.asctime == "Sun Mar 13 07:06:40 UTC 2011"
end
assert('Time#getutc', '15.2.19.7.10') do
Time.at(1300000000.0).getutc.asctime == "Sun Mar 13 07:06:40 UTC 2011"
end
assert('Time#gmt?', '15.2.19.7.11') do
Time.at(1300000000.0).utc.gmt?
end
assert('Time#gmt?', '15.2.19.7.11') do
Time.at(1300000000.0).utc.gmt?
end
# ATM not implemented
# assert('Time#gmt_offset', '15.2.19.7.12') do
# ATM not implemented
# assert('Time#gmt_offset', '15.2.19.7.12') do
assert('Time#gmtime', '15.2.19.7.13') do
Time.at(1300000000.0).gmtime
end
assert('Time#gmtime', '15.2.19.7.13') do
Time.at(1300000000.0).gmtime
end
# ATM not implemented
# assert('Time#gmtoff', '15.2.19.7.14') do
# ATM not implemented
# assert('Time#gmtoff', '15.2.19.7.14') do
assert('Time#hour', '15.2.19.7.15') do
Time.gm(2012, 12, 23, 7, 6).hour == 7
end
assert('Time#hour', '15.2.19.7.15') do
Time.gm(2012, 12, 23, 7, 6).hour == 7
end
# ATM doesn't really work
# assert('Time#initialize', '15.2.19.7.16') do
# ATM doesn't really work
# assert('Time#initialize', '15.2.19.7.16') do
assert('Time#initialize_copy', '15.2.19.7.17') do
time_tmp_2 = Time.at(7.0e6)
time_tmp_2.clone == time_tmp_2
end
assert('Time#initialize_copy', '15.2.19.7.17') do
time_tmp_2 = Time.at(7.0e6)
time_tmp_2.clone == time_tmp_2
end
assert('Time#localtime', '15.2.19.7.18') do
t1 = Time.at(1300000000.0)
t2 = Time.at(1300000000.0)
assert('Time#localtime', '15.2.19.7.18') do
t1 = Time.at(1300000000.0)
t2 = Time.at(1300000000.0)
t1.localtime
t1 == t2.getlocal
end
t1.localtime
t1 == t2.getlocal
end
assert('Time#mday', '15.2.19.7.19') do
Time.gm(2012, 12, 23).mday == 23
end
assert('Time#mday', '15.2.19.7.19') do
Time.gm(2012, 12, 23).mday == 23
end
assert('Time#min', '15.2.19.7.20') do
Time.gm(2012, 12, 23, 7, 6).min == 6
end
assert('Time#min', '15.2.19.7.20') do
Time.gm(2012, 12, 23, 7, 6).min == 6
end
assert('Time#mon', '15.2.19.7.21') do
Time.gm(2012, 12, 23).mon == 12
end
assert('Time#mon', '15.2.19.7.21') do
Time.gm(2012, 12, 23).mon == 12
end
assert('Time#month', '15.2.19.7.22') do
Time.gm(2012, 12, 23).month == 12
end
assert('Time#month', '15.2.19.7.22') do
Time.gm(2012, 12, 23).month == 12
end
assert('Times#sec', '15.2.19.7.23') do
Time.gm(2012, 12, 23, 7, 6, 40).sec == 40
end
assert('Times#sec', '15.2.19.7.23') do
Time.gm(2012, 12, 23, 7, 6, 40).sec == 40
end
assert('Time#to_f', '15.2.19.7.24') do
Time.at(1300000000.0).to_f == 1300000000.0
end
assert('Time#to_f', '15.2.19.7.24') do
Time.at(1300000000.0).to_f == 1300000000.0
end
assert('Time#to_i', '15.2.19.7.25') do
Time.at(1300000000.0).to_i == 1300000000
end
assert('Time#to_i', '15.2.19.7.25') do
Time.at(1300000000.0).to_i == 1300000000
end
assert('Time#usec', '15.2.19.7.26') do
Time.at(1300000000.0).usec == 0
end
assert('Time#usec', '15.2.19.7.26') do
Time.at(1300000000.0).usec == 0
end
assert('Time#utc', '15.2.19.7.27') do
Time.at(1300000000.0).utc
end
assert('Time#utc', '15.2.19.7.27') do
Time.at(1300000000.0).utc
end
assert('Time#utc?', '15.2.19.7.28') do
Time.at(1300000000.0).utc.utc?
end
assert('Time#utc?', '15.2.19.7.28') do
Time.at(1300000000.0).utc.utc?
end
# ATM not implemented
# assert('Time#utc_offset', '15.2.19.7.29') do
# ATM not implemented
# assert('Time#utc_offset', '15.2.19.7.29') do
assert('Time#wday', '15.2.19.7.30') do
Time.gm(2012, 12, 23).wday == 0
end
assert('Time#wday', '15.2.19.7.30') do
Time.gm(2012, 12, 23).wday == 0
end
assert('Time#yday', '15.2.19.7.31') do
Time.gm(2012, 12, 23).yday == 357
end
assert('Time#yday', '15.2.19.7.31') do
Time.gm(2012, 12, 23).yday == 357
end
assert('Time#year', '15.2.19.7.32') do
Time.gm(2012, 12, 23).year == 2012
end
assert('Time#year', '15.2.19.7.32') do
Time.gm(2012, 12, 23).year == 2012
end
assert('Time#zone', '15.2.19.7.33') do
Time.at(1300000000.0).utc.zone == 'UTC'
assert('Time#zone', '15.2.19.7.33') do
Time.at(1300000000.0).utc.zone == 'UTC'
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment