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

// Test that generic methods can be overloaded (a) with widened type bounds, and
// (b) using the bound as the type of the parameter in the overloaded method.

library generic_methods_overriding_test;

import "package:expect/expect.dart";

class X {}

class Y extends X {}

class Z extends Y {}

class C {
  String fun<T extends Y>(T t) => "C";
}

class D extends C {
  String fun<T extends X>(T t) => "D"; //# 01: compile-time error
  String fun<T extends Y>(T t) => "D"; //# 02: ok
}

class E extends C {
  String fun<T>(Y y) => "E"; //# 03: compile-time error
  String fun<T extends Y>(Y y) => "E"; //# 04: ok
}

class F extends C {
  String foobar(Z z) {
    return "FZ";
  }

  String fun<T extends Y>(T t) {
    if (t is Z) {
      return this.foobar(t as Z); //# 05: ok
      return this.foobar(t); //# 06: ok
    }
    return "FY";
  }
}

main() {
  Y y = new Y();
  Z z = new Z();

  C c = new C();
  D d = new D();
  E e = new E();
  F f = new F();

  Expect.equals(c.fun<Y>(y), "C");
  Expect.equals(d.fun<Y>(y), "D"); //# 02: continued
  Expect.equals(e.fun<Y>(y), "E"); //# 04: continued
  Expect.equals(f.fun<Y>(y), "FY"); //# 05: continued
  Expect.equals(f.fun<Z>(z), "FZ"); //# 05: continued
  Expect.equals(f.fun<Y>(y), "FY"); //# 06: continued
  Expect.equals(f.fun<Z>(z), "FZ"); //# 06: continued
}
