summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortduehr <tduehr@gmail.com>2014-01-16 11:10:52 -0600
committertduehr <tduehr@gmail.com>2014-10-13 14:55:09 -0500
commitad67131668f0f844f7dbc5a3b30621120b03a905 (patch)
treeff0a9625b3ec86842fc99f1f8fa07e86c937d969
parent8d96198e94649a3fe9bbc32827bb66755a1f92dd (diff)
downloadffi-ad67131668f0f844f7dbc5a3b30621120b03a905.tar.gz
Add specs for non int enum arguments
not all pass currently
-rw-r--r--libtest/EnumTest.c17
-rw-r--r--spec/ffi/enum_spec.rb110
2 files changed, 127 insertions, 0 deletions
diff --git a/libtest/EnumTest.c b/libtest/EnumTest.c
index 4c9dda9..4bf8d23 100644
--- a/libtest/EnumTest.c
+++ b/libtest/EnumTest.c
@@ -3,6 +3,7 @@
*
* For licensing, see LICENSE.SPECS
*/
+#include <stdint.h>
int test_untagged_enum(int val) {
return val;
@@ -12,6 +13,22 @@ int test_untagged_typedef_enum(int val) {
return val;
}
+uint8_t test_untagged_nonint_enum(uint8_t val) {
+ return val;
+}
+
+uint16_t test_tagged_nonint_enum1(uint16_t val) {
+ return val;
+}
+
+uint32_t test_tagged_nonint_enum2(uint32_t val) {
+ return val;
+}
+
+uint64_t test_tagged_nonint_enum3(uint64_t val) {
+ return val;
+}
+
typedef enum {c1, c2, c3, c4} enum_type1;
enum_type1 test_tagged_typedef_enum1(enum_type1 val) {
return val;
diff --git a/spec/ffi/enum_spec.rb b/spec/ffi/enum_spec.rb
index b65b1fb..1ca1bad 100644
--- a/spec/ffi/enum_spec.rb
+++ b/spec/ffi/enum_spec.rb
@@ -36,6 +36,21 @@ module TestEnum3
attach_function :test_tagged_typedef_enum4, [:enum_type4], :enum_type4
end
+module TestEnum4
+ extend FFI::Library
+ ffi_lib TestLibrary::PATH
+
+ enum [:c1, :c2, :c3, :c4]
+ 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
+end
+
describe "A library with no enum defined" do
it "returns nil when asked for an enum" do
expect(TestEnum0.enum_type(:foo)).to be_nil
@@ -60,6 +75,10 @@ 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)
end
end
@@ -69,6 +88,9 @@ describe "A tagged typedef enum" do
expect(TestEnum3.enum_type(:enum_type2)).not_to be_nil
expect(TestEnum3.enum_type(:enum_type3)).not_to be_nil
expect(TestEnum3.enum_type(:enum_type4)).not_to be_nil
+ 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
end
it "contains enum constants" do
@@ -76,6 +98,9 @@ describe "A tagged typedef enum" do
expect(TestEnum3.enum_type(:enum_type2).symbols.length).to eq(4)
expect(TestEnum3.enum_type(:enum_type3).symbols.length).to eq(4)
expect(TestEnum3.enum_type(:enum_type4).symbols.length).to eq(4)
+ 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)
end
it "constants can be used as function parameters and return value" do
@@ -95,6 +120,18 @@ 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
end
it "integers can be used instead of constants" do
@@ -114,6 +151,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
end
end
@@ -128,6 +177,11 @@ describe "All enums" do
expect(TestEnum3.enum_value(:c2)).to eq(1)
expect(TestEnum3.enum_value(:c3)).to eq(2)
expect(TestEnum3.enum_value(:c4)).to eq(3)
+
+ expect(TestEnum4.enum_value(:c1)).to eq(0)
+ expect(TestEnum4.enum_value(:c2)).to eq(1)
+ expect(TestEnum4.enum_value(:c3)).to eq(2)
+ expect(TestEnum4.enum_value(:c4)).to eq(3)
end
it "can have an explicit first constant and autonumbered subsequent constants" do
@@ -140,6 +194,11 @@ describe "All enums" do
expect(TestEnum3.enum_value(:c6)).to eq(43)
expect(TestEnum3.enum_value(:c7)).to eq(44)
expect(TestEnum3.enum_value(:c8)).to eq(45)
+
+ expect(TestEnum4.enum_value(:c5)).to eq(0x42)
+ expect(TestEnum4.enum_value(:c6)).to eq(0x43)
+ expect(TestEnum4.enum_value(:c7)).to eq(0x44)
+ expect(TestEnum4.enum_value(:c8)).to eq(0x45)
end
it "can have a mix of explicit and autonumbered constants" do
@@ -152,6 +211,11 @@ describe "All enums" do
expect(TestEnum3.enum_value(:c10)).to eq(43)
expect(TestEnum3.enum_value(:c11)).to eq(4242)
expect(TestEnum3.enum_value(:c12)).to eq(4243)
+
+ expect(TestEnum4.enum_value(:c9)).to eq(0x42)
+ expect(TestEnum4.enum_value(:c10)).to eq(0x43)
+ expect(TestEnum4.enum_value(:c11)).to eq(0x4242)
+ expect(TestEnum4.enum_value(:c12)).to eq(0x4243)
end
it "can have all its constants explicitely valued" do
@@ -164,6 +228,11 @@ describe "All enums" do
expect(TestEnum3.enum_value(:c14)).to eq(4242)
expect(TestEnum3.enum_value(:c15)).to eq(424242)
expect(TestEnum3.enum_value(:c16)).to eq(42424242)
+
+ expect(TestEnum4.enum_value(:c13)).to eq(0x42)
+ expect(TestEnum4.enum_value(:c14)).to eq(0x4242)
+ expect(TestEnum4.enum_value(:c15)).to eq(0x42424242)
+ expect(TestEnum4.enum_value(:c16)).to eq(0x4242424242424242)
end
it "return the constant corresponding to a specific value" do
@@ -190,6 +259,24 @@ describe "All enums" do
expect(enum[4242]).to be :c14
expect(enum[424242]).to be :c15
expect(enum[42424242]).to be :c16
+
+ enum = TestEnum4.enum_type(:enum_type1)
+ expect(enum[0x42]).to eq(:c5)
+ expect(enum[0x43]).to eq(:c6)
+ expect(enum[0x44]).to eq(:c7)
+ expect(enum[0x45]).to eq(:c8)
+
+ enum = TestEnum4.enum_type(:enum_type2)
+ expect(enum[0x42]).to eq(:c9)
+ expect(enum[0x43]).to eq(:c10)
+ expect(enum[0x4242]).to eq(:c11)
+ expect(enum[0x4243]).to eq(:c12)
+
+ enum = TestEnum4.enum_type(:enum_type3)
+ expect(enum[0x42]).to eq(:c13)
+ expect(enum[0x4242]).to eq(:c14)
+ expect(enum[0x42424242]).to eq(:c15)
+ expect(enum[0x4242424242424242]).to eq(:c16)
end
it "return nil for values that don't have a symbol" do
@@ -219,6 +306,29 @@ describe "All enums" do
expect(enum[424243]).to be_nil
expect(enum[42424241]).to be_nil
expect(enum[42424243]).to be_nil
+
+ enum = TestEnum4.enum_type(:enum_type1)
+ expect(enum[0x0]).to be_nil
+ expect(enum[0x41]).to be_nil
+ expect(enum[0x46]).to be_nil
+
+ enum = TestEnum4.enum_type(:enum_type2)
+ 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_type3)
+ 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