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

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

import 'compiler_helper.dart';
import 'parser_helper.dart';

const String TEST = '''
testFunctionStatement() {
  var res;
  closure(a) => res = a;
  closure(42);
  return res;
}

testFunctionExpression() {
  var res;
  var closure = (a) => res = a;
  closure(42);
  return res;
}

var staticField;

testStoredInStatic() {
  var res;
  closure(a) => res = a;
  staticField = closure;
  staticField(42);
  return res;
}

class A {
  var field;
  A(this.field);
  static foo(a) => topLevel3 = a;
}

testStoredInInstance() {
  var res;
  closure(a) => res = a;
  var a = new A(closure);
  a.field(42);
  return res;
}

foo(closure) {
  closure(42);
}

testPassedInParameter() {
  var res;
  closure(a) => res = a;
  foo(closure);
  return res;
}

var topLevel1;
foo2(a) => topLevel1 = a;
testStaticClosure1() {
  var a = foo2;
  a(42);
  return topLevel1;
}

var topLevel2;
bar(a) => topLevel2 = a;
testStaticClosure2() {
  var a = bar;
  a(42);
  var b = bar;
  b(2.5);
  return topLevel2;
}

var topLevel3;
testStaticClosure3() {
  var a = A.foo;
  a(42);
  return topLevel3;
}

var topLevel4;
testStaticClosure4Helper(a) => topLevel4 = a;
testStaticClosure4() {
  var a = testStaticClosure4Helper;
  // Test calling the static after tearing it off.
  testStaticClosure4Helper(2.5);
  a(42);
  return topLevel4;
}

main() {
  testFunctionStatement();
  testFunctionExpression();
  testStoredInStatic();
  testStoredInInstance();
  testPassedInParameter();
  testStaticClosure1();
  testStaticClosure2();
  testStaticClosure3();
  testStaticClosure4();
}
''';

void main() {
  Uri uri = new Uri(scheme: 'source');
  var compiler = compilerFor(TEST, uri);
  asyncTest(() => compiler.runCompiler(uri).then((_) {
    var typesTask = compiler.typesTask;
    var typesInferrer = typesTask.typesInferrer;

    checkType(String name, type) {
      var element = findElement(compiler, name);
      var mask = typesInferrer.getReturnTypeOfElement(element);
      Expect.equals(type.nullable(), mask.simplify(compiler), name);
    }

    checkType('testFunctionStatement', typesTask.uint31Type);
    checkType('testFunctionExpression', typesTask.uint31Type);
    checkType('testStoredInInstance', typesTask.uint31Type);
    checkType('testStoredInStatic', typesTask.uint31Type);
    checkType('testPassedInParameter', typesTask.uint31Type);
    checkType('testStaticClosure1', typesTask.uint31Type);
    checkType('testStaticClosure2', typesTask.numType);
    checkType('testStaticClosure3', typesTask.uint31Type);
    checkType('testStaticClosure4', typesTask.numType);
  }));
}
