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

// @dart = 2.9

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;
}

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()) {
//^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS
    case const A.B(): Expect.fail("bad switch"); break;
    //         ^
    // [cfe] Case expression 'B {}' does not have a primitive operator '=='.
  }

  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;
    //   ^^^^^^^^^
    // [analyzer] COMPILE_TIME_ERROR.INCONSISTENT_CASE_EXPRESSION_TYPES
  }

  switch (new A()) {
    case const A():
      Expect.fail("bad switch");
      break;
    case const A.B(): Expect.fail("bad switch"); break;
    //   ^^^^^^^^^^^
    // [analyzer] COMPILE_TIME_ERROR.INCONSISTENT_CASE_EXPRESSION_TYPES
    //         ^
    // [cfe] Case expression 'B {}' does not have a primitive operator '=='.
  }
}
