Skip to content

Commit f1d7c7b

Browse files
committed
Add specs for coercion for FFI::Struct and FFI::AbstractMemory
* This is generally handled in FFI::Pointer #write/#put methods.
1 parent 18301de commit f1d7c7b

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

spec/ffi/struct_spec.rb

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,17 @@ def test_num_field(type, v)
326326
expect(s.pointer.send("get_#{type.to_s}", 0)).to eq(v)
327327
s.pointer.send("put_#{type.to_s}", 0, 0)
328328
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)
329340
end
330341
def self.int_field_test(type, values)
331342
values.each do |v|
@@ -358,6 +369,15 @@ def self.int_field_test(type, values)
358369
value = 1.23456
359370
s[:v] = value
360371
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)
361381
end
362382

363383
it ":double field r/w" do
@@ -368,6 +388,15 @@ def self.int_field_test(type, values)
368388
value = 1.23456
369389
s[:v] = value
370390
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)
371400
end
372401
module EnumFields
373402
extend FFI::Library

0 commit comments

Comments
 (0)