// 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); expect(weakRef.target, equals(list)); // Javascript API throws when the representation of target is not 'object' // in the compiled Javascript. expect(() => WeakReference("foo"), throws); expect(() => WeakReference(1), throws); }); test('finalizer', () { var finalizer = Finalizer(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); }); }