// 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

// Simple test program for sync* generator functions.

import "package:expect/expect.dart";
import "dart:async";

var sync = "topLevelSync";
var async = "topLevelAync";
var await = "topLevelAwait";
var yield = "topLevelYield";

test01() sync* {
  var yield = 0; // //# 01: syntax error
  var await = 0; // //# 02: syntax error
  bool yield() => false; //# 04: syntax error
  bool await() => false; //# 05: syntax error

  var x1 = sync;
  var x3 = await; // //# 08: syntax error
  var x4 = await 55; // //# 09: compile-time error
  var x4 = yield; // //# 10: syntax error

  var stream = new Stream.fromIterable([1, 2, 3]);
  await for (var e in stream) print(e); //  //# 11: compile-time error
}

test02() sync* {
  yield 12321;
  return null; // //# 20: compile-time error
}

test03() sync* => null; //  //# 30: syntax error

get test04 sync* => null; // //# 40: syntax error
set test04(a) sync* { print(a); } // //# 41: compile-time error

class K {
  K() sync* {} // //# 50: compile-time error
  get nix sync* {}
  get garnix sync* => null; // //# 51: syntax error
  set etwas(var z) sync* { } // //# 52: compile-time error
  sync() sync* {
    yield sync; // Yields a tear-off of the sync() method.
  }
}

main() {
  var x;
  x = test01();
  Expect.equals("()", x.toString());
  x = test02();
  test03(); //# 30: continued
  Expect.equals("(12321)", x.toString());
  x = test04; // //# 40: continued
  test04 = x; // //# 41: continued
  x = new K();
  print(x.garnix); //# 51: continued
  x.etwas = null; //# 52: continued
  print(x.sync().toList());
  Expect.equals(1, x.sync().length);
//  Expect.isTrue(x.sync().single is Function);
}
