| // Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| @Retry(0) |
| @Timeout(Duration(minutes: 2)) |
| |
| import 'dart:async'; |
| import 'dart:io'; |
| |
| import 'package:dwds/shared/batched_stream.dart'; |
| import 'package:test/expect.dart'; |
| import 'package:test/scaffolding.dart'; |
| |
| void main() { |
| group('Batched stream controller', () { |
| test( |
| 'emits batches', |
| () async { |
| const size = 100; |
| const delay = Duration(milliseconds: 1000); |
| |
| final batchOne = List<int>.generate(size, (index) => index); |
| final batchTwo = List<int>.generate(size, (index) => size + index); |
| |
| // Setup controller. |
| final controller = BatchedStreamController<int>(delay: 500); |
| |
| // Verify the output. |
| expect( |
| controller.stream, |
| emitsInOrder([ |
| batchOne, |
| batchTwo, |
| ]), |
| ); |
| |
| // Add input. |
| final inputController = StreamController<int>(); |
| final inputAdded = controller.sink.addStream(inputController.stream); |
| |
| batchOne.forEach(inputController.sink.add); |
| await Future.delayed(delay); |
| batchTwo.forEach(inputController.sink.add); |
| |
| await inputController.close(); |
| await inputAdded; |
| await controller.close(); |
| }, |
| // https://github.com/dart-lang/webdev/issues/2126 |
| skip: Platform.isWindows, |
| ); |
| |
| test('emits all inputs in order', () async { |
| const size = 10; |
| const delay = Duration(milliseconds: 200); |
| |
| // Setup controller. |
| final controller = BatchedStreamController<int>(delay: 500); |
| |
| // Setup output listener. |
| final output = controller.stream.toList(); |
| |
| // Add input. |
| final inputController = StreamController<int>(); |
| final inputAdded = controller.sink.addStream(inputController.stream); |
| |
| final input = List<int>.generate(size, (index) => index); |
| for (var e in input) { |
| inputController.sink.add(e); |
| await Future.delayed(delay); |
| } |
| |
| await inputController.close(); |
| await inputAdded; |
| await controller.close(); |
| |
| // Verify the output. |
| final result = await output; |
| expect(result.length, greaterThan(1)); |
| |
| final flattened = <int>[]; |
| result.forEach(flattened.addAll); |
| expect(flattened, input); |
| }); |
| }); |
| } |