Files
sdk/tests/language/constants_2018/equals_test.dart
T
Robert Nystrom 8f85a9efe4 Migrate language_2/constants_2018 to NNBD.
Change-Id: I52dee4ed475611ce4ea5d0d45914717ff13f5b8b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/141768
Auto-Submit: Bob Nystrom <rnystrom@google.com>
Reviewed-by: Leaf Petersen <leafp@google.com>
2020-04-06 23:32:25 +00:00

64 lines
2.0 KiB
Dart

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