rice 3.0.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +121 -0
  3. data/CONTRIBUTORS.md +19 -0
  4. data/Gemfile +3 -0
  5. data/README.md +44 -1025
  6. data/Rakefile +95 -12
  7. data/include/rice/rice.hpp +7766 -0
  8. data/lib/mkmf-rice.rb +127 -0
  9. data/lib/version.rb +3 -0
  10. data/rice/Address_Registration_Guard.ipp +75 -32
  11. data/rice/Address_Registration_Guard_defn.hpp +60 -56
  12. data/rice/Arg.hpp +80 -4
  13. data/rice/Arg.ipp +51 -0
  14. data/rice/Constructor.hpp +12 -14
  15. data/rice/Data_Object.ipp +234 -107
  16. data/rice/Data_Object_defn.hpp +77 -117
  17. data/rice/Data_Type.hpp +1 -2
  18. data/rice/Data_Type.ipp +251 -295
  19. data/rice/Data_Type_defn.hpp +175 -243
  20. data/rice/Director.hpp +11 -6
  21. data/rice/Enum.hpp +54 -104
  22. data/rice/Enum.ipp +104 -230
  23. data/rice/Exception.hpp +2 -8
  24. data/rice/Exception.ipp +65 -0
  25. data/rice/Exception_defn.hpp +46 -47
  26. data/rice/Identifier.hpp +28 -28
  27. data/rice/Identifier.ipp +23 -27
  28. data/rice/Return.hpp +39 -0
  29. data/rice/Return.ipp +33 -0
  30. data/rice/detail/Exception_Handler.ipp +22 -62
  31. data/rice/detail/Exception_Handler_defn.hpp +76 -91
  32. data/rice/detail/Iterator.hpp +18 -88
  33. data/rice/detail/Iterator.ipp +47 -0
  34. data/rice/detail/Jump_Tag.hpp +21 -0
  35. data/rice/detail/MethodInfo.hpp +44 -0
  36. data/rice/detail/MethodInfo.ipp +78 -0
  37. data/rice/detail/NativeAttribute.hpp +53 -0
  38. data/rice/detail/NativeAttribute.ipp +83 -0
  39. data/rice/detail/NativeFunction.hpp +69 -0
  40. data/rice/detail/NativeFunction.ipp +248 -0
  41. data/rice/detail/RubyFunction.hpp +39 -0
  42. data/rice/detail/RubyFunction.ipp +92 -0
  43. data/rice/detail/Type.hpp +29 -0
  44. data/rice/detail/Type.ipp +138 -0
  45. data/rice/detail/TypeRegistry.hpp +50 -0
  46. data/rice/detail/TypeRegistry.ipp +106 -0
  47. data/rice/detail/Wrapper.hpp +51 -0
  48. data/rice/detail/Wrapper.ipp +151 -0
  49. data/rice/detail/default_allocation_func.hpp +8 -19
  50. data/rice/detail/default_allocation_func.ipp +9 -8
  51. data/rice/detail/from_ruby.hpp +2 -37
  52. data/rice/detail/from_ruby.ipp +1020 -46
  53. data/rice/detail/from_ruby_defn.hpp +38 -0
  54. data/rice/detail/function_traits.hpp +124 -0
  55. data/rice/detail/method_data.hpp +23 -15
  56. data/rice/detail/method_data.ipp +53 -0
  57. data/rice/detail/rice_traits.hpp +116 -0
  58. data/rice/detail/ruby.hpp +9 -46
  59. data/rice/detail/to_ruby.hpp +3 -17
  60. data/rice/detail/to_ruby.ipp +409 -31
  61. data/rice/detail/to_ruby_defn.hpp +48 -0
  62. data/rice/forward_declares.ipp +82 -0
  63. data/rice/global_function.hpp +16 -20
  64. data/rice/global_function.ipp +8 -17
  65. data/rice/rice.hpp +59 -0
  66. data/rice/ruby_mark.hpp +5 -3
  67. data/rice/ruby_try_catch.hpp +4 -4
  68. data/rice/stl.hpp +11 -0
  69. data/sample/callbacks/extconf.rb +3 -0
  70. data/sample/callbacks/sample_callbacks.cpp +10 -13
  71. data/sample/enum/extconf.rb +3 -0
  72. data/sample/enum/sample_enum.cpp +3 -17
  73. data/sample/enum/test.rb +2 -2
  74. data/sample/inheritance/animals.cpp +8 -24
  75. data/sample/inheritance/extconf.rb +3 -0
  76. data/sample/inheritance/test.rb +1 -1
  77. data/sample/map/extconf.rb +3 -0
  78. data/sample/map/map.cpp +10 -18
  79. data/sample/map/test.rb +1 -1
  80. data/test/embed_ruby.cpp +18 -5
  81. data/test/ext/t1/extconf.rb +3 -0
  82. data/test/ext/t1/t1.cpp +1 -3
  83. data/test/ext/t2/extconf.rb +3 -0
  84. data/test/ext/t2/t2.cpp +1 -1
  85. data/test/extconf.rb +23 -0
  86. data/test/ruby/test_callbacks_sample.rb +28 -0
  87. data/test/ruby/test_multiple_extensions.rb +18 -0
  88. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  89. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  90. data/test/test_Address_Registration_Guard.cpp +23 -10
  91. data/test/test_Array.cpp +129 -73
  92. data/test/test_Attribute.cpp +147 -0
  93. data/test/test_Builtin_Object.cpp +34 -14
  94. data/test/test_Class.cpp +149 -275
  95. data/test/test_Constructor.cpp +10 -9
  96. data/test/test_Data_Object.cpp +133 -192
  97. data/test/test_Data_Type.cpp +322 -252
  98. data/test/test_Director.cpp +54 -41
  99. data/test/test_Enum.cpp +228 -103
  100. data/test/test_Exception.cpp +5 -6
  101. data/test/test_Hash.cpp +31 -30
  102. data/test/test_Identifier.cpp +4 -5
  103. data/test/test_Inheritance.cpp +221 -0
  104. data/test/test_Iterator.cpp +161 -0
  105. data/test/test_Jump_Tag.cpp +1 -1
  106. data/test/test_Keep_Alive.cpp +161 -0
  107. data/test/test_Memory_Management.cpp +2 -4
  108. data/test/test_Module.cpp +167 -110
  109. data/test/test_Object.cpp +41 -21
  110. data/test/test_Ownership.cpp +275 -0
  111. data/test/test_Self.cpp +205 -0
  112. data/test/test_Stl_Optional.cpp +90 -0
  113. data/test/test_Stl_Pair.cpp +144 -0
  114. data/test/test_Stl_SmartPointer.cpp +200 -0
  115. data/test/test_Stl_String.cpp +74 -0
  116. data/test/test_Stl_Vector.cpp +652 -0
  117. data/test/test_String.cpp +1 -2
  118. data/test/test_Struct.cpp +29 -39
  119. data/test/test_Symbol.cpp +1 -2
  120. data/test/test_To_From_Ruby.cpp +249 -285
  121. data/test/test_global_functions.cpp +39 -19
  122. data/test/unittest.hpp +0 -4
  123. metadata +63 -139
  124. data/Doxyfile +0 -2268
  125. data/Makefile.am +0 -26
  126. data/Makefile.in +0 -931
  127. data/README.mingw +0 -8
  128. data/aclocal.m4 +0 -1085
  129. data/ax_cxx_compile_stdcxx.m4 +0 -951
  130. data/bootstrap +0 -8
  131. data/config.guess +0 -1421
  132. data/config.sub +0 -1807
  133. data/configure +0 -7792
  134. data/configure.ac +0 -55
  135. data/depcomp +0 -791
  136. data/doxygen.ac +0 -314
  137. data/doxygen.am +0 -186
  138. data/extconf.rb +0 -70
  139. data/install-sh +0 -501
  140. data/missing +0 -215
  141. data/post-autoconf.rb +0 -22
  142. data/post-automake.rb +0 -28
  143. data/rice/Address_Registration_Guard.cpp +0 -22
  144. data/rice/Arg_impl.hpp +0 -129
  145. data/rice/Arg_operators.cpp +0 -21
  146. data/rice/Arg_operators.hpp +0 -19
  147. data/rice/Array.hpp +0 -214
  148. data/rice/Array.ipp +0 -256
  149. data/rice/Builtin_Object.hpp +0 -8
  150. data/rice/Builtin_Object.ipp +0 -50
  151. data/rice/Builtin_Object_defn.hpp +0 -50
  152. data/rice/Class.cpp +0 -57
  153. data/rice/Class.hpp +0 -8
  154. data/rice/Class.ipp +0 -6
  155. data/rice/Class_defn.hpp +0 -84
  156. data/rice/Data_Type.cpp +0 -54
  157. data/rice/Data_Type_fwd.hpp +0 -12
  158. data/rice/Director.cpp +0 -13
  159. data/rice/Exception.cpp +0 -54
  160. data/rice/Exception_Base.hpp +0 -8
  161. data/rice/Exception_Base.ipp +0 -13
  162. data/rice/Exception_Base_defn.hpp +0 -27
  163. data/rice/Hash.hpp +0 -230
  164. data/rice/Hash.ipp +0 -329
  165. data/rice/Identifier.cpp +0 -8
  166. data/rice/Jump_Tag.hpp +0 -24
  167. data/rice/Makefile.am +0 -121
  168. data/rice/Makefile.in +0 -884
  169. data/rice/Module.cpp +0 -84
  170. data/rice/Module.hpp +0 -8
  171. data/rice/Module.ipp +0 -6
  172. data/rice/Module_defn.hpp +0 -88
  173. data/rice/Module_impl.hpp +0 -281
  174. data/rice/Module_impl.ipp +0 -345
  175. data/rice/Object.cpp +0 -169
  176. data/rice/Object.hpp +0 -8
  177. data/rice/Object.ipp +0 -33
  178. data/rice/Object_defn.hpp +0 -214
  179. data/rice/Require_Guard.hpp +0 -21
  180. data/rice/String.cpp +0 -89
  181. data/rice/String.hpp +0 -91
  182. data/rice/Struct.cpp +0 -117
  183. data/rice/Struct.hpp +0 -162
  184. data/rice/Struct.ipp +0 -26
  185. data/rice/Symbol.cpp +0 -25
  186. data/rice/Symbol.hpp +0 -66
  187. data/rice/Symbol.ipp +0 -44
  188. data/rice/config.hpp +0 -47
  189. data/rice/config.hpp.in +0 -46
  190. data/rice/detail/Arguments.hpp +0 -118
  191. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  192. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3181
  193. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  194. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2501
  195. data/rice/detail/Caster.hpp +0 -103
  196. data/rice/detail/Not_Copyable.hpp +0 -25
  197. data/rice/detail/Wrapped_Function.hpp +0 -33
  198. data/rice/detail/cfp.hpp +0 -24
  199. data/rice/detail/cfp.ipp +0 -51
  200. data/rice/detail/check_ruby_type.cpp +0 -27
  201. data/rice/detail/check_ruby_type.hpp +0 -23
  202. data/rice/detail/creation_funcs.hpp +0 -37
  203. data/rice/detail/creation_funcs.ipp +0 -36
  204. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  205. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  206. data/rice/detail/demangle.cpp +0 -56
  207. data/rice/detail/demangle.hpp +0 -19
  208. data/rice/detail/env.hpp +0 -11
  209. data/rice/detail/method_data.cpp +0 -92
  210. data/rice/detail/node.hpp +0 -13
  211. data/rice/detail/protect.cpp +0 -29
  212. data/rice/detail/protect.hpp +0 -34
  213. data/rice/detail/ruby_version_code.hpp +0 -6
  214. data/rice/detail/ruby_version_code.hpp.in +0 -6
  215. data/rice/detail/st.hpp +0 -22
  216. data/rice/detail/win32.hpp +0 -16
  217. data/rice/detail/wrap_function.hpp +0 -66
  218. data/rice/protect.hpp +0 -38
  219. data/rice/protect.ipp +0 -1134
  220. data/rice/rubypp.rb +0 -97
  221. data/rice/to_from_ruby.hpp +0 -8
  222. data/rice/to_from_ruby.ipp +0 -418
  223. data/rice/to_from_ruby_defn.hpp +0 -70
  224. data/ruby.ac +0 -135
  225. data/ruby/Makefile.am +0 -1
  226. data/ruby/Makefile.in +0 -628
  227. data/ruby/lib/Makefile.am +0 -3
  228. data/ruby/lib/Makefile.in +0 -506
  229. data/ruby/lib/mkmf-rice.rb.in +0 -217
  230. data/ruby/lib/version.rb +0 -3
  231. data/sample/Makefile.am +0 -53
  232. data/sample/Makefile.in +0 -495
  233. data/test/Makefile.am +0 -73
  234. data/test/Makefile.in +0 -1219
  235. data/test/ext/Makefile.am +0 -41
  236. data/test/ext/Makefile.in +0 -483
  237. data/test/test_rice.rb +0 -45
@@ -1,14 +1,10 @@
1
1
  #include "unittest.hpp"
2
2
  #include "embed_ruby.hpp"
3
- #include "rice/Exception.hpp"
4
- #include "rice/Director.hpp"
5
- #include "rice/Constructor.hpp"
6
- #include "rice/Data_Type.hpp"
3
+ #include <rice/rice.hpp>
7
4
 
8
5
  #include <vector>
9
6
  #include <iostream>
10
7
 
11
- using namespace std;
12
8
  using namespace Rice;
13
9
 
14
10
  TESTSUITE(Director);
@@ -17,9 +13,10 @@ namespace {
17
13
  /**
18
14
  * Abstract base class
19
15
  */
20
- class Worker {
16
+ class Worker
17
+ {
21
18
  public:
22
- virtual ~Worker() { }
19
+ virtual ~Worker() = default;
23
20
 
24
21
  int getNumber() { return 12; }
25
22
 
@@ -41,18 +38,24 @@ namespace {
41
38
  /**
42
39
  * Class to handle workers
43
40
  */
44
- class Handler {
41
+ class Handler
42
+ {
45
43
  std::vector<Worker*> mWorkers;
46
44
 
47
45
  public:
48
46
 
49
- void addWorker(Worker* worker) { mWorkers.push_back(worker); }
47
+ void addWorker(Worker* worker)
48
+ {
49
+ mWorkers.push_back(worker);
50
+ }
50
51
 
51
- int processWorkers(int start) {
52
+ int processWorkers(int start)
53
+ {
52
54
  std::vector<Worker*>::iterator i = mWorkers.begin();
53
55
  int results = start;
54
56
 
55
- for(; i != mWorkers.end(); i++) {
57
+ for(; i != mWorkers.end(); i++)
58
+ {
56
59
  results = (*i)->process(results);
57
60
  }
58
61
 
@@ -63,24 +66,29 @@ namespace {
63
66
  /**
64
67
  * Our Director wrapper of Worker
65
68
  */
66
- class WorkerDirector : public Worker, public Rice::Director {
69
+ class WorkerDirector : public Worker, public Rice::Director
70
+ {
67
71
  public:
68
72
  WorkerDirector(Object self) : Director(self) { }
69
73
 
70
- virtual int process(int num) {
71
- 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) );
72
77
  }
73
78
 
74
- int default_process(int num) {
79
+ int default_process(int num)
80
+ {
75
81
  raisePureVirtual();
76
82
  return 0;
77
83
  }
78
84
 
79
- virtual int doSomething(int num) {
80
- 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) );
81
88
  }
82
89
 
83
- int default_doSomething(int num) {
90
+ int default_doSomething(int num)
91
+ {
84
92
  return Worker::doSomething(num);
85
93
  }
86
94
  };
@@ -101,7 +109,7 @@ TESTCASE(exposes_worker_as_instantiatable_class)
101
109
  Module m = define_module("Testing");
102
110
  Object result = m.instance_eval("worker = Worker.new; worker.get_number");
103
111
 
104
- ASSERT_EQUAL(12, from_ruby<int>(result.value()));
112
+ ASSERT_EQUAL(12, detail::From_Ruby<int>().convert(result.value()));
105
113
  }
106
114
 
107
115
  TESTCASE(can_call_virtual_methods_on_base_class)
@@ -116,7 +124,7 @@ TESTCASE(can_call_virtual_methods_on_base_class)
116
124
 
117
125
  Object result = m.instance_eval("worker = Worker.new; worker.do_something(4)");
118
126
 
119
- ASSERT_EQUAL(16, from_ruby<int>(result.value()));
127
+ ASSERT_EQUAL(16, detail::From_Ruby<int>().convert(result.value()));
120
128
  }
121
129
 
122
130
  TESTCASE(super_calls_pass_execution_up_the_inheritance_chain)
@@ -131,7 +139,7 @@ TESTCASE(super_calls_pass_execution_up_the_inheritance_chain)
131
139
 
132
140
  Object result = m.instance_eval("worker = RubyWorker.new; worker.do_something(10)");
133
141
 
134
- ASSERT_EQUAL(400, from_ruby<int>(result.value()));
142
+ ASSERT_EQUAL(400, detail::From_Ruby<int>().convert(result.value()));
135
143
  }
136
144
 
137
145
  TESTCASE(super_calls_on_pure_virtual_raise_error)
@@ -158,7 +166,7 @@ TESTCASE(polymorphic_calls_head_down_the_call_chain)
158
166
  {
159
167
  define_class<Handler>("Handler")
160
168
  .define_constructor(Constructor<Handler>())
161
- .define_method("add_worker", &Handler::addWorker)
169
+ .define_method("add_worker", &Handler::addWorker, Arg("worker").keepAlive())
162
170
  .define_method("process_workers", &Handler::processWorkers);
163
171
 
164
172
  define_class<Worker>("Worker")
@@ -179,7 +187,7 @@ TESTCASE(polymorphic_calls_head_down_the_call_chain)
179
187
  Object result = m.instance_eval("$handler.process_workers(5)");
180
188
 
181
189
  // Hit's EchoWorker, so 5 + 2, then passes that to DoubleWorker, so 7 * 2 = 14
182
- ASSERT_EQUAL(14, from_ruby<int>(result.value()));
190
+ ASSERT_EQUAL(14, detail::From_Ruby<int>().convert(result.value()));
183
191
  }
184
192
 
185
193
  namespace {
@@ -195,23 +203,26 @@ namespace {
195
203
  virtual int doItImpl(int in) = 0;
196
204
  };
197
205
 
198
- class CallsSelfDirector : public CallsSelf, public Director {
199
-
206
+ class CallsSelfDirector : public CallsSelf, public Director
207
+ {
200
208
  public:
201
209
  CallsSelfDirector(Object self) : Director(self) { }
202
210
  virtual ~CallsSelfDirector() { }
203
211
 
204
- virtual int doItImpl(int in) {
205
- 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) );
206
215
  }
207
216
 
208
- int default_doItImpl(int in) {
217
+ int default_doItImpl(int in)
218
+ {
209
219
  raisePureVirtual();
210
220
  return 0;
211
221
  }
212
222
  };
213
223
 
214
- struct MyCallsSelf : CallsSelf {
224
+ struct MyCallsSelf : CallsSelf
225
+ {
215
226
  MyCallsSelf() { }
216
227
  virtual ~MyCallsSelf() { }
217
228
 
@@ -219,19 +230,21 @@ namespace {
219
230
  };
220
231
 
221
232
  // Abstract type return types handled properly
222
- CallsSelf* getCallsSelf() {
233
+ CallsSelf* getCallsSelf()
234
+ {
223
235
  return new MyCallsSelf();
224
236
  }
225
237
 
226
238
  // Abstract type Argument types handled properly
227
- int doItOnPointer(CallsSelf* obj, int in) {
239
+ int doItOnPointer(CallsSelf* obj, int in)
240
+ {
228
241
  return obj->doIt(in);
229
242
  }
230
243
 
231
- int doItOnReference(CallsSelf& obj, int in) {
244
+ int doItOnReference(CallsSelf& obj, int in)
245
+ {
232
246
  return obj.doIt(in);
233
247
  }
234
-
235
248
  }
236
249
 
237
250
  TESTCASE(mix_of_polymorphic_calls_and_inheritance_dont_cause_infinite_loops)
@@ -249,7 +262,7 @@ TESTCASE(mix_of_polymorphic_calls_and_inheritance_dont_cause_infinite_loops)
249
262
  "c = MySelf.new; c.do_it(10)"
250
263
  );
251
264
 
252
- ASSERT_EQUAL(100, from_ruby<int>(result.value()));
265
+ ASSERT_EQUAL(100, detail::From_Ruby<int>().convert(result.value()));
253
266
  }
254
267
 
255
268
  TESTCASE(director_class_super_classes_get_type_bound)
@@ -263,8 +276,9 @@ TESTCASE(director_class_super_classes_get_type_bound)
263
276
  .define_method("do_it_impl", &CallsSelfDirector::default_doItImpl)
264
277
  .define_method("do_it", &CallsSelf::doIt);
265
278
 
266
- Object result = m.instance_eval("cs = Testing::get_calls_self; cs.do_it(3);");
267
- 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()));
268
282
  }
269
283
 
270
284
  TESTCASE(director_allows_abstract_types_used_as_parameters_pointers)
@@ -284,9 +298,9 @@ TESTCASE(director_allows_abstract_types_used_as_parameters_pointers)
284
298
  "Testing::do_it_on_pointer(c, 5)"
285
299
  );
286
300
 
287
- ASSERT_EQUAL(50, from_ruby<int>(result.value()));
301
+ ASSERT_EQUAL(50, detail::From_Ruby<int>().convert(result.value()));
288
302
  }
289
- /*
303
+
290
304
  TESTCASE(director_allows_abstract_types_used_as_parameters_reference)
291
305
  {
292
306
  Module m = define_module("Testing");
@@ -304,6 +318,5 @@ TESTCASE(director_allows_abstract_types_used_as_parameters_reference)
304
318
  "Testing::do_it_on_ref(c, 3)"
305
319
  );
306
320
 
307
- ASSERT_EQUAL(30, from_ruby<int>(result.value()));
308
- }
309
- */
321
+ ASSERT_EQUAL(30, detail::From_Ruby<int>().convert(result.value()));
322
+ }
data/test/test_Enum.cpp CHANGED
@@ -1,11 +1,9 @@
1
+ #include <iostream>
2
+
1
3
  #include "unittest.hpp"
2
4
  #include "embed_ruby.hpp"
3
- #include "rice/Enum.hpp"
4
- #include "rice/Array.hpp"
5
- #include "rice/String.hpp"
6
- #include "rice/Constructor.hpp"
7
- #include "rice/global_function.hpp"
8
- #include <iostream>
5
+
6
+ #include <rice/rice.hpp>
9
7
 
10
8
  using namespace Rice;
11
9
 
@@ -23,6 +21,26 @@ namespace
23
21
  .define_value("GREEN", GREEN);
24
22
  return colors;
25
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
+ }
26
44
  }
27
45
 
28
46
  SETUP(Enum)
@@ -32,135 +50,173 @@ SETUP(Enum)
32
50
 
33
51
  TESTCASE(copy_construct)
34
52
  {
35
- Enum<Color> rb_cColor(define_color_enum());
36
- 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());
37
55
  }
38
56
 
39
57
  TESTCASE(assignment)
40
58
  {
41
- Enum<Color> rb_cColor;
42
- rb_cColor = define_color_enum();
43
- 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());
44
62
  }
45
63
 
46
64
  TESTCASE(each)
47
65
  {
48
- Enum<Color> rb_cColor = define_color_enum();
49
- 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);
50
74
  ASSERT_EQUAL(3u, a.size());
51
- ASSERT_EQUAL(RED, from_ruby<Color>(a[0]));
52
- ASSERT_EQUAL(BLACK, from_ruby<Color>(a[1]));
53
- 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);
54
109
  }
55
110
 
56
111
  TESTCASE(to_s)
57
112
  {
58
- Enum<Color> rb_cColor = define_color_enum();
59
- ASSERT_EQUAL(String("RED"), String(protect(rb_eval_string, "Color::RED.to_s")));
60
- ASSERT_EQUAL(String("BLACK"), String(protect(rb_eval_string, "Color::BLACK.to_s")));
61
- 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")));
62
119
  }
63
120
 
64
121
  TESTCASE(to_i)
65
122
  {
66
- Enum<Color> rb_cColor = define_color_enum();
67
- ASSERT_EQUAL(to_ruby(int(RED)), Object(protect(rb_eval_string, "Color::RED.to_i")));
68
- ASSERT_EQUAL(to_ruby(int(BLACK)), Object(protect(rb_eval_string, "Color::BLACK.to_i")));
69
- 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());
70
129
  }
71
130
 
72
131
  TESTCASE(inspect)
73
132
  {
74
- Enum<Color> rb_cColor = define_color_enum();
75
- ASSERT_EQUAL(String("#<Color::RED>"), String(protect(rb_eval_string, "Color::RED.inspect")));
76
- ASSERT_EQUAL(String("#<Color::BLACK>"), String(protect(rb_eval_string, "Color::BLACK.inspect")));
77
- 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")));
78
139
  }
79
140
 
80
141
  TESTCASE(compare)
81
142
  {
82
- Enum<Color> rb_cColor = define_color_enum();
83
- ASSERT_EQUAL(to_ruby(-1), Object(protect(rb_eval_string, "Color::RED <=> Color::BLACK")));
84
- ASSERT_EQUAL(to_ruby(1), Object(protect(rb_eval_string, "Color::GREEN <=> Color::RED")));
85
- 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());
86
149
  }
87
150
 
88
151
  TESTCASE(eql)
89
152
  {
90
- Enum<Color> rb_cColor = define_color_enum();
91
- ASSERT_EQUAL(to_ruby(false), Object(protect(rb_eval_string, "Color::RED == Color::BLACK")));
92
- ASSERT_EQUAL(to_ruby(true), Object(protect(rb_eval_string, "Color::GREEN == Color::GREEN")));
93
- }
153
+ Module m = define_module("Testing");
94
154
 
95
- TESTCASE(invalid_to_s)
96
- {
97
- Enum<Color> rb_cColor = define_color_enum();
98
- Data_Object<Color> invalid(new Color(static_cast<Color>(42)));
99
- 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());
100
158
  }
101
159
 
102
- TESTCASE(invalid_to_i)
160
+ TESTCASE(compare_equal)
103
161
  {
104
- Enum<Color> rb_cColor = define_color_enum();
105
- Data_Object<Color> invalid(new Color(static_cast<Color>(42)));
106
- 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));
107
167
  }
108
168
 
109
- TESTCASE(invalid_inspect)
169
+ TESTCASE(compare_less)
110
170
  {
111
- Enum<Color> rb_cColor = define_color_enum();
112
- Data_Object<Color> invalid(new Color(static_cast<Color>(42)));
113
- 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));
114
176
  }
115
177
 
116
- TESTCASE(invalid_compare)
178
+ TESTCASE(compare_more)
117
179
  {
118
- Enum<Color> rb_cColor = define_color_enum();
119
- Data_Object<Color> invalid(new Color(static_cast<Color>(42)));
120
- Data_Object<Color> red(new Color(RED));
121
- ASSERT_EQUAL(1, invalid.compare(red));
122
- ASSERT_EQUAL(-1, red.compare(invalid));
123
- 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));
124
185
  }
125
186
 
126
- TESTCASE(invalid_eql)
187
+ TESTCASE(different_objects_eql)
127
188
  {
128
- Enum<Color> rb_cColor = define_color_enum();
129
- Data_Object<Color> invalid(new Color(static_cast<Color>(42)));
130
- Data_Object<Color> red(new Color(RED));
131
- ASSERT_EQUAL(false, invalid == red);
132
- ASSERT_EQUAL(false, red == invalid);
133
- 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());
134
194
  }
135
195
 
136
- TESTCASE(different_objects_compare)
196
+ TESTCASE(hash)
137
197
  {
138
- Enum<Color> rb_cColor = define_color_enum();
139
- Data_Object<Color> red1(new Color(RED));
140
- Data_Object<Color> red2(new Color(RED));
141
- 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));
142
202
  }
143
203
 
144
- TESTCASE(different_objects_eql)
204
+ TESTCASE(from_int)
145
205
  {
146
- Enum<Color> rb_cColor = define_color_enum();
147
- Data_Object<Color> red1(new Color(RED));
148
- Data_Object<Color> red2(new Color(RED));
149
- 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"));
150
209
  }
151
210
 
152
- TESTCASE(hash)
211
+ TESTCASE(from_int_invalid)
153
212
  {
154
- Enum<Color> rb_cColor = define_color_enum();
155
- Data_Object<Color> red(new Color(RED));
156
- ASSERT_EQUAL(to_ruby(int(RED)), red.call("hash"));
157
- }
213
+ Enum<Color> colorEnum = define_color_enum();
158
214
 
159
- TESTCASE(from_int)
160
- {
161
- Enum<Color> rb_cColor = define_color_enum();
162
- Data_Object<Color> color(rb_cColor.call("from_int", int(RED)));
163
- 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
+ );
164
220
  }
165
221
 
166
222
  namespace
@@ -179,38 +235,107 @@ namespace
179
235
 
180
236
  TESTCASE(nested_enums)
181
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()
182
255
  {
183
- Data_Type<Inner> inner = define_class<Inner>("Inner");
184
- define_enum<Inner::Props>("Props", inner)
185
- .define_value("VALUE1", Inner::VALUE1)
186
- .define_value("VALUE2", Inner::VALUE2)
187
- .define_value("VALUE3", Inner::VALUE3);
188
- inner.define_constructor(Constructor<Inner>());
256
+ return RED;
189
257
  }
190
258
 
191
- ASSERT_EQUAL(to_ruby(int(0)), Object(protect(rb_eval_string, "Inner::Props::VALUE1.to_i")));
192
- ASSERT_EQUAL(to_ruby(int(1)), Object(protect(rb_eval_string, "Inner::Props::VALUE2.to_i")));
193
- 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());
194
289
  }
195
290
 
196
291
  namespace
197
292
  {
198
- Color getEnum()
293
+ Color defaultColor(Color aColor = BLACK)
199
294
  {
200
- return GREEN;
295
+ return aColor;
201
296
  }
202
297
  }
203
298
 
204
- TESTCASE(return_enum_value_to_ruby)
299
+ TESTCASE(default_argument)
205
300
  {
206
- Enum<Color> rb_cColor = define_color_enum();
207
- define_global_function("get_enum", &getEnum);
301
+ define_global_function("default_color", &defaultColor, Arg("aColor") = Color::BLACK);
208
302
 
209
- ASSERT_EQUAL(
210
- Data_Object<Color>(protect(rb_eval_string, "Color::GREEN")),
211
- Data_Object<Color>(protect(rb_eval_string, "get_enum"))
212
- );
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
+ }
213
315
 
214
- ASSERT_EQUAL(String("GREEN"), String(protect(rb_eval_string, "get_enum.to_s")));
215
- ASSERT_EQUAL(String("#<Color::GREEN>"), String(protect(rb_eval_string, "get_enum.inspect")));
316
+ Undefined undefinedReturn()
317
+ {
318
+ return Undefined::B;
319
+ }
216
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
+ }