rice 3.0.0 → 4.0.0

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 (237) 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/lib/mkmf-rice.rb +127 -0
  9. data/lib/version.rb +3 -0
  10. data/rice/Address_Registration_Guard.ipp +75 -32
  11. data/rice/Address_Registration_Guard_defn.hpp +60 -56
  12. data/rice/Arg.hpp +80 -4
  13. data/rice/Arg.ipp +51 -0
  14. data/rice/Constructor.hpp +12 -14
  15. data/rice/Data_Object.ipp +234 -107
  16. data/rice/Data_Object_defn.hpp +77 -117
  17. data/rice/Data_Type.hpp +1 -2
  18. data/rice/Data_Type.ipp +251 -295
  19. data/rice/Data_Type_defn.hpp +175 -243
  20. data/rice/Director.hpp +11 -6
  21. data/rice/Enum.hpp +54 -104
  22. data/rice/Enum.ipp +104 -230
  23. data/rice/Exception.hpp +2 -8
  24. data/rice/Exception.ipp +65 -0
  25. data/rice/Exception_defn.hpp +46 -47
  26. data/rice/Identifier.hpp +28 -28
  27. data/rice/Identifier.ipp +23 -27
  28. data/rice/Return.hpp +39 -0
  29. data/rice/Return.ipp +33 -0
  30. data/rice/detail/Exception_Handler.ipp +22 -62
  31. data/rice/detail/Exception_Handler_defn.hpp +76 -91
  32. data/rice/detail/Iterator.hpp +18 -88
  33. data/rice/detail/Iterator.ipp +47 -0
  34. data/rice/detail/Jump_Tag.hpp +21 -0
  35. data/rice/detail/MethodInfo.hpp +44 -0
  36. data/rice/detail/MethodInfo.ipp +78 -0
  37. data/rice/detail/NativeAttribute.hpp +53 -0
  38. data/rice/detail/NativeAttribute.ipp +83 -0
  39. data/rice/detail/NativeFunction.hpp +69 -0
  40. data/rice/detail/NativeFunction.ipp +248 -0
  41. data/rice/detail/RubyFunction.hpp +39 -0
  42. data/rice/detail/RubyFunction.ipp +92 -0
  43. data/rice/detail/Type.hpp +29 -0
  44. data/rice/detail/Type.ipp +138 -0
  45. data/rice/detail/TypeRegistry.hpp +50 -0
  46. data/rice/detail/TypeRegistry.ipp +106 -0
  47. data/rice/detail/Wrapper.hpp +51 -0
  48. data/rice/detail/Wrapper.ipp +151 -0
  49. data/rice/detail/default_allocation_func.hpp +8 -19
  50. data/rice/detail/default_allocation_func.ipp +9 -8
  51. data/rice/detail/from_ruby.hpp +2 -37
  52. data/rice/detail/from_ruby.ipp +1020 -46
  53. data/rice/detail/from_ruby_defn.hpp +38 -0
  54. data/rice/detail/function_traits.hpp +124 -0
  55. data/rice/detail/method_data.hpp +23 -15
  56. data/rice/detail/method_data.ipp +53 -0
  57. data/rice/detail/rice_traits.hpp +116 -0
  58. data/rice/detail/ruby.hpp +9 -46
  59. data/rice/detail/to_ruby.hpp +3 -17
  60. data/rice/detail/to_ruby.ipp +409 -31
  61. data/rice/detail/to_ruby_defn.hpp +48 -0
  62. data/rice/forward_declares.ipp +82 -0
  63. data/rice/global_function.hpp +16 -20
  64. data/rice/global_function.ipp +8 -17
  65. data/rice/rice.hpp +59 -0
  66. data/rice/ruby_mark.hpp +5 -3
  67. data/rice/ruby_try_catch.hpp +4 -4
  68. data/rice/stl.hpp +11 -0
  69. data/sample/callbacks/extconf.rb +3 -0
  70. data/sample/callbacks/sample_callbacks.cpp +10 -13
  71. data/sample/enum/extconf.rb +3 -0
  72. data/sample/enum/sample_enum.cpp +3 -17
  73. data/sample/enum/test.rb +2 -2
  74. data/sample/inheritance/animals.cpp +8 -24
  75. data/sample/inheritance/extconf.rb +3 -0
  76. data/sample/inheritance/test.rb +1 -1
  77. data/sample/map/extconf.rb +3 -0
  78. data/sample/map/map.cpp +10 -18
  79. data/sample/map/test.rb +1 -1
  80. data/test/embed_ruby.cpp +18 -5
  81. data/test/ext/t1/extconf.rb +3 -0
  82. data/test/ext/t1/t1.cpp +1 -3
  83. data/test/ext/t2/extconf.rb +3 -0
  84. data/test/ext/t2/t2.cpp +1 -1
  85. data/test/extconf.rb +23 -0
  86. data/test/ruby/test_callbacks_sample.rb +28 -0
  87. data/test/ruby/test_multiple_extensions.rb +18 -0
  88. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  89. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  90. data/test/test_Address_Registration_Guard.cpp +23 -10
  91. data/test/test_Array.cpp +129 -73
  92. data/test/test_Attribute.cpp +147 -0
  93. data/test/test_Builtin_Object.cpp +34 -14
  94. data/test/test_Class.cpp +149 -275
  95. data/test/test_Constructor.cpp +10 -9
  96. data/test/test_Data_Object.cpp +133 -192
  97. data/test/test_Data_Type.cpp +322 -252
  98. data/test/test_Director.cpp +54 -41
  99. data/test/test_Enum.cpp +228 -103
  100. data/test/test_Exception.cpp +5 -6
  101. data/test/test_Hash.cpp +31 -30
  102. data/test/test_Identifier.cpp +4 -5
  103. data/test/test_Inheritance.cpp +221 -0
  104. data/test/test_Iterator.cpp +161 -0
  105. data/test/test_Jump_Tag.cpp +1 -1
  106. data/test/test_Keep_Alive.cpp +161 -0
  107. data/test/test_Memory_Management.cpp +2 -4
  108. data/test/test_Module.cpp +167 -110
  109. data/test/test_Object.cpp +41 -21
  110. data/test/test_Ownership.cpp +275 -0
  111. data/test/test_Self.cpp +205 -0
  112. data/test/test_Stl_Optional.cpp +90 -0
  113. data/test/test_Stl_Pair.cpp +144 -0
  114. data/test/test_Stl_SmartPointer.cpp +200 -0
  115. data/test/test_Stl_String.cpp +74 -0
  116. data/test/test_Stl_Vector.cpp +652 -0
  117. data/test/test_String.cpp +1 -2
  118. data/test/test_Struct.cpp +29 -39
  119. data/test/test_Symbol.cpp +1 -2
  120. data/test/test_To_From_Ruby.cpp +249 -285
  121. data/test/test_global_functions.cpp +39 -19
  122. data/test/unittest.hpp +0 -4
  123. metadata +63 -139
  124. data/Doxyfile +0 -2268
  125. data/Makefile.am +0 -26
  126. data/Makefile.in +0 -931
  127. data/README.mingw +0 -8
  128. data/aclocal.m4 +0 -1085
  129. data/ax_cxx_compile_stdcxx.m4 +0 -951
  130. data/bootstrap +0 -8
  131. data/config.guess +0 -1421
  132. data/config.sub +0 -1807
  133. data/configure +0 -7792
  134. data/configure.ac +0 -55
  135. data/depcomp +0 -791
  136. data/doxygen.ac +0 -314
  137. data/doxygen.am +0 -186
  138. data/extconf.rb +0 -70
  139. data/install-sh +0 -501
  140. data/missing +0 -215
  141. data/post-autoconf.rb +0 -22
  142. data/post-automake.rb +0 -28
  143. data/rice/Address_Registration_Guard.cpp +0 -22
  144. data/rice/Arg_impl.hpp +0 -129
  145. data/rice/Arg_operators.cpp +0 -21
  146. data/rice/Arg_operators.hpp +0 -19
  147. data/rice/Array.hpp +0 -214
  148. data/rice/Array.ipp +0 -256
  149. data/rice/Builtin_Object.hpp +0 -8
  150. data/rice/Builtin_Object.ipp +0 -50
  151. data/rice/Builtin_Object_defn.hpp +0 -50
  152. data/rice/Class.cpp +0 -57
  153. data/rice/Class.hpp +0 -8
  154. data/rice/Class.ipp +0 -6
  155. data/rice/Class_defn.hpp +0 -84
  156. data/rice/Data_Type.cpp +0 -54
  157. data/rice/Data_Type_fwd.hpp +0 -12
  158. data/rice/Director.cpp +0 -13
  159. data/rice/Exception.cpp +0 -54
  160. data/rice/Exception_Base.hpp +0 -8
  161. data/rice/Exception_Base.ipp +0 -13
  162. data/rice/Exception_Base_defn.hpp +0 -27
  163. data/rice/Hash.hpp +0 -230
  164. data/rice/Hash.ipp +0 -329
  165. data/rice/Identifier.cpp +0 -8
  166. data/rice/Jump_Tag.hpp +0 -24
  167. data/rice/Makefile.am +0 -121
  168. data/rice/Makefile.in +0 -884
  169. data/rice/Module.cpp +0 -84
  170. data/rice/Module.hpp +0 -8
  171. data/rice/Module.ipp +0 -6
  172. data/rice/Module_defn.hpp +0 -88
  173. data/rice/Module_impl.hpp +0 -281
  174. data/rice/Module_impl.ipp +0 -345
  175. data/rice/Object.cpp +0 -169
  176. data/rice/Object.hpp +0 -8
  177. data/rice/Object.ipp +0 -33
  178. data/rice/Object_defn.hpp +0 -214
  179. data/rice/Require_Guard.hpp +0 -21
  180. data/rice/String.cpp +0 -89
  181. data/rice/String.hpp +0 -91
  182. data/rice/Struct.cpp +0 -117
  183. data/rice/Struct.hpp +0 -162
  184. data/rice/Struct.ipp +0 -26
  185. data/rice/Symbol.cpp +0 -25
  186. data/rice/Symbol.hpp +0 -66
  187. data/rice/Symbol.ipp +0 -44
  188. data/rice/config.hpp +0 -47
  189. data/rice/config.hpp.in +0 -46
  190. data/rice/detail/Arguments.hpp +0 -118
  191. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  192. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3181
  193. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  194. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2501
  195. data/rice/detail/Caster.hpp +0 -103
  196. data/rice/detail/Not_Copyable.hpp +0 -25
  197. data/rice/detail/Wrapped_Function.hpp +0 -33
  198. data/rice/detail/cfp.hpp +0 -24
  199. data/rice/detail/cfp.ipp +0 -51
  200. data/rice/detail/check_ruby_type.cpp +0 -27
  201. data/rice/detail/check_ruby_type.hpp +0 -23
  202. data/rice/detail/creation_funcs.hpp +0 -37
  203. data/rice/detail/creation_funcs.ipp +0 -36
  204. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  205. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  206. data/rice/detail/demangle.cpp +0 -56
  207. data/rice/detail/demangle.hpp +0 -19
  208. data/rice/detail/env.hpp +0 -11
  209. data/rice/detail/method_data.cpp +0 -92
  210. data/rice/detail/node.hpp +0 -13
  211. data/rice/detail/protect.cpp +0 -29
  212. data/rice/detail/protect.hpp +0 -34
  213. data/rice/detail/ruby_version_code.hpp +0 -6
  214. data/rice/detail/ruby_version_code.hpp.in +0 -6
  215. data/rice/detail/st.hpp +0 -22
  216. data/rice/detail/win32.hpp +0 -16
  217. data/rice/detail/wrap_function.hpp +0 -66
  218. data/rice/protect.hpp +0 -38
  219. data/rice/protect.ipp +0 -1134
  220. data/rice/rubypp.rb +0 -97
  221. data/rice/to_from_ruby.hpp +0 -8
  222. data/rice/to_from_ruby.ipp +0 -418
  223. data/rice/to_from_ruby_defn.hpp +0 -70
  224. data/ruby.ac +0 -135
  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/sample/Makefile.am +0 -53
  232. data/sample/Makefile.in +0 -495
  233. data/test/Makefile.am +0 -73
  234. data/test/Makefile.in +0 -1219
  235. data/test/ext/Makefile.am +0 -41
  236. data/test/ext/Makefile.in +0 -483
  237. data/test/test_rice.rb +0 -45
@@ -1,43 +1,31 @@
1
- #include "rice/Data_Type.hpp"
2
- #include "rice/Constructor.hpp"
1
+ #include <rice/rice.hpp>
3
2
 
4
3
  using namespace Rice;
5
4
 
6
5
  class Organism
7
6
  {
8
7
  public:
9
- virtual ~Organism() = 0;
8
+ virtual ~Organism() = default;
10
9
  virtual char const * name() = 0;
11
10
  };
12
11
 
13
- Organism::
14
- ~Organism()
15
- {
16
- }
17
-
18
12
  class Animal
19
13
  : public Organism
20
14
  {
21
15
  public:
22
- virtual ~Animal() = 0;
23
16
  virtual char const * speak() = 0;
24
17
  };
25
18
 
26
- Animal::
27
- ~Animal()
28
- {
29
- }
30
-
31
19
  class Bear
32
20
  : public Animal
33
21
  {
34
22
  public:
35
- virtual char const * name()
23
+ char const * name() override
36
24
  {
37
25
  return "Bear";
38
26
  }
39
27
 
40
- virtual char const * speak()
28
+ char const * speak() override
41
29
  {
42
30
  return "I'm smarter than the average bear";
43
31
  }
@@ -47,12 +35,12 @@ class Dog
47
35
  : public Animal
48
36
  {
49
37
  public:
50
- virtual char const * name()
38
+ char const * name() override
51
39
  {
52
40
  return "Dog";
53
41
  }
54
42
 
55
- virtual char const * speak()
43
+ char const * speak() override
56
44
  {
57
45
  return "Woof woof";
58
46
  }
@@ -62,12 +50,12 @@ class Rabbit
62
50
  : public Animal
63
51
  {
64
52
  public:
65
- virtual char const * name()
53
+ char const * name() override
66
54
  {
67
55
  return "Rabbit";
68
56
  }
69
57
 
70
- virtual char const * speak()
58
+ char const * speak() override
71
59
  {
72
60
  return "What's up, doc?";
73
61
  }
@@ -76,8 +64,6 @@ public:
76
64
  extern "C"
77
65
  void Init_animals(void)
78
66
  {
79
- RUBY_TRY
80
- {
81
67
  define_class<Organism>("Organism")
82
68
  .define_method("name", &Organism::name);
83
69
 
@@ -92,7 +78,5 @@ void Init_animals(void)
92
78
 
93
79
  define_class<Rabbit, Animal>("Rabbit")
94
80
  .define_constructor(Constructor<Rabbit>());
95
- }
96
- RUBY_CATCH
97
81
  }
98
82
 
@@ -1,3 +1,6 @@
1
+ require 'bundler/setup'
2
+ require 'rice'
1
3
  require 'mkmf-rice'
4
+
2
5
  create_makefile('animals')
3
6
 
@@ -1,4 +1,4 @@
1
- require 'animals'
1
+ require_relative 'animals'
2
2
 
3
3
  [ Bear, Dog, Rabbit].each do |klass|
4
4
  animal = klass.new
@@ -1,3 +1,6 @@
1
+ require 'bundler/setup'
2
+ require 'rice'
1
3
  require 'mkmf-rice'
4
+
2
5
  create_makefile('map')
3
6
 
data/sample/map/map.cpp CHANGED
@@ -1,5 +1,4 @@
1
- #include "rice/Data_Type.hpp"
2
- #include "rice/Constructor.hpp"
1
+ #include <rice/rice.hpp>
3
2
 
4
3
  #include <map>
5
4
 
@@ -45,37 +44,30 @@ private:
45
44
  Value_Map map_;
46
45
  };
47
46
 
48
- Data_Type<Map> rb_cMap;
49
-
50
47
  } // namespace
51
48
 
52
49
  template<>
53
- Object to_ruby<Map::value_type>(Map::value_type const & p)
50
+ struct detail::To_Ruby<Map::value_type>
54
51
  {
55
- return protect(rb_assoc_new, p.first, p.second);
56
- }
52
+ static VALUE convert(Map::value_type const & pair)
53
+ {
54
+ return detail::protect(rb_assoc_new, pair.first.value(), pair.second.value());
55
+ }
56
+ };
57
57
 
58
58
  #include <iostream>
59
59
  extern "C"
60
60
  void Init_map(void)
61
61
  {
62
- RUBY_TRY
63
- {
64
- Map::iterator (Map::*begin)() = &Map::begin;
65
- Map::iterator (Map::*end)() = &Map::end;
66
62
  Rice::Module rb_mStd = define_module("Std");
67
63
 
68
64
  // TODO: no delete method on the map, because I'm not sure how to
69
65
  // make delete work properly while iterating
70
- rb_cMap =
66
+ Data_Type<Map> rb_cMap =
71
67
  define_class_under<Map>(rb_mStd, "Map")
72
68
  .define_constructor(Constructor<Map>())
73
69
  .define_method("[]", &Map::bracket)
74
70
  .define_method("[]=", &Map::bracket_equals)
75
- .define_iterator(begin, end)
76
- .include_module(rb_mEnumerable)
77
- ;
78
- }
79
- RUBY_CATCH
71
+ .define_iterator(&Map::begin, &Map::end)
72
+ .include_module(rb_mEnumerable);
80
73
  }
81
-
data/sample/map/test.rb CHANGED
@@ -1,4 +1,4 @@
1
- require 'map'
1
+ require_relative 'map.so'
2
2
  m = Std::Map.new
3
3
  m[0] = 1
4
4
  m[1] = 2
data/test/embed_ruby.cpp CHANGED
@@ -1,4 +1,5 @@
1
- #include <ruby.h>
1
+ #include <rice/rice.hpp>
2
+ #include <ruby/version.h>
2
3
 
3
4
  void embed_ruby()
4
5
  {
@@ -7,15 +8,27 @@ void embed_ruby()
7
8
  if (!initialized__)
8
9
  {
9
10
  int argc = 0;
10
- char* argv = (char*)malloc(1);
11
- argv[0] = 0;
11
+ char* argv = nullptr;
12
12
  char** pArgv = &argv;
13
13
 
14
14
  ruby_sysinit(&argc, &pArgv);
15
- RUBY_INIT_STACK;
16
15
  ruby_init();
17
16
  ruby_init_loadpath();
18
17
 
19
18
  initialized__ = true;
19
+
20
+ // Because Ruby 3 no longer initializes the GC module when embedding, calling GC.stress
21
+ // results in a crash.
22
+ // See https://bugs.ruby-lang.org/issues/17643
23
+ if (RUBY_API_VERSION_MAJOR == 3 &&
24
+ RUBY_API_VERSION_MINOR == 0 &&
25
+ RUBY_API_VERSION_TEENY == 0)
26
+ {
27
+ // do nothing
28
+ }
29
+ else
30
+ {
31
+ rb_eval_string("GC.stress = true");
32
+ }
20
33
  }
21
- }
34
+ }
@@ -1,2 +1,5 @@
1
+ require 'bundler/setup'
2
+ require 'rice'
1
3
  require 'mkmf-rice'
4
+
2
5
  create_makefile('t1')
data/test/ext/t1/t1.cpp CHANGED
@@ -1,7 +1,5 @@
1
1
  #include "Foo.hpp"
2
-
3
- #include "rice/Data_Type.hpp"
4
- #include "rice/Constructor.hpp"
2
+ #include <rice/rice.hpp>
5
3
 
6
4
  using namespace Rice;
7
5
 
@@ -1,2 +1,5 @@
1
+ require 'bundler/setup'
2
+ require 'rice'
1
3
  require 'mkmf-rice'
4
+
2
5
  create_makefile('t2')
data/test/ext/t2/t2.cpp CHANGED
@@ -1,5 +1,5 @@
1
1
  #include "../t1/Foo.hpp"
2
- #include "rice/Data_Type.hpp"
2
+ #include <rice/rice.hpp>
3
3
 
4
4
  using namespace Rice;
5
5
 
data/test/extconf.rb ADDED
@@ -0,0 +1,23 @@
1
+ require 'bundler/setup'
2
+ require 'rice'
3
+ require 'mkmf-rice'
4
+ require 'rbconfig'
5
+
6
+ # Totally hack mkmf to make a unittest executable instead of a shared library
7
+ target_exe = "unittest#{RbConfig::CONFIG['EXEEXT']}"
8
+ $cleanfiles << target_exe
9
+
10
+ create_makefile(target_exe) do |conf|
11
+ conf << "\n"
12
+ conf << "#{target_exe}: $(OBJS)"
13
+ conf << "\t$(ECHO) linking executable unittest"
14
+ conf << "\t-$(Q)$(RM) $(@)"
15
+
16
+ if IS_MSWIN
17
+ conf << "\t$(Q) $(CXX) -Fe$(@) $(OBJS) $(LIBS) $(LOCAL_LIBS) -link $(ldflags) $(LIBPATH)"
18
+ else
19
+ conf << "\t$(Q) $(CXX) -o $@ $(OBJS) $(LIBPATH) $(LOCAL_LIBS) $(LIBS)"
20
+ end
21
+
22
+ conf << "\n"
23
+ end
@@ -0,0 +1,28 @@
1
+ $: << File.join(File.dirname(__FILE__), '..', 'sample')
2
+
3
+ require 'rubygems'
4
+ gem 'minitest'
5
+ require 'minitest/autorun'
6
+ require_relative '../../sample/callbacks/sample_callbacks'
7
+
8
+ class CallbacksTest < Minitest::Test
9
+ def test_callbacks_sample_lambda
10
+ cb = CallbackHolder.new
11
+ cb.register_callback(lambda do |param|
12
+ "Callback got: #{param}"
13
+ end)
14
+
15
+ assert_equal "Callback got: Hello", cb.fire_callback("Hello")
16
+ end
17
+
18
+ def hello_world(param)
19
+ "Method got: #{param}"
20
+ end
21
+
22
+ def test_callbacks_sample_method
23
+ cb = CallbackHolder.new
24
+ cb.register_callback method(:hello_world)
25
+
26
+ assert_equal "Method got: Hello", cb.fire_callback("Hello")
27
+ end
28
+ end
@@ -0,0 +1,18 @@
1
+ $: << File.join(__dir__, '..', '..', 'sample')
2
+
3
+ require 'minitest'
4
+ require 'minitest/autorun'
5
+
6
+ class MultipleExtensionTest < Minitest::Test
7
+ def test_multiple_extensions
8
+ # Rinse
9
+ require 'map/map'
10
+ m = Std::Map.new
11
+ m[0] = 1
12
+
13
+ # And repeat
14
+ require 'enum/sample_enum'
15
+ m = Std::Map.new
16
+ m[0] = 1
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ $: << File.join(__dir__, '..', 'ext')
2
+
3
+ require 'minitest'
4
+ require 'minitest/autorun'
5
+
6
+ class MultipleExtensionsSameClassTest < Minitest::Test
7
+ def test_multiple_extensions_same_class
8
+ require 't1/t1'
9
+ require 't2/t2'
10
+
11
+ foo = Foo.new
12
+ assert_equal 42, foo.foo
13
+ end
14
+ end
@@ -0,0 +1,20 @@
1
+ $: << File.join(__dir__, '..', '..', 'sample')
2
+ # Load a library that uses inheritance
3
+ require 'inheritance/animals'
4
+
5
+ # Then load a different library
6
+ require 'enum/sample_enum'
7
+
8
+ require 'minitest'
9
+ require 'minitest/autorun'
10
+
11
+ class MultipleExtensionTest < Minitest::Test
12
+ def test_multiple_extensions_with_inheritance
13
+
14
+ # And make sure we can call methods in the base class on a derived
15
+ # instance
16
+ dog = Dog.new
17
+ assert_equal dog.name, "Dog"
18
+ assert_equal dog.speak, "Woof woof"
19
+ end
20
+ end
@@ -1,6 +1,6 @@
1
1
  #include "unittest.hpp"
2
2
  #include "embed_ruby.hpp"
3
- #include "rice/Address_Registration_Guard.hpp"
3
+ #include <rice/rice.hpp>
4
4
 
5
5
  using namespace Rice;
6
6
 
@@ -30,15 +30,28 @@ TESTCASE(get_address)
30
30
  ASSERT_EQUAL(&v, g.address());
31
31
  }
32
32
 
33
- TESTCASE(swap)
33
+ TESTCASE(move_construct)
34
34
  {
35
- VALUE v = Qnil;
36
- VALUE v2 = Qnil;
37
- Address_Registration_Guard g(&v);
38
- Address_Registration_Guard g2(&v2);
39
- g.swap(g2);
40
- ASSERT_EQUAL(&v, g2.address());
41
- ASSERT_EQUAL(&v2, g.address());
42
- // TODO: ensure addresses are still registered
35
+ VALUE value = detail::to_ruby("Value 1");
36
+
37
+ Address_Registration_Guard guard1(&value);
38
+ Address_Registration_Guard guard2(std::move(guard1));
39
+
40
+ ASSERT((guard1.address() == nullptr));
41
+ ASSERT_EQUAL(&value, guard2.address());
42
+ }
43
+
44
+ TESTCASE(move_assign)
45
+ {
46
+ VALUE value1 = detail::to_ruby("Value 1");
47
+ VALUE value2 = detail::to_ruby("Value 2");
48
+
49
+ Address_Registration_Guard guard1(&value1);
50
+ Address_Registration_Guard guard2(&value2);
51
+
52
+ guard2 = std::move(guard1);
53
+
54
+ ASSERT((guard1.address() == nullptr));
55
+ ASSERT_EQUAL(&value1, guard2.address());
43
56
  }
44
57
 
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
+ }