blob: 3bbaa21236033bbbe4d6cea7a709dad5898d3741 [file] [log] [blame]
// 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);
});
}