Skip to content

Commit

Permalink
Merge pull request #60 from LoveCommunity/feature/scope-dispose
Browse files Browse the repository at this point in the history
Feature/scope dispose
  • Loading branch information
beeth0ven committed Jul 5, 2022
2 parents efd10c4 + 1db7cc1 commit cc26a17
Show file tree
Hide file tree
Showing 8 changed files with 191 additions and 4 deletions.
8 changes: 8 additions & 0 deletions lib/src/scopes/scope_methods/disposable_sink.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@

import 'package:disposal/disposal.dart';

abstract class DisposableSink {

void addDisposable(Disposable disposable);
void addDisposables(List<Disposable> disposables);
}
19 changes: 18 additions & 1 deletion lib/src/scopes/scopes/configurable_scope.dart
Original file line number Diff line number Diff line change
@@ -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;
}
Expand All @@ -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<T>({
Expand Down Expand Up @@ -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<Disposable> disposables) {
_disposables.addDisposables(disposables);
}

@override
void dispose() {
_disposables.dispose();
}
}

3 changes: 2 additions & 1 deletion lib/src/scopes/scopes/scope.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@

import 'dart:async';
import 'package:disposal/disposal.dart';

import '../configurables/configurable.dart';
import '../scope_methods/scope_get.dart';
Expand All @@ -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<Scope> root(List<Configurable> configure) => _scopeRoot(configure);
}

Expand Down
2 changes: 1 addition & 1 deletion pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down
154 changes: 154 additions & 0 deletions test/scopes/scope_methods/disposable_test.dart
Original file line number Diff line number Diff line change
@@ -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<String> 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<String> 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);

});
}
5 changes: 5 additions & 0 deletions test/scopes/scopes/scope_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -158,4 +158,9 @@ class _MockScope implements Scope {
FutureOr<Scope> push(
List<Configurable> configure,
) => throw UnimplementedError();

@override
void dispose() {
throw UnimplementedError();
}
}
2 changes: 2 additions & 0 deletions test/scopes/scopes_test.dart
Original file line number Diff line number Diff line change
@@ -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();
}

0 comments on commit cc26a17

Please sign in to comment.