*** empty log message ***
[luabind.git] / test / test_operators.cpp
blob93c0d7fc7a946961fa9d51fd1335897ec1fd58e4
1 #include "test.h"
2 #include <iostream>
4 extern "C"
6 #include "lualib.h"
10 namespace
12 LUABIND_ANONYMOUS_FIX int feedback = 0;
14 struct operator_tester
16 int operator+(int) const
18 feedback = 1;
19 return 4;
22 float operator-() const
24 feedback = 2;
25 return 4.6f;
28 float operator()() const
30 feedback = 3;
31 return 3.5f;
34 float operator()(int a) const
36 feedback = 4;
37 return 3.5f + a;;
40 float operator()(int a)
42 feedback = 7;
43 return 3.5f + a;;
48 int operator+(int, const operator_tester&)
50 feedback = 5;
51 return 2;
54 struct operator_tester2
58 float operator+(const operator_tester&, const operator_tester2&)
60 feedback = 6;
61 return 6.3f;
64 struct operator_tester3: public operator_tester {};
66 const operator_tester* make_const_test()
68 static operator_tester o;
69 return &o;
72 std::ostream& operator<<(std::ostream& os, const operator_tester&)
74 os << "operator_tester"; feedback = 63; return os;
77 } // anonymous namespace
79 bool test_operators()
81 using namespace luabind;
83 lua_State* L = lua_open();
84 lua_closer c(L);
85 lua_baselibopen(L);
87 int top = lua_gettop(L);
89 open(L);
91 if (feedback != 0) return false;
93 module(L)
95 class_<operator_tester>("operator_tester")
96 .def(constructor<>())
97 .def(tostring(const_self))
98 .def(self + int())
99 .def(other<int>() + self)
100 .def(-self)
101 .def(self())
102 .def(const_self(int()))
103 .def(self(int())),
105 class_<operator_tester2>("operator_tester2")
106 .def(constructor<>())
107 .def(other<const operator_tester&>() + self),
109 class_<operator_tester3, bases<operator_tester> >("operator_tester3")
110 .def(constructor<>()),
112 def("make_const_test", &make_const_test)
115 if (feedback != 0) return false;
117 if (dostring(L, "test = operator_tester()")) return false;
118 if (dostring(L, "test2 = operator_tester2()")) return false;
119 if (dostring(L, "test3 = operator_tester3()")) return false;
121 if (dostring(L, "test()")) return false;
122 if (feedback != 3) return false;
123 if (dostring(L, "test(5)")) return false;
124 if (feedback != 7) return false;
126 dostring(L, "const_test = make_const_test()");
127 if (dostring(L, "const_test(5)")) return false;
128 if (feedback != 4) return false;
130 if (dostring(L, "a = -test")) return false;
131 if (feedback != 2) return false;
133 if (dostring(L, "a = test + test2")) return false;
134 if (feedback != 6) return false;
136 if (dostring(L, "a = 2 + test")) return false;
137 if (feedback != 5) return false;
139 if (dostring(L, "a = test + 2")) return false;
140 if (feedback != 1) return false;
142 if (dostring(L, "a = test3 + 6")) return false;
143 if (feedback != 1) return false;
145 if (dostring(L, "a = test3 + test2")) return false;
146 if (feedback != 6) return false;
148 if (dostring(L, "a = tostring(test)")) return false;
149 if (feedback != 63) return false;
151 const char* prog =
152 "class 'my_class'\n"
153 "function my_class:__add(lhs)\n"
154 " return my_class(self.val + lhs.val)\n"
155 "end\n"
156 "function my_class:__init(a)\n"
157 " self.val = a\n"
158 "end\n"
159 "function my_class:__sub(v)\n"
160 " if (type(self) == 'number') then\n"
161 " return my_class(self - v.val)\n"
162 " elseif (type(v) == 'number') then\n"
163 " return my_class(self.val - v)\n"
164 " else\n"
165 " return my_class(self.val - v.val)\n"
166 " end\n"
167 "end\n"
168 "a = my_class(3)\n"
169 "b = my_class(7)\n"
170 "c = a + b\n"
171 "d = a - 2\n"
172 "d = 10 - d\n"
173 "d = d - b\n";
175 if (dostring(L, prog)) return false;
176 object var_c = get_globals(L)["c"];
177 if (object_cast<int>(var_c["val"]) != 10) return false;
179 object var_d = get_globals(L)["d"];
180 if (object_cast<int>(var_d["val"]) != 2) return false;
182 if (top != lua_gettop(L)) return false;
184 return true;