1 #define BOOST_TEST_MODULE cppbind
2 #include <BoostTestTargetConfig.h>
7 public virtual SGVirtualWeakReferenced
11 public virtual SGVirtualWeakReferenced
19 typedef SGSharedPtr<Base1> Base1Ptr;
20 typedef SGSharedPtr<Base2> Base2Ptr;
21 typedef SGSharedPtr<Derived> DerivedPtr;
22 typedef SGWeakPtr<Derived> DerivedWeakPtr;
24 typedef SGSharedPtr<SGReferenced> SGReferencedPtr;
26 // Check if shared_ptr_traits give correct types for strong and weak shared
28 #define CHECK_PTR_TRAIT_TYPE(ptr_t, type_name, type)\
29 BOOST_STATIC_ASSERT((boost::is_same<\
30 nasal::shared_ptr_traits<ptr_t>::type_name,\
34 #define CHECK_PTR_TRAIT(ref, weak)\
35 CHECK_PTR_TRAIT_TYPE(ref, strong_ref, ref)\
36 CHECK_PTR_TRAIT_TYPE(weak, weak_ref, weak)\
38 CHECK_PTR_TRAIT(DerivedPtr, DerivedWeakPtr)
40 #undef CHECK_PTR_TRAIT
41 #undef CHECK_PTR_TRAIT_TYPE
43 BOOST_STATIC_ASSERT(( nasal::supports_weak_ref<Base1Ptr>::value));
44 BOOST_STATIC_ASSERT(( nasal::supports_weak_ref<Base2Ptr>::value));
45 BOOST_STATIC_ASSERT(( nasal::supports_weak_ref<DerivedPtr>::value));
46 BOOST_STATIC_ASSERT(( nasal::supports_weak_ref<DerivedWeakPtr>::value));
47 BOOST_STATIC_ASSERT((!nasal::supports_weak_ref<SGReferencedPtr>::value));
49 BOOST_AUTO_TEST_CASE( ghost_weak_strong_nasal_conversion )
51 nasal::Ghost<Base1Ptr>::init("Base1");
52 nasal::Ghost<Base2Ptr>::init("Base2");
53 nasal::Ghost<DerivedPtr>::init("Derived")
57 naContext c = naNewContext();
59 DerivedPtr d = new Derived();
60 DerivedWeakPtr weak(d);
62 // store weak pointer and extract strong pointer
63 naRef na_d = nasal::to_nasal(c, DerivedWeakPtr(d));
64 BOOST_REQUIRE( naIsGhost(na_d) );
65 BOOST_CHECK_EQUAL( nasal::from_nasal<Base1Ptr>(c, na_d), d );
66 BOOST_CHECK_EQUAL( nasal::from_nasal<Base2Ptr>(c, na_d), d );
67 BOOST_CHECK_EQUAL( nasal::from_nasal<DerivedPtr>(c, na_d), d );
70 BOOST_REQUIRE( !nasal::from_nasal<DerivedPtr>(c, na_d) );
72 // store strong pointer and extract weak pointer
74 na_d = nasal::to_nasal(c, d);
75 BOOST_REQUIRE( naIsGhost(na_d) );
77 weak = nasal::from_nasal<DerivedWeakPtr>(c, na_d);
78 BOOST_CHECK_EQUAL( weak.lock(), d );
81 BOOST_REQUIRE( nasal::from_nasal<DerivedPtr>(c, na_d) );
82 BOOST_REQUIRE( weak.lock() );
87 BOOST_REQUIRE( !weak.lock() );