| // Copyright 2024 The Flutter Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd. | |
| import 'dart:async'; | |
| import 'package:devtools_shared/devtools_shared.dart'; | |
| import 'package:test/test.dart'; | |
| void main() { | |
| group('CompleterExtension', () { | |
| late Completer<int> completer; | |
| setUp(() { | |
| completer = Completer<int>(); | |
| }); | |
| group('safeComplete', () { | |
| int? value; | |
| setUp(() { | |
| value = null; | |
| unawaited(completer.future.then((v) => value = v)); | |
| }); | |
| test('completes successfully', () async { | |
| expect(completer.isCompleted, false); | |
| expect(value, isNull); | |
| completer.safeComplete(5); | |
| await completer.future; | |
| expect(completer.isCompleted, true); | |
| expect(value, 5); | |
| }); | |
| test('does not complete if already completed', () async { | |
| expect(completer.isCompleted, false); | |
| expect(value, isNull); | |
| completer.complete(1); | |
| await completer.future; | |
| expect(completer.isCompleted, true); | |
| expect(value, 1); | |
| completer.safeComplete(5); | |
| expect(completer.isCompleted, true); | |
| expect(value, 1); | |
| String? elseValue; | |
| completer.safeComplete(3, () => elseValue = 'hit orElse'); | |
| expect(completer.isCompleted, true); | |
| expect(value, 1); | |
| expect(elseValue, 'hit orElse'); | |
| }); | |
| }); | |
| group('safeCompleteError', () { | |
| late Future<int> errorFuture; | |
| ({Object error, StackTrace? st})? error; | |
| setUp(() { | |
| unawaited( | |
| errorFuture = completer.future.onError((e, st) { | |
| error = (error: e!, st: st); | |
| return -1; | |
| }), | |
| ); | |
| }); | |
| test('completes successfully', () async { | |
| completer.safeCompleteError('This is an error'); | |
| await errorFuture; | |
| expect(completer.isCompleted, true); | |
| expect(error?.error, 'This is an error'); | |
| }); | |
| test('does not complete if already completed', () async { | |
| completer.safeCompleteError('This is an error'); | |
| await errorFuture; | |
| expect(completer.isCompleted, true); | |
| expect(error?.error, 'This is an error'); | |
| completer.safeCompleteError('This is a different error'); | |
| await errorFuture; | |
| expect(completer.isCompleted, true); | |
| expect(error?.error, 'This is an error'); | |
| }); | |
| }); | |
| }); | |
| } |