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