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
data/test/test_Array.cpp CHANGED
@@ -1,13 +1,23 @@
1
1
  #include "unittest.hpp"
2
2
  #include "embed_ruby.hpp"
3
- #include "rice/Array.hpp"
4
- #include "rice/String.hpp"
5
- #include "rice/global_function.hpp"
3
+ #include <rice/rice.hpp>
4
+
5
+ #include <vector>
6
6
 
7
7
  using namespace Rice;
8
8
 
9
9
  TESTSUITE(Array);
10
10
 
11
+ // This is needed to make unittest compile (it uses ostream to report errors)
12
+ inline std::ostream& operator<<(std::ostream& os, const std::vector<int32_t>& vector)
13
+ {
14
+ for (auto i : vector)
15
+ {
16
+ os << i << ", ";
17
+ }
18
+ return os;
19
+ }
20
+
11
21
  SETUP(Array)
12
22
  {
13
23
  embed_ruby();
@@ -28,9 +38,9 @@ TESTCASE(construct_from_vector_of_int)
28
38
  v.push_back(42);
29
39
  Array a(v.begin(), v.end());
30
40
  ASSERT_EQUAL(3u, a.size());
31
- ASSERT_EQUAL(to_ruby(10), a[0]);
32
- ASSERT_EQUAL(to_ruby(6), a[1]);
33
- ASSERT_EQUAL(to_ruby(42), a[2]);
41
+ ASSERT(rb_equal(detail::to_ruby(10), a[0].value()));
42
+ ASSERT(rb_equal(detail::to_ruby(6), a[1].value()));
43
+ ASSERT(rb_equal(detail::to_ruby(42), a[2].value()));
34
44
  }
35
45
 
36
46
  TESTCASE(construct_from_c_array)
@@ -38,12 +48,11 @@ TESTCASE(construct_from_c_array)
38
48
  int arr[] = { 10, 6, 42 };
39
49
  Array a(arr);
40
50
  ASSERT_EQUAL(3u, a.size());
41
- ASSERT_EQUAL(to_ruby(10), a[0]);
42
- ASSERT_EQUAL(to_ruby(6), a[1]);
43
- ASSERT_EQUAL(to_ruby(42), a[2]);
51
+ ASSERT(rb_equal(detail::to_ruby(10), a[0].value()));
52
+ ASSERT(rb_equal(detail::to_ruby(6), a[1].value()));
53
+ ASSERT(rb_equal(detail::to_ruby(42), a[2].value()));
44
54
  }
45
55
 
46
-
47
56
  TESTCASE(push_no_items)
48
57
  {
49
58
  Array a;
@@ -61,23 +70,23 @@ TESTCASE(push_one_item)
61
70
  TESTCASE(push_two_items)
62
71
  {
63
72
  Array a;
64
- a.push(to_ruby(42));
65
- a.push(to_ruby(43));
73
+ a.push(42);
74
+ a.push(43);
66
75
  ASSERT_EQUAL(2u, a.size());
67
- ASSERT_EQUAL(42, from_ruby<int>(a[0]));
68
- ASSERT_EQUAL(43, from_ruby<int>(a[1]));
76
+ ASSERT_EQUAL(42, detail::From_Ruby<int>().convert(a[0].value()));
77
+ ASSERT_EQUAL(43, detail::From_Ruby<int>().convert(a[1].value()));
69
78
  }
70
79
 
71
80
  TESTCASE(push_three_items)
72
81
  {
73
82
  Array a;
74
- a.push(to_ruby(42));
75
- a.push(to_ruby(43));
76
- a.push(to_ruby(44));
83
+ a.push(42);
84
+ a.push(43);
85
+ a.push(44);
77
86
  ASSERT_EQUAL(3u, a.size());
78
- ASSERT_EQUAL(42, from_ruby<int>(a[0]));
79
- ASSERT_EQUAL(43, from_ruby<int>(a[1]));
80
- ASSERT_EQUAL(44, from_ruby<int>(a[2]));
87
+ ASSERT_EQUAL(42, detail::From_Ruby<int>().convert(a[0].value()));
88
+ ASSERT_EQUAL(43, detail::From_Ruby<int>().convert(a[1].value()));
89
+ ASSERT_EQUAL(44, detail::From_Ruby<int>().convert(a[2].value()));
81
90
  }
82
91
 
83
92
  TESTCASE(push_int)
@@ -85,25 +94,25 @@ TESTCASE(push_int)
85
94
  Array a;
86
95
  a.push(42);
87
96
  ASSERT_EQUAL(1u, a.size());
88
- ASSERT_EQUAL(to_ruby(42), a[0]);
97
+ ASSERT(rb_equal(detail::to_ruby(42), a[0].value()));
89
98
  }
90
99
 
91
100
  TESTCASE(bracket_equals)
92
101
  {
93
102
  Array a;
94
- a.push(to_ruby(42));
95
- a.push(to_ruby(43));
96
- a.push(to_ruby(44));
97
- a[1] = to_ruby(10);
98
- ASSERT_EQUAL(10, from_ruby<int>(a[1]));
103
+ a.push(42);
104
+ a.push(43);
105
+ a.push(44);
106
+ a[1] = 10;
107
+ ASSERT_EQUAL(10, detail::From_Ruby<int>().convert(a[1].value()));
99
108
  }
100
109
 
101
110
  TESTCASE(to_s)
102
111
  {
103
112
  Array a;
104
- a.push(to_ruby(42));
105
- a.push(to_ruby(43));
106
- a.push(to_ruby(44));
113
+ a.push(42);
114
+ a.push(43);
115
+ a.push(44);
107
116
  String s1(a.call("to_s"));
108
117
  String s2(a.to_s());
109
118
  ASSERT_EQUAL(s1.str(), s2.str());
@@ -112,28 +121,28 @@ TESTCASE(to_s)
112
121
  TESTCASE(pop)
113
122
  {
114
123
  Array a;
115
- a.push(to_ruby(42));
116
- a.push(to_ruby(43));
117
- a.push(to_ruby(44));
124
+ a.push(42);
125
+ a.push(43);
126
+ a.push(44);
118
127
  VALUE result = a.pop();
119
128
  ASSERT_EQUAL(2u, a.size());
120
- ASSERT_EQUAL(42, from_ruby<int>(a[0]));
121
- ASSERT_EQUAL(43, from_ruby<int>(a[1]));
122
- ASSERT_EQUAL(44, from_ruby<int>(result));
129
+ ASSERT_EQUAL(42, detail::From_Ruby<int>().convert(a[0].value()));
130
+ ASSERT_EQUAL(43, detail::From_Ruby<int>().convert(a[1].value()));
131
+ ASSERT_EQUAL(44, detail::From_Ruby<int>().convert(result));
123
132
  }
124
133
 
125
134
  TESTCASE(unshift)
126
135
  {
127
136
  Array a;
128
- a.push(to_ruby(42));
129
- a.push(to_ruby(43));
130
- a.push(to_ruby(44));
131
- a.unshift(to_ruby(10));
137
+ a.push(42);
138
+ a.push(43);
139
+ a.push(44);
140
+ a.unshift(10);
132
141
  ASSERT_EQUAL(4u, a.size());
133
- ASSERT_EQUAL(10, from_ruby<int>(a[0]));
134
- ASSERT_EQUAL(42, from_ruby<int>(a[1]));
135
- ASSERT_EQUAL(43, from_ruby<int>(a[2]));
136
- ASSERT_EQUAL(44, from_ruby<int>(a[3]));
142
+ ASSERT_EQUAL(10, detail::From_Ruby<int>().convert(a[0].value()));
143
+ ASSERT_EQUAL(42, detail::From_Ruby<int>().convert(a[1].value()));
144
+ ASSERT_EQUAL(43, detail::From_Ruby<int>().convert(a[2].value()));
145
+ ASSERT_EQUAL(44, detail::From_Ruby<int>().convert(a[3].value()));
137
146
  }
138
147
 
139
148
  TESTCASE(unshift_int)
@@ -141,76 +150,80 @@ TESTCASE(unshift_int)
141
150
  Array a;
142
151
  a.unshift(42);
143
152
  ASSERT_EQUAL(1u, a.size());
144
- ASSERT_EQUAL(to_ruby(42), a[0]);
153
+ ASSERT(rb_equal(detail::to_ruby(42), a[0].value()));
145
154
  }
146
155
 
147
156
  TESTCASE(shift)
148
157
  {
149
158
  Array a;
150
- a.push(to_ruby(42));
151
- a.push(to_ruby(43));
152
- a.push(to_ruby(44));
159
+ a.push(42);
160
+ a.push(43);
161
+ a.push(44);
153
162
  VALUE result = a.shift();
154
163
  ASSERT_EQUAL(2u, a.size());
155
- ASSERT_EQUAL(42, from_ruby<int>(result));
156
- ASSERT_EQUAL(43, from_ruby<int>(a[0]));
157
- ASSERT_EQUAL(44, from_ruby<int>(a[1]));
164
+ ASSERT_EQUAL(42, detail::From_Ruby<int>().convert(result));
165
+ ASSERT_EQUAL(43, detail::From_Ruby<int>().convert(a[0].value()));
166
+ ASSERT_EQUAL(44, detail::From_Ruby<int>().convert(a[1].value()));
158
167
  }
159
168
 
160
169
  TESTCASE(iterate)
161
170
  {
162
171
  Array a;
163
- a.push(to_ruby(42));
164
- a.push(to_ruby(43));
165
- a.push(to_ruby(44));
172
+ a.push(42);
173
+ a.push(43);
174
+ a.push(44);
166
175
  int ca[] = { 42, 43, 44 };
167
176
  Array::iterator it = a.begin();
168
177
  Array::iterator end = a.end();
169
178
  for(int j = 0; it != end; ++j, ++it)
170
179
  {
171
- ASSERT_EQUAL(ca[j], from_ruby<int>(*it));
180
+ ASSERT_EQUAL(ca[j], detail::From_Ruby<int>().convert(it->value()));
172
181
  }
173
182
  }
174
183
 
175
184
  TESTCASE(const_iterate)
176
185
  {
177
186
  Array a;
178
- a.push(to_ruby(42));
179
- a.push(to_ruby(43));
180
- a.push(to_ruby(44));
187
+ a.push(42);
188
+ a.push(43);
189
+ a.push(44);
181
190
  int ca[] = { 42, 43, 44 };
182
191
  Array::const_iterator it = a.begin();
183
192
  Array::const_iterator end = a.end();
184
193
  for(int j = 0; it != end; ++j, ++it)
185
194
  {
186
- ASSERT_EQUAL(ca[j], from_ruby<int>(*it));
195
+ ASSERT_EQUAL(ca[j], detail::From_Ruby<int>().convert(*it));
187
196
  }
188
197
  }
189
198
 
190
199
  TESTCASE(iterate_and_change)
191
200
  {
192
201
  Array a;
193
- a.push(to_ruby(42));
194
- a.push(to_ruby(43));
195
- a.push(to_ruby(44));
202
+ a.push(42);
203
+ a.push(43);
204
+ a.push(44);
196
205
  Array::iterator it = a.begin();
197
206
  Array::iterator end = a.end();
198
207
  for(int j = 0; it != end; ++j, ++it)
199
208
  {
200
- int value = from_ruby<int>(*it);
201
- *it = to_ruby(value + j);
209
+ int value = detail::From_Ruby<int>().convert(it->value());
210
+ *it = value + j;
202
211
  }
203
- ASSERT_EQUAL(42, from_ruby<int>(a[0]));
204
- ASSERT_EQUAL(44, from_ruby<int>(a[1]));
205
- ASSERT_EQUAL(46, from_ruby<int>(a[2]));
212
+ ASSERT_EQUAL(42, detail::From_Ruby<int>().convert(a[0].value()));
213
+ ASSERT_EQUAL(44, detail::From_Ruby<int>().convert(a[1].value()));
214
+ ASSERT_EQUAL(46, detail::From_Ruby<int>().convert(a[2].value()));
206
215
  }
207
216
 
217
+ /**
218
+ * This test is running into GC issues on CI. Entries in the array
219
+ * are getting GC'd and the test is segfaulting. Really hard to reproduce
220
+ * so disable for now.
208
221
  TESTCASE(iterate_and_call_member)
209
222
  {
210
223
  Array a;
211
- a.push(to_ruby(42));
212
- a.push(to_ruby(43));
213
- a.push(to_ruby(44));
224
+ a.push(42);
225
+ a.push(43);
226
+ a.push(44);
214
227
  Array::iterator it = a.begin();
215
228
  Array::iterator end = a.end();
216
229
  std::vector<Object> v;
@@ -218,21 +231,38 @@ TESTCASE(iterate_and_call_member)
218
231
  {
219
232
  v.push_back(it->to_s());
220
233
  }
221
- ASSERT_EQUAL(42, from_ruby<int>(a[0]));
222
- ASSERT_EQUAL(43, from_ruby<int>(a[1]));
223
- ASSERT_EQUAL(44, from_ruby<int>(a[2]));
234
+ ASSERT_EQUAL(42, detail::From_Ruby<int>().convert(a[0].value()));
235
+ ASSERT_EQUAL(43, detail::From_Ruby<int>().convert(a[1].value()));
236
+ ASSERT_EQUAL(44, detail::From_Ruby<int>().convert(a[2].value()));
224
237
  ASSERT_EQUAL(3u, v.size());
225
238
  ASSERT_EQUAL(Object(a[0]).to_s(), v[0]);
226
239
  ASSERT_EQUAL(Object(a[1]).to_s(), v[1]);
227
240
  ASSERT_EQUAL(Object(a[2]).to_s(), v[2]);
228
241
  }
242
+ */
243
+
244
+ TESTCASE(find_if)
245
+ {
246
+ Array rubyValues;
247
+ rubyValues.push(42);
248
+ rubyValues.push(43);
249
+ rubyValues.push(44);
250
+
251
+ auto iter = std::find_if(rubyValues.begin(), rubyValues.end(),
252
+ [&rubyValues](const Object& object)
253
+ {
254
+ return object == rubyValues[1];
255
+ });
256
+
257
+ ASSERT_EQUAL(43, detail::From_Ruby<int>().convert(iter->value()));
258
+ }
229
259
 
230
260
  TESTCASE(assign_int)
231
261
  {
232
262
  Array a;
233
263
  a.push(42);
234
264
  a[0] = 10;
235
- ASSERT_EQUAL(10, from_ruby<int>(a[0]));
265
+ ASSERT_EQUAL(10, detail::From_Ruby<int>().convert(a[0].value()));
236
266
  }
237
267
 
238
268
  /**
@@ -247,3 +277,29 @@ namespace {
247
277
  TESTCASE(use_array_in_wrapped_function) {
248
278
  define_global_function("test_array_arg", &testArrayArg);
249
279
  }
280
+
281
+ TESTCASE(array_to_ruby)
282
+ {
283
+ Array a(rb_ary_new());
284
+ ASSERT(rb_equal(a.value(), detail::to_ruby(a)));
285
+ }
286
+
287
+ TESTCASE(array_ref_to_ruby)
288
+ {
289
+ Array a(rb_ary_new());
290
+ Array& ref = a;
291
+ ASSERT(rb_equal(a.value(), detail::to_ruby(ref)));
292
+ }
293
+
294
+ TESTCASE(array_ptr_to_ruby)
295
+ {
296
+ Array a(rb_ary_new());
297
+ Array* ptr = &a;
298
+ ASSERT(rb_equal(a.value(), detail::to_ruby(ptr)));
299
+ }
300
+
301
+ TESTCASE(array_from_ruby)
302
+ {
303
+ Array a(rb_ary_new());
304
+ ASSERT_EQUAL(a, detail::From_Ruby<Array>().convert(a));
305
+ }
@@ -0,0 +1,147 @@
1
+ #include <assert.h>
2
+
3
+ #include "unittest.hpp"
4
+ #include "embed_ruby.hpp"
5
+ #include <rice/rice.hpp>
6
+ #include <rice/stl.hpp>
7
+
8
+ using namespace Rice;
9
+
10
+ TESTSUITE(Attribute);
11
+
12
+ SETUP(Attribute)
13
+ {
14
+ embed_ruby();
15
+ }
16
+
17
+ namespace
18
+ {
19
+ class SomeClass
20
+ {
21
+ };
22
+
23
+ struct DataStruct
24
+ {
25
+ static inline float staticFloat = 1.0;
26
+ static inline const std::string staticString = "Static string";
27
+ static inline SomeClass someClassStatic;
28
+
29
+ std::string readWriteString = "Read Write";
30
+ int writeInt = 0;
31
+ const char* readChars = "Read some chars!";
32
+ SomeClass someClass;
33
+
34
+ std::string inspect()
35
+ {
36
+ return "";
37
+ }
38
+ };
39
+
40
+ bool globalBool = true;
41
+ const DataStruct* globalStruct = new DataStruct();
42
+
43
+ } // namespace
44
+
45
+ TESTCASE(attributes)
46
+ {
47
+ Class c = define_class<DataStruct>("DataStruct")
48
+ .define_constructor(Constructor<DataStruct>())
49
+ .define_method("inspect", &DataStruct::inspect)
50
+ .define_attr("read_chars", &DataStruct::readChars, Rice::AttrAccess::Read)
51
+ .define_attr("write_int", &DataStruct::writeInt, Rice::AttrAccess::Write)
52
+ .define_attr("read_write_string", &DataStruct::readWriteString);
53
+
54
+ Object o = c.call("new");
55
+ DataStruct* dataStruct = detail::From_Ruby<DataStruct*>().convert(o);
56
+
57
+ // Test readonly attribute
58
+ Object result = o.call("read_chars");
59
+ ASSERT_EQUAL("Read some chars!", detail::From_Ruby<char*>().convert(result));
60
+ ASSERT_EXCEPTION_CHECK(
61
+ Exception,
62
+ o.call("read_char=", "some text"),
63
+ ASSERT_EQUAL("undefined method `read_char=' for :DataStruct", ex.what())
64
+ );
65
+
66
+ // Test writeonly attribute
67
+ result = o.call("write_int=", 5);
68
+ ASSERT_EQUAL(5, detail::From_Ruby<int>().convert(result.value()));
69
+ ASSERT_EQUAL(5, dataStruct->writeInt);
70
+ ASSERT_EXCEPTION_CHECK(
71
+ Exception,
72
+ o.call("write_int", 3),
73
+ ASSERT_EQUAL("undefined method `write_int' for :DataStruct", ex.what())
74
+ );
75
+
76
+ // Test readwrite attribute
77
+ result = o.call("read_write_string=", "Set a string");
78
+ ASSERT_EQUAL("Set a string", detail::From_Ruby<std::string>().convert(result.value()));
79
+ ASSERT_EQUAL("Set a string", dataStruct->readWriteString);
80
+
81
+ result = o.call("read_write_string");
82
+ ASSERT_EQUAL("Set a string", detail::From_Ruby<std::string>().convert(result.value()));
83
+ }
84
+
85
+ TESTCASE(static_attributes)
86
+ {
87
+ Class c = define_class<DataStruct>("DataStruct")
88
+ .define_constructor(Constructor<DataStruct>())
89
+ .define_singleton_attr("static_float", &DataStruct::staticFloat, Rice::AttrAccess::ReadWrite)
90
+ .define_singleton_attr("static_string", &DataStruct::staticString, Rice::AttrAccess::Read);
91
+
92
+ // Test readwrite attribute
93
+ Object result = c.call("static_float=", 7.0);
94
+ ASSERT_EQUAL(7.0, detail::From_Ruby<float>().convert(result.value()));
95
+ ASSERT_EQUAL(7.0, DataStruct::staticFloat);
96
+ result = c.call("static_float");
97
+ ASSERT_EQUAL(7.0, detail::From_Ruby<float>().convert(result.value()));
98
+
99
+ result = c.call("static_string");
100
+ ASSERT_EQUAL("Static string", detail::From_Ruby<std::string>().convert(result.value()));
101
+ ASSERT_EXCEPTION_CHECK(
102
+ Exception,
103
+ c.call("static_string=", true),
104
+ ASSERT_EQUAL("undefined method `static_string=' for DataStruct:Class", ex.what())
105
+ );
106
+ }
107
+
108
+ TESTCASE(global_attributes)
109
+ {
110
+ Class c = define_class<DataStruct>("DataStruct")
111
+ .define_constructor(Constructor<DataStruct>())
112
+ .define_singleton_attr("global_bool", &globalBool, Rice::AttrAccess::ReadWrite)
113
+ .define_singleton_attr("global_struct", &globalStruct, Rice::AttrAccess::Read);
114
+
115
+ Object result = c.call("global_bool=", false);
116
+ ASSERT_EQUAL(Qfalse, result.value());
117
+ ASSERT_EQUAL(false, globalBool);
118
+ result = c.call("global_bool");
119
+ ASSERT_EQUAL(Qfalse, result.value());
120
+
121
+ result = c.call("global_struct");
122
+ DataStruct* aStruct = detail::From_Ruby<DataStruct*>().convert(result.value());
123
+ ASSERT_EQUAL(aStruct, globalStruct);
124
+ }
125
+
126
+ TESTCASE(not_defined)
127
+ {
128
+ Data_Type<DataStruct> c = define_class<DataStruct>("DataStruct");
129
+
130
+ #ifdef _MSC_VER
131
+ const char* message = "Type is not defined with Rice: class `anonymous namespace'::SomeClass";
132
+ #else
133
+ const char* message = "Type is not defined with Rice: (anonymous namespace)::SomeClass";
134
+ #endif
135
+
136
+ ASSERT_EXCEPTION_CHECK(
137
+ std::invalid_argument,
138
+ c.define_singleton_attr("some_class_static", &DataStruct::someClassStatic),
139
+ ASSERT_EQUAL(message, ex.what())
140
+ );
141
+
142
+ ASSERT_EXCEPTION_CHECK(
143
+ std::invalid_argument,
144
+ c.define_attr("some_class", &DataStruct::someClass),
145
+ ASSERT_EQUAL(message, ex.what())
146
+ );
147
+ }
@@ -1,7 +1,6 @@
1
1
  #include "unittest.hpp"
2
2
  #include "embed_ruby.hpp"
3
- #include "rice/Builtin_Object.hpp"
4
- #include "rice/Class.hpp"
3
+ #include <rice/rice.hpp>
5
4
 
6
5
  using namespace Rice;
7
6
 
@@ -35,6 +34,39 @@ TESTCASE(copy_construct)
35
34
  ASSERT_EQUAL(rb_cObject, CLASS_OF(b2.value()));
36
35
  }
37
36
 
37
+ TESTCASE(copy_assign)
38
+ {
39
+ Class c(rb_cObject);
40
+ Builtin_Object<T_OBJECT> b1(c.call("new"));
41
+ Builtin_Object<T_OBJECT> b2(c.call("new"));
42
+
43
+ b2 = b1;
44
+
45
+ ASSERT_EQUAL(b2.value(), b1.value());
46
+ }
47
+
48
+ TESTCASE(move_constructor)
49
+ {
50
+ Class c(rb_cObject);
51
+ Builtin_Object<T_OBJECT> b1(c.call("new"));
52
+ Builtin_Object<T_OBJECT> b2(std::move(b1));
53
+
54
+ ASSERT_NOT_EQUAL(b2.value(), b1.value());
55
+ ASSERT_EQUAL(b1.value(), Qnil);
56
+ }
57
+
58
+ TESTCASE(move_assign)
59
+ {
60
+ Class c(rb_cObject);
61
+ Builtin_Object<T_OBJECT> b1(c.call("new"));
62
+ Builtin_Object<T_OBJECT> b2(c.call("new"));
63
+
64
+ b2 = std::move(b1);
65
+
66
+ ASSERT_NOT_EQUAL(b2.value(), b1.value());
67
+ ASSERT_EQUAL(b1.value(), Qnil);
68
+ }
69
+
38
70
  TESTCASE(dereference)
39
71
  {
40
72
  Class c(rb_cObject);
@@ -58,15 +90,3 @@ TESTCASE(get)
58
90
  Builtin_Object<T_OBJECT> b(o);
59
91
  ASSERT_EQUAL(ROBJECT(o.value()), b.get());
60
92
  }
61
-
62
- TESTCASE(swap)
63
- {
64
- Class c(rb_cObject);
65
- Object o1(c.call("new"));
66
- Builtin_Object<T_OBJECT> b1(o1);
67
- Object o2(c.call("new"));
68
- Builtin_Object<T_OBJECT> b2(o2);
69
- b1.swap(b2);
70
- ASSERT_EQUAL(b1.value(), o2.value());
71
- ASSERT_EQUAL(b2.value(), o1.value());
72
- }