blob: 47db2e95744d5cfa4c1e261b42f062f7a62bb67a [file]
// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// Objective C support is only available on mac.
@TestOn('mac-os')
library;
import 'dart:ffi';
import 'package:ffi/ffi.dart';
import 'package:test/test.dart';
import 'small_struct_test_bindings.dart';
typedef Struct8Block = ObjCBlock_Struct8;
typedef Struct16Block = ObjCBlock_Struct16;
typedef Struct24Block = ObjCBlock_Struct24;
typedef Struct32Block = ObjCBlock_Struct32;
typedef Union8Block = ObjCBlock_Union8;
typedef Union16Block = ObjCBlock_Union16;
typedef Union24Block = ObjCBlock_Union24;
typedef Union32Block = ObjCBlock_Union32;
void main() {
group('Small struct return tests (8 to 32 bytes)', () {
late SmallStructTester tester;
setUpAll(() {
tester = SmallStructTester.alloc().init();
});
group('Methods returning struct', () {
test('Struct8 (8 bytes)', () {
final result = tester.getStruct8Method();
expect(result.a, 100);
});
test('Struct16 (16 bytes)', () {
final result = tester.getStruct16Method();
expect(result.a, 100);
expect(result.b, 200);
});
test('Struct24 (24 bytes)', () {
final result = tester.getStruct24Method();
expect(result.a, 100);
expect(result.b, 200);
expect(result.c, 300);
});
test('Struct32 (32 bytes)', () {
final result = tester.getStruct32Method();
expect(result.a, 100);
expect(result.b, 200);
expect(result.c, 300);
expect(result.d, 400);
});
});
group('Methods returning union', () {
test('Union8 (8 bytes)', () {
final result = tester.getUnion8Method();
expect(result.a, 100);
});
test('Union16 (16 bytes)', () {
final result = tester.getUnion16Method();
expect(result.a, 100);
expect(result.s.a, 100);
expect(result.s.b, 200);
});
test('Union24 (24 bytes)', () {
final result = tester.getUnion24Method();
expect(result.a, 100);
expect(result.s.a, 100);
expect(result.s.b, 200);
expect(result.s.c, 300);
});
test('Union32 (32 bytes)', () {
final result = tester.getUnion32Method();
expect(result.a, 100);
expect(result.s.a, 100);
expect(result.s.b, 200);
expect(result.s.c, 300);
expect(result.s.d, 400);
});
});
group('Property getters returning struct', () {
test('Struct8 (8 bytes)', () {
final result = tester.struct8Property;
expect(result.a, 10);
});
test('Struct16 (16 bytes)', () {
final result = tester.struct16Property;
expect(result.a, 10);
expect(result.b, 20);
});
test('Struct24 (24 bytes)', () {
final result = tester.struct24Property;
expect(result.a, 10);
expect(result.b, 20);
expect(result.c, 30);
});
test('Struct32 (32 bytes)', () {
final result = tester.struct32Property;
expect(result.a, 10);
expect(result.b, 20);
expect(result.c, 30);
expect(result.d, 40);
});
});
group('Property getters returning union', () {
test('Union8 (8 bytes)', () {
final result = tester.union8Property;
expect(result.a, 10);
});
test('Union16 (16 bytes)', () {
final result = tester.union16Property;
expect(result.a, 10);
expect(result.s.a, 10);
expect(result.s.b, 20);
});
test('Union24 (24 bytes)', () {
final result = tester.union24Property;
expect(result.a, 10);
expect(result.s.a, 10);
expect(result.s.b, 20);
expect(result.s.c, 30);
});
test('Union32 (32 bytes)', () {
final result = tester.union32Property;
expect(result.a, 10);
expect(result.s.a, 10);
expect(result.s.b, 20);
expect(result.s.c, 30);
expect(result.s.d, 40);
});
});
group('Blocks returning struct', () {
test('Struct8 (8 bytes)', () {
using((arena) {
final temp = arena<Struct8>().ref;
temp.a = 1000;
final block = Struct8Block.fromFunction(() => temp);
final result = SmallStructTester.callStruct8Block(block);
expect(result.a, 1000);
});
});
test('Struct16 (16 bytes)', () {
using((arena) {
final temp = arena<Struct16>().ref;
temp.a = 1000;
temp.b = 2000;
final block = Struct16Block.fromFunction(() => temp);
final result = SmallStructTester.callStruct16Block(block);
expect(result.a, 1000);
expect(result.b, 2000);
});
});
test('Struct24 (24 bytes)', () {
using((arena) {
final temp = arena<Struct24>().ref;
temp.a = 1000;
temp.b = 2000;
temp.c = 3000;
final block = Struct24Block.fromFunction(() => temp);
final result = SmallStructTester.callStruct24Block(block);
expect(result.a, 1000);
expect(result.b, 2000);
expect(result.c, 3000);
});
});
test('Struct32 (32 bytes)', () {
using((arena) {
final temp = arena<Struct32>().ref;
temp.a = 1000;
temp.b = 2000;
temp.c = 3000;
temp.d = 4000;
final block = Struct32Block.fromFunction(() => temp);
final result = SmallStructTester.callStruct32Block(block);
expect(result.a, 1000);
expect(result.b, 2000);
expect(result.c, 3000);
expect(result.d, 4000);
});
});
});
group('Blocks returning union', () {
test('Union8 (8 bytes)', () {
using((arena) {
final temp = arena<Union8>().ref;
temp.a = 1000;
final block = Union8Block.fromFunction(() => temp);
final result = SmallStructTester.callUnion8Block(block);
expect(result.a, 1000);
});
});
test('Union16 (16 bytes)', () {
using((arena) {
final temp = arena<Union16>().ref;
temp.s.a = 1000;
temp.s.b = 2000;
final block = Union16Block.fromFunction(() => temp);
final result = SmallStructTester.callUnion16Block(block);
expect(result.a, 1000);
expect(result.s.a, 1000);
expect(result.s.b, 2000);
});
});
test('Union24 (24 bytes)', () {
using((arena) {
final temp = arena<Union24>().ref;
temp.s.a = 1000;
temp.s.b = 2000;
temp.s.c = 3000;
final block = Union24Block.fromFunction(() => temp);
final result = SmallStructTester.callUnion24Block(block);
expect(result.a, 1000);
expect(result.s.a, 1000);
expect(result.s.b, 2000);
expect(result.s.c, 3000);
});
});
test('Union32 (32 bytes)', () {
using((arena) {
final temp = arena<Union32>().ref;
temp.s.a = 1000;
temp.s.b = 2000;
temp.s.c = 3000;
temp.s.d = 4000;
final block = Union32Block.fromFunction(() => temp);
final result = SmallStructTester.callUnion32Block(block);
expect(result.a, 1000);
expect(result.s.a, 1000);
expect(result.s.b, 2000);
expect(result.s.c, 3000);
expect(result.s.d, 4000);
});
});
});
});
}