Files
sdk/tests/web/weak_reference_test.dart
T
Riley Porter 278a040e1d Add WeakReference and Finalizer patches for ddc and dart2js
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>
2022-02-08 22:01:36 +00:00

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);
});
}