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

// Tests various fields for the `out` variance modifier.

// SharedOptions=--enable-experiment=variance

import "package:expect/expect.dart";

typedef Void2Int = int Function();

class A<out T> {
  final T a = null;
  final T Function() b = () => null;
  T get c => null;
  A<T> get d => this;
  covariant T e;
  void set f(covariant T value) => value;
}

mixin BMixin<out T> {
  final T a = null;
  final T Function() b = () => null;
  T get c => null;
  BMixin<T> get d => this;
  covariant T e;
  void set f(covariant T value) => value;
}

class B with BMixin<int> {}

void testClass() {
  A<int> a = new A();

  Expect.isNull(a.a);

  Expect.type<Void2Int>(a.b);
  Expect.isNull(a.b());

  Expect.isNull(a.c);

  Expect.isNull(a.d.a);

  a.e = 2;
  Expect.equals(2, a.e);

  a.f = 2;
}

void testMixin() {
  B b = new B();

  Expect.isNull(b.a);

  Expect.type<Void2Int>(b.b);
  Expect.isNull(b.b());

  Expect.isNull(b.c);

  Expect.isNull(b.d.a);

  b.e = 2;
  Expect.equals(2, b.e);

  b.f = 2;
}

main() {
  testClass();
  testMixin();
}
