From 4dca0f008b4edd167e19b61219dc46d431b8c495 Mon Sep 17 00:00:00 2001 From: beeth0ven Date: Tue, 5 Jul 2022 08:41:57 +0800 Subject: [PATCH 1/2] upgrade `disposal` --- pubspec.lock | 2 +- pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index b49a6c1..a5fa348 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -147,7 +147,7 @@ packages: name: disposal url: "https://pub.dartlang.org" source: hosted - version: "0.1.0-alpha.1" + version: "0.1.0-alpha.2" file: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 9446934..e7636de 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,7 +8,7 @@ environment: dependencies: meta: ^1.3.0 typedef_foundation: ^0.1.0 - disposal: ^0.1.0-alpha.1 + disposal: ^0.1.0-alpha.2 typedef_equals: ^0.0.1 From 1db7cc13c00ad366d6d9dec755f00f224a95bba3 Mon Sep 17 00:00:00 2001 From: beeth0ven Date: Tue, 5 Jul 2022 09:45:49 +0800 Subject: [PATCH 2/2] add `scope.dispose` --- .../scopes/scope_methods/disposable_sink.dart | 8 + lib/src/scopes/scopes/configurable_scope.dart | 19 ++- lib/src/scopes/scopes/scope.dart | 3 +- .../scopes/scope_methods/disposable_test.dart | 154 ++++++++++++++++++ test/scopes/scopes/scope_test.dart | 5 + test/scopes/scopes_test.dart | 2 + 6 files changed, 189 insertions(+), 2 deletions(-) create mode 100644 lib/src/scopes/scope_methods/disposable_sink.dart create mode 100644 test/scopes/scope_methods/disposable_test.dart diff --git a/lib/src/scopes/scope_methods/disposable_sink.dart b/lib/src/scopes/scope_methods/disposable_sink.dart new file mode 100644 index 0000000..cd3ba7c --- /dev/null +++ b/lib/src/scopes/scope_methods/disposable_sink.dart @@ -0,0 +1,8 @@ + +import 'package:disposal/disposal.dart'; + +abstract class DisposableSink { + + void addDisposable(Disposable disposable); + void addDisposables(List disposables); +} diff --git a/lib/src/scopes/scopes/configurable_scope.dart b/lib/src/scopes/scopes/configurable_scope.dart index e608728..65f95f1 100644 --- a/lib/src/scopes/scopes/configurable_scope.dart +++ b/lib/src/scopes/scopes/configurable_scope.dart @@ -1,13 +1,15 @@ import 'dart:async'; import 'package:meta/meta.dart'; +import 'package:disposal/disposal.dart'; import 'package:typedef_foundation/typedef_foundation.dart'; import '../configurables/configurable.dart'; +import '../scope_methods/disposable_sink.dart'; import '../scope_methods/scope_expose.dart'; import '../shared/build_scope.dart'; import 'scope.dart'; -abstract class ConfigurableScope implements Scope, ScopeExpose { +abstract class ConfigurableScope implements Scope, ScopeExpose, DisposableSink { @internal factory ConfigurableScope() = _ConfigurableScopeImpl; } @@ -23,6 +25,7 @@ class _ConfigurableScopeImpl implements ConfigurableScope { .map((key, value) => MapEntry(key, Map.of(value))); final _Storage _storage; + final _disposables = CompositeDisposable(); @override T? getOrNull({ @@ -55,5 +58,19 @@ class _ConfigurableScopeImpl implements ConfigurableScope { final scope = _ConfigurableScopeImpl._fromStorage(_storage); return buildScope(configure, scope); } + + @override + void addDisposable(Disposable disposable) { + _disposables.addDisposable(disposable); + } + + void addDisposables(List disposables) { + _disposables.addDisposables(disposables); + } + + @override + void dispose() { + _disposables.dispose(); + } } diff --git a/lib/src/scopes/scopes/scope.dart b/lib/src/scopes/scopes/scope.dart index abc0cf9..29cf952 100644 --- a/lib/src/scopes/scopes/scope.dart +++ b/lib/src/scopes/scopes/scope.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:disposal/disposal.dart'; import '../configurables/configurable.dart'; import '../scope_methods/scope_get.dart'; @@ -8,7 +9,7 @@ import '../shared/build_scope.dart'; import 'configurable_scope.dart'; -abstract class Scope implements ScopeGet, ScopePush { +abstract class Scope implements ScopeGet, ScopePush, Disposable { static FutureOr root(List configure) => _scopeRoot(configure); } diff --git a/test/scopes/scope_methods/disposable_test.dart b/test/scopes/scope_methods/disposable_test.dart new file mode 100644 index 0000000..e9192cf --- /dev/null +++ b/test/scopes/scope_methods/disposable_test.dart @@ -0,0 +1,154 @@ +import 'package:test/test.dart'; +import 'package:scopes/scopes.dart'; + +import '../../toolbox/mock_configurable.dart'; + +void main() { + + test('`scope.addDisposables` before dispose', () async { + + final List invokes = []; + + final configurable = MockConfigurable((scope) { + + final disposable1 = Disposable(() { + invokes.add('dispose1'); + }); + final disposable2 = Disposable(() { + invokes.add('dispose2'); + }); + + scope.addDisposables([ + disposable1, + disposable2, + ]); + + }); + + final scope = await Scope.root([ + configurable, + ]); + + expect(invokes, []); + scope.dispose(); + expect(invokes, [ + 'dispose2', + 'dispose1', + ]); + + }); + + test('`scope.addDisposable` before dispose', () async { + + int invokes = 0; + + final configurable = MockConfigurable((scope) { + + final disposable = Disposable(() { + invokes += 1; + }); + + scope.addDisposable(disposable); + + }); + + final scope = await Scope.root([ + configurable, + ]); + + expect(invokes, 0); + scope.dispose(); + expect(invokes, 1); + + }); + + test('`scope.addDisposables` after dispose', () async { + + final List invokes = []; + + final configurable = MockConfigurable((scope) { + + final disposable1 = Disposable(() { + invokes.add('dispose1'); + }); + final disposable2 = Disposable(() { + invokes.add('dispose2'); + }); + + Future(() { + expect(invokes, []); + scope.addDisposables([ + disposable1, + disposable2, + ]); + expect(invokes, [ + 'dispose2', + 'dispose1', + ]); + }); + }); + + final scope = await Scope.root([ + configurable, + ]); + + scope.dispose(); + + await Future(() {}); + + }); + + test('`scope.addDisposable` after dispose', () async { + + int invokes = 0; + + final configurable = MockConfigurable((scope) { + + final disposable = Disposable(() { + invokes += 1; + }); + + Future(() { + expect(invokes, 0); + scope.addDisposable(disposable); + expect(invokes, 1); + }); + + }); + + final scope = await Scope.root([ + configurable, + ]); + + scope.dispose(); + + await Future(() {}); + + }); + + test('`scope.dispose` multiple times', () async { + + int invokes = 0; + + final configurable = MockConfigurable((scope) { + + final disposable = Disposable(() { + invokes += 1; + }); + + scope.addDisposable(disposable); + + }); + + final scope = await Scope.root([ + configurable, + ]); + + expect(invokes, 0); + scope.dispose(); + expect(invokes, 1); + scope.dispose(); + expect(invokes, 1); + + }); +} diff --git a/test/scopes/scopes/scope_test.dart b/test/scopes/scopes/scope_test.dart index 86ce638..84ff409 100644 --- a/test/scopes/scopes/scope_test.dart +++ b/test/scopes/scopes/scope_test.dart @@ -158,4 +158,9 @@ class _MockScope implements Scope { FutureOr push( List configure, ) => throw UnimplementedError(); + + @override + void dispose() { + throw UnimplementedError(); + } } diff --git a/test/scopes/scopes_test.dart b/test/scopes/scopes_test.dart index 7c466fa..22aaf88 100644 --- a/test/scopes/scopes_test.dart +++ b/test/scopes/scopes_test.dart @@ -1,8 +1,10 @@ +import 'scope_methods/disposable_test.dart' as disposable_test; import 'scope_methods/scope_push_test.dart' as scope_push_test; import 'scopes/scope_test.dart' as scope_test; void main() { + disposable_test.main(); scope_push_test.main(); scope_test.main(); }