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

/**
 * @assertion We say that a type T0 is a subtype of a type T1 (written T0 <: T1)
 * when:
 * Right Nullable: if T1 is S1? then:
 *  T0 <: T1 iff any of the following hold:
 *  either T0 <: S1
 *  or T0 <: Null
 *  or T0 is X0 and X0 has bound S0 and S0 <: T1
 *  or T0 is X0 & S0 and S0 <: T1
 * @description Check that if type T1 is S1? and T0 is X0 & S0 and S0 <: T1 then
 * T0 is subtype of T1. Test that if type T0 is a subtype of a type T1, then instance
 * of T0 can be be used as an argument of type T1
 * @author sgrekhov@unipro.ru
 */

class S1 {
  const S1();
}

class X0 {}

class S0 extends X0 implements S1 {}

X0 t0Instance = new S0();
S1? t1Instance = const S1();

const t1Default = const S1();

namedArgumentsFunc1(S1? t1, {S1? t2 = t1Default}) {}
positionalArgumentsFunc1(S1? t1, [S1? t2 = t1Default]) {}

namedArgumentsFunc2<X>(X t1, {required X t2}) {}

class ArgumentsBindingClass {
  ArgumentsBindingClass(S1? t1) {}

  ArgumentsBindingClass.named(S1? t1, {S1? t2 = t1Default}) {}
  ArgumentsBindingClass.positional(S1? t1, [S1? t2 = t1Default]) {}

  factory ArgumentsBindingClass.fNamed(S1? t1, {S1? t2 = t1Default}) {
    return new ArgumentsBindingClass.named(t1, t2: t2);
  }
  factory ArgumentsBindingClass.fPositional(S1? t1, [S1? t2 = t1Default]) {
    return new ArgumentsBindingClass.positional(t1, t2);
  }

  static namedArgumentsStaticMethod(S1? t1, {S1? t2 = t1Default}) {}
  static positionalArgumentsStaticMethod(S1? t1, [S1? t2 = t1Default]) {}

  namedArgumentsMethod(S1? t1, {S1? t2 = t1Default}) {}
  positionalArgumentsMethod(S1? t1, [S1? t2 = t1Default]) {}

  set testSetter(S1? val) {}
}

class ArgumentsBindingGen<X> {
  ArgumentsBindingGen(X t1) {}

  ArgumentsBindingGen.named(X t1, {required X t2}) {}

  factory ArgumentsBindingGen.fNamed(X t1, {required X t2}) {
    return new ArgumentsBindingGen.named(t1, t2: t2);
  }

  namedArgumentsMethod(X t1, {required X t2}) {}

  set testSetter(X val) {}
}

test<T>(T t0Instance) {
  if (t0Instance is S0) {
    // test functions
    namedArgumentsFunc1(t0Instance, t2: t0Instance);
    positionalArgumentsFunc1(t0Instance, t0Instance);

    // test class constructors
    ArgumentsBindingClass instance1 = new ArgumentsBindingClass(t0Instance);
    instance1 = new ArgumentsBindingClass.fNamed(t0Instance, t2: t0Instance);
    instance1 = new ArgumentsBindingClass.fPositional(t0Instance, t0Instance);
    instance1 = new ArgumentsBindingClass.named(t0Instance, t2: t0Instance);
    instance1 = new ArgumentsBindingClass.positional(t0Instance, t0Instance);

    // tests methods and setters
    instance1.namedArgumentsMethod(t0Instance, t2: t0Instance);
    instance1.positionalArgumentsMethod(t0Instance, t0Instance);
    instance1.testSetter = t0Instance;

    // test static methods
    ArgumentsBindingClass.namedArgumentsStaticMethod(t0Instance,
        t2: t0Instance);
    ArgumentsBindingClass.positionalArgumentsStaticMethod(
        t0Instance, t0Instance);

    // Test type parameters

    // test generic functions
    namedArgumentsFunc2<S1?>(t0Instance, t2: t0Instance);

    // test generic class constructors
    ArgumentsBindingGen<S1?> instance2 =
        new ArgumentsBindingGen<S1?>(t0Instance);
    instance2 = new ArgumentsBindingGen<S1?>.fNamed(t0Instance, t2: t0Instance);
    instance2 = new ArgumentsBindingGen<S1?>.named(t0Instance, t2: t0Instance);

    // test generic class methods and setters
    instance2.namedArgumentsMethod(t0Instance, t2: t0Instance);
    instance2.testSetter = t0Instance;
  }
}

main() {
  test<X0>(t0Instance);
}
