Chromium Code Reviews| Index: tests/lib/async/stream_group_by_test.dart |
| diff --git a/tests/lib/async/stream_group_by_test.dart b/tests/lib/async/stream_group_by_test.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..b7a6544c80ca59f3d65159dc40aa6180d9b29ce3 |
| --- /dev/null |
| +++ b/tests/lib/async/stream_group_by_test.dart |
| @@ -0,0 +1,197 @@ |
| +// Copyright (c) 2017, 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. |
| + |
| +library stream_group_by_test; |
| + |
| +import "dart:async"; |
| + |
| +import "package:expect/expect.dart"; |
| +import "package:async_helper/async_helper.dart"; |
| + |
| +int len(x) => x.length; |
| +String wrap(x) => "[$x]"; |
| + |
| +void main() { |
| + asyncStart(); |
| + // groupBy. |
| + test("splits", () async { |
| + var grouped = stringStream.groupBy<int>(len); |
| + var byLength = {}; |
| + await for (StreamGroup<int, String> group in grouped) { |
| + byLength[group.key] = group.values.toList(); |
| + } |
| + Expect.listEquals([1, 2, 4, 3], byLength.keys.toList()); |
| + expectCompletes(byLength[1], ["a", "b"]); |
| + expectCompletes(byLength[2], ["ab"]); |
| + expectCompletes(byLength[3], ["abe", "lea"]); |
| + expectCompletes(byLength[4], ["abel", "bell", "able", "abba"]); |
| + }); |
| + |
| + test("empty", () async { |
| + var grouped = emptyStream.groupBy<int>(len); |
| + var byLength = {}; |
| + await for (StreamGroup<int, String> group in grouped) { |
| + byLength[group.key] = group.values.toList(); |
| + } |
| + Expect.isTrue(byLength.isEmpty); |
| + }); |
| + |
| + test("single group", () async { |
| + var grouped = repeatStream(5, "x").groupBy<int>(len); |
| + var byLength = {}; |
| + await for (StreamGroup<int, String> group in grouped) { |
| + byLength[group.key] = group.values.toList(); |
| + } |
| + Expect.listEquals([1], byLength.keys.toList()); |
| + expectCompletes(byLength[1], ["x", "x", "x", "x", "x"]); |
| + }); |
| + |
| + test("with error", () async { |
| + var grouped = stringErrorStream(3).groupBy<int>(len); |
| + var byLength = {}; |
| + bool caught = false; |
| + try { |
| + await for (StreamGroup<int, String> group in grouped) { |
| + byLength[group.key] = group.values.toList(); |
| + } |
| + } catch (e) { |
| + Expect.equals("BAD", e); |
| + caught = true; |
| + } |
| + Expect.isTrue(caught); |
| + Expect.listEquals([1, 2, 4], byLength.keys.toList()); |
| + expectCompletes(byLength[1], ["a", "b"]); |
| + expectCompletes(byLength[2], ["ab"]); |
| + expectCompletes(byLength[4], ["abel"]); |
| + }); |
| + |
| + // groupValuesBy |
|
floitsch
2017/05/02 12:23:53
Nit. finish with ".".
Lasse Reichstein Nielsen
2017/05/04 11:05:20
Every test below here removed. Problem solved!
|
| + test("splits", () async { |
|
floitsch
2017/05/02 12:23:53
There is already a test called "splits".
Lasse Reichstein Nielsen
2017/05/04 11:05:20
Acknowledged.
|
| + var grouped = stringStream.groupValuesBy<int, String>(len, wrap); |
| + var byLength = {}; |
| + await for (StreamGroup<int, String> group in grouped) { |
| + byLength[group.key] = group.values.toList(); |
| + } |
| + Expect.listEquals([1, 2, 4, 3], byLength.keys.toList()); |
| + expectCompletes(byLength[1], ["[a]", "[b]"]); |
| + expectCompletes(byLength[2], ["[ab]"]); |
| + expectCompletes(byLength[3], ["[abe]", "[lea]"]); |
| + expectCompletes(byLength[4], ["[abel]", "[bell]", "[able]", "[abba]"]); |
| + }); |
| + |
| + test("empty", () async { |
| + var grouped = emptyStream.groupValuesBy<int>(len, wrap); |
| + var byLength = {}; |
| + await for (StreamGroup<int, String> group in grouped) { |
| + byLength[group.key] = group.values.toList(); |
| + } |
| + Expect.isTrue(byLength.isEmpty); |
| + }); |
| + |
| + test("single group", () async { |
| + var grouped = repeatStream(5, "x").groupValuesBy<int>(len, wrap); |
| + var byLength = {}; |
| + await for (StreamGroup<int, String> group in grouped) { |
| + byLength[group.key] = group.values.toList(); |
| + } |
| + Expect.listEquals([1], byLength.keys.toList()); |
| + expectCompletes(byLength[1], ["[x]", "[x]", "[x]", "[x]", "[x]"]); |
| + }); |
| + |
| + test("with error", () async { |
| + var grouped = stringErrorStream(3).groupValuesBy<int>(len, wrap); |
| + var byLength = {}; |
| + bool caught = false; |
| + try { |
| + await for (StreamGroup<int, String> group in grouped) { |
| + byLength[group.key] = group.values.toList(); |
| + } |
| + } catch (e) { |
| + Expect.equals("BAD", e); |
| + caught = true; |
| + } |
| + Expect.isTrue(caught); |
| + Expect.listEquals([1, 2, 4], byLength.keys.toList()); |
| + expectCompletes(byLength[1], ["[a]", "[b]"]); |
| + expectCompletes(byLength[2], ["[ab]"]); |
| + expectCompletes(byLength[4], ["[abel]"]); |
| + }); |
| + |
| + asyncEnd(); |
| +} |
| + |
| +expectCompletes(future, result) { |
| + asyncStart(); |
| + future.then((v) { |
| + if (result is List) { |
| + Expect.listEquals(result, v); |
| + } else { |
| + Expect.equals(v, result); |
| + } |
| + asyncEnd(); |
| + }, onError: (e, s) { |
| + Expect.fail("$e\n$s"); |
| + }); |
| +} |
| + |
| +void test(name, func) { |
| + asyncStart(); |
| + func().then((_) { |
| + asyncEnd(); |
| + }, onError: (e, s) { |
| + Expect.fail("$name: $e\n$s"); |
| + }); |
| +} |
| + |
| +var strings = const [ |
| + "a", |
| + "ab", |
| + "b", |
| + "abel", |
| + "abe", |
| + "bell", |
| + "able", |
| + "abba", |
| + "lea" |
| +]; |
| + |
| +Stream<String> get stringStream async* { |
| + for (var string in strings) { |
| + yield string; |
| + } |
| +} |
| + |
| +Stream get emptyStream async* {} |
| + |
| +Stream repeatStream(int count, value) async* { |
| + for (var i = 0; i < count; i++) { |
| + yield value; |
| + } |
| +} |
| + |
| +// Just some valid stack trace. |
| +var stack = StackTrace.current; |
| + |
| +Stream<String> stringErrorStream(int errorAfter) async* { |
| + for (int i = 0; i < strings.length; i++) { |
| + yield strings[i]; |
| + if (i == errorAfter) { |
| + // Emit error, but continue afterwards. |
| + yield* new Future.error("BAD", stack).asStream(); |
| + } |
| + } |
| +} |
| + |
| +Stream intStream(int count, [int start = 0]) async* { |
| + for (int i = 0; i < count; i++) { |
| + yield start++; |
| + } |
| +} |
| + |
| +Stream timerStream(int count, Duration interval) async* { |
| + for (int i = 0; i < count; i++) { |
| + await new Future.delayed(interval); |
| + yield i; |
| + } |
| +} |