]> git.mxchange.org Git - simgear.git/blob - simgear/nasal/cppbind/cppbind_test.cxx
C++/Nasal bindings: allow registering free function as member
[simgear.git] / simgear / nasal / cppbind / cppbind_test.cxx
1 #include "Ghost.hxx"
2 #include "NasalHash.hxx"
3
4 #include <cstring>
5 #include <iostream>
6
7 #define VERIFY(a) \
8   if( !(a) ) \
9   { \
10     std::cerr << "failed:" << #a << std::endl; \
11     return 1; \
12   }
13
14 struct Base
15 {
16   naRef member(naContext, int, naRef*) { return naNil(); }
17 };
18 struct Derived:
19   public Base
20 {
21   int _x;
22   int getX() const { return _x; }
23   void setX(int x) { _x = x; }
24 };
25
26 int main(int argc, char* argv[])
27 {
28   naContext c = naNewContext();
29   naRef r;
30
31   using namespace nasal;
32
33   r = to_nasal(c, "Test");
34   VERIFY( strncmp("Test", naStr_data(r), naStr_len(r)) == 0 );
35   VERIFY( from_nasal<std::string>(c, r) == "Test" );
36
37   r = to_nasal(c, std::string("Test"));
38   VERIFY( strncmp("Test", naStr_data(r), naStr_len(r)) == 0 );
39   VERIFY( from_nasal<std::string>(c, r) == "Test" );
40
41   r = to_nasal(c, 42);
42   VERIFY( naNumValue(r).num == 42 );
43   VERIFY( from_nasal<int>(c, r) == 42 );
44
45   r = to_nasal(c, 4.2f);
46   VERIFY( naNumValue(r).num == 4.2f );
47   VERIFY( from_nasal<float>(c, r) == 4.2f );
48
49   std::vector<int> vec;
50   r = to_nasal(c, vec);
51
52   r = to_nasal(c, "string");
53   try
54   {
55     from_nasal<int>(c, r);
56
57     std::cerr << "failed: Expected bad_nasal_cast to be thrown" << std::endl;
58     return 1;
59   }
60   catch(nasal::bad_nasal_cast&)
61   {}
62
63   Hash hash(c);
64   hash.set("vec", r);
65   hash.set("vec2", vec);
66   hash.set("name", "my-name");
67   hash.set("string", std::string("blub"));
68
69   r = to_nasal(c, hash);
70   VERIFY( naIsHash(r) );
71
72   Hash mod = hash.createHash("mod");
73   mod.set("parent", hash);
74
75   Ghost<Base>::init("Base")
76     .method<&Base::member>("member");
77   Ghost<Derived>::init("Derived")
78     .bases<Base>()
79     .member("x", &Derived::getX, &Derived::setX);
80
81   naRef derived = Ghost<Derived>::create(c);
82   VERIFY( naIsGhost(derived) );
83   // TODO actuall do something with the ghosts...
84
85   naFreeContext(c);
86
87   return 0;
88 }