blob: e62e0d58233e33a834725316659ad1ea12ef4510 [file] [log] [blame]
// 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();
}
}