rice 4.6.1 → 4.7.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 +31 -0
- data/CMakeLists.txt +0 -4
- data/Rakefile +2 -8
- data/bin/rice-doc.rb +212 -0
- data/bin/rice-rbs.rb +93 -0
- data/include/rice/rice.hpp +4972 -4015
- data/include/rice/stl.hpp +822 -294
- data/lib/rice/doc/cpp_reference.rb +166 -0
- data/lib/rice/doc/doxygen.rb +294 -0
- data/lib/rice/doc/mkdocs.rb +298 -0
- data/lib/rice/doc/rice.rb +29 -0
- data/lib/rice/doc/ruby.rb +37 -0
- data/lib/rice/doc.rb +5 -0
- data/lib/{make_rice_headers.rb → rice/make_rice_headers.rb} +3 -0
- data/lib/rice/native.rb +18 -0
- data/lib/rice/native_registry.rb +21 -0
- data/lib/rice/parameter.rb +7 -0
- data/lib/rice/rbs.rb +104 -0
- data/lib/rice/version.rb +1 -1
- data/lib/rice.rb +4 -0
- data/lib/rubygems/cmake_builder.rb +24 -27
- data/rice/Arg.hpp +4 -4
- data/rice/Arg.ipp +4 -4
- data/rice/Buffer.hpp +32 -28
- data/rice/Buffer.ipp +306 -178
- data/rice/Data_Object.ipp +101 -82
- data/rice/Data_Type.hpp +5 -7
- data/rice/Data_Type.ipp +48 -29
- data/rice/Enum.ipp +15 -21
- data/rice/Function.hpp +17 -0
- data/rice/Function.ipp +13 -0
- data/rice/Pointer.hpp +15 -0
- data/rice/Pointer.ipp +49 -0
- data/rice/Return.hpp +1 -1
- data/rice/Return.ipp +2 -2
- data/rice/api.hpp +30 -0
- data/rice/cpp_api/Array.hpp +2 -2
- data/rice/cpp_api/Array.ipp +50 -5
- data/rice/cpp_api/Class.hpp +0 -5
- data/rice/cpp_api/Class.ipp +19 -0
- data/rice/cpp_api/Hash.ipp +20 -0
- data/rice/cpp_api/Module.hpp +6 -3
- data/rice/cpp_api/Module.ipp +49 -11
- data/rice/cpp_api/Object.ipp +31 -2
- data/rice/cpp_api/String.hpp +1 -2
- data/rice/cpp_api/String.ipp +21 -1
- data/rice/cpp_api/Struct.ipp +5 -0
- data/rice/cpp_api/Symbol.ipp +34 -0
- data/rice/cpp_api/shared_methods.hpp +12 -12
- data/rice/detail/MethodInfo.hpp +4 -2
- data/rice/detail/MethodInfo.ipp +19 -3
- data/rice/detail/ModuleRegistry.hpp +18 -0
- data/rice/detail/ModuleRegistry.ipp +25 -0
- data/rice/detail/Native.hpp +45 -2
- data/rice/detail/Native.ipp +196 -2
- data/rice/detail/NativeAttributeGet.hpp +9 -4
- data/rice/detail/NativeAttributeGet.ipp +65 -11
- data/rice/detail/NativeAttributeSet.hpp +4 -0
- data/rice/detail/NativeAttributeSet.ipp +30 -2
- data/rice/detail/NativeCallbackFFI.ipp +2 -2
- data/rice/detail/NativeCallbackSimple.ipp +1 -1
- data/rice/detail/NativeFunction.hpp +11 -49
- data/rice/detail/NativeFunction.ipp +82 -379
- data/rice/detail/NativeInvoker.hpp +74 -0
- data/rice/detail/NativeInvoker.ipp +197 -0
- data/rice/detail/NativeIterator.hpp +4 -0
- data/rice/detail/NativeIterator.ipp +19 -0
- data/rice/detail/NativeMethod.hpp +97 -0
- data/rice/detail/NativeMethod.ipp +332 -0
- data/rice/detail/NativeProc.hpp +51 -0
- data/rice/detail/NativeProc.ipp +133 -0
- data/rice/detail/NativeRegistry.hpp +8 -0
- data/rice/detail/NativeRegistry.ipp +27 -0
- data/rice/detail/Parameter.hpp +47 -0
- data/rice/detail/Parameter.ipp +105 -0
- data/rice/detail/Proc.ipp +14 -13
- data/rice/detail/Registries.hpp +1 -0
- data/rice/detail/RubyType.hpp +0 -2
- data/rice/detail/RubyType.ipp +15 -33
- data/rice/detail/Type.hpp +44 -8
- data/rice/detail/Type.ipp +151 -49
- data/rice/detail/TypeRegistry.hpp +3 -0
- data/rice/detail/TypeRegistry.ipp +17 -27
- data/rice/detail/Types.ipp +430 -0
- data/rice/detail/Wrapper.hpp +12 -0
- data/rice/detail/Wrapper.ipp +45 -2
- data/rice/detail/from_ruby.ipp +567 -1073
- data/rice/detail/ruby.hpp +1 -0
- data/rice/detail/to_ruby.ipp +4 -635
- data/rice/libc/file.ipp +3 -6
- data/rice/rice.hpp +22 -12
- data/rice/rice_api/Arg.hpp +7 -0
- data/rice/rice_api/Arg.ipp +9 -0
- data/rice/rice_api/ModuleRegistry.hpp +7 -0
- data/rice/rice_api/ModuleRegistry.ipp +10 -0
- data/rice/rice_api/Native.hpp +7 -0
- data/rice/rice_api/Native.ipp +52 -0
- data/rice/rice_api/NativeRegistry.hpp +7 -0
- data/rice/rice_api/NativeRegistry.ipp +21 -0
- data/rice/rice_api/Parameter.hpp +7 -0
- data/rice/rice_api/Parameter.ipp +11 -0
- data/rice/rice_api/Registries.hpp +6 -0
- data/rice/rice_api/Registries.ipp +12 -0
- data/rice/rice_api/TypeRegistry.hpp +7 -0
- data/rice/rice_api/TypeRegistry.ipp +10 -0
- data/rice/stl/complex.ipp +35 -0
- data/rice/stl/exception.ipp +20 -7
- data/rice/stl/filesystem.hpp +6 -0
- data/rice/stl/filesystem.ipp +34 -0
- data/rice/stl/map.ipp +13 -21
- data/rice/stl/monostate.ipp +37 -1
- data/rice/stl/multimap.ipp +17 -24
- data/rice/stl/optional.ipp +47 -2
- data/rice/stl/pair.ipp +23 -58
- data/rice/stl/reference_wrapper.ipp +22 -1
- data/rice/stl/set.ipp +17 -9
- data/rice/stl/shared_ptr.ipp +44 -17
- data/rice/stl/string.ipp +175 -7
- data/rice/stl/string_view.ipp +5 -0
- data/rice/stl/tuple.ipp +38 -9
- data/rice/stl/unique_ptr.ipp +46 -2
- data/rice/stl/unordered_map.ipp +13 -21
- data/rice/stl/variant.ipp +47 -11
- data/rice/stl/vector.ipp +183 -104
- data/rice/stl.hpp +1 -0
- data/rice/traits/function_traits.hpp +2 -2
- data/rice/traits/method_traits.hpp +5 -16
- data/rice/traits/rice_traits.hpp +24 -4
- data/rice.gemspec +11 -22
- data/test/embed_ruby.cpp +0 -3
- data/test/test_Array.cpp +38 -38
- data/test/test_Attribute.cpp +187 -2
- data/test/test_Buffer.cpp +302 -26
- data/test/test_Callback.cpp +2 -3
- data/test/test_Class.cpp +5 -5
- data/test/test_Data_Object.cpp +0 -55
- data/test/test_Data_Type.cpp +19 -30
- data/test/test_Enum.cpp +4 -46
- data/test/test_From_Ruby.cpp +88 -81
- data/test/test_GVL.cpp +109 -0
- data/test/test_Iterator.cpp +1 -1
- data/test/test_Keep_Alive_No_Wrapper.cpp +5 -3
- data/test/test_Module.cpp +8 -9
- data/test/test_Object.cpp +1 -1
- data/test/test_Overloads.cpp +3 -3
- data/test/test_Stl_Map.cpp +8 -8
- data/test/test_Stl_Multimap.cpp +4 -4
- data/test/test_Stl_Pair.cpp +5 -3
- data/test/test_Stl_SharedPtr.cpp +24 -12
- data/test/test_Stl_Tuple.cpp +1 -1
- data/test/test_Stl_UniquePtr.cpp +8 -0
- data/test/test_Stl_Unordered_Map.cpp +9 -9
- data/test/test_Stl_Variant.cpp +9 -3
- data/test/test_Stl_Vector.cpp +118 -13
- data/test/test_To_Ruby.cpp +35 -28
- data/test/test_Type.cpp +256 -53
- data/test/unittest.hpp +35 -0
- metadata +66 -34
- data/rice/Init.hpp +0 -8
- data/rice/Init.ipp +0 -8
- data/rice/detail/RubyFunction.hpp +0 -31
- data/rice/detail/RubyFunction.ipp +0 -77
- data/sample/callbacks/extconf.rb +0 -5
- data/sample/callbacks/sample_callbacks.cpp +0 -35
- data/sample/callbacks/test.rb +0 -28
- data/sample/enum/extconf.rb +0 -5
- data/sample/enum/sample_enum.cpp +0 -40
- data/sample/enum/test.rb +0 -8
- data/sample/inheritance/animals.cpp +0 -82
- data/sample/inheritance/extconf.rb +0 -5
- data/sample/inheritance/test.rb +0 -7
- data/sample/map/extconf.rb +0 -5
- data/sample/map/map.cpp +0 -73
- data/sample/map/test.rb +0 -7
- data/test/ext/t1/Foo.hpp +0 -10
- data/test/ext/t1/extconf.rb +0 -4
- data/test/ext/t1/t1.cpp +0 -13
- data/test/ext/t2/extconf.rb +0 -4
- data/test/ext/t2/t2.cpp +0 -11
- data/test/ruby/test_callbacks_sample.rb +0 -28
- data/test/ruby/test_multiple_extensions.rb +0 -18
- data/test/ruby/test_multiple_extensions_same_class.rb +0 -14
- data/test/ruby/test_multiple_extensions_with_inheritance.rb +0 -20
- /data/test/{test_Stl_Type.cpp → test_Stl_Type_Info.cpp} +0 -0
data/test/test_To_Ruby.cpp
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
#include "unittest.hpp"
|
|
2
2
|
#include "embed_ruby.hpp"
|
|
3
3
|
#include <rice/rice.hpp>
|
|
4
4
|
|
|
@@ -13,7 +13,6 @@ TESTSUITE(ToRuby);
|
|
|
13
13
|
SETUP(ToRuby)
|
|
14
14
|
{
|
|
15
15
|
embed_ruby();
|
|
16
|
-
define_fundamental_buffer_types();
|
|
17
16
|
}
|
|
18
17
|
|
|
19
18
|
TEARDOWN(ToRuby)
|
|
@@ -210,13 +209,20 @@ TESTCASE(unsigned_char_ptr_buffer)
|
|
|
210
209
|
.define_attr("data", &Matrix2UnsignedChar::data, Rice::AttrAccess::Read);
|
|
211
210
|
|
|
212
211
|
std::string code = R"(matrix = Matrix2UnsignedChar.new
|
|
213
|
-
buffer = matrix.ptr
|
|
212
|
+
buffer = matrix.ptr.buffer
|
|
214
213
|
buffer.bytes(5))";
|
|
215
214
|
String buffer = m.module_eval(code);
|
|
216
215
|
ASSERT_EQUAL("\x1\x2\x3\x4\x5", buffer.str());
|
|
217
216
|
|
|
218
217
|
code = R"(matrix = Matrix2UnsignedChar.new
|
|
219
|
-
|
|
218
|
+
ptr = matrix.ptr
|
|
219
|
+
buffer = Rice::Buffer≺unsigned char≻.new(ptr)
|
|
220
|
+
buffer.bytes(5))";
|
|
221
|
+
buffer = m.module_eval(code);
|
|
222
|
+
ASSERT_EQUAL("\x1\x2\x3\x4\x5", buffer.str());
|
|
223
|
+
|
|
224
|
+
code = R"(matrix = Matrix2UnsignedChar.new
|
|
225
|
+
buffer = matrix.ptr.buffer
|
|
220
226
|
buffer.bytes(0))";
|
|
221
227
|
buffer = m.module_eval(code);
|
|
222
228
|
ASSERT_EQUAL("", buffer.str());
|
|
@@ -238,7 +244,7 @@ TESTCASE(unsigned_char_ptr_array)
|
|
|
238
244
|
.define_method("ptr", &Matrix2UnsignedChar::ptr);
|
|
239
245
|
|
|
240
246
|
std::string code = R"(matrix = Matrix2UnsignedChar.new
|
|
241
|
-
buffer = matrix.ptr
|
|
247
|
+
buffer = matrix.ptr.buffer
|
|
242
248
|
buffer.to_ary(5))";
|
|
243
249
|
|
|
244
250
|
std::vector<unsigned char> expected = std::vector<unsigned char>{ 1,2,3,4,5 };
|
|
@@ -247,8 +253,8 @@ TESTCASE(unsigned_char_ptr_array)
|
|
|
247
253
|
ASSERT_EQUAL(expected, actual);
|
|
248
254
|
|
|
249
255
|
code = R"(matrix = Matrix2UnsignedChar.new
|
|
250
|
-
|
|
251
|
-
|
|
256
|
+
buffer = matrix.ptr.buffer
|
|
257
|
+
buffer.to_ary(1))";
|
|
252
258
|
|
|
253
259
|
expected = std::vector<unsigned char>{ 1 };
|
|
254
260
|
array = m.module_eval(code);
|
|
@@ -266,9 +272,9 @@ TESTCASE(unsigned_char_ptr_ptr_buffer)
|
|
|
266
272
|
.define_attr("data", &Matrix3UnsignedChar::data, Rice::AttrAccess::Read);
|
|
267
273
|
|
|
268
274
|
std::string code = R"(matrix = Matrix3UnsignedChar.new
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
275
|
+
buffer = matrix.ptr.buffer
|
|
276
|
+
buffer2 = buffer.to_ary(1).first
|
|
277
|
+
buffer2.to_ary(5))";
|
|
272
278
|
Array array = m.module_eval(code);
|
|
273
279
|
ASSERT_EQUAL(5, array.size());
|
|
274
280
|
|
|
@@ -276,7 +282,7 @@ TESTCASE(unsigned_char_ptr_ptr_buffer)
|
|
|
276
282
|
std::vector<unsigned char> actual = array.to_vector<unsigned char>();
|
|
277
283
|
ASSERT_EQUAL(expected, actual);
|
|
278
284
|
}
|
|
279
|
-
|
|
285
|
+
/*
|
|
280
286
|
TESTCASE(unsigned_char_ptr_ptr_array)
|
|
281
287
|
{
|
|
282
288
|
Module m = define_module("ToRubyPtr");
|
|
@@ -286,7 +292,7 @@ TESTCASE(unsigned_char_ptr_ptr_array)
|
|
|
286
292
|
.define_method("ptr", &Matrix3UnsignedChar::ptr);
|
|
287
293
|
|
|
288
294
|
std::string code = R"(matrix = Matrix3UnsignedChar.new
|
|
289
|
-
buffer = matrix.ptr
|
|
295
|
+
buffer = matrix.ptr.buffer
|
|
290
296
|
buffer.to_ary(5))";
|
|
291
297
|
|
|
292
298
|
Array pointers = m.module_eval(code);
|
|
@@ -312,7 +318,7 @@ TESTCASE(short_ptr_buffer)
|
|
|
312
318
|
.define_method("ptr", &Matrix2Short::ptr);
|
|
313
319
|
|
|
314
320
|
std::string code = R"(matrix = Matrix2Short.new
|
|
315
|
-
buffer = matrix.ptr
|
|
321
|
+
buffer = matrix.ptr.buffer
|
|
316
322
|
buffer.bytes(5))";
|
|
317
323
|
|
|
318
324
|
std::string expected = "\x1\0\x2\0\x3\0\x4\0\x5\0"s;
|
|
@@ -320,7 +326,7 @@ TESTCASE(short_ptr_buffer)
|
|
|
320
326
|
ASSERT_EQUAL(expected, buffer.str());
|
|
321
327
|
|
|
322
328
|
code = R"(matrix = Matrix2Short.new
|
|
323
|
-
buffer = matrix.ptr
|
|
329
|
+
buffer = matrix.ptr.buffer
|
|
324
330
|
buffer.bytes(0))";
|
|
325
331
|
expected = ""s;
|
|
326
332
|
buffer = m.module_eval(code);
|
|
@@ -336,7 +342,7 @@ TESTCASE(short_ptr_array)
|
|
|
336
342
|
.define_method("ptr", &Matrix2Short::ptr);
|
|
337
343
|
|
|
338
344
|
std::string code = R"(matrix = Matrix2Short.new
|
|
339
|
-
buffer = matrix.ptr
|
|
345
|
+
buffer = matrix.ptr.buffer
|
|
340
346
|
buffer.to_ary(5))";
|
|
341
347
|
|
|
342
348
|
std::vector<short> expected = std::vector<short>{1,2,3,4,5};
|
|
@@ -354,7 +360,7 @@ TESTCASE(unsigned_short_ptr_buffer)
|
|
|
354
360
|
.define_method("ptr", &Matrix2UnsignedShort::ptr);
|
|
355
361
|
|
|
356
362
|
std::string code = R"(matrix = Matrix2UnsignedShort.new
|
|
357
|
-
buffer = matrix.ptr
|
|
363
|
+
buffer = matrix.ptr.buffer
|
|
358
364
|
buffer.bytes(5))";
|
|
359
365
|
|
|
360
366
|
std::string expected = "\x1\0\x2\0\x3\0\x4\0\x5\0"s;
|
|
@@ -362,7 +368,7 @@ TESTCASE(unsigned_short_ptr_buffer)
|
|
|
362
368
|
ASSERT_EQUAL(expected, buffer.str());
|
|
363
369
|
|
|
364
370
|
code = R"(matrix = Matrix2UnsignedShort.new
|
|
365
|
-
buffer = matrix.ptr
|
|
371
|
+
buffer = matrix.ptr.buffer
|
|
366
372
|
buffer.bytes(0))";
|
|
367
373
|
expected = ""s;
|
|
368
374
|
buffer = m.module_eval(code);
|
|
@@ -378,7 +384,7 @@ TESTCASE(unsigned_short_ptr_array)
|
|
|
378
384
|
.define_method("ptr", &Matrix2UnsignedShort::ptr);
|
|
379
385
|
|
|
380
386
|
std::string code = R"(matrix = Matrix2UnsignedShort.new
|
|
381
|
-
buffer = matrix.ptr
|
|
387
|
+
buffer = matrix.ptr.buffer
|
|
382
388
|
buffer.to_ary(5))";
|
|
383
389
|
|
|
384
390
|
std::vector<unsigned short> expected = std::vector<unsigned short>{ 1,2,3,4,5 };
|
|
@@ -396,7 +402,7 @@ TESTCASE(int_ptr_buffer)
|
|
|
396
402
|
.define_method("ptr", &Matrix2Int::ptr);
|
|
397
403
|
|
|
398
404
|
std::string code = R"(matrix = Matrix2Int.new
|
|
399
|
-
buffer = matrix.ptr
|
|
405
|
+
buffer = matrix.ptr.buffer
|
|
400
406
|
buffer.bytes(5))";
|
|
401
407
|
|
|
402
408
|
std::string expected = "\x1\0\0\0\x2\0\0\0\x3\0\0\0\x4\0\0\0\x5\0\0\0"s;
|
|
@@ -404,7 +410,7 @@ TESTCASE(int_ptr_buffer)
|
|
|
404
410
|
ASSERT_EQUAL(expected, buffer.str());
|
|
405
411
|
|
|
406
412
|
code = R"(matrix = Matrix2Int.new
|
|
407
|
-
buffer = matrix.ptr
|
|
413
|
+
buffer = matrix.ptr.buffer
|
|
408
414
|
buffer.bytes(0))";
|
|
409
415
|
expected = ""s;
|
|
410
416
|
buffer = m.module_eval(code);
|
|
@@ -420,7 +426,7 @@ TESTCASE(int_ptr_array)
|
|
|
420
426
|
.define_method("ptr", &Matrix2Int::ptr);
|
|
421
427
|
|
|
422
428
|
std::string code = R"(matrix = Matrix2Int.new
|
|
423
|
-
buffer = matrix.ptr
|
|
429
|
+
buffer = matrix.ptr.buffer
|
|
424
430
|
buffer.to_ary(5))";
|
|
425
431
|
|
|
426
432
|
std::vector<int> expected = std::vector<int>{ 1,2,3,4,5 };
|
|
@@ -438,7 +444,7 @@ TESTCASE(float_ptr_buffer)
|
|
|
438
444
|
.define_method("ptr", &Matrix2Float::ptr);
|
|
439
445
|
|
|
440
446
|
std::string code = R"(matrix = Matrix2Float.new
|
|
441
|
-
buffer = matrix.ptr
|
|
447
|
+
buffer = matrix.ptr.buffer
|
|
442
448
|
buffer.bytes(5))";
|
|
443
449
|
|
|
444
450
|
std::string expected = "\0\0\x80\x3f\0\0\0\x40\0\0\x40\x40\0\0\x80\x40\0\0\xa0\x40"s;
|
|
@@ -446,7 +452,7 @@ TESTCASE(float_ptr_buffer)
|
|
|
446
452
|
ASSERT_EQUAL(expected, buffer.str());
|
|
447
453
|
|
|
448
454
|
code = R"(matrix = Matrix2Float.new
|
|
449
|
-
buffer = matrix.ptr
|
|
455
|
+
buffer = matrix.ptr.buffer
|
|
450
456
|
buffer.bytes(0))";
|
|
451
457
|
expected = ""s;
|
|
452
458
|
buffer = m.module_eval(code);
|
|
@@ -462,7 +468,7 @@ TESTCASE(float_ptr_array)
|
|
|
462
468
|
.define_method("ptr", &Matrix2Float::ptr);
|
|
463
469
|
|
|
464
470
|
std::string code = R"(matrix = Matrix2Float.new
|
|
465
|
-
buffer = matrix.ptr
|
|
471
|
+
buffer = matrix.ptr.buffer
|
|
466
472
|
buffer.to_ary(5))";
|
|
467
473
|
|
|
468
474
|
std::vector<float> expected = std::vector<float>{ 1.0,2.0,3.0,4.0,5.0 };
|
|
@@ -480,7 +486,7 @@ TESTCASE(double_ptr_buffer)
|
|
|
480
486
|
.define_method("ptr", &Matrix2Double::ptr);
|
|
481
487
|
|
|
482
488
|
std::string code = R"(matrix = Matrix2Double.new
|
|
483
|
-
buffer = matrix.ptr
|
|
489
|
+
buffer = matrix.ptr.buffer
|
|
484
490
|
buffer.bytes(5))";
|
|
485
491
|
|
|
486
492
|
std::string expected = "\0\0\0\0\0\0\xf0\x3f\0\0\0\0\0\0\0\x40\0\0\0\0\0\0\x08\x40\0\0\0\0\0\0\x10\x40\0\0\0\0\0\0\x14\x40"s;
|
|
@@ -489,7 +495,7 @@ TESTCASE(double_ptr_buffer)
|
|
|
489
495
|
ASSERT_EQUAL(expected, buffer.str());
|
|
490
496
|
|
|
491
497
|
code = R"(matrix = Matrix2Double.new
|
|
492
|
-
buffer = matrix.ptr
|
|
498
|
+
buffer = matrix.ptr.buffer
|
|
493
499
|
buffer.bytes(0))";
|
|
494
500
|
expected = ""s;
|
|
495
501
|
buffer = m.module_eval(code);
|
|
@@ -505,7 +511,7 @@ TESTCASE(double_ptr_array)
|
|
|
505
511
|
.define_method("ptr", &Matrix2Double::ptr);
|
|
506
512
|
|
|
507
513
|
std::string code = R"(matrix = Matrix2Double.new
|
|
508
|
-
buffer = matrix.ptr
|
|
514
|
+
buffer = matrix.ptr.buffer
|
|
509
515
|
buffer.to_ary(5))";
|
|
510
516
|
|
|
511
517
|
std::vector<double> expected = std::vector<double>{ 1.0,2.0,3.0,4.0,5.0 };
|
|
@@ -514,7 +520,7 @@ TESTCASE(double_ptr_array)
|
|
|
514
520
|
ASSERT_EQUAL(expected, actual);
|
|
515
521
|
|
|
516
522
|
code = R"(matrix = Matrix2Double.new
|
|
517
|
-
buffer = matrix.ptr
|
|
523
|
+
buffer = matrix.ptr.buffer
|
|
518
524
|
buffer.to_ary(0))";
|
|
519
525
|
|
|
520
526
|
expected = std::vector<double>{ };
|
|
@@ -522,3 +528,4 @@ TESTCASE(double_ptr_array)
|
|
|
522
528
|
actual = array.to_vector<double>();
|
|
523
529
|
ASSERT_EQUAL(expected, actual);
|
|
524
530
|
}
|
|
531
|
+
*/
|
data/test/test_Type.cpp
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
#include "unittest.hpp"
|
|
2
2
|
#include "embed_ruby.hpp"
|
|
3
3
|
|
|
4
4
|
#include <rice/rice.hpp>
|
|
5
|
+
#include <rice/stl.hpp>
|
|
5
6
|
|
|
6
7
|
#include <complex>
|
|
7
8
|
|
|
@@ -40,120 +41,322 @@ TESTCASE(FindGroup)
|
|
|
40
41
|
{
|
|
41
42
|
std::string name = "class std::vector<class cv::Vec<unsigned char, 2>, class std::allocator<class cv::Vec<unsigned char, 2> > >";
|
|
42
43
|
|
|
43
|
-
|
|
44
|
+
detail::TypeMapper<int> typeMapper;
|
|
45
|
+
std::string group = typeMapper.findGroup(name, 0);
|
|
44
46
|
ASSERT_EQUAL("<class cv::Vec<unsigned char, 2>, class std::allocator<class cv::Vec<unsigned char, 2> > >", group.c_str());
|
|
45
47
|
|
|
46
|
-
group =
|
|
48
|
+
group = typeMapper.findGroup(name, 18);
|
|
47
49
|
ASSERT_EQUAL("<unsigned char, 2>", group.c_str());
|
|
48
50
|
|
|
49
|
-
group =
|
|
51
|
+
group = typeMapper.findGroup(name, 49);
|
|
50
52
|
ASSERT_EQUAL("<class cv::Vec<unsigned char, 2> >", group.c_str());
|
|
51
53
|
|
|
52
54
|
ASSERT_EXCEPTION_CHECK(
|
|
53
55
|
std::runtime_error,
|
|
54
|
-
|
|
56
|
+
typeMapper.findGroup(name, 48),
|
|
55
57
|
ASSERT_EQUAL("Unbalanced Group", ex.what())
|
|
56
58
|
);
|
|
57
59
|
}
|
|
58
60
|
|
|
59
|
-
TESTCASE(
|
|
61
|
+
TESTCASE(SimplifiedName)
|
|
60
62
|
{
|
|
61
|
-
|
|
62
|
-
std::string className =
|
|
63
|
+
detail::TypeMapper<char*> typeMapper1;
|
|
64
|
+
std::string className = typeMapper1.simplifiedName();
|
|
65
|
+
ASSERT_EQUAL("char*", className.c_str());
|
|
66
|
+
|
|
67
|
+
detail::TypeMapper<char**> typeMapper2;
|
|
68
|
+
className = typeMapper2.simplifiedName();
|
|
69
|
+
ASSERT_EQUAL("char**", className.c_str());
|
|
70
|
+
|
|
71
|
+
detail::TypeMapper<double> typeMapper3;
|
|
72
|
+
className = typeMapper3.simplifiedName();
|
|
73
|
+
ASSERT_EQUAL("double", className.c_str());
|
|
74
|
+
|
|
75
|
+
detail::TypeMapper<double*> typeMapper4;
|
|
76
|
+
className = typeMapper4.simplifiedName();
|
|
77
|
+
ASSERT_EQUAL("double*", className.c_str());
|
|
78
|
+
|
|
79
|
+
detail::TypeMapper<std::string> typeMapper5;
|
|
80
|
+
className = typeMapper5.simplifiedName();
|
|
63
81
|
ASSERT_EQUAL("std::string", className.c_str());
|
|
64
82
|
|
|
65
|
-
|
|
66
|
-
className =
|
|
83
|
+
detail::TypeMapper<std::wstring> typeMapper6;
|
|
84
|
+
className = typeMapper6.simplifiedName();
|
|
67
85
|
ASSERT_EQUAL("std::wstring", className.c_str());
|
|
68
86
|
|
|
69
|
-
|
|
70
|
-
className =
|
|
87
|
+
detail::TypeMapper<std::vector<std::string>> typeMapper7;
|
|
88
|
+
className = typeMapper7.simplifiedName();
|
|
71
89
|
ASSERT_EQUAL("std::vector<std::string>", className.c_str());
|
|
72
90
|
|
|
73
|
-
|
|
74
|
-
className =
|
|
91
|
+
detail::TypeMapper<std::vector<std::wstring>> typeMapper8;
|
|
92
|
+
className = typeMapper8.simplifiedName();
|
|
75
93
|
ASSERT_EQUAL("std::vector<std::wstring>", className.c_str());
|
|
76
94
|
|
|
77
|
-
|
|
78
|
-
className =
|
|
95
|
+
detail::TypeMapper<std::vector<double*>> typeMapper9;
|
|
96
|
+
className = typeMapper9.simplifiedName();
|
|
79
97
|
ASSERT_EQUAL("std::vector<double*>", className.c_str());
|
|
80
98
|
|
|
81
|
-
|
|
82
|
-
className =
|
|
99
|
+
detail::TypeMapper<std::vector<double**>> typeMapper10;
|
|
100
|
+
className = typeMapper10.simplifiedName();
|
|
83
101
|
ASSERT_EQUAL("std::vector<double**>", className.c_str());
|
|
84
102
|
|
|
85
|
-
|
|
86
|
-
className =
|
|
103
|
+
detail::TypeMapper<Outer::Inner::Vec1> typeMapper11;
|
|
104
|
+
className = typeMapper11.simplifiedName();
|
|
87
105
|
ASSERT_EQUAL("std::vector<std::complex<float>>", className.c_str());
|
|
88
106
|
|
|
89
|
-
|
|
90
|
-
className =
|
|
107
|
+
detail::TypeMapper<Outer::Inner::Vec2> typeMapper12;
|
|
108
|
+
className = typeMapper12.simplifiedName();
|
|
91
109
|
ASSERT_EQUAL("std::vector<unsigned char*>", className.c_str());
|
|
92
110
|
|
|
93
|
-
|
|
94
|
-
className =
|
|
111
|
+
detail::TypeMapper<Outer::Inner::Vec3> typeMapper13;
|
|
112
|
+
className = typeMapper13.simplifiedName();
|
|
95
113
|
ASSERT_EQUAL("std::vector<Outer::Inner::SomeClass>", className.c_str());
|
|
96
114
|
|
|
97
|
-
|
|
98
|
-
className =
|
|
115
|
+
detail::TypeMapper<Outer::Inner::Map1> typeMapper14;
|
|
116
|
+
className = typeMapper14.simplifiedName();
|
|
99
117
|
ASSERT_EQUAL("std::map<std::string, std::vector<std::complex<float>>>", className.c_str());
|
|
100
118
|
|
|
101
|
-
|
|
102
|
-
className =
|
|
119
|
+
detail::TypeMapper<Outer::Inner::UnorderedMap1> typeMapper15;
|
|
120
|
+
className = typeMapper15.simplifiedName();
|
|
103
121
|
ASSERT_EQUAL("std::unordered_map<std::string, std::complex<float>>", className.c_str());
|
|
104
122
|
}
|
|
105
123
|
|
|
106
|
-
TESTCASE(
|
|
124
|
+
TESTCASE(RubyName)
|
|
107
125
|
{
|
|
108
|
-
|
|
109
|
-
std::string className =
|
|
126
|
+
detail::TypeMapper<char*> typeMapper1;
|
|
127
|
+
std::string className = typeMapper1.rubyName();
|
|
128
|
+
ASSERT_EQUAL("String", className.c_str());
|
|
129
|
+
|
|
130
|
+
detail::TypeMapper<const unsigned char> typeMapper2;
|
|
131
|
+
className = typeMapper2.rubyName();
|
|
132
|
+
ASSERT_EQUAL("String", className.c_str());
|
|
133
|
+
|
|
134
|
+
detail::TypeMapper<const unsigned char*> typeMapper3;
|
|
135
|
+
className = typeMapper3.rubyName();
|
|
136
|
+
ASSERT_EQUAL("UnsignedChar", className.c_str());
|
|
137
|
+
|
|
138
|
+
detail::TypeMapper<char**> typeMapper4;
|
|
139
|
+
className = typeMapper4.rubyName();
|
|
140
|
+
ASSERT_EQUAL("Char", className.c_str());
|
|
141
|
+
|
|
142
|
+
detail::TypeMapper<double> typeMapper5;
|
|
143
|
+
className = typeMapper5.rubyName();
|
|
144
|
+
ASSERT_EQUAL("Float", className.c_str());
|
|
145
|
+
|
|
146
|
+
detail::TypeMapper<double*> typeMapper6;
|
|
147
|
+
className = typeMapper6.rubyName();
|
|
148
|
+
ASSERT_EQUAL("Double", className.c_str());
|
|
149
|
+
|
|
150
|
+
detail::TypeMapper<Buffer<double*>> typeMapper7;
|
|
151
|
+
className = typeMapper7.rubyName();
|
|
152
|
+
ASSERT_EQUAL("Buffer≺double∗≻", className.c_str());
|
|
153
|
+
|
|
154
|
+
detail::TypeMapper<std::string> typeMapper8;
|
|
155
|
+
className = typeMapper8.rubyName();
|
|
110
156
|
ASSERT_EQUAL("String", className.c_str());
|
|
111
157
|
|
|
112
|
-
|
|
113
|
-
className =
|
|
158
|
+
detail::TypeMapper<std::wstring> typeMapper9;
|
|
159
|
+
className = typeMapper9.rubyName();
|
|
114
160
|
ASSERT_EQUAL("Wstring", className.c_str());
|
|
115
161
|
|
|
116
|
-
|
|
117
|
-
className =
|
|
162
|
+
detail::TypeMapper<std::vector<std::string>> typeMapper10;
|
|
163
|
+
className = typeMapper10.rubyName();
|
|
118
164
|
ASSERT_EQUAL("Vector≺string≻", className.c_str());
|
|
119
165
|
|
|
120
|
-
|
|
121
|
-
className =
|
|
166
|
+
detail::TypeMapper<std::vector<std::wstring>> typeMapper11;
|
|
167
|
+
className = typeMapper11.rubyName();
|
|
122
168
|
ASSERT_EQUAL("Vector≺wstring≻", className.c_str());
|
|
123
169
|
|
|
124
|
-
|
|
125
|
-
className =
|
|
170
|
+
detail::TypeMapper<std::vector<double*>> typeMapper12;
|
|
171
|
+
className = typeMapper12.rubyName();
|
|
126
172
|
ASSERT_EQUAL("Vector≺double∗≻", className.c_str());
|
|
127
173
|
|
|
128
|
-
|
|
129
|
-
className =
|
|
174
|
+
detail::TypeMapper<std::vector<double**>> typeMapper13;
|
|
175
|
+
className = typeMapper13.rubyName();
|
|
130
176
|
ASSERT_EQUAL("Vector≺double∗∗≻", className.c_str());
|
|
131
177
|
|
|
132
|
-
|
|
133
|
-
className =
|
|
178
|
+
detail::TypeMapper<Outer::Inner::Vec1> typeMapper14;
|
|
179
|
+
className = typeMapper14.rubyName();
|
|
134
180
|
ASSERT_EQUAL("Vector≺complex≺float≻≻", className.c_str());
|
|
135
181
|
|
|
136
|
-
|
|
137
|
-
className =
|
|
182
|
+
detail::TypeMapper<Outer::Inner::Vec2> typeMapper15;
|
|
183
|
+
className = typeMapper15.rubyName();
|
|
138
184
|
ASSERT_EQUAL("Vector≺unsigned char∗≻", className.c_str());
|
|
139
185
|
|
|
140
|
-
|
|
141
|
-
className =
|
|
186
|
+
detail::TypeMapper<Outer::Inner::Vec3> typeMapper16;
|
|
187
|
+
className = typeMapper16.rubyName();
|
|
142
188
|
ASSERT_EQUAL("Vector≺Outer꞉꞉Inner꞉꞉SomeClass≻", className.c_str());
|
|
143
189
|
|
|
144
|
-
|
|
145
|
-
className =
|
|
190
|
+
detail::TypeMapper<Outer::Inner::Map1> typeMapper17;
|
|
191
|
+
className = typeMapper17.rubyName();
|
|
146
192
|
ASSERT_EQUAL("Map≺string‚ vector≺complex≺float≻≻≻", className.c_str());
|
|
147
193
|
|
|
148
|
-
|
|
149
|
-
className =
|
|
194
|
+
detail::TypeMapper<Outer::Inner::UnorderedMap1> typeMapper18;
|
|
195
|
+
className = typeMapper18.rubyName();
|
|
150
196
|
ASSERT_EQUAL("UnorderedMap≺string‚ complex≺float≻≻", className.c_str());
|
|
197
|
+
|
|
198
|
+
detail::TypeMapper<Outer::Inner::SomeClass*> typeMapper19;
|
|
199
|
+
className = typeMapper19.rubyName();
|
|
200
|
+
ASSERT_EQUAL("SomeClass", className.c_str());
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
TESTCASE(RubyKlass)
|
|
204
|
+
{
|
|
205
|
+
Module riceModule = define_module("Rice");
|
|
206
|
+
|
|
207
|
+
detail::TypeMapper<int> typeMapper1;
|
|
208
|
+
VALUE actual = typeMapper1.rubyKlass();
|
|
209
|
+
ASSERT_EQUAL(rb_cInteger, actual);
|
|
210
|
+
|
|
211
|
+
detail::TypeMapper<const int> typeMapper2;
|
|
212
|
+
actual = typeMapper2.rubyKlass();
|
|
213
|
+
ASSERT_EQUAL(rb_cInteger, actual);
|
|
214
|
+
|
|
215
|
+
detail::TypeMapper<int&> typeMapper3;
|
|
216
|
+
actual = typeMapper3.rubyKlass();
|
|
217
|
+
ASSERT_EQUAL(rb_cInteger, actual);
|
|
218
|
+
|
|
219
|
+
detail::TypeMapper<const int&> typeMapper4;
|
|
220
|
+
actual = typeMapper4.rubyKlass();
|
|
221
|
+
ASSERT_EQUAL(rb_cInteger, actual);
|
|
222
|
+
|
|
223
|
+
detail::TypeMapper<char*> typeMapper5;
|
|
224
|
+
actual = typeMapper5.rubyKlass();
|
|
225
|
+
ASSERT_EQUAL(rb_cString, actual);
|
|
226
|
+
|
|
227
|
+
detail::TypeMapper<const unsigned char> typeMapper6;
|
|
228
|
+
actual = typeMapper6.rubyKlass();
|
|
229
|
+
ASSERT_EQUAL(rb_cString, actual);
|
|
230
|
+
|
|
231
|
+
define_buffer<unsigned char>();
|
|
232
|
+
Object expected = riceModule.const_get("Buffer≺unsigned char≻");
|
|
233
|
+
detail::TypeMapper<Buffer<unsigned char>> typeMapper8;
|
|
234
|
+
actual = typeMapper8.rubyKlass();
|
|
235
|
+
ASSERT_EQUAL(expected.value(), actual);
|
|
236
|
+
|
|
237
|
+
expected = Object(rb_cObject).const_get("String");
|
|
238
|
+
detail::TypeMapper<char*> typeMapper9;
|
|
239
|
+
actual = typeMapper9.rubyKlass();
|
|
240
|
+
ASSERT_EQUAL(expected.value(), actual);
|
|
241
|
+
|
|
242
|
+
define_pointer<char*>();
|
|
243
|
+
expected = riceModule.const_get("Pointer≺char∗≻");
|
|
244
|
+
detail::TypeMapper<char**> typeMapper10;
|
|
245
|
+
actual = typeMapper10.rubyKlass();
|
|
246
|
+
ASSERT_EQUAL(expected.value(), actual);
|
|
247
|
+
|
|
248
|
+
define_pointer<char*>();
|
|
249
|
+
expected = riceModule.const_get("Pointer≺char∗≻");
|
|
250
|
+
detail::TypeMapper<const char**> typeMapper11;
|
|
251
|
+
actual = typeMapper11.rubyKlass();
|
|
252
|
+
ASSERT_EQUAL(expected.value(), actual);
|
|
253
|
+
|
|
254
|
+
define_buffer<char**>();
|
|
255
|
+
expected = riceModule.const_get("Buffer≺char∗≻");
|
|
256
|
+
detail::TypeMapper<Buffer<char*>> typeMapper12;
|
|
257
|
+
actual = typeMapper12.rubyKlass();
|
|
258
|
+
ASSERT_EQUAL(expected.value(), actual);
|
|
259
|
+
|
|
260
|
+
detail::TypeMapper<double> typeMapper13;
|
|
261
|
+
actual = typeMapper13.rubyKlass();
|
|
262
|
+
ASSERT_EQUAL(rb_cFloat, actual);
|
|
263
|
+
|
|
264
|
+
define_pointer<double>();
|
|
265
|
+
expected = riceModule.const_get("Pointer≺double≻");
|
|
266
|
+
detail::TypeMapper<volatile double*> typeMapper14;
|
|
267
|
+
actual = typeMapper14.rubyKlass();
|
|
268
|
+
ASSERT_EQUAL(expected.value(), actual);
|
|
269
|
+
|
|
270
|
+
define_pointer<double*>();
|
|
271
|
+
expected = riceModule.const_get("Pointer≺double∗≻");
|
|
272
|
+
detail::TypeMapper<const volatile double**> typeMapper15;
|
|
273
|
+
actual = typeMapper15.rubyKlass();
|
|
274
|
+
ASSERT_EQUAL(expected.value(), actual);
|
|
275
|
+
|
|
276
|
+
detail::TypeMapper<std::string> typeMapper16;
|
|
277
|
+
actual = typeMapper16.rubyKlass();
|
|
278
|
+
ASSERT_EQUAL(rb_cString, actual);
|
|
279
|
+
|
|
280
|
+
define_pointer<std::string>();
|
|
281
|
+
detail::TypeMapper<std::string*> typeMapper17;
|
|
282
|
+
expected = riceModule.const_get("Pointer≺string≻");
|
|
283
|
+
actual = typeMapper17.rubyKlass();
|
|
284
|
+
ASSERT_EQUAL(expected.value(), actual);
|
|
285
|
+
|
|
286
|
+
define_pointer<std::string*>();
|
|
287
|
+
detail::TypeMapper<std::string**> typeMapper18;
|
|
288
|
+
expected = riceModule.const_get("Pointer≺string∗≻");
|
|
289
|
+
actual = typeMapper18.rubyKlass();
|
|
290
|
+
ASSERT_EQUAL(expected.value(), actual);
|
|
291
|
+
|
|
292
|
+
define_vector<std::string>();
|
|
293
|
+
Module stdModule("Std");
|
|
294
|
+
|
|
295
|
+
detail::TypeMapper<std::vector<std::string>> typeMapper19;
|
|
296
|
+
expected = stdModule.const_get("Vector≺string≻");
|
|
297
|
+
actual = typeMapper19.rubyKlass();
|
|
298
|
+
ASSERT_EQUAL(expected.value(), actual);
|
|
299
|
+
|
|
300
|
+
define_class<Outer::Inner::Vec1>("Vec1");
|
|
301
|
+
detail::TypeMapper<Outer::Inner::Vec1> typeMapper20;
|
|
302
|
+
expected = Object(rb_cObject).const_get("Vec1");
|
|
303
|
+
actual = typeMapper20.rubyKlass();
|
|
304
|
+
ASSERT_EQUAL(expected.value(), actual);
|
|
305
|
+
|
|
306
|
+
define_class<Outer::Inner::Map1>("Map1");
|
|
307
|
+
detail::TypeMapper<Outer::Inner::Map1> typeMapper21;
|
|
308
|
+
expected = Object(rb_cObject).const_get("Map1");
|
|
309
|
+
actual = typeMapper21.rubyKlass();
|
|
310
|
+
ASSERT_EQUAL(expected.value(), actual);
|
|
311
|
+
|
|
312
|
+
define_class<Outer::Inner::UnorderedMap1>("UnorderedMap1");
|
|
313
|
+
detail::TypeMapper<Outer::Inner::UnorderedMap1> typeMapper22;
|
|
314
|
+
expected = Object(rb_cObject).const_get("UnorderedMap1");
|
|
315
|
+
actual = typeMapper22.rubyKlass();
|
|
316
|
+
ASSERT_EQUAL(expected.value(), actual);
|
|
317
|
+
|
|
318
|
+
define_class<Outer::Inner::SomeClass>("SomeClass");
|
|
319
|
+
detail::TypeMapper<Outer::Inner::SomeClass**> typeMapper23;
|
|
320
|
+
expected = Object(rb_cObject).const_get("SomeClass");
|
|
321
|
+
actual = typeMapper23.rubyKlass();
|
|
322
|
+
ASSERT_EQUAL(expected.value(), actual);
|
|
323
|
+
|
|
324
|
+
using Callback_T = char*(*)(int, double, bool, char*);
|
|
325
|
+
detail::TypeMapper<Callback_T> typeMapper24;
|
|
326
|
+
expected = Object(rb_cObject).const_get("Proc");
|
|
327
|
+
actual = typeMapper24.rubyKlass();
|
|
328
|
+
ASSERT_EQUAL(expected.value(), actual);
|
|
329
|
+
|
|
330
|
+
detail::TypeMapper<std::tuple<float, float>> typeMapper25;
|
|
331
|
+
expected = Object(rb_cObject).const_get("Array");
|
|
332
|
+
actual = typeMapper25.rubyKlass();
|
|
333
|
+
ASSERT_EQUAL(expected.value(), actual);
|
|
334
|
+
|
|
335
|
+
detail::TypeMapper<std::optional<float>> typeMapper26;
|
|
336
|
+
actual = typeMapper26.rubyKlass();
|
|
337
|
+
ASSERT_EQUAL(rb_cFloat, actual);
|
|
338
|
+
|
|
339
|
+
detail::TypeMapper<std::complex<float>> typeMapper27;
|
|
340
|
+
actual = typeMapper27.rubyKlass();
|
|
341
|
+
ASSERT_EQUAL(rb_cComplex, actual);
|
|
342
|
+
|
|
343
|
+
detail::TypeMapper<std::monostate> typeMapper28;
|
|
344
|
+
actual = typeMapper28.rubyKlass();
|
|
345
|
+
ASSERT_EQUAL(rb_cNilClass, actual);
|
|
346
|
+
|
|
347
|
+
detail::TypeMapper<std::reference_wrapper<int>> typeMapper29;
|
|
348
|
+
actual = typeMapper29.rubyKlass();
|
|
349
|
+
ASSERT_EQUAL(rb_cInteger, actual);
|
|
350
|
+
|
|
351
|
+
detail::TypeMapper<std::string_view> typeMapper30;
|
|
352
|
+
actual = typeMapper30.rubyKlass();
|
|
353
|
+
ASSERT_EQUAL(rb_cString, actual);
|
|
151
354
|
}
|
|
152
355
|
|
|
153
356
|
TESTCASE(MakeRubyClass)
|
|
154
357
|
{
|
|
155
|
-
|
|
156
|
-
std::string rubyClassName =
|
|
358
|
+
detail::TypeMapper<Outer::Inner::Vec1> typeMapper;
|
|
359
|
+
std::string rubyClassName = typeMapper.rubyName();
|
|
157
360
|
|
|
158
361
|
Module module = define_module("Testing");
|
|
159
362
|
|
data/test/unittest.hpp
CHANGED
|
@@ -263,6 +263,33 @@ void assert_not_equal(
|
|
|
263
263
|
}
|
|
264
264
|
}
|
|
265
265
|
|
|
266
|
+
template<typename T, typename U, typename V>
|
|
267
|
+
void assert_in_delta(
|
|
268
|
+
T const& expected,
|
|
269
|
+
U const& actual,
|
|
270
|
+
V const& delta,
|
|
271
|
+
std::string const& s_t,
|
|
272
|
+
std::string const& s_u,
|
|
273
|
+
std::string const& s_delta,
|
|
274
|
+
std::string const& file,
|
|
275
|
+
size_t line)
|
|
276
|
+
{
|
|
277
|
+
// Negative deltas don't make sense; treat as failure for clarity.
|
|
278
|
+
if (delta < 0)
|
|
279
|
+
{
|
|
280
|
+
throw Assertion_Failed("assert_in_delta failed: negative delta");
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
T diff = std::abs(expected - actual);
|
|
284
|
+
if (!(diff <= delta))
|
|
285
|
+
{
|
|
286
|
+
std::stringstream strm;
|
|
287
|
+
strm << "assert_in_delta failed: |" << actual << " - " << expected << "| = "
|
|
288
|
+
<< diff << " > " << delta;
|
|
289
|
+
throw Assertion_Failed(strm.str());
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
266
293
|
#define FAIL(message, expect, got) \
|
|
267
294
|
do \
|
|
268
295
|
{ \
|
|
@@ -285,6 +312,14 @@ void assert_not_equal(
|
|
|
285
312
|
assert_not_equal((x), (y), #x, #y, __FILE__, __LINE__); \
|
|
286
313
|
} while(0)
|
|
287
314
|
|
|
315
|
+
#define ASSERT_IN_DELTA(x, y, delta) \
|
|
316
|
+
do \
|
|
317
|
+
{ \
|
|
318
|
+
++assertions; \
|
|
319
|
+
assert_in_delta((x), (y), (delta), #x, #y, #delta, __FILE__, __LINE__); \
|
|
320
|
+
} while(0)
|
|
321
|
+
|
|
322
|
+
|
|
288
323
|
#define ASSERT(x) \
|
|
289
324
|
ASSERT_EQUAL(true, !!x);
|
|
290
325
|
|