Resolve the return type to correctly determine if the type is a pointer or reference to a director class. SwigType_refptr_count_return() recently added as a simpler fix is no longer needed. The conventional approach of using the "type" rather than "decl" to analyse the return type is used instead too. Issue #1823
120 lines
3.6 KiB
Ruby
120 lines
3.6 KiB
Ruby
#!/usr/bin/env ruby
|
|
#
|
|
# This test checks the proper unwrapping of director objects before returning
|
|
# a pointer to the (wrapped) instance.
|
|
# Unwrapping must not happen for return-by-value and returning higher
|
|
# reference levels (pointer to pointer, reference to pointer, etc.), but this
|
|
# is already checked by the C++ compiler.
|
|
#
|
|
|
|
require 'swig_assert'
|
|
|
|
require 'director_unwrap_result'
|
|
|
|
############################
|
|
# test with a regular (non-template) class
|
|
|
|
class MyElement < Director_unwrap_result::Element
|
|
end
|
|
|
|
class MyStorage < Director_unwrap_result::Storage
|
|
def initialize(e)
|
|
super()
|
|
@elem = e
|
|
end
|
|
def getIt
|
|
@elem.getPtrPtr
|
|
end
|
|
end
|
|
|
|
e = MyElement.new
|
|
s = MyStorage.new(e)
|
|
|
|
swig_assert_equal('s.getElement.class', 'Director_unwrap_result::Element', binding)
|
|
swig_assert('s.getElement != e', binding)
|
|
|
|
# this shows that the director class was unwrapped:
|
|
swig_assert_equal('s.getElementPtr.class', 'MyElement', binding)
|
|
swig_assert_equal('s.getElementPtr', 'e', binding)
|
|
|
|
# this shows that the director class was unwrapped:
|
|
swig_assert_equal('s.getElementRef.class', 'MyElement', binding)
|
|
swig_assert_equal('s.getElementRef', 'e', binding)
|
|
|
|
# this shows that the director class was unwrapped:
|
|
swig_assert_equal('s.getElementPtrTypedef.class', 'MyElement', binding)
|
|
swig_assert_equal('s.getElementPtrTypedef', 'e', binding)
|
|
|
|
# this shows that the director class was unwrapped:
|
|
swig_assert_equal('s.getElementRefTypedef.class', 'MyElement', binding)
|
|
swig_assert_equal('s.getElementRefTypedef', 'e', binding)
|
|
|
|
# this is not unwrapped:
|
|
swig_assert_equal('s.getElementPtrPtr.class', 'SWIG::TYPE_p_p_Element', binding)
|
|
swig_assert_equal('s.getElementPtrPtr.class', 'SWIG::TYPE_p_p_Element', binding)
|
|
|
|
# this is not unwrapped:
|
|
swig_assert_equal('s.getElementPtrRef.class', 'SWIG::TYPE_p_p_Element', binding)
|
|
swig_assert_equal('s.getElementPtrRef.class', 'SWIG::TYPE_p_p_Element', binding)
|
|
|
|
# this is not unwrapped:
|
|
swig_assert_equal('s.getElementPtrRefTypedef.class', 'SWIG::TYPE_p_p_Element', binding)
|
|
swig_assert_equal('s.getElementPtrRefTypedef.class', 'SWIG::TYPE_p_p_Element', binding)
|
|
|
|
############################
|
|
# test with a template class
|
|
|
|
class MyElementStorage < Director_unwrap_result::ElementStorage
|
|
def initialize(e)
|
|
super()
|
|
@elem = e
|
|
end
|
|
def getIt
|
|
@elem
|
|
end
|
|
end
|
|
|
|
class MyElementPtrStorage < Director_unwrap_result::ElementPtrStorage
|
|
def initialize(e)
|
|
super()
|
|
@elem = e
|
|
end
|
|
def getIt
|
|
@elem.getPtrPtr
|
|
end
|
|
end
|
|
|
|
class MyElementPtrPtrStorage < Director_unwrap_result::ElementPtrPtrStorage
|
|
def initialize(e)
|
|
super()
|
|
@elem = e
|
|
end
|
|
def getIt
|
|
@elem.getPtrPtrPtr
|
|
end
|
|
end
|
|
|
|
e = MyElement.new
|
|
|
|
s = MyElementStorage.new(e)
|
|
swig_assert_equal('s.getVal.class', 'Director_unwrap_result::Element', binding)
|
|
swig_assert('s.getVal != e', binding)
|
|
# this shows that the director class was unwrapped:
|
|
swig_assert_equal('s.getPtr.class', 'MyElement', binding)
|
|
swig_assert_equal('s.getPtr', 'e', binding)
|
|
# this shows that the director class was unwrapped:
|
|
swig_assert_equal('s.getRef.class', 'MyElement', binding)
|
|
swig_assert_equal('s.getRef', 'e', binding)
|
|
|
|
s = MyElementPtrStorage.new(e)
|
|
# this shows that the director class was unwrapped:
|
|
swig_assert_equal('s.getVal.class', 'MyElement', binding)
|
|
swig_assert_equal('s.getVal', 'e', binding)
|
|
swig_assert_equal('s.getPtr.class', 'SWIG::TYPE_p_p_Element', binding)
|
|
swig_assert_equal('s.getRef.class', 'SWIG::TYPE_p_p_Element', binding)
|
|
|
|
s = MyElementPtrPtrStorage.new(e)
|
|
swig_assert_equal('s.getVal.class', 'SWIG::TYPE_p_p_Element', binding)
|
|
swig_assert_equal('s.getPtr.class', 'SWIG::TYPE_p_p_p_Element', binding)
|
|
swig_assert_equal('s.getRef.class', 'SWIG::TYPE_p_p_p_Element', binding)
|
|
|