[tests] Enum shorthands == tests for constructors and static methods.
Add tests similar to what we already have for ==, but with constructors and static methods.
Fix some prior == const tests.
Bug: https://github.com/dart-lang/sdk/issues/57038
Change-Id: Ia6afde353fd16d7dcd767d0514484cae5ac1730b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/401980
Reviewed-by: Erik Ernst <eernst@google.com>
Commit-Queue: Kallen Tu <kallentu@google.com>
diff --git a/tests/language/enum_shorthands/equality/equality_ctor_error_test.dart b/tests/language/enum_shorthands/equality/equality_ctor_error_test.dart
new file mode 100644
index 0000000..1f777e5
--- /dev/null
+++ b/tests/language/enum_shorthands/equality/equality_ctor_error_test.dart
@@ -0,0 +1,503 @@
+// 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.
+
+// Testing erroneous ways of using shorthands with the `==` and `!=` operators.
+
+// SharedOptions=--enable-experiment=enum-shorthands
+
+import '../enum_shorthand_helper.dart';
+
+class ConstConstructorAssert {
+ const ConstConstructorAssert.regular(ConstructorClass ctor)
+ : assert(const .constRegular(1) == ctor);
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const ConstConstructorAssert.named(ConstructorClass ctor)
+ : assert(const .constNamed(x: 1) == ctor);
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const ConstConstructorAssert.optional(ConstructorClass ctor)
+ : assert(const .constOptional(1) == ctor);
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const ConstConstructorAssert.regularExt(ConstructorExt ctor)
+ : assert(const .constRegular(1) == ctor);
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const ConstConstructorAssert.namedExt(ConstructorExt ctor)
+ : assert(const .constNamed(x: 1) == ctor);
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const ConstConstructorAssert.optionalExt(ConstructorExt ctor)
+ : assert(const .constOptional(1) == ctor);
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+}
+
+void notSymmetrical(ConstructorClass ctor, ConstructorExt ctorExt) {
+ const ConstructorClass constCtor = .constRegular(1);
+ const bool symEqRegular = .constRegular(1) == constCtor;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool symEqNamed = .constNamed(x: 1) == constCtor;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool symEqOptional = .constOptional(1) == constCtor;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool symNeqRegular = .constRegular(1) != constCtor;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool symNeqNamed = .constNamed(x: 1) != constCtor;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool symNeqOptional = .constOptional(1) != constCtor;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const ConstructorExt constCtorExt = .constRegular(1);
+ const bool symExtEqRegular = .constRegular(1) == constCtorExt;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool symExtEqNamed = .constNamed(x: 1) == constCtorExt;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool symExtEqOptional = .constOptional(1) == constCtorExt;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool symExtNeqRegular = .constRegular(1) != constCtorExt;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool symExtNeqNamed = .constNamed(x: 1) != constCtorExt;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool symExtNeqOptional = .constOptional(1) != constCtorExt;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.new(1) == ctor) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.regular(1) == ctor) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.named(x: 1) == ctor) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.optional(1) == ctor) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.new(1) != ctor) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.regular(1) != ctor) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.named(x: 1) != ctor) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.optional(1) != ctor) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.new(1) == ctorExt) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.regular(1) == ctorExt) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.named(x: 1) == ctorExt) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.optional(1) == ctorExt) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.new(1) != ctorExt) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.regular(1) != ctorExt) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.named(x: 1) != ctorExt) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.optional(1) != ctorExt) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+}
+
+void rhsNeedsToBeShorthand(
+ ConstructorClass ctor,
+ ConstructorExt ctorExt,
+ bool condition,
+) {
+ const Object obj = true;
+ const bool constCondition = obj as bool;
+
+ const constCtor = .constRegular(1);
+ const bool rhsCtorEq = constCtor == (constCondition ? .constRegular(1) : ConstructorClass.constNamed(x: 1));
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool rhsCtorNeq = constCtor != (constCondition ? ConstructorClass.constOptional(1) : .constRegular(1));
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (ctor == (condition ? .new(1) : .regular(1))) {
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ print('not ok');
+ }
+
+ if (ctor != (condition ? .optional(1) : .named(x: 1))) {
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ print('not ok');
+ }
+
+ if (ctor case == (constCondition ? const .constRegular(1) : const .constNamed(x: 1))) {
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ print('not ok');
+ }
+
+ if (ctor case != (constCondition ? const .constOptional(1) : const .constRegular(1))) {
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ print('not ok');
+ }
+
+ const constCtorExt = .constRegular(1);
+ const bool rhsCtorExtEq = constCtorExt == (constCondition ? .constRegular(1) : ConstructorExt.constNamed(x: 1));
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool rhsCtorExtNeq = constCtorExt != (constCondition ? ConstructorExt.constOptional(1) : .constRegular(1));
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (ctorExt == (condition ? .new(1) : .regular(1))) {
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ print('not ok');
+ }
+
+ if (ctorExt != (condition ? .named(x: 1) : .optional(1))) {
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ print('not ok');
+ }
+
+ if (ctorExt case == (constCondition ? const .constRegular(1) : const .constNamed(x: 1))) {
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ print('not ok');
+ }
+
+ if (ctorExt case != (constCondition ? const .constOptional(1) : const .constRegular(1))) {
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ print('not ok');
+ }
+}
+
+void objectContextType(ConstructorClass ctor, ConstructorExt ctorExt) {
+ const ConstructorClass constCtor = .constRegular(1);
+ const bool contextTypeCtorEqRegular = (constCtor as Object) == .constRegular(1);
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool contextTypeCtorEqNamed = (constCtor as Object) == .constNamed(x: 1);
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool contextTypeCtorEqOptional = (constCtor as Object) == .constOptional(1);
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool contextTypeCtorNeqRegular = (constCtor as Object) != .constRegular(1);
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool contextTypeCtorNeqNamed = (constCtor as Object) != .constNamed(x: 1);
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool contextTypeCtorNeqOptional = (constCtor as Object) != .constOptional(1);
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctor as Object) == .new(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctor as Object) == .regular(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctor as Object) == .named(x: 1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctor as Object) == .optional(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctor as Object) != .new(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctor as Object) != .regular(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctor as Object) != .named(x: 1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctor as Object) != .optional(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctor as Object) case == const .constRegular(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctor as Object) case == const .constNamed(x: 1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctor as Object) case == const .constOptional(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctor as Object) case != const .constRegular(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctor as Object) case != const .constNamed(x: 1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctor as Object) case != const .constOptional(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const ConstructorExt constCtorExt = .constRegular(1);
+ const bool contextTypeCtorExtEqRegular = (constCtorExt as Object) == .constRegular(1);
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool contextTypeCtorExtEqNamed = (constCtorExt as Object) == .constNamed(x: 1);
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool contextTypeCtorExtEqOptional = (constCtorExt as Object) == .constOptional(1);
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool contextTypeCtorExtNeqRegular = (constCtorExt as Object) != .constRegular(1);
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool contextTypeCtorExtNeqNamed = (constCtorExt as Object) != .constNamed(x: 1);
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ const bool contextTypeCtorExtNeqOptional = (constCtorExt as Object) != .constOptional(1);
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctorExt as Object) == .new(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctorExt as Object) == .regular(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctorExt as Object) == .named(x: 1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctorExt as Object) == .optional(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctorExt as Object) != .new(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctorExt as Object) != .regular(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctorExt as Object) != .named(x: 1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctorExt as Object) != .optional(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctorExt as Object) case == const .constRegular(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctorExt as Object) case == const .constNamed(x: 1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctorExt as Object) case == const .constOptional(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctorExt as Object) case != const .constRegular(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctorExt as Object) case != const .constNamed(x: 1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((ctorExt as Object) case != const .constOptional(1)) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+}
+
+void main() {
+ ConstructorClass ctor = .new(1);
+ const ConstructorClass constCtor = .constRegular(1);
+ ConstructorExt ctorExt = .new(1);
+ const ConstructorExt constCtorExt = .constRegular(1);
+
+ notSymmetrical(ctor, ctorExt);
+ rhsNeedsToBeShorthand(ctor, ctorExt, true);
+ rhsNeedsToBeShorthand(ctor, ctorExt, false);
+ objectContextType(ctor, ctorExt);
+
+ // Test the constant evaluation for enum shorthands in const constructor
+ // asserts.
+ const ConstConstructorAssert.regular(constCtor);
+ const ConstConstructorAssert.named(constCtor);
+ const ConstConstructorAssert.optional(constCtor);
+ const ConstConstructorAssert.regularExt(constCtorExt);
+ const ConstConstructorAssert.namedExt(constCtorExt);
+ const ConstConstructorAssert.optionalExt(constCtorExt);
+}
diff --git a/tests/language/enum_shorthands/equality/equality_ctor_test.dart b/tests/language/enum_shorthands/equality/equality_ctor_test.dart
new file mode 100644
index 0000000..7a9cc78
--- /dev/null
+++ b/tests/language/enum_shorthands/equality/equality_ctor_test.dart
@@ -0,0 +1,98 @@
+// 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.
+
+// Testing the == and != behaviour for enum shorthands with constructors.
+
+// SharedOptions=--enable-experiment=enum-shorthands
+
+import '../enum_shorthand_helper.dart';
+
+class ConstConstructorAssert {
+ const ConstConstructorAssert.regular(ConstructorClass ctor)
+ : assert(ctor == const .constRegular(1));
+
+ const ConstConstructorAssert.named(ConstructorClass ctor)
+ : assert(ctor == const .constNamed(x: 1));
+
+ const ConstConstructorAssert.optional(ConstructorClass ctor)
+ : assert(ctor == const .constOptional(1));
+
+ const ConstConstructorAssert.regularExt(ConstructorExt ctor)
+ : assert(ctor == const .constRegular(1));
+
+ const ConstConstructorAssert.namedExt(ConstructorExt ctor)
+ : assert(ctor == const .constNamed(x: 1));
+
+ const ConstConstructorAssert.optionalExt(ConstructorExt ctor)
+ : assert(ctor == const .constOptional(1));
+}
+
+void main() {
+ ConstructorClass ctor = ConstructorClass(1);
+ const ConstructorClass constCtor = .constRegular(1);
+
+ const bool constEqRegular = constCtor == .constRegular(1);
+ const bool constEqNamed = constCtor == .constNamed(x: 1);
+ const bool constEqOptional = constCtor == .constOptional(1);
+
+ const bool constNeqRegular = constCtor != .constRegular(1);
+ const bool constNeqNamed = constCtor != .constNamed(x: 1);
+ const bool constNeqOptional = constCtor != .constOptional(1);
+
+ if (ctor == .new(1)) print('ok');
+ if (ctor == .regular(1)) print('ok');
+ if (ctor == .named(x: 1)) print('ok');
+ if (ctor == .optional(1)) print('ok');
+
+ if (ctor case == const .constRegular(1)) print('ok');
+ if (ctor case == const .constNamed(x: 1)) print('ok');
+ if (ctor case == const .constOptional(1)) print('ok');
+
+ if (ctor != .new(1)) print('ok');
+ if (ctor != .regular(1)) print('ok');
+ if (ctor != .named(x: 1)) print('ok');
+ if (ctor != .optional(1)) print('ok');
+
+ if (ctor case != const .constRegular(1)) print('ok');
+ if (ctor case != const .constNamed(x: 1)) print('ok');
+ if (ctor case != const .constOptional(1)) print('ok');
+
+ ConstructorExt ctorExt = ConstructorExt(1);
+ const ConstructorExt constCtorExt = .constRegular(1);
+
+ const bool constEqRegularExt = constCtorExt == .constRegular(1);
+ const bool constEqNamedExt = constCtorExt == .constNamed(x: 1);
+ const bool constEqOptionalExt = constCtorExt == .constOptional(1);
+
+ const bool constNeqRegularExt = constCtorExt != .constRegular(1);
+ const bool constNeqNamedExt = constCtorExt != .constNamed(x: 1);
+ const bool constNeqOptionalExt = constCtorExt != .constOptional(1);
+
+ if (ctorExt == .new(1)) print('ok');
+ if (ctorExt == .regular(1)) print('ok');
+ if (ctorExt == .named(x: 1)) print('ok');
+ if (ctorExt == .optional(1)) print('ok');
+
+ if (ctorExt case == const .constRegular(1)) print('ok');
+ if (ctorExt case == const .constNamed(x: 1)) print('ok');
+ if (ctorExt case == const .constOptional(1)) print('ok');
+
+ if (ctorExt != .new(1)) print('ok');
+ if (ctorExt != .regular(1)) print('ok');
+ if (ctorExt != .named(x: 1)) print('ok');
+ if (ctorExt != .optional(1)) print('ok');
+
+ if (ctorExt case != const .constRegular(1)) print('ok');
+ if (ctorExt case != const .constNamed(x: 1)) print('ok');
+ if (ctorExt case != const .constOptional(1)) print('ok');
+
+ // Test the constant evaluation for enum shorthands in const constructor
+ // asserts.
+ const ConstConstructorAssert.regular(constCtor);
+ const ConstConstructorAssert.named(constCtor);
+ const ConstConstructorAssert.optional(constCtor);
+ const ConstConstructorAssert.regularExt(constCtorExt);
+ const ConstConstructorAssert.namedExt(constCtorExt);
+ const ConstConstructorAssert.optionalExt(constCtorExt);
+}
diff --git a/tests/language/enum_shorthands/equality/equality_error_test.dart b/tests/language/enum_shorthands/equality/equality_error_test.dart
index 992786b..c60fb77 100644
--- a/tests/language/enum_shorthands/equality/equality_error_test.dart
+++ b/tests/language/enum_shorthands/equality/equality_error_test.dart
@@ -60,32 +60,36 @@
void notSymmetrical(Color color, Integer integer, IntegerExt integerExt,
IntegerMixin integerMixin) {
- const bool symBlueEq = .blue == color;
+ const constColor = Color.blue;
+
+ const bool symBlueEq = .blue == constColor;
// ^
// [analyzer] unspecified
// [cfe] unspecified
- const bool symBlueNeq = .blue != color;
+ const bool symBlueNeq = .blue != constColor;
// ^
// [analyzer] unspecified
// [cfe] unspecified
- const bool symOneEq = .one == integer;
+ const constInteger = Integer.constOne;
+ const bool symOneEq = .one == constInteger;
// ^
// [analyzer] unspecified
// [cfe] unspecified
- const bool symOneNeq = .one != integer;
+ const bool symOneNeq = .one != constInteger;
// ^
// [analyzer] unspecified
// [cfe] unspecified
- const bool symOneExtEq = .one == integerExt;
+ const constIntegerExt = IntegerExt.constOne;
+ const bool symOneExtEq = .one == constIntegerExt;
// ^
// [analyzer] unspecified
// [cfe] unspecified
- const bool symOneExtNeq = .one != integerExt;
+ const bool symOneExtNeq = .one != constIntegerExt;
// ^
// [analyzer] unspecified
// [cfe] unspecified
diff --git a/tests/language/enum_shorthands/equality/equality_member_error_test.dart b/tests/language/enum_shorthands/equality/equality_member_error_test.dart
new file mode 100644
index 0000000..828c179
--- /dev/null
+++ b/tests/language/enum_shorthands/equality/equality_member_error_test.dart
@@ -0,0 +1,178 @@
+// 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.
+
+// Testing erroneous ways of using shorthands with the `==` and `!=` operators
+// for static members.
+
+// SharedOptions=--enable-experiment=enum-shorthands
+
+import '../enum_shorthand_helper.dart';
+
+void notSymmetrical(StaticMember member, StaticMemberExt memberExt) {
+ bool eq = .member() == member;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ bool eqType = .memberType<String, int>('s') == member;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ bool neq = .member() != member;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ bool neqType = .memberType<String, int>('s') != member;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ bool eqExt = .member() == memberExt;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ bool eqTypeExt = .memberType<String, int>('s') == memberExt;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ bool neqExt = .member() != memberExt;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ bool neqTypeExt = .memberType<String, int>('s') != memberExt;
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.member() == member) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.memberType<String, int>('s') == member) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.member() != member) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.memberType<String, int>('s') != member) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.member() == memberExt) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.memberType<String, int>('s') == memberExt) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.member() != memberExt) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if (.memberType<String, int>('s') != memberExt) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+}
+
+void rhsNeedsToBeShorthand(
+ StaticMember member,
+ StaticMemberExt memberExt,
+ bool condition,
+) {
+ if (member == (condition ? .member() : .memberType<String, int>('s'))) {
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ print('not ok');
+ }
+
+ if (member != (condition ? .member() : .memberType<String, int>('s'))) {
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ print('not ok');
+ }
+
+ if (memberExt == (condition ? .member() : .memberType<String, int>('s'))) {
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ print('not ok');
+ }
+
+ if (memberExt != (condition ? .member() : .memberType<String, int>('s'))) {
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ print('not ok');
+ }
+}
+
+void objectContextType(StaticMember member, StaticMemberExt memberExt) {
+ if ((member as Object) == .member()) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((member as Object) == .memberType<String, int>('s')) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((member as Object) != .member()) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((member as Object) != .memberType<String, int>('s')) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((memberExt as Object) == .member()) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((memberExt as Object) == .memberType<String, int>('s')) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((memberExt as Object) != .member()) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ if ((memberExt as Object) != .memberType<String, int>('s')) print('not ok');
+ // ^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+}
+
+void main() {
+ StaticMember member = .member();
+ StaticMemberExt memberExt = .member();
+
+ notSymmetrical(member, memberExt);
+ rhsNeedsToBeShorthand(member, memberExt, true);
+ rhsNeedsToBeShorthand(member, memberExt, false);
+ objectContextType(member, memberExt);
+}
diff --git a/tests/language/enum_shorthands/equality/equality_member_test.dart b/tests/language/enum_shorthands/equality/equality_member_test.dart
new file mode 100644
index 0000000..6a7b2b2
--- /dev/null
+++ b/tests/language/enum_shorthands/equality/equality_member_test.dart
@@ -0,0 +1,28 @@
+// 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.
+
+// Testing the == and != behaviour for enum shorthands with static members.
+
+// SharedOptions=--enable-experiment=enum-shorthands
+
+import '../enum_shorthand_helper.dart';
+
+void main() {
+ // Enum
+ StaticMember member = .member();
+
+ bool eq = member == .member();
+ bool neq = member != .member();
+
+ if (member == .member()) print('ok');
+ if (member != .member()) print('ok');
+
+ StaticMember<String> memberType = .memberType<String, int>('s');
+
+ bool eqType = memberType == .memberType<String, int>('s');
+ bool neqType = memberType != .memberType<String, int>('s');
+
+ if (memberType == .memberType<String, int>('s')) print('ok');
+ if (memberType != .memberType<String, int>('s')) print('ok');
+}