blob: 1ab39f16cbf0203a0c9237090054c587712770ab [file] [log] [blame]
// 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));
}