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(); + } +}