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

// 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
  var async = 0; // //# 03: syntax error
  bool yield() => false; //# 04: syntax error
  bool await() => false; //# 05: syntax error
  bool async() => false; //# 06: syntax error

  var x1 = sync;
  var x2 = async; // //# 07: syntax error
  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);
}
