# 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 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 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