278a040e1d
Routes implementation to JavaScript WeakRef and FinalizerRegistry APIs using JS foreign function calls. Uses Wrapper names for the Dart library to avoid issues with DDC. Bug: #47775, #47776 Change-Id: Iad82bd83ac10c666d08a2c042a8ed6109b8b58c8 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/229180 Reviewed-by: Stephen Adams <sra@google.com> Reviewed-by: Sigmund Cherem <sigmund@google.com> Reviewed-by: Nicholas Shahan <nshahan@google.com> Commit-Queue: Riley Porter <rileyporter@google.com>
56 lines
1.7 KiB
Dart
56 lines
1.7 KiB
Dart
// Copyright (c) 2022, 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.
|
|
|
|
// Basic tests for the WeakReference and Finalizer API for the web backends.
|
|
// Does not trigger garbage collection to heavily test the functionality.
|
|
|
|
import 'package:expect/minitest.dart';
|
|
|
|
class Foo {
|
|
int close() {
|
|
return 42; // no-op, dropped return value.
|
|
}
|
|
}
|
|
|
|
void callback(Foo f) {
|
|
f.close();
|
|
}
|
|
|
|
main() {
|
|
test('weak reference', () {
|
|
var list = ["foo"];
|
|
var weakRef = WeakReference<List<String>>(list);
|
|
expect(weakRef.target, equals(list));
|
|
|
|
// Javascript API throws when the representation of target is not 'object'
|
|
// in the compiled Javascript.
|
|
expect(() => WeakReference<String>("foo"), throws);
|
|
expect(() => WeakReference<int>(1), throws);
|
|
});
|
|
|
|
test('finalizer', () {
|
|
var finalizer = Finalizer<Foo>(callback);
|
|
var list = ["foo"];
|
|
var foo = Foo();
|
|
// Should not cause errors to attach or detach
|
|
finalizer.attach(list, foo);
|
|
finalizer.attach(list, foo, detach: list);
|
|
finalizer.detach(list);
|
|
|
|
// Should not cause errors to use a different detach token
|
|
var detachList = [1, 2, 3];
|
|
finalizer.attach(list, foo, detach: detachList);
|
|
finalizer.detach(detachList);
|
|
|
|
// JavaScript API returns false when unknown target detached.
|
|
// Should not cause an error to detach unknown token.
|
|
var unknownList = [2, 4, 6];
|
|
finalizer.detach(unknownList);
|
|
|
|
// JavaScript API throws when target and detach token are not objects.
|
|
expect(() => finalizer.attach("token string value", foo), throws);
|
|
expect(() => finalizer.detach("detach string value"), throws);
|
|
});
|
|
}
|