rice 2.1.2 → 4.0.1

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