| // Copyright (c) 2024, 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'; |
| |
| // Check closure (tear-off, instantiation, static) equality, hash code, and |
| // identities. |
| // |
| // In principle principle unequal objects can have the same hash code, but it's |
| // very unlikely in this test. So we also check that if two closures are not |
| // equal then they should have different hash codes. |
| |
| void staticFunction() {} |
| |
| void genericStaticFunction<T>(T t) {} |
| |
| class C { |
| void memberFunction() {} |
| |
| void genericMemberFunction<T>(T t) {} |
| } |
| |
| void main() { |
| var functionExpression = () {}; |
| |
| var genericFunctionExpression = <T>(T t) {}; |
| |
| check(functionExpression, functionExpression, equal: true, isIdentical: true); |
| check(genericFunctionExpression, genericFunctionExpression, |
| equal: true, isIdentical: true); |
| check(genericFunctionExpression<int>, genericFunctionExpression<int>, |
| equal: true, isIdentical: false); |
| |
| check(() {}, () {}, equal: false, isIdentical: false); |
| |
| check(staticFunction, staticFunction, equal: true, isIdentical: true); |
| check(genericStaticFunction, genericStaticFunction, |
| equal: true, isIdentical: true); |
| check(genericStaticFunction<int>, genericStaticFunction<int>, |
| equal: true, isIdentical: true); |
| |
| final o1 = C(); |
| |
| check(o1.memberFunction, o1.memberFunction, equal: true, isIdentical: false); |
| check(o1.genericMemberFunction, o1.genericMemberFunction, |
| equal: true, isIdentical: false); |
| check(o1.genericMemberFunction<int>, o1.genericMemberFunction<int>, |
| equal: true, isIdentical: false); |
| |
| final o2 = C(); |
| |
| check(o1.memberFunction, o2.memberFunction, equal: false, isIdentical: false); |
| check(o1.genericMemberFunction, o2.genericMemberFunction, |
| equal: false, isIdentical: false); |
| check(o1.genericMemberFunction<int>, o2.genericMemberFunction<int>, |
| equal: false, isIdentical: false); |
| } |
| |
| void check(Object? o1, Object? o2, |
| {required bool equal, required bool isIdentical}) { |
| (equal ? Expect.equals : Expect.notEquals)(o1, o2); |
| (equal ? Expect.equals : Expect.notEquals)(o1.hashCode, o2.hashCode); |
| |
| (isIdentical ? Expect.isTrue : Expect.isFalse)(identical(o1, o2)); |
| } |