// Copyright (c) 2014, 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";

class A {
  const A();
  const factory A.B() = B;
  const factory A.C() = C;
  const factory A.C2() = D;
}

class B implements A {
  const B();

  operator ==(o) => true; // //# 00: compile-time error
}

class C implements D {
  final int x;
  const C() : x = 0;
  const C.fromD() : x = 1;
}

class D implements A {
  int get x => 0;
  const factory D() = C.fromD;
}

main() {
  switch (new B()) {
    case const A.B(): Expect.fail("bad switch"); break; // //# 00: continued
  }

  switch (new C()) {
    case const C():
      Expect.fail("bad switch");
      break;
    case const A.C():
      Expect.fail("bad switch");
      break;
    case const A.C2():
      Expect.fail("bad switch");
      break;
    case const A(): Expect.fail("bad switch"); break; // //# 01: compile-time error
  }

  switch (new A()) {
    case const A():
      Expect.fail("bad switch");
      break;
    case const A.B(): Expect.fail("bad switch"); break; // //# 02: compile-time error
  }
}
