@@ -326,6 +326,17 @@ def test_num_field(type, v)
326
326
expect ( s . pointer . send ( "get_#{ type . to_s } " , 0 ) ) . to eq ( v )
327
327
s . pointer . send ( "put_#{ type . to_s } " , 0 , 0 )
328
328
expect ( s [ :v ] ) . to eq ( 0 )
329
+
330
+ # Test coercion
331
+ obj = double ( "coerce" )
332
+ expect ( obj ) . to receive ( :to_int ) . and_return ( v )
333
+ s [ :v ] = obj
334
+ expect ( s . pointer . send ( "get_#{ type . to_s } " , 0 ) ) . to eq ( v )
335
+
336
+ zero = double ( "zero" )
337
+ expect ( zero ) . to receive ( :to_int ) . and_return ( 0 )
338
+ s . pointer . send ( "put_#{ type . to_s } " , 0 , zero )
339
+ expect ( s [ :v ] ) . to eq ( 0 )
329
340
end
330
341
def self . int_field_test ( type , values )
331
342
values . each do |v |
@@ -358,6 +369,15 @@ def self.int_field_test(type, values)
358
369
value = 1.23456
359
370
s [ :v ] = value
360
371
expect ( ( s . pointer . get_float ( 0 ) - value ) . abs ) . to be < 0.0001
372
+
373
+ # Test coercion
374
+ obj = double ( "coerce" )
375
+ expect ( obj ) . to receive ( :to_f ) . and_return ( 42.0 )
376
+ s [ :v ] = obj
377
+ expect ( ( s . pointer . get_float ( 0 ) - 42.0 ) . abs ) . to be < 0.0001
378
+
379
+ s . pointer . put_float ( 0 , 1.0 )
380
+ expect ( s . pointer . get_float ( 0 ) ) . to eq ( 1.0 )
361
381
end
362
382
363
383
it ":double field r/w" do
@@ -368,6 +388,15 @@ def self.int_field_test(type, values)
368
388
value = 1.23456
369
389
s [ :v ] = value
370
390
expect ( ( s . pointer . get_double ( 0 ) - value ) . abs ) . to be < 0.0001
391
+
392
+ # Test coercion
393
+ obj = double ( "coerce" )
394
+ expect ( obj ) . to receive ( :to_f ) . and_return ( 42.0 )
395
+ s [ :v ] = obj
396
+ expect ( ( s . pointer . get_double ( 0 ) - 42.0 ) . abs ) . to be < 0.0001
397
+
398
+ s . pointer . put_double ( 0 , 1.0 )
399
+ expect ( s . pointer . get_double ( 0 ) ) . to eq ( 1.0 )
371
400
end
372
401
module EnumFields
373
402
extend FFI ::Library
0 commit comments