Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/yx_scope/lib/src/core/scope_state.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,8 @@ extension ScopeStateExt on ScopeState {
bool get none => this == ScopeState.none;

bool get available => this == ScopeState.available;

bool get initializing => this == ScopeState.initializing;

bool get disposing => this == ScopeState.disposing;
}
20 changes: 10 additions & 10 deletions packages/yx_scope/lib/src/core_scope_holder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ abstract class CoreScopeHolder<Scope, Container extends BaseScopeContainer>
final _scopeStateHolder = ScopeStateHolder<ScopeState>(ScopeState.none);
Completer? _waitLifecycleCompleter;

ScopeState get _scopeState => _scopeStateHolder.scope;
ScopeState get state => _scopeStateHolder.scope;

CoreScopeHolder({
List<ScopeListener>? scopeListeners,
Expand Down Expand Up @@ -43,7 +43,7 @@ abstract class CoreScopeHolder<Scope, Container extends BaseScopeContainer>
if (scope is! Scope) {
throw ScopeException('You must implement $Scope for your $Container');
}
switch (_scopeState) {
switch (state) {
case ScopeState.initializing:
throw ScopeException(
'You are trying to initialize $Container that is initializing right now. '
Expand Down Expand Up @@ -98,13 +98,13 @@ abstract class CoreScopeHolder<Scope, Container extends BaseScopeContainer>
_waitLifecycleCompleter = null;
removeListener();
Logger.debug(
'Wait for scope dispose has completed, state=$_scopeState',
'Wait for scope dispose has completed, state=$state',
);
if (!_scopeState.none) {
if (!state.none) {
throw ScopeError(
'Scope initialization waited for dispose of the previous scope state, '
'it\'s expected to be ${ScopeState.none}, '
'but it appeared to be $_scopeState.'
'but it appeared to be $state.'
'This is definitely an error in the library,'
' please contact an owner, if you see this message.',
);
Expand Down Expand Up @@ -188,7 +188,7 @@ abstract class CoreScopeHolder<Scope, Container extends BaseScopeContainer>
'both non-nullable args (drop during initialization)',
);
}
switch (_scopeState) {
switch (state) {
case ScopeState.disposing:
assert(
false,
Expand Down Expand Up @@ -248,13 +248,13 @@ abstract class CoreScopeHolder<Scope, Container extends BaseScopeContainer>
_waitLifecycleCompleter = null;
removeListener();
Logger.debug(
'Wait for scope initialization has completed, state=$_scopeState',
'Wait for scope initialization has completed, state=$state',
);
if (!_scopeState.available) {
if (!state.available) {
throw ScopeError(
'Scope dispose waited for initialization of the previous scope state, '
'it\'s expected to be ${ScopeState.available}, '
'but it appears to be $_scopeState. '
'but it appears to be $state. '
'This is definitely an error in the library,'
' please contact an owner, if you see this message.',
);
Expand All @@ -277,7 +277,7 @@ abstract class CoreScopeHolder<Scope, Container extends BaseScopeContainer>
final scope = this.scope as Container? ?? initializedScope;
if (scope == null) {
throw ScopeError(
'$Container must not be null if scope state is $_scopeState',
'$Container must not be null if scope state is $state',
);
}

Expand Down
1 change: 1 addition & 0 deletions packages/yx_scope/lib/yx_scope.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export 'src/base_scope_container.dart'
TestableScopeStateHolder;
export 'src/core/async_lifecycle.dart';
export 'src/core/scope_exception.dart';
export 'src/core/scope_state.dart';
export 'src/monitoring/listeners.dart';
export 'src/monitoring/models/dep_id.dart';
export 'src/monitoring/models/scope_id.dart';
Expand Down
52 changes: 52 additions & 0 deletions packages/yx_scope/test/scope_state_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import 'dart:async';

import 'package:test/test.dart';
import 'package:yx_scope/yx_scope.dart';

void main() {
test('scope state is valid according to updates', () async {
final scopeHolder = _TestScopeHolder();

final createCompleter = Completer();
final dropCompleter = Completer();

expect(scopeHolder.state, ScopeState.none);
expect(scopeHolder.state.none, isTrue);
scopeHolder.create().then((_) => createCompleter.complete());

expect(scopeHolder.state, ScopeState.initializing);
expect(scopeHolder.state.initializing, isTrue);
await createCompleter.future;

expect(scopeHolder.state, ScopeState.available);
expect(scopeHolder.state.available, isTrue);

scopeHolder.drop().then((_) => dropCompleter.complete());

expect(scopeHolder.state, ScopeState.disposing);
expect(scopeHolder.state.disposing, isTrue);

await dropCompleter.future;

expect(scopeHolder.state, ScopeState.none);
expect(scopeHolder.state.none, isTrue);
});
}

class _TestScopeHolder extends ScopeHolder<_TestScopeContainer> {
@override
_TestScopeContainer createContainer() => _TestScopeContainer();
}

class _TestScopeContainer extends ScopeContainer {
@override
List<Set<AsyncDep>> get initializeQueue => [
{_asyncDep}
];

late final _asyncDep = rawAsyncDep(
() => Future.delayed(Duration.zero),
init: (dep) async => await dep,
dispose: (dep) async {},
);
}