#!/usr/bin/env ruby require 'swig_assert' require 'li_std_auto_ptr' def gc_check(expected_count) # GC.start(full_mark: true, immediate_sweep: true) GC.start # GC is not reliably run, skip check # swig_assert_equal_simple(expected_count, Li_std_auto_ptr::Klass::getTotal_count()) end def checkCount(expected_count) actual_count = Li_std_auto_ptr::Klass.getTotal_count() if (actual_count != expected_count) raise RuntimeError, "Counts incorrect, expected:" + expected_count + " actual:" + actual_count end end # Test raw pointer handling involving virtual inheritance kini = Li_std_auto_ptr::KlassInheritance.new("KlassInheritanceInput") checkCount(1) s = Li_std_auto_ptr.useKlassRawPtr(kini) if (s != "KlassInheritanceInput") raise RuntimeError, "Incorrect string: " + s end # kini = nil Li_std_auto_ptr.takeKlassAutoPtr(kini) # Ensure object is deleted (can't rely on GC) checkCount(0) # auto_ptr as input kin = Li_std_auto_ptr::Klass.new("KlassInput") checkCount(1) s = Li_std_auto_ptr.takeKlassAutoPtr(kin) checkCount(0) if (s != "KlassInput") raise RuntimeError, "Incorrect string: " + s end exception_thrown = false begin Li_std_auto_ptr.is_nullptr(kin) rescue ObjectPreviouslyDeleted exception_thrown = true end if (!exception_thrown) raise RuntimeError, "is_nullptr failed to throw" end kin = nil checkCount(0) kin = Li_std_auto_ptr::Klass.new("KlassInput") checkCount(1) s = Li_std_auto_ptr.takeKlassAutoPtr(kin) checkCount(0) if (s != "KlassInput") raise RuntimeError, "Incorrect string: " + s end exception_thrown = false begin Li_std_auto_ptr.is_nullptr(kin) rescue ObjectPreviouslyDeleted exception_thrown = true end if (!exception_thrown) raise RuntimeError, "is_nullptr failed to throw" end exception_thrown = false begin Li_std_auto_ptr.takeKlassAutoPtr(kin) rescue RuntimeError => e # puts e.message exception_thrown = true end if (!exception_thrown) raise RuntimeError, "double usage of takeKlassAutoPtr should have been an error" end kin = nil checkCount(0) kin = Li_std_auto_ptr::Klass.new("KlassInput") exception_thrown = false notowned = Li_std_auto_ptr::get_not_owned_ptr(kin) begin Li_std_auto_ptr::takeKlassAutoPtr(notowned) rescue RuntimeError if (!e.to_s.include? "cannot release ownership as memory is not owned") raise RuntimeError, "incorrect exception message" end exception_thrown = true end if (!exception_thrown) raise RuntimeError, "Should have thrown 'Cannot release ownership as memory is not owned' error" end checkCount(1) Li_std_auto_ptr.takeKlassAutoPtr(kin) # Ensure object is deleted (can't rely on GC) checkCount(0) kini = Li_std_auto_ptr::KlassInheritance.new("KlassInheritanceInput") checkCount(1) s = Li_std_auto_ptr.takeKlassAutoPtr(kini) checkCount(0) if (s != "KlassInheritanceInput") raise RuntimeError, "Incorrect string: " + s end exception_thrown = false begin Li_std_auto_ptr.is_nullptr(kini) rescue ObjectPreviouslyDeleted exception_thrown = true end if (!exception_thrown) raise RuntimeError, "is_nullptr failed to throw" end kini = nil checkCount(0) Li_std_auto_ptr::takeKlassAutoPtr(nil) Li_std_auto_ptr::takeKlassAutoPtr(Li_std_auto_ptr::make_null()) checkCount(0) # overloaded parameters if (Li_std_auto_ptr::overloadTest() != 0) raise RuntimeError, "overloadTest failed" end if (Li_std_auto_ptr::overloadTest(nil) != 1) raise RuntimeError, "overloadTest failed" end if (Li_std_auto_ptr::overloadTest(Li_std_auto_ptr::Klass.new("over")) != 1) raise RuntimeError, "overloadTest failed" end checkCount(0); # auto_ptr as output k1 = Li_std_auto_ptr::makeKlassAutoPtr("first") k2 = Li_std_auto_ptr::makeKlassAutoPtr("second") swig_assert_equal_simple(2, Li_std_auto_ptr::Klass::getTotal_count()) gc_check(2) k1 = nil gc_check(1) swig_assert_equal_simple(k2.getLabel(), "second") gc_check(1) k2 = nil gc_check(0) swig_assert_equal_simple(Li_std_auto_ptr::makeNullAutoPtr(), nil)