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,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
+ }