Merge branch 'master' into doxygen

The way Python docstrings are indented has changed on master, so use the
standard inspect module in Python autodoc unit test to ignore the differences
in their indentation level between -builtin and non-builtin cases to make the
test still pass with the branch version, which avoids the use of different
(but almost identical) values in the test itself.
This commit is contained in:
Vadim Zeitlin 2016-12-05 02:14:51 +01:00
commit e668c47b70
1094 changed files with 39390 additions and 11483 deletions

View file

@ -11,7 +11,6 @@ top_srcdir = @top_srcdir@
top_builddir = @top_builddir@
CPP_TEST_CASES = \
li_cdata \
li_cstring \
li_factory \
li_std_functors \
@ -22,6 +21,7 @@ CPP_TEST_CASES = \
li_std_stack \
primitive_types \
ruby_keywords \
ruby_minherit_shared_ptr \
ruby_naming \
ruby_track_objects \
ruby_track_objects_directors \
@ -30,8 +30,8 @@ CPP_TEST_CASES = \
# stl_new
C_TEST_CASES += \
li_cdata \
li_cstring
li_cstring \
ruby_manual_proxy \
include $(srcdir)/../common.mk
@ -61,7 +61,7 @@ ruby_naming.cpptest: SWIGOPT += -autorename
# a file is found which has _runme.rb appended after the testcase name.
run_testcase = \
if [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then \
env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH $(RUNTOOL) $(RUBY) -I$(srcdir):. $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); \
env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH $(RUNTOOL) $(RUBY) $(RUBYFLAGS) -I$(srcdir):. $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); \
fi
# Clean
@ -69,4 +69,4 @@ run_testcase = \
@exit 0
clean:
$(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile SRCDIR="$(SRCDIR)" ruby_clean
$(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile SRCDIR='$(SRCDIR)' ruby_clean

View file

@ -0,0 +1,134 @@
#!/usr/bin/env ruby
#
# Put description here
#
#
#
#
#
require 'swig_assert'
require 'cpp11_li_std_array'
include Cpp11_li_std_array
def failed(a, b, msg)
raise RuntimeError, "#{msg} #{a} #{b}"
end
def compare_sequences(a, b)
if a.size != b.size
failed(a, b, "different sizes")
end
for i in 0..a.size-1
failed(a, b, "elements are different:") if a[i] != b[i]
end
end
def compare_containers(rubyarray, swigarray)
compare_sequences(rubyarray, swigarray)
end
def setslice_exception(swigarray, newval)
begin
swigarray[0..swigarray.size] = newval
raise RuntimeError, "swigarray[] = #{newval} missed set exception for swigarray: #{swigarray}"
rescue ArgumentError => e
# print "exception: #{e}"
end
end
# Check std::array has similar behaviour to a Ruby array
# except it is not resizable
ps = [0, 1, 2, 3, 4, 5]
ai = ArrayInt6.new(ps)
compare_containers(ps, ai)
# slices
compare_containers(ps[0..5], ai[0..5])
compare_containers(ps[-6..-1], ai[-6..-1])
compare_containers(ps[0..10], ai[0..10])
# Reverse (.reverse is not provided)
rev = []
ai.reverse_each { |i| rev.push i }
compare_containers(ps.reverse, rev)
# Modify content
for i in 0..ps.size-1
ps[i] = ps[i] * 10
ai[i] = ai[i] * 10
end
compare_containers(ps, ai)
# Empty
ai = ArrayInt6.new()
compare_containers([0, 0, 0, 0, 0, 0], ai)
# Set slice
newvals = [10, 20, 30, 40, 50, 60]
ai[0, 6] = newvals
compare_containers(ai, newvals)
ai[-6, 6] = newvals
compare_containers(ai, newvals)
setslice_exception(ai, [1, 2, 3, 4, 5, 6, 7])
setslice_exception(ai, [1, 2, 3, 4, 5])
setslice_exception(ai, [1, 2, 3, 4])
setslice_exception(ai, [1, 2, 3])
setslice_exception(ai, [1, 2])
setslice_exception(ai, [1])
setslice_exception(ai, [])
# Check return
compare_containers(arrayOutVal(), [-2, -1, 0, 0, 1, 2])
compare_containers(arrayOutConstRef(), [-2, -1, 0, 0, 1, 2])
compare_containers(arrayOutRef(), [-2, -1, 0, 0, 1, 2])
compare_containers(arrayOutPtr(), [-2, -1, 0, 0, 1, 2])
# Check passing arguments
ai = arrayInVal([9, 8, 7, 6, 5, 4])
compare_containers(ai, [90, 80, 70, 60, 50, 40])
ai = arrayInConstRef([9, 8, 7, 6, 5, 4])
compare_containers(ai, [90, 80, 70, 60, 50, 40])
ai = ArrayInt6.new([9, 8, 7, 6, 5, 4])
arrayInRef(ai)
compare_containers(ai, [90, 80, 70, 60, 50, 40])
ai = ArrayInt6.new([9, 8, 7, 6, 5, 4])
arrayInPtr(ai)
compare_containers(ai, [90, 80, 70, 60, 50, 40])
# indexing
ai = ArrayInt6.new([9, 8, 7, 6, 5, 4])
swig_assert_equal(ai[0], 9, binding)
swig_assert_equal(ai[5], 4, binding)
swig_assert_equal(ai[6], nil, binding)
swig_assert_equal(ai[-7], nil, binding)
# fill
ai.fill(111)
compare_containers(ai, [111, 111, 111, 111, 111, 111])
# various
ai = ArrayInt6.new([9, 8, 7, 6, 5, 4])
swig_assert(ai.include? 9)
swig_assert(!ai.include?(99))
swig_assert(ai.kind_of? ArrayInt6)
swig_assert(ai.find {|x| x == 6 } == 6)
swig_assert(ai.find {|x| x == 66 } == nil)
swig_assert(ai.respond_to?(:each))
swig_assert(ai.respond_to?(:each_with_index))
ai = [0, 10, 20, 30, 40, 50]
ai.each_with_index { |e,i| swig_assert(e/10 == i) }

View file

@ -0,0 +1,54 @@
#!/usr/bin/env ruby
#
# Put description here
#
#
#
#
#
require 'director_smartptr'
include Director_smartptr
class Director_smartptr_MyBarFoo < Foo
def ping()
return "director_smartptr_MyBarFoo.ping()"
end
def pong()
return "director_smartptr_MyBarFoo.pong();" + ping()
end
def upcall(fooBarPtr)
return "override;" + fooBarPtr.FooBarDo()
end
def makeFoo()
return Foo.new()
end
end
def check(got, expected)
if (got != expected)
raise RuntimeError, "Failed, got: #{got} expected: #{expected}"
end
end
fooBar = Director_smartptr::FooBar.new()
myBarFoo = Director_smartptr_MyBarFoo.new()
check(myBarFoo.ping(), "director_smartptr_MyBarFoo.ping()")
check(Foo.callPong(myBarFoo), "director_smartptr_MyBarFoo.pong();director_smartptr_MyBarFoo.ping()")
check(Foo.callUpcall(myBarFoo, fooBar), "override;Bar::Foo2::Foo2Bar()")
myFoo = myBarFoo.makeFoo()
check(myFoo.pong(), "Foo::pong();Foo::ping()")
check(Foo.callPong(myFoo), "Foo::pong();Foo::ping()")
check(myFoo.upcall(FooBar.new()), "Bar::Foo2::Foo2Bar()")
myFoo2 = Foo.new().makeFoo()
check(myFoo2.pong(), "Foo::pong();Foo::ping()")
check(Foo.callPong(myFoo2), "Foo::pong();Foo::ping()")
check(myFoo2.upcall(FooBar.new()), "Bar::Foo2::Foo2Bar()")

View file

@ -0,0 +1,32 @@
require 'li_boost_shared_ptr_bits'
require 'swig_gc'
v = Li_boost_shared_ptr_bits::VectorIntHolder.new()
v.push(Li_boost_shared_ptr_bits::IntHolder.new(11))
v.push(Li_boost_shared_ptr_bits::IntHolder.new(22))
v.push(Li_boost_shared_ptr_bits::IntHolder.new(33))
sum = Li_boost_shared_ptr_bits::sum(v)
if (sum != 66)
raise RuntimeError, "sum is wrong"
end
hidden = Li_boost_shared_ptr_bits::HiddenDestructor.create()
GC.track_class = Li_boost_shared_ptr_bits::HiddenPrivateDestructor
GC.stats if $VERBOSE
hidden = nil
GC.start
hiddenPrivate = Li_boost_shared_ptr_bits::HiddenPrivateDestructor.create()
if (Li_boost_shared_ptr_bits::HiddenPrivateDestructor.DeleteCount != 0)
# GC doesn't always run
# raise RuntimeError, "Count should be zero"
end
GC.stats if $VERBOSE
hiddenPrivate = nil
GC.start
if (Li_boost_shared_ptr_bits::HiddenPrivateDestructor.DeleteCount != 1)
# GC doesn't always run
# raise RuntimeError, "Count should be one"
end

View file

@ -0,0 +1,614 @@
require 'li_boost_shared_ptr'
require 'swig_gc'
#debug = $VERBOSE
debug = false
# simple shared_ptr usage - created in C++
class Li_boost_shared_ptr_runme
def main(debug)
if (debug)
puts "Started"
end
Li_boost_shared_ptr::debug_shared = debug
# Change loop count to run for a long time to monitor memory
loopCount = 1 # 5000
1.upto(loopCount) do
self.runtest()
end
# Expect 1 instance - the one global variable (GlobalValue)
GC.track_class = Li_boost_shared_ptr::Klass
invokeGC("Final GC")
# Actual count is 3 due to memory leaks calling rb_raise in the call to Li_boost_shared_ptr::valuetest(nil)
# as setjmp/longjmp are used thereby failing to call destructors of Klass instances on the stack in _wrap_valuetest
# This is a generic problem in Ruby wrappers, not shared_ptr specific
# expectedCount = 1
expectedCount = 3
actualCount = Li_boost_shared_ptr::Klass.getTotal_count()
if (actualCount != expectedCount)
# raise RuntimeError, "GC failed to run (li_boost_shared_ptr). Expected count: #{expectedCount} Actual count: #{actualCount}"
puts "GC failed to run (li_boost_shared_ptr). Expected count: #{expectedCount} Actual count: #{actualCount}"
end
wrapper_count = Li_boost_shared_ptr::shared_ptr_wrapper_count()
if (wrapper_count != Li_boost_shared_ptr.NOT_COUNTING)
# Expect 1 instance - the one global variable (GlobalSmartValue)
if (wrapper_count != 1)
raise RuntimeError, "shared_ptr wrapper count=#{wrapper_count}"
end
end
if (debug)
puts "Finished"
end
end
def invokeGC(debug_msg)
puts "invokeGC #{debug_msg} start" if $VERBOSE
GC.stats if $VERBOSE
GC.start
puts "invokeGC #{debug_msg} end" if $VERBOSE
end
def runtest
# simple shared_ptr usage - created in C++
k = Li_boost_shared_ptr::Klass.new("me oh my")
val = k.getValue()
self.verifyValue("me oh my", val)
self.verifyCount(1, k)
# simple shared_ptr usage - not created in C++
k = Li_boost_shared_ptr::factorycreate()
val = k.getValue()
self.verifyValue("factorycreate", val)
self.verifyCount(1, k)
# pass by shared_ptr
k = Li_boost_shared_ptr::Klass.new("me oh my")
kret = Li_boost_shared_ptr::smartpointertest(k)
val = kret.getValue()
self.verifyValue("me oh my smartpointertest", val)
self.verifyCount(2, k)
self.verifyCount(2, kret)
# pass by shared_ptr pointer
k = Li_boost_shared_ptr::Klass.new("me oh my")
kret = Li_boost_shared_ptr::smartpointerpointertest(k)
val = kret.getValue()
self.verifyValue("me oh my smartpointerpointertest", val)
self.verifyCount(2, k)
self.verifyCount(2, kret)
# pass by shared_ptr reference
k = Li_boost_shared_ptr::Klass.new("me oh my")
kret = Li_boost_shared_ptr::smartpointerreftest(k)
val = kret.getValue()
self.verifyValue("me oh my smartpointerreftest", val)
self.verifyCount(2, k)
self.verifyCount(2, kret)
# pass by shared_ptr pointer reference
k = Li_boost_shared_ptr::Klass.new("me oh my")
kret = Li_boost_shared_ptr::smartpointerpointerreftest(k)
val = kret.getValue()
self.verifyValue("me oh my smartpointerpointerreftest", val)
self.verifyCount(2, k)
self.verifyCount(2, kret)
# const pass by shared_ptr
k = Li_boost_shared_ptr::Klass.new("me oh my")
kret = Li_boost_shared_ptr::constsmartpointertest(k)
val = kret.getValue()
self.verifyValue("me oh my", val)
self.verifyCount(2, k)
self.verifyCount(2, kret)
# const pass by shared_ptr pointer
k = Li_boost_shared_ptr::Klass.new("me oh my")
kret = Li_boost_shared_ptr::constsmartpointerpointertest(k)
val = kret.getValue()
self.verifyValue("me oh my", val)
self.verifyCount(2, k)
self.verifyCount(2, kret)
# const pass by shared_ptr reference
k = Li_boost_shared_ptr::Klass.new("me oh my")
kret = Li_boost_shared_ptr::constsmartpointerreftest(k)
val = kret.getValue()
self.verifyValue("me oh my", val)
self.verifyCount(2, k)
self.verifyCount(2, kret)
# pass by value
k = Li_boost_shared_ptr::Klass.new("me oh my")
kret = Li_boost_shared_ptr::valuetest(k)
val = kret.getValue()
self.verifyValue("me oh my valuetest", val)
self.verifyCount(1, k)
self.verifyCount(1, kret)
# pass by pointer
k = Li_boost_shared_ptr::Klass.new("me oh my")
kret = Li_boost_shared_ptr::pointertest(k)
val = kret.getValue()
self.verifyValue("me oh my pointertest", val)
self.verifyCount(1, k)
self.verifyCount(1, kret)
# pass by reference
k = Li_boost_shared_ptr::Klass.new("me oh my")
kret = Li_boost_shared_ptr::reftest(k)
val = kret.getValue()
self.verifyValue("me oh my reftest", val)
self.verifyCount(1, k)
self.verifyCount(1, kret)
# pass by pointer reference
k = Li_boost_shared_ptr::Klass.new("me oh my")
kret = Li_boost_shared_ptr::pointerreftest(k)
val = kret.getValue()
self.verifyValue("me oh my pointerreftest", val)
self.verifyCount(1, k)
self.verifyCount(1, kret)
# null tests
k = nil
if (Li_boost_shared_ptr::smartpointertest(k) != nil)
raise RuntimeError, "return was not null"
end
if (Li_boost_shared_ptr::smartpointerpointertest(k) != nil)
raise RuntimeError, "return was not null"
end
if (Li_boost_shared_ptr::smartpointerreftest(k) != nil)
raise RuntimeError, "return was not null"
end
if (Li_boost_shared_ptr::smartpointerpointerreftest(k) != nil)
raise RuntimeError, "return was not null"
end
if (Li_boost_shared_ptr::nullsmartpointerpointertest(nil) != "null pointer")
raise RuntimeError, "not null smartpointer pointer"
end
begin
Li_boost_shared_ptr::valuetest(k)
raise RuntimeError, "Failed to catch null pointer"
rescue ArgumentError
end
if (Li_boost_shared_ptr::pointertest(k) != nil)
raise RuntimeError, "return was not null"
end
begin
Li_boost_shared_ptr::reftest(k)
raise RuntimeError, "Failed to catch null pointer"
rescue ArgumentError
end
# $owner
k = Li_boost_shared_ptr::pointerownertest()
val = k.getValue()
self.verifyValue("pointerownertest", val)
self.verifyCount(1, k)
k = Li_boost_shared_ptr::smartpointerpointerownertest()
val = k.getValue()
self.verifyValue("smartpointerpointerownertest", val)
self.verifyCount(1, k)
# //////////////////////////////// Derived class //////////////////////
# derived pass by shared_ptr
k = Li_boost_shared_ptr::KlassDerived.new("me oh my")
kret = Li_boost_shared_ptr::derivedsmartptrtest(k)
val = kret.getValue()
self.verifyValue("me oh my derivedsmartptrtest-Derived", val)
self.verifyCount(2, k)
self.verifyCount(2, kret)
# derived pass by shared_ptr pointer
k = Li_boost_shared_ptr::KlassDerived.new("me oh my")
kret = Li_boost_shared_ptr::derivedsmartptrpointertest(k)
val = kret.getValue()
self.verifyValue("me oh my derivedsmartptrpointertest-Derived", val)
self.verifyCount(2, k)
self.verifyCount(2, kret)
# derived pass by shared_ptr ref
k = Li_boost_shared_ptr::KlassDerived.new("me oh my")
kret = Li_boost_shared_ptr::derivedsmartptrreftest(k)
val = kret.getValue()
self.verifyValue("me oh my derivedsmartptrreftest-Derived", val)
self.verifyCount(2, k)
self.verifyCount(2, kret)
# derived pass by shared_ptr pointer ref
k = Li_boost_shared_ptr::KlassDerived.new("me oh my")
kret = Li_boost_shared_ptr::derivedsmartptrpointerreftest(k)
val = kret.getValue()
self.verifyValue("me oh my derivedsmartptrpointerreftest-Derived", val)
self.verifyCount(2, k)
self.verifyCount(2, kret)
# derived pass by pointer
k = Li_boost_shared_ptr::KlassDerived.new("me oh my")
kret = Li_boost_shared_ptr::derivedpointertest(k)
val = kret.getValue()
self.verifyValue("me oh my derivedpointertest-Derived", val)
self.verifyCount(1, k)
self.verifyCount(1, kret)
# derived pass by ref
k = Li_boost_shared_ptr::KlassDerived.new("me oh my")
kret = Li_boost_shared_ptr::derivedreftest(k)
val = kret.getValue()
self.verifyValue("me oh my derivedreftest-Derived", val)
self.verifyCount(1, k)
self.verifyCount(1, kret)
# //////////////////////////////// Derived and base class mixed ///////
# pass by shared_ptr (mixed)
k = Li_boost_shared_ptr::KlassDerived.new("me oh my")
kret = Li_boost_shared_ptr::smartpointertest(k)
val = kret.getValue()
self.verifyValue("me oh my smartpointertest-Derived", val)
self.verifyCount(2, k)
self.verifyCount(2, kret)
# pass by shared_ptr pointer (mixed)
k = Li_boost_shared_ptr::KlassDerived.new("me oh my")
kret = Li_boost_shared_ptr::smartpointerpointertest(k)
val = kret.getValue()
self.verifyValue("me oh my smartpointerpointertest-Derived", val)
self.verifyCount(2, k)
self.verifyCount(2, kret)
# pass by shared_ptr reference (mixed)
k = Li_boost_shared_ptr::KlassDerived.new("me oh my")
kret = Li_boost_shared_ptr::smartpointerreftest(k)
val = kret.getValue()
self.verifyValue("me oh my smartpointerreftest-Derived", val)
self.verifyCount(2, k)
self.verifyCount(2, kret)
# pass by shared_ptr pointer reference (mixed)
k = Li_boost_shared_ptr::KlassDerived.new("me oh my")
kret = Li_boost_shared_ptr::smartpointerpointerreftest(k)
val = kret.getValue()
self.verifyValue("me oh my smartpointerpointerreftest-Derived", val)
self.verifyCount(2, k)
self.verifyCount(2, kret)
# pass by value (mixed)
k = Li_boost_shared_ptr::KlassDerived.new("me oh my")
kret = Li_boost_shared_ptr::valuetest(k)
val = kret.getValue()
self.verifyValue("me oh my valuetest", val) # note slicing
self.verifyCount(1, k)
self.verifyCount(1, kret)
# pass by pointer (mixed)
k = Li_boost_shared_ptr::KlassDerived.new("me oh my")
kret = Li_boost_shared_ptr::pointertest(k)
val = kret.getValue()
self.verifyValue("me oh my pointertest-Derived", val)
self.verifyCount(1, k)
self.verifyCount(1, kret)
# pass by ref (mixed)
k = Li_boost_shared_ptr::KlassDerived.new("me oh my")
kret = Li_boost_shared_ptr::reftest(k)
val = kret.getValue()
self.verifyValue("me oh my reftest-Derived", val)
self.verifyCount(1, k)
self.verifyCount(1, kret)
# //////////////////////////////// Overloading tests //////////////////
# Base class
k = Li_boost_shared_ptr::Klass.new("me oh my")
self.verifyValue(Li_boost_shared_ptr::overload_rawbyval(k), "rawbyval")
self.verifyValue(Li_boost_shared_ptr::overload_rawbyref(k), "rawbyref")
self.verifyValue(Li_boost_shared_ptr::overload_rawbyptr(k), "rawbyptr")
self.verifyValue(
Li_boost_shared_ptr::overload_rawbyptrref(k), "rawbyptrref")
self.verifyValue(
Li_boost_shared_ptr::overload_smartbyval(k), "smartbyval")
self.verifyValue(
Li_boost_shared_ptr::overload_smartbyref(k), "smartbyref")
self.verifyValue(
Li_boost_shared_ptr::overload_smartbyptr(k), "smartbyptr")
self.verifyValue(
Li_boost_shared_ptr::overload_smartbyptrref(k), "smartbyptrref")
# Derived class
k = Li_boost_shared_ptr::KlassDerived.new("me oh my")
self.verifyValue(Li_boost_shared_ptr::overload_rawbyval(k), "rawbyval")
self.verifyValue(Li_boost_shared_ptr::overload_rawbyref(k), "rawbyref")
self.verifyValue(Li_boost_shared_ptr::overload_rawbyptr(k), "rawbyptr")
self.verifyValue(
Li_boost_shared_ptr::overload_rawbyptrref(k), "rawbyptrref")
self.verifyValue(
Li_boost_shared_ptr::overload_smartbyval(k), "smartbyval")
self.verifyValue(
Li_boost_shared_ptr::overload_smartbyref(k), "smartbyref")
self.verifyValue(
Li_boost_shared_ptr::overload_smartbyptr(k), "smartbyptr")
self.verifyValue(
Li_boost_shared_ptr::overload_smartbyptrref(k), "smartbyptrref")
# 3rd derived class
k = Li_boost_shared_ptr::Klass3rdDerived.new("me oh my")
val = k.getValue()
self.verifyValue("me oh my-3rdDerived", val)
self.verifyCount(1, k)
val = Li_boost_shared_ptr::test3rdupcast(k)
self.verifyValue("me oh my-3rdDerived", val)
self.verifyCount(1, k)
# //////////////////////////////// Member variables ///////////////////
# smart pointer by value
m = Li_boost_shared_ptr::MemberVariables.new()
k = Li_boost_shared_ptr::Klass.new("smart member value")
m.SmartMemberValue = k
val = k.getValue()
self.verifyValue("smart member value", val)
self.verifyCount(2, k)
kmember = m.SmartMemberValue
val = kmember.getValue()
self.verifyValue("smart member value", val)
self.verifyCount(3, kmember)
self.verifyCount(3, k)
GC.track_class = Li_boost_shared_ptr::MemberVariables
m = nil
invokeGC("m = nil (A)")
self.verifyCount(2, kmember)
self.verifyCount(2, k)
# smart pointer by pointer
m = Li_boost_shared_ptr::MemberVariables.new()
k = Li_boost_shared_ptr::Klass.new("smart member pointer")
m.SmartMemberPointer = k
val = k.getValue()
self.verifyValue("smart member pointer", val)
self.verifyCount(1, k)
kmember = m.SmartMemberPointer
val = kmember.getValue()
self.verifyValue("smart member pointer", val)
self.verifyCount(2, kmember)
self.verifyCount(2, k)
m = nil
invokeGC("m = nil (B)")
self.verifyCount(2, kmember)
self.verifyCount(2, k)
# smart pointer by reference
m = Li_boost_shared_ptr::MemberVariables.new()
k = Li_boost_shared_ptr::Klass.new("smart member reference")
m.SmartMemberReference = k
val = k.getValue()
self.verifyValue("smart member reference", val)
self.verifyCount(2, k)
kmember = m.SmartMemberReference
val = kmember.getValue()
self.verifyValue("smart member reference", val)
self.verifyCount(3, kmember)
self.verifyCount(3, k)
# The C++ reference refers to SmartMemberValue...
kmemberVal = m.SmartMemberValue
val = kmember.getValue()
self.verifyValue("smart member reference", val)
self.verifyCount(4, kmemberVal)
self.verifyCount(4, kmember)
self.verifyCount(4, k)
m = nil
invokeGC("m = nil (C)")
self.verifyCount(3, kmemberVal)
self.verifyCount(3, kmember)
self.verifyCount(3, k)
# plain by value
m = Li_boost_shared_ptr::MemberVariables.new()
k = Li_boost_shared_ptr::Klass.new("plain member value")
m.MemberValue = k
val = k.getValue()
self.verifyValue("plain member value", val)
self.verifyCount(1, k)
kmember = m.MemberValue
val = kmember.getValue()
self.verifyValue("plain member value", val)
self.verifyCount(1, kmember)
self.verifyCount(1, k)
m = nil
invokeGC("m = nil (D)")
self.verifyCount(1, kmember)
self.verifyCount(1, k)
# plain by pointer
m = Li_boost_shared_ptr::MemberVariables.new()
k = Li_boost_shared_ptr::Klass.new("plain member pointer")
m.MemberPointer = k
val = k.getValue()
self.verifyValue("plain member pointer", val)
self.verifyCount(1, k)
kmember = m.MemberPointer
val = kmember.getValue()
self.verifyValue("plain member pointer", val)
self.verifyCount(1, kmember)
self.verifyCount(1, k)
m = nil
invokeGC("m = nil (E)")
self.verifyCount(1, kmember)
self.verifyCount(1, k)
# plain by reference
m = Li_boost_shared_ptr::MemberVariables.new()
k = Li_boost_shared_ptr::Klass.new("plain member reference")
m.MemberReference = k
val = k.getValue()
self.verifyValue("plain member reference", val)
self.verifyCount(1, k)
kmember = m.MemberReference
val = kmember.getValue()
self.verifyValue("plain member reference", val)
self.verifyCount(1, kmember)
self.verifyCount(1, k)
m = nil
invokeGC("m = nil (F)")
self.verifyCount(1, kmember)
self.verifyCount(1, k)
# null member variables
m = Li_boost_shared_ptr::MemberVariables.new()
# shared_ptr by value
k = m.SmartMemberValue
if (k != nil)
raise RuntimeError, "expected null"
end
m.SmartMemberValue = nil
k = m.SmartMemberValue
if (k != nil)
raise RuntimeError, "expected null"
end
self.verifyCount(0, k)
# plain by value
begin
m.MemberValue = nil
raise RuntimeError, "Failed to catch null pointer"
rescue ArgumentError
end
# ////////////////////////////////// Global variables /////////////////
# smart pointer
kglobal = Li_boost_shared_ptr.GlobalSmartValue
if (kglobal != nil)
raise RuntimeError, "expected null"
end
k = Li_boost_shared_ptr::Klass.new("smart global value")
Li_boost_shared_ptr.GlobalSmartValue = k
self.verifyCount(2, k)
kglobal = Li_boost_shared_ptr.GlobalSmartValue
val = kglobal.getValue()
self.verifyValue("smart global value", val)
self.verifyCount(3, kglobal)
self.verifyCount(3, k)
self.verifyValue(
"smart global value", Li_boost_shared_ptr.GlobalSmartValue.getValue())
Li_boost_shared_ptr.GlobalSmartValue = nil
# plain value
k = Li_boost_shared_ptr::Klass.new("global value")
Li_boost_shared_ptr.GlobalValue = k
self.verifyCount(1, k)
kglobal = Li_boost_shared_ptr.GlobalValue
val = kglobal.getValue()
self.verifyValue("global value", val)
self.verifyCount(1, kglobal)
self.verifyCount(1, k)
self.verifyValue(
"global value", Li_boost_shared_ptr.GlobalValue.getValue())
begin
Li_boost_shared_ptr.GlobalValue = nil
raise RuntimeError, "Failed to catch null pointer"
rescue ArgumentError
end
# plain pointer
kglobal = Li_boost_shared_ptr.GlobalPointer
if (kglobal != nil)
raise RuntimeError, "expected null"
end
k = Li_boost_shared_ptr::Klass.new("global pointer")
Li_boost_shared_ptr.GlobalPointer = k
self.verifyCount(1, k)
kglobal = Li_boost_shared_ptr.GlobalPointer
val = kglobal.getValue()
self.verifyValue("global pointer", val)
self.verifyCount(1, kglobal)
self.verifyCount(1, k)
Li_boost_shared_ptr.GlobalPointer = nil
# plain reference
k = Li_boost_shared_ptr::Klass.new("global reference")
Li_boost_shared_ptr.GlobalReference = k
self.verifyCount(1, k)
kglobal = Li_boost_shared_ptr.GlobalReference
val = kglobal.getValue()
self.verifyValue("global reference", val)
self.verifyCount(1, kglobal)
self.verifyCount(1, k)
begin
Li_boost_shared_ptr.GlobalReference = nil
raise RuntimeError, "Failed to catch null pointer"
rescue ArgumentError
end
# ////////////////////////////////// Templates ////////////////////////
pid = Li_boost_shared_ptr::PairIntDouble.new(10, 20.2)
if (pid.baseVal1 != 20 or pid.baseVal2 != 40.4)
raise RuntimeError, "Base values wrong"
end
if (pid.val1 != 10 or pid.val2 != 20.2)
raise RuntimeError, "Derived Values wrong"
end
end
def verifyValue(expected, got)
if (expected != got)
raise RuntimeError, "verify value failed. Expected: #{expected} Got: #{got}"
end
end
def verifyCount(expected, k)
got = Li_boost_shared_ptr::use_count(k)
if (expected != got)
puts "skipped verifyCount expect/got: #{expected}/#{got}"
# raise RuntimeError, "verify use_count failed. Expected: #{expected} Got: #{got}"
end
end
end
runme = Li_boost_shared_ptr_runme.new()
runme.main(debug)

View file

@ -0,0 +1,45 @@
require 'li_boost_shared_ptr_template'
begin
b = Li_boost_shared_ptr_template::BaseINTEGER.new()
d = Li_boost_shared_ptr_template::DerivedINTEGER.new()
if (b.bar() != 1)
raise RuntimeError("test 1")
end
if (d.bar() != 2)
raise RuntimeError("test 2")
end
if (Li_boost_shared_ptr_template.bar_getter(b) != 1)
raise RuntimeError("test 3")
end
# Needs fixing as it does for Python
# if (Li_boost_shared_ptr_template.bar_getter(d) != 2)
# raise RuntimeError("test 4")
# end
end
begin
b = Li_boost_shared_ptr_template::BaseDefaultInt.new()
d = Li_boost_shared_ptr_template::DerivedDefaultInt.new()
d2 = Li_boost_shared_ptr_template::DerivedDefaultInt2.new()
if (b.bar2() != 3)
raise RuntimeError("test 5")
end
if (d.bar2() != 4)
raise RuntimeError("test 6")
end
if (d2.bar2() != 4)
raise RuntimeError("test 6")
end
if (Li_boost_shared_ptr_template.bar2_getter(b) != 3)
raise RuntimeError("test 7")
end
# Needs fixing as it does for Python
# if (Li_boost_shared_ptr_template.bar2_getter(d) != 4)
# raise RuntimeError("test 8")
# end
# if (Li_boost_shared_ptr_template.bar2_getter(d2) != 4)
# raise RuntimeError("test 8")
# end
end

View file

@ -0,0 +1,36 @@
#!/usr/bin/env ruby
#
# Put description here
#
#
#
#
#
require 'swig_assert'
require 'li_carrays_cpp'
include Li_carrays_cpp
#
# Testing for %array_functions(int,intArray)
#
ary = new_intArray(2)
intArray_setitem(ary, 0, 0)
intArray_setitem(ary, 1, 1)
intArray_getitem(ary, 0)
intArray_getitem(ary, 1)
delete_intArray(ary)
#
# Testing for %array_class(double, doubleArray)
#
ary = DoubleArray.new(2)
ary[0] = 0.0
ary[1] = 1.0
ary[0]
ary[1]
ptr = ary.cast
ary2 = DoubleArray.frompointer(ptr)

View file

@ -39,12 +39,12 @@ iv.each_with_index { |e,i|
"iv.slice(1,2).to_s" => "12",
"iv[0,-2]" => nil,
"iv[0,3].to_s" => "012",
"iv[0,10].to_s" => "012",
"iv[0,10].to_s" => "0123",
"iv[1..2].to_s" => '12',
"iv[1..3].to_s" => '123',
"iv[1..4].to_s" => '123',
"iv[1..-2].to_s" => '12',
"iv[2..-3]" => nil,
"iv[2..-3].to_s" => '',
}.each do |k,v|
swig_assert( "#{k} == #{v.inspect}", binding )
end
@ -68,6 +68,141 @@ iv = IntVector.new([0,1,2,3,4,5,6])
iv.delete_if { |x| x == 0 || x == 3 || x == 6 }
swig_assert_equal(iv.to_s, '1245', binding)
iv[1,2] = [-2, -4]
swig_assert_equal(iv.to_s, '1-2-45', binding)
iv = IntVector.new([0,1,2,3])
iv[0,1] = [-1, -2]
swig_assert_equal(iv.to_s, '-1-2123', binding)
iv = IntVector.new([1,2,3,4])
iv[1,3] = [6,7,8,9]
#__setitem__ needs fixing
#swig_assert_equal(iv.to_s, '16789', binding)
iv = IntVector.new([1,2,3,4])
swig_assert_equal(iv[0], 1, binding)
swig_assert_equal(iv[3], 4, binding)
swig_assert_equal(iv[4], nil, binding)
swig_assert_equal(iv[-5], nil, binding)
iv[-1] = 9
iv[-4] = 6
swig_assert_equal(iv.to_s, '6239', binding)
begin
iv[-5] = 99
raise "exception missed"
rescue IndexError
end
iv[6] = 5
swig_assert_equal(iv.to_s, '6239555', binding)
def failed(a, b, msg)
a = 'nil' if a == nil
b = 'nil' if b == nil
raise RuntimeError, "#{msg}: #{a} ... #{b}"
end
def compare_sequences(a, b)
if a != nil && b != nil
if a.size != b.size
failed(a, b, "different sizes")
end
for i in 0..a.size-1
failed(a, b, "elements are different") if a[i] != b[i]
end
else
unless a == nil && b == nil
failed(a, b, "only one of the sequences is nil")
end
end
end
def compare_expanded_sequences(a, b)
# a can contain nil elements which indicate additional elements
# b won't contain nil for additional elements
if a != nil && b != nil
if a.size != b.size
failed(a, b, "different sizes")
end
for i in 0..a.size-1
failed(a, b, "elements are different") if a[i] != b[i] && a[i] != nil
end
else
unless a == nil && b == nil
failed(a, b, "only one of the sequences is nil")
end
end
end
def check_slice(i, length)
aa = [1,2,3,4]
iv = IntVector.new(aa)
aa_slice = aa[i, length]
iv_slice = iv[i, length]
compare_sequences(aa_slice, iv_slice)
aa_slice = aa.slice(i, length)
iv_slice = iv.slice(i, length)
compare_sequences(aa_slice, iv_slice)
end
def check_range(i, j)
aa = [1,2,3,4]
iv = IntVector.new(aa)
aa_range = aa[i..j]
iv_range = iv[i..j]
compare_sequences(aa_range, iv_range)
aa_range = aa[Range.new(i, j, true)]
iv_range = iv[Range.new(i, j, true)]
compare_sequences(aa_range, iv_range)
end
def set_slice(i, length, expect_nil_expanded_elements)
aa = [1,2,3,4]
iv = IntVector.new(aa)
aa_new = [8, 9]
iv_new = IntVector.new(aa_new)
aa[i, length] = aa_new
iv[i, length] = iv_new
if expect_nil_expanded_elements
compare_expanded_sequences(aa, iv)
else
compare_sequences(aa, iv)
end
end
for i in -5..5
for length in -5..5
check_slice(i, length)
end
end
for i in -5..5
for j in -5..5
check_range(i, j)
end
end
for i in -4..4
for length in 0..4
set_slice(i, length, false)
end
end
for i in [5, 6]
for length in 0..5
set_slice(i, length, true)
end
end
dv = DoubleVector.new(10)

View file

@ -0,0 +1,18 @@
#!/usr/bin/env ruby
#
# Put description here
#
#
#
#
#
require 'swig_assert'
require 'overload_extend2'
f = Overload_extend2::Foo.new
raise RuntimeError if f.test(3) != 1
raise RuntimeError if f.test("hello") != 2
raise RuntimeError if f.test(3.5,2.5) != 3

View file

@ -9,10 +9,11 @@
require 'swig_assert'
require 'overload_extend'
require 'overload_extend_c'
f = Overload_extend::Foo.new
f = Overload_extend_c::Foo.new
raise RuntimeError if f.test(3) != 1
raise RuntimeError if f.test("hello") != 2
raise RuntimeError if f.test(3.5,2.5) != 6

View file

@ -0,0 +1,49 @@
#!/usr/bin/env ruby
#
# The Subversion bindings use this manually written proxy class approach
# to the Ruby bindings. Note that in C the struct svn_fs_t is an
# opaque pointer and the Ruby FileSystem proxy class is hand written around it.
# This testcase tests this and the C close function and subsequent error
# handling.
require 'swig_assert'
require 'ruby_manual_proxy'
module Svn
module Fs
module_function
def create(path)
f = Ruby_manual_proxy::svn_fs_create(path)
return f
end
FileSystem = SWIG::TYPE_p_svn_fs_t
class FileSystem
class << self
def create(*args)
Fs.create(*args)
end
end
def path
Ruby_manual_proxy::svn_fs_path(self)
end
end
end
end
f = Svn::Fs::FileSystem.create("/tmp/myfile")
path = f.path
f.close
begin
# regression in swig-3.0.8 meant ObjectPreviouslyDeleted error was thrown instead
path = f.path
raise RuntimeError.new("IOError (1) not thrown")
rescue IOError
end
file = nil
begin
path = Ruby_manual_proxy::svn_fs_path(file)
raise RuntimeError.new("IOError (2) not thrown")
rescue IOError
end

View file

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# Put description here
#
#
#
#
#
require 'ruby_minherit_shared_ptr'
md = Ruby_minherit_shared_ptr::MultiDerived.new(11, 22)
if md.Base1Func != 11 then
raise RuntimeError
end
if md.Interface1Func != 22 then
raise RuntimeError
end
if Ruby_minherit_shared_ptr.BaseCheck(md) != 11 then
raise RuntimeError
end
if Ruby_minherit_shared_ptr.InterfaceCheck(md) != 22 then
raise RuntimeError
end
if Ruby_minherit_shared_ptr.DerivedCheck(md) != 33 then
raise RuntimeError
end

View file

@ -22,6 +22,8 @@ end
# msg - optional additional message to print
#
def swig_assert_equal( a, b, scope = nil, msg = nil )
a = 'nil' if a == nil
b = 'nil' if b == nil
begin
check = "#{a} == #{b}"
if scope.kind_of? Binding