// 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) {} class C { void memberFunction() {} void genericMemberFunction(T t) {} } void main() { var functionExpression = () {}; var genericFunctionExpression = (T t) {}; check(functionExpression, functionExpression, equal: true, isIdentical: true); check( genericFunctionExpression, genericFunctionExpression, equal: true, isIdentical: true, ); check( genericFunctionExpression, genericFunctionExpression, 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, genericStaticFunction, 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, o1.genericMemberFunction, 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, o2.genericMemberFunction, 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)); }