rice 3.0.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ }