| // Copyright (c) 2024, 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. | |
| import 'package:swift2objc/src/ast/declarations/built_in/built_in_declaration.dart'; | |
| import 'package:swift2objc/src/ast/declarations/compounds/members/initializer_declaration.dart'; | |
| import 'package:swift2objc/src/ast/declarations/compounds/members/property_declaration.dart'; | |
| import 'package:swift2objc/src/ast/declarations/compounds/struct_declaration.dart'; | |
| import 'package:swift2objc/src/transformer/_core/unique_namer.dart'; | |
| import 'package:swift2objc/src/transformer/transform.dart'; | |
| import 'package:swift2objc/src/transformer/transformers/transform_compound.dart'; | |
| import 'package:test/test.dart'; | |
| void main() { | |
| group('Implicit Initializer Generation', () { | |
| test('generates implicit init for struct with stored properties', () { | |
| final struct = StructDeclaration( | |
| id: 'TestStruct', | |
| name: 'Person', | |
| source: null, | |
| availability: [], | |
| properties: [ | |
| PropertyDeclaration( | |
| id: 'TestStruct::name', | |
| name: 'name', | |
| lineNumber: 1, | |
| source: null, | |
| availability: [], | |
| type: stringType, | |
| hasSetter: true, | |
| isStatic: false, | |
| ), | |
| PropertyDeclaration( | |
| id: 'TestStruct::age', | |
| name: 'age', | |
| lineNumber: 2, | |
| source: null, | |
| availability: [], | |
| type: intType, | |
| hasSetter: true, | |
| isStatic: false, | |
| ), | |
| ], | |
| initializers: [], | |
| ); | |
| final state = TransformationState(); | |
| final result = transformCompound(struct, UniqueNamer(), state); | |
| expect(result.initializers.length, equals(1)); | |
| expect(result.initializers.first.params.length, equals(2)); | |
| expect(result.initializers.first.params[0].name, equals('name')); | |
| expect(result.initializers.first.params[1].name, equals('age')); | |
| }); | |
| test('does not generate implicit init when explicit init exists', () { | |
| final struct = StructDeclaration( | |
| id: 'TestStruct', | |
| name: 'Person', | |
| source: null, | |
| availability: [], | |
| properties: [ | |
| PropertyDeclaration( | |
| id: 'TestStruct::name', | |
| name: 'name', | |
| source: null, | |
| availability: [], | |
| type: stringType, | |
| hasSetter: true, | |
| isStatic: false, | |
| ), | |
| ], | |
| initializers: [ | |
| // Has explicit initializer | |
| InitializerDeclaration( | |
| id: 'TestStruct::init', | |
| source: null, | |
| availability: [], | |
| params: [], | |
| hasObjCAnnotation: true, | |
| isOverriding: false, | |
| throws: false, | |
| async: false, | |
| isFailable: false, | |
| ), | |
| ], | |
| ); | |
| final state = TransformationState(); | |
| final result = transformCompound(struct, UniqueNamer(), state); | |
| expect(result.initializers.length, equals(1)); | |
| }); | |
| test('excludes static properties from implicit init', () { | |
| final struct = StructDeclaration( | |
| id: 'TestStruct', | |
| name: 'Config', | |
| source: null, | |
| availability: [], | |
| properties: [ | |
| PropertyDeclaration( | |
| id: 'TestStruct::name', | |
| name: 'name', | |
| source: null, | |
| availability: [], | |
| type: stringType, | |
| hasSetter: true, | |
| isStatic: false, | |
| ), | |
| PropertyDeclaration( | |
| id: 'TestStruct::defaultName', | |
| name: 'defaultName', | |
| source: null, | |
| availability: [], | |
| type: stringType, | |
| hasSetter: true, | |
| isStatic: true, | |
| ), | |
| ], | |
| initializers: [], | |
| ); | |
| final state = TransformationState(); | |
| final result = transformCompound(struct, UniqueNamer(), state); | |
| expect(result.initializers.length, equals(1)); | |
| expect(result.initializers.first.params.length, equals(1)); | |
| expect(result.initializers.first.params[0].name, equals('name')); | |
| }); | |
| test('excludes computed properties (no setter) from implicit init', () { | |
| final struct = StructDeclaration( | |
| id: 'TestStruct', | |
| name: 'Person', | |
| source: null, | |
| availability: [], | |
| properties: [ | |
| PropertyDeclaration( | |
| id: 'TestStruct::firstName', | |
| name: 'firstName', | |
| source: null, | |
| availability: [], | |
| type: stringType, | |
| hasSetter: true, | |
| isStatic: false, | |
| ), | |
| PropertyDeclaration( | |
| id: 'TestStruct::fullName', | |
| name: 'fullName', | |
| source: null, | |
| availability: [], | |
| type: stringType, | |
| hasSetter: false, | |
| isStatic: false, | |
| hasExplicitGetter: true, | |
| ), | |
| ], | |
| initializers: [], | |
| ); | |
| final state = TransformationState(); | |
| final result = transformCompound(struct, UniqueNamer(), state); | |
| expect(result.initializers.length, equals(1)); | |
| expect(result.initializers.first.params.length, equals(1)); | |
| expect(result.initializers.first.params[0].name, equals('firstName')); | |
| }); | |
| }); | |
| } |