// TODO(multitest): This was automatically migrated from a multitest and may
// contain strange or dead code.

// @dart = 2.9

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

// Signature conformance test.
abstract class CII {
  int id(int x);
}

class CSI {
  String id(int x) => "$x";
}

class CIS {
  int id(String x) => 0;
}

class CTT<T> {
  T id(T x) => x;
}

// Wrong return type.


// Wrong argument type.



// Similar as the above but using an instantiated class instead.
abstract class C5 = CII with CTT<int>;
abstract class C6 extends CII with CTT<int> {}



// Named parameters
abstract class NIIx {
  int id({int x}) => x;
}

class NIIxy {
  int id({int x, int y}) => y;
}

class NIIy {
  int id({int y}) => y;
}

class NII {
  int id(int x) => x;
}

// It's OK to introduce more named parameters.
abstract class N1 = NIIx with NIIxy;
abstract class N2 extends NIIx with NIIxy {}
// It's NOT OK to rename named parameters.


// It's NOT OK to drop named parameters.



class NBABxy<A, B> {
  B id ({A x, B y}) => y;
}

class NTTy<T> {
  T id({T y}) => y;
}

class NTTx<T> {
  T id(T x) => x;
}

// Same as above but with generic classes.
abstract class N7 = NIIx with NBABxy<int, int>;
abstract class N8 extends NIIx with NBABxy<int, int> {}







// Optional positional parameters
abstract class OII {
  int id([int x]) => x;
}

class OIII {
  int id([int x, int y]) => y;
}

class OIIy {
  int id([int y]) => y;
}

class PII {
  int id(int x) => x;
}

// It's OK to introduce more optional parameters.
abstract class O1 = OII with OIII;
abstract class O2 extends OII with OIII {}
// It's OK to rename optional parameters.
abstract class O3 = OII with OIIy;
abstract class O4 extends OII with OIIy {}
// It's NOT OK to drop optional parameters.



class OBAB<A, B> {
  B id ([A x, B y]) => y;
}

class OTTy<T> {
  T id([T y]) => y;
}

class PTT<T> {
  T id(T x) => x;
}

// Same as above but with generic classes.
abstract class O7 = OII with OBAB<int, int>;
abstract class O8 extends OII with OBAB<int, int> {}


abstract class O11 = OII with OTTy<int>;
abstract class O12 extends OII with OTTy<int> {}



// More tests with generic classes.
abstract class GTTnum {
  T id<T extends num>(x);
}

class MTTnum {
  T id<T extends num>(x) => x;
}

class MTTint {
  T id<T extends int>(x) => x;
}

class MTT {
  T id<T>(x) => x;
}

class MTTnumR {
  T id<T extends num, R>(x) => x;
}
class G1 = GTTnum with MTTnum;





void main() {}
