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

import "package:expect/expect.dart";

abstract class Mixin {
  // Declares an instance variable.
  // Declaration would be valid in a "const class", but mixin application
  // won't get const constructor forwarders.
  final int y = 0;

  int get x;
  int get m => x;
}

class Base {
  final int x;

  // Non-const constructors.
  Base.c1(this.x);
  Base.c2([this.x = 37]);
  Base.c3({this.x = 37});

  // Non-forwarding generative const constructors.
  const Base.c4(this.x);
  const Base.c5([this.x = 37]);
  const Base.c6({this.x = 37});

  // Forwarding generative const constructors.
  const Base.c7(int x) : this.c4(x);
  const Base.c8([int x = 87]) : this.c4(x);
  const Base.c9({int x = 87}) : this.c4(x);
  const Base.c10(int x) : this.c5(x);
  const Base.c11([int x = 87]) : this.c5(x);
  const Base.c12({int x = 87}) : this.c5(x);
  const Base.c13(int x) : this.c6(x: x);
  const Base.c14([int x = 87]) : this.c6(x: x);
  const Base.c15({int x = 87}) : this.c6(x: x);

  // Non-generative constructor.
  const factory Base() = Base.c5;
}

class Application = Base with Mixin;

class Application2 extends Base with Mixin {}

main() {
  Expect.equals(42, new Application.c1(42).m);
  Expect.equals(42, new Application.c2(42).m);
  Expect.equals(42, new Application.c3(x: 42).m);
  Expect.equals(42, new Application.c4(42).m);
  Expect.equals(42, new Application.c5(42).m);
  Expect.equals(42, new Application.c6(x: 42).m);
  Expect.equals(42, new Application.c7(42).m);
  Expect.equals(42, new Application.c8(42).m);
  Expect.equals(42, new Application.c9(x: 42).m);
  Expect.equals(42, new Application.c10(42).m);
  Expect.equals(42, new Application.c11(42).m);
  Expect.equals(42, new Application.c12(x: 42).m);
  Expect.equals(42, new Application.c13(42).m);
  Expect.equals(42, new Application.c14(42).m);
  Expect.equals(42, new Application.c15(x: 42).m);

  Expect.equals(37, new Application.c2().m);
  Expect.equals(37, new Application.c3().m);
  Expect.equals(37, new Application.c5().m);
  Expect.equals(37, new Application.c6().m);
  Expect.equals(87, new Application.c8().m);
  Expect.equals(87, new Application.c9().m);
  Expect.equals(87, new Application.c11().m);
  Expect.equals(87, new Application.c12().m);
  Expect.equals(87, new Application.c14().m);
  Expect.equals(87, new Application.c15().m);

  Expect.equals(42, new Application2.c1(42).m);
  Expect.equals(42, new Application2.c2(42).m);
  Expect.equals(42, new Application2.c3(x: 42).m);
  Expect.equals(42, new Application2.c4(42).m);
  Expect.equals(42, new Application2.c5(42).m);
  Expect.equals(42, new Application2.c6(x: 42).m);
  Expect.equals(42, new Application2.c7(42).m);
  Expect.equals(42, new Application2.c8(42).m);
  Expect.equals(42, new Application2.c9(x: 42).m);
  Expect.equals(42, new Application2.c10(42).m);
  Expect.equals(42, new Application2.c11(42).m);
  Expect.equals(42, new Application2.c12(x: 42).m);
  Expect.equals(42, new Application2.c13(42).m);
  Expect.equals(42, new Application2.c14(42).m);
  Expect.equals(42, new Application2.c15(x: 42).m);

  Expect.equals(37, new Application2.c2().m);
  Expect.equals(37, new Application2.c3().m);
  Expect.equals(37, new Application2.c5().m);
  Expect.equals(37, new Application2.c6().m);
  Expect.equals(87, new Application2.c8().m);
  Expect.equals(87, new Application2.c9().m);
  Expect.equals(87, new Application2.c11().m);
  Expect.equals(87, new Application2.c12().m);
  Expect.equals(87, new Application2.c14().m);
  Expect.equals(87, new Application2.c15().m);

  // Don't make constructors const if mixin declares instance variable.
  const Application.c4(42); //# 00: compile-time error
  const Application.c5(42); //# 01: compile-time error
  const Application.c6(x: 42); //# 02: compile-time error
  const Application.c7(42); //# 03: compile-time error
  const Application.c8(42); //# 04: compile-time error
  const Application.c9(x: 42); //# 05: compile-time error
  const Application.c10(42); //# 06: compile-time error
  const Application.c11(42); //# 07: compile-time error
  const Application.c12(x: 42); //# 08: compile-time error
  const Application.c13(42); //# 09: compile-time error
  const Application.c14(42); //# 10: compile-time error
  const Application.c15(x: 42); //# 11: compile-time error

  const Application2.c4(42); //# 12: compile-time error
  const Application2.c5(42); //# 13: compile-time error
  const Application2.c6(x: 42); //# 14: compile-time error
  const Application2.c7(42); //# 15: compile-time error
  const Application2.c8(42); //# 16: compile-time error
  const Application2.c9(x: 42); //# 17: compile-time error
  const Application2.c10(42); //# 18: compile-time error
  const Application2.c11(42); //# 19: compile-time error
  const Application2.c12(x: 42); //# 20: compile-time error
  const Application2.c13(42); //# 21: compile-time error
  const Application2.c14(42); //# 22: compile-time error
  const Application2.c15(x: 42); //# 23: compile-time error

  // Only insert forwarders for generative constructors.
  new Application(); //# 24: compile-time error
  new Application2(); //# 25: compile-time error
}
