rice 2.1.1 → 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 (246) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +121 -0
  3. data/CONTRIBUTORS.md +19 -0
  4. data/COPYING +2 -2
  5. data/Gemfile +3 -0
  6. data/README.md +69 -0
  7. data/Rakefile +95 -12
  8. data/include/rice/rice.hpp +7766 -0
  9. data/lib/mkmf-rice.rb +127 -0
  10. data/lib/version.rb +3 -0
  11. data/rice/Address_Registration_Guard.ipp +75 -32
  12. data/rice/Address_Registration_Guard_defn.hpp +60 -56
  13. data/rice/Arg.hpp +80 -4
  14. data/rice/Arg.ipp +51 -0
  15. data/rice/Constructor.hpp +30 -376
  16. data/rice/Data_Object.ipp +234 -107
  17. data/rice/Data_Object_defn.hpp +77 -117
  18. data/rice/Data_Type.hpp +1 -2
  19. data/rice/Data_Type.ipp +251 -295
  20. data/rice/Data_Type_defn.hpp +175 -243
  21. data/rice/Director.hpp +14 -9
  22. data/rice/Enum.hpp +54 -104
  23. data/rice/Enum.ipp +104 -230
  24. data/rice/Exception.hpp +2 -8
  25. data/rice/Exception.ipp +65 -0
  26. data/rice/Exception_defn.hpp +46 -47
  27. data/rice/Identifier.hpp +28 -28
  28. data/rice/Identifier.ipp +23 -27
  29. data/rice/Return.hpp +39 -0
  30. data/rice/Return.ipp +33 -0
  31. data/rice/detail/Exception_Handler.ipp +22 -62
  32. data/rice/detail/Exception_Handler_defn.hpp +76 -91
  33. data/rice/detail/Iterator.hpp +18 -88
  34. data/rice/detail/Iterator.ipp +47 -0
  35. data/rice/detail/Jump_Tag.hpp +21 -0
  36. data/rice/detail/MethodInfo.hpp +44 -0
  37. data/rice/detail/MethodInfo.ipp +78 -0
  38. data/rice/detail/NativeAttribute.hpp +53 -0
  39. data/rice/detail/NativeAttribute.ipp +83 -0
  40. data/rice/detail/NativeFunction.hpp +69 -0
  41. data/rice/detail/NativeFunction.ipp +248 -0
  42. data/rice/detail/RubyFunction.hpp +39 -0
  43. data/rice/detail/RubyFunction.ipp +92 -0
  44. data/rice/detail/Type.hpp +29 -0
  45. data/rice/detail/Type.ipp +138 -0
  46. data/rice/detail/TypeRegistry.hpp +50 -0
  47. data/rice/detail/TypeRegistry.ipp +106 -0
  48. data/rice/detail/Wrapper.hpp +51 -0
  49. data/rice/detail/Wrapper.ipp +151 -0
  50. data/rice/detail/default_allocation_func.hpp +8 -19
  51. data/rice/detail/default_allocation_func.ipp +9 -8
  52. data/rice/detail/from_ruby.hpp +2 -37
  53. data/rice/detail/from_ruby.ipp +1020 -46
  54. data/rice/detail/from_ruby_defn.hpp +38 -0
  55. data/rice/detail/function_traits.hpp +124 -0
  56. data/rice/detail/method_data.hpp +23 -15
  57. data/rice/detail/method_data.ipp +53 -0
  58. data/rice/detail/rice_traits.hpp +116 -0
  59. data/rice/detail/ruby.hpp +9 -49
  60. data/rice/detail/to_ruby.hpp +3 -17
  61. data/rice/detail/to_ruby.ipp +409 -31
  62. data/rice/detail/to_ruby_defn.hpp +48 -0
  63. data/rice/forward_declares.ipp +82 -0
  64. data/rice/global_function.hpp +16 -20
  65. data/rice/global_function.ipp +8 -17
  66. data/rice/rice.hpp +59 -0
  67. data/rice/ruby_mark.hpp +5 -3
  68. data/rice/ruby_try_catch.hpp +4 -4
  69. data/rice/stl.hpp +11 -0
  70. data/sample/callbacks/extconf.rb +6 -0
  71. data/sample/callbacks/sample_callbacks.cpp +35 -0
  72. data/sample/callbacks/test.rb +28 -0
  73. data/sample/enum/extconf.rb +3 -0
  74. data/sample/enum/sample_enum.cpp +3 -17
  75. data/sample/enum/test.rb +2 -2
  76. data/sample/inheritance/animals.cpp +8 -24
  77. data/sample/inheritance/extconf.rb +3 -0
  78. data/sample/inheritance/test.rb +1 -1
  79. data/sample/map/extconf.rb +3 -0
  80. data/sample/map/map.cpp +10 -18
  81. data/sample/map/test.rb +1 -1
  82. data/test/embed_ruby.cpp +34 -0
  83. data/test/embed_ruby.hpp +4 -0
  84. data/test/ext/t1/extconf.rb +3 -0
  85. data/test/ext/t1/t1.cpp +1 -3
  86. data/test/ext/t2/extconf.rb +3 -0
  87. data/test/ext/t2/t2.cpp +1 -1
  88. data/test/extconf.rb +23 -0
  89. data/test/ruby/test_callbacks_sample.rb +28 -0
  90. data/test/ruby/test_multiple_extensions.rb +18 -0
  91. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  92. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  93. data/test/test_Address_Registration_Guard.cpp +25 -11
  94. data/test/test_Array.cpp +131 -74
  95. data/test/test_Attribute.cpp +147 -0
  96. data/test/test_Builtin_Object.cpp +36 -15
  97. data/test/test_Class.cpp +151 -274
  98. data/test/test_Constructor.cpp +10 -9
  99. data/test/test_Data_Object.cpp +135 -193
  100. data/test/test_Data_Type.cpp +323 -252
  101. data/test/test_Director.cpp +56 -42
  102. data/test/test_Enum.cpp +230 -104
  103. data/test/test_Exception.cpp +7 -7
  104. data/test/test_Hash.cpp +33 -31
  105. data/test/test_Identifier.cpp +6 -6
  106. data/test/test_Inheritance.cpp +221 -0
  107. data/test/test_Iterator.cpp +161 -0
  108. data/test/test_Jump_Tag.cpp +1 -1
  109. data/test/test_Keep_Alive.cpp +161 -0
  110. data/test/test_Memory_Management.cpp +4 -5
  111. data/test/test_Module.cpp +169 -111
  112. data/test/test_Object.cpp +51 -19
  113. data/test/test_Ownership.cpp +275 -0
  114. data/test/test_Self.cpp +205 -0
  115. data/test/test_Stl_Optional.cpp +90 -0
  116. data/test/test_Stl_Pair.cpp +144 -0
  117. data/test/test_Stl_SmartPointer.cpp +200 -0
  118. data/test/test_Stl_String.cpp +74 -0
  119. data/test/test_Stl_Vector.cpp +652 -0
  120. data/test/test_String.cpp +3 -3
  121. data/test/test_Struct.cpp +31 -40
  122. data/test/test_Symbol.cpp +3 -3
  123. data/test/test_To_From_Ruby.cpp +283 -218
  124. data/test/test_global_functions.cpp +41 -20
  125. data/test/unittest.cpp +34 -8
  126. data/test/unittest.hpp +0 -4
  127. metadata +117 -137
  128. data/Doxyfile +0 -2280
  129. data/Makefile.am +0 -26
  130. data/Makefile.in +0 -920
  131. data/README +0 -1055
  132. data/README.mingw +0 -8
  133. data/aclocal.m4 +0 -1088
  134. data/bootstrap +0 -8
  135. data/check_stdcxx_11.ac +0 -142
  136. data/config.guess +0 -1421
  137. data/config.sub +0 -1807
  138. data/configure +0 -7481
  139. data/configure.ac +0 -55
  140. data/depcomp +0 -791
  141. data/doxygen.ac +0 -314
  142. data/doxygen.am +0 -186
  143. data/extconf.rb +0 -69
  144. data/install-sh +0 -501
  145. data/missing +0 -215
  146. data/post-autoconf.rb +0 -22
  147. data/post-automake.rb +0 -28
  148. data/rice/Address_Registration_Guard.cpp +0 -22
  149. data/rice/Arg_impl.hpp +0 -129
  150. data/rice/Arg_operators.cpp +0 -21
  151. data/rice/Arg_operators.hpp +0 -19
  152. data/rice/Array.hpp +0 -214
  153. data/rice/Array.ipp +0 -256
  154. data/rice/Builtin_Object.hpp +0 -8
  155. data/rice/Builtin_Object.ipp +0 -50
  156. data/rice/Builtin_Object_defn.hpp +0 -50
  157. data/rice/Class.cpp +0 -57
  158. data/rice/Class.hpp +0 -8
  159. data/rice/Class.ipp +0 -6
  160. data/rice/Class_defn.hpp +0 -83
  161. data/rice/Data_Type.cpp +0 -54
  162. data/rice/Data_Type_fwd.hpp +0 -12
  163. data/rice/Director.cpp +0 -13
  164. data/rice/Exception.cpp +0 -59
  165. data/rice/Exception_Base.hpp +0 -8
  166. data/rice/Exception_Base.ipp +0 -13
  167. data/rice/Exception_Base_defn.hpp +0 -27
  168. data/rice/Hash.hpp +0 -227
  169. data/rice/Hash.ipp +0 -329
  170. data/rice/Identifier.cpp +0 -8
  171. data/rice/Jump_Tag.hpp +0 -24
  172. data/rice/Makefile.am +0 -124
  173. data/rice/Makefile.in +0 -839
  174. data/rice/Module.cpp +0 -84
  175. data/rice/Module.hpp +0 -8
  176. data/rice/Module.ipp +0 -6
  177. data/rice/Module_defn.hpp +0 -88
  178. data/rice/Module_impl.hpp +0 -281
  179. data/rice/Module_impl.ipp +0 -345
  180. data/rice/Object.cpp +0 -169
  181. data/rice/Object.hpp +0 -8
  182. data/rice/Object.ipp +0 -19
  183. data/rice/Object_defn.hpp +0 -191
  184. data/rice/Require_Guard.hpp +0 -21
  185. data/rice/String.cpp +0 -94
  186. data/rice/String.hpp +0 -91
  187. data/rice/Struct.cpp +0 -117
  188. data/rice/Struct.hpp +0 -162
  189. data/rice/Struct.ipp +0 -26
  190. data/rice/Symbol.cpp +0 -25
  191. data/rice/Symbol.hpp +0 -66
  192. data/rice/Symbol.ipp +0 -44
  193. data/rice/config.hpp +0 -47
  194. data/rice/config.hpp.in +0 -46
  195. data/rice/detail/Arguments.hpp +0 -118
  196. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  197. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3694
  198. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  199. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2774
  200. data/rice/detail/Caster.hpp +0 -103
  201. data/rice/detail/Not_Copyable.hpp +0 -25
  202. data/rice/detail/Wrapped_Function.hpp +0 -33
  203. data/rice/detail/cfp.hpp +0 -24
  204. data/rice/detail/cfp.ipp +0 -51
  205. data/rice/detail/check_ruby_type.cpp +0 -27
  206. data/rice/detail/check_ruby_type.hpp +0 -23
  207. data/rice/detail/creation_funcs.hpp +0 -37
  208. data/rice/detail/creation_funcs.ipp +0 -36
  209. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  210. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  211. data/rice/detail/demangle.cpp +0 -56
  212. data/rice/detail/demangle.hpp +0 -19
  213. data/rice/detail/env.hpp +0 -11
  214. data/rice/detail/method_data.cpp +0 -86
  215. data/rice/detail/node.hpp +0 -13
  216. data/rice/detail/object_call.hpp +0 -69
  217. data/rice/detail/object_call.ipp +0 -131
  218. data/rice/detail/protect.cpp +0 -29
  219. data/rice/detail/protect.hpp +0 -34
  220. data/rice/detail/ruby_version_code.hpp +0 -6
  221. data/rice/detail/ruby_version_code.hpp.in +0 -6
  222. data/rice/detail/st.hpp +0 -22
  223. data/rice/detail/traits.hpp +0 -43
  224. data/rice/detail/win32.hpp +0 -16
  225. data/rice/detail/wrap_function.hpp +0 -341
  226. data/rice/detail/wrap_function.ipp +0 -514
  227. data/rice/protect.hpp +0 -92
  228. data/rice/protect.ipp +0 -1134
  229. data/rice/rubypp.rb +0 -97
  230. data/rice/to_from_ruby.hpp +0 -8
  231. data/rice/to_from_ruby.ipp +0 -294
  232. data/rice/to_from_ruby_defn.hpp +0 -70
  233. data/ruby.ac +0 -135
  234. data/ruby/Makefile.am +0 -1
  235. data/ruby/Makefile.in +0 -625
  236. data/ruby/lib/Makefile.am +0 -3
  237. data/ruby/lib/Makefile.in +0 -503
  238. data/ruby/lib/mkmf-rice.rb.in +0 -217
  239. data/ruby/lib/version.rb +0 -3
  240. data/sample/Makefile.am +0 -47
  241. data/sample/Makefile.in +0 -486
  242. data/test/Makefile.am +0 -72
  243. data/test/Makefile.in +0 -1150
  244. data/test/ext/Makefile.am +0 -41
  245. data/test/ext/Makefile.in +0 -480
  246. data/test/test_rice.rb +0 -41
data/test/test_String.cpp CHANGED
@@ -1,6 +1,6 @@
1
1
  #include "unittest.hpp"
2
- #include "rice/String.hpp"
3
- #include "rice/global_function.hpp"
2
+ #include "embed_ruby.hpp"
3
+ #include <rice/rice.hpp>
4
4
 
5
5
  using namespace Rice;
6
6
 
@@ -8,7 +8,7 @@ TESTSUITE(String);
8
8
 
9
9
  SETUP(String)
10
10
  {
11
- ruby_init();
11
+ embed_ruby();
12
12
  }
13
13
 
14
14
  TESTCASE(default_construct)
data/test/test_Struct.cpp CHANGED
@@ -1,7 +1,6 @@
1
1
  #include "unittest.hpp"
2
- #include "rice/Struct.hpp"
3
- #include "rice/Symbol.hpp"
4
- #include "rice/global_function.hpp"
2
+ #include "embed_ruby.hpp"
3
+ #include <rice/rice.hpp>
5
4
 
6
5
  using namespace Rice;
7
6
 
@@ -22,7 +21,7 @@ namespace
22
21
 
23
22
  SETUP(Struct)
24
23
  {
25
- ruby_init();
24
+ embed_ruby();
26
25
  }
27
26
 
28
27
  TESTCASE(default_construct)
@@ -53,14 +52,6 @@ TESTCASE(copy_construct)
53
52
  ASSERT_EQUAL("z", Symbol(members[2]).c_str());
54
53
  }
55
54
 
56
- TESTCASE(offset_of)
57
- {
58
- Struct s(define_3d_point());
59
- ASSERT_EQUAL(0, s.offset_of("x"));
60
- ASSERT_EQUAL(1, s.offset_of("y"));
61
- ASSERT_EQUAL(2, s.offset_of("z"));
62
- }
63
-
64
55
  TESTCASE(new_instance_no_args)
65
56
  {
66
57
  Struct s(define_3d_point());
@@ -76,12 +67,12 @@ TESTCASE(new_instance_with_args)
76
67
  Array args(a);
77
68
  Struct s(define_3d_point());
78
69
  Struct::Instance p(s.new_instance(args));
79
- ASSERT_EQUAL(to_ruby(1), Object(rb_struct_getmember(p, rb_intern("x"))));
80
- ASSERT_EQUAL(to_ruby(2), Object(rb_struct_getmember(p, rb_intern("y"))));
81
- ASSERT_EQUAL(to_ruby(3), Object(rb_struct_getmember(p, rb_intern("z"))));
70
+ ASSERT_EQUAL(detail::to_ruby(1), rb_struct_getmember(p, rb_intern("x")));
71
+ ASSERT_EQUAL(detail::to_ruby(2), rb_struct_getmember(p, rb_intern("y")));
72
+ ASSERT_EQUAL(detail::to_ruby(3), rb_struct_getmember(p, rb_intern("z")));
82
73
  }
83
74
 
84
- TESTCASE(swap)
75
+ /*TESTCASE(swap)
85
76
  {
86
77
  Struct s(define_3d_point());
87
78
  Struct s2;
@@ -102,7 +93,7 @@ TESTCASE(swap)
102
93
  }
103
94
 
104
95
  s2.swap(s);
105
- }
96
+ }*/
106
97
 
107
98
  TESTCASE(members)
108
99
  {
@@ -120,9 +111,9 @@ TESTCASE(construct_instance)
120
111
  Array args(a);
121
112
  Struct s(define_3d_point());
122
113
  Struct::Instance p(s, args);
123
- ASSERT_EQUAL(to_ruby(1), Object(rb_struct_getmember(p, rb_intern("x"))));
124
- ASSERT_EQUAL(to_ruby(2), Object(rb_struct_getmember(p, rb_intern("y"))));
125
- ASSERT_EQUAL(to_ruby(3), Object(rb_struct_getmember(p, rb_intern("z"))));
114
+ ASSERT_EQUAL(detail::to_ruby(1), rb_struct_getmember(p, rb_intern("x")));
115
+ ASSERT_EQUAL(detail::to_ruby(2), rb_struct_getmember(p, rb_intern("y")));
116
+ ASSERT_EQUAL(detail::to_ruby(3), rb_struct_getmember(p, rb_intern("z")));
126
117
  }
127
118
 
128
119
  TESTCASE(wrap_instance)
@@ -130,9 +121,9 @@ TESTCASE(wrap_instance)
130
121
  Struct s(define_3d_point());
131
122
  Object o = s.instance_eval("new(1, 2, 3)");
132
123
  Struct::Instance p(s, o);
133
- ASSERT_EQUAL(to_ruby(1), Object(rb_struct_getmember(p, rb_intern("x"))));
134
- ASSERT_EQUAL(to_ruby(2), Object(rb_struct_getmember(p, rb_intern("y"))));
135
- ASSERT_EQUAL(to_ruby(3), Object(rb_struct_getmember(p, rb_intern("z"))));
124
+ ASSERT_EQUAL(detail::to_ruby(1), rb_struct_getmember(p, rb_intern("x")));
125
+ ASSERT_EQUAL(detail::to_ruby(2), rb_struct_getmember(p, rb_intern("y")));
126
+ ASSERT_EQUAL(detail::to_ruby(3), rb_struct_getmember(p, rb_intern("z")));
136
127
  }
137
128
 
138
129
  TESTCASE(instance_bracket_identifier)
@@ -141,9 +132,9 @@ TESTCASE(instance_bracket_identifier)
141
132
  Array args(a);
142
133
  Struct s(define_3d_point());
143
134
  Struct::Instance p(s, args);
144
- ASSERT_EQUAL(to_ruby(1), p[Identifier("x")]);
145
- ASSERT_EQUAL(to_ruby(2), p[Identifier("y")]);
146
- ASSERT_EQUAL(to_ruby(3), p[Identifier("z")]);
135
+ ASSERT_EQUAL(detail::to_ruby(1), p[Identifier("x")].value());
136
+ ASSERT_EQUAL(detail::to_ruby(2), p[Identifier("y")].value());
137
+ ASSERT_EQUAL(detail::to_ruby(3), p[Identifier("z")].value());
147
138
  }
148
139
 
149
140
  TESTCASE(instance_bracket_name)
@@ -152,9 +143,9 @@ TESTCASE(instance_bracket_name)
152
143
  Array args(a);
153
144
  Struct s(define_3d_point());
154
145
  Struct::Instance p(s, args);
155
- ASSERT_EQUAL(to_ruby(1), p["x"]);
156
- ASSERT_EQUAL(to_ruby(2), p["y"]);
157
- ASSERT_EQUAL(to_ruby(3), p["z"]);
146
+ ASSERT_EQUAL(detail::to_ruby(1), p["x"].value());
147
+ ASSERT_EQUAL(detail::to_ruby(2), p["y"].value());
148
+ ASSERT_EQUAL(detail::to_ruby(3), p["z"].value());
158
149
  }
159
150
 
160
151
  TESTCASE(instance_bracket_index)
@@ -163,12 +154,12 @@ TESTCASE(instance_bracket_index)
163
154
  Array args(a);
164
155
  Struct s(define_3d_point());
165
156
  Struct::Instance p(s, args);
166
- ASSERT_EQUAL(to_ruby(1), p[0]);
167
- ASSERT_EQUAL(to_ruby(2), p[1]);
168
- ASSERT_EQUAL(to_ruby(3), p[2]);
157
+ ASSERT_EQUAL(detail::to_ruby(1), p[0].value());
158
+ ASSERT_EQUAL(detail::to_ruby(2), p[1].value());
159
+ ASSERT_EQUAL(detail::to_ruby(3), p[2].value());
169
160
  }
170
161
 
171
- TESTCASE(instance_swap)
162
+ /*TESTCASE(instance_swap)
172
163
  {
173
164
  Struct s(define_3d_point());
174
165
 
@@ -182,14 +173,14 @@ TESTCASE(instance_swap)
182
173
 
183
174
  p1.swap(p2);
184
175
 
185
- ASSERT_EQUAL(to_ruby(4), Object(rb_struct_getmember(p1, rb_intern("x"))));
186
- ASSERT_EQUAL(to_ruby(5), Object(rb_struct_getmember(p1, rb_intern("y"))));
187
- ASSERT_EQUAL(to_ruby(6), Object(rb_struct_getmember(p1, rb_intern("z"))));
176
+ ASSERT_EQUAL(detail::to_ruby(4), rb_struct_getmember(p1, rb_intern("x")));
177
+ ASSERT_EQUAL(detail::to_ruby(5), rb_struct_getmember(p1, rb_intern("y")));
178
+ ASSERT_EQUAL(detail::to_ruby(6), rb_struct_getmember(p1, rb_intern("z")));
188
179
 
189
- ASSERT_EQUAL(to_ruby(1), Object(rb_struct_getmember(p2, rb_intern("x"))));
190
- ASSERT_EQUAL(to_ruby(2), Object(rb_struct_getmember(p2, rb_intern("y"))));
191
- ASSERT_EQUAL(to_ruby(3), Object(rb_struct_getmember(p2, rb_intern("z"))));
192
- }
180
+ ASSERT_EQUAL(detail::to_ruby(1), rb_struct_getmember(p2, rb_intern("x")));
181
+ ASSERT_EQUAL(detail::to_ruby(2), rb_struct_getmember(p2, rb_intern("y")));
182
+ ASSERT_EQUAL(detail::to_ruby(3), rb_struct_getmember(p2, rb_intern("z")));
183
+ }*/
193
184
 
194
185
  /**
195
186
  * Issue 59 - Copy constructor compilation problem.
data/test/test_Symbol.cpp CHANGED
@@ -1,6 +1,6 @@
1
1
  #include "unittest.hpp"
2
- #include "rice/Symbol.hpp"
3
- #include "rice/Identifier.hpp"
2
+ #include "embed_ruby.hpp"
3
+ #include <rice/rice.hpp>
4
4
 
5
5
  using namespace Rice;
6
6
 
@@ -8,7 +8,7 @@ TESTSUITE(Symbol);
8
8
 
9
9
  SETUP(Symbol)
10
10
  {
11
- ruby_init();
11
+ embed_ruby();
12
12
  }
13
13
 
14
14
  TESTCASE(construct_from_symbol)
@@ -1,8 +1,7 @@
1
1
  #include "unittest.hpp"
2
- #include "rice/to_from_ruby.hpp"
3
- #include "rice/String.hpp"
4
- #include "rice/Array.hpp"
5
- #include "rice/Hash.hpp"
2
+ #include "embed_ruby.hpp"
3
+ #include <rice/rice.hpp>
4
+
6
5
  #include <limits>
7
6
  #include <cmath>
8
7
 
@@ -12,317 +11,383 @@ TESTSUITE(To_From_Ruby);
12
11
 
13
12
  SETUP(To_From_Ruby)
14
13
  {
15
- ruby_init();
14
+ embed_ruby();
16
15
  }
17
16
 
18
17
  TESTCASE(object_to_ruby)
19
18
  {
20
19
  Object o(rb_str_new2("foo"));
21
- ASSERT_EQUAL(o.value(), to_ruby(o).value());
20
+ ASSERT_EQUAL(o.value(), detail::to_ruby(o));
22
21
  }
23
22
 
24
23
  TESTCASE(object_from_ruby)
25
24
  {
26
25
  Object o(rb_str_new2("foo"));
27
- ASSERT_EQUAL(o.value(), from_ruby<Object>(o).value());
26
+ ASSERT_EQUAL(o, detail::From_Ruby<Object>().convert(o));
27
+ }
28
+
29
+ TESTCASE(short_to_ruby)
30
+ {
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()));
38
+ }
39
+
40
+ TESTCASE(short_from_ruby)
41
+ {
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
+ );
28
55
  }
29
56
 
30
57
  TESTCASE(int_to_ruby)
31
58
  {
32
- ASSERT_EQUAL(INT2NUM(0), to_ruby((int)0).value());
33
- ASSERT_EQUAL(INT2NUM(-1), to_ruby((int)-1).value());
34
- ASSERT_EQUAL(INT2NUM(1), to_ruby((int)1).value());
35
- ASSERT_EQUAL(
36
- Object(INT2NUM(std::numeric_limits<int>::min())),
37
- to_ruby(std::numeric_limits<int>::min()));
38
- ASSERT_EQUAL(
39
- Object(INT2NUM(std::numeric_limits<int>::max())),
40
- 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())));
41
64
  }
42
65
 
43
66
  TESTCASE(int_from_ruby)
44
67
  {
45
- ASSERT_EQUAL(0, from_ruby<int>(INT2NUM(0)));
46
- ASSERT_EQUAL(-1, from_ruby<int>(INT2NUM(-1)));
47
- ASSERT_EQUAL(1, from_ruby<int>(INT2NUM(1)));
48
- ASSERT_EQUAL(
49
- std::numeric_limits<int>::min(),
50
- from_ruby<int>(INT2NUM(std::numeric_limits<int>::min())));
51
- ASSERT_EQUAL(
52
- std::numeric_limits<int>::max(),
53
- 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
+ );
54
81
  }
55
82
 
56
83
  TESTCASE(long_to_ruby)
57
84
  {
58
- ASSERT_EQUAL(LONG2NUM(0), to_ruby((long)0).value());
59
- ASSERT_EQUAL(LONG2NUM(-1), to_ruby((long)-1).value());
60
- ASSERT_EQUAL(LONG2NUM(1), to_ruby((long)1).value());
61
- ASSERT_EQUAL(
62
- LONG2NUM(FIXNUM_MAX),
63
- to_ruby(FIXNUM_MAX).value());
64
- ASSERT_EQUAL(
65
- LONG2NUM(FIXNUM_MIN),
66
- to_ruby(FIXNUM_MIN).value());
67
- ASSERT_EQUAL(
68
- Object(LONG2NUM(std::numeric_limits<long>::min())),
69
- to_ruby(std::numeric_limits<long>::min()));
70
- ASSERT_EQUAL(
71
- Object(LONG2NUM(std::numeric_limits<long>::max())),
72
- 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())));
73
92
  }
74
93
 
75
94
  TESTCASE(long_from_ruby)
76
95
  {
77
- ASSERT_EQUAL(0, from_ruby<long>(LONG2NUM(0)));
78
- ASSERT_EQUAL(-1, from_ruby<long>(LONG2NUM(-1)));
79
- ASSERT_EQUAL(1, from_ruby<long>(LONG2NUM(1)));
80
- ASSERT_EQUAL(
81
- FIXNUM_MIN,
82
- from_ruby<long>(LONG2NUM(FIXNUM_MIN)));
83
- ASSERT_EQUAL(
84
- FIXNUM_MAX,
85
- from_ruby<long>(LONG2NUM(FIXNUM_MAX)));
86
- ASSERT_EQUAL(
87
- std::numeric_limits<long>::min(),
88
- from_ruby<long>(LONG2NUM(std::numeric_limits<long>::min())));
89
- ASSERT_EQUAL(
90
- std::numeric_limits<long>::max(),
91
- 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
+ );
109
+ }
110
+
111
+ TESTCASE(long_long_to_ruby)
112
+ {
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())));
118
+ }
119
+
120
+ TESTCASE(long_long_from_ruby)
121
+ {
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
+ );
135
+ }
136
+
137
+ TESTCASE(unsigned_short_to_ruby)
138
+ {
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())));
143
+ }
144
+
145
+ TESTCASE(unsigned_short_from_ruby)
146
+ {
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
+ );
92
159
  }
93
160
 
94
161
  TESTCASE(unsigned_int_to_ruby)
95
162
  {
96
- ASSERT_EQUAL(UINT2NUM(0), to_ruby((unsigned int)0).value());
97
- ASSERT_EQUAL(UINT2NUM(1), to_ruby((unsigned int)1).value());
98
- ASSERT_EQUAL(
99
- Object(UINT2NUM(std::numeric_limits<unsigned int>::min())),
100
- to_ruby(std::numeric_limits<unsigned int>::min()));
101
- ASSERT_EQUAL(
102
- Object(UINT2NUM(std::numeric_limits<unsigned int>::max())),
103
- 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())));
104
167
  }
105
168
 
106
169
  TESTCASE(unsigned_int_from_ruby)
107
170
  {
108
- ASSERT_EQUAL(0u, from_ruby<unsigned int>(UINT2NUM(0)));
109
- ASSERT_EQUAL(1u, from_ruby<unsigned int>(UINT2NUM(1)));
110
- ASSERT_EQUAL(
111
- std::numeric_limits<unsigned int>::min(),
112
- from_ruby<unsigned int>(UINT2NUM(std::numeric_limits<unsigned int>::min())));
113
- ASSERT_EQUAL(
114
- std::numeric_limits<unsigned int>::max(),
115
- 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
+ );
116
183
  }
117
184
 
118
185
  TESTCASE(unsigned_long_to_ruby)
119
186
  {
120
- ASSERT_EQUAL(ULONG2NUM(0), to_ruby((unsigned long)0).value());
121
- ASSERT_EQUAL(ULONG2NUM(1), to_ruby((unsigned long)1).value());
122
- ASSERT_EQUAL(
123
- ULONG2NUM(FIXNUM_MAX),
124
- to_ruby(FIXNUM_MAX).value());
125
- ASSERT_EQUAL(
126
- Object(ULONG2NUM(std::numeric_limits<unsigned long>::min())),
127
- to_ruby(std::numeric_limits<unsigned long>::min()));
128
- ASSERT_EQUAL(
129
- Object(ULONG2NUM(std::numeric_limits<unsigned long>::max())),
130
- 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())));
131
192
  }
132
193
 
133
194
  TESTCASE(unsigned_long_from_ruby)
134
195
  {
135
- ASSERT_EQUAL(0u, from_ruby<unsigned long>(ULONG2NUM(0)));
136
- ASSERT_EQUAL(1u, from_ruby<unsigned long>(ULONG2NUM(1)));
137
- ASSERT_EQUAL(
138
- static_cast<unsigned long>(FIXNUM_MIN),
139
- from_ruby<unsigned long>(ULONG2NUM(FIXNUM_MIN)));
140
- ASSERT_EQUAL(
141
- std::numeric_limits<unsigned long>::min(),
142
- from_ruby<unsigned long>(ULONG2NUM(std::numeric_limits<unsigned long>::min())));
143
- ASSERT_EQUAL(
144
- std::numeric_limits<unsigned long>::max(),
145
- 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
+ );
210
+ }
211
+
212
+ TESTCASE(unsigned_long_long_to_ruby)
213
+ {
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())));
218
+ }
219
+
220
+ TESTCASE(unsigned_long_long_from_ruby)
221
+ {
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
+ );
146
234
  }
147
235
 
148
236
  TESTCASE(bool_to_ruby)
149
237
  {
150
- ASSERT_EQUAL(Qfalse, to_ruby(false).value());
151
- 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)));
152
240
  }
153
241
 
154
242
  TESTCASE(bool_from_ruby)
155
243
  {
156
- ASSERT_EQUAL(false, from_ruby<bool>(Object(Qfalse)));
157
- 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)));
158
250
  }
159
251
 
160
252
  TESTCASE(float_to_ruby)
161
253
  {
162
- ASSERT_EQUAL(Object(rb_float_new(0.0f)), to_ruby(0.0f));
163
- ASSERT_EQUAL(Object(rb_float_new(-1.0f)), to_ruby(-1.0f));
164
- ASSERT_EQUAL(Object(rb_float_new(1.0f)), to_ruby(1.0f));
165
- ASSERT_EQUAL(Object(rb_float_new(0.5f)), to_ruby(0.5f));
166
- ASSERT_EQUAL(
167
- Object(rb_float_new(std::numeric_limits<float>::min())),
168
- to_ruby(std::numeric_limits<float>::min()));
169
- ASSERT_EQUAL(
170
- Object(rb_float_new(std::numeric_limits<float>::max())),
171
- to_ruby(std::numeric_limits<float>::max()));
172
- ASSERT(
173
- to_ruby(std::numeric_limits<float>::quiet_NaN()).call("nan?"));
174
- ASSERT(
175
- to_ruby(std::numeric_limits<float>::signaling_NaN()).call("nan?"));
176
- ASSERT_EQUAL(
177
- Object(rb_float_new(std::numeric_limits<float>::epsilon())),
178
- 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()));
179
264
  }
180
265
 
181
266
  TESTCASE(float_from_ruby)
182
267
  {
183
- ASSERT_EQUAL(0.0f, from_ruby<float>(rb_float_new(0.0f)));
184
- ASSERT_EQUAL(-1.0f, from_ruby<float>(rb_float_new(-1.0f)));
185
- ASSERT_EQUAL(1.0f, from_ruby<float>(rb_float_new(1.0f)));
186
- ASSERT_EQUAL(
187
- std::numeric_limits<float>::min(),
188
- from_ruby<float>(rb_float_new(std::numeric_limits<float>::min())));
189
- ASSERT_EQUAL(
190
- std::numeric_limits<float>::max(),
191
- from_ruby<float>(rb_float_new(std::numeric_limits<float>::max())));
192
- ASSERT(
193
- std::isnan(from_ruby<float>(rb_float_new(std::numeric_limits<float>::quiet_NaN()))));
194
- ASSERT(
195
- std::isnan(from_ruby<float>(rb_float_new(std::numeric_limits<float>::signaling_NaN()))));
196
- ASSERT_EQUAL(
197
- std::numeric_limits<float>::epsilon(),
198
- 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
+ );
199
285
  }
200
286
 
201
287
  TESTCASE(double_to_ruby)
202
288
  {
203
- ASSERT_EQUAL(Object(rb_float_new(0.0f)), to_ruby(0.0f));
204
- ASSERT_EQUAL(Object(rb_float_new(-1.0f)), to_ruby(-1.0f));
205
- ASSERT_EQUAL(Object(rb_float_new(1.0f)), to_ruby(1.0f));
206
- ASSERT_EQUAL(Object(rb_float_new(0.5f)), to_ruby(0.5f));
207
- ASSERT_EQUAL(
208
- Object(rb_float_new(std::numeric_limits<double>::min())),
209
- to_ruby(std::numeric_limits<double>::min()));
210
- ASSERT_EQUAL(
211
- Object(rb_float_new(std::numeric_limits<double>::max())),
212
- to_ruby(std::numeric_limits<double>::max()));
213
- ASSERT(
214
- to_ruby(std::numeric_limits<double>::quiet_NaN()).call("nan?"));
215
- ASSERT(
216
- to_ruby(std::numeric_limits<double>::signaling_NaN()).call("nan?"));
217
- ASSERT_EQUAL(
218
- Object(rb_float_new(std::numeric_limits<double>::epsilon())),
219
- 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())));
220
298
  }
221
299
 
222
300
  TESTCASE(double_from_ruby)
223
301
  {
224
- ASSERT_EQUAL(0.0f, from_ruby<double>(rb_float_new(0.0f)));
225
- ASSERT_EQUAL(-1.0f, from_ruby<double>(rb_float_new(-1.0f)));
226
- ASSERT_EQUAL(1.0f, from_ruby<double>(rb_float_new(1.0f)));
227
- ASSERT_EQUAL(
228
- std::numeric_limits<double>::min(),
229
- from_ruby<double>(rb_float_new(std::numeric_limits<double>::min())));
230
- ASSERT_EQUAL(
231
- std::numeric_limits<double>::max(),
232
- from_ruby<double>(rb_float_new(std::numeric_limits<double>::max())));
233
- ASSERT(
234
- std::isnan(from_ruby<double>(rb_float_new(std::numeric_limits<double>::quiet_NaN()))));
235
- ASSERT(
236
- std::isnan(from_ruby<double>(rb_float_new(std::numeric_limits<double>::signaling_NaN()))));
237
- ASSERT_EQUAL(
238
- std::numeric_limits<double>::epsilon(),
239
- 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
+ );
240
319
  }
241
320
 
242
321
  TESTCASE(char_const_ptr_to_ruby)
243
322
  {
244
- ASSERT_EQUAL(String(""), to_ruby((char const *)""));
245
- 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")));
246
325
  }
247
326
 
248
327
  TESTCASE(char_const_ptr_from_ruby)
249
328
  {
250
329
  char const* foo = "foo";
251
- ASSERT_EQUAL("", from_ruby<char const *>(rb_str_new2("")));
252
- 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
+ );
253
338
  }
254
339
 
255
340
  TESTCASE(char_from_ruby_single_character_string)
256
341
  {
257
- ASSERT_EQUAL('x', from_ruby<char>(rb_str_new2("x")));
342
+ ASSERT_EQUAL('x', detail::From_Ruby<char>().convert(rb_str_new2("x")));
258
343
  }
259
344
 
260
345
  TESTCASE(char_from_ruby_longer_string)
261
346
  {
262
- ASSERT_EXCEPTION(
347
+ ASSERT_EXCEPTION_CHECK(
263
348
  std::invalid_argument,
264
- 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())
265
351
  );
266
- }
267
-
268
- TESTCASE(char_from_ruby_fixnum)
269
- {
270
- ASSERT_EQUAL('1', from_ruby<char>(INT2NUM(49)));
271
- }
272
-
273
- TESTCASE(char_star_from_ruby)
274
- {
275
- const char* expected = "my string";
276
- ASSERT_EQUAL(expected, from_ruby<const char*>(rb_str_new2("my string")));
277
- }
278
352
 
279
- TESTCASE(std_string_to_ruby)
280
- {
281
- ASSERT_EQUAL(String(""), to_ruby(std::string("")));
282
- ASSERT_EQUAL(String("foo"), to_ruby(std::string("foo")));
283
- }
284
-
285
- TESTCASE(std_string_from_ruby)
286
- {
287
- ASSERT_EQUAL(std::string(""), from_ruby<std::string>(rb_str_new2("")));
288
- ASSERT_EQUAL(std::string("foo"), from_ruby<std::string>(rb_str_new2("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
+ );
289
358
  }
290
359
 
291
- TESTCASE(std_string_to_ruby_with_binary)
360
+ TESTCASE(char_from_ruby_fixnum)
292
361
  {
293
- Rice::String got = to_ruby(std::string("\000test", 5));
294
-
295
- ASSERT_EQUAL(String(std::string("\000test", 5)), got);
296
- ASSERT_EQUAL(5, got.length());
362
+ ASSERT_EQUAL('1', detail::From_Ruby<char>().convert(INT2NUM(49)));
297
363
  }
298
364
 
299
- TESTCASE(std_string_from_ruby_with_binary)
365
+ TESTCASE(unsigned_char_from_ruby)
300
366
  {
301
- std::string got = from_ruby<std::string>(rb_str_new("\000test", 5));
302
- ASSERT_EQUAL(5, got.length());
303
- ASSERT_EQUAL(std::string("\000test", 5), got);
304
- }
367
+ unsigned char expected = -1;
368
+ ASSERT_EQUAL(expected, detail::From_Ruby<unsigned char>().convert(INT2NUM(-1)));
305
369
 
306
- TESTCASE(array_to_ruby)
307
- {
308
- Array a(rb_ary_new());
309
- 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
+ );
310
375
  }
311
376
 
312
- TESTCASE(array_from_ruby)
377
+ TESTCASE(signed_char_from_ruby)
313
378
  {
314
- Array a(rb_ary_new());
315
- 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)));
316
381
  }
317
382
 
318
- TESTCASE(hash_to_ruby)
383
+ TESTCASE(char_star_from_ruby)
319
384
  {
320
- Hash h(rb_hash_new());
321
- ASSERT_EQUAL(h.value(), to_ruby(h).value());
322
- }
385
+ const char* expected = "my string";
386
+ ASSERT_EQUAL(expected, detail::From_Ruby<const char*>().convert(rb_str_new2("my string")));
323
387
 
324
- TESTCASE(hash_from_ruby)
325
- {
326
- Hash h(rb_hash_new());
327
- ASSERT_EQUAL(h.value(), from_ruby<Hash>(h).value());
328
- }
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
+ }