klayout/testdata/ruby/basic_testcore.rb

2751 lines
71 KiB
Ruby

# encoding: UTF-8
# NOTE: we need to do a "require" here since basic_testcore_defs.rb is not
# safe in multiple inclusions
require File.expand_path('../basic_testcore_defs', __FILE__)
class Basic_TestClass < TestBase
def test_FIRST
# for testing the ut logger:
puts "Special chars: <&>"
GC.start
# all references of A are released now:
ic0 = RBA::A::instance_count
assert_equal( ic0, 0 )
a = RBA::A.new_a(100)
assert_equal( RBA::A::instance_count, ic0 + 1 )
a = RBA::A.new
assert_equal(a.a1, 17)
a.assign(RBA::A.new(110))
assert_equal(a.a1, 110)
a = nil
GC.start
assert_equal( RBA::A::instance_count, ic0 )
a = RBA::A.new
assert_equal( RBA::A::instance_count, ic0 ) # delayed instantiation of detached objects - A is actually created if it is used first
a.a2 # just check, if it can be called
assert_equal( RBA::A::instance_count, ic0 + 1 )
# open question: with ruby 1.8, aa is not deleted if the assert_equal is missing. Why?
# maybe the GC does not like to be called that frequently?
aa = a.dup
assert_equal( RBA::A::instance_count, ic0 + 2 )
aa = nil
GC.start
if RUBY_VERSION >= "1.9.0"
# GC works differently in >=1.9.x - but no leak (verified with valgrind)
ic0 = RBA::A::instance_count
else
assert_equal( RBA::A::instance_count, ic0 + 1 )
end
a = nil
GC.start
if RUBY_VERSION >= "1.9.0"
# GC works differently in >=1.9.x - but no leak (verified with valgrind)
ic0 = RBA::A::instance_count
else
assert_equal( RBA::A::instance_count, ic0 )
end
a = RBA::A.new
assert_equal( RBA::A::instance_count, ic0 ) # delayed instantiation of detached objects - A is actually created if it is used first
a.a2 # just check, if it can be called
assert_equal( RBA::A::instance_count, ic0 + 1 )
# mix of getters, setters, predicates
assert_equal( a.af, false )
assert_equal( a.af(true), false )
a.af = true
assert_equal( a.af?, true )
assert_equal( a.af?(true), true )
# static and non-static methods can be mixed
assert_equal( RBA::A.aa, "static_a" )
assert_equal( a.aa, "a" )
assert_equal( a.a1, 17 )
a.a5 -5
assert_equal( a.a1, -5 )
a.a5 0x7fffffff
assert_equal( a.a1, 0x7fffffff )
a.a5 -0x80000000
assert_equal( a.a1, -0x80000000 )
assert_equal( a.a3("a"), 1 )
assert_equal( a.a3("ab"), 2 )
assert_equal( a.a3("µ"), 2 ) # two UTF8 bytes
if a.respond_to?(:a3_qstr)
assert_equal( a.a3_qstr("a"), 1 )
assert_equal( a.a3_qstr("ab"), 2 )
assert_equal( a.a3_qstr("µ"), 1 ) # one UTF8 character
assert_equal( a.a3_qstrref("a"), 1 )
assert_equal( a.a3_qstrref("ab"), 2 )
assert_equal( a.a3_qstrref("µ"), 1 ) # one UTF8 character
assert_equal( a.a3_qba("a"), 1 )
assert_equal( a.a3_qba("ab"), 2 )
assert_equal( a.a3_qba("µ"), 2 ) # two UTF8 bytes
end
assert_equal( a.a3(""), 0 )
assert_equal( a.a4([1]), 1.0 )
assert_equal( a.a4([1, 125e-3]), 0.125 )
assert_equal( a.a4([5, 1, -1.25]), -1.25 )
arr = []
a.a6 { |d| arr.push(d) }
assert_equal(arr, [5, 1, -1.25])
arr = []
a.a7 { |d| arr.push(d) }
assert_equal(arr, [5, 1, -1.25])
arr = []
a.a8 { |d| arr.push(d) }
assert_equal(arr, [5, 1, -1.25])
a.destroy
assert_equal( RBA::A::instance_count, ic0 )
if !$leak_check
error_caught = false
begin
a.a2 # object has been destroyed already
rescue
error_caught = true
end
assert_equal( error_caught, true )
error_caught = false
begin
a.destroy # object has been destroyed already
rescue
error_caught = true
end
assert_equal( error_caught, true )
end
assert_equal( RBA::A::instance_count, ic0 )
a = RBA::A::new_a( 55 )
assert_equal( RBA::A::instance_count, ic0 + 1 )
assert_equal( a.a1, 55 )
assert_equal( a.a_vp1( a.a_vp2 ), "abc" )
a.destroy
assert_equal( RBA::A::instance_count, ic0 )
a = RBA::A::new_a(0)
assert_equal( a.a9a(5).to_s, "true" )
assert_equal( a.a9a(4).to_s, "false" )
assert_equal( a.a9b(true).to_s, "5" )
assert_equal( a.a9b(0).to_s, "5" )
assert_equal( a.a9b(1).to_s, "5" )
assert_equal( a.a9b(false).to_s, "-5" )
assert_equal( a.a9b(nil).to_s, "-5" )
ea = RBA::Enum::a
eb = RBA::Enum::b
ei = RBA::Enum::new(17)
e0 = RBA::Enum::new
assert_equal( ea.to_s, "a" )
assert_equal( RBA::Enum::new(ea.to_s).to_s, "a" )
assert_equal( eb.to_s, "b" )
assert_equal( RBA::Enum::new(eb.to_s).to_s, "b" )
assert_equal( ei.to_s, "#17" )
assert_equal( RBA::Enum::new(ei.to_s).to_s, "#17" )
assert_equal( e0.to_s, "#0" )
assert_equal( RBA::Enum::new(e0.to_s).to_s, "#0" )
assert_equal( e0.inspect, "(not a valid enum value)" )
assert_equal( ea.inspect, "a (1)" )
assert_equal( eb.inspect, "b (2)" )
assert_equal( eb == ea, false )
assert_equal( eb == eb, true )
assert_equal( eb != ea, true )
assert_equal( eb != eb, false )
assert_equal( eb < ea, false )
assert_equal( eb < eb, false )
assert_equal( ea < eb, true )
if RBA.constants.member?(:Enums)
eea = RBA::Enums::new
eei = RBA::Enums::new(3)
eeb = RBA::Enums::new(eb)
assert_equal( eea.to_s, "" )
assert_equal( eea.inspect, " (0)" )
assert_equal( RBA::Enums::new(eea.to_s).inspect, " (0)" )
assert_equal( eei.inspect, "a|b (3)" )
assert_equal( RBA::Enums::new(eei.to_s).inspect, "a|b (3)" )
assert_equal( eeb.inspect, "b (2)" )
assert_equal( RBA::Enums::new(eeb.to_s).inspect, "b (2)" )
eeab1 = ea | eb
eeab2 = ea | RBA::Enums::new(eb)
eeab3 = RBA::Enums::new(ea) | eb
eeab4 = RBA::Enums::new(ea) | RBA::Enums::new(eb)
assert_equal( eeab1.inspect, "a|b (3)" )
assert_equal( eeab2.inspect, "a|b (3)" )
assert_equal( eeab3.inspect, "a|b (3)" )
assert_equal( eeab4.inspect, "a|b (3)" )
# Note: unsigned enum's will produce the long int, signed enums will produce the short one
assert_equal( (~eeab4).inspect == " (-4)" || (~eeab4).inspect == " (4294967292)", true )
assert_equal( (eeab4 & ea).inspect, "a (1)" )
assert_equal( (eeab4 & eeb).inspect, "b (2)" )
assert_equal( (eeab4 ^ eeb).inspect, "a (1)" )
assert_equal( (eeab4 ^ eb).inspect, "a (1)" )
assert_equal( eeab4.inspect, "a|b (3)" )
eeab4 ^= ea
assert_equal( eeab4.inspect, "b (2)" )
assert_equal( a.get_e.to_s, "#0" )
a.set_e( RBA::Enum::a )
assert_equal( a.get_e.to_s, "a" )
a.set_e( RBA::Enum::b )
assert_equal( a.get_e.to_s, "b" )
a.set_eptr( nil )
assert_equal( a.get_e.to_s, "#0" )
a.set_eptr( RBA::Enum::c )
assert_equal( a.get_e.to_s, "c" )
a.set_ecptr( nil )
assert_equal( a.get_e.to_s, "#0" )
a.set_ecptr( RBA::Enum::b )
assert_equal( a.get_e.to_s, "b" )
a.set_ecref( RBA::Enum::a )
assert_equal( a.get_e.to_s, "a" )
a.set_eref( RBA::Enum::c )
assert_equal( a.get_e.to_s, "c" )
assert_equal( a.get_eptr.to_s, "c" )
assert_equal( a.get_eref.to_s, "c" )
assert_equal( a.get_ecptr.to_s, "c" )
assert_equal( a.get_ecref.to_s, "c" )
a.set_ecptr( nil )
assert_equal( a.get_ecptr, nil )
assert_equal( a.get_ecref.to_s, "#0" )
assert_equal( a.get_eptr, nil )
assert_equal( a.get_eref.to_s, "#0" )
ee = RBA::Enum::new
assert_equal( ee.to_s, "#0" )
a.mod_eref( ee, RBA::Enum::c )
assert_equal( ee.to_s, "c" )
a.mod_eptr( ee, RBA::Enum::a )
assert_equal( ee.to_s, "a" )
assert_equal( a.ev.inspect, "[]" )
a.push_ev( RBA::Enum::a )
a.push_ev( RBA::Enum::new )
a.push_ev( RBA::Enum::b )
assert_equal( a.ev.inspect, "[a (1), (not a valid enum value), b (2)]" )
assert_equal( a.get_ef.inspect, " (0)" )
a.set_ef( RBA::Enum::a )
assert_equal( a.get_ef.to_s, "a" )
a.set_ef( RBA::Enums::new(RBA::Enum::b) )
assert_equal( a.get_ef.to_s, "b" )
a.set_efptr( nil )
assert_equal( a.get_ef.inspect, " (0)" )
a.set_efptr( RBA::Enums::new(RBA::Enum::c) )
assert_equal( a.get_ef.to_s, "a|b|c" )
a.set_efcptr( nil )
assert_equal( a.get_ef.inspect, " (0)" )
a.set_efcptr( RBA::Enums::new(RBA::Enum::b) )
assert_equal( a.get_ef.to_s, "b" )
a.set_efcptr( RBA::Enum::c )
assert_equal( a.get_ef.to_s, "a|b|c" )
a.set_efcref( RBA::Enum::b )
assert_equal( a.get_ef.to_s, "b" )
a.set_efcref( RBA::Enums::new(RBA::Enum::a) )
assert_equal( a.get_ef.to_s, "a" )
a.set_efref( RBA::Enums::new(RBA::Enum::c) )
assert_equal( a.get_ef.to_s, "a|b|c" )
assert_equal( a.get_efptr.to_s, "a|b|c" )
assert_equal( a.get_efref.to_s, "a|b|c" )
assert_equal( a.get_efcptr.to_s, "a|b|c" )
assert_equal( a.get_efcref.to_s, "a|b|c" )
a.set_efcptr( nil )
assert_equal( a.get_efcptr, nil )
assert_equal( a.get_efcref.inspect, " (0)" )
assert_equal( a.get_efptr, nil )
assert_equal( a.get_efref.inspect, " (0)" )
ee = RBA::Enums::new
assert_equal( ee.inspect, " (0)" )
a.mod_efref( ee, RBA::Enum::b )
assert_equal( ee.to_s, "b" )
a.mod_efptr( ee, RBA::Enum::a )
assert_equal( ee.to_s, "a|b" )
end
end
def test_12
a1 = RBA::A.new
a1.a5( -15 )
a2 = a1
a3 = a2.dup
assert_equal( a1.a1, -15 )
assert_equal( a2.a1, -15 )
assert_equal( a3.a1, -15 )
a1.a5( 11 )
a3.a5( -11 )
assert_equal( a1.a1, 11 )
assert_equal( a2.a1, 11 )
assert_equal( a3.a1, -11 )
assert_equal( a1.a10_s(0x70000000), "0" )
assert_equal( a1.a10_s(0x7fffffff), "-1" )
assert_equal( a1.a10_us(0x70000000), "0" )
assert_equal( a1.a10_us(0x7fffffff), "65535" )
assert_equal( a1.a10_i(-0x80000000), "-2147483648" )
assert_equal( a1.a10_l(-0x80000000), "-2147483648" )
assert_equal( a1.a10_ll(-0x80000000), "-2147483648" )
assert_equal( a1.a10_ui(0xffffffff), "4294967295" )
assert_equal( a1.a10_ul(0xffffffff), "4294967295" )
assert_equal( a1.a10_ull(0xffffffff), "4294967295" )
assert_equal( a1.a11_s(0x70000000), 0 )
assert_equal( a1.a11_s(0x7fffffff), -1 )
assert_equal( a1.a11_us(0x70000000), 0 )
assert_equal( a1.a11_us(0x7fffffff), 65535 )
assert_equal( a1.a11_i(-0x80000000), -2147483648 )
assert_equal( a1.a11_l(-0x80000000), -2147483648 )
assert_equal( a1.a11_ll(-0x80000000), -2147483648 )
assert_equal( a1.a11_ui(0xffffffff), 4294967295 )
assert_equal( a1.a11_ul(0xffffffff), 4294967295 )
assert_equal( a1.a11_ull(0xffffffff), 4294967295 )
assert_equal( a1.a10_d(5.2), "5.2" )
if a1.respond_to?(:a10_d_qstr)
assert_equal( a1.a10_d_qstr(5.25), "5.25" )
assert_equal( a1.a10_d_qstrref(5.2), "5.2" )
assert_equal( a1.a10_d_qba(5.1), "5.1" )
end
assert_equal( a1.a10_f(5.7), "5.7" )
x = RBA::Value.new(1.5)
assert_equal( x.value.to_s, "1.5" )
assert_equal( a1.a10_fptr(x), "6.5" )
assert_equal( x.value.to_s, "6.5" )
assert_equal( a1.a10_fptr(1), "6" )
assert_equal( a1.a10_fptr(nil), "nil" )
assert_equal( a1.a10_fptr(RBA::Value.new), "nil" )
assert_equal( x.to_s, "6.5" )
assert_equal( x.value.to_s, "6.5" )
x = RBA::Value.new(2.5)
assert_equal( a1.a10_dptr(x), "8.5" )
assert_equal( a1.a10_dptr(2), "8" )
assert_equal( a1.a10_dptr(nil), "nil" )
assert_equal( a1.a10_dptr(RBA::Value.new), "nil" )
assert_equal( x.to_s, "8.5" )
assert_equal( x.value.to_s, "8.5" )
x = RBA::Value.new(2)
assert_equal( a1.a10_iptr(x), "9" )
assert_equal( a1.a10_iptr(3), "10" )
assert_equal( a1.a10_iptr(nil), "nil" )
assert_equal( a1.a10_iptr(RBA::Value.new), "nil" )
assert_equal( x.to_s, "9" )
assert_equal( x.value.to_s, "9" )
x = RBA::Value.new(false)
assert_equal( a1.a10_bptr(x), "true" )
assert_equal( a1.a10_bptr(false), "true" )
assert_equal( a1.a10_bptr(nil), "nil" )
assert_equal( a1.a10_bptr(RBA::Value.new), "nil" )
assert_equal( x.to_s, "true" )
assert_equal( x.value.to_s, "true" )
x = RBA::Value.new(10)
assert_equal( a1.a10_uiptr(x), "20" )
assert_equal( a1.a10_uiptr(11), "21" )
assert_equal( a1.a10_uiptr(nil), "nil" )
assert_equal( a1.a10_uiptr(RBA::Value.new), "nil" )
assert_equal( x.to_s, "20" )
assert_equal( x.value.to_s, "20" )
x = RBA::Value.new(10)
assert_equal( a1.a10_ulptr(x), "21" )
assert_equal( a1.a10_ulptr(12), "23" )
assert_equal( a1.a10_ulptr(nil), "nil" )
assert_equal( a1.a10_ulptr(RBA::Value.new), "nil" )
assert_equal( x.to_s, "21" )
assert_equal( x.value.to_s, "21" )
x = RBA::Value.new(10)
assert_equal( a1.a10_lptr(x), "22" )
assert_equal( a1.a10_lptr(11), "23" )
assert_equal( a1.a10_lptr(nil), "nil" )
assert_equal( a1.a10_lptr(RBA::Value.new), "nil" )
assert_equal( x.to_s, "22" )
assert_equal( x.value.to_s, "22" )
x = RBA::Value.new(10)
assert_equal( a1.a10_llptr(x), "23" )
assert_equal( a1.a10_llptr(11), "24" )
assert_equal( a1.a10_llptr(nil), "nil" )
assert_equal( a1.a10_llptr(RBA::Value.new), "nil" )
assert_equal( x.to_s, "23" )
assert_equal( x.value.to_s, "23" )
x = RBA::Value.new(10)
assert_equal( a1.a10_ullptr(x), "24" )
assert_equal( a1.a10_ullptr(12), "26" )
assert_equal( a1.a10_ullptr(nil), "nil" )
assert_equal( a1.a10_ullptr(RBA::Value.new), "nil" )
assert_equal( x.to_s, "24" )
assert_equal( x.value.to_s, "24" )
assert_equal( a1.a10_sptr(nil), "nil" )
x = RBA::Value.new("z")
assert_equal( a1.a10_sptr(x), "zx" )
assert_equal( a1.a10_sptr("a"), "ax" )
assert_equal( a1.a10_sptr(RBA::Value.new), "nil" )
assert_equal( x.to_s, "zx" )
assert_equal( x.value.to_s, "zx" )
# String modification is not possible in Ruby API, hence strings cannot be used
# directly as out parameters (but as boxed values they can)
x = "z"
assert_equal( a1.a10_sptr(x), "zx" )
assert_equal( x, "z" )
begin
# passing other objects than StringValue and a string fails
assert_equal( a1.a10_sptr([]), "nil" )
err = false
rescue
err = true
end
assert_equal( err, true )
assert_equal( a1.a10_cfptr(6.5), "6.5" )
assert_equal( a1.a10_cfptr(nil), "nil" )
assert_equal( a1.a10_cdptr(8.5), "8.5" )
assert_equal( a1.a10_cdptr(nil), "nil" )
assert_equal( a1.a10_ciptr(9), "9" )
assert_equal( a1.a10_ciptr(nil), "nil" )
assert_equal( a1.a10_cbptr(true), "true" )
assert_equal( a1.a10_cbptr(nil), "nil" )
assert_equal( a1.a10_cuiptr(20), "20" )
assert_equal( a1.a10_cuiptr(nil), "nil" )
assert_equal( a1.a10_culptr(21), "21" )
assert_equal( a1.a10_culptr(nil), "nil" )
assert_equal( a1.a10_clptr(22), "22" )
assert_equal( a1.a10_clptr(nil), "nil" )
assert_equal( a1.a10_cllptr(23), "23" )
assert_equal( a1.a10_cllptr(nil), "nil" )
assert_equal( a1.a10_cullptr(24), "24" )
assert_equal( a1.a10_cullptr(nil), "nil" )
assert_equal( a1.a10_csptr(nil), "nil" )
assert_equal( a1.a10_csptr("x"), "x" )
x = RBA::Value.new(1.5)
assert_equal( a1.a10_fref(x), "11.5" )
begin
assert_equal( a1.a10_fref(nil), "nil" )
err = false
rescue
err = true
end
assert_equal( err, true )
begin
assert_equal( a1.a10_fref(RBA::Value.new), "nil" )
err = false
rescue
err = true
end
assert_equal( err, true )
assert_equal( x.value.to_s, "11.5" )
x = RBA::Value.new(2.5)
assert_equal( a1.a10_dref(x), "13.5" )
assert_equal( a1.a10_dref(2), "13" )
assert_equal( x.value.to_s, "13.5" )
x = RBA::Value.new(2)
assert_equal( a1.a10_iref(x), "14" )
assert_equal( a1.a10_iref(1), "13" )
assert_equal( x.value.to_s, "14" )
x = RBA::Value.new(false)
assert_equal( a1.a10_bref(x), "true" )
assert_equal( a1.a10_bref(false), "true" )
assert_equal( x.value.to_s, "true" )
x = RBA::Value.new(10)
assert_equal( a1.a10_uiref(x), "24" )
assert_equal( a1.a10_uiref(11), "25" )
assert_equal( x.value.to_s, "24" )
x = RBA::Value.new(10)
assert_equal( a1.a10_ulref(x), "25" )
assert_equal( a1.a10_ulref(12), "27" )
assert_equal( x.value.to_s, "25" )
x = RBA::Value.new(10)
assert_equal( a1.a10_lref(x), "26" )
assert_equal( a1.a10_lref(13), "29" )
assert_equal( x.value.to_s, "26" )
x = RBA::Value.new(10)
assert_equal( a1.a10_llref(x), "27" )
assert_equal( a1.a10_llref(14), "31" )
assert_equal( x.value.to_s, "27" )
x = RBA::Value.new(10)
assert_equal( a1.a10_ullref(x), "28" )
assert_equal( a1.a10_ullref(11), "29" )
assert_equal( x.value.to_s, "28" )
x = RBA::Value.new("x")
assert_equal( a1.a10_sref(x), "xy" )
assert_equal( x.value.to_s, "xy" )
assert_equal( a1.a10_sref("p"), "py" )
assert_equal( a1.a10_cfref(6.5), "6.5" )
begin
assert_equal( a1.a10_cfref(nil), "nil" )
err = false
rescue
err = true
end
assert_equal( err, true )
assert_equal( a1.a10_cdref(8.5), "8.5" )
assert_equal( a1.a10_ciref(9), "9" )
assert_equal( a1.a10_cbref(true), "true" )
assert_equal( a1.a10_cuiref(20), "20" )
assert_equal( a1.a10_culref(21), "21" )
assert_equal( a1.a10_clref(22), "22" )
assert_equal( a1.a10_cllref(23), "23" )
assert_equal( a1.a10_cullref(24), "24" )
assert_equal( a1.a10_csref("x"), "x" )
end
def test_13
b = RBA::B.new
if !$leak_check
err_caught = false
begin
b.amember_cptr.a1 # cannot call non-const method on const reference
rescue
err_caught = true
end
assert_equal( err_caught, true )
end
b.amember_cptr.a2
assert_equal( b.b1, 5 )
assert_equal( b.b2, "" )
b.b5( "xyz" )
assert_equal( b.b2, "xyz" )
assert_equal( b.b5a, "xyz" )
b.b5b( "yx", "zz" )
assert_equal( b.b2, "yxzz" )
assert_equal( b.b5a, "yxzz" )
arr = []
err_caught = false
if !$leak_check
begin
b.b10 { |a| arr.push(a.a1) } # b10 is a const iterator - cannot call a1 on it
rescue
err_caught = true
end
assert_equal( err_caught, true )
assert_equal(arr, [])
end
err_caught = false
if !$leak_check
begin
b.b10p { |a| arr.push(a.a1) } # b10p is a const iterator - cannot call a1 on it
rescue
err_caught = true
end
assert_equal( err_caught, true )
assert_equal(arr, [])
end
arr = []
b.b10 { |a| arr.push(a.dup.a1) }
assert_equal(arr, [100, 121, 144])
arr = []
b.dup.b10 { |a| arr.push(a.dup.a1) }
assert_equal(arr, [100, 121, 144])
arr = []
b.b10 { |a| arr.push(a.a1c) }
assert_equal(arr, [100, 121, 144])
arr = []
b.b10p { |a| arr.push(a.dup.a1) }
assert_equal(arr, [100, 121, 144])
arr = []
b.dup.b10p { |a| arr.push(a.dup.a1) }
assert_equal(arr, [100, 121, 144])
arr = []
b.b10p { |a| arr.push(a.a1c) }
assert_equal(arr, [100, 121, 144])
arr = []
b.b11 { |a| arr.push(a.a1) }
assert_equal(arr, [100, 121, 144])
arr = []
b.dup.b11 { |a| arr.push(a.a1) }
assert_equal(arr, [100, 121, 144])
arr = []
b.b12 { |a| arr.push(a.a1) }
assert_equal(arr, [7100, 7121, 7144, 7169])
arr = []
b.dup.b12 { |a| arr.push(a.a1) }
assert_equal(arr, [7100, 7121, 7144, 7169])
aarr = b.b16a
arr = []
aarr.each { |a| arr.push(a.a1) }
assert_equal(arr, [100, 121, 144])
aarr = b.b16b
arr = []
aarr.each { |a| arr.push(a.a1) }
assert_equal(arr, [100, 121, 144])
aarr = b.b16c
arr = []
aarr.each { |a| arr.push(a.a1) }
assert_equal(arr, [100, 121, 144])
b.b17a( [ RBA::A.new_a( 101 ), RBA::A.new_a( -122 ) ] )
arr = []
b.b11 { |a| arr.push(a.a1) }
assert_equal(arr, [101, -122])
b.b17a( [] )
arr = []
b.b11 { |a| arr.push(a.a1) }
assert_equal(arr, [])
b.b17b( [ RBA::A.new_a( 102 ), RBA::A.new_a( -123 ) ] )
arr = []
b.b11 { |a| arr.push(a.a1) }
assert_equal(arr, [102, -123])
b.b17c( [ RBA::A.new_a( 100 ), RBA::A.new_a( 121 ), RBA::A.new_a( 144 ) ] )
arr = []
b.b11 { |a| arr.push(a.a1) }
assert_equal(arr, [100, 121, 144])
if !$leak_check
arr = []
begin
b.b13 { |a| arr.push(a.a1) }
rescue
err_caught = true
end
assert_equal( err_caught, true )
assert_equal(arr, [])
end
arr = []
b.b13 { |a| arr.push(a.a1c) }
assert_equal(arr, [-3100, -3121])
arr = []
b.dup.b13 { |a| arr.push(a.a1c) }
assert_equal(arr, [-3100, -3121])
arr = []
b.b18 { |a| arr.push(a.a1c) }
assert_equal(arr, [100, 121, 144])
arr = []
b.b18 { |a| arr.push(a.a1) }
assert_equal(arr, [100, 121, 144])
arr = []
b.b18b { |a| arr.push(a.a1c) }
assert_equal(arr, [100, 121, 144])
arr = []
# even though b18b returns a "const A &", calling a non-const method does not work
# since A is a managed object and is not turned into a copy.
err_caught = false
begin
b.b18b { |a| arr.push(a.a1) }
rescue
err_caught = true
end
assert_equal(arr, [])
assert_equal(err_caught, true)
arr = []
b.b18c { |a| arr.push(a.a1c) }
assert_equal(arr, [100, 121, 144])
arr = []
# this does not work since b18c delivers a "const *" which cannot be used to call a non-const
# method on
err_caught = false
begin
b.b18c { |a| arr.push(a.a1) }
rescue
err_caught = true
end
assert_equal(arr, [])
assert_equal(err_caught, true)
end
def test_13b
b = RBA::B.new
bb = RBA::B.new
bb.b5("a")
b.push_b(bb)
bb = RBA::B.new
bb.b5("y")
b.push_b(bb)
bb = RBA::B.new
bb.b5("uu")
b.push_b(bb)
arr = []
b.each_b_copy { |bb| arr.push(bb.b2) }
assert_equal(arr, ["a", "y", "uu"])
arr = []
b.each_b_copy { |bb| bb.b5(bb.b2 + "x"); arr.push(bb.b2) }
assert_equal(arr, ["ax", "yx", "uux"])
arr = []
b.each_b_copy { |bb| arr.push(bb.b2) }
assert_equal(arr, ["a", "y", "uu"])
arr = []
b.each_b_cref { |bb| arr.push(bb.b2) }
assert_equal(arr, ["a", "y", "uu"])
arr = []
# this works, since the "const B &" will be converted to a copy
b.each_b_cref { |bb| bb.b5(bb.b2 + "x"); arr.push(bb.b2) }
assert_equal(arr, ["ax", "yx", "uux"])
arr = []
# since that was a copy, the b children were not modified
b.each_b_cref { |bb| arr.push(bb.b2) }
assert_equal(arr, ["a", "y", "uu"])
arr = []
b.each_b_cptr { |bb| arr.push(bb.b2) }
assert_equal(arr, ["a", "y", "uu"])
arr = []
# const references cannot be modified
err_caught = false
begin
b.each_b_cptr { |bb| bb.b5(bb.b2 + "x"); arr.push(bb.b2) }
rescue
err_caught = true
end
assert_equal(err_caught, true)
assert_equal(arr, [])
arr = []
b.each_b_cptr { |bb| arr.push(bb.b2) }
assert_equal(arr, ["a", "y", "uu"])
arr = []
b.each_b_ref { |bb| arr.push(bb.b2) }
assert_equal(arr, ["a", "y", "uu"])
arr = []
b.each_b_ref { |bb| bb.b5(bb.b2 + "x"); arr.push(bb.b2) }
assert_equal(arr, ["ax", "yx", "uux"])
arr = []
b.each_b_ref { |bb| arr.push(bb.b2) }
assert_equal(arr, ["ax", "yx", "uux"])
arr = []
b.each_b_ptr { |bb| arr.push(bb.b2) }
assert_equal(arr, ["ax", "yx", "uux"])
arr = []
b.each_b_ptr { |bb| bb.b5(bb.b2 + "x"); arr.push(bb.b2) }
assert_equal(arr, ["axx", "yxx", "uuxx"])
arr = []
b.each_b_ptr { |bb| arr.push(bb.b2) }
assert_equal(arr, ["axx", "yxx", "uuxx"])
end
def test_14
a = RBA::A.new
a.a5( 22 )
b = RBA::B.new
assert_equal( b.b3( a ), 22 )
assert_equal( b.b4( a ), "b4_result: 22" )
a.a5( -6 )
assert_equal( b.b3( a ), -6 )
assert_equal( b.b4( a ), "b4_result: -6" )
assert_equal( b.b4( RBA::A.new ), "b4_result: 17" )
end
def test_15
a = RBA::A_NC.new
assert_equal( true, a.is_a?(RBA::A) )
a.a5( 22 )
b = RBA::B.new
assert_equal( b.b3( a ), 22 )
assert_equal( b.b4( a ), "b4_result: 22" )
a.a5( -6 )
assert_equal( b.b3( a ), -6 )
assert_equal( b.b4( a ), "b4_result: -6" )
assert_equal( b.b4( RBA::A_NC.new ), "b4_result: 17" )
end
# TODO: this class is going to be deprecated
class X < Data
end
class Y < Object
end
def test_16
if $leak_check
return
end
# Test, if this throws an error (object of class X passed to A argument):
begin
b = RBA::B.new
assert_equal( b.b4( X.new ), "b4_result: -6" )
assert_equal( false, true ) # this must never hit
rescue
assert_equal( $!.to_s(), "allocator undefined for Basic_TestClass::X" );
end
# Test, if this throws an error (object of class X passed to A argument):
begin
b = RBA::B.new
assert_equal( b.b4( Y.new ), "b4_result: -6" )
assert_equal( false, true ) # this must never hit
rescue
assert_equal( $!.to_s(), "Unexpected object type (expected argument of class A, got Basic_TestClass::Y) in B::b4" );
end
# Test, if this throws an error (object of class X passed to A argument):
begin
b = RBA::B.new
bb = RBA::B.new
assert_equal( b.b4( bb ), "b4_result: -6" )
assert_equal( false, true ) # this must never hit
rescue
assert_equal( $!.to_s(), "Unexpected object type (expected argument of class A, got RBA::B) in B::b4" );
end
end
def test_17
# test copies of objects being returned
b = RBA::B.new
b._create
GC.start
a_count = RBA::A.instance_count
a = b.make_a( 1971 );
assert_equal( RBA::A.instance_count, a_count + 1 )
assert_equal( a.a1, 1971 );
assert_equal( b.an( a ), 1971 );
aa = b.make_a( -61 );
assert_equal( RBA::A.instance_count, a_count + 2 )
assert_equal( b.an_cref( aa ), -61 );
assert_equal( a.a1, 1971 );
assert_equal( b.an( a ), 1971 );
assert_equal( aa.a1, -61 );
assert_equal( b.an( aa ), -61 );
aa.a5 98;
a.a5 100;
assert_equal( a.a1, 100 );
assert_equal( b.an( a ), 100 );
assert_equal( aa.a1, 98 );
assert_equal( b.an( aa ), 98 );
a._destroy
aa = nil
GC.start
assert_equal( RBA::A.instance_count, a_count )
end
def test_18
# Test references to objects (returned by b.amember_cptr)
b = RBA::B.new
b.set_an( 77 )
assert_equal( b.amember_cptr.a1c, 77 );
b.set_an_cref( 79 )
assert_equal( b.amember_cptr.a1c, 79 );
aref = b.amember_cptr
err_caught = false
if !$leak_check
begin
x = aref.a1 # cannot call non-const method on const reference (as delivered by amember_cptr)
rescue
err_caught = true
end
assert_equal( err_caught, true )
assert_equal( aref.a1c, 79 );
end
b.set_an( -1 )
assert_equal( aref.a1c, -1 );
end
class C_IMP1 < RBA::C
def f(s)
return 615
end
end
class C_IMP2 < RBA::C
def f(s)
return s.size
end
end
class C_IMP3 < RBA::C
end
class C_IMP4 < RBA::C
def initialize
@x = @xx = nil
end
def x
@x
end
def xx
@xx
end
def vfunc(cd)
@x = cd.x
@xx = cd.xx
end
end
def test_19
c0 = RBA::C.new
assert_equal( c0.g("x"), 1977 );
c1 = C_IMP1.new
assert_equal( c1.g("x"), 615 );
c2 = C_IMP2.new
assert_equal( c2.g("x"), 1 );
assert_equal( c2.g(""), 0 );
assert_equal( c2.g("abc"), 3 );
assert_equal( c1.g("x"), 615 );
c3 = C_IMP3.new
assert_equal( c3.g("x"), 1977 );
assert_equal( RBA::C.s1, 4451 );
RBA::C.s2clr
RBA::C.s2( 7.0 )
assert_equal( RBA::C.s3( 5.5 ), "5.500" );
arr = []
RBA::C.each { |i| arr.push i }
assert_equal( arr, [ 0, 1, 2, 3, 4, 5, 6 ] )
assert_equal( C_IMP1.s1, 4451 );
C_IMP1.s2( 1.0 )
assert_equal( C_IMP1.s3( 1.5 ), "1.500" );
arr = []
C_IMP1.each { |i| arr.push i }
assert_equal( arr, [ 0, 1, 2, 3, 4, 5, 6, 0 ] )
assert_equal( C_IMP2.s1, 4451 );
C_IMP2.s2( 2.0 )
assert_equal( C_IMP2.s3( -1.5 ), "-1.500" );
arr = []
C_IMP2.each { |i| arr.push i }
assert_equal( arr, [ 0, 1, 2, 3, 4, 5, 6, 0, 0, 1 ] )
c4 = C_IMP4.new
c4.call_vfunc(RBA::CopyDetector::new(17))
assert_equal(c4.x, 17)
assert_equal(c4.xx, 17)
end
def test_20
b = RBA::B.new
a1 = b.amember_or_nil( true )
a2 = b.amember_ptr
assert_equal( a1.a1, 17 )
assert_equal( a2.a1, 17 )
a1.a5( 761 )
assert_equal( a1.a1, 761 )
assert_equal( a2.a1, 761 )
a1 = b.amember_or_nil( false )
assert_equal( a1, nil )
assert_equal( b.b15( b.amember_ptr ), true )
assert_equal( b.b15( b.amember_or_nil( false ) ), false )
assert_equal( b.b15( nil ), false )
end
def test_21
# test client data binding to C++ objects
b = RBA::B.new
b.amember_ptr.s( 117 )
assert_equal( b.amember_ptr.g, 117 )
n = 0
b.b10_nc { |a| a.s( n ); n += 1 }
arr = []
b.b10 { |a| arr.push( a.g ) }
assert_equal( arr, [ 0, 1, 2 ] )
arr = []
b.b10p { |a| arr.push( a.g ) }
assert_equal( arr, [ 0, 1, 2 ] )
end
def test_22
# test client data binding to C++ objects
b = RBA::B.new
assert_equal( b.b20a( 5.0 ), false )
assert_equal( b.b20a( nil ), true )
assert_equal( b.b20a( 1 ), false )
assert_equal( b.b20a( "hallo" ), false )
assert_equal( b.b20a( false ), false )
assert_equal( b.b20a( true ), false )
assert_equal( b.b20a( 10000000000000000 ), false )
assert_equal( b.b20b( 5.0 ), true )
assert_equal( b.b20b( nil ), false )
assert_equal( b.b20b( 1 ), false )
assert_equal( b.b20b( "hallo" ), false )
assert_equal( b.b20b( false ), false )
assert_equal( b.b20b( true ), false )
# on 64 bit platforms this fits into a long value, therefore this test returns false:
# assert_equal( b.b20b( 10000000000000000 ), false )
assert_equal( b.b20c( 5.0 ), false )
assert_equal( b.b20c( nil ), false )
assert_equal( b.b20c( 1 ), true )
assert_equal( b.b20c( "hallo" ), false )
assert_equal( b.b20c( false ), false )
assert_equal( b.b20c( true ), false )
# on 64 bit platforms this fits into a long value, therefore this test returns true:
# assert_equal( b.b20c( 10000000000000000 ), false )
assert_equal( b.b20d( 5.0 ), false )
assert_equal( b.b20d( nil ), false )
assert_equal( b.b20d( 1 ), false )
assert_equal( b.b20d( "hallo" ), true )
assert_equal( b.b20d( false ), false )
assert_equal( b.b20d( true ), false )
assert_equal( b.b20d( 10000000000000000 ), false )
assert_equal( b.b20e( 5.0 ), false )
assert_equal( b.b20e( nil ), false )
assert_equal( b.b20e( 1 ), false )
assert_equal( b.b20e( "hallo" ), false )
assert_equal( b.b20e( false ), true )
assert_equal( b.b20e( true ), true )
assert_equal( b.b20e( 10000000000000000 ), false )
assert_equal( b.b21a( 50 ), "50" )
assert_equal( b.b21a( true ), "true" )
assert_equal( b.b21a( false ), "false" )
assert_equal( b.b21a( "hallo" ), "hallo" )
assert_equal( b.b21a( 5.5 ), "5.5" )
assert_equal( b.b21a( nil ), "nil" )
assert_equal( b.b21b( 50 ), 50.0 )
assert_equal( b.b21b( true ), 1.0 )
assert_equal( b.b21b( false ), 0.0 )
assert_equal( b.b21b( 5.5 ), 5.5 )
assert_equal( b.b21b( nil ), 0.0 )
assert_equal( b.b21c( 50 ), 50 )
assert_equal( b.b21c( true ), 1 )
assert_equal( b.b21c( false ), 0 )
assert_equal( b.b21c( 5.5 ), 5 )
assert_equal( b.b21c( nil ), 0 )
assert_equal( b.b22a( [ 1, "hallo", 5.5 ] ), 3 )
assert_equal( b.b23a, [ 1, "hallo", 5.5 ] )
a = []
b.b24 { |x| a.push( x ) }
assert_equal( a, [ 1, "hallo", 5.5 ] )
assert_equal( b.b22c, 5.5 )
assert_equal( b.b22d, 5.5 )
assert_equal( b.b22a( [ 1, "hallo" ] ), 2 )
assert_equal( b.b23b, [ 1, "hallo" ] )
assert_equal( b.b23d, [ 1, "hallo" ] )
assert_equal( b.b23e, [ 1, "hallo" ] )
assert_equal( b.b23e_null, nil )
assert_equal( b.b23f, [ 1, "hallo" ] )
assert_equal( b.b23f_null, nil )
assert_equal( b.b22c, "hallo" )
assert_equal( b.b22d, "hallo" )
assert_equal( b.b22a( [ ] ), 0 )
assert_equal( b.b23c, [ ] )
a = []
b.b24 { |x| a.push( x ) }
assert_equal( a, [ ] )
assert_equal( b.b22b, nil )
assert_equal( b.b22c, nil )
assert_equal( b.b22d, nil )
assert_equal( b.b22a( [ [ 1, "hallo" ], [ 10, 17, 20 ] ] ), 2 )
assert_equal( b.b23a, [ [ 1, "hallo" ], [ 10, 17, 20 ] ] )
a = []
b.b24 { |x| a.push( x ) }
assert_equal( a, [ [ 1, "hallo" ], [ 10, 17, 20 ] ] )
# ability to pass complex objects over tl::Variant:
assert_equal( b.b22a( [ RBA::Box.new(RBA::Point.new(0, 0), RBA::Point.new(10, 20)) ] ), 1 )
assert_equal( b.b22c.to_s, "(0,0;10,20)" )
assert_equal( b.b22c.class.inspect, "RBA::Box" )
# ability to pass complex objects over tl::Variant:
assert_equal( b.b22a( [ RBA::DBox.new(RBA::DPoint.new(0, 0), RBA::DPoint.new(10, 20)) ] ), 1 )
assert_equal( b.b22c.to_s, "(0,0;10,20)" )
assert_equal( b.b22c.class.inspect, "RBA::DBox" )
# ability to pass complex objects over tl::Variant:
assert_equal( b.b22a( [ RBA::LayerInfo.new("hallo") ] ), 1 )
assert_equal( b.b22c.to_s, "hallo" )
assert_equal( b.b22c.class.inspect, "RBA::LayerInfo" )
end
def test_23
b = RBA::B::new
a = RBA::A::new
assert_equal( b.bx, 17 )
assert_equal( b.b30, 17 )
assert_equal( b.bx( 5 ), "xz" )
assert_equal( b.by( 5 ), "xz" )
assert_equal( b.b31( 6 ), "xz" )
assert_equal( b.b33( a ), "aref" )
assert_equal( b.bx( a ), "aref" )
assert_equal( b.bx( "a", 15 ), 20.5 )
assert_equal( b.b32( "b", 25 ), 20.5 )
GC.start
na = RBA::A::instance_count # instance count
assert_equal( b.bx( a, 15 ), "aref+i" )
GC.start
assert_equal( RBA::A::instance_count, na )
err_caught = false
begin
# cannot cast second argument to int
assert_equal( b.b34( a, "X" ), "aref+i" )
rescue => ex
err_caught = true
end
assert_equal( err_caught, true )
# the exception thrown before must not leave an instance on the call stack:
GC.start
assert_equal( RBA::A::instance_count, na )
err_caught = false
begin
# invalid number of arguments
assert_equal( b.by, "xz" )
rescue
err_caught = true
end
assert_equal( err_caught, true )
err_caught = false
begin
# invalid number of arguments
assert_equal( b.bx( 1, 5, 7 ), "xz" )
rescue
err_caught = true
end
assert_equal( err_caught, true )
b.destroy
a.destroy
end
def test_24
n0 = 0
n1 = 0
n2 = ""
# Events
e = RBA::E.new
e.m = 100
e.s1 # no event installed
assert_equal( 0, n0 )
e.s2
assert_equal( 0, n1 )
e.s3
assert_equal( "", n2 )
assert_equal( 100, e.m )
e.e0 { n0 += 1 }
e.e1 { |x| n1 += x.m }
e.e2 { |i,s| n2 += i.to_s + s; }
e.s1
assert_equal( 1, n0 )
e.s1
assert_equal( 2, n0 )
# using lambda
p = lambda { n0 += 2 }
e.e0(&p)
e.s1
assert_equal( 4, n0 )
e.s2
assert_equal( 100, n1 )
e.m = 1
e.s2
assert_equal( 101, n1 )
e.s3
assert_equal( "18hallo", n2 )
e.s3
assert_equal( "18hallo18hallo", n2 )
if false
# currently, exceptions are not thrown into events
e.e0 { raise "X" }
error_caught = false
begin
e.s1
rescue
error_caught = true
end
assert_equal( error_caught, true )
end
if false
# currently, return values are not available for events
e.e0r { 5; }
assert_equal( e.s1r("x"), 5 )
e.e0r { |s| s.length + 2; }
assert_equal( e.s1r("x"), 3 )
assert_equal( e.s1r("abcxyz"), 8 )
end
end
def test_25
# destruction of an instance via c++
GC.start
ic0 = RBA::A.instance_count
a = RBA::A::new
a.create
assert_equal(a.destroyed?, false)
assert_equal(RBA::A.instance_count, ic0 + 1)
RBA::A.a20(a) # install static instance of A
assert_equal(a.destroyed?, false)
RBA::A.a20(nil)
assert_equal(RBA::A.instance_count, ic0)
assert_equal(a.destroyed?, true)
a = RBA::A::new
a.create
assert_equal(a.destroyed?, false)
assert_equal(RBA::A.instance_count, ic0 + 1)
RBA::A.a20(a) # install static instance of A
assert_equal(a.destroyed?, false)
assert_equal(RBA::A.instance_count, ic0 + 1)
RBA::A.a20(a) # re-install static instance of A
assert_equal(a.destroyed?, false)
assert_equal(RBA::A.instance_count, ic0 + 1)
# install another instance
aa = RBA::A::new
aa.create
assert_equal(aa.destroyed?, false)
assert_equal(RBA::A.instance_count, ic0 + 2)
RBA::A.a20(aa) # install static instance of A
# original one is destroyed now, only new instance remains
assert_equal(a.destroyed?, true)
assert_equal(aa.destroyed?, false)
assert_equal(RBA::A.instance_count, ic0 + 1)
RBA::A.a20(nil) # discard installed instance
assert_equal(aa.destroyed, true)
assert_equal(RBA::A.instance_count, ic0)
# the same without create .. should work too, but not create an instance because of late
# instantiation in default ctor
a = RBA::A::new
assert_equal(a.destroyed?, false)
assert_equal(RBA::A.instance_count, ic0)
RBA::A.a20(a) # install static instance of A
assert_equal(a.destroyed?, false)
RBA::A.a20(nil)
assert_equal(RBA::A.instance_count, ic0)
assert_equal(a.destroyed?, true)
end
def test_26
# destruction of an instance via c++
GC.start
ic0 = RBA::A.instance_count
1.times do
a = RBA::A::new
a._create
assert_equal(a.destroyed?, false)
assert_equal(RBA::A.instance_count, ic0 + 1)
RBA::A.a20(a) # install static instance of A
assert_equal(RBA::A.a20_get == nil, false)
end
# makes sure the objects inside the block before are deleted
GC.start
assert_equal(RBA::A.instance_count, ic0)
assert_equal(RBA::A.a20_get == nil, true)
# "unmanage" will freeze the object and not make it destroyed by the GC
1.times do
a = RBA::A::new
a._create
assert_equal(a.destroyed?, false)
assert_equal(RBA::A.instance_count, ic0 + 1)
RBA::A.a20(a) # install static instance of A
assert_equal(RBA::A.a20_get == nil, false)
a._unmanage
end
# makes sure the objects inside the block before are deleted
GC.start
assert_equal(RBA::A.instance_count, ic0 + 1)
assert_equal(RBA::A.a20_get == nil, false)
# after "manage" the object gets volatile again
1.times do
a = RBA::A.a20_get
a._manage
end
# Looks like Ruby is keeping the last A instance in some kind of cache:
# this will release it
a = RBA::A.new
a._destroy
a = nil
# makes sure the objects inside the block before are deleted
GC.start
assert_equal(RBA::A.instance_count, ic0)
assert_equal(RBA::A.a20_get == nil, true)
end
def test_27
# destruction of raw instances (non-gsi-enabled) via c++
GC.start
assert_equal(RBA::B.inst == nil, true)
assert_equal(RBA::B.has_inst, false)
1.times do
b = RBA::B::new
RBA::B.set_inst(b)
assert_equal(RBA::B.has_inst, true)
assert_equal(RBA::B.inst == b, false)
assert_equal(RBA::B.inst.addr, b.addr)
end
GC.start
assert_equal(RBA::B.has_inst, false)
1.times do
b = RBA::B::new
RBA::B.set_inst(b)
b._unmanage
$b_addr = b.addr
assert_equal(RBA::B.has_inst, true)
assert_equal(RBA::B.inst == b, false)
assert_equal(RBA::B.inst.addr, b.addr)
end
GC.start
assert_equal(RBA::B.has_inst, true)
assert_equal(RBA::B.inst.addr, $b_addr)
# Make it managed again
1.times do
# NOTE: putting this inside the block makes sure the
# GC will really delete the temporary objects *now* we create
# inside this expression
RBA::B.inst._manage
end
GC.start
assert_equal(RBA::B.has_inst, false)
end
def test_29
# copy/ref semantics on return
c = RBA::C::new
cd = RBA::CopyDetector::new(42)
cd2 = c.pass_cd_direct(cd)
assert_equal(cd2.x, 42)
# two copies: one for return statement and then one for the new object
assert_equal(cd2.xx, 44)
cd2 = c.pass_cd_cref(cd)
assert_equal(cd2.x, 42)
assert_equal(cd2.xx, 43)
cd2 = c.pass_cd_cref_as_copy(cd)
assert_equal(cd2.x, 42)
assert_equal(cd2.xx, 43)
cd2 = c.pass_cd_cref_as_ref(cd)
assert_equal(cd2.x, 42)
assert_equal(cd2.xx, 42)
cd2 = c.pass_cd_cptr(cd)
assert_equal(cd2.x, 42)
assert_equal(cd2.xx, 42)
cd2 = c.pass_cd_cptr_as_copy(cd)
assert_equal(cd2.x, 42)
assert_equal(cd2.xx, 43)
cd2 = c.pass_cd_cptr_as_ref(cd)
assert_equal(cd2.x, 42)
assert_equal(cd2.xx, 42)
cd2 = c.pass_cd_ptr(cd)
assert_equal(cd2.x, 42)
assert_equal(cd2.xx, 42)
cd2 = c.pass_cd_ptr_as_copy(cd)
assert_equal(cd2.x, 42)
assert_equal(cd2.xx, 43)
cd2 = c.pass_cd_ptr_as_ref(cd)
assert_equal(cd2.x, 42)
assert_equal(cd2.xx, 42)
cd2 = c.pass_cd_ref(cd)
assert_equal(cd2.x, 42)
assert_equal(cd2.xx, 42)
cd2 = c.pass_cd_ref_as_copy(cd)
assert_equal(cd2.x, 42)
assert_equal(cd2.xx, 43)
cd2 = c.pass_cd_ref_as_ref(cd)
assert_equal(cd2.x, 42)
assert_equal(cd2.xx, 42)
end
def test_30
# some basic tests for the *Value boxing classes
val = RBA::Value::new
assert_equal(val.to_s, "nil")
assert_equal(val.value, nil)
val.value = 17.5
assert_equal(val.value, 17.5)
assert_equal(val.to_s, "17.5")
val.value += 1
assert_equal(val.to_s, "18.5")
val = RBA::Value::new(5)
assert_equal(val.value, 5)
val.value = nil
assert_equal(val.value, nil)
assert_equal(val.to_s, "nil")
val = RBA::Value::new
assert_equal(val.to_s, "nil")
assert_equal(val.value, nil)
val.value = 17.5
assert_equal(val.value, 17.5)
assert_equal(val.to_s, "17.5")
val.value += 1
assert_equal(val.to_s, "18.5")
val = RBA::Value::new(5)
assert_equal(val.value, 5)
val.value = nil
assert_equal(val.value, nil)
assert_equal(val.to_s, "nil")
val = RBA::Value::new
assert_equal(val.to_s, "nil")
assert_equal(val.value, nil)
val.value = true
assert_equal(val.value, true)
assert_equal(val.to_s, "true")
val = RBA::Value::new(true)
assert_equal(val.value, true)
val.value = nil
assert_equal(val.value, nil)
assert_equal(val.to_s, "nil")
val = RBA::Value::new
assert_equal(val.to_s, "nil")
assert_equal(val.value, nil)
val.value = 17
assert_equal(val.value, 17)
assert_equal(val.to_s, "17")
val.value += 1
assert_equal(val.to_s, "18")
val = RBA::Value::new(5)
assert_equal(val.value, 5)
val.value = nil
assert_equal(val.value, nil)
assert_equal(val.to_s, "nil")
val = RBA::Value::new
assert_equal(val.to_s, "nil")
assert_equal(val.value, nil)
val.value = 17
assert_equal(val.value, 17)
assert_equal(val.to_s, "17")
val.value += 1
assert_equal(val.to_s, "18")
val = RBA::Value::new(5)
assert_equal(val.value, 5)
val.value = nil
assert_equal(val.value, nil)
assert_equal(val.to_s, "nil")
val = RBA::Value::new
assert_equal(val.to_s, "nil")
assert_equal(val.value, nil)
val.value = 17
assert_equal(val.value, 17)
assert_equal(val.to_s, "17")
val.value += 1
assert_equal(val.to_s, "18")
val = RBA::Value::new(5)
assert_equal(val.value, 5)
val.value = nil
assert_equal(val.value, nil)
assert_equal(val.to_s, "nil")
val = RBA::Value::new
assert_equal(val.to_s, "nil")
assert_equal(val.value, nil)
val.value = 2700000000
assert_equal(val.value, 2700000000)
assert_equal(val.to_s, "2700000000")
val.value += 1
assert_equal(val.to_s, "2700000001")
val = RBA::Value::new(500000000)
assert_equal(val.value, 500000000)
val.value = nil
assert_equal(val.value, nil)
assert_equal(val.to_s, "nil")
val = RBA::Value::new
assert_equal(val.to_s, "nil")
assert_equal(val.value, nil)
val.value = 170000000000
assert_equal(val.to_s, "170000000000")
assert_equal(val.value, 170000000000)
val.value += 1
assert_equal(val.to_s, "170000000001")
val = RBA::Value::new(50000000000)
assert_equal(val.value, 50000000000)
val.value = nil
assert_equal(val.value, nil)
assert_equal(val.to_s, "nil")
val = RBA::Value::new
assert_equal(val.to_s, "nil")
assert_equal(val.value, nil)
val.value = 170000000000
assert_equal(val.value, 170000000000)
assert_equal(val.to_s, "170000000000")
val.value += 1
assert_equal(val.to_s, "170000000001")
val = RBA::Value::new(50000000000)
assert_equal(val.value, 50000000000)
val.value = nil
assert_equal(val.value, nil)
assert_equal(val.to_s, "nil")
val = RBA::Value::new
assert_equal(val.value, nil)
assert_equal(val.to_s, "nil")
val.value = "abc"
assert_equal(val.value, "abc")
assert_equal(val.to_s, "abc")
val.value += "x"
assert_equal(val.to_s, "abcx")
val = RBA::Value::new("uv")
assert_equal(val.value, "uv")
val.value = nil
assert_equal(val.value, nil)
assert_equal(val.to_s, "nil")
end
def test_31
# some basic tests with derived and base classes
RBA::X.init
RBA::Y.init
x = RBA::X.new("hallo")
assert_equal(true, x.is_a?(RBA::X))
assert_equal(false, x.is_a?(RBA::A))
assert_equal(false, x.is_a?(RBA::Y))
assert_equal("hallo", x.s)
assert_equal("X", x.cls_name)
cxp = RBA::X.x_cptr
assert_equal("X::a", cxp.s)
begin
cxp.s = "x"
error_caught = false
rescue
error_caught = true
end
assert_equal(true, error_caught)
xp = RBA::X.x_ptr
assert_equal("X::a", xp.s)
xp.s = "x"
assert_equal("x", xp.s)
y = RBA::Y.new("hallo")
assert_equal(true, y.is_a?(RBA::X))
assert_equal(false, y.is_a?(RBA::A))
assert_equal(true, y.is_a?(RBA::Y))
assert_equal("hallo", y.s)
assert_equal("Y", y.cls_name)
assert_equal(5, y.i)
cyp = RBA::Y.y_cptr
assert_equal("Y::a", cyp.s)
assert_equal("Y", cyp.cls_name)
begin
cyp.s = "y"
error_caught = false
rescue
error_caught = true
end
assert_equal(true, error_caught)
yp = RBA::Y.y_ptr
assert_equal("Y", yp.cls_name)
assert_equal("Y::a", yp.s)
yp.s = "y"
assert_equal("y", yp.s)
assert_equal(1, yp.i)
yp.s = "abc"
assert_equal(3, yp.i)
assert_equal("RBA::Y", yp.class.to_s)
end
def test_32
# run test only if we have Qt bindings
if !RBA.constants.find { |x| x == :QStringPair }
return
end
# QPair<String, String>
p = RBA::QStringPair.new
p.first = "a"
p.second = "b"
assert_equal("a", p.first)
assert_equal("b", p.second)
pp = p.dup
assert_equal("a", pp.first)
assert_equal("b", pp.second)
pp.first = "u"
assert_equal("a", p.first)
assert_equal("b", p.second)
assert_equal("u", pp.first)
assert_equal("b", pp.second)
assert_equal(pp == p, false)
assert_equal(pp != p, true)
pp = RBA::QStringPair.new("a", "b")
assert_equal("a", pp.first)
assert_equal("b", pp.second)
assert_equal(pp == p, true)
assert_equal(pp != p, false)
end
def test_33
# run test only if we have Qt bindings
if !RBA.constants.find { |x| x == :QByteArrayPair }
return
end
# QPair<QByteArray, QByteArray>
p = RBA::QByteArrayPair.new
p.first = "a"
p.second = "b"
assert_equal("a", p.first)
assert_equal("b", p.second)
pp = p.dup
assert_equal("a", pp.first)
assert_equal("b", pp.second)
pp.first = "u"
assert_equal("a", p.first)
assert_equal("b", p.second)
assert_equal("u", pp.first)
assert_equal("b", pp.second)
assert_equal(pp == p, false)
assert_equal(pp != p, true)
pp = RBA::QByteArrayPair.new("a", "b")
assert_equal("a", pp.first)
assert_equal("b", pp.second)
assert_equal(pp == p, true)
assert_equal(pp != p, false)
end
def test_34
# run test only if we have Qt bindings
if !RBA.constants.find { |x| x == :QDialog }
return
end
# QDialog and QWidget
# Hint: QApplication creates some leaks (FT, GTK). Hence it must not be used in the leak_check case ..
if !$leak_check
app_inst = RBA::QCoreApplication.instance
assert_equal("RBA::Application", app_inst.class.to_s)
qd = RBA::QDialog.new
RBA::QApplication.setActiveWindow(qd)
assert_equal(RBA::QApplication.activeWindow.inspect, qd.inspect)
assert_equal("RBA::QDialog", RBA::QApplication.activeWindow.class.to_s)
qd._destroy
assert_equal(RBA::QApplication.activeWindow.inspect, "nil")
qd = RBA::QDialog.new
RBA::QApplication.setActiveWindow(qd)
assert_equal(RBA::QApplication.activeWindow.inspect, qd.inspect)
assert_equal("RBA::QDialog", RBA::QApplication.activeWindow.class.to_s)
qd._destroy
assert_equal(RBA::QApplication.activeWindow.inspect, "nil")
end
end
def test_35
# vectors of pointers
RBA::X.init
RBA::Y.init
vx_cptr = RBA::X.vx_cptr
assert_equal(2, vx_cptr.size)
begin
vx_cptr[0].s = "y"
error_caught = false
rescue
error_caught = true
end
assert_equal(true, error_caught)
vx = RBA::X.vx
assert_equal(2, vx.size)
assert_equal("X::a", vx[0].s)
assert_equal("X::b", vx[1].s)
vx_ptr = RBA::X.vx_ptr
assert_equal(2, vx_ptr.size)
assert_equal("RBA::X", vx_ptr[0].class.to_s)
assert_equal("RBA::X", vx_ptr[1].class.to_s)
vx_ptr[0].s = "u"
assert_equal("u", vx_cptr[0].s)
assert_equal("X::a", vx[0].s)
assert_equal("X::b", vx[1].s)
vy0_ptr = RBA::Y.vy0_ptr
assert_equal(1, vy0_ptr.size)
assert_equal("nil", vy0_ptr[0].inspect)
vy_cptr = RBA::Y.vy_cptr
assert_equal(2, vy_cptr.size)
begin
vy_cptr[0].s = "y"
error_caught = false
rescue
error_caught = true
end
assert_equal(true, error_caught)
vy_cptr = RBA::Y.vyasx_cptr
assert_equal(2, vy_cptr.size)
begin
vy_cptr[0].s = "y"
error_caught = false
rescue
error_caught = true
end
assert_equal(true, error_caught)
vy_ptr = RBA::Y.vy_ptr
assert_equal(2, vy_ptr.size)
assert_equal("RBA::Y", vy_ptr[0].class.to_s)
assert_equal("RBA::Y", vy_ptr[1].class.to_s)
vy_ptr[0].s = "uvw"
assert_equal("uvw", vy_cptr[0].s)
assert_equal(3, vy_cptr[0].i)
vy_ptr = RBA::Y.vyasx_ptr
assert_equal(2, vy_ptr.size)
assert_equal("RBA::Y", vy_ptr[0].class.to_s)
assert_equal("RBA::Y", vy_ptr[1].class.to_s)
vy_ptr[0].s = "uvw"
assert_equal("uvw", vy_cptr[0].s)
assert_equal(3, vy_cptr[0].i)
y = RBA::Y.new("")
yc = y.vx_dyn_count
y.vx_dyn_make
assert_equal(yc + 1, y.vx_dyn_count)
y.vx_dyn_destroy
assert_equal(yc, y.vx_dyn_count)
y.vx_dyn_make
assert_equal(yc + 1, y.vx_dyn_count)
yy = y.vx_dyn
assert_equal(1, yy.size)
assert_equal("RBA::Y", yy[0].class.to_s)
assert_equal(true, yy[0] != nil)
yy[0]._destroy
assert_equal(true, yy[0].destroyed?)
assert_equal(yc, y.vx_dyn_count)
y.vx_dyn_make
assert_equal(yc + 1, y.vx_dyn_count)
yy = y.vx_dyn
assert_equal(1, yy.size)
assert_equal("RBA::Y", yy[0].class.to_s)
assert_equal(true, yy[0] != nil)
y.vx_dyn_destroy
assert_equal(true, yy[0].destroyed?)
assert_equal(yc, y.vx_dyn_count)
end
def test_36
x = XEdge.new
assert_equal("XEdge", x.class.inspect)
assert_equal("(1,2;3,4)", x.to_s)
end
def test_37
# protected methods
ok = false
a = RBA::A.new
e = ""
begin
a.a10_prot # cannot be called - is protected
ok = true
rescue => ex
e = ex.to_s
end
assert_equal(e =~ /^protected method `a10_prot' called/, 0)
assert_equal(ok, false)
assert_equal(a.call_a10_prot(1.25), "1.25")
end
def test_38
# mixed const / non-const reference and events
ec = RBA::E.ic
assert_equal(ec.is_const_object?, true)
enc = RBA::E.inc
# Now, ec has turned into a non-const reference as well!
# This is strange but is a consequence of the unique C++/Ruby binding and there can
# only be a non-const or const ruby object!
assert_equal(ec.is_const_object?, false)
assert_equal(enc.is_const_object?, false)
# the "true reference" is a not copy since E is derived from ObjectBase
ec.x = 15
assert_equal(ec.x, 15);
ec2 = RBA::E.ic
assert_equal(ec2.x, 15);
ec2 = RBA::E.icref
assert_equal(ec2.x, 15);
ec2.x = 17
assert_equal(ec2.x, 17);
assert_equal(ec.x, 17);
assert_equal(ec2.is_const_object?, false) # because it's a copy
# the "true reference" is a not copy since E is derived from ObjectBase
enc2 = RBA::E.incref
assert_equal(enc2.x, 17);
enc2.x = 19
assert_equal(enc2.x, 19);
assert_equal(ec.x, 19); # because the non-const reference by incref is not a copy
end
def test_39
# mixed const / non-const reference and events
fc = RBA::F.ic
assert_equal(fc.is_const_object?, true)
fnc = RBA::F.inc
# In contrase to E, the fc reference is not touched because F is not derived
# from ObjectBase
assert_equal(fc.is_const_object?, true)
assert_equal(fnc.is_const_object?, false)
# the "true reference" is a copy
fnc.x = 15
assert_equal(fc.x, 15);
fc2 = RBA::F.ic
assert_equal(fc2.x, 15);
fc2 = RBA::F.icref
assert_equal(fc2.x, 15);
fc2.x = 17
assert_equal(fc2.x, 17);
assert_equal(fc.x, 15);
assert_equal(fc2.is_const_object?, false) # because it's a copy
# the "true reference" is a copy
fnc2 = RBA::F.incref
assert_equal(fnc2.x, 15);
fnc2.x = 19
assert_equal(fnc2.x, 19);
assert_equal(fc.x, 19); # because the non-const reference by incref is not a copy
end
def test_40
# optional arguments
g = RBA::G.new
assert_equal(g.iv, 0)
g.set_iva(2)
assert_equal(g.iv, 2)
g.set_ivb(3)
assert_equal(g.iv, 3)
g.set_ivb
assert_equal(g.iv, 1)
g.set_sv1a("hello")
assert_equal(g.sv, "hello")
failed = false
begin
g.set_sv1a
rescue
failed = true
end
assert_equal(failed, true)
g.set_sv1b("world")
assert_equal(g.sv, "world")
g.set_sv1b
assert_equal(g.sv, "value")
g.set_sv2a("hello")
assert_equal(g.sv, "hello")
failed = false
begin
g.set_sv2a
rescue
failed = true
end
assert_equal(failed, true)
g.set_sv2b("world")
assert_equal(g.sv, "world")
g.set_sv2b
assert_equal(g.sv, "value")
g.set_vva(17, "c")
assert_equal(g.iv, 17)
assert_equal(g.sv, "c")
failed = false
begin
g.set_svva
rescue
failed = true
end
assert_equal(failed, true)
failed = false
begin
g.set_svva(11)
rescue
failed = true
end
assert_equal(failed, true)
g.set_vvb(11)
assert_equal(g.iv, 11)
assert_equal(g.sv, "value")
g.set_vvb(10, "nil")
assert_equal(g.iv, 10)
assert_equal(g.sv, "nil")
failed = false
begin
g.set_svvb
rescue
failed = true
end
assert_equal(failed, true)
g.set_vvc(11)
assert_equal(g.iv, 11)
assert_equal(g.sv, "value")
g.set_vvc
assert_equal(g.iv, 1)
assert_equal(g.sv, "value")
g.set_vvc(17, "nil")
assert_equal(g.iv, 17)
assert_equal(g.sv, "nil")
end
def test_41
# maps
b = RBA::B.new
b.insert_map1(1, "hello")
assert_equal(b.map1.inspect, "{1=>\"hello\"}")
b.map1 = {}
b.insert_map1(2, "hello")
assert_equal(b.map1_cref.inspect, "{2=>\"hello\"}")
b.map1 = {}
b.insert_map1(3, "hello")
assert_equal(b.map1_cptr.inspect, "{3=>\"hello\"}")
b.map1 = {}
b.insert_map1(4, "hello")
assert_equal(b.map1_ref.inspect, "{4=>\"hello\"}")
b.map1 = {}
b.insert_map1(5, "hello")
assert_equal(b.map1_ptr.inspect, "{5=>\"hello\"}")
assert_equal(b.map1_cptr_null == nil, true);
assert_equal(b.map1_ptr_null == nil, true);
begin
b.map1 = { 42 => 1, -17 => true }
error = nil
rescue => ex
error = ex.message.split("\n")[0]
end
if error == "can't convert Fixnum into String"
# Ok
elsif error == "no implicit conversion of Fixnum into String" || error == "no implicit conversion of Integer into String"
# Ok
else
assert_equal(error, "")
end
b.map1 = { 42 => "1", -17 => "true" }
assert_equal(b.map1.inspect, "{-17=>\"true\", 42=>\"1\"}")
b.map1 = {}
b.set_map1_cref({ 42 => "2", -17 => "true" })
assert_equal(b.map1.inspect, "{-17=>\"true\", 42=>\"2\"}")
b.map1 = {}
b.set_map1_cptr({ 42 => "3", -17 => "true" })
assert_equal(b.map1.inspect, "{-17=>\"true\", 42=>\"3\"}")
b.map1 = {}
b.set_map1_cptr(nil)
assert_equal(b.map1.inspect, "{}")
b.map1 = {}
b.set_map1_cptr(nil)
assert_equal(b.map1.inspect, "{}")
b.map1 = {}
b.set_map1_ref({ 42 => "4", -17 => "true" })
assert_equal(b.map1.inspect, "{-17=>\"true\", 42=>\"4\"}")
b.map1 = {}
b.set_map1_ptr({ 42 => "5", -17 => "true" })
assert_equal(b.map1.inspect, "{-17=>\"true\", 42=>\"5\"}")
b.map1 = {}
b.set_map1_ptr(nil)
assert_equal(b.map1.inspect, "{}")
b.map2 = {}
b.map2 = { 'xy' => 1, -17 => true }
assert_equal(b.map2.inspect, "{-17=>true, \"xy\"=>1}")
assert_equal(b.map2_null == nil, true)
end
class Z_IMP1 < RBA::Z
def f(x)
return x.cls_name()
end
end
class Z_IMP2 < RBA::Z
def f(x)
return x.class.to_s()
end
end
const_defined?(:Z_IMP3) && remove_const(:Z_IMP3)
class Z_IMP3 < RBA::Z
alias f_org f
def f(x)
return self.f_org(x) + "*"
end
end
def test_42
# virtual functions and sub-classes
z = RBA::Z.new
assert_equal(z.f(nil), "(nil)")
assert_equal(z.f(RBA::X.new("hello")), "hello")
z1 = Z_IMP1::new
assert_equal(z1.f(RBA::X.new("a")), "X")
assert_equal(z1.f(RBA::Y.new("b")), "Y")
assert_equal(z1.f_with_x("a"), "X")
assert_equal(z1.f_with_y("b"), "Y")
assert_equal(z1.f_with_yy("b"), "YY")
z2 = Z_IMP2::new
assert_equal(z2.f(RBA::X.new("1")), "RBA::X")
assert_equal(z2.f(RBA::Y.new("2")), "RBA::Y")
assert_equal(z2.f_with_x("1"), "RBA::X")
assert_equal(z2.f_with_y("2"), "RBA::Y")
assert_equal(z2.f_with_yy("3"), "RBA::Y")
z1 = Z_IMP3::new
assert_equal(z1.f(RBA::X.new("x")), "x*")
assert_equal(z1.f(RBA::Y.new("y")), "y*")
assert_equal(z1.f_with_x("x"), "x*")
assert_equal(z1.f_with_y("y"), "y*")
assert_equal(z1.f_with_yy("yy"), "yy*")
end
def test_50
# advanced containers and out parameters
b = RBA::B::new
a1 = RBA::A::new
a1.s 42
a1.a5 11
a2 = RBA::A::new
a2.s 17
a2.a5 22
a3 = RBA::A::new
a3.s 33
a3.a5 33
b.set_map_iaptr( { 1 => a1, 2 => a2 } )
assert_equal(b.map_iaptr.inspect, "{1=>42, 2=>17}")
assert_equal(b.map_iaptr_cref.inspect, "{1=>42, 2=>17}")
assert_equal(b.map_iaptr_ref.inspect, "{1=>42, 2=>17}")
assert_equal(b.map_iaptr_cptr.inspect, "{1=>42, 2=>17}")
assert_equal(b.map_iaptr_ptr.inspect, "{1=>42, 2=>17}")
b.set_map_iaptr_cptr(nil)
assert_equal(b.map_iaptr.inspect, "{}")
b.set_map_iaptr_cptr( { 17 => a2, 42 => a1 } )
assert_equal(b.map_iaptr.inspect, "{17=>17, 42=>42}")
b.set_map_iaptr_ptr( { 18 => a2, 43 => a1 } )
assert_equal(b.map_iaptr.inspect, "{18=>17, 43=>42}")
b.set_map_iaptr_ref( { 1 => a2, 3 => a1 } )
assert_equal(b.map_iaptr.inspect, "{1=>17, 3=>42}")
b.set_map_iaptr_cref( { 2 => a2, 4 => a1 } )
assert_equal(b.map_iaptr.inspect, "{2=>17, 4=>42}")
b.set_map_iaptr_ptr( { } )
assert_equal(b.map_iaptr.inspect, "{}")
b.set_map_iaptr_cref( { 2 => a2, 4 => a1 } )
assert_equal(b.map_iaptr.inspect, "{2=>17, 4=>42}")
b.set_map_iaptr_ptr(nil)
assert_equal(b.map_iaptr.inspect, "{}")
m = { 2 => a1, 4 => a2 }
# map as an "out" parameter:
RBA::B.insert_map_iaptr(m, 3, a3)
assert_equal(m.inspect, "{2=>42, 3=>33, 4=>17}")
b.set_map_iacptr( { 1 => a1, 2 => a2 } )
assert_equal(b.map_iacptr.inspect, "{1=>42, 2=>17}")
m = { 2 => a1, 4 => a2 }
# map as an "out" parameter:
RBA::B.insert_map_iacptr(m, 5, a3)
assert_equal(m.inspect, "{2=>42, 4=>17, 5=>33}")
b.set_map_ia( { 1 => a1, 2 => a2 } )
# because we have raw copies, the Ruby-add-on is lost and
# only a1 (built-in) remains as an attribute:
assert_equal(b.map_ia.inspect, "{1=>a1=11, 2=>a1=22}")
m = { 2 => a1, 4 => a2 }
# map as an "out" parameter:
RBA::B.insert_map_ia(m, 5, a3)
assert_equal(m.inspect, "{2=>a1=11, 4=>a1=22, 5=>a1=33}")
b.set_map_iav( { 1 => [ a1, a2 ], 2 => [] } )
# because we have raw copies, the Ruby-add-on is lost and
# only a1 (built-in) remains as an attribute:
assert_equal(b.map_iav.inspect, "{1=>[a1=11, a1=22], 2=>[]}")
m = { 1 => [ a1, a2 ], 2 => [] }
# map as an "out" parameter:
RBA::B.push_map_iav(m, 2, a3)
assert_equal(m.inspect, "{1=>[a1=11, a1=22], 2=>[a1=33]}")
RBA::B.insert_map_iav(m, 5, [ a1, a3 ])
assert_equal(m.inspect, "{1=>[a1=11, a1=22], 2=>[a1=33], 5=>[a1=11, a1=33]}")
v = [ [ "a", "aa" ], [] ]
RBA::B.push_vvs( v, [ "1", "2" ] )
assert_equal(v.inspect, "[[\"a\", \"aa\"], [], [\"1\", \"2\"]]")
b.set_vvs( [ [ "1" ], [ "2", "3" ] ] )
assert_equal(b.vvs, [["1"], ["2", "3"]])
assert_equal(b.vvs_ref, [["1"], ["2", "3"]])
assert_equal(b.vvs_cref, [["1"], ["2", "3"]])
assert_equal(b.vvs_ptr, [["1"], ["2", "3"]])
assert_equal(b.vvs_cptr, [["1"], ["2", "3"]])
b.set_vvs_ref( [ [ "1" ], [ "2", "3" ] ] )
assert_equal(b.vvs, [["1"], ["2", "3"]])
b.set_vvs_cref( [ [ "2" ], [ "1", "3" ] ] )
assert_equal(b.vvs, [["2"], ["1", "3"]])
b.set_vvs_ptr( [ [ "1" ], [ "3", "2" ] ] )
assert_equal(b.vvs, [["1"], ["3", "2"]])
b.set_vvs_ptr(nil)
assert_equal(b.vvs, [])
b.set_vvs_cptr( [ [ "0" ], [ "3", "2" ] ] )
assert_equal(b.vvs, [["0"], ["3", "2"]])
b.set_vvs_cptr(nil)
assert_equal(b.vvs, [])
v = [ "a", "b" ]
RBA::B::push_ls(v, "x")
assert_equal(v, [ "a", "b", "x" ])
b.set_ls([ "1" ])
assert_equal(b.ls, [ "1" ])
b.set_ls([])
assert_equal(b.ls, [])
v = [ "a", "b" ]
RBA::B::push_ss(v, "x")
assert_equal(v, [ "a", "b", "x" ])
b.set_ss([ "1" ])
assert_equal(b.ss, [ "1" ])
b.set_ss([])
assert_equal(b.ss, [])
if b.respond_to?(:set_qls)
v = [ "a", "b" ]
RBA::B::push_qls(v, "x")
assert_equal(v, [ "a", "b", "x" ])
b.set_qls([ "1" ])
assert_equal(b.qls, [ "1" ])
b.set_qls([])
assert_equal(b.qls, [])
v = [ "a", 1 ]
RBA::B::push_qlv(v, 2.5)
assert_equal(v, [ "a", 1, 2.5 ])
b.set_qlv([ 17, "1" ])
assert_equal(b.qlv, [ 17, "1" ])
b.set_qlv([])
assert_equal(b.qlv, [])
v = [ "a", "b" ]
RBA::B::push_qsl(v, "x")
assert_equal(v, [ "a", "b", "x" ])
b.set_qsl([ "1" ])
assert_equal(b.qsl, [ "1" ])
b.set_qsl([])
assert_equal(b.qsl, [])
v = [ "a", "b" ]
RBA::B::push_qvs(v, "x")
assert_equal(v, [ "a", "b", "x" ])
b.set_qvs([ "1" ])
assert_equal(b.qvs, [ "1" ])
b.set_qvs([])
assert_equal(b.qvs, [])
v = [ "a", "b" ]
RBA::B::push_qss(v, "x")
assert_equal(v.sort, [ "a", "b", "x" ])
b.set_qss([ "1" ])
assert_equal(b.qss, [ "1" ])
b.set_qss([])
assert_equal(b.qss, [])
v = { 1 => "a", 17 => "b" }
RBA::B::insert_qmap_is(v, 2, "x")
assert_equal(v, { 1 => "a", 17 => "b", 2 => "x" })
b.set_qmap_is({ 1 => "t", 17 => "b" })
assert_equal(b.qmap_is, { 1 => "t", 17 => "b" })
b.set_qmap_is({})
assert_equal(b.qmap_is, {})
v = { 1 => "a", 17 => "b" }
RBA::B::insert_qhash_is(v, 2, "x")
assert_equal(v, { 1 => "a", 17 => "b", 2 => "x" })
b.set_qhash_is({ 1 => "t", 17 => "b" })
assert_equal(b.qhash_is, { 1 => "t", 17 => "b" })
b.set_qhash_is({})
assert_equal(b.qhash_is, {})
end
end
def test_51
# new subclass and child class declarations
y2 = RBA::Y2::new
assert_equal(y2.x1, 2)
assert_equal(y2.x2, 42)
assert_equal(y2.is_a?(RBA::X), true)
y3 = RBA::Z::Y3::new
assert_equal(y3.x1, 3)
assert_equal(y3.x2, 42)
assert_equal(y3.is_a?(RBA::X), true)
y4 = RBA::Z::Y4::new
assert_equal(y4.x1, 4)
assert_equal(y4.is_a?(RBA::X), false)
end
def test_60
if !RBA.constants.member?(:SQ)
return
end
sq = RBA::SQ::new
got_s0 = false
sq.s0 { got_s0 = true }
sq.trigger_s0
assert_equal(got_s0, true)
got_s1 = nil
sq.s1 { |iv| got_s1 = iv }
sq.trigger_s1(17)
assert_equal(got_s1, 17)
sq.trigger_s1(42)
assert_equal(got_s1, 42)
got_s2_1 = nil
got_s2_2 = nil
sq.tag = 999
sq.s2 { |is,obj| got_s2_1 = is; got_s2_2 = obj }
sq.trigger_s2("foo")
assert_equal(got_s2_1, "foo")
assert_equal(got_s2_2.tag, 999)
sq.tag = 111
got_s2_2 = nil
sq.trigger_s2("bar")
assert_equal(got_s2_1, "bar")
assert_equal(got_s2_2.tag, 111)
# clear handler (with clear)
sq.s2.clear
sq.tag = 0
got_s2_1 = nil
got_s2_2 = nil
sq.trigger_s2("z")
assert_equal(got_s2_1, nil)
assert_equal(got_s2_2, nil)
# attach again with set
l = lambda { |is,obj| got_s2_1 = is; got_s2_2 = obj }
sq.s2.set(l)
sq.tag = 2222
got_s2_1 = nil
got_s2_2 = nil
sq.trigger_s2("u")
assert_equal(got_s2_1, "u")
assert_equal(got_s2_2.tag, 2222)
# clear handler (with remove)
sq.s2 -= l
sq.tag = 0
got_s2_1 = nil
got_s2_2 = nil
sq.trigger_s2("v")
assert_equal(got_s2_1, nil)
assert_equal(got_s2_2, nil)
end
def test_61
if !RBA.constants.member?(:SQ)
return
end
sq = RBA::SQ::new
got_s0a = 0
got_s0b = 0
p1 = lambda { got_s0a += 1 }
p1b = lambda { got_s0a += 1 }
p2 = lambda { got_s0b += 1 }
sq.s0 = p1
sq.trigger_s0
assert_equal(got_s0a, 1)
assert_equal(got_s0b, 0)
got_s0a = 0
got_s0b = 0
sq.s0 = p2
sq.trigger_s0
assert_equal(got_s0a, 0)
assert_equal(got_s0b, 1)
got_s0a = 0
got_s0b = 0
sq.s0 += p1
sq.trigger_s0
assert_equal(got_s0a, 1)
assert_equal(got_s0b, 1)
got_s0a = 0
got_s0b = 0
# same proc is not added again
sq.s0 += p1
sq.trigger_s0
assert_equal(got_s0a, 1)
assert_equal(got_s0b, 1)
got_s0a = 0
got_s0b = 0
# second proc p1 with same effect
sq.s0 += p1b
sq.trigger_s0
assert_equal(got_s0a, 2)
assert_equal(got_s0b, 1)
got_s0a = 0
got_s0b = 0
sq.s0 -= p1
sq.trigger_s0
assert_equal(got_s0a, 1)
assert_equal(got_s0b, 1)
got_s0a = 0
got_s0b = 0
sq.s0 -= p1b
sq.trigger_s0
assert_equal(got_s0a, 0)
assert_equal(got_s0b, 1)
got_s0a = 0
got_s0b = 0
sq.s0 -= p1
sq.trigger_s0
assert_equal(got_s0a, 0)
assert_equal(got_s0b, 1)
got_s0a = 0
got_s0b = 0
sq.s0 -= p2
sq.trigger_s0
assert_equal(got_s0a, 0)
assert_equal(got_s0b, 0)
end
def test_70
se = RBA::SE::new
got_s0 = false
se.s0 { got_s0 = true }
se.trigger_s0
assert_equal(got_s0, true)
got_s1 = nil
se.s1 { |iv| got_s1 = iv }
se.trigger_s1(17)
assert_equal(got_s1, 17)
se.trigger_s1(42)
assert_equal(got_s1, 42)
got_s2_1 = nil
got_s2_2 = nil
se.tag = 999
se.s2 { |is,obj| got_s2_1 = is; got_s2_2 = obj }
se.trigger_s2("foo")
assert_equal(got_s2_1, "foo")
assert_equal(got_s2_2.tag, 999)
se.tag = 111
got_s2_2 = nil
se.trigger_s2("bar")
assert_equal(got_s2_1, "bar")
assert_equal(got_s2_2.tag, 111)
end
def test_71
se = RBA::SE::new
got_s0a = 0
got_s0b = 0
p1 = lambda { got_s0a += 1 }
p1b = lambda { got_s0a += 1 }
p2 = lambda { got_s0b += 1 }
se.s0 = p1
se.trigger_s0
assert_equal(got_s0a, 1)
assert_equal(got_s0b, 0)
got_s0a = 0
got_s0b = 0
se.s0 = p2
se.trigger_s0
assert_equal(got_s0a, 0)
assert_equal(got_s0b, 1)
got_s0a = 0
got_s0b = 0
se.s0 += p1
se.trigger_s0
assert_equal(got_s0a, 1)
assert_equal(got_s0b, 1)
got_s0a = 0
got_s0b = 0
# same proc is not added again
se.s0 += p1
se.trigger_s0
assert_equal(got_s0a, 1)
assert_equal(got_s0b, 1)
got_s0a = 0
got_s0b = 0
# second proc p1 with same effect
se.s0 += p1b
se.trigger_s0
assert_equal(got_s0a, 2)
assert_equal(got_s0b, 1)
got_s0a = 0
got_s0b = 0
se.s0 -= p1
se.trigger_s0
assert_equal(got_s0a, 1)
assert_equal(got_s0b, 1)
got_s0a = 0
got_s0b = 0
se.s0 -= p1b
se.trigger_s0
assert_equal(got_s0a, 0)
assert_equal(got_s0b, 1)
got_s0a = 0
got_s0b = 0
se.s0 -= p1
se.trigger_s0
assert_equal(got_s0a, 0)
assert_equal(got_s0b, 1)
got_s0a = 0
got_s0b = 0
se.s0 -= p2
se.trigger_s0
assert_equal(got_s0a, 0)
assert_equal(got_s0b, 0)
end
def test_72
GC.start
z = RBA::Z::new
nx = RBA::X::instances
x = RBA::X::new("1")
z.set_x(x)
assert_equal(RBA::X::instances, nx + 1)
x = nil
z.set_x(nil)
GC.start
assert_equal(RBA::X::instances, nx)
x = RBA::X::new("2")
assert_equal(RBA::X::instances, nx + 1)
z.set_x_keep(x)
x = nil
GC.start
assert_equal(RBA::X::instances, nx + 1)
# this will release the object - hence it's going to be deleted
z.set_x_keep(nil)
GC.start
assert_equal(RBA::X::instances, nx)
end
def test_73
begin
poly = RBA::Polygon::new(RBA::Box::new(0, 0, 100, 100))
# passing exceptions over iterators is critical because it involves
# a Ruby/C++ and C++/Ruby transition
poly.each_edge do |e|
raise MyException::new("some exception")
end
rescue => ex
assert_equal(ex.class.to_s, "MyException")
assert_equal(ex.to_s, "some exception")
end
begin
raise MyException::new("another exception")
rescue => ex
assert_equal(ex.class.to_s, "MyException")
assert_equal(ex.to_s, "another exception")
end
end
# Custom factory implemented in Ruby
def test_80
gc = RBA::GObject.g_inst_count
gf = RBAGFactory::new
go = RBA::GFactory.create_f(gf, 17)
assert_equal(go.g_virtual, 34)
assert_equal(go.g_org, 0)
assert_equal(RBA::GObject.g_inst_count, gc + 1)
go = nil
GC.start
assert_equal(RBA::GObject.g_inst_count, gc)
end
end