rice 4.0.4 → 4.1.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +30 -0
- data/Rakefile +1 -1
- data/include/rice/rice.hpp +2596 -1771
- data/include/rice/stl.hpp +1580 -271
- data/lib/mkmf-rice.rb +5 -2
- data/lib/version.rb +1 -1
- data/rice/Arg.hpp +6 -6
- data/rice/Arg.ipp +8 -9
- data/rice/Constructor.hpp +2 -2
- data/rice/Data_Object.ipp +69 -15
- data/rice/Data_Object_defn.hpp +1 -15
- data/rice/Data_Type.ipp +56 -86
- data/rice/Data_Type_defn.hpp +14 -17
- data/rice/Director.hpp +0 -1
- data/rice/Enum.ipp +31 -22
- data/rice/Exception.ipp +2 -3
- data/rice/Exception_defn.hpp +5 -5
- data/rice/HandlerRegistration.hpp +15 -0
- data/rice/Return.hpp +5 -4
- data/rice/Return.ipp +8 -3
- data/rice/detail/ExceptionHandler.hpp +8 -0
- data/rice/detail/ExceptionHandler.ipp +28 -0
- data/rice/detail/{Exception_Handler_defn.hpp → ExceptionHandler_defn.hpp} +17 -21
- data/rice/detail/HandlerRegistry.hpp +51 -0
- data/rice/detail/HandlerRegistry.ipp +20 -0
- data/rice/detail/InstanceRegistry.hpp +34 -0
- data/rice/detail/InstanceRegistry.ipp +50 -0
- data/rice/detail/MethodInfo.ipp +1 -1
- data/rice/detail/NativeAttribute.hpp +26 -15
- data/rice/detail/NativeAttribute.ipp +76 -47
- data/rice/detail/NativeFunction.hpp +60 -13
- data/rice/detail/NativeFunction.ipp +103 -85
- data/rice/detail/NativeIterator.hpp +49 -0
- data/rice/detail/NativeIterator.ipp +102 -0
- data/rice/detail/NativeRegistry.hpp +31 -0
- data/rice/detail/{method_data.ipp → NativeRegistry.ipp} +20 -16
- data/rice/detail/Registries.hpp +26 -0
- data/rice/detail/Registries.ipp +23 -0
- data/rice/detail/RubyFunction.hpp +6 -11
- data/rice/detail/RubyFunction.ipp +10 -22
- data/rice/detail/Type.hpp +1 -1
- data/rice/detail/Type.ipp +2 -2
- data/rice/detail/TypeRegistry.hpp +8 -11
- data/rice/detail/TypeRegistry.ipp +3 -28
- data/rice/detail/Wrapper.hpp +0 -2
- data/rice/detail/Wrapper.ipp +73 -23
- data/rice/detail/cpp_protect.hpp +93 -0
- data/rice/detail/default_allocation_func.ipp +1 -1
- data/rice/detail/from_ruby.ipp +206 -2
- data/rice/detail/to_ruby.ipp +39 -5
- data/rice/detail/to_ruby_defn.hpp +1 -1
- data/rice/forward_declares.ipp +6 -0
- data/rice/global_function.hpp +0 -4
- data/rice/global_function.ipp +0 -6
- data/rice/rice.hpp +29 -24
- data/rice/stl.hpp +6 -1
- data/test/embed_ruby.cpp +0 -15
- data/test/test_Array.cpp +20 -24
- data/test/test_Class.cpp +8 -47
- data/test/test_Constructor.cpp +0 -2
- data/test/test_Data_Object.cpp +25 -11
- data/test/test_Data_Type.cpp +124 -28
- data/test/test_Director.cpp +12 -13
- data/test/test_Enum.cpp +65 -26
- data/test/test_Inheritance.cpp +9 -9
- data/test/test_Iterator.cpp +134 -5
- data/test/test_Keep_Alive.cpp +7 -7
- data/test/test_Memory_Management.cpp +1 -1
- data/test/test_Module.cpp +25 -62
- data/test/test_Object.cpp +66 -3
- data/test/test_Ownership.cpp +12 -13
- data/test/test_Self.cpp +12 -13
- data/test/test_Stl_Map.cpp +696 -0
- data/test/test_Stl_Optional.cpp +3 -3
- data/test/test_Stl_Pair.cpp +38 -2
- data/test/test_Stl_Reference_Wrapper.cpp +102 -0
- data/test/test_Stl_SmartPointer.cpp +5 -5
- data/test/test_Stl_Unordered_Map.cpp +697 -0
- data/test/test_Stl_Variant.cpp +301 -0
- data/test/test_Stl_Vector.cpp +200 -41
- data/test/test_Struct.cpp +3 -3
- data/test/test_To_From_Ruby.cpp +6 -0
- data/test/test_Tracking.cpp +239 -0
- data/test/unittest.hpp +13 -4
- metadata +23 -13
- data/rice/detail/Exception_Handler.hpp +0 -8
- data/rice/detail/Exception_Handler.ipp +0 -28
- data/rice/detail/Iterator.hpp +0 -23
- data/rice/detail/Iterator.ipp +0 -47
- data/rice/detail/function_traits.hpp +0 -124
- data/rice/detail/method_data.hpp +0 -29
- data/rice/detail/rice_traits.hpp +0 -116
- data/rice/ruby_try_catch.hpp +0 -86
data/test/test_Enum.cpp
CHANGED
@@ -70,7 +70,8 @@ TESTCASE(each)
|
|
70
70
|
std::string code = R"(a = []
|
71
71
|
Color.each { |x| a << x }
|
72
72
|
a)";
|
73
|
-
|
73
|
+
|
74
|
+
Array a = m.module_eval(code);
|
74
75
|
ASSERT_EQUAL(3u, a.size());
|
75
76
|
|
76
77
|
Data_Object<Color> enum_0(a[0]);
|
@@ -83,6 +84,44 @@ TESTCASE(each)
|
|
83
84
|
ASSERT_EQUAL(GREEN, *enum_2);
|
84
85
|
}
|
85
86
|
|
87
|
+
TESTCASE(each_return)
|
88
|
+
{
|
89
|
+
Module m = define_module("Testing");
|
90
|
+
|
91
|
+
Enum<Color> colorEnum = define_color_enum();
|
92
|
+
|
93
|
+
std::string code = R"(Color.each {|x|})";
|
94
|
+
Object colorEnum2 = m.module_eval(code);
|
95
|
+
ASSERT_EQUAL(colorEnum2, Enum<Color>().klass());
|
96
|
+
}
|
97
|
+
|
98
|
+
TESTCASE(to_enum)
|
99
|
+
{
|
100
|
+
Module m = define_module("Testing");
|
101
|
+
|
102
|
+
Enum<Color> colorEnum = define_color_enum();
|
103
|
+
|
104
|
+
std::string code = R"(a = []
|
105
|
+
Color.each.with_index {|x, i| a << x }
|
106
|
+
a)";
|
107
|
+
|
108
|
+
Array a = m.module_eval(code);
|
109
|
+
ASSERT_EQUAL(3u, a.size());
|
110
|
+
|
111
|
+
Data_Object<Color> enum_0(a[0]);
|
112
|
+
ASSERT_EQUAL(RED, *enum_0);
|
113
|
+
|
114
|
+
Data_Object<Color> enum_1(a[1]);
|
115
|
+
ASSERT_EQUAL(BLACK, *enum_1);
|
116
|
+
|
117
|
+
Data_Object<Color> enum_2(a[2]);
|
118
|
+
ASSERT_EQUAL(GREEN, *enum_2);
|
119
|
+
|
120
|
+
code = R"(Color.each)";
|
121
|
+
Object enumerator = m.module_eval(code);
|
122
|
+
ASSERT(enumerator.is_instance_of(rb_cEnumerator));
|
123
|
+
}
|
124
|
+
|
86
125
|
TESTCASE(each_seasons)
|
87
126
|
{
|
88
127
|
Module m = define_module("Testing");
|
@@ -92,7 +131,7 @@ TESTCASE(each_seasons)
|
|
92
131
|
Season.each { |x| a << x }
|
93
132
|
a)";
|
94
133
|
|
95
|
-
Array a = m.
|
134
|
+
Array a = m.module_eval(code);
|
96
135
|
ASSERT_EQUAL(4u, a.size());
|
97
136
|
|
98
137
|
Data_Object<Season> enum_0(a[0]);
|
@@ -113,9 +152,9 @@ TESTCASE(to_s)
|
|
113
152
|
Module m = define_module("Testing");
|
114
153
|
|
115
154
|
Enum<Color> colorEnum = define_color_enum();
|
116
|
-
ASSERT_EQUAL(String("RED"), String(m.
|
117
|
-
ASSERT_EQUAL(String("BLACK"), String(m.
|
118
|
-
ASSERT_EQUAL(String("GREEN"), String(m.
|
155
|
+
ASSERT_EQUAL(String("RED"), String(m.module_eval("Color::RED.to_s")));
|
156
|
+
ASSERT_EQUAL(String("BLACK"), String(m.module_eval("Color::BLACK.to_s")));
|
157
|
+
ASSERT_EQUAL(String("GREEN"), String(m.module_eval("Color::GREEN.to_s")));
|
119
158
|
}
|
120
159
|
|
121
160
|
TESTCASE(to_i)
|
@@ -123,9 +162,9 @@ TESTCASE(to_i)
|
|
123
162
|
Module m = define_module("Testing");
|
124
163
|
|
125
164
|
Enum<Color> colorEnum = define_color_enum();
|
126
|
-
ASSERT_EQUAL(detail::to_ruby(int(RED)), m.
|
127
|
-
ASSERT_EQUAL(detail::to_ruby(int(BLACK)), m.
|
128
|
-
ASSERT_EQUAL(detail::to_ruby(int(GREEN)), m.
|
165
|
+
ASSERT_EQUAL(detail::to_ruby(int(RED)), m.module_eval("Color::RED.to_i").value());
|
166
|
+
ASSERT_EQUAL(detail::to_ruby(int(BLACK)), m.module_eval("Color::BLACK.to_i").value());
|
167
|
+
ASSERT_EQUAL(detail::to_ruby(int(GREEN)), m.module_eval("Color::GREEN.to_i").value());
|
129
168
|
}
|
130
169
|
|
131
170
|
TESTCASE(inspect)
|
@@ -133,9 +172,9 @@ TESTCASE(inspect)
|
|
133
172
|
Module m = define_module("Testing");
|
134
173
|
|
135
174
|
Enum<Color> colorEnum = define_color_enum();
|
136
|
-
ASSERT_EQUAL(String("#<Color::RED>"), String(m.
|
137
|
-
ASSERT_EQUAL(String("#<Color::BLACK>"), String(m.
|
138
|
-
ASSERT_EQUAL(String("#<Color::GREEN>"), String(m.
|
175
|
+
ASSERT_EQUAL(String("#<Color::RED>"), String(m.module_eval("Color::RED.inspect")));
|
176
|
+
ASSERT_EQUAL(String("#<Color::BLACK>"), String(m.module_eval("Color::BLACK.inspect")));
|
177
|
+
ASSERT_EQUAL(String("#<Color::GREEN>"), String(m.module_eval("Color::GREEN.inspect")));
|
139
178
|
}
|
140
179
|
|
141
180
|
TESTCASE(compare)
|
@@ -143,9 +182,9 @@ TESTCASE(compare)
|
|
143
182
|
Module m = define_module("Testing");
|
144
183
|
|
145
184
|
Enum<Color> colorEnum = define_color_enum();
|
146
|
-
ASSERT_EQUAL(detail::to_ruby(-1), m.
|
147
|
-
ASSERT_EQUAL(detail::to_ruby(1), m.
|
148
|
-
ASSERT_EQUAL(detail::to_ruby(0), m.
|
185
|
+
ASSERT_EQUAL(detail::to_ruby(-1), m.module_eval("Color::RED <=> Color::BLACK").value());
|
186
|
+
ASSERT_EQUAL(detail::to_ruby(1), m.module_eval("Color::GREEN <=> Color::RED").value());
|
187
|
+
ASSERT_EQUAL(detail::to_ruby(0), m.module_eval("Color::BLACK <=> Color::BLACK").value());
|
149
188
|
}
|
150
189
|
|
151
190
|
TESTCASE(eql)
|
@@ -153,8 +192,8 @@ TESTCASE(eql)
|
|
153
192
|
Module m = define_module("Testing");
|
154
193
|
|
155
194
|
Enum<Color> colorEnum = define_color_enum();
|
156
|
-
ASSERT_EQUAL(detail::to_ruby(false), m.
|
157
|
-
ASSERT_EQUAL(detail::to_ruby(true), m.
|
195
|
+
ASSERT_EQUAL(detail::to_ruby(false), m.module_eval("Color::RED == Color::BLACK").value());
|
196
|
+
ASSERT_EQUAL(detail::to_ruby(true), m.module_eval("Color::GREEN == Color::GREEN").value());
|
158
197
|
}
|
159
198
|
|
160
199
|
TESTCASE(compare_equal)
|
@@ -244,9 +283,9 @@ TESTCASE(nested_enums)
|
|
244
283
|
|
245
284
|
Module m = define_module("Testing");
|
246
285
|
|
247
|
-
ASSERT_EQUAL(detail::to_ruby(int(0)), m.
|
248
|
-
ASSERT_EQUAL(detail::to_ruby(int(1)), m.
|
249
|
-
ASSERT_EQUAL(detail::to_ruby(int(2)), m.
|
286
|
+
ASSERT_EQUAL(detail::to_ruby(int(0)), m.module_eval("Inner::Props::VALUE1.to_i").value());
|
287
|
+
ASSERT_EQUAL(detail::to_ruby(int(1)), m.module_eval("Inner::Props::VALUE2.to_i").value());
|
288
|
+
ASSERT_EQUAL(detail::to_ruby(int(2)), m.module_eval("Inner::Props::VALUE3.to_i").value());
|
250
289
|
}
|
251
290
|
|
252
291
|
namespace
|
@@ -272,19 +311,19 @@ TESTCASE(using_enums)
|
|
272
311
|
|
273
312
|
Module m = define_module("Testing");
|
274
313
|
|
275
|
-
Object result = m.
|
314
|
+
Object result = m.module_eval("Color.my_favorite_color");
|
276
315
|
ASSERT_EQUAL(RED, detail::From_Ruby<Color>().convert(result.value()));
|
277
316
|
|
278
|
-
result = m.
|
317
|
+
result = m.module_eval("Color.is_my_favorite_color(Color::RED)");
|
279
318
|
ASSERT_EQUAL(Qtrue, result.value());
|
280
319
|
|
281
|
-
result = m.
|
320
|
+
result = m.module_eval("Color.is_my_favorite_color(Color::BLACK)");
|
282
321
|
ASSERT_EQUAL(Qfalse, result.value());
|
283
322
|
|
284
|
-
result = m.
|
323
|
+
result = m.module_eval("Color::RED.is_my_favorite_color");
|
285
324
|
ASSERT_EQUAL(Qtrue, result.value());
|
286
325
|
|
287
|
-
result = m.
|
326
|
+
result = m.module_eval("Color::BLACK.is_my_favorite_color");
|
288
327
|
ASSERT_EQUAL(Qfalse, result.value());
|
289
328
|
}
|
290
329
|
|
@@ -301,7 +340,7 @@ TESTCASE(default_argument)
|
|
301
340
|
define_global_function("default_color", &defaultColor, Arg("aColor") = Color::BLACK);
|
302
341
|
|
303
342
|
Module m = define_module("Testing");
|
304
|
-
Object result = m.
|
343
|
+
Object result = m.module_eval("default_color");
|
305
344
|
ASSERT_EQUAL(Color::BLACK, detail::From_Ruby<Color>().convert(result.value()));
|
306
345
|
}
|
307
346
|
|
@@ -338,4 +377,4 @@ TESTCASE(not_defined)
|
|
338
377
|
define_global_function("undefined_return", &undefinedReturn),
|
339
378
|
ASSERT_EQUAL(message, ex.what())
|
340
379
|
);
|
341
|
-
}
|
380
|
+
}
|
data/test/test_Inheritance.cpp
CHANGED
@@ -94,7 +94,7 @@ TESTCASE(return_base_pointer)
|
|
94
94
|
|
95
95
|
Module m = define_module("Testing");
|
96
96
|
|
97
|
-
Object notification = m.
|
97
|
+
Object notification = m.module_eval("make_notification(NotificationType::Email)");
|
98
98
|
String temp = notification.class_of().name();
|
99
99
|
std::string temp2 = detail::From_Ruby<std::string>().convert(temp);
|
100
100
|
|
@@ -103,7 +103,7 @@ TESTCASE(return_base_pointer)
|
|
103
103
|
ASSERT(!rb_obj_is_kind_of(notification, rcPushNotification));
|
104
104
|
ASSERT(rb_obj_is_instance_of(notification, rcEmailNotification));
|
105
105
|
|
106
|
-
notification = m.
|
106
|
+
notification = m.module_eval("make_notification(NotificationType::Push)");
|
107
107
|
ASSERT(rb_obj_is_kind_of(notification, rcNotification));
|
108
108
|
ASSERT(!rb_obj_is_kind_of(notification, rcEmailNotification));
|
109
109
|
ASSERT(rb_obj_is_kind_of(notification, rcPushNotification));
|
@@ -123,11 +123,11 @@ TESTCASE(base_pointer_method_call)
|
|
123
123
|
|
124
124
|
Module m = define_module("Testing");
|
125
125
|
|
126
|
-
Object message = m.
|
126
|
+
Object message = m.module_eval(R"EOS(notification = EmailNotification.new
|
127
127
|
notification.message)EOS");
|
128
128
|
ASSERT_EQUAL("Email", detail::From_Ruby<std::string>().convert(message));
|
129
129
|
|
130
|
-
message = m.
|
130
|
+
message = m.module_eval(R"EOS(notification = PushNotification.new
|
131
131
|
notification.message)EOS");
|
132
132
|
ASSERT_EQUAL("Push", detail::From_Ruby<std::string>().convert(message));
|
133
133
|
}
|
@@ -146,11 +146,11 @@ TESTCASE(base_pointer_function_argument)
|
|
146
146
|
define_global_function("process_notification", &processNotification);
|
147
147
|
|
148
148
|
Module m = define_module("Testing");
|
149
|
-
Object message = m.
|
149
|
+
Object message = m.module_eval(R"EOS(notification = EmailNotification.new
|
150
150
|
process_notification(notification))EOS");
|
151
151
|
ASSERT_EQUAL("Email", detail::From_Ruby<std::string>().convert(message));
|
152
152
|
|
153
|
-
message = m.
|
153
|
+
message = m.module_eval(R"EOS(notification = PushNotification.new
|
154
154
|
process_notification(notification))EOS");
|
155
155
|
ASSERT_EQUAL("Push", detail::From_Ruby<std::string>().convert(message));
|
156
156
|
}
|
@@ -170,11 +170,11 @@ TESTCASE(module_base_pointer_method_call)
|
|
170
170
|
|
171
171
|
Module m = define_module("Testing");
|
172
172
|
|
173
|
-
Object message = m.
|
173
|
+
Object message = m.module_eval(R"EOS(notification = Inheritance::EmailNotification.new
|
174
174
|
notification.message)EOS");
|
175
175
|
ASSERT_EQUAL("Email", detail::From_Ruby<std::string>().convert(message));
|
176
176
|
|
177
|
-
message = m.
|
177
|
+
message = m.module_eval(R"EOS(notification = Inheritance::PushNotification.new
|
178
178
|
notification.message)EOS");
|
179
179
|
ASSERT_EQUAL("Push", detail::From_Ruby<std::string>().convert(message));
|
180
180
|
}
|
@@ -214,7 +214,7 @@ TESTCASE(base_pointer_constructor)
|
|
214
214
|
|
215
215
|
Module m = define_module("Testing");
|
216
216
|
|
217
|
-
Object result = m.
|
217
|
+
Object result = m.module_eval(R"EOS(notification = PushNotification.new
|
218
218
|
processor = Processor.new(notification)
|
219
219
|
processor.process)EOS");
|
220
220
|
ASSERT_EQUAL("Push", detail::From_Ruby<std::string>().convert(result));
|
data/test/test_Iterator.cpp
CHANGED
@@ -55,6 +55,11 @@ namespace
|
|
55
55
|
{
|
56
56
|
struct Data
|
57
57
|
{
|
58
|
+
Data(uint32_t value)
|
59
|
+
{
|
60
|
+
this->index = value;
|
61
|
+
}
|
62
|
+
|
58
63
|
uint32_t index;
|
59
64
|
};
|
60
65
|
|
@@ -76,6 +81,16 @@ namespace
|
|
76
81
|
return this->data_.end();
|
77
82
|
}
|
78
83
|
|
84
|
+
std::vector<Data>::const_iterator cbegin() const
|
85
|
+
{
|
86
|
+
return this->data_.cbegin();
|
87
|
+
}
|
88
|
+
|
89
|
+
std::vector<Data>::const_iterator cend() const
|
90
|
+
{
|
91
|
+
return this->data_.cend();
|
92
|
+
}
|
93
|
+
|
79
94
|
std::vector<Data> data_;
|
80
95
|
};
|
81
96
|
|
@@ -105,6 +120,16 @@ namespace
|
|
105
120
|
return this->data_.end();
|
106
121
|
}
|
107
122
|
|
123
|
+
std::vector<Data*>::reverse_iterator rbegin()
|
124
|
+
{
|
125
|
+
return this->data_.rbegin();
|
126
|
+
}
|
127
|
+
|
128
|
+
std::vector<Data*>::reverse_iterator rend()
|
129
|
+
{
|
130
|
+
return this->data_.rend();
|
131
|
+
}
|
132
|
+
|
108
133
|
std::vector<Data*> data_;
|
109
134
|
};
|
110
135
|
}
|
@@ -144,6 +169,29 @@ TESTCASE(iterator_value)
|
|
144
169
|
ASSERT_EQUAL(Object(detail::to_ruby(3)), a[2]);
|
145
170
|
}
|
146
171
|
|
172
|
+
TESTCASE(const_iterator_value)
|
173
|
+
{
|
174
|
+
define_class<ContainerValues>("ContainerValues")
|
175
|
+
.define_constructor(Constructor<ContainerValues>())
|
176
|
+
.define_iterator(&ContainerValues::cbegin, &ContainerValues::cend);
|
177
|
+
|
178
|
+
Module m = define_module("TestingModule");
|
179
|
+
|
180
|
+
std::string code = R"(result = []
|
181
|
+
container = ContainerValues.new
|
182
|
+
container.each do |x|
|
183
|
+
result << x
|
184
|
+
end
|
185
|
+
result)";
|
186
|
+
|
187
|
+
Array result = m.module_eval(code);
|
188
|
+
|
189
|
+
ASSERT_EQUAL(3u, result.size());
|
190
|
+
ASSERT_EQUAL(Object(detail::to_ruby(1)), result[0]);
|
191
|
+
ASSERT_EQUAL(Object(detail::to_ruby(2)), result[1]);
|
192
|
+
ASSERT_EQUAL(Object(detail::to_ruby(3)), result[2]);
|
193
|
+
}
|
194
|
+
|
147
195
|
TESTCASE(iterator_pointer)
|
148
196
|
{
|
149
197
|
define_class<ContainerPointers>("ContainerPointers")
|
@@ -153,9 +201,90 @@ TESTCASE(iterator_pointer)
|
|
153
201
|
ContainerPointers* container = new ContainerPointers();
|
154
202
|
Object wrapper = Data_Object<ContainerPointers>(container);
|
155
203
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
204
|
+
Module m = define_module("TestingModule");
|
205
|
+
|
206
|
+
std::string code = R"(result = []
|
207
|
+
container = ContainerPointers.new
|
208
|
+
container.each do |x|
|
209
|
+
result << x
|
210
|
+
end
|
211
|
+
result)";
|
212
|
+
|
213
|
+
Array result = m.module_eval(code);
|
214
|
+
|
215
|
+
ASSERT_EQUAL(3u, result.size());
|
216
|
+
ASSERT_EQUAL(Object(detail::to_ruby(1)), result[0]);
|
217
|
+
ASSERT_EQUAL(Object(detail::to_ruby(2)), result[1]);
|
218
|
+
ASSERT_EQUAL(Object(detail::to_ruby(3)), result[2]);
|
161
219
|
}
|
220
|
+
|
221
|
+
TESTCASE(two_iterator_pointer)
|
222
|
+
{
|
223
|
+
define_class<ContainerPointers>("ContainerPointers")
|
224
|
+
.define_constructor(Constructor<ContainerPointers>())
|
225
|
+
.define_iterator(&ContainerPointers::begin, &ContainerPointers::end)
|
226
|
+
.define_iterator(&ContainerPointers::rbegin, &ContainerPointers::rend, "reach");
|
227
|
+
|
228
|
+
ContainerPointers* container = new ContainerPointers();
|
229
|
+
Object wrapper = Data_Object<ContainerPointers>(container);
|
230
|
+
|
231
|
+
Module m = define_module("TestingModule");
|
232
|
+
|
233
|
+
std::string code = R"(result = []
|
234
|
+
container = ContainerPointers.new
|
235
|
+
container.each do |x|
|
236
|
+
result << x
|
237
|
+
end
|
238
|
+
container.reach do |x|
|
239
|
+
result << x
|
240
|
+
end
|
241
|
+
result)";
|
242
|
+
|
243
|
+
Array result = m.module_eval(code);
|
244
|
+
|
245
|
+
ASSERT_EQUAL(6u, result.size());
|
246
|
+
ASSERT_EQUAL(Object(detail::to_ruby(1)), result[0]);
|
247
|
+
ASSERT_EQUAL(Object(detail::to_ruby(2)), result[1]);
|
248
|
+
ASSERT_EQUAL(Object(detail::to_ruby(3)), result[2]);
|
249
|
+
ASSERT_EQUAL(Object(detail::to_ruby(3)), result[3]);
|
250
|
+
ASSERT_EQUAL(Object(detail::to_ruby(2)), result[4]);
|
251
|
+
ASSERT_EQUAL(Object(detail::to_ruby(1)), result[5]);
|
252
|
+
}
|
253
|
+
|
254
|
+
TESTCASE(map)
|
255
|
+
{
|
256
|
+
define_class<ContainerPointers>("ContainerPointers")
|
257
|
+
.define_constructor(Constructor<ContainerPointers>())
|
258
|
+
.define_iterator(&ContainerPointers::begin, &ContainerPointers::end);
|
259
|
+
|
260
|
+
Module m = define_module("Testing");
|
261
|
+
|
262
|
+
std::string code = R"(container = ContainerPointers.new
|
263
|
+
container.map do |x|
|
264
|
+
x * 2
|
265
|
+
end)";
|
266
|
+
|
267
|
+
Array result = m.module_eval(code);
|
268
|
+
|
269
|
+
ASSERT_EQUAL(3u, result.size());
|
270
|
+
ASSERT_EQUAL(Object(detail::to_ruby(2)), result[0]);
|
271
|
+
ASSERT_EQUAL(Object(detail::to_ruby(4)), result[1]);
|
272
|
+
ASSERT_EQUAL(Object(detail::to_ruby(6)), result[2]);
|
273
|
+
}
|
274
|
+
|
275
|
+
TESTCASE(to_enum)
|
276
|
+
{
|
277
|
+
Module m = define_module("TestingModule");
|
278
|
+
|
279
|
+
std::string code = R"(container = ContainerPointers.new
|
280
|
+
container.each.map do |x|
|
281
|
+
x * 2
|
282
|
+
end)";
|
283
|
+
|
284
|
+
Array result = m.module_eval(code);
|
285
|
+
|
286
|
+
ASSERT_EQUAL(3u, result.size());
|
287
|
+
ASSERT_EQUAL(Object(detail::to_ruby(2)), result[0]);
|
288
|
+
ASSERT_EQUAL(Object(detail::to_ruby(4)), result[1]);
|
289
|
+
ASSERT_EQUAL(Object(detail::to_ruby(6)), result[2]);
|
290
|
+
}
|
data/test/test_Keep_Alive.cpp
CHANGED
@@ -16,7 +16,7 @@ namespace
|
|
16
16
|
};
|
17
17
|
|
18
18
|
/**
|
19
|
-
* This class will
|
19
|
+
* This class will receive a new Listener instance
|
20
20
|
* from Ruby
|
21
21
|
*/
|
22
22
|
class ListenerContainer
|
@@ -73,14 +73,14 @@ TESTCASE(test_arg)
|
|
73
73
|
.define_method("listener_count", &ListenerContainer::listenerCount);
|
74
74
|
|
75
75
|
Module m = define_module("TestingModule");
|
76
|
-
Object handler = m.
|
76
|
+
Object handler = m.module_eval("@handler = ListenerContainer.new");
|
77
77
|
|
78
78
|
ASSERT_EQUAL(INT2NUM(0), handler.call("listener_count").value());
|
79
79
|
|
80
|
-
m.
|
80
|
+
m.module_eval(R"EOS(class MyListener < Listener
|
81
81
|
end)EOS");
|
82
82
|
|
83
|
-
m.
|
83
|
+
m.module_eval("@handler.add_listener(MyListener.new)");
|
84
84
|
|
85
85
|
// Without keep alive, this GC will crash the program because MyListener is no longer in scope
|
86
86
|
rb_gc_start();
|
@@ -90,7 +90,7 @@ TESTCASE(test_arg)
|
|
90
90
|
|
91
91
|
// Without keep alive, this GC will crash the program because MyListener is no longer in scope
|
92
92
|
rb_gc_start();
|
93
|
-
m.
|
93
|
+
m.module_eval("@handler.add_listener(Listener.new)");
|
94
94
|
|
95
95
|
ASSERT_EQUAL(INT2NUM(2), handler.call("listener_count").value());
|
96
96
|
ASSERT_EQUAL(INT2NUM(8), handler.call("process").value());
|
@@ -139,7 +139,7 @@ namespace
|
|
139
139
|
|
140
140
|
Object getColumn(Module& m, uint32_t index)
|
141
141
|
{
|
142
|
-
Object connection = m.
|
142
|
+
Object connection = m.module_eval("Connection.new");
|
143
143
|
return connection.call("getColumn", 3);
|
144
144
|
}
|
145
145
|
|
@@ -158,4 +158,4 @@ TESTCASE(test_return)
|
|
158
158
|
rb_gc_start();
|
159
159
|
String name = column.call("name");
|
160
160
|
ASSERT_EQUAL("column_3", name.c_str());
|
161
|
-
}
|
161
|
+
}
|
@@ -44,6 +44,6 @@ TESTCASE(allows_copy_contructors_to_work)
|
|
44
44
|
|
45
45
|
Module m = define_module("TestingModule");
|
46
46
|
|
47
|
-
Object result = m.
|
47
|
+
Object result = m.module_eval("return_test_class.tmp");
|
48
48
|
ASSERT_EQUAL(8.0, detail::From_Ruby<double>().convert(result.value()));
|
49
49
|
}
|
data/test/test_Module.cpp
CHANGED
@@ -8,17 +8,23 @@ using namespace Rice;
|
|
8
8
|
|
9
9
|
TESTSUITE(Module);
|
10
10
|
|
11
|
-
SETUP(
|
11
|
+
SETUP(Module)
|
12
12
|
{
|
13
13
|
embed_ruby();
|
14
14
|
}
|
15
15
|
|
16
|
-
TESTCASE(
|
16
|
+
TESTCASE(FromConstant)
|
17
17
|
{
|
18
18
|
Module m(rb_mEnumerable);
|
19
19
|
ASSERT_EQUAL(rb_mEnumerable, m.value());
|
20
20
|
}
|
21
21
|
|
22
|
+
TESTCASE(FromName)
|
23
|
+
{
|
24
|
+
Module m("Enumerable");
|
25
|
+
ASSERT_EQUAL(rb_mEnumerable, m.value());
|
26
|
+
}
|
27
|
+
|
22
28
|
namespace
|
23
29
|
{
|
24
30
|
|
@@ -41,10 +47,11 @@ void throw_silly_exception(Object self)
|
|
41
47
|
|
42
48
|
TESTCASE(add_handler)
|
43
49
|
{
|
50
|
+
register_handler<Quite_Silly_Exception>(handle_silly_exception);
|
51
|
+
|
44
52
|
Module m(anonymous_module());
|
45
|
-
m.add_handler<Quite_Silly_Exception>(handle_silly_exception);
|
46
53
|
m.define_singleton_method("foo", throw_silly_exception);
|
47
|
-
Object exc = m.
|
54
|
+
Object exc = m.module_eval("begin; foo; rescue Exception; $!; end");
|
48
55
|
ASSERT_EQUAL(rb_eRuntimeError, CLASS_OF(exc));
|
49
56
|
Exception ex(exc);
|
50
57
|
ASSERT_EQUAL(String("SILLY"), String(ex.what()));
|
@@ -80,8 +87,8 @@ TESTCASE(define_method)
|
|
80
87
|
Module m(anonymous_module());
|
81
88
|
m.define_method("some_method", some_method);
|
82
89
|
|
83
|
-
Object o = m.
|
84
|
-
Object result = m.
|
90
|
+
Object o = m.module_eval("$o = Object.new");
|
91
|
+
Object result = m.module_eval(R"EOS($o.extend(self)
|
85
92
|
$o.some_method)EOS");
|
86
93
|
ASSERT_EQUAL(o, result);
|
87
94
|
}
|
@@ -99,7 +106,7 @@ TESTCASE(define_module_function)
|
|
99
106
|
Module m(anonymous_module());
|
100
107
|
m.define_module_function("some_function", some_function);
|
101
108
|
|
102
|
-
Object result = m.
|
109
|
+
Object result = m.module_eval(R"EOS(o = Object.new
|
103
110
|
o.extend(self)
|
104
111
|
o.instance_eval do
|
105
112
|
some_function
|
@@ -130,7 +137,7 @@ TESTCASE(define_function_int)
|
|
130
137
|
{
|
131
138
|
Module m(anonymous_module());
|
132
139
|
m.define_function("foo", function_int);
|
133
|
-
Object result = m.
|
140
|
+
Object result = m.module_eval("o = Object.new; o.extend(self); o.foo(42)");
|
134
141
|
ASSERT_EQUAL(42, detail::From_Ruby<int>().convert(result));
|
135
142
|
}
|
136
143
|
|
@@ -138,7 +145,7 @@ TESTCASE(define_method_int)
|
|
138
145
|
{
|
139
146
|
Module m(anonymous_module());
|
140
147
|
m.define_method("foo", method_int);
|
141
|
-
Object result = m.
|
148
|
+
Object result = m.module_eval("o = Object.new; o.extend(self); o.foo(42)");
|
142
149
|
ASSERT_EQUAL(42, detail::From_Ruby<int>().convert(result));
|
143
150
|
}
|
144
151
|
|
@@ -162,7 +169,7 @@ TESTCASE(define_module_function_int)
|
|
162
169
|
{
|
163
170
|
Module m(anonymous_module());
|
164
171
|
m.define_module_function("foo", function_int);
|
165
|
-
Object result = m.
|
172
|
+
Object result = m.module_eval("o = Object.new; o.extend(self); o.instance_eval { foo(42) }");
|
166
173
|
ASSERT_EQUAL(42, detail::From_Ruby<int>().convert(result));
|
167
174
|
|
168
175
|
result = m.call("foo", 42);
|
@@ -175,7 +182,7 @@ TESTCASE(method_int_passed_no_args)
|
|
175
182
|
m.define_method("foo", method_int);
|
176
183
|
ASSERT_EXCEPTION_CHECK(
|
177
184
|
Exception,
|
178
|
-
m.
|
185
|
+
m.module_eval("o = Object.new; o.extend(self); o.foo"),
|
179
186
|
ASSERT_EQUAL(
|
180
187
|
Object(rb_eArgError),
|
181
188
|
Object(CLASS_OF(ex.value()))
|
@@ -204,50 +211,6 @@ TESTCASE(include_module)
|
|
204
211
|
ASSERT_EQUAL(expected_ancestors, ancestors);
|
205
212
|
}
|
206
213
|
|
207
|
-
TESTCASE(const_set_get_by_id)
|
208
|
-
{
|
209
|
-
Module m(anonymous_module());
|
210
|
-
Object v = detail::to_ruby(42);
|
211
|
-
Module & m2(m.const_set(rb_intern("FOO"), v));
|
212
|
-
ASSERT_EQUAL(&m, &m2);
|
213
|
-
ASSERT_EQUAL(v, m.const_get(rb_intern("FOO")));
|
214
|
-
}
|
215
|
-
|
216
|
-
TESTCASE(const_set_get_by_identifier)
|
217
|
-
{
|
218
|
-
Module m(anonymous_module());
|
219
|
-
Object v = detail::to_ruby(42);
|
220
|
-
Module & m2(m.const_set(Identifier("FOO"), v));
|
221
|
-
ASSERT_EQUAL(&m, &m2);
|
222
|
-
ASSERT_EQUAL(v, m.const_get(Identifier("FOO")));
|
223
|
-
}
|
224
|
-
|
225
|
-
TESTCASE(const_set_get_by_string)
|
226
|
-
{
|
227
|
-
Module m(anonymous_module());
|
228
|
-
Object v = detail::to_ruby(42);
|
229
|
-
Module & m2(m.const_set("FOO", v));
|
230
|
-
ASSERT_EQUAL(&m, &m2);
|
231
|
-
ASSERT_EQUAL(v, m.const_get("FOO"));
|
232
|
-
}
|
233
|
-
|
234
|
-
TESTCASE(remove_const)
|
235
|
-
{
|
236
|
-
Module m(anonymous_module());
|
237
|
-
Object v = detail::to_ruby(42);
|
238
|
-
m.const_set("FOO", v);
|
239
|
-
ASSERT_EQUAL(v, m.const_get("FOO"));
|
240
|
-
m.remove_const("FOO");
|
241
|
-
ASSERT_EXCEPTION_CHECK(
|
242
|
-
Exception,
|
243
|
-
m.const_get("FOO"),
|
244
|
-
ASSERT_EQUAL(
|
245
|
-
Object(rb_eNameError),
|
246
|
-
Object(CLASS_OF(ex.value()))
|
247
|
-
)
|
248
|
-
);
|
249
|
-
}
|
250
|
-
|
251
214
|
TESTCASE(mod_name_anonymous)
|
252
215
|
{
|
253
216
|
Module m(anonymous_module());
|
@@ -274,7 +237,7 @@ TESTCASE(define_method_default_arguments)
|
|
274
237
|
Module m(anonymous_module());
|
275
238
|
m.define_function("foo", &defaults_method_one, Arg("arg1"), Arg("arg2") = 3, Arg("arg3") = true);
|
276
239
|
|
277
|
-
Object o = m.
|
240
|
+
Object o = m.module_eval("o = Object.new; o.extend(self); o");
|
278
241
|
o.call("foo", 2);
|
279
242
|
|
280
243
|
ASSERT_EQUAL(2, defaults_method_one_arg1);
|
@@ -301,7 +264,7 @@ TESTCASE(default_arguments_still_throws_argument_error)
|
|
301
264
|
|
302
265
|
ASSERT_EXCEPTION_CHECK(
|
303
266
|
Exception,
|
304
|
-
m.
|
267
|
+
m.module_eval("o = Object.new; o.extend(self); o.foo()"),
|
305
268
|
ASSERT_EQUAL(
|
306
269
|
Object(rb_eArgError),
|
307
270
|
Object(CLASS_OF(ex.value()))
|
@@ -310,7 +273,7 @@ TESTCASE(default_arguments_still_throws_argument_error)
|
|
310
273
|
|
311
274
|
ASSERT_EXCEPTION_CHECK(
|
312
275
|
Exception,
|
313
|
-
m.
|
276
|
+
m.module_eval("o = Object.new; o.extend(self); o.foo(3, 4, false, 17)"),
|
314
277
|
ASSERT_EQUAL(
|
315
278
|
Object(rb_eArgError),
|
316
279
|
Object(CLASS_OF(ex.value()))
|
@@ -330,7 +293,7 @@ TESTCASE(defining_methods_with_single_default_argument)
|
|
330
293
|
// define_method
|
331
294
|
Module m(anonymous_module());
|
332
295
|
m.define_function("foo", &method_with_one_default_arg, (Arg("num") = 4));
|
333
|
-
m.
|
296
|
+
m.module_eval("o = Object.new; o.extend(self); o.foo()");
|
334
297
|
ASSERT_EQUAL(4, the_one_default_arg);
|
335
298
|
|
336
299
|
the_one_default_arg = 0;
|
@@ -448,7 +411,7 @@ TESTCASE(define_method_works_with_const_reference_return)
|
|
448
411
|
|
449
412
|
Module m(anonymous_module());
|
450
413
|
|
451
|
-
Object result = m.
|
414
|
+
Object result = m.module_eval("Factory.new.get_return_test");
|
452
415
|
|
453
416
|
ASSERT_EQUAL("ReturnTest", result.class_of().name().c_str());
|
454
417
|
}
|
@@ -531,7 +494,7 @@ TESTCASE(pointers)
|
|
531
494
|
Module m = define_module("TestingModule");
|
532
495
|
|
533
496
|
std::string code = "with_pointers(32, true, 33.0, 34.0)";
|
534
|
-
m.
|
497
|
+
m.module_eval(code);
|
535
498
|
|
536
499
|
ASSERT_EQUAL(intValue, 32);
|
537
500
|
ASSERT_EQUAL(boolValue, true);
|
@@ -546,7 +509,7 @@ TESTCASE(references)
|
|
546
509
|
Module m = define_module("TestingModule");
|
547
510
|
|
548
511
|
std::string code = "with_references(42, true, 43.0, 44.0)";
|
549
|
-
m.
|
512
|
+
m.module_eval(code);
|
550
513
|
|
551
514
|
ASSERT_EQUAL(intValue, 42);
|
552
515
|
ASSERT_EQUAL(boolValue, true);
|