Skip to content

Commit 954c600

Browse files
authored
Merge pull request #385 from kuhnroyal/popScopesTill-tests
Adjust and add tests for popScopesTill
2 parents c48f5ca + 4f14690 commit 954c600

File tree

2 files changed

+65
-31
lines changed

2 files changed

+65
-31
lines changed

lib/get_it_impl.dart

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1474,18 +1474,21 @@ class _GetItImplementation implements GetIt {
14741474
}
14751475
String? poppedScopeName;
14761476
_Scope nextScopeToPop = _currentScope;
1477-
do {
1477+
bool somethingWasPopped = false;
1478+
1479+
while (nextScopeToPop.name != _baseScopeName &&
1480+
hasScope(scopeName) &&
1481+
(nextScopeToPop.name != scopeName || inclusive)) {
14781482
poppedScopeName = nextScopeToPop.name;
14791483
await dropScope(poppedScopeName!);
1484+
somethingWasPopped = true;
14801485
nextScopeToPop = _scopes.lastWhere((x) => x.isPopping == false);
1481-
if (nextScopeToPop.name == _baseScopeName) {
1482-
return true;
1483-
}
1484-
} while (hasScope(scopeName) && inclusive
1485-
? (poppedScopeName != scopeName)
1486-
: (nextScopeToPop.name != scopeName));
1487-
onScopeChanged?.call(false);
1488-
return true;
1486+
}
1487+
1488+
if (somethingWasPopped) {
1489+
onScopeChanged?.call(false);
1490+
}
1491+
return somethingWasPopped;
14891492
}
14901493

14911494
/// Disposes all registered factories and singletons in the provided scope

test/scope_test.dart

Lines changed: 53 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@ void main() {
330330
expect(isShadowed, false);
331331
expect(shadowingObject, shadowingInstance);
332332
});
333+
333334
test('popscope', () async {
334335
final getIt = GetIt.instance;
335336
constructorCounter = 0;
@@ -362,63 +363,92 @@ void main() {
362363
);
363364
});
364365

365-
test('popscopeuntil inclusive=true', () async {
366+
test('popScopesTill inclusive=true', () async {
366367
final getIt = GetIt.instance;
367368
constructorCounter = 0;
368369

369370
getIt.registerSingleton<TestClass>(TestClass('Basescope'));
370371

371372
getIt.pushNewScope(scopeName: 'Level1');
372-
373-
getIt.registerSingleton<TestClass>(TestClass('2. scope'));
373+
getIt.registerSingleton<TestClass>(TestClass('1. scope'));
374374

375375
getIt.pushNewScope(scopeName: 'Level2');
376+
getIt.registerSingleton<TestClass>(TestClass('2. scope'));
376377

378+
getIt.pushNewScope(scopeName: 'Level3');
377379
getIt.registerSingleton<TestClass>(TestClass('3. scope'));
380+
expect(getIt.get<TestClass>().id, '3. scope');
378381

379-
final instanceTestClassScope3 = getIt.get<TestClass>();
380-
381-
expect(instanceTestClassScope3.id, '3. scope');
382+
await getIt.popScopesTill('Level2');
382383

383-
await getIt.popScopesTill('Level1');
384-
385-
final instanceTestClassScope1 = getIt.get<TestClass>();
386-
387-
expect(instanceTestClassScope1.id, 'Basescope');
384+
expect(getIt.get<TestClass>().id, '1. scope');
388385
expect(
389386
() => getIt.get<TestClass2>(),
390387
throwsStateError,
391388
);
392389
});
393-
test('popscopeuntil inclusive=false', () async {
390+
391+
test('popScopesTill inclusive=false', () async {
394392
final getIt = GetIt.instance;
395393
constructorCounter = 0;
396394

397395
getIt.registerSingleton<TestClass>(TestClass('Basescope'));
398396

399397
getIt.pushNewScope(scopeName: 'Level1');
400-
401-
getIt.registerSingleton<TestClass>(TestClass('2. scope'));
398+
getIt.registerSingleton<TestClass>(TestClass('1. scope'));
402399

403400
getIt.pushNewScope(scopeName: 'Level2');
401+
getIt.registerSingleton<TestClass>(TestClass('2. scope'));
404402

403+
getIt.pushNewScope(scopeName: 'Level3');
405404
getIt.registerSingleton<TestClass>(TestClass('3. scope'));
405+
expect(getIt.get<TestClass>().id, '3. scope');
406406

407-
final instanceTestClassScope3 = getIt.get<TestClass>();
408-
409-
expect(instanceTestClassScope3.id, '3. scope');
407+
await getIt.popScopesTill('Level2', inclusive: false);
410408

411-
await getIt.popScopesTill('Level1', inclusive: false);
412-
413-
final instanceTestClassScope1 = getIt.get<TestClass>();
414-
415-
expect(instanceTestClassScope1.id, '2. scope');
409+
expect(getIt.get<TestClass>().id, '2. scope');
416410
expect(
417411
() => getIt.get<TestClass2>(),
418412
throwsStateError,
419413
);
420414
});
421415

416+
test('popScopesTill invalid scope', () async {
417+
final getIt = GetIt.instance;
418+
419+
getIt.pushNewScope(scopeName: 'Level1');
420+
getIt.pushNewScope(scopeName: 'Level2');
421+
getIt.pushNewScope(scopeName: 'Level3');
422+
423+
expect(getIt.hasScope('Level1'), isTrue);
424+
expect(getIt.hasScope('Level2'), isTrue);
425+
expect(getIt.hasScope('Level3'), isTrue);
426+
427+
await getIt.popScopesTill('Level4');
428+
429+
expect(getIt.hasScope('Level1'), isTrue);
430+
expect(getIt.hasScope('Level2'), isTrue);
431+
expect(getIt.hasScope('Level3'), isTrue);
432+
});
433+
434+
test('popScopesTill inclusive=false top scope', () async {
435+
final getIt = GetIt.instance;
436+
437+
getIt.pushNewScope(scopeName: 'Level1');
438+
getIt.pushNewScope(scopeName: 'Level2');
439+
getIt.pushNewScope(scopeName: 'Level3');
440+
441+
expect(getIt.hasScope('Level1'), isTrue);
442+
expect(getIt.hasScope('Level2'), isTrue);
443+
expect(getIt.hasScope('Level3'), isTrue);
444+
445+
await getIt.popScopesTill('Level3', inclusive: false);
446+
447+
expect(getIt.hasScope('Level1'), isTrue);
448+
expect(getIt.hasScope('Level2'), isTrue);
449+
expect(getIt.hasScope('Level3'), isTrue);
450+
});
451+
422452
test('popscope with destructors', () async {
423453
final getIt = GetIt.instance;
424454

@@ -446,6 +476,7 @@ void main() {
446476

447477
expect(disposeCounter, 3);
448478
});
479+
449480
test('popscope with destructors', () async {
450481
final getIt = GetIt.instance;
451482

0 commit comments

Comments
 (0)