From e9529d18416d5917fcfae7cbe58fee4be5696275 Mon Sep 17 00:00:00 2001 From: Stephen Adams Date: Tue, 11 Apr 2023 18:58:42 +0000 Subject: [PATCH] Add test for moving past end of sync* iterator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I4dd80cd7fc5875cb0d677f45683e3a2652165cc1 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/294163 Commit-Queue: Stephen Adams Reviewed-by: Ömer Ağacan --- .../sync_star/move_past_end_test.dart | 65 ++++++++++++++++++ .../sync_star/move_past_end_test.dart | 67 +++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 tests/language/sync_star/move_past_end_test.dart create mode 100644 tests/language_2/sync_star/move_past_end_test.dart diff --git a/tests/language/sync_star/move_past_end_test.dart b/tests/language/sync_star/move_past_end_test.dart new file mode 100644 index 00000000000..e62e0d58233 --- /dev/null +++ b/tests/language/sync_star/move_past_end_test.dart @@ -0,0 +1,65 @@ +// Copyright (c) 2023, 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. + +// Test program for sync* generator functions that have their iterator moved +// past the end. Moving past the end should not cause re-execution of parts of +// the generator. + +import "package:expect/expect.dart"; + +String log = ''; + +Iterable simpleGenerator() sync* { + log += 'a'; + yield 1; + log += 'b'; + yield 2; + log += 'c'; +} + +Iterable compoundGenerator() sync* { + log += 'X'; + yield* simpleGenerator(); + log += 'Y'; + yield* simpleGenerator(); + log += 'Z'; +} + +void testSimple() { + log = ''; + Expect.equals('12', simpleGenerator().join()); + Expect.equals('abc', log); + + log = ''; + final iterator = simpleGenerator().iterator; + Expect.isTrue(iterator.moveNext()); + Expect.isTrue(iterator.moveNext()); + Expect.isFalse(iterator.moveNext()); + Expect.isFalse(iterator.moveNext()); + Expect.isFalse(iterator.moveNext()); + Expect.equals('abc', log); +} + +void testCompound() { + log = ''; + Expect.equals('1212', compoundGenerator().join()); + Expect.equals('XabcYabcZ', log); + + log = ''; + final iterator = compoundGenerator().iterator; + Expect.isTrue(iterator.moveNext()); + Expect.isTrue(iterator.moveNext()); + Expect.isTrue(iterator.moveNext()); + Expect.isTrue(iterator.moveNext()); + Expect.isFalse(iterator.moveNext()); + Expect.isFalse(iterator.moveNext()); + Expect.isFalse(iterator.moveNext()); + Expect.equals('XabcYabcZ', log); +} + +void main() { + for (final test in [testSimple, testCompound]) { + test(); + } +} diff --git a/tests/language_2/sync_star/move_past_end_test.dart b/tests/language_2/sync_star/move_past_end_test.dart new file mode 100644 index 00000000000..e389698e4ea --- /dev/null +++ b/tests/language_2/sync_star/move_past_end_test.dart @@ -0,0 +1,67 @@ +// Copyright (c) 2023, 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. + +// @dart = 2.9 + +// Test program for sync* generator functions that have their iterator moved +// past the end. Moving past the end should not cause re-execution of parts of +// the generator. + +import "package:expect/expect.dart"; + +String log = ''; + +Iterable simpleGenerator() sync* { + log += 'a'; + yield 1; + log += 'b'; + yield 2; + log += 'c'; +} + +Iterable compoundGenerator() sync* { + log += 'X'; + yield* simpleGenerator(); + log += 'Y'; + yield* simpleGenerator(); + log += 'Z'; +} + +void testSimple() { + log = ''; + Expect.equals('12', simpleGenerator().join()); + Expect.equals('abc', log); + + log = ''; + final iterator = simpleGenerator().iterator; + Expect.isTrue(iterator.moveNext()); + Expect.isTrue(iterator.moveNext()); + Expect.isFalse(iterator.moveNext()); + Expect.isFalse(iterator.moveNext()); + Expect.isFalse(iterator.moveNext()); + Expect.equals('abc', log); +} + +void testCompound() { + log = ''; + Expect.equals('1212', compoundGenerator().join()); + Expect.equals('XabcYabcZ', log); + + log = ''; + final iterator = compoundGenerator().iterator; + Expect.isTrue(iterator.moveNext()); + Expect.isTrue(iterator.moveNext()); + Expect.isTrue(iterator.moveNext()); + Expect.isTrue(iterator.moveNext()); + Expect.isFalse(iterator.moveNext()); + Expect.isFalse(iterator.moveNext()); + Expect.isFalse(iterator.moveNext()); + Expect.equals('XabcYabcZ', log); +} + +void main() { + for (final test in [testSimple, testCompound]) { + test(); + } +}