// 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();

class ArgumentsBindingMixin1_t03 {
  S1? m = t1Default;

  void superTest(S1? val) {}
  void superTestPositioned(S1? val, [S1? val2 = t1Default]) {}
  void superTestNamed(S1? val, {S1? val2 = t1Default}) {}
  S1? get superGetter => m;
  void set superSetter(S1? val) {}
}

class ArgumentsBinding1_t03 extends Object with ArgumentsBindingMixin1_t03 {

  test(dynamic t1, dynamic t2) {
    superTest(t1);
    superTestPositioned(t1);
    superTestPositioned(t2, t1);
    superTestNamed(t1);
    superTestNamed(t2, val2: t1);
    superSetter = t1;
    m = t1;
    superGetter;
  }
}

class ArgumentsBindingMixin2_t03<X> {
  void superTest(X val) {}
  void superTestNamed(X val, {required X val2}) {}
  void set superSetter(X val) {}
}

class ArgumentsBinding2_t03<X> extends Object with ArgumentsBindingMixin2_t03<X> {

  test(dynamic t1, dynamic t2) {
    superTest(t1);
    superTestNamed(t2, val2: t1);
    superSetter = t1;
  }
}

test<T>(T t0Instance) {
  if (t0Instance is S0) {
    ArgumentsBinding1_t03 c1 = new ArgumentsBinding1_t03();

    c1.test(t0Instance, t1Instance);
    c1.superTest(t0Instance);
    c1.superTestPositioned(t0Instance);
    c1.superTestPositioned(t1Instance, t0Instance);
    c1.superTestNamed(t0Instance);
    c1.superTestNamed(t1Instance, val2: t0Instance);
    c1.superSetter = t0Instance;
    c1.superGetter;

    // Test type parameters
    ArgumentsBinding2_t03<S1?> c2 = new ArgumentsBinding2_t03<S1?>();
    c2.test(t0Instance, t1Instance);
    c2.superTest(t0Instance);
    c2.superTestNamed(t1Instance, val2: t0Instance);
    c2.superSetter = t0Instance;
  }
}

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