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

// @dart = 2.9

// Tests that equality is allowed for receivers of specific types.

import "package:expect/expect.dart";

main() {
  const c = C(); // Does not override operator==.
  const d = D(); // Overrides operator==.

  // Allowed if receiver is int, double, String, bool or Null, ...
  Expect.isTrue(const T.eq(1, 1).value);
  Expect.isTrue(const T.eq(1.5, 1.5).value);
  Expect.isTrue(const T.eq("", "").value);
  Expect.isTrue(const T.eq(true, true).value);
  Expect.isTrue(const T.eq(null, null).value);

  Expect.isFalse(const T.eq(1, c).value);
  Expect.isFalse(const T.eq(1.5, c).value);
  Expect.isFalse(const T.eq("", c).value);
  Expect.isFalse(const T.eq(true, c).value);
  Expect.isFalse(const T.eq(null, c).value);

  Expect.isFalse(const T.eq(1, d).value);
  Expect.isFalse(const T.eq(1.5, d).value);
  Expect.isFalse(const T.eq("", d).value);
  Expect.isFalse(const T.eq(true, d).value);
  Expect.isFalse(const T.eq(null, d).value);

  // ... or if second operand is Null.
  Expect.isFalse(const T.eq(1, null).value);
  Expect.isFalse(const T.eq(1.5, null).value);
  Expect.isFalse(const T.eq("", null).value);
  Expect.isFalse(const T.eq(false, null).value);
  Expect.isFalse(const T.eq(c, null).value);
  Expect.isFalse(const T.eq(d, null).value);

  // Otherwise not allowed.
  const T.eq(c, c); //# 01: compile-time error
  const T.eq(c, 1); //# 02: compile-time error
  const T.eq(c, ""); //# 03: compile-time error
  const T.eq(E.value1, E.value2); //# 04: compile-time error
}

class T {
  final Object value;
  const T.eq(Object o1, Object o2) : value = o1 == o2;
}

/// Class that does not override operator==.
class C {
  const C();
}

/// Class that overrides operator==.
class D {
  const D();
  bool operator ==(Object other) => identical(this, other);
}

enum E { value1, value2 }
