// 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 test program for constructors and initializers.

// Check that generic closures are properly instantiated.

import 'package:expect/expect.dart';

typedef T F<T>(T x);
typedef R G<T, R>(T x);

class C<T> {
  get f => (T x) => x;
  T g(T x) => x;
}

main() {
  {
    var c = new C<int>();
    var f = c.f;
    var g = c.g;
    Expect.equals("(int) => int", f.runtimeType.toString()); //# 01: ok
    Expect.equals("(Object) => int", g.runtimeType.toString()); //# 01: ok
    Expect.equals(21, f(21));
    Expect.equals(14, g(14));
    Expect.isTrue(f is Function);
    Expect.isTrue(g is Function);
    Expect.isTrue(f is! F);
    Expect.isTrue(g is F);
    Expect.isTrue(f is F<int>);
    Expect.isTrue(g is F<int>);
    Expect.isTrue(f is! F<bool>);
    Expect.isTrue(g is! F<bool>);
    Expect.isTrue(f is G<int, int>);
    Expect.isTrue(g is G<int, int>);
    Expect.isTrue(f is! G<int, bool>);
    Expect.isTrue(g is! G<int, bool>);
    Expect.isTrue(f is! G<Object,int>);
    Expect.isTrue(g is G<Object, int>);
  }

  {
    var c = new C<bool>();
    var f = c.f;
    var g = c.g;
    Expect.equals("(bool) => bool", f.runtimeType.toString()); //# 01: ok
    Expect.equals("(Object) => bool", g.runtimeType.toString()); //# 01: ok
    Expect.isTrue(f is! F);
    Expect.isTrue(g is F);
    Expect.isTrue(f is! F<int>);
    Expect.isTrue(g is! F<int>);
    Expect.isTrue(f is F<bool>);
    Expect.isTrue(g is F<bool>);
  }

  {
    var c = new C();
    var f = c.f;
    var g = c.g;
    Expect.equals("(dynamic) => dynamic", f.runtimeType.toString()); //# 01: ok
    Expect.equals("(Object) => dynamic", g.runtimeType.toString()); //# 01: ok
    Expect.isTrue(f is F);
    Expect.isTrue(g is F);
    Expect.isTrue(f is! F<int>);
    Expect.isTrue(g is! F<int>);
    Expect.isTrue(f is! F<bool>);
    Expect.isTrue(g is! F<bool>);
  }
}
