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,7 +1,6 @@
1
1
  #include "unittest.hpp"
2
2
  #include "embed_ruby.hpp"
3
- #include "rice/Exception.hpp"
4
- #include "rice/String.hpp"
3
+ #include <rice/rice.hpp>
5
4
 
6
5
  using namespace Rice;
7
6
 
@@ -14,14 +13,14 @@ SETUP(Exception)
14
13
 
15
14
  TESTCASE(construct_from_exception_object)
16
15
  {
17
- VALUE v = protect(rb_exc_new2, rb_eRuntimeError, "foo");
16
+ VALUE v = detail::protect(rb_exc_new2, rb_eRuntimeError, "foo");
18
17
  Exception ex(v);
19
18
  ASSERT_EQUAL(ex.value(), v);
20
19
  }
21
20
 
22
21
  TESTCASE(copy_construct)
23
22
  {
24
- VALUE v = protect(rb_exc_new2, rb_eRuntimeError, "foo");
23
+ VALUE v = detail::protect(rb_exc_new2, rb_eRuntimeError, "foo");
25
24
  Exception ex1(v);
26
25
  Exception ex2(v);
27
26
  ASSERT_EQUAL(ex2.value(), v);
@@ -30,13 +29,13 @@ TESTCASE(copy_construct)
30
29
  TESTCASE(construct_from_format_string)
31
30
  {
32
31
  Exception ex(rb_eRuntimeError, "%s", "foo");
33
- ASSERT_EQUAL(ex.class_of(), Object(rb_eRuntimeError));
32
+ ASSERT_EQUAL(rb_eRuntimeError, ex.class_of());
34
33
  }
35
34
 
36
35
  TESTCASE(message)
37
36
  {
38
37
  Exception ex(rb_eRuntimeError, "%s", "foo");
39
- ASSERT_EQUAL(String("foo"), ex.message());
38
+ ASSERT_EQUAL("foo", ex.what());
40
39
  }
41
40
 
42
41
  TESTCASE(what)
data/test/test_Hash.cpp CHANGED
@@ -1,7 +1,7 @@
1
1
  #include "unittest.hpp"
2
2
  #include "embed_ruby.hpp"
3
- #include "rice/Hash.hpp"
4
- #include "rice/global_function.hpp"
3
+ #include <rice/rice.hpp>
4
+
5
5
  #include <vector>
6
6
  #include <map>
7
7
  #include <algorithm>
@@ -19,7 +19,7 @@ TESTCASE(default_construct)
19
19
  {
20
20
  Hash h;
21
21
  ASSERT_EQUAL(T_HASH, rb_type(h));
22
- ASSERT_EQUAL(0, RHASH_SIZE(h.value()));
22
+ ASSERT_EQUAL(0u, RHASH_SIZE(h.value()));
23
23
  }
24
24
 
25
25
  TESTCASE(construct_from_object)
@@ -27,7 +27,7 @@ TESTCASE(construct_from_object)
27
27
  Object o(rb_hash_new());
28
28
  Hash h(o);
29
29
  ASSERT_EQUAL(T_HASH, rb_type(h));
30
- ASSERT_EQUAL(0, RHASH_SIZE(h.value()));
30
+ ASSERT_EQUAL(0u, RHASH_SIZE(h.value()));
31
31
  }
32
32
 
33
33
  TESTCASE(construct_from_value)
@@ -35,7 +35,7 @@ TESTCASE(construct_from_value)
35
35
  VALUE v(rb_hash_new());
36
36
  Hash h(v);
37
37
  ASSERT_EQUAL(T_HASH, rb_type(h));
38
- ASSERT_EQUAL(0, RHASH_SIZE(h.value()));
38
+ ASSERT_EQUAL(0u, RHASH_SIZE(h.value()));
39
39
  }
40
40
 
41
41
  TESTCASE(copy_construct)
@@ -50,6 +50,7 @@ TESTCASE(assignment)
50
50
  Hash h;
51
51
  Hash h2;
52
52
  h = h2;
53
+ ASSERT_EQUAL(h.value(), h2.value());
53
54
  }
54
55
 
55
56
  TESTCASE(size)
@@ -73,9 +74,9 @@ TESTCASE(bracket)
73
74
  h[6] = 9;
74
75
  h[42] = 42;
75
76
  h[6] = 1;
76
- ASSERT_EQUAL(to_ruby(5), Object(h[1]));
77
- ASSERT_EQUAL(to_ruby(42), Object(h[42]));
78
- ASSERT_EQUAL(to_ruby(1), Object(h[6]));
77
+ ASSERT_EQUAL(detail::to_ruby(5), h[1].value());
78
+ ASSERT_EQUAL(detail::to_ruby(42), h[42].value());
79
+ ASSERT_EQUAL(detail::to_ruby(1), h[6].value());
79
80
  }
80
81
 
81
82
  TESTCASE(get)
@@ -101,15 +102,15 @@ TESTCASE(construct_vector_from_hash_iterators)
101
102
  std::vector<Hash::Entry> v(h.begin(), h.end());
102
103
  std::sort(v.begin(), v.end());
103
104
  ASSERT_EQUAL(3u, v.size());
104
- ASSERT_EQUAL(v[0].key, to_ruby(1));
105
- ASSERT_EQUAL(v[1].key, to_ruby(6));
106
- ASSERT_EQUAL(v[2].key, to_ruby(42));
105
+ ASSERT_EQUAL(v[0].key.value(), detail::to_ruby(1));
106
+ ASSERT_EQUAL(v[1].key.value(), detail::to_ruby(6));
107
+ ASSERT_EQUAL(v[2].key.value(), detail::to_ruby(42));
107
108
  ASSERT_EQUAL(&v[0].key, &v[0].first);
108
109
  ASSERT_EQUAL(&v[1].key, &v[1].first);
109
110
  ASSERT_EQUAL(&v[2].key, &v[2].first);
110
- ASSERT_EQUAL(v[0].value, to_ruby(5));
111
- ASSERT_EQUAL(v[1].value, to_ruby(1));
112
- ASSERT_EQUAL(v[2].value, to_ruby(42));
111
+ ASSERT_EQUAL(v[0].value, detail::to_ruby(5));
112
+ ASSERT_EQUAL(v[1].value, detail::to_ruby(1));
113
+ ASSERT_EQUAL(v[2].value, detail::to_ruby(42));
113
114
  ASSERT_EQUAL(&v[0].value, &v[0].second);
114
115
  ASSERT_EQUAL(&v[1].value, &v[1].second);
115
116
  ASSERT_EQUAL(&v[2].value, &v[2].second);
@@ -134,15 +135,15 @@ TESTCASE(iterate)
134
135
 
135
136
  std::sort(v.begin(), v.end());
136
137
  ASSERT_EQUAL(3u, v.size());
137
- ASSERT_EQUAL(v[0].key, to_ruby(1));
138
- ASSERT_EQUAL(v[1].key, to_ruby(6));
139
- ASSERT_EQUAL(v[2].key, to_ruby(42));
138
+ ASSERT_EQUAL(v[0].key.value(), detail::to_ruby(1));
139
+ ASSERT_EQUAL(v[1].key.value(), detail::to_ruby(6));
140
+ ASSERT_EQUAL(v[2].key.value(), detail::to_ruby(42));
140
141
  ASSERT_EQUAL(&v[0].key, &v[0].first);
141
142
  ASSERT_EQUAL(&v[1].key, &v[1].first);
142
143
  ASSERT_EQUAL(&v[2].key, &v[2].first);
143
- ASSERT_EQUAL(v[0].value, to_ruby(5));
144
- ASSERT_EQUAL(v[1].value, to_ruby(1));
145
- ASSERT_EQUAL(v[2].value, to_ruby(42));
144
+ ASSERT_EQUAL(v[0].value, detail::to_ruby(5));
145
+ ASSERT_EQUAL(v[1].value, detail::to_ruby(1));
146
+ ASSERT_EQUAL(v[2].value, detail::to_ruby(42));
146
147
  ASSERT_EQUAL(&v[0].value, &v[0].second);
147
148
  ASSERT_EQUAL(&v[1].value, &v[1].second);
148
149
  ASSERT_EQUAL(&v[2].value, &v[2].second);
@@ -164,15 +165,15 @@ TESTCASE(const_iterate)
164
165
  }
165
166
  std::sort(v.begin(), v.end());
166
167
  ASSERT_EQUAL(3u, v.size());
167
- ASSERT_EQUAL(v[0].key, to_ruby(1));
168
- ASSERT_EQUAL(v[1].key, to_ruby(6));
169
- ASSERT_EQUAL(v[2].key, to_ruby(42));
168
+ ASSERT_EQUAL(v[0].key.value(), detail::to_ruby(1));
169
+ ASSERT_EQUAL(v[1].key.value(), detail::to_ruby(6));
170
+ ASSERT_EQUAL(v[2].key.value(), detail::to_ruby(42));
170
171
  ASSERT_EQUAL(&v[0].key, &v[0].first);
171
172
  ASSERT_EQUAL(&v[1].key, &v[1].first);
172
173
  ASSERT_EQUAL(&v[2].key, &v[2].first);
173
- ASSERT_EQUAL(v[0].value, to_ruby(5));
174
- ASSERT_EQUAL(v[1].value, to_ruby(1));
175
- ASSERT_EQUAL(v[2].value, to_ruby(42));
174
+ ASSERT_EQUAL(v[0].value.value(), detail::to_ruby(5));
175
+ ASSERT_EQUAL(v[1].value.value(), detail::to_ruby(1));
176
+ ASSERT_EQUAL(v[2].value.value(), detail::to_ruby(42));
176
177
  ASSERT_EQUAL(&v[0].value, &v[0].value);
177
178
  ASSERT_EQUAL(&v[1].value, &v[1].value);
178
179
  ASSERT_EQUAL(&v[2].value, &v[2].value);
@@ -191,12 +192,12 @@ TESTCASE(iterate_and_change)
191
192
  for(int j = 0; it != end; ++j, ++it)
192
193
  {
193
194
  it->second = j;
194
- m[from_ruby<int>(it->first)] = j;
195
+ m[detail::From_Ruby<int>().convert(it->first)] = j;
195
196
  }
196
197
  ASSERT_EQUAL(3u, m.size());
197
- ASSERT_EQUAL(to_ruby(m[1]), h[1]);
198
- ASSERT_EQUAL(to_ruby(m[6]), h[6]);
199
- ASSERT_EQUAL(to_ruby(m[42]), h[42]);
198
+ ASSERT_EQUAL(detail::to_ruby(m[1]), h[1]);
199
+ ASSERT_EQUAL(detail::to_ruby(m[6]), h[6]);
200
+ ASSERT_EQUAL(detail::to_ruby(m[42]), h[42]);
200
201
  }
201
202
 
202
203
  /**
@@ -1,7 +1,6 @@
1
1
  #include "unittest.hpp"
2
2
  #include "embed_ruby.hpp"
3
- #include "rice/Identifier.hpp"
4
- #include "rice/Symbol.hpp"
3
+ #include <rice/rice.hpp>
5
4
 
6
5
  using namespace Rice;
7
6
 
@@ -32,10 +31,10 @@ TESTCASE(construct_from_c_string)
32
31
  ASSERT_EQUAL(rb_intern("Foo"), identifier.id());
33
32
  }
34
33
 
35
- TESTCASE(default_construct)
34
+ TESTCASE(construct_from_string)
36
35
  {
37
- Identifier identifier;
38
- ASSERT_EQUAL(rb_intern(""), identifier.id());
36
+ Identifier identifier(std::string("Foo"));
37
+ ASSERT_EQUAL(rb_intern("Foo"), identifier.id());
39
38
  }
40
39
 
41
40
  TESTCASE(copy_construct)
@@ -0,0 +1,221 @@
1
+ #include <assert.h>
2
+
3
+ #include "unittest.hpp"
4
+ #include "embed_ruby.hpp"
5
+
6
+ #include <rice/rice.hpp>
7
+ #include <rice/stl.hpp>
8
+
9
+ using namespace Rice;
10
+
11
+ TESTSUITE(Inheritance);
12
+
13
+ namespace
14
+ {
15
+ enum class NotificationType
16
+ {
17
+ Email,
18
+ Push
19
+ };
20
+
21
+ class Notification
22
+ {
23
+ public:
24
+ virtual ~Notification() = default;
25
+ virtual std::string message() = 0;
26
+ };
27
+
28
+ class EmailNotification : public Notification
29
+ {
30
+ std::string message() override
31
+ {
32
+ return "Email";
33
+ }
34
+ };
35
+
36
+ class PushNotification : public Notification
37
+ {
38
+ std::string message() override
39
+ {
40
+ return "Push";
41
+ }
42
+ };
43
+
44
+ Notification* makeNotification(NotificationType type)
45
+ {
46
+ switch (type)
47
+ {
48
+ case NotificationType::Email:
49
+ return new EmailNotification();
50
+ break;
51
+
52
+ case NotificationType::Push:
53
+ return new PushNotification();
54
+
55
+ default:
56
+ return nullptr; // Will never happen but makes compiler happy
57
+ }
58
+ }
59
+
60
+ std::string processNotification(Notification* notification)
61
+ {
62
+ return notification->message();
63
+ }
64
+ }
65
+
66
+ Enum<NotificationType> createNotificationEnum()
67
+ {
68
+ return define_enum<NotificationType>("NotificationType")
69
+ .define_value("Email", NotificationType::Email)
70
+ .define_value("Push", NotificationType::Push);
71
+ }
72
+
73
+ SETUP(Inheritance)
74
+ {
75
+ embed_ruby();
76
+ static Enum<NotificationType> NotificationEnum = createNotificationEnum();
77
+
78
+ Data_Type<Notification>::unbind();
79
+ Data_Type<EmailNotification>::unbind();
80
+ Data_Type<PushNotification>::unbind();
81
+ }
82
+
83
+ TESTCASE(return_base_pointer)
84
+ {
85
+ Class rcNotification = define_class<Notification>("Notification");
86
+
87
+ Class rcEmailNotification = define_class<EmailNotification, Notification>("EmailNotification")
88
+ .define_constructor(Constructor<PushNotification>());
89
+
90
+ Class rcPushNotification = define_class<PushNotification, Notification>("PushNotification")
91
+ .define_constructor(Constructor<PushNotification>());
92
+
93
+ define_global_function("make_notification", &makeNotification);
94
+
95
+ Module m = define_module("Testing");
96
+
97
+ Object notification = m.instance_eval("make_notification(NotificationType::Email)");
98
+ String temp = notification.class_of().name();
99
+ std::string temp2 = detail::From_Ruby<std::string>().convert(temp);
100
+
101
+ ASSERT(rb_obj_is_kind_of(notification, rcNotification));
102
+ ASSERT(rb_obj_is_kind_of(notification, rcEmailNotification));
103
+ ASSERT(!rb_obj_is_kind_of(notification, rcPushNotification));
104
+ ASSERT(rb_obj_is_instance_of(notification, rcEmailNotification));
105
+
106
+ notification = m.instance_eval("make_notification(NotificationType::Push)");
107
+ ASSERT(rb_obj_is_kind_of(notification, rcNotification));
108
+ ASSERT(!rb_obj_is_kind_of(notification, rcEmailNotification));
109
+ ASSERT(rb_obj_is_kind_of(notification, rcPushNotification));
110
+ ASSERT(rb_obj_is_instance_of(notification, rcPushNotification));
111
+ }
112
+
113
+ TESTCASE(base_pointer_method_call)
114
+ {
115
+ Class rcNotification = define_class<Notification>("Notification")
116
+ .define_method("message", &Notification::message);
117
+
118
+ Class rcEmailNotification = define_class<EmailNotification, Notification>("EmailNotification")
119
+ .define_constructor(Constructor<EmailNotification>());
120
+
121
+ Class rcPushNotification = define_class<PushNotification, Notification>("PushNotification")
122
+ .define_constructor(Constructor<PushNotification>());
123
+
124
+ Module m = define_module("Testing");
125
+
126
+ Object message = m.instance_eval(R"EOS(notification = EmailNotification.new
127
+ notification.message)EOS");
128
+ ASSERT_EQUAL("Email", detail::From_Ruby<std::string>().convert(message));
129
+
130
+ message = m.instance_eval(R"EOS(notification = PushNotification.new
131
+ notification.message)EOS");
132
+ ASSERT_EQUAL("Push", detail::From_Ruby<std::string>().convert(message));
133
+ }
134
+
135
+ TESTCASE(base_pointer_function_argument)
136
+ {
137
+ Class rcNotification = define_class<Notification>("Notification")
138
+ .define_method("message", &Notification::message);
139
+
140
+ Class rcEmailNotification = define_class<EmailNotification, Notification>("EmailNotification")
141
+ .define_constructor(Constructor<EmailNotification>());
142
+
143
+ Class rcPushNotification = define_class<PushNotification, Notification>("PushNotification")
144
+ .define_constructor(Constructor<PushNotification>());
145
+
146
+ define_global_function("process_notification", &processNotification);
147
+
148
+ Module m = define_module("Testing");
149
+ Object message = m.instance_eval(R"EOS(notification = EmailNotification.new
150
+ process_notification(notification))EOS");
151
+ ASSERT_EQUAL("Email", detail::From_Ruby<std::string>().convert(message));
152
+
153
+ message = m.instance_eval(R"EOS(notification = PushNotification.new
154
+ process_notification(notification))EOS");
155
+ ASSERT_EQUAL("Push", detail::From_Ruby<std::string>().convert(message));
156
+ }
157
+
158
+ TESTCASE(module_base_pointer_method_call)
159
+ {
160
+ Module mInheritance = define_module("Inheritance");
161
+
162
+ Class rcNotification = define_class_under<Notification>(mInheritance, "Notification")
163
+ .define_method("message", &Notification::message);
164
+
165
+ Class rcEmailNotification = define_class_under<EmailNotification, Notification>(mInheritance, "EmailNotification")
166
+ .define_constructor(Constructor<EmailNotification>());
167
+
168
+ Class rcPushNotification = define_class_under<PushNotification, Notification>(mInheritance, "PushNotification")
169
+ .define_constructor(Constructor<PushNotification>());
170
+
171
+ Module m = define_module("Testing");
172
+
173
+ Object message = m.instance_eval(R"EOS(notification = Inheritance::EmailNotification.new
174
+ notification.message)EOS");
175
+ ASSERT_EQUAL("Email", detail::From_Ruby<std::string>().convert(message));
176
+
177
+ message = m.instance_eval(R"EOS(notification = Inheritance::PushNotification.new
178
+ notification.message)EOS");
179
+ ASSERT_EQUAL("Push", detail::From_Ruby<std::string>().convert(message));
180
+ }
181
+
182
+ namespace
183
+ {
184
+ class Processor
185
+ {
186
+ public:
187
+ Processor(Notification* notification) : notification_(notification)
188
+ {
189
+ }
190
+
191
+ std::string process()
192
+ {
193
+ return notification_->message();
194
+ }
195
+
196
+ private:
197
+ Notification* notification_;
198
+ };
199
+ }
200
+
201
+ TESTCASE(base_pointer_constructor)
202
+ {
203
+ Class rcNotification = define_class<Notification>("Notification");
204
+
205
+ Class rcEmailNotification = define_class<EmailNotification, Notification>("EmailNotification")
206
+ .define_constructor(Constructor<PushNotification>());
207
+
208
+ Class rcPushNotification = define_class<PushNotification, Notification>("PushNotification")
209
+ .define_constructor(Constructor<PushNotification>());
210
+
211
+ Class rcProcessor = define_class<Processor, Notification>("Processor")
212
+ .define_constructor(Constructor<Processor, Notification*>())
213
+ .define_method("process", &Processor::process);
214
+
215
+ Module m = define_module("Testing");
216
+
217
+ Object result = m.instance_eval(R"EOS(notification = PushNotification.new
218
+ processor = Processor.new(notification)
219
+ processor.process)EOS");
220
+ ASSERT_EQUAL("Push", detail::From_Ruby<std::string>().convert(result));
221
+ }
@@ -0,0 +1,161 @@
1
+ #include "unittest.hpp"
2
+ #include "embed_ruby.hpp"
3
+ #include <rice/rice.hpp>
4
+
5
+ using namespace Rice;
6
+
7
+ TESTSUITE(Iterator);
8
+
9
+ SETUP(Iterator)
10
+ {
11
+ embed_ruby();
12
+ }
13
+
14
+ namespace
15
+ {
16
+ class Container
17
+ {
18
+ public:
19
+ Container(int* array, size_t length)
20
+ : array_(array)
21
+ , length_(length)
22
+ {
23
+ }
24
+
25
+ // Custom names to make sure we call the function pointers rather than
26
+ // expectable default names.
27
+ int* beginFoo() { return array_; }
28
+ int* endBar() { return array_ + length_; }
29
+
30
+ private:
31
+ int* array_;
32
+ size_t length_;
33
+ };
34
+ } // namespace
35
+
36
+ TESTCASE(define_array_iterator)
37
+ {
38
+ define_class<Container>("Container")
39
+ .define_constructor(Constructor<Container, int*, size_t>())
40
+ .define_iterator(&Container::beginFoo, &Container::endBar);
41
+
42
+ int array[] = { 1, 2, 3 };
43
+ Container* container = new Container(array, 3);
44
+
45
+ Object wrapped_container = Data_Object<Container>(container);
46
+
47
+ Array a = wrapped_container.instance_eval("a = []; each() { |x| a << x }; a");
48
+ ASSERT_EQUAL(3u, a.size());
49
+ ASSERT_EQUAL(Object(detail::to_ruby(1)), a[0]);
50
+ ASSERT_EQUAL(Object(detail::to_ruby(2)), a[1]);
51
+ ASSERT_EQUAL(Object(detail::to_ruby(3)), a[2]);
52
+ }
53
+
54
+ namespace
55
+ {
56
+ struct Data
57
+ {
58
+ uint32_t index;
59
+ };
60
+
61
+ class ContainerValues
62
+ {
63
+ public:
64
+ ContainerValues()
65
+ {
66
+ this->data_ = { {1}, {2}, {3}};
67
+ }
68
+
69
+ std::vector<Data>::iterator begin()
70
+ {
71
+ return this->data_.begin();
72
+ }
73
+
74
+ std::vector<Data>::iterator end()
75
+ {
76
+ return this->data_.end();
77
+ }
78
+
79
+ std::vector<Data> data_;
80
+ };
81
+
82
+ class ContainerPointers
83
+ {
84
+ public:
85
+ ContainerPointers()
86
+ {
87
+ this->data_ = { new Data{1}, new Data{2}, new Data{3} };
88
+ }
89
+
90
+ ~ContainerPointers()
91
+ {
92
+ for (Data* data : this->data_)
93
+ {
94
+ delete data;
95
+ }
96
+ }
97
+
98
+ std::vector<Data*>::iterator begin()
99
+ {
100
+ return this->data_.begin();
101
+ }
102
+
103
+ std::vector<Data*>::iterator end()
104
+ {
105
+ return this->data_.end();
106
+ }
107
+
108
+ std::vector<Data*> data_;
109
+ };
110
+ }
111
+
112
+ template <>
113
+ struct detail::To_Ruby<Data>
114
+ {
115
+ static VALUE convert(const Data& data)
116
+ {
117
+ return detail::to_ruby(data.index);
118
+ }
119
+ };
120
+
121
+ template <>
122
+ struct detail::To_Ruby<Data*>
123
+ {
124
+ static VALUE convert(const Data* data)
125
+ {
126
+ return detail::to_ruby(data->index);
127
+ }
128
+ };
129
+
130
+ TESTCASE(iterator_value)
131
+ {
132
+ define_class<ContainerValues>("ContainerValues")
133
+ .define_constructor(Constructor<ContainerValues>())
134
+ .define_iterator(&ContainerValues::begin, &ContainerValues::end);
135
+
136
+ ContainerValues* container = new ContainerValues();
137
+ Object wrapper = Data_Object<ContainerValues>(container);
138
+
139
+ Array a = wrapper.instance_eval("a = []; each() { |x| a << x }; a");
140
+ ASSERT_EQUAL(3u, a.size());
141
+
142
+ ASSERT_EQUAL(Object(detail::to_ruby(1)), a[0]);
143
+ ASSERT_EQUAL(Object(detail::to_ruby(2)), a[1]);
144
+ ASSERT_EQUAL(Object(detail::to_ruby(3)), a[2]);
145
+ }
146
+
147
+ TESTCASE(iterator_pointer)
148
+ {
149
+ define_class<ContainerPointers>("ContainerPointers")
150
+ .define_constructor(Constructor<ContainerPointers>())
151
+ .define_iterator(&ContainerPointers::begin, &ContainerPointers::end);
152
+
153
+ ContainerPointers* container = new ContainerPointers();
154
+ Object wrapper = Data_Object<ContainerPointers>(container);
155
+
156
+ Array a = wrapper.instance_eval("a = []; each() { |x| a << x }; a");
157
+ ASSERT_EQUAL(3u, a.size());
158
+ ASSERT_EQUAL(Object(detail::to_ruby(1)), a[0]);
159
+ ASSERT_EQUAL(Object(detail::to_ruby(2)), a[1]);
160
+ ASSERT_EQUAL(Object(detail::to_ruby(3)), a[2]);
161
+ }