rice 2.1.2 → 4.0.1

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 (245) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +121 -0
  3. data/CONTRIBUTORS.md +19 -0
  4. data/COPYING +2 -2
  5. data/Gemfile +3 -0
  6. data/README.md +45 -1028
  7. data/Rakefile +95 -12
  8. data/include/rice/rice.hpp +7766 -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 +30 -376
  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 +14 -9
  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 -49
  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 +6 -0
  71. data/sample/callbacks/sample_callbacks.cpp +35 -0
  72. data/sample/callbacks/test.rb +28 -0
  73. data/sample/enum/extconf.rb +3 -0
  74. data/sample/enum/sample_enum.cpp +3 -17
  75. data/sample/enum/test.rb +2 -2
  76. data/sample/inheritance/animals.cpp +8 -24
  77. data/sample/inheritance/extconf.rb +3 -0
  78. data/sample/inheritance/test.rb +1 -1
  79. data/sample/map/extconf.rb +3 -0
  80. data/sample/map/map.cpp +10 -18
  81. data/sample/map/test.rb +1 -1
  82. data/test/embed_ruby.cpp +34 -0
  83. data/test/embed_ruby.hpp +4 -0
  84. data/test/ext/t1/extconf.rb +3 -0
  85. data/test/ext/t1/t1.cpp +1 -3
  86. data/test/ext/t2/extconf.rb +3 -0
  87. data/test/ext/t2/t2.cpp +1 -1
  88. data/test/extconf.rb +23 -0
  89. data/test/ruby/test_callbacks_sample.rb +28 -0
  90. data/test/ruby/test_multiple_extensions.rb +18 -0
  91. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  92. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  93. data/test/test_Address_Registration_Guard.cpp +25 -11
  94. data/test/test_Array.cpp +131 -74
  95. data/test/test_Attribute.cpp +147 -0
  96. data/test/test_Builtin_Object.cpp +36 -15
  97. data/test/test_Class.cpp +151 -276
  98. data/test/test_Constructor.cpp +10 -9
  99. data/test/test_Data_Object.cpp +135 -193
  100. data/test/test_Data_Type.cpp +323 -252
  101. data/test/test_Director.cpp +56 -42
  102. data/test/test_Enum.cpp +230 -104
  103. data/test/test_Exception.cpp +7 -7
  104. data/test/test_Hash.cpp +33 -31
  105. data/test/test_Identifier.cpp +6 -6
  106. data/test/test_Inheritance.cpp +221 -0
  107. data/test/test_Iterator.cpp +161 -0
  108. data/test/test_Jump_Tag.cpp +1 -1
  109. data/test/test_Keep_Alive.cpp +161 -0
  110. data/test/test_Memory_Management.cpp +4 -5
  111. data/test/test_Module.cpp +169 -111
  112. data/test/test_Object.cpp +51 -19
  113. data/test/test_Ownership.cpp +275 -0
  114. data/test/test_Self.cpp +205 -0
  115. data/test/test_Stl_Optional.cpp +90 -0
  116. data/test/test_Stl_Pair.cpp +144 -0
  117. data/test/test_Stl_SmartPointer.cpp +200 -0
  118. data/test/test_Stl_String.cpp +74 -0
  119. data/test/test_Stl_Vector.cpp +652 -0
  120. data/test/test_String.cpp +3 -3
  121. data/test/test_Struct.cpp +31 -40
  122. data/test/test_Symbol.cpp +3 -3
  123. data/test/test_To_From_Ruby.cpp +283 -218
  124. data/test/test_global_functions.cpp +41 -20
  125. data/test/unittest.cpp +34 -8
  126. data/test/unittest.hpp +0 -4
  127. metadata +120 -136
  128. data/Doxyfile +0 -2268
  129. data/Makefile.am +0 -26
  130. data/Makefile.in +0 -920
  131. data/README.mingw +0 -8
  132. data/aclocal.m4 +0 -1088
  133. data/bootstrap +0 -8
  134. data/check_stdcxx_11.ac +0 -142
  135. data/config.guess +0 -1421
  136. data/config.sub +0 -1807
  137. data/configure +0 -7481
  138. data/configure.ac +0 -55
  139. data/depcomp +0 -791
  140. data/doxygen.ac +0 -314
  141. data/doxygen.am +0 -186
  142. data/extconf.rb +0 -69
  143. data/install-sh +0 -501
  144. data/missing +0 -215
  145. data/post-autoconf.rb +0 -22
  146. data/post-automake.rb +0 -28
  147. data/rice/Address_Registration_Guard.cpp +0 -22
  148. data/rice/Arg_impl.hpp +0 -129
  149. data/rice/Arg_operators.cpp +0 -21
  150. data/rice/Arg_operators.hpp +0 -19
  151. data/rice/Array.hpp +0 -214
  152. data/rice/Array.ipp +0 -256
  153. data/rice/Builtin_Object.hpp +0 -8
  154. data/rice/Builtin_Object.ipp +0 -50
  155. data/rice/Builtin_Object_defn.hpp +0 -50
  156. data/rice/Class.cpp +0 -57
  157. data/rice/Class.hpp +0 -8
  158. data/rice/Class.ipp +0 -6
  159. data/rice/Class_defn.hpp +0 -83
  160. data/rice/Data_Type.cpp +0 -54
  161. data/rice/Data_Type_fwd.hpp +0 -12
  162. data/rice/Director.cpp +0 -13
  163. data/rice/Exception.cpp +0 -59
  164. data/rice/Exception_Base.hpp +0 -8
  165. data/rice/Exception_Base.ipp +0 -13
  166. data/rice/Exception_Base_defn.hpp +0 -27
  167. data/rice/Hash.hpp +0 -227
  168. data/rice/Hash.ipp +0 -329
  169. data/rice/Identifier.cpp +0 -8
  170. data/rice/Jump_Tag.hpp +0 -24
  171. data/rice/Makefile.am +0 -124
  172. data/rice/Makefile.in +0 -839
  173. data/rice/Module.cpp +0 -84
  174. data/rice/Module.hpp +0 -8
  175. data/rice/Module.ipp +0 -6
  176. data/rice/Module_defn.hpp +0 -88
  177. data/rice/Module_impl.hpp +0 -281
  178. data/rice/Module_impl.ipp +0 -345
  179. data/rice/Object.cpp +0 -169
  180. data/rice/Object.hpp +0 -8
  181. data/rice/Object.ipp +0 -19
  182. data/rice/Object_defn.hpp +0 -191
  183. data/rice/Require_Guard.hpp +0 -21
  184. data/rice/String.cpp +0 -94
  185. data/rice/String.hpp +0 -91
  186. data/rice/Struct.cpp +0 -117
  187. data/rice/Struct.hpp +0 -162
  188. data/rice/Struct.ipp +0 -26
  189. data/rice/Symbol.cpp +0 -25
  190. data/rice/Symbol.hpp +0 -66
  191. data/rice/Symbol.ipp +0 -44
  192. data/rice/config.hpp +0 -47
  193. data/rice/config.hpp.in +0 -46
  194. data/rice/detail/Arguments.hpp +0 -118
  195. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  196. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3694
  197. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  198. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2774
  199. data/rice/detail/Caster.hpp +0 -103
  200. data/rice/detail/Not_Copyable.hpp +0 -25
  201. data/rice/detail/Wrapped_Function.hpp +0 -33
  202. data/rice/detail/cfp.hpp +0 -24
  203. data/rice/detail/cfp.ipp +0 -51
  204. data/rice/detail/check_ruby_type.cpp +0 -27
  205. data/rice/detail/check_ruby_type.hpp +0 -23
  206. data/rice/detail/creation_funcs.hpp +0 -37
  207. data/rice/detail/creation_funcs.ipp +0 -36
  208. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  209. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  210. data/rice/detail/demangle.cpp +0 -56
  211. data/rice/detail/demangle.hpp +0 -19
  212. data/rice/detail/env.hpp +0 -11
  213. data/rice/detail/method_data.cpp +0 -86
  214. data/rice/detail/node.hpp +0 -13
  215. data/rice/detail/object_call.hpp +0 -69
  216. data/rice/detail/object_call.ipp +0 -131
  217. data/rice/detail/protect.cpp +0 -29
  218. data/rice/detail/protect.hpp +0 -34
  219. data/rice/detail/ruby_version_code.hpp +0 -6
  220. data/rice/detail/ruby_version_code.hpp.in +0 -6
  221. data/rice/detail/st.hpp +0 -22
  222. data/rice/detail/traits.hpp +0 -43
  223. data/rice/detail/win32.hpp +0 -16
  224. data/rice/detail/wrap_function.hpp +0 -341
  225. data/rice/detail/wrap_function.ipp +0 -514
  226. data/rice/protect.hpp +0 -92
  227. data/rice/protect.ipp +0 -1134
  228. data/rice/rubypp.rb +0 -97
  229. data/rice/to_from_ruby.hpp +0 -8
  230. data/rice/to_from_ruby.ipp +0 -294
  231. data/rice/to_from_ruby_defn.hpp +0 -70
  232. data/ruby.ac +0 -135
  233. data/ruby/Makefile.am +0 -1
  234. data/ruby/Makefile.in +0 -625
  235. data/ruby/lib/Makefile.am +0 -3
  236. data/ruby/lib/Makefile.in +0 -503
  237. data/ruby/lib/mkmf-rice.rb.in +0 -217
  238. data/ruby/lib/version.rb +0 -3
  239. data/sample/Makefile.am +0 -47
  240. data/sample/Makefile.in +0 -486
  241. data/test/Makefile.am +0 -72
  242. data/test/Makefile.in +0 -1150
  243. data/test/ext/Makefile.am +0 -41
  244. data/test/ext/Makefile.in +0 -480
  245. data/test/test_rice.rb +0 -41
@@ -1,6 +1,6 @@
1
1
  #include "unittest.hpp"
2
- #include "rice/Exception.hpp"
3
- #include "rice/String.hpp"
2
+ #include "embed_ruby.hpp"
3
+ #include <rice/rice.hpp>
4
4
 
5
5
  using namespace Rice;
6
6
 
@@ -8,19 +8,19 @@ TESTSUITE(Exception);
8
8
 
9
9
  SETUP(Exception)
10
10
  {
11
- ruby_init();
11
+ embed_ruby();
12
12
  }
13
13
 
14
14
  TESTCASE(construct_from_exception_object)
15
15
  {
16
- VALUE v = protect(rb_exc_new2, rb_eRuntimeError, "foo");
16
+ VALUE v = detail::protect(rb_exc_new2, rb_eRuntimeError, "foo");
17
17
  Exception ex(v);
18
18
  ASSERT_EQUAL(ex.value(), v);
19
19
  }
20
20
 
21
21
  TESTCASE(copy_construct)
22
22
  {
23
- VALUE v = protect(rb_exc_new2, rb_eRuntimeError, "foo");
23
+ VALUE v = detail::protect(rb_exc_new2, rb_eRuntimeError, "foo");
24
24
  Exception ex1(v);
25
25
  Exception ex2(v);
26
26
  ASSERT_EQUAL(ex2.value(), v);
@@ -29,13 +29,13 @@ TESTCASE(copy_construct)
29
29
  TESTCASE(construct_from_format_string)
30
30
  {
31
31
  Exception ex(rb_eRuntimeError, "%s", "foo");
32
- ASSERT_EQUAL(ex.class_of(), Object(rb_eRuntimeError));
32
+ ASSERT_EQUAL(rb_eRuntimeError, ex.class_of());
33
33
  }
34
34
 
35
35
  TESTCASE(message)
36
36
  {
37
37
  Exception ex(rb_eRuntimeError, "%s", "foo");
38
- ASSERT_EQUAL(String("foo"), ex.message());
38
+ ASSERT_EQUAL("foo", ex.what());
39
39
  }
40
40
 
41
41
  TESTCASE(what)
data/test/test_Hash.cpp CHANGED
@@ -1,6 +1,7 @@
1
1
  #include "unittest.hpp"
2
- #include "rice/Hash.hpp"
3
- #include "rice/global_function.hpp"
2
+ #include "embed_ruby.hpp"
3
+ #include <rice/rice.hpp>
4
+
4
5
  #include <vector>
5
6
  #include <map>
6
7
  #include <algorithm>
@@ -11,14 +12,14 @@ TESTSUITE(Hash);
11
12
 
12
13
  SETUP(Hash)
13
14
  {
14
- ruby_init();
15
+ embed_ruby();
15
16
  }
16
17
 
17
18
  TESTCASE(default_construct)
18
19
  {
19
20
  Hash h;
20
21
  ASSERT_EQUAL(T_HASH, rb_type(h));
21
- ASSERT_EQUAL(0, RHASH_SIZE(h.value()));
22
+ ASSERT_EQUAL(0u, RHASH_SIZE(h.value()));
22
23
  }
23
24
 
24
25
  TESTCASE(construct_from_object)
@@ -26,7 +27,7 @@ TESTCASE(construct_from_object)
26
27
  Object o(rb_hash_new());
27
28
  Hash h(o);
28
29
  ASSERT_EQUAL(T_HASH, rb_type(h));
29
- ASSERT_EQUAL(0, RHASH_SIZE(h.value()));
30
+ ASSERT_EQUAL(0u, RHASH_SIZE(h.value()));
30
31
  }
31
32
 
32
33
  TESTCASE(construct_from_value)
@@ -34,7 +35,7 @@ TESTCASE(construct_from_value)
34
35
  VALUE v(rb_hash_new());
35
36
  Hash h(v);
36
37
  ASSERT_EQUAL(T_HASH, rb_type(h));
37
- ASSERT_EQUAL(0, RHASH_SIZE(h.value()));
38
+ ASSERT_EQUAL(0u, RHASH_SIZE(h.value()));
38
39
  }
39
40
 
40
41
  TESTCASE(copy_construct)
@@ -49,6 +50,7 @@ TESTCASE(assignment)
49
50
  Hash h;
50
51
  Hash h2;
51
52
  h = h2;
53
+ ASSERT_EQUAL(h.value(), h2.value());
52
54
  }
53
55
 
54
56
  TESTCASE(size)
@@ -72,9 +74,9 @@ TESTCASE(bracket)
72
74
  h[6] = 9;
73
75
  h[42] = 42;
74
76
  h[6] = 1;
75
- ASSERT_EQUAL(to_ruby(5), Object(h[1]));
76
- ASSERT_EQUAL(to_ruby(42), Object(h[42]));
77
- 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());
78
80
  }
79
81
 
80
82
  TESTCASE(get)
@@ -100,15 +102,15 @@ TESTCASE(construct_vector_from_hash_iterators)
100
102
  std::vector<Hash::Entry> v(h.begin(), h.end());
101
103
  std::sort(v.begin(), v.end());
102
104
  ASSERT_EQUAL(3u, v.size());
103
- ASSERT_EQUAL(v[0].key, to_ruby(1));
104
- ASSERT_EQUAL(v[1].key, to_ruby(6));
105
- 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));
106
108
  ASSERT_EQUAL(&v[0].key, &v[0].first);
107
109
  ASSERT_EQUAL(&v[1].key, &v[1].first);
108
110
  ASSERT_EQUAL(&v[2].key, &v[2].first);
109
- ASSERT_EQUAL(v[0].value, to_ruby(5));
110
- ASSERT_EQUAL(v[1].value, to_ruby(1));
111
- 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));
112
114
  ASSERT_EQUAL(&v[0].value, &v[0].second);
113
115
  ASSERT_EQUAL(&v[1].value, &v[1].second);
114
116
  ASSERT_EQUAL(&v[2].value, &v[2].second);
@@ -133,15 +135,15 @@ TESTCASE(iterate)
133
135
 
134
136
  std::sort(v.begin(), v.end());
135
137
  ASSERT_EQUAL(3u, v.size());
136
- ASSERT_EQUAL(v[0].key, to_ruby(1));
137
- ASSERT_EQUAL(v[1].key, to_ruby(6));
138
- 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));
139
141
  ASSERT_EQUAL(&v[0].key, &v[0].first);
140
142
  ASSERT_EQUAL(&v[1].key, &v[1].first);
141
143
  ASSERT_EQUAL(&v[2].key, &v[2].first);
142
- ASSERT_EQUAL(v[0].value, to_ruby(5));
143
- ASSERT_EQUAL(v[1].value, to_ruby(1));
144
- 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));
145
147
  ASSERT_EQUAL(&v[0].value, &v[0].second);
146
148
  ASSERT_EQUAL(&v[1].value, &v[1].second);
147
149
  ASSERT_EQUAL(&v[2].value, &v[2].second);
@@ -163,15 +165,15 @@ TESTCASE(const_iterate)
163
165
  }
164
166
  std::sort(v.begin(), v.end());
165
167
  ASSERT_EQUAL(3u, v.size());
166
- ASSERT_EQUAL(v[0].key, to_ruby(1));
167
- ASSERT_EQUAL(v[1].key, to_ruby(6));
168
- 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));
169
171
  ASSERT_EQUAL(&v[0].key, &v[0].first);
170
172
  ASSERT_EQUAL(&v[1].key, &v[1].first);
171
173
  ASSERT_EQUAL(&v[2].key, &v[2].first);
172
- ASSERT_EQUAL(v[0].value, to_ruby(5));
173
- ASSERT_EQUAL(v[1].value, to_ruby(1));
174
- 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));
175
177
  ASSERT_EQUAL(&v[0].value, &v[0].value);
176
178
  ASSERT_EQUAL(&v[1].value, &v[1].value);
177
179
  ASSERT_EQUAL(&v[2].value, &v[2].value);
@@ -190,12 +192,12 @@ TESTCASE(iterate_and_change)
190
192
  for(int j = 0; it != end; ++j, ++it)
191
193
  {
192
194
  it->second = j;
193
- m[from_ruby<int>(it->first)] = j;
195
+ m[detail::From_Ruby<int>().convert(it->first)] = j;
194
196
  }
195
197
  ASSERT_EQUAL(3u, m.size());
196
- ASSERT_EQUAL(to_ruby(m[1]), h[1]);
197
- ASSERT_EQUAL(to_ruby(m[6]), h[6]);
198
- 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]);
199
201
  }
200
202
 
201
203
  /**
@@ -1,6 +1,6 @@
1
1
  #include "unittest.hpp"
2
- #include "rice/Identifier.hpp"
3
- #include "rice/Symbol.hpp"
2
+ #include "embed_ruby.hpp"
3
+ #include <rice/rice.hpp>
4
4
 
5
5
  using namespace Rice;
6
6
 
@@ -8,7 +8,7 @@ TESTSUITE(Identifier);
8
8
 
9
9
  SETUP(Identifier)
10
10
  {
11
- ruby_init();
11
+ embed_ruby();
12
12
  }
13
13
 
14
14
  TESTCASE(construct_from_id)
@@ -31,10 +31,10 @@ TESTCASE(construct_from_c_string)
31
31
  ASSERT_EQUAL(rb_intern("Foo"), identifier.id());
32
32
  }
33
33
 
34
- TESTCASE(default_construct)
34
+ TESTCASE(construct_from_string)
35
35
  {
36
- Identifier identifier;
37
- ASSERT_EQUAL(rb_intern(""), identifier.id());
36
+ Identifier identifier(std::string("Foo"));
37
+ ASSERT_EQUAL(rb_intern("Foo"), identifier.id());
38
38
  }
39
39
 
40
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
+ }