]> git.mxchange.org Git - simgear.git/blob - simgear/nasal/cppbind/cppbind_test_ghost.cxx
Fix for old versions of Boost.
[simgear.git] / simgear / nasal / cppbind / cppbind_test_ghost.cxx
1 #define BOOST_TEST_MODULE cppbind
2 #include <BoostTestTargetConfig.h>
3
4 #include "Ghost.hxx"
5
6 class Base1:
7   public virtual SGVirtualWeakReferenced
8 {};
9
10 class Base2:
11   public virtual SGVirtualWeakReferenced
12 {};
13
14 class Derived:
15   public Base1,
16   public Base2
17 {};
18
19 typedef SGSharedPtr<Base1> Base1Ptr;
20 typedef SGSharedPtr<Base2> Base2Ptr;
21 typedef SGSharedPtr<Derived> DerivedPtr;
22 typedef SGWeakPtr<Derived> DerivedWeakPtr;
23
24 typedef SGSharedPtr<SGReferenced> SGReferencedPtr;
25
26 // Check if shared_ptr_traits give correct types for strong and weak shared
27 // pointer
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,\
31     type\
32   >::value));
33
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)\
37
38 CHECK_PTR_TRAIT(DerivedPtr, DerivedWeakPtr)
39
40 #undef CHECK_PTR_TRAIT
41 #undef CHECK_PTR_TRAIT_TYPE
42
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));
48
49 BOOST_AUTO_TEST_CASE( ghost_weak_strong_nasal_conversion )
50 {
51   nasal::Ghost<Base1Ptr>::init("Base1");
52   nasal::Ghost<Base2Ptr>::init("Base2");
53   nasal::Ghost<DerivedPtr>::init("Derived")
54     .bases<Base1Ptr>()
55     .bases<Base2Ptr>();
56
57   naContext c = naNewContext();
58
59   DerivedPtr d = new Derived();
60   DerivedWeakPtr weak(d);
61
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 );
68
69   d.reset();
70   BOOST_REQUIRE( !nasal::from_nasal<DerivedPtr>(c, na_d) );
71
72   // store strong pointer and extract weak pointer
73   d.reset(new Derived);
74   na_d = nasal::to_nasal(c, d);
75   BOOST_REQUIRE( naIsGhost(na_d) );
76
77   weak = nasal::from_nasal<DerivedWeakPtr>(c, na_d);
78   BOOST_CHECK_EQUAL( weak.lock(), d );
79
80   d.reset();
81   BOOST_REQUIRE( nasal::from_nasal<DerivedPtr>(c, na_d) );
82   BOOST_REQUIRE( weak.lock() );
83
84   naFreeContext(c);
85   naGC();
86
87   BOOST_REQUIRE( !weak.lock() );
88 }