rice 2.1.1 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (246) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +121 -0
  3. data/CONTRIBUTORS.md +19 -0
  4. data/COPYING +2 -2
  5. data/Gemfile +3 -0
  6. data/README.md +69 -0
  7. data/Rakefile +95 -12
  8. data/include/rice/rice.hpp +7766 -0
  9. data/lib/mkmf-rice.rb +127 -0
  10. data/lib/version.rb +3 -0
  11. data/rice/Address_Registration_Guard.ipp +75 -32
  12. data/rice/Address_Registration_Guard_defn.hpp +60 -56
  13. data/rice/Arg.hpp +80 -4
  14. data/rice/Arg.ipp +51 -0
  15. data/rice/Constructor.hpp +30 -376
  16. data/rice/Data_Object.ipp +234 -107
  17. data/rice/Data_Object_defn.hpp +77 -117
  18. data/rice/Data_Type.hpp +1 -2
  19. data/rice/Data_Type.ipp +251 -295
  20. data/rice/Data_Type_defn.hpp +175 -243
  21. data/rice/Director.hpp +14 -9
  22. data/rice/Enum.hpp +54 -104
  23. data/rice/Enum.ipp +104 -230
  24. data/rice/Exception.hpp +2 -8
  25. data/rice/Exception.ipp +65 -0
  26. data/rice/Exception_defn.hpp +46 -47
  27. data/rice/Identifier.hpp +28 -28
  28. data/rice/Identifier.ipp +23 -27
  29. data/rice/Return.hpp +39 -0
  30. data/rice/Return.ipp +33 -0
  31. data/rice/detail/Exception_Handler.ipp +22 -62
  32. data/rice/detail/Exception_Handler_defn.hpp +76 -91
  33. data/rice/detail/Iterator.hpp +18 -88
  34. data/rice/detail/Iterator.ipp +47 -0
  35. data/rice/detail/Jump_Tag.hpp +21 -0
  36. data/rice/detail/MethodInfo.hpp +44 -0
  37. data/rice/detail/MethodInfo.ipp +78 -0
  38. data/rice/detail/NativeAttribute.hpp +53 -0
  39. data/rice/detail/NativeAttribute.ipp +83 -0
  40. data/rice/detail/NativeFunction.hpp +69 -0
  41. data/rice/detail/NativeFunction.ipp +248 -0
  42. data/rice/detail/RubyFunction.hpp +39 -0
  43. data/rice/detail/RubyFunction.ipp +92 -0
  44. data/rice/detail/Type.hpp +29 -0
  45. data/rice/detail/Type.ipp +138 -0
  46. data/rice/detail/TypeRegistry.hpp +50 -0
  47. data/rice/detail/TypeRegistry.ipp +106 -0
  48. data/rice/detail/Wrapper.hpp +51 -0
  49. data/rice/detail/Wrapper.ipp +151 -0
  50. data/rice/detail/default_allocation_func.hpp +8 -19
  51. data/rice/detail/default_allocation_func.ipp +9 -8
  52. data/rice/detail/from_ruby.hpp +2 -37
  53. data/rice/detail/from_ruby.ipp +1020 -46
  54. data/rice/detail/from_ruby_defn.hpp +38 -0
  55. data/rice/detail/function_traits.hpp +124 -0
  56. data/rice/detail/method_data.hpp +23 -15
  57. data/rice/detail/method_data.ipp +53 -0
  58. data/rice/detail/rice_traits.hpp +116 -0
  59. data/rice/detail/ruby.hpp +9 -49
  60. data/rice/detail/to_ruby.hpp +3 -17
  61. data/rice/detail/to_ruby.ipp +409 -31
  62. data/rice/detail/to_ruby_defn.hpp +48 -0
  63. data/rice/forward_declares.ipp +82 -0
  64. data/rice/global_function.hpp +16 -20
  65. data/rice/global_function.ipp +8 -17
  66. data/rice/rice.hpp +59 -0
  67. data/rice/ruby_mark.hpp +5 -3
  68. data/rice/ruby_try_catch.hpp +4 -4
  69. data/rice/stl.hpp +11 -0
  70. data/sample/callbacks/extconf.rb +6 -0
  71. data/sample/callbacks/sample_callbacks.cpp +35 -0
  72. data/sample/callbacks/test.rb +28 -0
  73. data/sample/enum/extconf.rb +3 -0
  74. data/sample/enum/sample_enum.cpp +3 -17
  75. data/sample/enum/test.rb +2 -2
  76. data/sample/inheritance/animals.cpp +8 -24
  77. data/sample/inheritance/extconf.rb +3 -0
  78. data/sample/inheritance/test.rb +1 -1
  79. data/sample/map/extconf.rb +3 -0
  80. data/sample/map/map.cpp +10 -18
  81. data/sample/map/test.rb +1 -1
  82. data/test/embed_ruby.cpp +34 -0
  83. data/test/embed_ruby.hpp +4 -0
  84. data/test/ext/t1/extconf.rb +3 -0
  85. data/test/ext/t1/t1.cpp +1 -3
  86. data/test/ext/t2/extconf.rb +3 -0
  87. data/test/ext/t2/t2.cpp +1 -1
  88. data/test/extconf.rb +23 -0
  89. data/test/ruby/test_callbacks_sample.rb +28 -0
  90. data/test/ruby/test_multiple_extensions.rb +18 -0
  91. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  92. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  93. data/test/test_Address_Registration_Guard.cpp +25 -11
  94. data/test/test_Array.cpp +131 -74
  95. data/test/test_Attribute.cpp +147 -0
  96. data/test/test_Builtin_Object.cpp +36 -15
  97. data/test/test_Class.cpp +151 -274
  98. data/test/test_Constructor.cpp +10 -9
  99. data/test/test_Data_Object.cpp +135 -193
  100. data/test/test_Data_Type.cpp +323 -252
  101. data/test/test_Director.cpp +56 -42
  102. data/test/test_Enum.cpp +230 -104
  103. data/test/test_Exception.cpp +7 -7
  104. data/test/test_Hash.cpp +33 -31
  105. data/test/test_Identifier.cpp +6 -6
  106. data/test/test_Inheritance.cpp +221 -0
  107. data/test/test_Iterator.cpp +161 -0
  108. data/test/test_Jump_Tag.cpp +1 -1
  109. data/test/test_Keep_Alive.cpp +161 -0
  110. data/test/test_Memory_Management.cpp +4 -5
  111. data/test/test_Module.cpp +169 -111
  112. data/test/test_Object.cpp +51 -19
  113. data/test/test_Ownership.cpp +275 -0
  114. data/test/test_Self.cpp +205 -0
  115. data/test/test_Stl_Optional.cpp +90 -0
  116. data/test/test_Stl_Pair.cpp +144 -0
  117. data/test/test_Stl_SmartPointer.cpp +200 -0
  118. data/test/test_Stl_String.cpp +74 -0
  119. data/test/test_Stl_Vector.cpp +652 -0
  120. data/test/test_String.cpp +3 -3
  121. data/test/test_Struct.cpp +31 -40
  122. data/test/test_Symbol.cpp +3 -3
  123. data/test/test_To_From_Ruby.cpp +283 -218
  124. data/test/test_global_functions.cpp +41 -20
  125. data/test/unittest.cpp +34 -8
  126. data/test/unittest.hpp +0 -4
  127. metadata +117 -137
  128. data/Doxyfile +0 -2280
  129. data/Makefile.am +0 -26
  130. data/Makefile.in +0 -920
  131. data/README +0 -1055
  132. data/README.mingw +0 -8
  133. data/aclocal.m4 +0 -1088
  134. data/bootstrap +0 -8
  135. data/check_stdcxx_11.ac +0 -142
  136. data/config.guess +0 -1421
  137. data/config.sub +0 -1807
  138. data/configure +0 -7481
  139. data/configure.ac +0 -55
  140. data/depcomp +0 -791
  141. data/doxygen.ac +0 -314
  142. data/doxygen.am +0 -186
  143. data/extconf.rb +0 -69
  144. data/install-sh +0 -501
  145. data/missing +0 -215
  146. data/post-autoconf.rb +0 -22
  147. data/post-automake.rb +0 -28
  148. data/rice/Address_Registration_Guard.cpp +0 -22
  149. data/rice/Arg_impl.hpp +0 -129
  150. data/rice/Arg_operators.cpp +0 -21
  151. data/rice/Arg_operators.hpp +0 -19
  152. data/rice/Array.hpp +0 -214
  153. data/rice/Array.ipp +0 -256
  154. data/rice/Builtin_Object.hpp +0 -8
  155. data/rice/Builtin_Object.ipp +0 -50
  156. data/rice/Builtin_Object_defn.hpp +0 -50
  157. data/rice/Class.cpp +0 -57
  158. data/rice/Class.hpp +0 -8
  159. data/rice/Class.ipp +0 -6
  160. data/rice/Class_defn.hpp +0 -83
  161. data/rice/Data_Type.cpp +0 -54
  162. data/rice/Data_Type_fwd.hpp +0 -12
  163. data/rice/Director.cpp +0 -13
  164. data/rice/Exception.cpp +0 -59
  165. data/rice/Exception_Base.hpp +0 -8
  166. data/rice/Exception_Base.ipp +0 -13
  167. data/rice/Exception_Base_defn.hpp +0 -27
  168. data/rice/Hash.hpp +0 -227
  169. data/rice/Hash.ipp +0 -329
  170. data/rice/Identifier.cpp +0 -8
  171. data/rice/Jump_Tag.hpp +0 -24
  172. data/rice/Makefile.am +0 -124
  173. data/rice/Makefile.in +0 -839
  174. data/rice/Module.cpp +0 -84
  175. data/rice/Module.hpp +0 -8
  176. data/rice/Module.ipp +0 -6
  177. data/rice/Module_defn.hpp +0 -88
  178. data/rice/Module_impl.hpp +0 -281
  179. data/rice/Module_impl.ipp +0 -345
  180. data/rice/Object.cpp +0 -169
  181. data/rice/Object.hpp +0 -8
  182. data/rice/Object.ipp +0 -19
  183. data/rice/Object_defn.hpp +0 -191
  184. data/rice/Require_Guard.hpp +0 -21
  185. data/rice/String.cpp +0 -94
  186. data/rice/String.hpp +0 -91
  187. data/rice/Struct.cpp +0 -117
  188. data/rice/Struct.hpp +0 -162
  189. data/rice/Struct.ipp +0 -26
  190. data/rice/Symbol.cpp +0 -25
  191. data/rice/Symbol.hpp +0 -66
  192. data/rice/Symbol.ipp +0 -44
  193. data/rice/config.hpp +0 -47
  194. data/rice/config.hpp.in +0 -46
  195. data/rice/detail/Arguments.hpp +0 -118
  196. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  197. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3694
  198. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  199. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2774
  200. data/rice/detail/Caster.hpp +0 -103
  201. data/rice/detail/Not_Copyable.hpp +0 -25
  202. data/rice/detail/Wrapped_Function.hpp +0 -33
  203. data/rice/detail/cfp.hpp +0 -24
  204. data/rice/detail/cfp.ipp +0 -51
  205. data/rice/detail/check_ruby_type.cpp +0 -27
  206. data/rice/detail/check_ruby_type.hpp +0 -23
  207. data/rice/detail/creation_funcs.hpp +0 -37
  208. data/rice/detail/creation_funcs.ipp +0 -36
  209. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  210. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  211. data/rice/detail/demangle.cpp +0 -56
  212. data/rice/detail/demangle.hpp +0 -19
  213. data/rice/detail/env.hpp +0 -11
  214. data/rice/detail/method_data.cpp +0 -86
  215. data/rice/detail/node.hpp +0 -13
  216. data/rice/detail/object_call.hpp +0 -69
  217. data/rice/detail/object_call.ipp +0 -131
  218. data/rice/detail/protect.cpp +0 -29
  219. data/rice/detail/protect.hpp +0 -34
  220. data/rice/detail/ruby_version_code.hpp +0 -6
  221. data/rice/detail/ruby_version_code.hpp.in +0 -6
  222. data/rice/detail/st.hpp +0 -22
  223. data/rice/detail/traits.hpp +0 -43
  224. data/rice/detail/win32.hpp +0 -16
  225. data/rice/detail/wrap_function.hpp +0 -341
  226. data/rice/detail/wrap_function.ipp +0 -514
  227. data/rice/protect.hpp +0 -92
  228. data/rice/protect.ipp +0 -1134
  229. data/rice/rubypp.rb +0 -97
  230. data/rice/to_from_ruby.hpp +0 -8
  231. data/rice/to_from_ruby.ipp +0 -294
  232. data/rice/to_from_ruby_defn.hpp +0 -70
  233. data/ruby.ac +0 -135
  234. data/ruby/Makefile.am +0 -1
  235. data/ruby/Makefile.in +0 -625
  236. data/ruby/lib/Makefile.am +0 -3
  237. data/ruby/lib/Makefile.in +0 -503
  238. data/ruby/lib/mkmf-rice.rb.in +0 -217
  239. data/ruby/lib/version.rb +0 -3
  240. data/sample/Makefile.am +0 -47
  241. data/sample/Makefile.in +0 -486
  242. data/test/Makefile.am +0 -72
  243. data/test/Makefile.in +0 -1150
  244. data/test/ext/Makefile.am +0 -41
  245. data/test/ext/Makefile.in +0 -480
  246. data/test/test_rice.rb +0 -41
@@ -1,13 +1,10 @@
1
1
  #include "unittest.hpp"
2
- #include "rice/Exception.hpp"
3
- #include "rice/Director.hpp"
4
- #include "rice/Constructor.hpp"
5
- #include "rice/Data_Type.hpp"
2
+ #include "embed_ruby.hpp"
3
+ #include <rice/rice.hpp>
6
4
 
7
5
  #include <vector>
8
6
  #include <iostream>
9
7
 
10
- using namespace std;
11
8
  using namespace Rice;
12
9
 
13
10
  TESTSUITE(Director);
@@ -16,9 +13,10 @@ namespace {
16
13
  /**
17
14
  * Abstract base class
18
15
  */
19
- class Worker {
16
+ class Worker
17
+ {
20
18
  public:
21
- virtual ~Worker() { }
19
+ virtual ~Worker() = default;
22
20
 
23
21
  int getNumber() { return 12; }
24
22
 
@@ -40,18 +38,24 @@ namespace {
40
38
  /**
41
39
  * Class to handle workers
42
40
  */
43
- class Handler {
41
+ class Handler
42
+ {
44
43
  std::vector<Worker*> mWorkers;
45
44
 
46
45
  public:
47
46
 
48
- void addWorker(Worker* worker) { mWorkers.push_back(worker); }
47
+ void addWorker(Worker* worker)
48
+ {
49
+ mWorkers.push_back(worker);
50
+ }
49
51
 
50
- int processWorkers(int start) {
52
+ int processWorkers(int start)
53
+ {
51
54
  std::vector<Worker*>::iterator i = mWorkers.begin();
52
55
  int results = start;
53
56
 
54
- for(; i != mWorkers.end(); i++) {
57
+ for(; i != mWorkers.end(); i++)
58
+ {
55
59
  results = (*i)->process(results);
56
60
  }
57
61
 
@@ -62,24 +66,29 @@ namespace {
62
66
  /**
63
67
  * Our Director wrapper of Worker
64
68
  */
65
- class WorkerDirector : public Worker, public Rice::Director {
69
+ class WorkerDirector : public Worker, public Rice::Director
70
+ {
66
71
  public:
67
72
  WorkerDirector(Object self) : Director(self) { }
68
73
 
69
- virtual int process(int num) {
70
- return from_ruby<int>( getSelf().call("process", num) );
74
+ virtual int process(int num)
75
+ {
76
+ return detail::From_Ruby<int>().convert( getSelf().call("process", num) );
71
77
  }
72
78
 
73
- int default_process(int num) {
79
+ int default_process(int num)
80
+ {
74
81
  raisePureVirtual();
75
82
  return 0;
76
83
  }
77
84
 
78
- virtual int doSomething(int num) {
79
- return from_ruby<int>( getSelf().call("do_something", num) );
85
+ virtual int doSomething(int num)
86
+ {
87
+ return detail::From_Ruby<int>().convert( getSelf().call("do_something", num) );
80
88
  }
81
89
 
82
- int default_doSomething(int num) {
90
+ int default_doSomething(int num)
91
+ {
83
92
  return Worker::doSomething(num);
84
93
  }
85
94
  };
@@ -87,7 +96,7 @@ namespace {
87
96
 
88
97
  SETUP(Director)
89
98
  {
90
- ruby_init();
99
+ embed_ruby();
91
100
  }
92
101
 
93
102
  TESTCASE(exposes_worker_as_instantiatable_class)
@@ -100,7 +109,7 @@ TESTCASE(exposes_worker_as_instantiatable_class)
100
109
  Module m = define_module("Testing");
101
110
  Object result = m.instance_eval("worker = Worker.new; worker.get_number");
102
111
 
103
- ASSERT_EQUAL(12, from_ruby<int>(result.value()));
112
+ ASSERT_EQUAL(12, detail::From_Ruby<int>().convert(result.value()));
104
113
  }
105
114
 
106
115
  TESTCASE(can_call_virtual_methods_on_base_class)
@@ -115,7 +124,7 @@ TESTCASE(can_call_virtual_methods_on_base_class)
115
124
 
116
125
  Object result = m.instance_eval("worker = Worker.new; worker.do_something(4)");
117
126
 
118
- ASSERT_EQUAL(16, from_ruby<int>(result.value()));
127
+ ASSERT_EQUAL(16, detail::From_Ruby<int>().convert(result.value()));
119
128
  }
120
129
 
121
130
  TESTCASE(super_calls_pass_execution_up_the_inheritance_chain)
@@ -130,7 +139,7 @@ TESTCASE(super_calls_pass_execution_up_the_inheritance_chain)
130
139
 
131
140
  Object result = m.instance_eval("worker = RubyWorker.new; worker.do_something(10)");
132
141
 
133
- ASSERT_EQUAL(400, from_ruby<int>(result.value()));
142
+ ASSERT_EQUAL(400, detail::From_Ruby<int>().convert(result.value()));
134
143
  }
135
144
 
136
145
  TESTCASE(super_calls_on_pure_virtual_raise_error)
@@ -157,7 +166,7 @@ TESTCASE(polymorphic_calls_head_down_the_call_chain)
157
166
  {
158
167
  define_class<Handler>("Handler")
159
168
  .define_constructor(Constructor<Handler>())
160
- .define_method("add_worker", &Handler::addWorker)
169
+ .define_method("add_worker", &Handler::addWorker, Arg("worker").keepAlive())
161
170
  .define_method("process_workers", &Handler::processWorkers);
162
171
 
163
172
  define_class<Worker>("Worker")
@@ -178,7 +187,7 @@ TESTCASE(polymorphic_calls_head_down_the_call_chain)
178
187
  Object result = m.instance_eval("$handler.process_workers(5)");
179
188
 
180
189
  // Hit's EchoWorker, so 5 + 2, then passes that to DoubleWorker, so 7 * 2 = 14
181
- ASSERT_EQUAL(14, from_ruby<int>(result.value()));
190
+ ASSERT_EQUAL(14, detail::From_Ruby<int>().convert(result.value()));
182
191
  }
183
192
 
184
193
  namespace {
@@ -194,23 +203,26 @@ namespace {
194
203
  virtual int doItImpl(int in) = 0;
195
204
  };
196
205
 
197
- class CallsSelfDirector : public CallsSelf, public Director {
198
-
206
+ class CallsSelfDirector : public CallsSelf, public Director
207
+ {
199
208
  public:
200
209
  CallsSelfDirector(Object self) : Director(self) { }
201
210
  virtual ~CallsSelfDirector() { }
202
211
 
203
- virtual int doItImpl(int in) {
204
- return from_ruby<int>( getSelf().call("do_it_impl", in) );
212
+ virtual int doItImpl(int in)
213
+ {
214
+ return detail::From_Ruby<int>().convert( getSelf().call("do_it_impl", in) );
205
215
  }
206
216
 
207
- int default_doItImpl(int in) {
217
+ int default_doItImpl(int in)
218
+ {
208
219
  raisePureVirtual();
209
220
  return 0;
210
221
  }
211
222
  };
212
223
 
213
- struct MyCallsSelf : CallsSelf {
224
+ struct MyCallsSelf : CallsSelf
225
+ {
214
226
  MyCallsSelf() { }
215
227
  virtual ~MyCallsSelf() { }
216
228
 
@@ -218,19 +230,21 @@ namespace {
218
230
  };
219
231
 
220
232
  // Abstract type return types handled properly
221
- CallsSelf* getCallsSelf() {
233
+ CallsSelf* getCallsSelf()
234
+ {
222
235
  return new MyCallsSelf();
223
236
  }
224
237
 
225
238
  // Abstract type Argument types handled properly
226
- int doItOnPointer(CallsSelf* obj, int in) {
239
+ int doItOnPointer(CallsSelf* obj, int in)
240
+ {
227
241
  return obj->doIt(in);
228
242
  }
229
243
 
230
- int doItOnReference(CallsSelf& obj, int in) {
244
+ int doItOnReference(CallsSelf& obj, int in)
245
+ {
231
246
  return obj.doIt(in);
232
247
  }
233
-
234
248
  }
235
249
 
236
250
  TESTCASE(mix_of_polymorphic_calls_and_inheritance_dont_cause_infinite_loops)
@@ -248,7 +262,7 @@ TESTCASE(mix_of_polymorphic_calls_and_inheritance_dont_cause_infinite_loops)
248
262
  "c = MySelf.new; c.do_it(10)"
249
263
  );
250
264
 
251
- ASSERT_EQUAL(100, from_ruby<int>(result.value()));
265
+ ASSERT_EQUAL(100, detail::From_Ruby<int>().convert(result.value()));
252
266
  }
253
267
 
254
268
  TESTCASE(director_class_super_classes_get_type_bound)
@@ -262,8 +276,9 @@ TESTCASE(director_class_super_classes_get_type_bound)
262
276
  .define_method("do_it_impl", &CallsSelfDirector::default_doItImpl)
263
277
  .define_method("do_it", &CallsSelf::doIt);
264
278
 
265
- Object result = m.instance_eval("cs = Testing::get_calls_self; cs.do_it(3);");
266
- ASSERT_EQUAL(36, from_ruby<int>(result.value()));
279
+ Object result = m.instance_eval(R"(cs = Testing::get_calls_self
280
+ cs.do_it(3))");
281
+ ASSERT_EQUAL(36, detail::From_Ruby<int>().convert(result.value()));
267
282
  }
268
283
 
269
284
  TESTCASE(director_allows_abstract_types_used_as_parameters_pointers)
@@ -283,9 +298,9 @@ TESTCASE(director_allows_abstract_types_used_as_parameters_pointers)
283
298
  "Testing::do_it_on_pointer(c, 5)"
284
299
  );
285
300
 
286
- ASSERT_EQUAL(50, from_ruby<int>(result.value()));
301
+ ASSERT_EQUAL(50, detail::From_Ruby<int>().convert(result.value()));
287
302
  }
288
- /*
303
+
289
304
  TESTCASE(director_allows_abstract_types_used_as_parameters_reference)
290
305
  {
291
306
  Module m = define_module("Testing");
@@ -303,6 +318,5 @@ TESTCASE(director_allows_abstract_types_used_as_parameters_reference)
303
318
  "Testing::do_it_on_ref(c, 3)"
304
319
  );
305
320
 
306
- ASSERT_EQUAL(30, from_ruby<int>(result.value()));
307
- }
308
- */
321
+ ASSERT_EQUAL(30, detail::From_Ruby<int>().convert(result.value()));
322
+ }
data/test/test_Enum.cpp CHANGED
@@ -1,11 +1,10 @@
1
- #include "unittest.hpp"
2
- #include "rice/Enum.hpp"
3
- #include "rice/Array.hpp"
4
- #include "rice/String.hpp"
5
- #include "rice/Constructor.hpp"
6
- #include "rice/global_function.hpp"
7
1
  #include <iostream>
8
2
 
3
+ #include "unittest.hpp"
4
+ #include "embed_ruby.hpp"
5
+
6
+ #include <rice/rice.hpp>
7
+
9
8
  using namespace Rice;
10
9
 
11
10
  TESTSUITE(Enum);
@@ -22,144 +21,202 @@ namespace
22
21
  .define_value("GREEN", GREEN);
23
22
  return colors;
24
23
  }
24
+
25
+ enum class Season { Spring, Summer, Fall, Winter };
26
+
27
+ // This is needed to make unittest compile (it uses ostream to report errors)
28
+ inline std::ostream& operator<<(std::ostream& os, const Season& season)
29
+ {
30
+ os << static_cast<std::underlying_type_t<Season>>(season);
31
+ return os;
32
+ }
33
+
34
+ Enum<Season> define_season_enum()
35
+ {
36
+ static Enum<Season> seasons = define_enum<Season>("Season")
37
+ .define_value("Spring", Season::Spring)
38
+ .define_value("Summer", Season::Summer)
39
+ .define_value("Fall", Season::Fall)
40
+ .define_value("Winter", Season::Winter);
41
+
42
+ return seasons;
43
+ }
25
44
  }
26
45
 
27
46
  SETUP(Enum)
28
47
  {
29
- ruby_init();
48
+ embed_ruby();
30
49
  }
31
50
 
32
51
  TESTCASE(copy_construct)
33
52
  {
34
- Enum<Color> rb_cColor(define_color_enum());
35
- ASSERT_EQUAL(define_color_enum().value(), rb_cColor.value());
53
+ Enum<Color> colorEnum(define_color_enum());
54
+ ASSERT_EQUAL(define_color_enum().value(), colorEnum.value());
36
55
  }
37
56
 
38
57
  TESTCASE(assignment)
39
58
  {
40
- Enum<Color> rb_cColor;
41
- rb_cColor = define_color_enum();
42
- ASSERT_EQUAL(define_color_enum().value(), rb_cColor.value());
59
+ Enum<Color> colorEnum;
60
+ colorEnum = define_color_enum();
61
+ ASSERT_EQUAL(define_color_enum().value(), colorEnum.value());
43
62
  }
44
63
 
45
64
  TESTCASE(each)
46
65
  {
47
- Enum<Color> rb_cColor = define_color_enum();
48
- Array a = protect(rb_eval_string, "a = []; Color.each { |x| a << x }; a");
66
+ Module m = define_module("Testing");
67
+
68
+ Enum<Color> colorEnum = define_color_enum();
69
+
70
+ std::string code = R"(a = []
71
+ Color.each { |x| a << x }
72
+ a)";
73
+ Array a = m.instance_eval(code);
49
74
  ASSERT_EQUAL(3u, a.size());
50
- ASSERT_EQUAL(RED, from_ruby<Color>(a[0]));
51
- ASSERT_EQUAL(BLACK, from_ruby<Color>(a[1]));
52
- ASSERT_EQUAL(GREEN, from_ruby<Color>(a[2]));
75
+
76
+ Data_Object<Color> enum_0(a[0]);
77
+ ASSERT_EQUAL(RED, *enum_0);
78
+
79
+ Data_Object<Color> enum_1(a[1]);
80
+ ASSERT_EQUAL(BLACK, *enum_1);
81
+
82
+ Data_Object<Color> enum_2(a[2]);
83
+ ASSERT_EQUAL(GREEN, *enum_2);
84
+ }
85
+
86
+ TESTCASE(each_seasons)
87
+ {
88
+ Module m = define_module("Testing");
89
+
90
+ Enum<Season> rb_cSeason = define_season_enum();
91
+ std::string code = R"(a = []
92
+ Season.each { |x| a << x }
93
+ a)";
94
+
95
+ Array a = m.instance_eval(code);
96
+ ASSERT_EQUAL(4u, a.size());
97
+
98
+ Data_Object<Season> enum_0(a[0]);
99
+ ASSERT_EQUAL(Season::Spring, *enum_0);
100
+
101
+ Data_Object<Season> enum_1(a[1]);
102
+ ASSERT_EQUAL(Season::Summer, *enum_1);
103
+
104
+ Data_Object<Season> enum_2(a[2]);
105
+ ASSERT_EQUAL(Season::Fall, *enum_2);
106
+
107
+ Data_Object<Season> enum_3(a[3]);
108
+ ASSERT_EQUAL(Season::Winter, *enum_3);
53
109
  }
54
110
 
55
111
  TESTCASE(to_s)
56
112
  {
57
- Enum<Color> rb_cColor = define_color_enum();
58
- ASSERT_EQUAL(String("RED"), String(protect(rb_eval_string, "Color::RED.to_s")));
59
- ASSERT_EQUAL(String("BLACK"), String(protect(rb_eval_string, "Color::BLACK.to_s")));
60
- ASSERT_EQUAL(String("GREEN"), String(protect(rb_eval_string, "Color::GREEN.to_s")));
113
+ Module m = define_module("Testing");
114
+
115
+ Enum<Color> colorEnum = define_color_enum();
116
+ ASSERT_EQUAL(String("RED"), String(m.instance_eval("Color::RED.to_s")));
117
+ ASSERT_EQUAL(String("BLACK"), String(m.instance_eval("Color::BLACK.to_s")));
118
+ ASSERT_EQUAL(String("GREEN"), String(m.instance_eval("Color::GREEN.to_s")));
61
119
  }
62
120
 
63
121
  TESTCASE(to_i)
64
122
  {
65
- Enum<Color> rb_cColor = define_color_enum();
66
- ASSERT_EQUAL(to_ruby(int(RED)), Object(protect(rb_eval_string, "Color::RED.to_i")));
67
- ASSERT_EQUAL(to_ruby(int(BLACK)), Object(protect(rb_eval_string, "Color::BLACK.to_i")));
68
- ASSERT_EQUAL(to_ruby(int(GREEN)), Object(protect(rb_eval_string, "Color::GREEN.to_i")));
123
+ Module m = define_module("Testing");
124
+
125
+ Enum<Color> colorEnum = define_color_enum();
126
+ ASSERT_EQUAL(detail::to_ruby(int(RED)), m.instance_eval("Color::RED.to_i").value());
127
+ ASSERT_EQUAL(detail::to_ruby(int(BLACK)), m.instance_eval("Color::BLACK.to_i").value());
128
+ ASSERT_EQUAL(detail::to_ruby(int(GREEN)), m.instance_eval("Color::GREEN.to_i").value());
69
129
  }
70
130
 
71
131
  TESTCASE(inspect)
72
132
  {
73
- Enum<Color> rb_cColor = define_color_enum();
74
- ASSERT_EQUAL(String("#<Color::RED>"), String(protect(rb_eval_string, "Color::RED.inspect")));
75
- ASSERT_EQUAL(String("#<Color::BLACK>"), String(protect(rb_eval_string, "Color::BLACK.inspect")));
76
- ASSERT_EQUAL(String("#<Color::GREEN>"), String(protect(rb_eval_string, "Color::GREEN.inspect")));
133
+ Module m = define_module("Testing");
134
+
135
+ Enum<Color> colorEnum = define_color_enum();
136
+ ASSERT_EQUAL(String("#<Color::RED>"), String(m.instance_eval("Color::RED.inspect")));
137
+ ASSERT_EQUAL(String("#<Color::BLACK>"), String(m.instance_eval("Color::BLACK.inspect")));
138
+ ASSERT_EQUAL(String("#<Color::GREEN>"), String(m.instance_eval("Color::GREEN.inspect")));
77
139
  }
78
140
 
79
141
  TESTCASE(compare)
80
142
  {
81
- Enum<Color> rb_cColor = define_color_enum();
82
- ASSERT_EQUAL(to_ruby(-1), Object(protect(rb_eval_string, "Color::RED <=> Color::BLACK")));
83
- ASSERT_EQUAL(to_ruby(1), Object(protect(rb_eval_string, "Color::GREEN <=> Color::RED")));
84
- ASSERT_EQUAL(to_ruby(0), Object(protect(rb_eval_string, "Color::BLACK <=> Color::BLACK")));
143
+ Module m = define_module("Testing");
144
+
145
+ Enum<Color> colorEnum = define_color_enum();
146
+ ASSERT_EQUAL(detail::to_ruby(-1), m.instance_eval("Color::RED <=> Color::BLACK").value());
147
+ ASSERT_EQUAL(detail::to_ruby(1), m.instance_eval("Color::GREEN <=> Color::RED").value());
148
+ ASSERT_EQUAL(detail::to_ruby(0), m.instance_eval("Color::BLACK <=> Color::BLACK").value());
85
149
  }
86
150
 
87
151
  TESTCASE(eql)
88
152
  {
89
- Enum<Color> rb_cColor = define_color_enum();
90
- ASSERT_EQUAL(to_ruby(false), Object(protect(rb_eval_string, "Color::RED == Color::BLACK")));
91
- ASSERT_EQUAL(to_ruby(true), Object(protect(rb_eval_string, "Color::GREEN == Color::GREEN")));
92
- }
153
+ Module m = define_module("Testing");
93
154
 
94
- TESTCASE(invalid_to_s)
95
- {
96
- Enum<Color> rb_cColor = define_color_enum();
97
- Data_Object<Color> invalid(new Color(static_cast<Color>(42)));
98
- ASSERT_EQUAL(String("INVALID(42)"), invalid.to_s());
155
+ Enum<Color> colorEnum = define_color_enum();
156
+ ASSERT_EQUAL(detail::to_ruby(false), m.instance_eval("Color::RED == Color::BLACK").value());
157
+ ASSERT_EQUAL(detail::to_ruby(true), m.instance_eval("Color::GREEN == Color::GREEN").value());
99
158
  }
100
159
 
101
- TESTCASE(invalid_to_i)
160
+ TESTCASE(compare_equal)
102
161
  {
103
- Enum<Color> rb_cColor = define_color_enum();
104
- Data_Object<Color> invalid(new Color(static_cast<Color>(42)));
105
- ASSERT_EQUAL(to_ruby(42), invalid.call("to_i"));
162
+ Enum<Color> colorEnum = define_color_enum();
163
+ Object color1 = colorEnum.const_get("RED");
164
+ Object color2 = colorEnum.const_get("RED");
165
+ Object result = color1.call("<=>", color2);
166
+ ASSERT_EQUAL(0, detail::From_Ruby<int>().convert(result));
106
167
  }
107
168
 
108
- TESTCASE(invalid_inspect)
169
+ TESTCASE(compare_less)
109
170
  {
110
- Enum<Color> rb_cColor = define_color_enum();
111
- Data_Object<Color> invalid(new Color(static_cast<Color>(42)));
112
- ASSERT_EQUAL(String("#<Color::INVALID(42)>"), invalid.inspect());
171
+ Enum<Color> colorEnum = define_color_enum();
172
+ Object color1 = colorEnum.const_get("RED");
173
+ Object color2 = colorEnum.const_get("BLACK");
174
+ Object result = color1.call("<=>", color2);
175
+ ASSERT_EQUAL(-1, detail::From_Ruby<int>().convert(result));
113
176
  }
114
177
 
115
- TESTCASE(invalid_compare)
178
+ TESTCASE(compare_more)
116
179
  {
117
- Enum<Color> rb_cColor = define_color_enum();
118
- Data_Object<Color> invalid(new Color(static_cast<Color>(42)));
119
- Data_Object<Color> red(new Color(RED));
120
- ASSERT_EQUAL(1, invalid.compare(red));
121
- ASSERT_EQUAL(-1, red.compare(invalid));
122
- ASSERT_EQUAL(0, invalid.compare(invalid));
180
+ Enum<Color> colorEnum = define_color_enum();
181
+ Object color1 = colorEnum.const_get("GREEN");
182
+ Object color2 = colorEnum.const_get("BLACK");
183
+ Object result = color1.call("<=>", color2);
184
+ ASSERT_EQUAL(1, detail::From_Ruby<int>().convert(result));
123
185
  }
124
186
 
125
- TESTCASE(invalid_eql)
187
+ TESTCASE(different_objects_eql)
126
188
  {
127
- Enum<Color> rb_cColor = define_color_enum();
128
- Data_Object<Color> invalid(new Color(static_cast<Color>(42)));
129
- Data_Object<Color> red(new Color(RED));
130
- ASSERT_EQUAL(false, invalid == red);
131
- ASSERT_EQUAL(false, red == invalid);
132
- ASSERT_EQUAL(true, invalid == invalid);
189
+ Enum<Color> colorEnum = define_color_enum();
190
+ Object black1 = colorEnum.const_get("BLACK");
191
+ Object black2 = colorEnum.const_get("BLACK");
192
+ Object result = black1.call("==", black2);
193
+ ASSERT_EQUAL(Qtrue, result.value());
133
194
  }
134
195
 
135
- TESTCASE(different_objects_compare)
196
+ TESTCASE(hash)
136
197
  {
137
- Enum<Color> rb_cColor = define_color_enum();
138
- Data_Object<Color> red1(new Color(RED));
139
- Data_Object<Color> red2(new Color(RED));
140
- ASSERT_EQUAL(0, red1.compare(red2));
198
+ Enum<Color> colorEnum = define_color_enum();
199
+ Object color = colorEnum.const_get("GREEN");
200
+ Object result = color.call("hash");
201
+ ASSERT_EQUAL((int)Color::GREEN, detail::From_Ruby<int>().convert(result));
141
202
  }
142
203
 
143
- TESTCASE(different_objects_eql)
204
+ TESTCASE(from_int)
144
205
  {
145
- Enum<Color> rb_cColor = define_color_enum();
146
- Data_Object<Color> red1(new Color(RED));
147
- Data_Object<Color> red2(new Color(RED));
148
- ASSERT_EQUAL(true, red1 == red2);
206
+ Enum<Color> colorEnum = define_color_enum();
207
+ Object result = colorEnum.call("from_int", 2);
208
+ ASSERT_EQUAL(result, colorEnum.const_get("GREEN"));
149
209
  }
150
210
 
151
- TESTCASE(hash)
211
+ TESTCASE(from_int_invalid)
152
212
  {
153
- Enum<Color> rb_cColor = define_color_enum();
154
- Data_Object<Color> red(new Color(RED));
155
- ASSERT_EQUAL(to_ruby(int(RED)), red.call("hash"));
156
- }
213
+ Enum<Color> colorEnum = define_color_enum();
157
214
 
158
- TESTCASE(from_int)
159
- {
160
- Enum<Color> rb_cColor = define_color_enum();
161
- Data_Object<Color> color(rb_cColor.call("from_int", int(RED)));
162
- ASSERT_EQUAL(RED, *color);
215
+ ASSERT_EXCEPTION_CHECK(
216
+ Exception,
217
+ Object result = colorEnum.call("from_int", 22),
218
+ ASSERT_EQUAL("Unknown enum value: 22", ex.what())
219
+ );
163
220
  }
164
221
 
165
222
  namespace
@@ -178,38 +235,107 @@ namespace
178
235
 
179
236
  TESTCASE(nested_enums)
180
237
  {
238
+ Data_Type<Inner> inner = define_class<Inner>("Inner");
239
+ define_enum<Inner::Props>("Props", inner)
240
+ .define_value("VALUE1", Inner::VALUE1)
241
+ .define_value("VALUE2", Inner::VALUE2)
242
+ .define_value("VALUE3", Inner::VALUE3);
243
+ inner.define_constructor(Constructor<Inner>());
244
+
245
+ Module m = define_module("Testing");
246
+
247
+ ASSERT_EQUAL(detail::to_ruby(int(0)), m.instance_eval("Inner::Props::VALUE1.to_i").value());
248
+ ASSERT_EQUAL(detail::to_ruby(int(1)), m.instance_eval("Inner::Props::VALUE2.to_i").value());
249
+ ASSERT_EQUAL(detail::to_ruby(int(2)), m.instance_eval("Inner::Props::VALUE3.to_i").value());
250
+ }
251
+
252
+ namespace
253
+ {
254
+ Color myFavoriteColor()
181
255
  {
182
- Data_Type<Inner> inner = define_class<Inner>("Inner");
183
- define_enum<Inner::Props>("Props", inner)
184
- .define_value("VALUE1", Inner::VALUE1)
185
- .define_value("VALUE2", Inner::VALUE2)
186
- .define_value("VALUE3", Inner::VALUE3);
187
- inner.define_constructor(Constructor<Inner>());
256
+ return RED;
188
257
  }
189
258
 
190
- ASSERT_EQUAL(to_ruby(int(0)), Object(protect(rb_eval_string, "Inner::Props::VALUE1.to_i")));
191
- ASSERT_EQUAL(to_ruby(int(1)), Object(protect(rb_eval_string, "Inner::Props::VALUE2.to_i")));
192
- ASSERT_EQUAL(to_ruby(int(2)), Object(protect(rb_eval_string, "Inner::Props::VALUE3.to_i")));
259
+ bool isMyFavoriteColor(Color aColor)
260
+ {
261
+ return aColor == RED;
262
+ }
263
+ }
264
+
265
+ TESTCASE(using_enums)
266
+ {
267
+ Enum<Color> colorEnum = define_color_enum();
268
+ colorEnum.define_singleton_function("my_favorite_color", &myFavoriteColor)
269
+ .define_singleton_function("is_my_favorite_color", &isMyFavoriteColor)
270
+ .define_singleton_function("is_my_favorite_color", &isMyFavoriteColor)
271
+ .define_method("is_my_favorite_color", &isMyFavoriteColor);
272
+
273
+ Module m = define_module("Testing");
274
+
275
+ Object result = m.instance_eval("Color.my_favorite_color");
276
+ ASSERT_EQUAL(RED, detail::From_Ruby<Color>().convert(result.value()));
277
+
278
+ result = m.instance_eval("Color.is_my_favorite_color(Color::RED)");
279
+ ASSERT_EQUAL(Qtrue, result.value());
280
+
281
+ result = m.instance_eval("Color.is_my_favorite_color(Color::BLACK)");
282
+ ASSERT_EQUAL(Qfalse, result.value());
283
+
284
+ result = m.instance_eval("Color::RED.is_my_favorite_color");
285
+ ASSERT_EQUAL(Qtrue, result.value());
286
+
287
+ result = m.instance_eval("Color::BLACK.is_my_favorite_color");
288
+ ASSERT_EQUAL(Qfalse, result.value());
193
289
  }
194
290
 
195
291
  namespace
196
292
  {
197
- Color getEnum()
293
+ Color defaultColor(Color aColor = BLACK)
198
294
  {
199
- return GREEN;
295
+ return aColor;
200
296
  }
201
297
  }
202
298
 
203
- TESTCASE(return_enum_value_to_ruby)
299
+ TESTCASE(default_argument)
204
300
  {
205
- Enum<Color> rb_cColor = define_color_enum();
206
- define_global_function("get_enum", &getEnum);
301
+ define_global_function("default_color", &defaultColor, Arg("aColor") = Color::BLACK);
207
302
 
208
- ASSERT_EQUAL(
209
- Data_Object<Color>(protect(rb_eval_string, "Color::GREEN")),
210
- Data_Object<Color>(protect(rb_eval_string, "get_enum"))
211
- );
303
+ Module m = define_module("Testing");
304
+ Object result = m.instance_eval("default_color");
305
+ ASSERT_EQUAL(Color::BLACK, detail::From_Ruby<Color>().convert(result.value()));
306
+ }
307
+
308
+ namespace
309
+ {
310
+ enum class Undefined { A, B, C };
311
+
312
+ void undefinedArg(Undefined undefined)
313
+ {
314
+ }
212
315
 
213
- ASSERT_EQUAL(String("GREEN"), String(protect(rb_eval_string, "get_enum.to_s")));
214
- ASSERT_EQUAL(String("#<Color::GREEN>"), String(protect(rb_eval_string, "get_enum.inspect")));
316
+ Undefined undefinedReturn()
317
+ {
318
+ return Undefined::B;
319
+ }
215
320
  }
321
+
322
+ TESTCASE(not_defined)
323
+ {
324
+ #ifdef _MSC_VER
325
+ const char* message = "Type is not defined with Rice: enum `anonymous namespace'::Undefined";
326
+ #else
327
+ const char* message = "Type is not defined with Rice: (anonymous namespace)::Undefined";
328
+ #endif
329
+
330
+ ASSERT_EXCEPTION_CHECK(
331
+ std::invalid_argument,
332
+ define_global_function("undefined_arg", &undefinedArg),
333
+ ASSERT_EQUAL(message, ex.what())
334
+ );
335
+
336
+ ASSERT_EXCEPTION_CHECK(
337
+ std::invalid_argument,
338
+ define_global_function("undefined_return", &undefinedReturn),
339
+ ASSERT_EQUAL(message, ex.what())
340
+ );
341
+ }