// 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.

/*@testedFeatures=inference*/
library test;

import 'dart:math' as math;
import 'dart:math' show min;

class C {
  T m<T extends num>(T x, T y) => throw '';
}

test() {
  takeIII(math.max);
  takeDDD(math.max);
  takeNNN(math.max);
  takeIDN(math.max);
  takeDIN(math.max);
  takeIIN(math.max);
  takeDDN(math.max);
  takeIIO(math.max);
  takeDDO(math.max);

  takeOOI(/*error:COULD_NOT_INFER,error:INVALID_CAST_FUNCTION*/ math.max);
  takeIDI(
      /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
  takeDID(
      /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
  takeOON(/*error:COULD_NOT_INFER,error:INVALID_CAST_FUNCTION*/ math.max);
  takeOOO(/*error:COULD_NOT_INFER,error:INVALID_CAST_FUNCTION*/ math.max);

// Also test SimpleIdentifier
  takeIII(min);
  takeDDD(min);
  takeNNN(min);
  takeIDN(min);
  takeDIN(min);
  takeIIN(min);
  takeDDN(min);
  takeIIO(min);
  takeDDO(min);

  takeOOI(/*error:COULD_NOT_INFER,error:INVALID_CAST_FUNCTION*/ min);
  takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
  takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
  takeOON(/*error:COULD_NOT_INFER,error:INVALID_CAST_FUNCTION*/ min);
  takeOOO(/*error:COULD_NOT_INFER,error:INVALID_CAST_FUNCTION*/ min);

// Also PropertyAccess
  takeIII(new C(). /*@target=C.m*/ m);
  takeDDD(new C(). /*@target=C.m*/ m);
  takeNNN(new C(). /*@target=C.m*/ m);
  takeIDN(new C(). /*@target=C.m*/ m);
  takeDIN(new C(). /*@target=C.m*/ m);
  takeIIN(new C(). /*@target=C.m*/ m);
  takeDDN(new C(). /*@target=C.m*/ m);
  takeIIO(new C(). /*@target=C.m*/ m);
  takeDDO(new C(). /*@target=C.m*/ m);

// Note: this is a warning because a downcast of a method tear-off could work
// (derived method can be a subtype):
//
//     class D extends C {
//       S m<S extends num>(Object x, Object y);
//     }
//
// That's legal because we're loosening parameter types.
//
// We do issue the inference error though, similar to generic function calls.
  // Error:COULD_NOT_INFER,info:DOWN_CAST_COMPOSITE
  takeOON(new C() . /*@target=C.m*/ m);
  // Error:COULD_NOT_INFER,info:DOWN_CAST_COMPOSITE
  takeOOO(new C() . /*@target=C.m*/ m);

// Note: this is a warning because a downcast of a method tear-off could work
// in "normal" Dart, due to bivariance.
//
// We do issue the inference error though, similar to generic function calls.
  // Error:COULD_NOT_INFER,info:DOWN_CAST_COMPOSITE
  takeOOI(new C() . /*@target=C.m*/ m);

  // Error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE
  takeIDI(new C() . /*@target=C.m*/ m);
  // Error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE
  takeDID(new C() . /*@target=C.m*/ m);
}

void takeIII(int fn(int a, int b)) {}
void takeDDD(double fn(double a, double b)) {}
void takeIDI(int fn(double a, int b)) {}
void takeDID(double fn(int a, double b)) {}
void takeIDN(num fn(double a, int b)) {}
void takeDIN(num fn(int a, double b)) {}
void takeIIN(num fn(int a, int b)) {}
void takeDDN(num fn(double a, double b)) {}
void takeNNN(num fn(num a, num b)) {}
void takeOON(num fn(Object a, Object b)) {}
void takeOOO(num fn(Object a, Object b)) {}
void takeOOI(int fn(Object a, Object b)) {}
void takeIIO(Object fn(int a, int b)) {}
void takeDDO(Object fn(double a, double b)) {}

main() {}
