blob: 3e84d8046fb9eb8ed9f661e59213c32649e34a6f [file] [edit]
// 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.
// Objective C support is only available on mac.
@TestOn('mac-os')
library;
import 'package:ffi/ffi.dart';
import 'package:objective_c/objective_c.dart';
import 'package:test/test.dart';
import 'util.dart';
// Strings short enough to be stored as tagged pointers are never
// deallocated, so use one that is long enough to be a real object.
const _longString =
'a string that is far too long to be stored as a tagged pointer';
void main() {
group('NSString', () {
for (final s in ['Hello', '🇵🇬', 'Embedded\u0000Null']) {
test('NSString to/from Dart string [$s]', () {
final ns1 = NSString(s);
expect(ns1.length, s.length);
expect(ns1.toDartString().length, s.length);
expect(ns1.toDartString(), s);
final ns2 = s.toNSString();
expect(ns2.length, s.length);
expect(ns2.toDartString().length, s.length);
expect(ns2.toDartString(), s);
});
}
test('`NSString.new` garbage collected', () async {
await using((arena) async {
final tracker = ReferenceTracker(arena);
() {
tracker.track(NSString(_longString));
}();
doGC();
await Future<void>.delayed(Duration.zero);
doGC();
expect(tracker.isAlive, isFalse);
});
});
test('`String.toNSString` garbage collected', () async {
await using((arena) async {
final tracker = ReferenceTracker(arena);
() {
tracker.track(_longString.toNSString());
}();
doGC();
await Future<void>.delayed(Duration.zero);
doGC();
expect(tracker.isAlive, isFalse);
});
});
});
}