rice 3.0.0 → 4.0.3

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 (238) 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/include/rice/stl.hpp +1113 -0
  9. data/lib/mkmf-rice.rb +127 -0
  10. data/lib/version.rb +3 -0
  11. data/rice/Address_Registration_Guard.ipp +75 -32
  12. data/rice/Address_Registration_Guard_defn.hpp +60 -56
  13. data/rice/Arg.hpp +80 -4
  14. data/rice/Arg.ipp +51 -0
  15. data/rice/Constructor.hpp +12 -14
  16. data/rice/Data_Object.ipp +234 -107
  17. data/rice/Data_Object_defn.hpp +77 -117
  18. data/rice/Data_Type.hpp +1 -2
  19. data/rice/Data_Type.ipp +251 -295
  20. data/rice/Data_Type_defn.hpp +175 -243
  21. data/rice/Director.hpp +11 -6
  22. data/rice/Enum.hpp +54 -104
  23. data/rice/Enum.ipp +104 -230
  24. data/rice/Exception.hpp +2 -8
  25. data/rice/Exception.ipp +65 -0
  26. data/rice/Exception_defn.hpp +46 -47
  27. data/rice/Identifier.hpp +28 -28
  28. data/rice/Identifier.ipp +23 -27
  29. data/rice/Return.hpp +39 -0
  30. data/rice/Return.ipp +33 -0
  31. data/rice/detail/Exception_Handler.ipp +22 -62
  32. data/rice/detail/Exception_Handler_defn.hpp +76 -91
  33. data/rice/detail/Iterator.hpp +18 -88
  34. data/rice/detail/Iterator.ipp +47 -0
  35. data/rice/detail/Jump_Tag.hpp +21 -0
  36. data/rice/detail/MethodInfo.hpp +44 -0
  37. data/rice/detail/MethodInfo.ipp +78 -0
  38. data/rice/detail/NativeAttribute.hpp +53 -0
  39. data/rice/detail/NativeAttribute.ipp +83 -0
  40. data/rice/detail/NativeFunction.hpp +69 -0
  41. data/rice/detail/NativeFunction.ipp +248 -0
  42. data/rice/detail/RubyFunction.hpp +39 -0
  43. data/rice/detail/RubyFunction.ipp +92 -0
  44. data/rice/detail/Type.hpp +29 -0
  45. data/rice/detail/Type.ipp +138 -0
  46. data/rice/detail/TypeRegistry.hpp +50 -0
  47. data/rice/detail/TypeRegistry.ipp +106 -0
  48. data/rice/detail/Wrapper.hpp +51 -0
  49. data/rice/detail/Wrapper.ipp +151 -0
  50. data/rice/detail/default_allocation_func.hpp +8 -19
  51. data/rice/detail/default_allocation_func.ipp +9 -8
  52. data/rice/detail/from_ruby.hpp +2 -37
  53. data/rice/detail/from_ruby.ipp +1020 -46
  54. data/rice/detail/from_ruby_defn.hpp +38 -0
  55. data/rice/detail/function_traits.hpp +124 -0
  56. data/rice/detail/method_data.hpp +23 -15
  57. data/rice/detail/method_data.ipp +53 -0
  58. data/rice/detail/rice_traits.hpp +116 -0
  59. data/rice/detail/ruby.hpp +9 -46
  60. data/rice/detail/to_ruby.hpp +3 -17
  61. data/rice/detail/to_ruby.ipp +409 -31
  62. data/rice/detail/to_ruby_defn.hpp +48 -0
  63. data/rice/forward_declares.ipp +82 -0
  64. data/rice/global_function.hpp +16 -20
  65. data/rice/global_function.ipp +8 -17
  66. data/rice/rice.hpp +59 -0
  67. data/rice/ruby_mark.hpp +5 -3
  68. data/rice/ruby_try_catch.hpp +4 -4
  69. data/rice/stl.hpp +11 -0
  70. data/sample/callbacks/extconf.rb +3 -0
  71. data/sample/callbacks/sample_callbacks.cpp +10 -13
  72. data/sample/enum/extconf.rb +3 -0
  73. data/sample/enum/sample_enum.cpp +3 -17
  74. data/sample/enum/test.rb +2 -2
  75. data/sample/inheritance/animals.cpp +8 -24
  76. data/sample/inheritance/extconf.rb +3 -0
  77. data/sample/inheritance/test.rb +1 -1
  78. data/sample/map/extconf.rb +3 -0
  79. data/sample/map/map.cpp +10 -18
  80. data/sample/map/test.rb +1 -1
  81. data/test/embed_ruby.cpp +18 -5
  82. data/test/ext/t1/extconf.rb +3 -0
  83. data/test/ext/t1/t1.cpp +1 -3
  84. data/test/ext/t2/extconf.rb +3 -0
  85. data/test/ext/t2/t2.cpp +1 -1
  86. data/test/extconf.rb +23 -0
  87. data/test/ruby/test_callbacks_sample.rb +28 -0
  88. data/test/ruby/test_multiple_extensions.rb +18 -0
  89. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  90. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  91. data/test/test_Address_Registration_Guard.cpp +23 -10
  92. data/test/test_Array.cpp +129 -73
  93. data/test/test_Attribute.cpp +147 -0
  94. data/test/test_Builtin_Object.cpp +34 -14
  95. data/test/test_Class.cpp +149 -275
  96. data/test/test_Constructor.cpp +10 -9
  97. data/test/test_Data_Object.cpp +133 -192
  98. data/test/test_Data_Type.cpp +322 -252
  99. data/test/test_Director.cpp +54 -41
  100. data/test/test_Enum.cpp +228 -103
  101. data/test/test_Exception.cpp +5 -6
  102. data/test/test_Hash.cpp +31 -30
  103. data/test/test_Identifier.cpp +4 -5
  104. data/test/test_Inheritance.cpp +221 -0
  105. data/test/test_Iterator.cpp +161 -0
  106. data/test/test_Jump_Tag.cpp +1 -1
  107. data/test/test_Keep_Alive.cpp +161 -0
  108. data/test/test_Memory_Management.cpp +2 -4
  109. data/test/test_Module.cpp +167 -110
  110. data/test/test_Object.cpp +41 -21
  111. data/test/test_Ownership.cpp +275 -0
  112. data/test/test_Self.cpp +205 -0
  113. data/test/test_Stl_Optional.cpp +90 -0
  114. data/test/test_Stl_Pair.cpp +144 -0
  115. data/test/test_Stl_SmartPointer.cpp +200 -0
  116. data/test/test_Stl_String.cpp +74 -0
  117. data/test/test_Stl_Vector.cpp +652 -0
  118. data/test/test_String.cpp +1 -2
  119. data/test/test_Struct.cpp +29 -39
  120. data/test/test_Symbol.cpp +1 -2
  121. data/test/test_To_From_Ruby.cpp +249 -285
  122. data/test/test_global_functions.cpp +39 -19
  123. data/test/unittest.hpp +0 -4
  124. metadata +70 -141
  125. data/Doxyfile +0 -2268
  126. data/Makefile.am +0 -26
  127. data/Makefile.in +0 -931
  128. data/README.mingw +0 -8
  129. data/aclocal.m4 +0 -1085
  130. data/ax_cxx_compile_stdcxx.m4 +0 -951
  131. data/bootstrap +0 -8
  132. data/config.guess +0 -1421
  133. data/config.sub +0 -1807
  134. data/configure +0 -7792
  135. data/configure.ac +0 -55
  136. data/depcomp +0 -791
  137. data/doxygen.ac +0 -314
  138. data/doxygen.am +0 -186
  139. data/extconf.rb +0 -70
  140. data/install-sh +0 -501
  141. data/missing +0 -215
  142. data/post-autoconf.rb +0 -22
  143. data/post-automake.rb +0 -28
  144. data/rice/Address_Registration_Guard.cpp +0 -22
  145. data/rice/Arg_impl.hpp +0 -129
  146. data/rice/Arg_operators.cpp +0 -21
  147. data/rice/Arg_operators.hpp +0 -19
  148. data/rice/Array.hpp +0 -214
  149. data/rice/Array.ipp +0 -256
  150. data/rice/Builtin_Object.hpp +0 -8
  151. data/rice/Builtin_Object.ipp +0 -50
  152. data/rice/Builtin_Object_defn.hpp +0 -50
  153. data/rice/Class.cpp +0 -57
  154. data/rice/Class.hpp +0 -8
  155. data/rice/Class.ipp +0 -6
  156. data/rice/Class_defn.hpp +0 -84
  157. data/rice/Data_Type.cpp +0 -54
  158. data/rice/Data_Type_fwd.hpp +0 -12
  159. data/rice/Director.cpp +0 -13
  160. data/rice/Exception.cpp +0 -54
  161. data/rice/Exception_Base.hpp +0 -8
  162. data/rice/Exception_Base.ipp +0 -13
  163. data/rice/Exception_Base_defn.hpp +0 -27
  164. data/rice/Hash.hpp +0 -230
  165. data/rice/Hash.ipp +0 -329
  166. data/rice/Identifier.cpp +0 -8
  167. data/rice/Jump_Tag.hpp +0 -24
  168. data/rice/Makefile.am +0 -121
  169. data/rice/Makefile.in +0 -884
  170. data/rice/Module.cpp +0 -84
  171. data/rice/Module.hpp +0 -8
  172. data/rice/Module.ipp +0 -6
  173. data/rice/Module_defn.hpp +0 -88
  174. data/rice/Module_impl.hpp +0 -281
  175. data/rice/Module_impl.ipp +0 -345
  176. data/rice/Object.cpp +0 -169
  177. data/rice/Object.hpp +0 -8
  178. data/rice/Object.ipp +0 -33
  179. data/rice/Object_defn.hpp +0 -214
  180. data/rice/Require_Guard.hpp +0 -21
  181. data/rice/String.cpp +0 -89
  182. data/rice/String.hpp +0 -91
  183. data/rice/Struct.cpp +0 -117
  184. data/rice/Struct.hpp +0 -162
  185. data/rice/Struct.ipp +0 -26
  186. data/rice/Symbol.cpp +0 -25
  187. data/rice/Symbol.hpp +0 -66
  188. data/rice/Symbol.ipp +0 -44
  189. data/rice/config.hpp +0 -47
  190. data/rice/config.hpp.in +0 -46
  191. data/rice/detail/Arguments.hpp +0 -118
  192. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  193. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3181
  194. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  195. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2501
  196. data/rice/detail/Caster.hpp +0 -103
  197. data/rice/detail/Not_Copyable.hpp +0 -25
  198. data/rice/detail/Wrapped_Function.hpp +0 -33
  199. data/rice/detail/cfp.hpp +0 -24
  200. data/rice/detail/cfp.ipp +0 -51
  201. data/rice/detail/check_ruby_type.cpp +0 -27
  202. data/rice/detail/check_ruby_type.hpp +0 -23
  203. data/rice/detail/creation_funcs.hpp +0 -37
  204. data/rice/detail/creation_funcs.ipp +0 -36
  205. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  206. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  207. data/rice/detail/demangle.cpp +0 -56
  208. data/rice/detail/demangle.hpp +0 -19
  209. data/rice/detail/env.hpp +0 -11
  210. data/rice/detail/method_data.cpp +0 -92
  211. data/rice/detail/node.hpp +0 -13
  212. data/rice/detail/protect.cpp +0 -29
  213. data/rice/detail/protect.hpp +0 -34
  214. data/rice/detail/ruby_version_code.hpp +0 -6
  215. data/rice/detail/ruby_version_code.hpp.in +0 -6
  216. data/rice/detail/st.hpp +0 -22
  217. data/rice/detail/win32.hpp +0 -16
  218. data/rice/detail/wrap_function.hpp +0 -66
  219. data/rice/protect.hpp +0 -38
  220. data/rice/protect.ipp +0 -1134
  221. data/rice/rubypp.rb +0 -97
  222. data/rice/to_from_ruby.hpp +0 -8
  223. data/rice/to_from_ruby.ipp +0 -418
  224. data/rice/to_from_ruby_defn.hpp +0 -70
  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/ruby.ac +0 -135
  232. data/sample/Makefile.am +0 -53
  233. data/sample/Makefile.in +0 -495
  234. data/test/Makefile.am +0 -73
  235. data/test/Makefile.in +0 -1219
  236. data/test/ext/Makefile.am +0 -41
  237. data/test/ext/Makefile.in +0 -483
  238. 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
+ }
@@ -1,5 +1,5 @@
1
1
  #include "unittest.hpp"
2
- #include "rice/Jump_Tag.hpp"
2
+ #include <rice/rice.hpp>
3
3
 
4
4
  using namespace Rice;
5
5