// Copyright (c) 2015, 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 and yielding in try blocks.

import "package:expect/expect.dart";

f() sync* {
  try {
    yield 1;
    throw "three";
  } catch (e) {
    yield 2;
    yield e;
  } finally {
    yield 4;
  }
}

test1() {
  var s = f().toString();
  Expect.equals("(1, 2, three, 4)", s);
  print(s);
}

g() sync* {
  try {
    yield "a";
    throw "pow!";
  } finally {
    yield "b";
  }
}

test2() {
  Iterator i = g().iterator;
  Expect.isTrue(i.moveNext());
  Expect.equals("a", i.current);
  Expect.isTrue(i.moveNext());
  Expect.equals("b", i.current);
  Expect.throws(() => i.moveNext(), (error) => error == "pow!");
}

main() {
  test1(); // //# test1: ok
  test2(); // //# test2: ok
}
