gir_ffi 0.10.2 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Changelog.md +13 -0
- data/Gemfile +9 -4
- data/README.md +3 -2
- data/Rakefile +2 -1
- data/lib/ffi-glib/byte_array.rb +1 -1
- data/lib/ffi-glib/main_loop.rb +2 -1
- data/lib/ffi-glib/strv.rb +5 -2
- data/lib/ffi-glib/variant.rb +3 -5
- data/lib/ffi-glib.rb +4 -0
- data/lib/ffi-gobject/closure.rb +8 -10
- data/lib/ffi-gobject/object.rb +9 -6
- data/lib/ffi-gobject/param_spec.rb +4 -0
- data/lib/ffi-gobject/value.rb +13 -16
- data/lib/ffi-gobject_introspection/gobject_type_init.rb +18 -0
- data/lib/ffi-gobject_introspection/i_callable_info.rb +1 -5
- data/lib/ffi-gobject_introspection/i_constant_info.rb +3 -3
- data/lib/ffi-gobject_introspection/i_repository.rb +3 -47
- data/lib/ffi-gobject_introspection/i_vfunc_info.rb +3 -11
- data/lib/ffi-gobject_introspection/lib.rb +8 -31
- data/lib/{gir_ffi-base/glib → ffi-gobject_introspection}/strv.rb +9 -13
- data/lib/ffi-gobject_introspection.rb +47 -2
- data/lib/gir_ffi/allocation_helper.rb +1 -19
- data/lib/gir_ffi/arg_helper.rb +36 -26
- data/lib/{gir_ffi-base/glib → gir_ffi}/boolean.rb +7 -5
- data/lib/gir_ffi/boxed_base.rb +5 -23
- data/lib/gir_ffi/builder.rb +3 -3
- data/lib/gir_ffi/builders/argument_builder.rb +7 -8
- data/lib/gir_ffi/builders/base_argument_builder.rb +0 -1
- data/lib/gir_ffi/builders/callback_argument_builder.rb +2 -2
- data/lib/gir_ffi/builders/callback_return_value_builder.rb +21 -13
- data/lib/gir_ffi/builders/field_builder.rb +4 -10
- data/lib/gir_ffi/builders/module_builder.rb +6 -4
- data/lib/gir_ffi/builders/object_builder.rb +16 -16
- data/lib/gir_ffi/builders/struct_builder.rb +4 -6
- data/lib/gir_ffi/builders/struct_like.rb +1 -1
- data/lib/gir_ffi/builders/user_defined_builder.rb +83 -23
- data/lib/gir_ffi/builders/vfunc_argument_builder.rb +12 -17
- data/lib/gir_ffi/class_base.rb +0 -4
- data/lib/gir_ffi/core.rb +16 -13
- data/lib/gir_ffi/enum_base.rb +2 -41
- data/lib/gir_ffi/enum_like_base.rb +48 -0
- data/lib/gir_ffi/ffi_ext/pointer.rb +1 -1
- data/lib/gir_ffi/flags_base.rb +2 -41
- data/lib/gir_ffi/in_out_pointer.rb +1 -1
- data/lib/gir_ffi/in_pointer.rb +4 -4
- data/lib/gir_ffi/info_ext/i_type_info.rb +14 -5
- data/lib/gir_ffi/info_ext/i_vfunc_info.rb +8 -0
- data/lib/gir_ffi/module_base.rb +4 -0
- data/lib/gir_ffi/receiver_argument_info.rb +1 -1
- data/lib/gir_ffi/sized_array.rb +6 -6
- data/lib/gir_ffi/struct_base.rb +1 -6
- data/lib/gir_ffi/struct_like_base.rb +54 -45
- data/lib/gir_ffi/type_map.rb +6 -7
- data/lib/gir_ffi/union_base.rb +1 -1
- data/lib/gir_ffi/{user_defined_type_info.rb → user_defined_object_info.rb} +1 -2
- data/lib/gir_ffi/user_defined_property_info.rb +80 -2
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi-base/gobject/lib.rb +0 -1
- data/lib/gir_ffi-base/gobject.rb +3 -5
- data/lib/gir_ffi-base.rb +3 -8
- data/tasks/test.rake +17 -3
- data/test/base_test_helper.rb +39 -23
- data/test/ffi-glib/closure_test.rb +37 -0
- data/test/ffi-glib/main_loop_test.rb +24 -0
- data/test/ffi-glib/ruby_closure_test.rb +0 -5
- data/test/ffi-gobject/object_test.rb +6 -10
- data/test/ffi-gobject/param_spec_test.rb +17 -5
- data/test/ffi-gobject/value_test.rb +15 -6
- data/test/ffi-gobject_introspection/gobject_type_init_test.rb +25 -0
- data/test/ffi-gobject_introspection/i_base_info_test.rb +1 -1
- data/test/ffi-gobject_introspection/i_repository_test.rb +18 -0
- data/test/ffi-gobject_introspection/i_vfunc_info_test.rb +40 -0
- data/test/{gir_ffi-base/glib → ffi-gobject_introspection}/strv_test.rb +8 -8
- data/test/gir_ffi/allocation_helper_test.rb +35 -0
- data/test/gir_ffi/arg_helper_test.rb +102 -7
- data/test/gir_ffi/boolean_test.rb +34 -0
- data/test/gir_ffi/boxed_base_test.rb +46 -6
- data/test/gir_ffi/builder_test.rb +88 -29
- data/test/gir_ffi/builders/argument_builder_test.rb +19 -0
- data/test/gir_ffi/builders/callback_argument_builder_test.rb +17 -0
- data/test/gir_ffi/builders/callback_return_value_builder_test.rb +1 -1
- data/test/gir_ffi/builders/field_builder_test.rb +2 -1
- data/test/gir_ffi/builders/struct_builder_test.rb +42 -25
- data/test/gir_ffi/builders/user_defined_builder_test.rb +365 -17
- data/test/gir_ffi/builders/vfunc_argument_builder_test.rb +100 -0
- data/test/gir_ffi/builders/vfunc_builder_test.rb +5 -3
- data/test/{gir_ffi_test.rb → gir_ffi/core_test.rb} +8 -6
- data/test/gir_ffi/in_out_pointer_test.rb +1 -1
- data/test/gir_ffi/receiver_argument_info_test.rb +32 -0
- data/test/gir_ffi/sized_array_test.rb +34 -0
- data/test/gir_ffi/struct_base_test.rb +4 -32
- data/test/gir_ffi/struct_like_base_test.rb +164 -0
- data/test/gir_ffi/union_base_test.rb +4 -20
- data/test/gir_ffi/{user_defined_type_info_test.rb → user_defined_object_info_test.rb} +10 -10
- data/test/gir_ffi/user_defined_property_info_test.rb +22 -5
- data/test/gir_ffi/version_test.rb +1 -1
- data/test/integration/callback_exceptions_test.rb +2 -0
- data/test/integration/derived_classes_test.rb +2 -0
- data/test/integration/generated_everything_test.rb +22 -0
- data/test/integration/generated_gimarshallingtests_test.rb +23 -21
- data/test/integration/generated_gio_test.rb +2 -0
- data/test/integration/generated_glib_test.rb +2 -0
- data/test/integration/generated_gst_test.rb +2 -0
- data/test/integration/generated_gtop_test.rb +2 -0
- data/test/integration/generated_regress_test.rb +113 -29
- data/test/integration/generated_secret_test.rb +2 -0
- data/test/integration/generated_warnlib_test.rb +2 -0
- data/test/integration/method_lookup_test.rb +2 -0
- data/test/introspection_test_helper.rb +15 -0
- metadata +21 -27
- data/lib/gir_ffi-base/glib.rb +0 -8
- data/test/gir_ffi-base/glib/boolean_test.rb +0 -34
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
            require 'gir_ffi_test_helper'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe GirFFI::Boolean do
         | 
| 5 | 
            +
              it 'has the same native size as an int' do
         | 
| 6 | 
            +
                FFI.type_size(GirFFI::Boolean).must_equal FFI.type_size :int
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              describe '.from_native' do
         | 
| 10 | 
            +
                it 'converts 0 to false' do
         | 
| 11 | 
            +
                  GirFFI::Boolean.from_native(0, 'whatever').must_equal false
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                it 'converts 1 to true' do
         | 
| 15 | 
            +
                  GirFFI::Boolean.from_native(1, 'whatever').must_equal true
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              describe '.to_native' do
         | 
| 20 | 
            +
                it 'converts false to 0' do
         | 
| 21 | 
            +
                  GirFFI::Boolean.to_native(false, 'whatever').must_equal 0
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                it 'converts true to 1' do
         | 
| 25 | 
            +
                  GirFFI::Boolean.to_native(true, 'whatever').must_equal 1
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
              describe '.size' do
         | 
| 30 | 
            +
                it 'returns the correct type size' do
         | 
| 31 | 
            +
                  GirFFI::Boolean.size.must_equal FFI.type_size :int
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
| @@ -4,12 +4,12 @@ require 'gir_ffi_test_helper' | |
| 4 4 | 
             
            GirFFI.setup :GIMarshallingTests
         | 
| 5 5 |  | 
| 6 6 | 
             
            describe GirFFI::BoxedBase do
         | 
| 7 | 
            -
              describe ' | 
| 8 | 
            -
                it ' | 
| 9 | 
            -
                   | 
| 10 | 
            -
                   | 
| 11 | 
            -
                   | 
| 12 | 
            -
                   | 
| 7 | 
            +
              describe 'initialize' do
         | 
| 8 | 
            +
                it 'sets up the held struct pointer' do
         | 
| 9 | 
            +
                  # NOTE: GObject::Value uses the generic constructor, unlike
         | 
| 10 | 
            +
                  # GIMarshallingTests::BoxedStruct, which has its own constructor.
         | 
| 11 | 
            +
                  value = GObject::Value.new
         | 
| 12 | 
            +
                  value.to_ptr.wont_be_nil
         | 
| 13 13 | 
             
                end
         | 
| 14 14 | 
             
              end
         | 
| 15 15 |  | 
| @@ -18,7 +18,47 @@ describe GirFFI::BoxedBase do | |
| 18 18 | 
             
                  original = GIMarshallingTests::BoxedStruct.new
         | 
| 19 19 | 
             
                  copy = GIMarshallingTests::BoxedStruct.copy_from(original)
         | 
| 20 20 | 
             
                  copy.to_ptr.wont_equal original.to_ptr
         | 
| 21 | 
            +
                  copy.to_ptr.wont_be :autorelease?
         | 
| 21 22 | 
             
                  copy.struct.wont_be :owned?
         | 
| 22 23 | 
             
                end
         | 
| 23 24 | 
             
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              describe 'wrap_own' do
         | 
| 27 | 
            +
                it 'wraps and owns the supplied pointer' do
         | 
| 28 | 
            +
                  original = GIMarshallingTests::BoxedStruct.new
         | 
| 29 | 
            +
                  copy = GIMarshallingTests::BoxedStruct.wrap_own(original.to_ptr)
         | 
| 30 | 
            +
                  copy.to_ptr.must_equal original.to_ptr
         | 
| 31 | 
            +
                  copy.to_ptr.wont_be :autorelease?
         | 
| 32 | 
            +
                  copy.struct.must_be :owned?
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              describe 'upon garbage collection' do
         | 
| 37 | 
            +
                it 'frees and disowns the underlying struct if it is owned' do
         | 
| 38 | 
            +
                  if jruby? || rubinius?
         | 
| 39 | 
            +
                    skip 'cannot be reliably tested on JRuby and Rubinius'
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  allow(GObject).to receive(:boxed_free)
         | 
| 43 | 
            +
                  gtype = GIMarshallingTests::BoxedStruct.gtype
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                  owned_struct = GIMarshallingTests::BoxedStruct.new.struct
         | 
| 46 | 
            +
                  owned_ptr = owned_struct.to_ptr
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                  unowned_struct = GIMarshallingTests::BoxedStruct.new.struct
         | 
| 49 | 
            +
                  unowned_struct.owned = false
         | 
| 50 | 
            +
                  unowned_ptr = unowned_struct.to_ptr
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  GC.start
         | 
| 53 | 
            +
                  # Creating a new object is sometimes needed to trigger enough garbage collection.
         | 
| 54 | 
            +
                  GIMarshallingTests::BoxedStruct.new
         | 
| 55 | 
            +
                  sleep 1
         | 
| 56 | 
            +
                  GC.start
         | 
| 57 | 
            +
                  GC.start
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                  expect(GObject).to have_received(:boxed_free).with(gtype, owned_ptr)
         | 
| 60 | 
            +
                  expect(GObject).not_to have_received(:boxed_free).with(gtype, unowned_ptr)
         | 
| 61 | 
            +
                  owned_struct.wont_be :owned?
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
              end
         | 
| 24 64 | 
             
            end
         | 
| @@ -2,6 +2,7 @@ | |
| 2 2 | 
             
            require 'gir_ffi_test_helper'
         | 
| 3 3 |  | 
| 4 4 | 
             
            GirFFI.setup :Regress
         | 
| 5 | 
            +
            GirFFI.setup :GIMarshallingTests
         | 
| 5 6 |  | 
| 6 7 | 
             
            describe GirFFI::Builder do
         | 
| 7 8 | 
             
              let(:gir) { GObjectIntrospection::IRepository.default }
         | 
| @@ -14,8 +15,84 @@ describe GirFFI::Builder do | |
| 14 15 | 
             
                end
         | 
| 15 16 | 
             
              end
         | 
| 16 17 |  | 
| 18 | 
            +
              describe '.build_module' do
         | 
| 19 | 
            +
                it 'refuses to build existing modules defined elsewhere' do
         | 
| 20 | 
            +
                  result = -> { GirFFI::Builder.build_module('Array') }.must_raise
         | 
| 21 | 
            +
                  result.message.must_equal 'The module Array was already defined elsewhere'
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                describe 'building a module for the first time' do
         | 
| 25 | 
            +
                  before do
         | 
| 26 | 
            +
                    save_module :Regress
         | 
| 27 | 
            +
                    GirFFI::Builder.build_module 'Regress'
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  it 'creates a Lib module ready to attach functions from the shared library' do
         | 
| 31 | 
            +
                    gir = GObjectIntrospection::IRepository.default
         | 
| 32 | 
            +
                    expected = [gir.shared_library('Regress')]
         | 
| 33 | 
            +
                    assert_equal expected, Regress::Lib.ffi_libraries.map(&:name)
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  after do
         | 
| 37 | 
            +
                    restore_module :Regress
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                describe 'building a module that already exists' do
         | 
| 42 | 
            +
                  it 'does not replace the existing module' do
         | 
| 43 | 
            +
                    oldmodule = Regress
         | 
| 44 | 
            +
                    GirFFI::Builder.build_module 'Regress'
         | 
| 45 | 
            +
                    assert_equal oldmodule, Regress
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                  it 'does not replace the existing Lib module' do
         | 
| 49 | 
            +
                    oldmodule = Regress::Lib
         | 
| 50 | 
            +
                    GirFFI::Builder.build_module 'Regress'
         | 
| 51 | 
            +
                    assert_equal oldmodule, Regress::Lib
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                it 'passes the version on to ModuleBuilder' do
         | 
| 56 | 
            +
                  builder = double(generate: nil)
         | 
| 57 | 
            +
                  expect(GirFFI::Builders::ModuleBuilder).to receive(:new).
         | 
| 58 | 
            +
                    with('Foo', namespace: 'Foo', version: '1.0').
         | 
| 59 | 
            +
                    and_return builder
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                  GirFFI::Builder.build_module 'Foo', '1.0'
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
              describe '.build_by_gtype' do
         | 
| 66 | 
            +
                it 'returns the class types known to the GIR' do
         | 
| 67 | 
            +
                  result = GirFFI::Builder.build_by_gtype GObject::Object.gtype
         | 
| 68 | 
            +
                  result.must_equal GObject::Object
         | 
| 69 | 
            +
                end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                it 'returns the class for user-defined types' do
         | 
| 72 | 
            +
                  klass = Class.new GIMarshallingTests::OverridesObject
         | 
| 73 | 
            +
                  Object.const_set "Derived#{Sequence.next}", klass
         | 
| 74 | 
            +
                  gtype = GirFFI.define_type klass
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                  found_klass = GirFFI::Builder.build_by_gtype gtype
         | 
| 77 | 
            +
                  found_klass.must_equal klass
         | 
| 78 | 
            +
                end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                it 'returns a valid class for boxed classes unknown to GIR' do
         | 
| 81 | 
            +
                  object_class = GIMarshallingTests::PropertiesObject.object_class
         | 
| 82 | 
            +
                  property = object_class.find_property 'some-boxed-glist'
         | 
| 83 | 
            +
                  gtype = property.value_type
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                  gtype.wont_equal GObject::TYPE_NONE
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                  found_klass = GirFFI::Builder.build_by_gtype gtype
         | 
| 88 | 
            +
                  found_klass.name.must_be_nil
         | 
| 89 | 
            +
                  found_klass.ancestors.must_include GirFFI::BoxedBase
         | 
| 90 | 
            +
                end
         | 
| 91 | 
            +
              end
         | 
| 92 | 
            +
             | 
| 17 93 | 
             
              describe '.attach_ffi_function' do
         | 
| 18 94 | 
             
                let(:lib) { Module.new }
         | 
| 95 | 
            +
             | 
| 19 96 | 
             
                it 'calls attach_function with the correct types for Regress.test_callback_destroy_notify' do
         | 
| 20 97 | 
             
                  function_info = get_introspection_data 'Regress', 'test_callback_destroy_notify'
         | 
| 21 98 |  | 
| @@ -57,8 +134,19 @@ describe GirFFI::Builder do | |
| 57 134 | 
             
                    and_return true
         | 
| 58 135 | 
             
                  GirFFI::Builder.attach_ffi_function(lib, info)
         | 
| 59 136 | 
             
                end
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                it 'does not attach the function if it is already defined' do
         | 
| 139 | 
            +
                  info = get_introspection_data 'Regress', 'test_array_gint32_in'
         | 
| 140 | 
            +
                  allow(lib).to receive(:method_defined?).and_return true
         | 
| 141 | 
            +
                  expect(lib).not_to receive(:attach_function)
         | 
| 142 | 
            +
                  GirFFI::Builder.attach_ffi_function(lib, info)
         | 
| 143 | 
            +
                end
         | 
| 60 144 | 
             
              end
         | 
| 61 145 |  | 
| 146 | 
            +
              #
         | 
| 147 | 
            +
              # NOTE: Legacy tests below.
         | 
| 148 | 
            +
              #
         | 
| 149 | 
            +
             | 
| 62 150 | 
             
              describe 'looking at Regress.test_callback_destroy_notify' do
         | 
| 63 151 | 
             
                before do
         | 
| 64 152 | 
             
                  save_module :GObject
         | 
| @@ -202,33 +290,4 @@ describe GirFFI::Builder do | |
| 202 290 | 
             
                  restore_module :Regress
         | 
| 203 291 | 
             
                end
         | 
| 204 292 | 
             
              end
         | 
| 205 | 
            -
             | 
| 206 | 
            -
              describe 'building Regress' do
         | 
| 207 | 
            -
                before do
         | 
| 208 | 
            -
                  save_module :Regress
         | 
| 209 | 
            -
                  GirFFI::Builder.build_module 'Regress'
         | 
| 210 | 
            -
                end
         | 
| 211 | 
            -
             | 
| 212 | 
            -
                it 'creates a Lib module ready to attach functions from the shared library' do
         | 
| 213 | 
            -
                  gir = GObjectIntrospection::IRepository.default
         | 
| 214 | 
            -
                  expected = [gir.shared_library('Regress')]
         | 
| 215 | 
            -
                  assert_equal expected, Regress::Lib.ffi_libraries.map(&:name)
         | 
| 216 | 
            -
                end
         | 
| 217 | 
            -
             | 
| 218 | 
            -
                it 'does not replace existing module' do
         | 
| 219 | 
            -
                  oldmodule = Regress
         | 
| 220 | 
            -
                  GirFFI::Builder.build_module 'Regress'
         | 
| 221 | 
            -
                  assert_equal oldmodule, Regress
         | 
| 222 | 
            -
                end
         | 
| 223 | 
            -
             | 
| 224 | 
            -
                it 'does not replace existing Lib module' do
         | 
| 225 | 
            -
                  oldmodule = Regress::Lib
         | 
| 226 | 
            -
                  GirFFI::Builder.build_module 'Regress'
         | 
| 227 | 
            -
                  assert_equal oldmodule, Regress::Lib
         | 
| 228 | 
            -
                end
         | 
| 229 | 
            -
             | 
| 230 | 
            -
                after do
         | 
| 231 | 
            -
                  restore_module :Regress
         | 
| 232 | 
            -
                end
         | 
| 233 | 
            -
              end
         | 
| 234 293 | 
             
            end
         | 
| @@ -378,6 +378,25 @@ describe GirFFI::Builders::ArgumentBuilder do | |
| 378 378 | 
             
                    end
         | 
| 379 379 | 
             
                  end
         | 
| 380 380 | 
             
                end
         | 
| 381 | 
            +
             | 
| 382 | 
            +
                describe 'for :void' do
         | 
| 383 | 
            +
                  let(:function_info) do
         | 
| 384 | 
            +
                    get_introspection_data('Everything', 'one_outparam_gpointer')
         | 
| 385 | 
            +
                  end
         | 
| 386 | 
            +
                  let(:arg_info) { function_info.args[0] }
         | 
| 387 | 
            +
             | 
| 388 | 
            +
                  before do
         | 
| 389 | 
            +
                    skip unless function_info
         | 
| 390 | 
            +
                  end
         | 
| 391 | 
            +
             | 
| 392 | 
            +
                  it 'has the correct value for #pre_conversion' do
         | 
| 393 | 
            +
                    builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :pointer']
         | 
| 394 | 
            +
                  end
         | 
| 395 | 
            +
             | 
| 396 | 
            +
                  it 'has the correct value for #post_conversion' do
         | 
| 397 | 
            +
                    builder.post_conversion.must_equal ['_v2 = _v1.get_pointer(0)']
         | 
| 398 | 
            +
                  end
         | 
| 399 | 
            +
                end
         | 
| 381 400 | 
             
              end
         | 
| 382 401 |  | 
| 383 402 | 
             
              describe 'for an argument with direction :inout' do
         | 
| @@ -23,6 +23,23 @@ describe GirFFI::Builders::CallbackArgumentBuilder do | |
| 23 23 | 
             
                    builder.post_conversion.must_equal ['_v1.put_pointer 0, GirFFI::ZeroTerminated.from(:gfloat, _v2)']
         | 
| 24 24 | 
             
                  end
         | 
| 25 25 | 
             
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                describe 'when the argument is allocated by us, the callee' do
         | 
| 28 | 
            +
                  let(:vfunc_info) do
         | 
| 29 | 
            +
                    get_vfunc_introspection_data('GIMarshallingTests', 'Object',
         | 
| 30 | 
            +
                                                 'method_int8_arg_and_out_callee')
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  let(:arg_info) { vfunc_info.args[1] }
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  it 'has the correct value for #pre_conversion' do
         | 
| 36 | 
            +
                    builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new(:int8).tap { |ptr| out.put_pointer 0, ptr }']
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  it 'has the correct value for #post_conversion' do
         | 
| 40 | 
            +
                    builder.post_conversion.must_equal ['_v1.put_int8 0, _v2']
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
                end
         | 
| 26 43 | 
             
              end
         | 
| 27 44 |  | 
| 28 45 | 
             
              describe 'for an argument with direction :error' do
         | 
| @@ -73,7 +73,7 @@ describe GirFFI::Builders::CallbackReturnValueBuilder do | |
| 73 73 | 
             
                it 'increases the refcount of the result and converts it to a pointer' do
         | 
| 74 74 | 
             
                  # Ensure variable names are generated in order
         | 
| 75 75 | 
             
                  builder.capture_variable_name.must_equal '_v1'
         | 
| 76 | 
            -
                  builder.post_conversion.must_equal ['_v2 = GObject::Object.from(_v1 | 
| 76 | 
            +
                  builder.post_conversion.must_equal ['_v1.ref', '_v2 = GObject::Object.from(_v1).to_ptr']
         | 
| 77 77 | 
             
                end
         | 
| 78 78 |  | 
| 79 79 | 
             
                it 'returns the result of the conversion' do
         | 
| @@ -2,7 +2,8 @@ | |
| 2 2 | 
             
            require 'gir_ffi_test_helper'
         | 
| 3 3 |  | 
| 4 4 | 
             
            describe GirFFI::Builders::FieldBuilder do
         | 
| 5 | 
            -
              let(: | 
| 5 | 
            +
              let(:klass) { 'dummy' }
         | 
| 6 | 
            +
              let(:instance) { GirFFI::Builders::FieldBuilder.new field_info, klass }
         | 
| 6 7 |  | 
| 7 8 | 
             
              describe 'for a field of type :gint8 with an offset' do
         | 
| 8 9 | 
             
                let(:field_info) { get_field_introspection_data 'Regress', 'TestSimpleBoxedA', 'some_int8' }
         | 
| @@ -11,39 +11,39 @@ describe GirFFI::Builders::StructBuilder do | |
| 11 11 | 
             
                                                           :some_double, :double, 8,
         | 
| 12 12 | 
             
                                                           :some_enum, Regress::TestEnum, 16]
         | 
| 13 13 | 
             
                end
         | 
| 14 | 
            -
              end
         | 
| 15 14 |  | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 15 | 
            +
                describe 'for a struct with a simple layout' do
         | 
| 16 | 
            +
                  before do
         | 
| 17 | 
            +
                    @field = Object.new
         | 
| 19 18 |  | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 19 | 
            +
                    @struct = Object.new
         | 
| 20 | 
            +
                    allow(@struct).to receive(:namespace).and_return 'Foo'
         | 
| 21 | 
            +
                    allow(@struct).to receive(:safe_name).and_return 'Bar'
         | 
| 22 | 
            +
                    allow(@struct).to receive(:fields).and_return [@field]
         | 
| 24 23 |  | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 24 | 
            +
                    @builder = GirFFI::Builders::StructBuilder.new @struct
         | 
| 25 | 
            +
                  end
         | 
| 27 26 |  | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 27 | 
            +
                  it 'creates the correct layout specification' do
         | 
| 28 | 
            +
                    expect(@field).to receive(:layout_specification).and_return [:bar, :int32, 0]
         | 
| 29 | 
            +
                    spec = @builder.layout_specification
         | 
| 30 | 
            +
                    assert_equal [:bar, :int32, 0], spec
         | 
| 31 | 
            +
                  end
         | 
| 32 32 | 
             
                end
         | 
| 33 | 
            -
              end
         | 
| 34 33 |  | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 34 | 
            +
                describe 'for a struct with a layout with a complex type' do
         | 
| 35 | 
            +
                  it 'does not flatten the complex type specification' do
         | 
| 36 | 
            +
                    expect(simplefield = Object.new).to receive(:layout_specification).and_return [:bar, :foo, 0]
         | 
| 37 | 
            +
                    expect(complexfield = Object.new).to receive(:layout_specification).and_return [:baz, [:qux, 2], 0]
         | 
| 38 | 
            +
                    expect(struct = Object.new).to receive(:fields).and_return [simplefield, complexfield]
         | 
| 40 39 |  | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 40 | 
            +
                    allow(struct).to receive(:safe_name).and_return 'Bar'
         | 
| 41 | 
            +
                    allow(struct).to receive(:namespace).and_return 'Foo'
         | 
| 43 42 |  | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 43 | 
            +
                    builder = GirFFI::Builders::StructBuilder.new struct
         | 
| 44 | 
            +
                    spec = builder.layout_specification
         | 
| 45 | 
            +
                    assert_equal [:bar, :foo, 0, :baz, [:qux, 2], 0], spec
         | 
| 46 | 
            +
                  end
         | 
| 47 47 | 
             
                end
         | 
| 48 48 | 
             
              end
         | 
| 49 49 |  | 
| @@ -72,4 +72,21 @@ describe GirFFI::Builders::StructBuilder do | |
| 72 72 | 
             
                  builder.superclass.must_equal GObject::ObjectClass
         | 
| 73 73 | 
             
                end
         | 
| 74 74 | 
             
              end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
              describe '#setup_class' do
         | 
| 77 | 
            +
                before do
         | 
| 78 | 
            +
                  save_module :Regress
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                it 'stubs the structs methods' do
         | 
| 82 | 
            +
                  info = get_introspection_data 'Regress', 'TestStructA'
         | 
| 83 | 
            +
                  builder = GirFFI::Builders::StructBuilder.new info
         | 
| 84 | 
            +
                  builder.setup_class
         | 
| 85 | 
            +
                  assert_defines_instance_method Regress::TestStructA, :clone
         | 
| 86 | 
            +
                end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                after do
         | 
| 89 | 
            +
                  restore_module :Regress
         | 
| 90 | 
            +
                end
         | 
| 91 | 
            +
              end
         | 
| 75 92 | 
             
            end
         |