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,9 +1,7 @@
1
1
  #include "unittest.hpp"
2
2
  #include "embed_ruby.hpp"
3
- #include "rice/to_from_ruby.hpp"
4
- #include "rice/String.hpp"
5
- #include "rice/Array.hpp"
6
- #include "rice/Hash.hpp"
3
+ #include <rice/rice.hpp>
4
+
7
5
  #include <limits>
8
6
  #include <cmath>
9
7
 
@@ -19,411 +17,377 @@ SETUP(To_From_Ruby)
19
17
  TESTCASE(object_to_ruby)
20
18
  {
21
19
  Object o(rb_str_new2("foo"));
22
- ASSERT_EQUAL(o.value(), to_ruby(o).value());
20
+ ASSERT_EQUAL(o.value(), detail::to_ruby(o));
23
21
  }
24
22
 
25
23
  TESTCASE(object_from_ruby)
26
24
  {
27
25
  Object o(rb_str_new2("foo"));
28
- ASSERT_EQUAL(o.value(), from_ruby<Object>(o).value());
26
+ ASSERT_EQUAL(o, detail::From_Ruby<Object>().convert(o));
29
27
  }
30
28
 
31
29
  TESTCASE(short_to_ruby)
32
30
  {
33
- ASSERT_EQUAL(INT2NUM(0), to_ruby((short)0).value());
34
- ASSERT_EQUAL(INT2NUM(-1), to_ruby((short)-1).value());
35
- ASSERT_EQUAL(INT2NUM(1), to_ruby((short)1).value());
36
- ASSERT_EQUAL(
37
- Object(INT2NUM(std::numeric_limits<short>::min())),
38
- to_ruby(std::numeric_limits<short>::min()));
39
- ASSERT_EQUAL(
40
- Object(INT2NUM(std::numeric_limits<short>::max())),
41
- to_ruby(std::numeric_limits<short>::max()));
31
+ ASSERT_EQUAL(INT2NUM(0), detail::to_ruby((short)0));
32
+ ASSERT_EQUAL(INT2NUM(-1), detail::to_ruby((short)-1));
33
+ ASSERT_EQUAL(INT2NUM(1), detail::to_ruby((short)1));
34
+ ASSERT_EQUAL(INT2NUM(std::numeric_limits<short>::min()),
35
+ detail::to_ruby(std::numeric_limits<short>::min()));
36
+ ASSERT_EQUAL(INT2NUM(std::numeric_limits<short>::max()),
37
+ detail::to_ruby(std::numeric_limits<short>::max()));
42
38
  }
43
39
 
44
40
  TESTCASE(short_from_ruby)
45
41
  {
46
- ASSERT_EQUAL(0, from_ruby<short>(INT2NUM(0)));
47
- ASSERT_EQUAL(-1, from_ruby<short>(INT2NUM(-1)));
48
- ASSERT_EQUAL(1, from_ruby<short>(INT2NUM(1)));
49
- ASSERT_EQUAL(
50
- std::numeric_limits<short>::min(),
51
- from_ruby<short>(INT2NUM(std::numeric_limits<short>::min())));
52
- ASSERT_EQUAL(
53
- std::numeric_limits<short>::max(),
54
- from_ruby<short>(INT2NUM(std::numeric_limits<short>::max())));
42
+ ASSERT_EQUAL(0, detail::From_Ruby<short>().convert(INT2NUM(0)));
43
+ ASSERT_EQUAL(-1, detail::From_Ruby<short>().convert(INT2NUM(-1)));
44
+ ASSERT_EQUAL(1, detail::From_Ruby<short>().convert(INT2NUM(1)));
45
+ ASSERT_EQUAL(std::numeric_limits<short>::min(),
46
+ detail::From_Ruby<short>().convert(INT2NUM(std::numeric_limits<short>::min())));
47
+ ASSERT_EQUAL(std::numeric_limits<short>::max(),
48
+ detail::From_Ruby<short>().convert(INT2NUM(std::numeric_limits<short>::max())));
49
+
50
+ ASSERT_EXCEPTION_CHECK(
51
+ Exception,
52
+ detail::From_Ruby<short>().convert(rb_str_new2("bad value")),
53
+ ASSERT_EQUAL("no implicit conversion of String into Integer", ex.what())
54
+ );
55
55
  }
56
56
 
57
57
  TESTCASE(int_to_ruby)
58
58
  {
59
- ASSERT_EQUAL(INT2NUM(0), to_ruby((int)0).value());
60
- ASSERT_EQUAL(INT2NUM(-1), to_ruby((int)-1).value());
61
- ASSERT_EQUAL(INT2NUM(1), to_ruby((int)1).value());
62
- ASSERT_EQUAL(
63
- Object(INT2NUM(std::numeric_limits<int>::min())),
64
- to_ruby(std::numeric_limits<int>::min()));
65
- ASSERT_EQUAL(
66
- Object(INT2NUM(std::numeric_limits<int>::max())),
67
- to_ruby(std::numeric_limits<int>::max()));
59
+ ASSERT(rb_equal(INT2NUM(0), detail::to_ruby((int)0)));
60
+ ASSERT(rb_equal(INT2NUM(-1), detail::to_ruby((int)-1)));
61
+ ASSERT(rb_equal(INT2NUM(1), detail::to_ruby((int)1)));
62
+ ASSERT(rb_equal(INT2NUM(std::numeric_limits<int>::min()), detail::to_ruby(std::numeric_limits<int>::min())));
63
+ ASSERT(rb_equal(INT2NUM(std::numeric_limits<int>::max()), detail::to_ruby(std::numeric_limits<int>::max())));
68
64
  }
69
65
 
70
66
  TESTCASE(int_from_ruby)
71
67
  {
72
- ASSERT_EQUAL(0, from_ruby<int>(INT2NUM(0)));
73
- ASSERT_EQUAL(-1, from_ruby<int>(INT2NUM(-1)));
74
- ASSERT_EQUAL(1, from_ruby<int>(INT2NUM(1)));
75
- ASSERT_EQUAL(
76
- std::numeric_limits<int>::min(),
77
- from_ruby<int>(INT2NUM(std::numeric_limits<int>::min())));
78
- ASSERT_EQUAL(
79
- std::numeric_limits<int>::max(),
80
- from_ruby<int>(INT2NUM(std::numeric_limits<int>::max())));
68
+ ASSERT_EQUAL(0, detail::From_Ruby<int>().convert(INT2NUM(0)));
69
+ ASSERT_EQUAL(-1, detail::From_Ruby<int>().convert(INT2NUM(-1)));
70
+ ASSERT_EQUAL(1, detail::From_Ruby<int>().convert(INT2NUM(1)));
71
+ ASSERT_EQUAL(std::numeric_limits<int>::min(),
72
+ detail::From_Ruby<int>().convert(INT2NUM(std::numeric_limits<int>::min())));
73
+ ASSERT_EQUAL(std::numeric_limits<int>::max(),
74
+ detail::From_Ruby<int>().convert(INT2NUM(std::numeric_limits<int>::max())));
75
+
76
+ ASSERT_EXCEPTION_CHECK(
77
+ Exception,
78
+ detail::From_Ruby<int>().convert(rb_str_new2("bad value")),
79
+ ASSERT_EQUAL("no implicit conversion of String into Integer", ex.what())
80
+ );
81
81
  }
82
82
 
83
83
  TESTCASE(long_to_ruby)
84
84
  {
85
- ASSERT_EQUAL(LONG2NUM(0), to_ruby((long)0).value());
86
- ASSERT_EQUAL(LONG2NUM(-1), to_ruby((long)-1).value());
87
- ASSERT_EQUAL(LONG2NUM(1), to_ruby((long)1).value());
88
- ASSERT_EQUAL(
89
- LONG2NUM(FIXNUM_MAX),
90
- to_ruby(FIXNUM_MAX).value());
91
- ASSERT_EQUAL(
92
- LONG2NUM(FIXNUM_MIN),
93
- to_ruby(FIXNUM_MIN).value());
94
- ASSERT_EQUAL(
95
- Object(LONG2NUM(std::numeric_limits<long>::min())),
96
- to_ruby(std::numeric_limits<long>::min()));
97
- ASSERT_EQUAL(
98
- Object(LONG2NUM(std::numeric_limits<long>::max())),
99
- to_ruby(std::numeric_limits<long>::max()));
85
+ ASSERT(rb_equal(LONG2NUM(0), detail::to_ruby((long)0)));
86
+ ASSERT(rb_equal(LONG2NUM(-1), detail::to_ruby((long)-1)));
87
+ ASSERT(rb_equal(LONG2NUM(1), detail::to_ruby((long)1)));
88
+ ASSERT(rb_equal(LONG2NUM(FIXNUM_MAX), detail::to_ruby(FIXNUM_MAX)));
89
+ ASSERT(rb_equal(LONG2NUM(FIXNUM_MIN), detail::to_ruby(FIXNUM_MIN)));
90
+ ASSERT(rb_equal(LONG2NUM(std::numeric_limits<long>::min()), detail::to_ruby(std::numeric_limits<long>::min())));
91
+ ASSERT(rb_equal(LONG2NUM(std::numeric_limits<long>::max()), detail::to_ruby(std::numeric_limits<long>::max())));
100
92
  }
101
93
 
102
94
  TESTCASE(long_from_ruby)
103
95
  {
104
- ASSERT_EQUAL(0, from_ruby<long>(LONG2NUM(0)));
105
- ASSERT_EQUAL(-1, from_ruby<long>(LONG2NUM(-1)));
106
- ASSERT_EQUAL(1, from_ruby<long>(LONG2NUM(1)));
107
- ASSERT_EQUAL(
108
- FIXNUM_MIN,
109
- from_ruby<long>(LONG2NUM(FIXNUM_MIN)));
110
- ASSERT_EQUAL(
111
- FIXNUM_MAX,
112
- from_ruby<long>(LONG2NUM(FIXNUM_MAX)));
113
- ASSERT_EQUAL(
114
- std::numeric_limits<long>::min(),
115
- from_ruby<long>(LONG2NUM(std::numeric_limits<long>::min())));
116
- ASSERT_EQUAL(
117
- std::numeric_limits<long>::max(),
118
- from_ruby<long>(LONG2NUM(std::numeric_limits<long>::max())));
96
+ ASSERT_EQUAL(0, detail::From_Ruby<long>().convert(LONG2NUM(0)));
97
+ ASSERT_EQUAL(-1, detail::From_Ruby<long>().convert(LONG2NUM(-1)));
98
+ ASSERT_EQUAL(1, detail::From_Ruby<long>().convert(LONG2NUM(1)));
99
+ ASSERT_EQUAL(FIXNUM_MIN, detail::From_Ruby<long>().convert(LONG2NUM(FIXNUM_MIN)));
100
+ ASSERT_EQUAL(FIXNUM_MAX, detail::From_Ruby<long>().convert(LONG2NUM(FIXNUM_MAX)));
101
+ ASSERT_EQUAL(std::numeric_limits<long>::min(), detail::From_Ruby<long>().convert(LONG2NUM(std::numeric_limits<long>::min())));
102
+ ASSERT_EQUAL(std::numeric_limits<long>::max(), detail::From_Ruby<long>().convert(LONG2NUM(std::numeric_limits<long>::max())));
103
+
104
+ ASSERT_EXCEPTION_CHECK(
105
+ Exception,
106
+ detail::From_Ruby<long>().convert(rb_str_new2("bad value")),
107
+ ASSERT_EQUAL("no implicit conversion of String into Integer", ex.what())
108
+ );
119
109
  }
120
110
 
121
111
  TESTCASE(long_long_to_ruby)
122
112
  {
123
- ASSERT_EQUAL(LL2NUM(0), to_ruby((long long)0).value());
124
- ASSERT_EQUAL(LL2NUM(-1), to_ruby((long long)-1).value());
125
- ASSERT_EQUAL(LL2NUM(1), to_ruby((long long)1).value());
126
- ASSERT_EQUAL(
127
- Object(LL2NUM(std::numeric_limits<long long>::min())),
128
- to_ruby(std::numeric_limits<long long>::min()));
129
- ASSERT_EQUAL(
130
- Object(LL2NUM(std::numeric_limits<long long>::max())),
131
- to_ruby(std::numeric_limits<long long>::max()));
113
+ ASSERT(rb_equal(LL2NUM(0), detail::to_ruby((long long)0)));
114
+ ASSERT(rb_equal(LL2NUM(-1), detail::to_ruby((long long)-1)));
115
+ ASSERT(rb_equal(LL2NUM(1), detail::to_ruby((long long)1)));
116
+ ASSERT(rb_equal(LL2NUM(std::numeric_limits<long long>::min()), detail::to_ruby(std::numeric_limits<long long>::min())));
117
+ ASSERT(rb_equal(LL2NUM(std::numeric_limits<long long>::max()), detail::to_ruby(std::numeric_limits<long long>::max())));
132
118
  }
133
119
 
134
120
  TESTCASE(long_long_from_ruby)
135
121
  {
136
- ASSERT_EQUAL(0, from_ruby<long long>(LL2NUM(0)));
137
- ASSERT_EQUAL(-1, from_ruby<long long>(LL2NUM(-1)));
138
- ASSERT_EQUAL(1, from_ruby<long long>(LL2NUM(1)));
139
- ASSERT_EQUAL(
140
- std::numeric_limits<long long>::min(),
141
- from_ruby<long long>(LL2NUM(std::numeric_limits<long long>::min())));
142
- ASSERT_EQUAL(
143
- std::numeric_limits<long long>::max(),
144
- from_ruby<long long>(LL2NUM(std::numeric_limits<long long>::max())));
122
+ ASSERT_EQUAL(0, detail::From_Ruby<long long>().convert(LL2NUM(0)));
123
+ ASSERT_EQUAL(-1, detail::From_Ruby<long long>().convert(LL2NUM(-1)));
124
+ ASSERT_EQUAL(1, detail::From_Ruby<long long>().convert(LL2NUM(1)));
125
+ ASSERT_EQUAL(std::numeric_limits<long long>::min(),
126
+ detail::From_Ruby<long long>().convert(LL2NUM(std::numeric_limits<long long>::min())));
127
+ ASSERT_EQUAL(std::numeric_limits<long long>::max(),
128
+ detail::From_Ruby<long long>().convert(LL2NUM(std::numeric_limits<long long>::max())));
129
+
130
+ ASSERT_EXCEPTION_CHECK(
131
+ Exception,
132
+ detail::From_Ruby<long long>().convert(rb_str_new2("bad value")),
133
+ ASSERT_EQUAL("no implicit conversion from string", ex.what())
134
+ );
145
135
  }
146
136
 
147
137
  TESTCASE(unsigned_short_to_ruby)
148
138
  {
149
- ASSERT_EQUAL(UINT2NUM(0), to_ruby((unsigned short)0).value());
150
- ASSERT_EQUAL(UINT2NUM(1), to_ruby((unsigned short)1).value());
151
- ASSERT_EQUAL(
152
- Object(UINT2NUM(std::numeric_limits<unsigned short>::min())),
153
- to_ruby(std::numeric_limits<unsigned short>::min()));
154
- ASSERT_EQUAL(
155
- Object(UINT2NUM(std::numeric_limits<unsigned short>::max())),
156
- to_ruby(std::numeric_limits<unsigned short>::max()));
139
+ ASSERT(rb_equal(UINT2NUM(0), detail::to_ruby((unsigned short)0)));
140
+ ASSERT(rb_equal(UINT2NUM(1), detail::to_ruby((unsigned short)1)));
141
+ ASSERT(rb_equal(UINT2NUM(std::numeric_limits<unsigned short>::min()), detail::to_ruby(std::numeric_limits<unsigned short>::min())));
142
+ ASSERT(rb_equal(UINT2NUM(std::numeric_limits<unsigned short>::max()), detail::to_ruby(std::numeric_limits<unsigned short>::max())));
157
143
  }
158
144
 
159
145
  TESTCASE(unsigned_short_from_ruby)
160
146
  {
161
- ASSERT_EQUAL(0u, from_ruby<unsigned short>(UINT2NUM(0)));
162
- ASSERT_EQUAL(1u, from_ruby<unsigned short>(UINT2NUM(1)));
163
- ASSERT_EQUAL(
164
- std::numeric_limits<unsigned short>::min(),
165
- from_ruby<unsigned short>(UINT2NUM(std::numeric_limits<unsigned short>::min())));
166
- ASSERT_EQUAL(
167
- std::numeric_limits<unsigned short>::max(),
168
- from_ruby<unsigned short>(UINT2NUM(std::numeric_limits<unsigned short>::max())));
147
+ ASSERT_EQUAL(0u, detail::From_Ruby<unsigned short>().convert(UINT2NUM(0)));
148
+ ASSERT_EQUAL(1u, detail::From_Ruby<unsigned short>().convert(UINT2NUM(1)));
149
+ ASSERT_EQUAL(std::numeric_limits<unsigned short>::min(),
150
+ detail::From_Ruby<unsigned short>().convert(UINT2NUM(std::numeric_limits<unsigned short>::min())));
151
+ ASSERT_EQUAL(std::numeric_limits<unsigned short>::max(),
152
+ detail::From_Ruby<unsigned short>().convert(UINT2NUM(std::numeric_limits<unsigned short>::max())));
153
+
154
+ ASSERT_EXCEPTION_CHECK(
155
+ Exception,
156
+ detail::From_Ruby<unsigned short>().convert(rb_str_new2("bad value")),
157
+ ASSERT_EQUAL("no implicit conversion of String into Integer", ex.what())
158
+ );
169
159
  }
170
160
 
171
161
  TESTCASE(unsigned_int_to_ruby)
172
162
  {
173
- ASSERT_EQUAL(UINT2NUM(0), to_ruby((unsigned int)0).value());
174
- ASSERT_EQUAL(UINT2NUM(1), to_ruby((unsigned int)1).value());
175
- ASSERT_EQUAL(
176
- Object(UINT2NUM(std::numeric_limits<unsigned int>::min())),
177
- to_ruby(std::numeric_limits<unsigned int>::min()));
178
- ASSERT_EQUAL(
179
- Object(UINT2NUM(std::numeric_limits<unsigned int>::max())),
180
- to_ruby(std::numeric_limits<unsigned int>::max()));
163
+ ASSERT(rb_equal(UINT2NUM(0), detail::to_ruby((unsigned int)0)));
164
+ ASSERT(rb_equal(UINT2NUM(1), detail::to_ruby((unsigned int)1)));
165
+ ASSERT(rb_equal(UINT2NUM(std::numeric_limits<unsigned int>::min()), detail::to_ruby(std::numeric_limits<unsigned int>::min())));
166
+ ASSERT(rb_equal(UINT2NUM(std::numeric_limits<unsigned int>::max()), detail::to_ruby(std::numeric_limits<unsigned int>::max())));
181
167
  }
182
168
 
183
169
  TESTCASE(unsigned_int_from_ruby)
184
170
  {
185
- ASSERT_EQUAL(0u, from_ruby<unsigned int>(UINT2NUM(0)));
186
- ASSERT_EQUAL(1u, from_ruby<unsigned int>(UINT2NUM(1)));
187
- ASSERT_EQUAL(
188
- std::numeric_limits<unsigned int>::min(),
189
- from_ruby<unsigned int>(UINT2NUM(std::numeric_limits<unsigned int>::min())));
190
- ASSERT_EQUAL(
191
- std::numeric_limits<unsigned int>::max(),
192
- from_ruby<unsigned int>(UINT2NUM(std::numeric_limits<unsigned int>::max())));
171
+ ASSERT_EQUAL(0u, detail::From_Ruby<unsigned int>().convert(UINT2NUM(0)));
172
+ ASSERT_EQUAL(1u, detail::From_Ruby<unsigned int>().convert(UINT2NUM(1)));
173
+ ASSERT_EQUAL(std::numeric_limits<unsigned int>::min(),
174
+ detail::From_Ruby<unsigned int>().convert(UINT2NUM(std::numeric_limits<unsigned int>::min())));
175
+ ASSERT_EQUAL(std::numeric_limits<unsigned int>::max(),
176
+ detail::From_Ruby<unsigned int>().convert(UINT2NUM(std::numeric_limits<unsigned int>::max())));
177
+
178
+ ASSERT_EXCEPTION_CHECK(
179
+ Exception,
180
+ detail::From_Ruby<unsigned int>().convert(rb_str_new2("bad value")),
181
+ ASSERT_EQUAL("no implicit conversion of String into Integer", ex.what())
182
+ );
193
183
  }
194
184
 
195
185
  TESTCASE(unsigned_long_to_ruby)
196
186
  {
197
- ASSERT_EQUAL(ULONG2NUM(0), to_ruby((unsigned long)0).value());
198
- ASSERT_EQUAL(ULONG2NUM(1), to_ruby((unsigned long)1).value());
199
- ASSERT_EQUAL(
200
- ULONG2NUM(FIXNUM_MAX),
201
- to_ruby(FIXNUM_MAX).value());
202
- ASSERT_EQUAL(
203
- Object(ULONG2NUM(std::numeric_limits<unsigned long>::min())),
204
- to_ruby(std::numeric_limits<unsigned long>::min()));
205
- ASSERT_EQUAL(
206
- Object(ULONG2NUM(std::numeric_limits<unsigned long>::max())),
207
- to_ruby(std::numeric_limits<unsigned long>::max()));
187
+ ASSERT(rb_equal(ULONG2NUM(0), detail::to_ruby((unsigned long)0)));
188
+ ASSERT(rb_equal(ULONG2NUM(1), detail::to_ruby((unsigned long)1)));
189
+ ASSERT(rb_equal(ULONG2NUM(FIXNUM_MAX), detail::to_ruby(FIXNUM_MAX)));
190
+ ASSERT(rb_equal(ULONG2NUM(std::numeric_limits<unsigned long>::min()), detail::to_ruby(std::numeric_limits<unsigned long>::min())));
191
+ ASSERT(rb_equal(ULONG2NUM(std::numeric_limits<unsigned long>::max()), detail::to_ruby(std::numeric_limits<unsigned long>::max())));
208
192
  }
209
193
 
210
194
  TESTCASE(unsigned_long_from_ruby)
211
195
  {
212
- ASSERT_EQUAL(0u, from_ruby<unsigned long>(ULONG2NUM(0)));
213
- ASSERT_EQUAL(1u, from_ruby<unsigned long>(ULONG2NUM(1)));
214
- ASSERT_EQUAL(
215
- static_cast<unsigned long>(FIXNUM_MIN),
216
- from_ruby<unsigned long>(ULONG2NUM(FIXNUM_MIN)));
217
- ASSERT_EQUAL(
218
- std::numeric_limits<unsigned long>::min(),
219
- from_ruby<unsigned long>(ULONG2NUM(std::numeric_limits<unsigned long>::min())));
220
- ASSERT_EQUAL(
221
- std::numeric_limits<unsigned long>::max(),
222
- from_ruby<unsigned long>(ULONG2NUM(std::numeric_limits<unsigned long>::max())));
196
+ ASSERT_EQUAL(0u, detail::From_Ruby<unsigned long>().convert(ULONG2NUM(0)));
197
+ ASSERT_EQUAL(1u, detail::From_Ruby<unsigned long>().convert(ULONG2NUM(1)));
198
+ ASSERT_EQUAL(static_cast<unsigned long>(FIXNUM_MIN),
199
+ detail::From_Ruby<unsigned long>().convert(ULONG2NUM(FIXNUM_MIN)));
200
+ ASSERT_EQUAL(std::numeric_limits<unsigned long>::min(),
201
+ detail::From_Ruby<unsigned long>().convert(ULONG2NUM(std::numeric_limits<unsigned long>::min())));
202
+ ASSERT_EQUAL(std::numeric_limits<unsigned long>::max(),
203
+ detail::From_Ruby<unsigned long>().convert(ULONG2NUM(std::numeric_limits<unsigned long>::max())));
204
+
205
+ ASSERT_EXCEPTION_CHECK(
206
+ Exception,
207
+ detail::From_Ruby<unsigned long>().convert(rb_str_new2("bad value")),
208
+ ASSERT_EQUAL("no implicit conversion of String into Integer", ex.what())
209
+ );
223
210
  }
224
211
 
225
212
  TESTCASE(unsigned_long_long_to_ruby)
226
213
  {
227
- ASSERT_EQUAL(ULL2NUM(0), to_ruby((unsigned long long)0).value());
228
- ASSERT_EQUAL(ULL2NUM(1), to_ruby((unsigned long long)1).value());
229
- ASSERT_EQUAL(
230
- Object(ULL2NUM(std::numeric_limits<unsigned long long>::min())),
231
- to_ruby(std::numeric_limits<unsigned long long>::min()));
232
- ASSERT_EQUAL(
233
- Object(ULL2NUM(std::numeric_limits<unsigned long long>::max())),
234
- to_ruby(std::numeric_limits<unsigned long long>::max()));
214
+ ASSERT(rb_equal(ULL2NUM(0), detail::to_ruby((unsigned long long)0)));
215
+ ASSERT(rb_equal(ULL2NUM(1), detail::to_ruby((unsigned long long)1)));
216
+ ASSERT(rb_equal(ULL2NUM(std::numeric_limits<unsigned long long>::min()), detail::to_ruby(std::numeric_limits<unsigned long long>::min())));
217
+ ASSERT(rb_equal(ULL2NUM(std::numeric_limits<unsigned long long>::max()), detail::to_ruby(std::numeric_limits<unsigned long long>::max())));
235
218
  }
236
219
 
237
220
  TESTCASE(unsigned_long_long_from_ruby)
238
221
  {
239
- ASSERT_EQUAL(0u, from_ruby<unsigned long>(ULL2NUM(0)));
240
- ASSERT_EQUAL(1u, from_ruby<unsigned long>(ULL2NUM(1)));
241
- ASSERT_EQUAL(
242
- std::numeric_limits<unsigned long long>::min(),
243
- from_ruby<unsigned long long>(ULL2NUM(std::numeric_limits<unsigned long long>::min())));
244
- ASSERT_EQUAL(
245
- std::numeric_limits<unsigned long long>::max(),
246
- from_ruby<unsigned long long>(ULL2NUM(std::numeric_limits<unsigned long long>::max())));
222
+ ASSERT_EQUAL(0u, detail::From_Ruby<unsigned long>().convert(ULL2NUM(0)));
223
+ ASSERT_EQUAL(1u, detail::From_Ruby<unsigned long>().convert(ULL2NUM(1)));
224
+ ASSERT_EQUAL(std::numeric_limits<unsigned long long>::min(),
225
+ detail::From_Ruby<unsigned long long>().convert(ULL2NUM(std::numeric_limits<unsigned long long>::min())));
226
+ ASSERT_EQUAL(std::numeric_limits<unsigned long long>::max(),
227
+ detail::From_Ruby<unsigned long long>().convert(ULL2NUM(std::numeric_limits<unsigned long long>::max())));
228
+
229
+ ASSERT_EXCEPTION_CHECK(
230
+ Exception,
231
+ detail::From_Ruby<unsigned long long>().convert(rb_str_new2("bad value")),
232
+ ASSERT_EQUAL("no implicit conversion from string", ex.what())
233
+ );
247
234
  }
248
235
 
249
236
  TESTCASE(bool_to_ruby)
250
237
  {
251
- ASSERT_EQUAL(Qfalse, to_ruby(false).value());
252
- ASSERT_EQUAL(Qtrue, to_ruby(true).value());
238
+ ASSERT(rb_equal(Qfalse, detail::to_ruby(false)));
239
+ ASSERT(rb_equal(Qtrue, detail::to_ruby(true)));
253
240
  }
254
241
 
255
242
  TESTCASE(bool_from_ruby)
256
243
  {
257
- ASSERT_EQUAL(false, from_ruby<bool>(Object(Qfalse)));
258
- ASSERT_EQUAL(true, from_ruby<bool>(Object(Qtrue)));
244
+ ASSERT_EQUAL(false, detail::From_Ruby<bool>().convert(Qfalse));
245
+ ASSERT_EQUAL(false, detail::From_Ruby<bool>().convert(Qnil));
246
+ ASSERT_EQUAL(true, detail::From_Ruby<bool>().convert(Qtrue));
247
+ ASSERT_EQUAL(true, detail::From_Ruby<bool>().convert(rb_str_new2("some string")));
248
+ ASSERT_EQUAL(true, detail::From_Ruby<bool>().convert(INT2NUM(3)));
249
+ ASSERT_EQUAL(true, detail::From_Ruby<bool>().convert(rb_float_new(3.33)));
259
250
  }
260
251
 
261
252
  TESTCASE(float_to_ruby)
262
253
  {
263
- ASSERT_EQUAL(Object(rb_float_new(0.0f)), to_ruby(0.0f));
264
- ASSERT_EQUAL(Object(rb_float_new(-1.0f)), to_ruby(-1.0f));
265
- ASSERT_EQUAL(Object(rb_float_new(1.0f)), to_ruby(1.0f));
266
- ASSERT_EQUAL(Object(rb_float_new(0.5f)), to_ruby(0.5f));
267
- ASSERT_EQUAL(
268
- Object(rb_float_new(std::numeric_limits<float>::min())),
269
- to_ruby(std::numeric_limits<float>::min()));
270
- ASSERT_EQUAL(
271
- Object(rb_float_new(std::numeric_limits<float>::max())),
272
- to_ruby(std::numeric_limits<float>::max()));
273
- ASSERT(
274
- to_ruby(std::numeric_limits<float>::quiet_NaN()).call("nan?"));
275
- ASSERT(
276
- to_ruby(std::numeric_limits<float>::signaling_NaN()).call("nan?"));
277
- ASSERT_EQUAL(
278
- Object(rb_float_new(std::numeric_limits<float>::epsilon())),
279
- to_ruby(std::numeric_limits<float>::epsilon()));
254
+ ASSERT(rb_equal(rb_float_new(0.0f), detail::to_ruby(0.0f)));
255
+ ASSERT(rb_equal(rb_float_new(-1.0f), detail::to_ruby(-1.0f)));
256
+ ASSERT(rb_equal(rb_float_new(1.0f), detail::to_ruby(1.0f)));
257
+ ASSERT(rb_equal(rb_float_new(0.5f), detail::to_ruby(0.5f)));
258
+ ASSERT(rb_equal(rb_float_new(std::numeric_limits<float>::min()), detail::to_ruby(std::numeric_limits<float>::min())));
259
+ ASSERT(rb_equal(rb_float_new(std::numeric_limits<float>::max()), detail::to_ruby(std::numeric_limits<float>::max())));
260
+ ASSERT(Object(detail::to_ruby(std::numeric_limits<float>::quiet_NaN())).call("nan?"));
261
+ ASSERT(Object(detail::to_ruby(std::numeric_limits<float>::signaling_NaN())).call("nan?"));
262
+ ASSERT_EQUAL(rb_float_new(std::numeric_limits<float>::epsilon()),
263
+ detail::to_ruby(std::numeric_limits<float>::epsilon()));
280
264
  }
281
265
 
282
266
  TESTCASE(float_from_ruby)
283
267
  {
284
- ASSERT_EQUAL(0.0f, from_ruby<float>(rb_float_new(0.0f)));
285
- ASSERT_EQUAL(-1.0f, from_ruby<float>(rb_float_new(-1.0f)));
286
- ASSERT_EQUAL(1.0f, from_ruby<float>(rb_float_new(1.0f)));
287
- ASSERT_EQUAL(
288
- std::numeric_limits<float>::min(),
289
- from_ruby<float>(rb_float_new(std::numeric_limits<float>::min())));
290
- ASSERT_EQUAL(
291
- std::numeric_limits<float>::max(),
292
- from_ruby<float>(rb_float_new(std::numeric_limits<float>::max())));
293
- ASSERT(
294
- std::isnan(from_ruby<float>(rb_float_new(std::numeric_limits<float>::quiet_NaN()))));
295
- ASSERT(
296
- std::isnan(from_ruby<float>(rb_float_new(std::numeric_limits<float>::signaling_NaN()))));
297
- ASSERT_EQUAL(
298
- std::numeric_limits<float>::epsilon(),
299
- from_ruby<float>(rb_float_new(std::numeric_limits<float>::epsilon())));
268
+ ASSERT_EQUAL(0.0f, detail::From_Ruby<float>().convert(rb_float_new(0.0f)));
269
+ ASSERT_EQUAL(-1.0f, detail::From_Ruby<float>().convert(rb_float_new(-1.0f)));
270
+ ASSERT_EQUAL(1.0f, detail::From_Ruby<float>().convert(rb_float_new(1.0f)));
271
+ ASSERT_EQUAL(std::numeric_limits<float>::min(),
272
+ detail::From_Ruby<float>().convert(rb_float_new(std::numeric_limits<float>::min())));
273
+ ASSERT_EQUAL(std::numeric_limits<float>::max(),
274
+ detail::From_Ruby<float>().convert(rb_float_new(std::numeric_limits<float>::max())));
275
+ ASSERT(std::isnan(detail::From_Ruby<float>().convert(rb_float_new(std::numeric_limits<float>::quiet_NaN()))));
276
+ ASSERT(std::isnan(detail::From_Ruby<float>().convert(rb_float_new(std::numeric_limits<float>::signaling_NaN()))));
277
+ ASSERT_EQUAL(std::numeric_limits<float>::epsilon(),
278
+ detail::From_Ruby<float>().convert(rb_float_new(std::numeric_limits<float>::epsilon())));
279
+
280
+ ASSERT_EXCEPTION_CHECK(
281
+ Exception,
282
+ detail::From_Ruby<float>().convert(rb_str_new2("bad value")),
283
+ ASSERT_EQUAL("no implicit conversion to float from string", ex.what())
284
+ );
300
285
  }
301
286
 
302
287
  TESTCASE(double_to_ruby)
303
288
  {
304
- ASSERT_EQUAL(Object(rb_float_new(0.0f)), to_ruby(0.0f));
305
- ASSERT_EQUAL(Object(rb_float_new(-1.0f)), to_ruby(-1.0f));
306
- ASSERT_EQUAL(Object(rb_float_new(1.0f)), to_ruby(1.0f));
307
- ASSERT_EQUAL(Object(rb_float_new(0.5f)), to_ruby(0.5f));
308
- ASSERT_EQUAL(
309
- Object(rb_float_new(std::numeric_limits<double>::min())),
310
- to_ruby(std::numeric_limits<double>::min()));
311
- ASSERT_EQUAL(
312
- Object(rb_float_new(std::numeric_limits<double>::max())),
313
- to_ruby(std::numeric_limits<double>::max()));
314
- ASSERT(
315
- to_ruby(std::numeric_limits<double>::quiet_NaN()).call("nan?"));
316
- ASSERT(
317
- to_ruby(std::numeric_limits<double>::signaling_NaN()).call("nan?"));
318
- ASSERT_EQUAL(
319
- Object(rb_float_new(std::numeric_limits<double>::epsilon())),
320
- to_ruby(std::numeric_limits<double>::epsilon()));
289
+ ASSERT(rb_equal(rb_float_new(0.0f), detail::to_ruby(0.0f)));
290
+ ASSERT(rb_equal(rb_float_new(-1.0f), detail::to_ruby(-1.0f)));
291
+ ASSERT(rb_equal(rb_float_new(1.0f), detail::to_ruby(1.0f)));
292
+ ASSERT(rb_equal(rb_float_new(0.5f), detail::to_ruby(0.5f)));
293
+ ASSERT(rb_equal(rb_float_new(std::numeric_limits<double>::min()), detail::to_ruby(std::numeric_limits<double>::min())));
294
+ ASSERT(rb_equal(rb_float_new(std::numeric_limits<double>::max()), detail::to_ruby(std::numeric_limits<double>::max())));
295
+ ASSERT(Object(detail::to_ruby(std::numeric_limits<double>::quiet_NaN())).call("nan?"));
296
+ ASSERT(Object(detail::to_ruby(std::numeric_limits<double>::signaling_NaN())).call("nan?"));
297
+ ASSERT(rb_equal(rb_float_new(std::numeric_limits<double>::epsilon()), detail::to_ruby(std::numeric_limits<double>::epsilon())));
321
298
  }
322
299
 
323
300
  TESTCASE(double_from_ruby)
324
301
  {
325
- ASSERT_EQUAL(0.0f, from_ruby<double>(rb_float_new(0.0f)));
326
- ASSERT_EQUAL(-1.0f, from_ruby<double>(rb_float_new(-1.0f)));
327
- ASSERT_EQUAL(1.0f, from_ruby<double>(rb_float_new(1.0f)));
328
- ASSERT_EQUAL(
329
- std::numeric_limits<double>::min(),
330
- from_ruby<double>(rb_float_new(std::numeric_limits<double>::min())));
331
- ASSERT_EQUAL(
332
- std::numeric_limits<double>::max(),
333
- from_ruby<double>(rb_float_new(std::numeric_limits<double>::max())));
334
- ASSERT(
335
- std::isnan(from_ruby<double>(rb_float_new(std::numeric_limits<double>::quiet_NaN()))));
336
- ASSERT(
337
- std::isnan(from_ruby<double>(rb_float_new(std::numeric_limits<double>::signaling_NaN()))));
338
- ASSERT_EQUAL(
339
- std::numeric_limits<double>::epsilon(),
340
- from_ruby<double>(rb_float_new(std::numeric_limits<double>::epsilon())));
302
+ ASSERT_EQUAL(0.0, detail::From_Ruby<double>().convert(rb_float_new(0.0)));
303
+ ASSERT_EQUAL(-1.0, detail::From_Ruby<double>().convert(rb_float_new(-1.0)));
304
+ ASSERT_EQUAL(1.0, detail::From_Ruby<double>().convert(rb_float_new(1.0)));
305
+ ASSERT_EQUAL(std::numeric_limits<double>::min(),
306
+ detail::From_Ruby<double>().convert(rb_float_new(std::numeric_limits<double>::min())));
307
+ ASSERT_EQUAL(std::numeric_limits<double>::max(),
308
+ detail::From_Ruby<double>().convert(rb_float_new(std::numeric_limits<double>::max())));
309
+ ASSERT(std::isnan(detail::From_Ruby<double>().convert(rb_float_new(std::numeric_limits<double>::quiet_NaN()))));
310
+ ASSERT(std::isnan(detail::From_Ruby<double>().convert(rb_float_new(std::numeric_limits<double>::signaling_NaN()))));
311
+ ASSERT_EQUAL(std::numeric_limits<double>::epsilon(),
312
+ detail::From_Ruby<double>().convert(rb_float_new(std::numeric_limits<double>::epsilon())));
313
+
314
+ ASSERT_EXCEPTION_CHECK(
315
+ Exception,
316
+ detail::From_Ruby<double>().convert(rb_str_new2("bad value")),
317
+ ASSERT_EQUAL("no implicit conversion to float from string", ex.what())
318
+ );
341
319
  }
342
320
 
343
321
  TESTCASE(char_const_ptr_to_ruby)
344
322
  {
345
- ASSERT_EQUAL(String(""), to_ruby((char const *)""));
346
- ASSERT_EQUAL(String("foo"), to_ruby((char const *)"foo"));
323
+ ASSERT(rb_equal(String("").value(), detail::to_ruby((char const *)"")));
324
+ ASSERT(rb_equal(String("foo").value(), detail::to_ruby((char const *)"foo")));
347
325
  }
348
326
 
349
327
  TESTCASE(char_const_ptr_from_ruby)
350
328
  {
351
329
  char const* foo = "foo";
352
- ASSERT_EQUAL("", from_ruby<char const *>(rb_str_new2("")));
353
- ASSERT_EQUAL(foo, from_ruby<char const *>(rb_str_new2("foo")));
330
+ ASSERT_EQUAL(foo, detail::From_Ruby<char const *>().convert(rb_str_new2("foo")));
331
+ ASSERT_EQUAL("", detail::From_Ruby<char const*>().convert(rb_str_new2("")));
332
+
333
+ ASSERT_EXCEPTION_CHECK(
334
+ Exception,
335
+ detail::From_Ruby<char const *>().convert(rb_float_new(32.3)),
336
+ ASSERT_EQUAL("wrong argument type Float (expected String)", ex.what())
337
+ );
354
338
  }
355
339
 
356
340
  TESTCASE(char_from_ruby_single_character_string)
357
341
  {
358
- ASSERT_EQUAL('x', from_ruby<char>(rb_str_new2("x")));
342
+ ASSERT_EQUAL('x', detail::From_Ruby<char>().convert(rb_str_new2("x")));
359
343
  }
360
344
 
361
345
  TESTCASE(char_from_ruby_longer_string)
362
346
  {
363
- ASSERT_EXCEPTION(
347
+ ASSERT_EXCEPTION_CHECK(
364
348
  std::invalid_argument,
365
- from_ruby<char>(rb_str_new2("xy"))
349
+ detail::From_Ruby<char>().convert(rb_str_new2("xy")),
350
+ ASSERT_EQUAL("from_ruby<char>: string must have length 1", ex.what())
366
351
  );
367
- }
368
-
369
- TESTCASE(char_from_ruby_fixnum)
370
- {
371
- ASSERT_EQUAL('1', from_ruby<char>(INT2NUM(49)));
372
- }
373
352
 
374
- TESTCASE(char_star_from_ruby)
375
- {
376
- const char* expected = "my string";
377
- ASSERT_EQUAL(expected, from_ruby<const char*>(rb_str_new2("my string")));
378
- }
379
-
380
- TESTCASE(std_string_to_ruby)
381
- {
382
- ASSERT_EQUAL(String(""), to_ruby(std::string("")));
383
- ASSERT_EQUAL(String("foo"), to_ruby(std::string("foo")));
353
+ ASSERT_EXCEPTION_CHECK(
354
+ Exception,
355
+ detail::From_Ruby<char>().convert(rb_float_new(47.2)),
356
+ ASSERT_EQUAL("wrong argument type Float (expected char type)", ex.what())
357
+ );
384
358
  }
385
359
 
386
- TESTCASE(std_string_from_ruby)
360
+ TESTCASE(char_from_ruby_fixnum)
387
361
  {
388
- ASSERT_EQUAL(std::string(""), from_ruby<std::string>(rb_str_new2("")));
389
- ASSERT_EQUAL(std::string("foo"), from_ruby<std::string>(rb_str_new2("foo")));
362
+ ASSERT_EQUAL('1', detail::From_Ruby<char>().convert(INT2NUM(49)));
390
363
  }
391
364
 
392
- TESTCASE(std_string_to_ruby_with_binary)
365
+ TESTCASE(unsigned_char_from_ruby)
393
366
  {
394
- Rice::String got = to_ruby(std::string("\000test", 5));
395
-
396
- ASSERT_EQUAL(String(std::string("\000test", 5)), got);
397
- ASSERT_EQUAL(5, got.length());
398
- }
367
+ unsigned char expected = -1;
368
+ ASSERT_EQUAL(expected, detail::From_Ruby<unsigned char>().convert(INT2NUM(-1)));
399
369
 
400
- TESTCASE(std_string_from_ruby_with_binary)
401
- {
402
- std::string got = from_ruby<std::string>(rb_str_new("\000test", 5));
403
- ASSERT_EQUAL(5, got.length());
404
- ASSERT_EQUAL(std::string("\000test", 5), got);
405
- }
406
-
407
- TESTCASE(array_to_ruby)
408
- {
409
- Array a(rb_ary_new());
410
- ASSERT_EQUAL(a.value(), to_ruby(a).value());
370
+ ASSERT_EXCEPTION_CHECK(
371
+ Exception,
372
+ detail::From_Ruby<unsigned char>().convert(rb_float_new(1.3)),
373
+ ASSERT_EQUAL("wrong argument type Float (expected char type)", ex.what())
374
+ );
411
375
  }
412
376
 
413
- TESTCASE(array_from_ruby)
377
+ TESTCASE(signed_char_from_ruby)
414
378
  {
415
- Array a(rb_ary_new());
416
- ASSERT_EQUAL(a.value(), from_ruby<Array>(a).value());
379
+ unsigned char expected = 10;
380
+ ASSERT_EQUAL(expected, detail::From_Ruby<signed char>().convert(INT2NUM(10)));
417
381
  }
418
382
 
419
- TESTCASE(hash_to_ruby)
383
+ TESTCASE(char_star_from_ruby)
420
384
  {
421
- Hash h(rb_hash_new());
422
- ASSERT_EQUAL(h.value(), to_ruby(h).value());
423
- }
385
+ const char* expected = "my string";
386
+ ASSERT_EQUAL(expected, detail::From_Ruby<const char*>().convert(rb_str_new2("my string")));
424
387
 
425
- TESTCASE(hash_from_ruby)
426
- {
427
- Hash h(rb_hash_new());
428
- ASSERT_EQUAL(h.value(), from_ruby<Hash>(h).value());
429
- }
388
+ ASSERT_EXCEPTION_CHECK(
389
+ Exception,
390
+ detail::From_Ruby<const char*>().convert(rb_float_new(11.11)),
391
+ ASSERT_EQUAL("wrong argument type Float (expected String)", ex.what())
392
+ );
393
+ }