| // 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<int> simpleGenerator() sync* { |
| log += 'a'; |
| yield 1; |
| log += 'b'; |
| yield 2; |
| log += 'c'; |
| } |
| |
| Iterable<int> 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(); |
| } |
| } |