summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortduehr <tduehr@gmail.com>2014-01-16 11:30:36 -0600
committertduehr <tduehr@gmail.com>2014-10-13 15:27:12 -0500
commit31a15dfec6186e9eae32d39eeb65617b6ef5a518 (patch)
treec491aecb67432f0f3413c02106ef564fb02a86dc
parentad67131668f0f844f7dbc5a3b30621120b03a905 (diff)
downloadffi-31a15dfec6186e9eae32d39eeb65617b6ef5a518.tar.gz
additional specs and a minor fix
-rw-r--r--ext/ffi_c/Call.c4
-rw-r--r--spec/ffi/enum_spec.rb152
2 files changed, 121 insertions, 35 deletions
diff --git a/ext/ffi_c/Call.c b/ext/ffi_c/Call.c
index b028811..08e38dd 100644
--- a/ext/ffi_c/Call.c
+++ b/ext/ffi_c/Call.c
@@ -203,7 +203,7 @@ rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes,
param->u32 = NUM2UINT(argv[argidx]);
}
- ADJ(param, INT32);
+ ADJ(param, UINT32);
++argidx;
break;
@@ -227,7 +227,7 @@ rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes,
param->u64 = NUM2ULL(argv[argidx]);
}
- ADJ(param, INT64);
+ ADJ(param, UINT64);
++argidx;
break;
diff --git a/spec/ffi/enum_spec.rb b/spec/ffi/enum_spec.rb
index 1ca1bad..55ff13a 100644
--- a/spec/ffi/enum_spec.rb
+++ b/spec/ffi/enum_spec.rb
@@ -44,11 +44,18 @@ module TestEnum4
enum :enum_type1, [:c5, 0x42, :c6, :c7, :c8]
enum :enum_type2, [:c9, 0x42, :c10, :c11, 0x4242, :c12]
enum :enum_type3, [:c13, 0x42, :c14, 0x4242, :c15, 0x42424242, :c16, 0x4242424242424242]
-
- attach_function :test_untagged_nonint_enum, [:uint8], :uint8
- attach_function :test_tagged_nonint_enum1, [:uint16], :enum_type1
- attach_function :test_tagged_nonint_enum2, [:uint32], :enum_type2
- attach_function :test_tagged_nonint_enum3, [:uint64], :enum_type3
+ enum FFI::Type::UINT16, :enum_type4, [:c17, 0x42, :c18, :c19, :c20]
+ enum FFI::Type::UINT32, :enum_type5, [:c21, 0x42, :c22, :c23, 0x4242, :c24]
+ enum FFI::Type::UINT64, :enum_type6, [:c25, 0x42, :c26, 0x4242, :c27, 0x42424242, :c28, 0x4242424242424242]
+ enum FFI::Type::UINT64, [:c29, 0x4242424242424242, :c30, :c31, :c32]
+
+ attach_function :test_untagged_nonint_enum, [:uint8], :uint8
+ attach_function :test_tagged_nonint_enum1, [:uint16], :uint16
+ attach_function :test_tagged_nonint_enum2, [:uint32], :uint32
+ attach_function :test_tagged_nonint_enum3, [:uint64], :uint64
+ attach_function :test_tagged_nonint_enum4, :test_tagged_nonint_enum1, [:enum_type4], :enum_type4
+ attach_function :test_tagged_nonint_enum5, :test_tagged_nonint_enum2, [:enum_type5], :enum_type5
+ attach_function :test_tagged_nonint_enum6, :test_tagged_nonint_enum3, [:enum_type6], :enum_type6
end
describe "A library with no enum defined" do
@@ -75,10 +82,14 @@ describe "An untagged enum" do
expect(TestEnum1.test_untagged_enum(:c14)).to eq(4242)
expect(TestEnum1.test_untagged_enum(:c15)).to eq(424242)
expect(TestEnum1.test_untagged_enum(:c16)).to eq(42424242)
- expect(TestEnum4.test_untagged_enum(:c1)).to eq(0)
- expect(TestEnum4.test_untagged_enum(:c2)).to eq(1)
- expect(TestEnum4.test_untagged_enum(:c3)).to eq(2)
- expect(TestEnum4.test_untagged_enum(:c4)).to eq(3)
+ expect(TestEnum4.test_untagged_nonint_enum(:c1)).to eq(0)
+ expect(TestEnum4.test_untagged_nonint_enum(:c2)).to eq(1)
+ expect(TestEnum4.test_untagged_nonint_enum(:c3)).to eq(2)
+ expect(TestEnum4.test_untagged_nonint_enum(:c4)).to eq(3)
+ expect(TestEnum4.test_tagged_nonint_enum3(:c29)).to eq(0x4242424242424242)
+ expect(TestEnum4.test_tagged_nonint_enum3(:c30)).to eq(0x4242424242424243)
+ expect(TestEnum4.test_tagged_nonint_enum3(:c31)).to eq(0x4242424242424244)
+ expect(TestEnum4.test_tagged_nonint_enum3(:c32)).to eq(0x4242424242424245)
end
end
@@ -91,6 +102,9 @@ describe "A tagged typedef enum" do
expect(TestEnum4.enum_type(:enum_type1)).not_to be_nil
expect(TestEnum4.enum_type(:enum_type2)).not_to be_nil
expect(TestEnum4.enum_type(:enum_type3)).not_to be_nil
+ expect(TestEnum4.enum_type(:enum_type4)).not_to be_nil
+ expect(TestEnum4.enum_type(:enum_type5)).not_to be_nil
+ expect(TestEnum4.enum_type(:enum_type6)).not_to be_nil
end
it "contains enum constants" do
@@ -101,6 +115,9 @@ describe "A tagged typedef enum" do
expect(TestEnum4.enum_type(:enum_type1).symbols.length).to eq(4)
expect(TestEnum4.enum_type(:enum_type2).symbols.length).to eq(4)
expect(TestEnum4.enum_type(:enum_type3).symbols.length).to eq(4)
+ expect(TestEnum4.enum_type(:enum_type4).symbols.length).to eq(4)
+ expect(TestEnum4.enum_type(:enum_type5).symbols.length).to eq(4)
+ expect(TestEnum4.enum_type(:enum_type6).symbols.length).to eq(4)
end
it "constants can be used as function parameters and return value" do
@@ -120,18 +137,30 @@ describe "A tagged typedef enum" do
expect(TestEnum3.test_tagged_typedef_enum4(:c14)).to be :c14
expect(TestEnum3.test_tagged_typedef_enum4(:c15)).to be :c15
expect(TestEnum3.test_tagged_typedef_enum4(:c16)).to be :c16
- expect(TestEnum4.test_tagged_nonint_enum1(:c5)).to be :c5
- expect(TestEnum4.test_tagged_nonint_enum1(:c6)).to be :c6
- expect(TestEnum4.test_tagged_nonint_enum1(:c7)).to be :c7
- expect(TestEnum4.test_tagged_nonint_enum1(:c8)).to be :c8
- expect(TestEnum4.test_tagged_nonint_enum2(:c9)).to be :c9
- expect(TestEnum4.test_tagged_nonint_enum2(:c10)).to be :c10
- expect(TestEnum4.test_tagged_nonint_enum2(:c11)).to be :c11
- expect(TestEnum4.test_tagged_nonint_enum2(:c12)).to be :c12
- expect(TestEnum4.test_tagged_nonint_enum3(:c13)).to be :c13
- expect(TestEnum4.test_tagged_nonint_enum3(:c14)).to be :c14
- expect(TestEnum4.test_tagged_nonint_enum3(:c15)).to be :c15
- expect(TestEnum4.test_tagged_nonint_enum3(:c16)).to be :c16
+ expect(TestEnum4.test_tagged_nonint_enum1(:c5)).to eq(0x42)
+ expect(TestEnum4.test_tagged_nonint_enum1(:c6)).to eq(0x43)
+ expect(TestEnum4.test_tagged_nonint_enum1(:c7)).to eq(0x44)
+ expect(TestEnum4.test_tagged_nonint_enum1(:c8)).to eq(0x45)
+ expect(TestEnum4.test_tagged_nonint_enum2(:c9)).to eq(0x42)
+ expect(TestEnum4.test_tagged_nonint_enum2(:c10)).to eq(0x43)
+ expect(TestEnum4.test_tagged_nonint_enum2(:c11)).to eq(0x4242)
+ expect(TestEnum4.test_tagged_nonint_enum2(:c12)).to eq(0x4243)
+ expect(TestEnum4.test_tagged_nonint_enum3(:c13)).to eq(0x42)
+ expect(TestEnum4.test_tagged_nonint_enum3(:c14)).to eq(0x4242)
+ expect(TestEnum4.test_tagged_nonint_enum3(:c15)).to eq(0x42424242)
+ expect(TestEnum4.test_tagged_nonint_enum3(:c16)).to eq(0x4242424242424242)
+ expect(TestEnum4.test_tagged_nonint_enum4(:c17)).to eq(:c17)
+ expect(TestEnum4.test_tagged_nonint_enum4(:c18)).to eq(:c18)
+ expect(TestEnum4.test_tagged_nonint_enum4(:c19)).to eq(:c19)
+ expect(TestEnum4.test_tagged_nonint_enum4(:c20)).to eq(:c20)
+ expect(TestEnum4.test_tagged_nonint_enum5(:c21)).to eq(:c21)
+ expect(TestEnum4.test_tagged_nonint_enum5(:c22)).to eq(:c22)
+ expect(TestEnum4.test_tagged_nonint_enum5(:c23)).to eq(:c23)
+ expect(TestEnum4.test_tagged_nonint_enum5(:c24)).to eq(:c24)
+ expect(TestEnum4.test_tagged_nonint_enum6(:c25)).to eq(:c25)
+ expect(TestEnum4.test_tagged_nonint_enum6(:c26)).to eq(:c26)
+ expect(TestEnum4.test_tagged_nonint_enum6(:c27)).to eq(:c27)
+ expect(TestEnum4.test_tagged_nonint_enum6(:c28)).to eq(:c28)
end
it "integers can be used instead of constants" do
@@ -151,18 +180,18 @@ describe "A tagged typedef enum" do
expect(TestEnum3.test_tagged_typedef_enum4(4242)).to be :c14
expect(TestEnum3.test_tagged_typedef_enum4(424242)).to be :c15
expect(TestEnum3.test_tagged_typedef_enum4(42424242)).to be :c16
- expect(TestEnum4.test_tagged_nonint_enum1(0x42)).to be :c5
- expect(TestEnum4.test_tagged_nonint_enum1(0x43)).to be :c6
- expect(TestEnum4.test_tagged_nonint_enum1(0x44)).to be :c7
- expect(TestEnum4.test_tagged_nonint_enum1(0x45)).to be :c8
- expect(TestEnum4.test_tagged_nonint_enum2(0x42)).to be :c9
- expect(TestEnum4.test_tagged_nonint_enum2(0x43)).to be :c10
- expect(TestEnum4.test_tagged_nonint_enum2(0x4242)).to be :c11
- expect(TestEnum4.test_tagged_nonint_enum2(0x4243)).to be :c12
- expect(TestEnum4.test_tagged_nonint_enum3(0x42)).to be :c13
- expect(TestEnum4.test_tagged_nonint_enum3(0x4242)).to be :c14
- expect(TestEnum4.test_tagged_nonint_enum3(0x42424242)).to be :c15
- expect(TestEnum4.test_tagged_nonint_enum3(0x4242424242424242)).to be :c16
+ expect(TestEnum4.test_tagged_nonint_enum4(0x42)).to eq(:c17)
+ expect(TestEnum4.test_tagged_nonint_enum4(0x43)).to eq(:c18)
+ expect(TestEnum4.test_tagged_nonint_enum4(0x44)).to eq(:c19)
+ expect(TestEnum4.test_tagged_nonint_enum4(0x45)).to eq(:c20)
+ expect(TestEnum4.test_tagged_nonint_enum5(0x42)).to eq(:c21)
+ expect(TestEnum4.test_tagged_nonint_enum5(0x43)).to eq(:c22)
+ expect(TestEnum4.test_tagged_nonint_enum5(0x4242)).to eq(:c23)
+ expect(TestEnum4.test_tagged_nonint_enum5(0x4243)).to eq(:c24)
+ expect(TestEnum4.test_tagged_nonint_enum6(0x42)).to eq(:c25)
+ expect(TestEnum4.test_tagged_nonint_enum6(0x4242)).to eq(:c26)
+ expect(TestEnum4.test_tagged_nonint_enum6(0x42424242)).to eq(:c27)
+ expect(TestEnum4.test_tagged_nonint_enum6(0x4242424242424242)).to eq(:c28)
end
end
@@ -199,6 +228,11 @@ describe "All enums" do
expect(TestEnum4.enum_value(:c6)).to eq(0x43)
expect(TestEnum4.enum_value(:c7)).to eq(0x44)
expect(TestEnum4.enum_value(:c8)).to eq(0x45)
+
+ expect(TestEnum4.enum_value(:c29)).to eq(0x4242424242424242)
+ expect(TestEnum4.enum_value(:c30)).to eq(0x4242424242424243)
+ expect(TestEnum4.enum_value(:c31)).to eq(0x4242424242424244)
+ expect(TestEnum4.enum_value(:c32)).to eq(0x4242424242424245)
end
it "can have a mix of explicit and autonumbered constants" do
@@ -216,6 +250,11 @@ describe "All enums" do
expect(TestEnum4.enum_value(:c10)).to eq(0x43)
expect(TestEnum4.enum_value(:c11)).to eq(0x4242)
expect(TestEnum4.enum_value(:c12)).to eq(0x4243)
+
+ expect(TestEnum4.enum_value(:c21)).to eq(0x42)
+ expect(TestEnum4.enum_value(:c22)).to eq(0x43)
+ expect(TestEnum4.enum_value(:c23)).to eq(0x4242)
+ expect(TestEnum4.enum_value(:c24)).to eq(0x4243)
end
it "can have all its constants explicitely valued" do
@@ -233,6 +272,11 @@ describe "All enums" do
expect(TestEnum4.enum_value(:c14)).to eq(0x4242)
expect(TestEnum4.enum_value(:c15)).to eq(0x42424242)
expect(TestEnum4.enum_value(:c16)).to eq(0x4242424242424242)
+
+ expect(TestEnum4.enum_value(:c25)).to eq(0x42)
+ expect(TestEnum4.enum_value(:c26)).to eq(0x4242)
+ expect(TestEnum4.enum_value(:c27)).to eq(0x42424242)
+ expect(TestEnum4.enum_value(:c28)).to eq(0x4242424242424242)
end
it "return the constant corresponding to a specific value" do
@@ -277,6 +321,24 @@ describe "All enums" do
expect(enum[0x4242]).to eq(:c14)
expect(enum[0x42424242]).to eq(:c15)
expect(enum[0x4242424242424242]).to eq(:c16)
+
+ enum = TestEnum4.enum_type(:enum_type4)
+ expect(enum[0x42]).to eq(:c17)
+ expect(enum[0x43]).to eq(:c18)
+ expect(enum[0x44]).to eq(:c19)
+ expect(enum[0x45]).to eq(:c20)
+
+ enum = TestEnum4.enum_type(:enum_type5)
+ expect(enum[0x42]).to eq(:c21)
+ expect(enum[0x43]).to eq(:c22)
+ expect(enum[0x4242]).to eq(:c23)
+ expect(enum[0x4243]).to eq(:c24)
+
+ enum = TestEnum4.enum_type(:enum_type6)
+ expect(enum[0x42]).to eq(:c25)
+ expect(enum[0x4242]).to eq(:c26)
+ expect(enum[0x42424242]).to eq(:c27)
+ expect(enum[0x4242424242424242]).to eq(:c28)
end
it "return nil for values that don't have a symbol" do
@@ -329,9 +391,33 @@ describe "All enums" do
expect(enum[0x42424243]).to be_nil
expect(enum[0x4242424242424241]).to be_nil
expect(enum[0x4242424242424243]).to be_nil
+
+ enum = TestEnum4.enum_type(:enum_type4)
+ expect(enum[0x0]).to be_nil
+ expect(enum[0x41]).to be_nil
+ expect(enum[0x46]).to be_nil
+
+ enum = TestEnum4.enum_type(:enum_type5)
+ expect(enum[0x0]).to be_nil
+ expect(enum[0x41]).to be_nil
+ expect(enum[0x44]).to be_nil
+ expect(enum[0x4241]).to be_nil
+ expect(enum[0x4244]).to be_nil
+
+ enum = TestEnum4.enum_type(:enum_type6)
+ expect(enum[0x0]).to be_nil
+ expect(enum[0x41]).to be_nil
+ expect(enum[0x43]).to be_nil
+ expect(enum[0x4241]).to be_nil
+ expect(enum[0x4243]).to be_nil
+ expect(enum[0x42424241]).to be_nil
+ expect(enum[0x42424243]).to be_nil
+ expect(enum[0x4242424242424241]).to be_nil
+ expect(enum[0x4242424242424243]).to be_nil
end
it "duplicate enum keys rejected" do
expect { enum [ :a, 0xfee1dead, :b, 0xdeadbeef, :a, 0 ] }.to raise_error
+ expect { enum FFI::Type::UINT64, [ :a, 0xfee1dead, :b, 0xdeadbeef, :a, 0 ] }.to raise_error
end
end