// Copyright (c) 2011, 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 testing the use of 'dynamic' in generic types.
// @static-clean

interface Iface<K,V> {
}

class M1<K, V> implements Iface<K, V> {
}

class M2<K> implements Iface<K, dynamic> {
}

class M3 implements Iface<String, dynamic> {
}

typedef dynamic F1<T>(dynamic x, T y);

class HasFieldDynamic {
  HasFieldDynamic() : dynamic = "dynamic" { }
  var dynamic;  // Field named dynamic is allowed.
}

class HasMethodDynamic {
  dynamic() => "dynamic";  // Method named dynamic is allowed.
}

main() {
  M1<dynamic, dynamic> m1 = new M1<dynamic, dynamic>();
  Expect.isTrue(m1 is Iface<dynamic, num>);
  Expect.isTrue(m1 is Iface<String, dynamic>);
  Expect.isTrue(m1 is Iface<String, num>);
  Expect.isTrue(m1 is Iface<num, String>);

  M2<dynamic> m2 = new M2<dynamic>();
  Expect.isTrue(m2 is Iface<dynamic, num>);
  Expect.isTrue(m2 is Iface<String, dynamic>);
  Expect.isTrue(m2 is Iface<String, num>);
  Expect.isTrue(m2 is Iface<num, String>);

  M3 m3 = new M3();
  Expect.isTrue(m3 is Iface<dynamic, num>);
  Expect.isTrue(m3 is Iface<String, dynamic>);
  Expect.isTrue(m3 is Iface<String, num>);
  Expect.isTrue(m3 is !Iface<num, String>);

  F1<int> f1 = (String s, int i) => s[i];
  Expect.isTrue(f1 is F1<int>);

  HasFieldDynamic has_field = new HasFieldDynamic();
  Expect.equals("dynamic", has_field.dynamic);

  HasMethodDynamic has_method = new HasMethodDynamic();
  Expect.equals("dynamic", has_method.dynamic());

  {
    int dynamic = 0;  // Local variable named dynamic is allowed.
    Expect.equals(0, dynamic);
  }
}
