gir_ffi 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +6 -0
- data/lib/ffi-glib.rb +1 -0
- data/lib/ffi-glib/array.rb +49 -10
- data/lib/ffi-glib/hash_table.rb +19 -5
- data/lib/ffi-glib/list.rb +4 -1
- data/lib/ffi-glib/list_methods.rb +8 -1
- data/lib/ffi-glib/s_list.rb +4 -1
- data/lib/ffi-glib/strv.rb +31 -0
- data/lib/ffi-gobject.rb +2 -35
- data/lib/ffi-gobject/base.rb +38 -0
- data/lib/ffi-gobject/object.rb +28 -30
- data/lib/ffi-gobject/value.rb +72 -56
- data/lib/ffi-gobject_introspection/i_struct_info.rb +11 -1
- data/lib/ffi-gobject_introspection/lib.rb +3 -1
- data/lib/gir_ffi/arg_helper.rb +2 -19
- data/lib/gir_ffi/builder/argument.rb +239 -305
- data/lib/gir_ffi/builder/argument/base.rb +12 -9
- data/lib/gir_ffi/builder/argument/in_base.rb +2 -6
- data/lib/gir_ffi/builder/argument/in_out_base.rb +2 -5
- data/lib/gir_ffi/builder/argument/out_base.rb +0 -11
- data/lib/gir_ffi/builder/field.rb +55 -0
- data/lib/gir_ffi/builder/function.rb +7 -7
- data/lib/gir_ffi/builder/module.rb +5 -7
- data/lib/gir_ffi/builder/type/object.rb +0 -33
- data/lib/gir_ffi/builder/type/registered_type.rb +0 -16
- data/lib/gir_ffi/builder/type/struct_based.rb +3 -3
- data/lib/gir_ffi/builder/type/unintrospectable.rb +1 -1
- data/lib/gir_ffi/builder/type/with_layout.rb +26 -58
- data/lib/gir_ffi/builder/type/with_methods.rb +9 -11
- data/lib/gir_ffi/class_base.rb +24 -6
- data/lib/gir_ffi/ffi_ext/pointer.rb +15 -0
- data/lib/gir_ffi/in_pointer.rb +10 -5
- data/lib/gir_ffi/info_ext/i_field_info.rb +15 -0
- data/lib/gir_ffi/info_ext/i_type_info.rb +26 -0
- data/lib/gir_ffi/method_stubber.rb +18 -0
- data/lib/gir_ffi/type_map.rb +1 -0
- data/lib/gir_ffi/variable_name_generator.rb +2 -0
- data/lib/gir_ffi/version.rb +1 -1
- data/test/builder_test.rb +6 -5
- data/test/ffi-glib/array_test.rb +40 -5
- data/test/ffi-glib/hash_table_test.rb +27 -3
- data/test/ffi-glib/list_test.rb +23 -0
- data/test/ffi-glib/strv_test.rb +41 -0
- data/test/ffi-gobject/gobject_test.rb +26 -22
- data/test/ffi-gobject/value_test.rb +26 -1
- data/test/ffi-gobject_introspection/lib_test.rb +10 -0
- data/test/gir_ffi_test_helper.rb +1 -1
- data/test/integration/derived_classes_test.rb +31 -0
- data/test/integration/generated_gimarshallingtests_test.rb +29 -15
- data/test/integration/generated_gio_test.rb +5 -6
- data/test/integration/generated_regress_test.rb +11 -7
- data/test/integration/method_lookup_test.rb +32 -0
- data/test/interface_type_builder_test.rb +1 -1
- data/test/test_helper.rb +38 -0
- data/test/unit/argument_builder_test.rb +16 -4
- data/test/unit/class_base_test.rb +48 -0
- data/test/unit/function_builder_test.rb +144 -4
- data/test/unit/hash_table_element_type_provider_test.rb +16 -0
- data/test/unit/i_field_info_test.rb +39 -0
- data/test/unit/i_type_info_test.rb +23 -0
- data/test/unit/list_element_type_provider_test.rb +13 -0
- data/test/unit/module_builder_test.rb +1 -1
- data/test/unit/object_type_builder_test.rb +0 -17
- data/test/unit/struct_builder_test.rb +27 -39
- metadata +118 -60
- data/lib/gir_ffi/builder/argument/hash_table_base.rb +0 -20
- data/lib/gir_ffi/builder/argument/list_base.rb +0 -16
- data/test/class_base_test.rb +0 -10
- data/test/function_definition_builder_test.rb +0 -130
@@ -0,0 +1,48 @@
|
|
1
|
+
require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe GirFFI::ClassBase do
|
4
|
+
describe "a simple descendant" do
|
5
|
+
before do
|
6
|
+
@klass = Class.new GirFFI::ClassBase
|
7
|
+
end
|
8
|
+
|
9
|
+
it "has #from as a pass-through method" do
|
10
|
+
result = @klass.from :foo
|
11
|
+
result.must_equal :foo
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "a descendant with multiple builders" do
|
16
|
+
it "looks up class methods in all builders" do
|
17
|
+
mock(builder = Object.new).setup_method("foo") { true }
|
18
|
+
klass = Class.new GirFFI::ClassBase
|
19
|
+
klass.const_set :GIR_FFI_BUILDER, builder
|
20
|
+
|
21
|
+
mock(sub_builder = Object.new).setup_method("foo") { false }
|
22
|
+
sub_klass = Class.new klass do
|
23
|
+
def self.foo; end
|
24
|
+
end
|
25
|
+
sub_klass.const_set :GIR_FFI_BUILDER, sub_builder
|
26
|
+
|
27
|
+
sub_klass.setup_and_call :foo
|
28
|
+
end
|
29
|
+
|
30
|
+
it "looks up class methods in all builders" do
|
31
|
+
mock(builder = Object.new).setup_instance_method("foo") { true }
|
32
|
+
klass = Class.new GirFFI::ClassBase
|
33
|
+
klass.const_set :GIR_FFI_BUILDER, builder
|
34
|
+
|
35
|
+
mock(sub_builder = Object.new).setup_instance_method("foo") { false }
|
36
|
+
sub_klass = Class.new klass do
|
37
|
+
def foo; end
|
38
|
+
def initialize; end
|
39
|
+
def self.new; self._real_new; end
|
40
|
+
end
|
41
|
+
sub_klass.const_set :GIR_FFI_BUILDER, sub_builder
|
42
|
+
|
43
|
+
obj = sub_klass.new
|
44
|
+
|
45
|
+
obj.setup_and_call :foo
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -13,13 +13,13 @@ describe GirFFI::Builder::Function do
|
|
13
13
|
|
14
14
|
it "builds a correct definition of Regress:test_array_fixed_out_objects" do
|
15
15
|
go = get_introspection_data 'Regress', 'test_array_fixed_out_objects'
|
16
|
-
fbuilder = GirFFI::Builder::Function.new go,
|
16
|
+
fbuilder = GirFFI::Builder::Function.new go, DummyLib
|
17
17
|
code = fbuilder.generate
|
18
18
|
|
19
19
|
expected = <<-CODE
|
20
|
-
def test_array_fixed_out_objects
|
20
|
+
def self.test_array_fixed_out_objects
|
21
21
|
_v1 = GirFFI::InOutPointer.for_array [:pointer, ::Regress::TestObj]
|
22
|
-
|
22
|
+
DummyLib.regress_test_array_fixed_out_objects _v1
|
23
23
|
_v2 = _v1.to_sized_array_value 2
|
24
24
|
return _v2
|
25
25
|
end
|
@@ -28,8 +28,148 @@ describe GirFFI::Builder::Function do
|
|
28
28
|
assert_equal expected.reset_indentation, code
|
29
29
|
end
|
30
30
|
|
31
|
-
|
31
|
+
it "builds a correct definition for functions having a linked length argument" do
|
32
|
+
go = get_introspection_data 'Regress', 'test_array_gint16_in'
|
33
|
+
fbuilder = GirFFI::Builder::Function.new go, DummyLib
|
34
|
+
code = fbuilder.generate
|
35
|
+
|
36
|
+
expected = <<-CODE
|
37
|
+
def self.test_array_gint16_in ints
|
38
|
+
n_ints = ints.nil? ? 0 : ints.length
|
39
|
+
_v1 = n_ints
|
40
|
+
_v2 = GirFFI::InPointer.from_array :gint16, ints
|
41
|
+
_v3 = DummyLib.regress_test_array_gint16_in _v1, _v2
|
42
|
+
return _v3
|
43
|
+
end
|
44
|
+
CODE
|
45
|
+
|
46
|
+
assert_equal expected.reset_indentation, code
|
47
|
+
end
|
32
48
|
|
49
|
+
it "builds a correct definition for functions with callbacks" do
|
50
|
+
go = get_introspection_data 'Regress', 'test_callback_destroy_notify'
|
51
|
+
fbuilder = GirFFI::Builder::Function.new go, DummyLib
|
52
|
+
code = fbuilder.generate
|
53
|
+
|
54
|
+
expected = <<-CODE
|
55
|
+
def self.test_callback_destroy_notify callback, user_data, notify
|
56
|
+
_v1 = GirFFI::CallbackHelper.wrap_in_callback_args_mapper \"Regress\", \"TestCallbackUserData\", callback
|
57
|
+
DummyLib::CALLBACKS << _v1
|
58
|
+
_v2 = GirFFI::ArgHelper.object_to_inptr user_data
|
59
|
+
_v3 = GirFFI::CallbackHelper.wrap_in_callback_args_mapper \"GLib\", \"DestroyNotify\", notify
|
60
|
+
DummyLib::CALLBACKS << _v3
|
61
|
+
_v4 = DummyLib.regress_test_callback_destroy_notify _v1, _v2, _v3
|
62
|
+
return _v4
|
63
|
+
end
|
64
|
+
CODE
|
33
65
|
|
66
|
+
assert_equal expected.reset_indentation, code
|
67
|
+
end
|
68
|
+
|
69
|
+
it "builds correct definition for constructors" do
|
70
|
+
go = get_method_introspection_data 'Regress', 'TestObj', 'new_from_file'
|
71
|
+
fbuilder = GirFFI::Builder::Function.new go, DummyLib
|
72
|
+
code = fbuilder.generate
|
34
73
|
|
74
|
+
expected = <<-CODE
|
75
|
+
def self.new_from_file x
|
76
|
+
_v1 = GirFFI::InPointer.from :utf8, x
|
77
|
+
_v2 = FFI::MemoryPointer.new(:pointer).write_pointer nil
|
78
|
+
_v3 = DummyLib.regress_test_obj_new_from_file _v1, _v2
|
79
|
+
GirFFI::ArgHelper.check_error(_v2)
|
80
|
+
_v4 = self.constructor_wrap(_v3)
|
81
|
+
return _v4
|
82
|
+
end
|
83
|
+
CODE
|
84
|
+
|
85
|
+
assert_equal expected.reset_indentation, code
|
86
|
+
end
|
87
|
+
|
88
|
+
it "creates a call to GObject::Value#from for functions that take a GValue" do
|
89
|
+
go = get_introspection_data 'GIMarshallingTests', 'gvalue_in'
|
90
|
+
fbuilder = GirFFI::Builder::Function.new go, DummyLib
|
91
|
+
code = fbuilder.generate
|
92
|
+
|
93
|
+
expected = <<-CODE
|
94
|
+
def self.gvalue_in value
|
95
|
+
_v1 = ::GObject::Value.from value
|
96
|
+
DummyLib.gi_marshalling_tests_gvalue_in _v1
|
97
|
+
|
98
|
+
end
|
99
|
+
CODE
|
100
|
+
|
101
|
+
assert_equal expected.reset_indentation, code
|
102
|
+
end
|
103
|
+
|
104
|
+
it "builds correct definition for functions with a nullable input array" do
|
105
|
+
go = get_introspection_data 'Regress', 'test_array_int_null_in'
|
106
|
+
fbuilder = GirFFI::Builder::Function.new go, DummyLib
|
107
|
+
code = fbuilder.generate
|
35
108
|
|
109
|
+
expected = <<-CODE
|
110
|
+
def self.test_array_int_null_in arr
|
111
|
+
_v1 = GirFFI::InPointer.from_array :gint32, arr
|
112
|
+
len = arr.nil? ? 0 : arr.length
|
113
|
+
_v2 = len
|
114
|
+
DummyLib.regress_test_array_int_null_in _v1, _v2
|
115
|
+
|
116
|
+
end
|
117
|
+
CODE
|
118
|
+
|
119
|
+
assert_equal expected.reset_indentation, code
|
120
|
+
end
|
121
|
+
|
122
|
+
it "builds correct definition for functions with a nullable output array" do
|
123
|
+
go = get_introspection_data 'Regress', 'test_array_int_null_out'
|
124
|
+
fbuilder = GirFFI::Builder::Function.new go, DummyLib
|
125
|
+
code = fbuilder.generate
|
126
|
+
|
127
|
+
expected = <<-CODE
|
128
|
+
def self.test_array_int_null_out
|
129
|
+
_v1 = GirFFI::InOutPointer.for_array :gint32
|
130
|
+
_v2 = GirFFI::InOutPointer.for :gint32
|
131
|
+
DummyLib.regress_test_array_int_null_out _v1, _v2
|
132
|
+
_v3 = _v2.to_value
|
133
|
+
_v4 = _v1.to_sized_array_value _v3
|
134
|
+
return _v4
|
135
|
+
end
|
136
|
+
CODE
|
137
|
+
|
138
|
+
assert_equal expected.reset_indentation, code
|
139
|
+
end
|
140
|
+
|
141
|
+
it "builds the correct definition for a method with an inout array with size argument" do
|
142
|
+
go = get_method_introspection_data 'GIMarshallingTests', 'Object', 'method_array_inout'
|
143
|
+
fbuilder = GirFFI::Builder::Function.new go, DummyLib
|
144
|
+
code = fbuilder.generate
|
145
|
+
|
146
|
+
expected = <<-CODE
|
147
|
+
def method_array_inout ints
|
148
|
+
_v1 = GirFFI::InOutPointer.from_array :gint32, ints
|
149
|
+
length = ints.length
|
150
|
+
_v2 = GirFFI::InOutPointer.from :gint32, length
|
151
|
+
DummyLib.gi_marshalling_tests_object_method_array_inout self, _v1, _v2
|
152
|
+
_v3 = _v2.to_value
|
153
|
+
_v4 = _v1.to_sized_array_value _v3
|
154
|
+
return _v4
|
155
|
+
end
|
156
|
+
CODE
|
157
|
+
|
158
|
+
assert_equal expected.reset_indentation, code
|
159
|
+
end
|
160
|
+
|
161
|
+
it "builds a correct definition for a simple method" do
|
162
|
+
go = get_method_introspection_data 'Gtk', 'Widget', 'show'
|
163
|
+
fbuilder = GirFFI::Builder::Function.new go, DummyLib
|
164
|
+
code = fbuilder.generate
|
165
|
+
|
166
|
+
expected = <<-CODE
|
167
|
+
def show
|
168
|
+
DummyLib.gtk_widget_show self
|
169
|
+
|
170
|
+
end
|
171
|
+
CODE
|
172
|
+
|
173
|
+
assert_equal expected.reset_indentation, code
|
174
|
+
end
|
175
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe GirFFI::Builder::HashTableElementTypeProvider do
|
4
|
+
describe "#elm_t" do
|
5
|
+
it "returns a string with an array of the first two subtype tags" do
|
6
|
+
builder = Object.new
|
7
|
+
builder.extend GirFFI::Builder::HashTableElementTypeProvider
|
8
|
+
|
9
|
+
stub(builder).subtype_tag(0) { :foo }
|
10
|
+
stub(builder).subtype_tag(1) { :bar }
|
11
|
+
|
12
|
+
assert_equal "[:foo, :bar]", builder.elm_t
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe GirFFI::InfoExt::IFieldInfo do
|
4
|
+
describe "#layout_specification" do
|
5
|
+
it "returns an array of name, typespec and offset" do
|
6
|
+
testclass = Class.new do
|
7
|
+
include GirFFI::InfoExt::IFieldInfo
|
8
|
+
end
|
9
|
+
|
10
|
+
mock(type = Object.new).layout_specification_type { :bar }
|
11
|
+
|
12
|
+
field = testclass.new
|
13
|
+
mock(field).name { "foo" }
|
14
|
+
mock(field).field_type { type }
|
15
|
+
mock(field).offset { 0 }
|
16
|
+
|
17
|
+
result = field.layout_specification
|
18
|
+
|
19
|
+
assert_equal [:foo, :bar, 0], result
|
20
|
+
end
|
21
|
+
|
22
|
+
it "keeps a complex typespec intact" do
|
23
|
+
testclass = Class.new do
|
24
|
+
include GirFFI::InfoExt::IFieldInfo
|
25
|
+
end
|
26
|
+
|
27
|
+
mock(type = Object.new).layout_specification_type { [:bar, 2] }
|
28
|
+
|
29
|
+
field = testclass.new
|
30
|
+
mock(field).name { "foo" }
|
31
|
+
mock(field).field_type { type }
|
32
|
+
mock(field).offset { 0 }
|
33
|
+
|
34
|
+
result = field.layout_specification
|
35
|
+
|
36
|
+
assert_equal [:foo, [:bar, 2], 0], result
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe GirFFI::InfoExt::ITypeInfo do
|
4
|
+
describe "#layout_specification_type" do
|
5
|
+
it "returns an array with elements subtype and size for type :array" do
|
6
|
+
testclass = Class.new do
|
7
|
+
include GirFFI::InfoExt::ITypeInfo
|
8
|
+
end
|
9
|
+
|
10
|
+
mock(subtype = Object.new).layout_specification_type { :foo }
|
11
|
+
|
12
|
+
type = testclass.new
|
13
|
+
mock(type).array_fixed_size { 2 }
|
14
|
+
mock(type).param_type(0) { subtype }
|
15
|
+
|
16
|
+
mock(GirFFI::Builder).itypeinfo_to_ffitype(type) { :array }
|
17
|
+
|
18
|
+
result = type.layout_specification_type
|
19
|
+
|
20
|
+
assert_equal [:foo, 2], result
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe GirFFI::Builder::ListElementTypeProvider do
|
4
|
+
describe "#elm_t" do
|
5
|
+
it "returns a string with just the first subtype tag" do
|
6
|
+
builder = Object.new
|
7
|
+
builder.extend GirFFI::Builder::ListElementTypeProvider
|
8
|
+
mock(builder).subtype_tag { :foo }
|
9
|
+
|
10
|
+
assert_equal ":foo", builder.elm_t
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -54,7 +54,7 @@ describe GirFFI::Builder::Module do
|
|
54
54
|
describe "for a :function argument" do
|
55
55
|
it "creates a GirFFI::Builder::Function object" do
|
56
56
|
builder = GirFFI::Builder::Module.new "Foo"
|
57
|
-
mock(builder).libmodule {
|
57
|
+
mock(builder).libmodule { DummyLib }
|
58
58
|
|
59
59
|
stub(info = Object.new).info_type { :function }
|
60
60
|
|
@@ -1,23 +1,6 @@
|
|
1
1
|
require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
|
2
2
|
|
3
3
|
describe GirFFI::Builder::Type::Object do
|
4
|
-
before do
|
5
|
-
GirFFI.setup :Regress
|
6
|
-
end
|
7
|
-
|
8
|
-
describe "#setup_method" do
|
9
|
-
it "sets up singleton methods defined in a class's parent" do
|
10
|
-
info = get_introspection_data 'Regress', 'TestSubObj'
|
11
|
-
assert_nil info.find_method "static_method"
|
12
|
-
parent = info.parent
|
13
|
-
assert_not_nil parent.find_method "static_method"
|
14
|
-
|
15
|
-
b = GirFFI::Builder::Type::Object.new(info)
|
16
|
-
b.setup_method "static_method"
|
17
|
-
pass
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
4
|
describe "#find_property" do
|
22
5
|
it "finds a property specified on the class itself" do
|
23
6
|
builder = GirFFI::Builder::Type::Object.new(
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
|
2
2
|
|
3
|
+
# FIXME: Test WithLayout directly, rather than through Struct.
|
3
4
|
describe GirFFI::Builder::Type::Struct do
|
4
5
|
describe "#pretty_print" do
|
5
6
|
describe "for a struct with no methods" do
|
@@ -16,7 +17,7 @@ describe GirFFI::Builder::Type::Struct do
|
|
16
17
|
|
17
18
|
describe "for a struct with a method" do
|
18
19
|
it "returns a class block with the pretty printed method inside" do
|
19
|
-
# FIXME: Loads of mocks.
|
20
|
+
# FIXME: Loads of mocks.
|
20
21
|
|
21
22
|
# Function info and its builder
|
22
23
|
stub(func_info = Object.new).info_type { :function }
|
@@ -42,28 +43,34 @@ describe GirFFI::Builder::Type::Struct do
|
|
42
43
|
|
43
44
|
describe "for a struct with a simple layout" do
|
44
45
|
before do
|
45
|
-
|
46
|
-
stub(@type).tag { :gint32 }
|
46
|
+
@field = Object.new
|
47
47
|
|
48
|
-
|
49
|
-
stub(
|
50
|
-
stub(field).offset { 0 }
|
51
|
-
stub(field).writable? { true }
|
52
|
-
|
53
|
-
stub(@struct = Object.new).safe_name { 'Bar' }
|
48
|
+
@struct = Object.new
|
49
|
+
stub(@struct).safe_name { 'Bar' }
|
54
50
|
stub(@struct).namespace { 'Foo' }
|
55
|
-
stub(@struct).fields { [ field ] }
|
56
|
-
stub(@struct).find_method { }
|
51
|
+
stub(@struct).fields { [ @field ] }
|
57
52
|
|
58
53
|
@builder = GirFFI::Builder::Type::Struct.new @struct
|
59
54
|
end
|
60
55
|
|
61
56
|
it "creates the correct layout specification" do
|
57
|
+
mock(@field).layout_specification { [:bar, :int32, 0] }
|
62
58
|
spec = @builder.send :layout_specification
|
63
59
|
assert_equal [:bar, :int32, 0], spec
|
64
60
|
end
|
65
61
|
|
66
62
|
it "creates getter and setter methods" do
|
63
|
+
# FIXME: Loads of stubs.
|
64
|
+
|
65
|
+
stub(type = Object.new).pointer? { false }
|
66
|
+
stub(type).tag { :gint32 }
|
67
|
+
|
68
|
+
stub(@field).field_type { type }
|
69
|
+
stub(@field).name { "bar" }
|
70
|
+
stub(@field).writable? { true }
|
71
|
+
|
72
|
+
stub(@struct).find_method { }
|
73
|
+
|
67
74
|
m = Module.new { module Lib; end }
|
68
75
|
stub(GirFFI::Builder).build_module('Foo') { m }
|
69
76
|
|
@@ -80,35 +87,18 @@ describe GirFFI::Builder::Type::Struct do
|
|
80
87
|
end
|
81
88
|
end
|
82
89
|
|
83
|
-
describe "for a struct with a layout with a
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
stub(@type = Object.new).pointer? { false }
|
89
|
-
stub(@type).tag { :array }
|
90
|
-
stub(@type).array_fixed_size { 2 }
|
91
|
-
stub(@type).param_type { subtype }
|
90
|
+
describe "for a struct with a layout with a complex type" do
|
91
|
+
it "does not flatten the complex type specification" do
|
92
|
+
mock(simplefield = Object.new).layout_specification { [:bar, :foo, 0] }
|
93
|
+
mock(complexfield = Object.new).layout_specification { [:baz, [:qux, 2], 0] }
|
94
|
+
mock(struct = Object.new).fields { [ simplefield, complexfield ] }
|
92
95
|
|
93
|
-
stub(
|
94
|
-
stub(
|
95
|
-
stub(field).offset { 0 }
|
96
|
+
stub(struct).safe_name { 'Bar' }
|
97
|
+
stub(struct).namespace { 'Foo' }
|
96
98
|
|
97
|
-
|
98
|
-
stub(@struct).namespace { 'Foo' }
|
99
|
-
stub(@struct).fields { [ field ] }
|
100
|
-
end
|
101
|
-
|
102
|
-
it "creates the correct ffi type for the array" do
|
103
|
-
builder = GirFFI::Builder::Type::Struct.new @struct
|
104
|
-
spec = builder.send :itypeinfo_to_ffitype_for_struct, @type
|
105
|
-
assert_equal [:foo, 2], spec
|
106
|
-
end
|
107
|
-
|
108
|
-
it "creates the correct layout specification" do
|
109
|
-
builder = GirFFI::Builder::Type::Struct.new @struct
|
99
|
+
builder = GirFFI::Builder::Type::Struct.new struct
|
110
100
|
spec = builder.send :layout_specification
|
111
|
-
assert_equal [:bar,
|
101
|
+
assert_equal [:bar, :foo, 0, :baz, [:qux, 2], 0], spec
|
112
102
|
end
|
113
103
|
end
|
114
104
|
|
@@ -130,5 +120,3 @@ describe GirFFI::Builder::Type::Struct do
|
|
130
120
|
end
|
131
121
|
end
|
132
122
|
end
|
133
|
-
|
134
|
-
|