pointer extraction for holder_types works for pointer_converter.
[luabind.git] / test / test_lua_classes.cpp
blobc13be6c2ded1f32c01171d9bc20b2a283e8b83b4
1 #include <boost/tokenizer.hpp>
3 #include "test.h"
4 #include <iostream>
6 namespace
8 LUABIND_ANONYMOUS_FIX int feedback = 0;
10 struct base
12 virtual ~base()
14 // std::cout << "~base\n";
15 feedback = -1;
18 virtual const char* f()
20 return "base";
24 struct baseWrap : base
27 luabind::object self_;
28 baseWrap(const luabind::object& self): self_(self) {}
30 static const char* fS(base* obj)
32 return obj->base::f();
35 virtual const char* f()
37 return luabind::call_member<const char*>(self_, "f");
41 struct simple_class
43 void f()
45 feedback = 3;
49 struct no_copy
51 no_copy() {}
52 virtual void f() = 0;
53 private:
54 no_copy(const no_copy&) {}
57 void set_feedback(int n)
58 { feedback = n; }
60 } // anonymous namespace
63 bool test_lua_classes()
65 using namespace luabind;
68 lua_State* L = lua_open();
69 lua_baselibopen(L);
70 lua_closer c(L);
71 int top = lua_gettop(L);
73 open(L);
75 class_<no_copy>("no copy")
76 .commit(L)
79 class_<base, baseWrap>("base")
80 .def(constructor<>())
81 .def("f", &baseWrap::fS)
82 .commit(L)
85 class_<simple_class>("simple_class")
86 .def(constructor<>())
87 .def("f", &simple_class::f)
88 .commit(L)
91 function(L, "set_feedback", &set_feedback);
93 dostring(L, "class 'derived' (base)\n"
94 "function derived:__init() super() end\n"
95 "function derived:f() return 'derived -> ' .. base.f(self) end\n");
97 dostring(L, "function create_derived() return derived() end");
99 base* ptr = call_function<base*>(L, "create_derived");
101 if (std::string("derived -> base") != ptr->f()) return false;
103 dostring(L, "class 'simple_derative' (simple_class)");
104 dostring(L, "function simple_derative:__init() super() end\n");
105 dostring(L, "a = simple_derative()");
106 dostring(L, "a:f()");
107 if (feedback != 3) return false;
109 dostring(L, "class 'simple_lua_class'\n");
110 dostring(L, "function simple_lua_class:__init()\n"
111 "super()\n"
112 "self.test_var = 1\n"
113 "end\n"
114 "function simple_lua_class:f()\n"
115 "g = 5\n"
116 "end\n");
117 dostring(L, "a = simple_lua_class()");
118 dostring(L, "a:f()");
119 if (feedback != 3) return false;
120 object g = get_globals(L)["g"];
121 if (object_cast<int>(g) != 5) return false;
123 if (top != lua_gettop(L)) return false;
125 dostring(L, "a = derived()");
130 if (feedback != -1) return false;
134 lua_State* L = lua_open();
135 lua_baselibopen(L);
136 lua_closer c(L);
138 open(L);
140 function(L, "set_feedback", &set_feedback);
142 dostring(L, "class 'simple'");
143 dostring(L, "function simple:__init() set_feedback(321) end");
144 dostring(L, "function simple:__finalize() set_feedback(123) end");
146 dostring(L, "a = simple()");
148 if (feedback != 321) return false;
151 if (feedback != 123) return false;
153 return true;