// Copyright (c) 2014, 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

import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';

import 'dart:async';

topLevelFunction() async {}

Future<int> topLevelWithParameter(int a) async {
  return 7 + a;
}

topLevelWithParameterWrongType(int a) async {
  return 7 + a;
}

var what = 'async getter';
Future<String> get topLevelGetter async {
  return 'I want to be an ${what}';
}

class A {
  static int staticVar = 1;

  static staticMethod(int param) async => staticVar + param;
  static get staticGetter async => staticVar + 3;

  int _x;
  A(this._x);

  operator +(A other) async {
    return new A(_x + other._x);
  }

  get value => _x;
}

class B {
  final _y;
  const B._internal(this._y);

  B() : _y = null;
}

main() {
  Future asyncReturn;

  asyncReturn = topLevelFunction();
  Expect.isTrue(asyncReturn is Future);

  asyncReturn = topLevelWithParameter(4);
  Expect.isTrue(asyncReturn is Future);
  asyncStart();
  asyncReturn.then((Object result) {
    Expect.equals(result, 11);
    asyncEnd();
  });

  asyncReturn = topLevelGetter;
  Expect.isTrue(asyncReturn is Future);
  asyncStart();
  asyncReturn.then((Object result) {
    Expect.stringEquals(result, 'I want to be an async getter');
    asyncEnd();
  });

  asyncReturn = A.staticMethod(2);
  Expect.isTrue(asyncReturn is Future);
  asyncStart();
  asyncReturn.then((Object result) {
    Expect.equals(result, 3);
    asyncEnd();
  });

  asyncReturn = A.staticGetter;
  Expect.isTrue(asyncReturn is Future);
  asyncStart();
  asyncReturn.then((Object result) {
    Expect.equals(result, 4);
    asyncEnd();
  });

  A a = new A(13);

  var b = new A(9);
  asyncReturn = a + b;
  Expect.isTrue(asyncReturn is Future);
  asyncStart();
  asyncReturn.then((Object result) {
    Expect.equals((result as A).value, 22);
    asyncEnd();
  });

  var foo = 17;
  bar(int p1, p2) async {
    var z = 8;
    return p2 + z + foo;
  }

  asyncReturn = bar(1, 2);
  Expect.isTrue(asyncReturn is Future);
  asyncStart();
  asyncReturn.then((Object result) {
    Expect.equals(result, 27);
    asyncEnd();
  });

  var moreNesting = (int shadowP1, String p2, num p3) {
    var z = 3;
    aa(int shadowP1) async {
      return foo + z + p3 + shadowP1;
    }

    return aa(6);
  };
  asyncReturn = moreNesting(1, "ignore", 2);
  Expect.isTrue(asyncReturn is Future);
  asyncStart();
  asyncReturn.then((Object result) {
    Expect.equals(result, 28);
    asyncEnd();
  });

  var checkAsync = (var someFunc) {
    var toTest = someFunc();
    Expect.isTrue(toTest is Future);
    asyncStart();
    toTest.then((int result) {
      Expect.equals(result, 4);
      asyncEnd();
    });
  };
  checkAsync(() async => 4);
}
