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,8 +1,6 @@
1
1
  #include "unittest.hpp"
2
2
  #include "embed_ruby.hpp"
3
- #include "rice/Data_Object.hpp"
4
- #include "rice/Data_Type.hpp"
5
- #include "rice/Exception.hpp"
3
+ #include <rice/rice.hpp>
6
4
 
7
5
  using namespace Rice;
8
6
 
@@ -10,267 +8,210 @@ TESTSUITE(Data_Object);
10
8
 
11
9
  namespace
12
10
  {
13
- struct Foo { Foo() : x_(42) { } int x_; };
11
+ bool test_destructor_called = false;
12
+ bool test_ruby_mark_called = false;
14
13
 
15
- bool test_ruby_mark__marked = false;
14
+ struct MyDataType
15
+ {
16
+ MyDataType() : x(42)
17
+ {
18
+ }
19
+
20
+ ~MyDataType()
21
+ {
22
+ test_destructor_called = true;
23
+ }
24
+
25
+ int x;
26
+ };
27
+
28
+ struct Bar
29
+ {
30
+ };
16
31
  }
17
32
 
18
- template<>
19
- void ruby_mark(Foo * foo)
33
+ namespace Rice
20
34
  {
21
- test_ruby_mark__marked = true;
35
+ template<>
36
+ void ruby_mark(MyDataType* myDataType)
37
+ {
38
+ test_ruby_mark_called = true;
39
+ }
22
40
  }
23
41
 
24
42
  SETUP(Data_Object)
25
43
  {
26
44
  embed_ruby();
27
45
 
28
- if(!Data_Type<Foo>::is_bound())
46
+ if (!Data_Type<MyDataType>::is_bound())
29
47
  {
30
48
  Class object(rb_cObject);
31
- if(object.const_defined("Foo"))
49
+ if(object.const_defined("MyDataType"))
32
50
  {
33
- object.remove_const("Foo");
51
+ object.remove_const("MyDataType");
34
52
  }
35
53
 
36
- define_class<Foo>("Foo");
54
+ define_class<MyDataType>("MyDataType");
55
+ define_class<Bar>("Bar");
37
56
  }
38
57
  }
39
58
 
40
- TESTCASE(construct_from_pointer_with_defaults)
59
+ TESTCASE(construct_from_pointer)
41
60
  {
42
- Data_Type<Foo> rb_cFoo;
43
- Foo * foo = new Foo;
44
- Data_Object<Foo> wrapped_foo(foo);
45
- ASSERT_EQUAL(foo, wrapped_foo.get());
46
- ASSERT_EQUAL(Data_Type<Foo>::klass(), wrapped_foo.class_of());
47
- typedef void (*Mark_Func)(void *);
48
- typedef void (*Mark_Func_Foo)(Foo *);
49
- Mark_Func expected_mark_func =
50
- Mark_Func(Mark_Func_Foo(ruby_mark<Foo>));
51
- ASSERT_EQUAL(
52
- expected_mark_func,
53
- RDATA(wrapped_foo.value())->dmark);
54
- ASSERT_EQUAL(
55
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
56
- RUBY_DATA_FUNC(RDATA(wrapped_foo.value())->dfree));
57
- ASSERT_EQUAL(foo, DATA_PTR(wrapped_foo.value()));
61
+ MyDataType* myDataType = new MyDataType;
62
+ Data_Object<MyDataType> wrapped_foo(myDataType);
63
+ ASSERT_EQUAL(myDataType, wrapped_foo.get());
64
+ ASSERT_EQUAL(Data_Type<MyDataType>::klass(), wrapped_foo.class_of());
65
+ ASSERT_EQUAL(myDataType, detail::unwrap<MyDataType>(wrapped_foo, Data_Type<MyDataType>::rb_type()));
58
66
  }
59
67
 
60
- TESTCASE(construct_from_pointer_and_klass)
68
+ TESTCASE(construct_from_ruby_object)
61
69
  {
62
- Data_Type<Foo> rb_cFoo;
63
- Foo * foo = new Foo;
64
- Data_Object<Foo> wrapped_foo(foo, Data_Type<Foo>::klass());
65
- ASSERT_EQUAL(foo, wrapped_foo.get());
66
- ASSERT_EQUAL(Data_Type<Foo>::klass(), wrapped_foo.class_of());
67
- typedef void (*Mark_Func)(void *);
68
- typedef void (*Mark_Func_Foo)(Foo *);
69
- Mark_Func expected_mark_func =
70
- Mark_Func(Mark_Func_Foo(ruby_mark<Foo>));
71
- ASSERT_EQUAL(
72
- expected_mark_func,
73
- RDATA(wrapped_foo.value())->dmark);
74
- ASSERT_EQUAL(
75
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
76
- RUBY_DATA_FUNC(RDATA(wrapped_foo.value())->dfree));
77
- ASSERT_EQUAL(foo, DATA_PTR(wrapped_foo.value()));
78
- }
70
+ MyDataType * myDataType = new MyDataType;
71
+ VALUE wrapped_foo = detail::wrap(Data_Type<MyDataType>::klass(), Data_Type<MyDataType>::rb_type(), myDataType, true);
79
72
 
80
- TESTCASE(construct_from_pointer_and_alternate_klass)
81
- {
82
- Data_Type<Foo> rb_cFoo;
83
- Foo * foo = new Foo;
84
- Data_Object<Foo> wrapped_foo(foo, rb_cObject);
85
- ASSERT_EQUAL(foo, wrapped_foo.get());
86
- ASSERT_EQUAL(rb_cObject, CLASS_OF(wrapped_foo.value()));
87
- typedef void (*Mark_Func)(void *);
88
- typedef void (*Mark_Func_Foo)(Foo *);
89
- Mark_Func expected_mark_func =
90
- Mark_Func(Mark_Func_Foo(ruby_mark<Foo>));
91
- ASSERT_EQUAL(
92
- expected_mark_func,
93
- RDATA(wrapped_foo.value())->dmark);
94
- ASSERT_EQUAL(
95
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
96
- RUBY_DATA_FUNC(RDATA(wrapped_foo.value())->dfree));
97
- ASSERT_EQUAL(foo, DATA_PTR(wrapped_foo.value()));
73
+ Data_Object<MyDataType> data_object_foo(wrapped_foo);
74
+ ASSERT_EQUAL(myDataType, data_object_foo.get());
75
+ ASSERT_EQUAL(Data_Type<MyDataType>::klass(), data_object_foo.class_of());
76
+ ASSERT_EQUAL(RTYPEDDATA(wrapped_foo), RTYPEDDATA(data_object_foo.value()));
77
+ ASSERT_EQUAL(myDataType, detail::unwrap<MyDataType>(wrapped_foo, Data_Type<MyDataType>::rb_type()));
98
78
  }
99
79
 
100
- namespace
80
+ TESTCASE(construct_from_ruby_object_and_wrong_class)
101
81
  {
102
- void dummy_mark(Foo *)
103
- {
104
- }
105
- }
82
+ MyDataType * myDataType = new MyDataType;
83
+ VALUE wrapped_foo = detail::wrap(Data_Type<MyDataType>::klass(), Data_Type<MyDataType>::rb_type(), myDataType, true);
106
84
 
107
- TESTCASE(construct_from_pointer_and_klass_and_mark_function)
108
- {
109
- Data_Type<Foo> rb_cFoo;
110
- Foo * foo = new Foo;
111
- Data_Object<Foo> wrapped_foo(foo, rb_cFoo, dummy_mark);
112
- ASSERT_EQUAL(foo, wrapped_foo.get());
113
- ASSERT_EQUAL(Data_Type<Foo>::klass(), wrapped_foo.class_of());
114
- ASSERT_EQUAL((void *)dummy_mark, RDATA(wrapped_foo.value())->dmark);
115
- ASSERT_EQUAL(
116
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
117
- RUBY_DATA_FUNC(RDATA(wrapped_foo.value())->dfree));
118
- ASSERT_EQUAL(foo, DATA_PTR(wrapped_foo.value()));
119
- }
85
+ ASSERT_EXCEPTION_CHECK(
86
+ Exception,
87
+ Data_Object<Bar> bar(wrapped_foo),
88
+ ASSERT_EQUAL(rb_eTypeError, CLASS_OF(ex.value())));
120
89
 
121
- namespace
122
- {
123
- void my_free(Foo * f)
124
- {
125
- delete f;
126
- }
90
+ ASSERT_EXCEPTION_CHECK(
91
+ Exception,
92
+ Data_Object<Bar> bar(wrapped_foo),
93
+ ASSERT_EQUAL("Wrong argument type. Expected: Bar. Received: MyDataType.", ex.what()));
127
94
  }
128
95
 
129
- TESTCASE(construct_from_pointer_and_klass_and_mark_and_free)
96
+ TESTCASE(copy_construct)
130
97
  {
131
- Data_Type<Foo> rb_cFoo;
132
- Foo * foo = new Foo;
133
- Data_Object<Foo> wrapped_foo(foo, rb_cFoo, dummy_mark, my_free);
134
- ASSERT_EQUAL(foo, wrapped_foo.get());
135
- ASSERT_EQUAL(Data_Type<Foo>::klass(), wrapped_foo.class_of());
136
- ASSERT_EQUAL((void *)dummy_mark, RDATA(wrapped_foo.value())->dmark);
137
- ASSERT_EQUAL(
138
- RUBY_DATA_FUNC(my_free),
139
- RUBY_DATA_FUNC(RDATA(wrapped_foo.value())->dfree));
140
- ASSERT_EQUAL(foo, DATA_PTR(wrapped_foo.value()));
141
- }
98
+ MyDataType * myDataType = new MyDataType;
99
+ VALUE wrapped_foo = detail::wrap(Data_Type<MyDataType>::klass(), Data_Type<MyDataType>::rb_type(), myDataType, true);
100
+ Data_Object<MyDataType> orig_data_object_foo(wrapped_foo);
101
+ Data_Object<MyDataType> data_object_foo(orig_data_object_foo);
142
102
 
143
- TESTCASE(construct_from_ruby_object)
144
- {
145
- Foo * foo = new Foo;
146
- VALUE wrapped_foo = Data_Wrap_Struct(Data_Type<Foo>::klass(), 0, Default_Free_Function<Foo>::free, foo);
147
- Data_Object<Foo> data_object_foo(wrapped_foo);
148
- ASSERT_EQUAL(foo, data_object_foo.get());
149
- ASSERT_EQUAL(Data_Type<Foo>::klass(), data_object_foo.class_of());
150
- ASSERT_EQUAL(RDATA(wrapped_foo), RDATA(data_object_foo.value()));
151
- ASSERT_EQUAL(RUBY_DATA_FUNC(0), RDATA(data_object_foo.value())->dmark);
152
- ASSERT_EQUAL(
153
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
154
- RUBY_DATA_FUNC(RDATA(data_object_foo.value())->dfree));
155
- ASSERT_EQUAL(foo, DATA_PTR(data_object_foo.value()));
103
+ ASSERT_EQUAL(myDataType, data_object_foo.get());
104
+ ASSERT_EQUAL(Data_Type<MyDataType>::klass(), data_object_foo.class_of());
105
+ ASSERT_EQUAL(RTYPEDDATA(wrapped_foo), RTYPEDDATA(data_object_foo.value()));
106
+ ASSERT_EQUAL(myDataType, detail::unwrap<MyDataType>(wrapped_foo, Data_Type<MyDataType>::rb_type()));
156
107
  }
157
108
 
158
- TESTCASE(construct_from_ruby_object_and_class)
109
+ TESTCASE(move_construct)
159
110
  {
160
- Data_Type<Foo> rb_cFoo;
161
- Foo * foo = new Foo;
162
- VALUE wrapped_foo = Data_Wrap_Struct(Data_Type<Foo>::klass(), 0, Default_Free_Function<Foo>::free, foo);
163
- Data_Object<Foo> data_object_foo(wrapped_foo, rb_cFoo);
164
- ASSERT_EQUAL(foo, data_object_foo.get());
165
- ASSERT_EQUAL(Data_Type<Foo>::klass(), data_object_foo.class_of());
166
- ASSERT_EQUAL(RDATA(wrapped_foo), RDATA(data_object_foo.value()));
167
- ASSERT_EQUAL(RUBY_DATA_FUNC(0), RDATA(data_object_foo.value())->dmark);
168
- ASSERT_EQUAL(
169
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
170
- RUBY_DATA_FUNC(RDATA(data_object_foo.value())->dfree));
171
- ASSERT_EQUAL(foo, DATA_PTR(data_object_foo.value()));
172
- }
111
+ MyDataType* myDataType = new MyDataType;
173
112
 
174
- TESTCASE(construct_from_ruby_object_and_wrong_class)
175
- {
176
- Foo * foo = new Foo;
177
- Data_Type<Foo> rb_cFoo;
178
- VALUE wrapped_foo = Data_Wrap_Struct(rb_cObject, 0, Default_Free_Function<Foo>::free, foo);
179
- ASSERT_EXCEPTION_CHECK(
180
- Exception,
181
- Data_Object<Foo> data_object_foo(wrapped_foo, rb_cFoo),
182
- ASSERT_EQUAL(
183
- Object(rb_eTypeError),
184
- Object(CLASS_OF(ex.value()))
185
- )
186
- );
113
+ Data_Object<MyDataType> wrapper1(myDataType);
114
+ Data_Object<MyDataType> wrapper2(std::move(wrapper1));
115
+
116
+ ASSERT_EQUAL(myDataType, wrapper2.get());
117
+ ASSERT((wrapper1.get() == nullptr));
187
118
  }
188
119
 
189
- TESTCASE(copy_construct)
120
+ TESTCASE(move_assign)
190
121
  {
191
- Data_Type<Foo> rb_cFoo;
192
- Foo * foo = new Foo;
193
- VALUE wrapped_foo = Data_Wrap_Struct(Data_Type<Foo>::klass(), 0, Default_Free_Function<Foo>::free, foo);
194
- Data_Object<Foo> orig_data_object_foo(wrapped_foo, rb_cFoo);
195
- Data_Object<Foo> data_object_foo(orig_data_object_foo);
196
- ASSERT_EQUAL(foo, data_object_foo.get());
197
- ASSERT_EQUAL(Data_Type<Foo>::klass(), data_object_foo.class_of());
198
- ASSERT_EQUAL(RDATA(wrapped_foo), RDATA(data_object_foo.value()));
199
- ASSERT_EQUAL(RUBY_DATA_FUNC(0), RDATA(data_object_foo.value())->dmark);
200
- ASSERT_EQUAL(
201
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
202
- RUBY_DATA_FUNC(RDATA(data_object_foo.value())->dfree));
203
- ASSERT_EQUAL(foo, DATA_PTR(data_object_foo.value()));
122
+ MyDataType* foo1 = new MyDataType;
123
+ Data_Object<MyDataType> wrapper1(foo1);
124
+
125
+ MyDataType* foo2 = new MyDataType;
126
+ Data_Object<MyDataType> wrapper2(foo2);
127
+
128
+ wrapper2 = std::move(wrapper1);
129
+
130
+ ASSERT_EQUAL(foo1, wrapper2.get());
131
+ ASSERT((wrapper1.get() == nullptr));
204
132
  }
205
133
 
206
134
  TESTCASE(dereference)
207
135
  {
208
- Data_Type<Foo> rb_cFoo;
209
- Foo * foo = new Foo;
210
- Data_Object<Foo> wrapped_foo(foo);
211
- ASSERT_EQUAL(foo, &*wrapped_foo);
136
+ Data_Type<MyDataType> rb_cFoo;
137
+ MyDataType * myDataType = new MyDataType;
138
+ Data_Object<MyDataType> wrapped_foo(myDataType);
139
+ ASSERT_EQUAL(myDataType, &*wrapped_foo);
212
140
  }
213
141
 
214
142
  TESTCASE(arrow)
215
143
  {
216
- Data_Type<Foo> rb_cFoo;
217
- Foo * foo = new Foo;
218
- Data_Object<Foo> wrapped_foo(foo);
219
- ASSERT_EQUAL(42, foo->x_);
144
+ Data_Type<MyDataType> rb_cFoo;
145
+ MyDataType * myDataType = new MyDataType;
146
+ Data_Object<MyDataType> wrapped_foo(myDataType);
147
+ ASSERT_EQUAL(42, myDataType->x);
220
148
  }
221
149
 
222
150
  TESTCASE(get)
223
151
  {
224
- Data_Type<Foo> rb_cFoo;
225
- Foo * foo = new Foo;
226
- Data_Object<Foo> wrapped_foo(foo);
227
- ASSERT_EQUAL(foo, wrapped_foo.get());
152
+ Data_Type<MyDataType> rb_cFoo;
153
+ MyDataType * myDataType = new MyDataType;
154
+ Data_Object<MyDataType> wrapped_foo(myDataType);
155
+ ASSERT_EQUAL(myDataType, wrapped_foo.get());
228
156
  }
229
157
 
230
- // TODO: swap
231
-
232
158
  TESTCASE(to_ruby)
233
159
  {
234
- Data_Type<Foo> rb_cFoo;
235
- Foo * foo = new Foo;
236
- Data_Object<Foo> wrapped_foo(foo);
237
- ASSERT_EQUAL(wrapped_foo.value(), to_ruby(wrapped_foo).value());
160
+ Data_Type<MyDataType> rb_cFoo;
161
+ MyDataType * myDataType = new MyDataType;
162
+ Data_Object<MyDataType> wrapped_foo(myDataType);
163
+ ASSERT_EQUAL(String("MyDataType"), wrapped_foo.class_name());
238
164
  }
239
165
 
240
166
  TESTCASE(from_ruby)
241
167
  {
242
- Data_Type<Foo> rb_cFoo;
243
- Foo * foo = new Foo;
244
- Data_Object<Foo> wrapped_foo(foo);
245
- ASSERT_EQUAL(foo, from_ruby<Foo *>(wrapped_foo));
168
+ Data_Type<MyDataType> rb_cFoo;
169
+ MyDataType* myDataType = new MyDataType();
170
+ Data_Object<MyDataType> wrapped_foo(myDataType);
171
+ ASSERT_EQUAL(myDataType, wrapped_foo.get());
246
172
  }
247
173
 
248
174
  TESTCASE(from_ruby_const_ref)
249
175
  {
250
- Data_Type<Foo> rb_cFoo;
251
- Foo * foo = new Foo;
252
- Data_Object<Foo> wrapped_foo(foo);
253
- ASSERT_EQUAL(foo->x_, from_ruby<Foo const &>(wrapped_foo).x_);
176
+ Data_Type<MyDataType> rb_cFoo;
177
+ MyDataType * myDataType = new MyDataType;
178
+ Data_Object<MyDataType> wrapped_foo(myDataType);
179
+ ASSERT_EQUAL(myDataType->x, detail::From_Ruby<MyDataType const &>().convert(wrapped_foo).x);
254
180
  }
255
181
 
256
182
  TESTCASE(from_ruby_copy)
257
183
  {
258
- Data_Type<Foo> rb_cFoo;
259
- Foo * foo = new Foo;
260
- Data_Object<Foo> wrapped_foo(foo);
261
- ASSERT_EQUAL(foo->x_, from_ruby<Foo>(wrapped_foo).x_);
184
+ Data_Type<MyDataType> rb_cFoo;
185
+ MyDataType * myDataType = new MyDataType;
186
+ Data_Object<MyDataType> wrapped_foo(myDataType);
187
+ ASSERT_EQUAL(myDataType->x, detail::From_Ruby<MyDataType>().convert(wrapped_foo).x);
262
188
  }
263
189
 
264
- TESTCASE(ruby_mark)
190
+ TESTCASE(ruby_custom_mark)
265
191
  {
266
- Data_Type<Foo> rb_cFoo;
267
- Foo * foo = new Foo;
268
- Data_Object<Foo> wrapped_foo(foo);
269
-
270
- test_ruby_mark__marked = false;
192
+ test_ruby_mark_called = false;
271
193
 
194
+ MyDataType* myDataType = new MyDataType;
195
+ Data_Object<MyDataType> wrapped_foo(myDataType);
272
196
  rb_gc_start();
273
197
 
274
- ASSERT_EQUAL(true, test_ruby_mark__marked);
198
+ ASSERT_EQUAL(true, test_ruby_mark_called);
275
199
  }
276
200
 
201
+ TESTCASE(ruby_custom_free)
202
+ {
203
+ test_ruby_mark_called = false;
204
+ test_destructor_called = false;
205
+
206
+ MyDataType* myDataType = new MyDataType;
207
+ {
208
+ Data_Object<MyDataType> wrapped_foo(myDataType, true);
209
+ }
210
+
211
+ rb_gc_start();
212
+
213
+ ASSERT_EQUAL(true, test_destructor_called);
214
+ // This fails somtimes on Ubuntu with Ruby 2.5 and 2.6. The important thing is that the destructor
215
+ // gets called
216
+ // ASSERT_EQUAL(false, test_ruby_mark_called);
217
+ }