e96f6ca6bc
Catches bug fixed by https://dart-review.googlesource.com/c/sdk/+/442300 Change-Id: I7c3f5439809e6fd3e3403b620ef1fef1db56dbe3 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/442320 Reviewed-by: Nate Bosch <nbosch@google.com> Commit-Queue: Nate Biggs <natebiggs@google.com>
225 lines
4.2 KiB
Dart
225 lines
4.2 KiB
Dart
// Copyright (c) 2025, 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.
|
|
|
|
// Ensure that switch statements with various types compare case expressions
|
|
// to the switch expression value correctly.
|
|
|
|
import 'package:async_helper/async_helper.dart';
|
|
import 'package:expect/expect.dart';
|
|
|
|
enum Animal { cat, dog, mouse, lion, duck }
|
|
|
|
enum LongEnum {
|
|
a,
|
|
b,
|
|
c,
|
|
d,
|
|
e,
|
|
f,
|
|
g,
|
|
h,
|
|
i,
|
|
j,
|
|
k,
|
|
l,
|
|
m,
|
|
n,
|
|
o,
|
|
p,
|
|
q,
|
|
r,
|
|
s,
|
|
t,
|
|
u,
|
|
v,
|
|
w,
|
|
x,
|
|
y,
|
|
z,
|
|
aa,
|
|
ab,
|
|
ac,
|
|
ad,
|
|
ae,
|
|
af,
|
|
ag,
|
|
ah,
|
|
ai,
|
|
aj,
|
|
ak,
|
|
al,
|
|
am,
|
|
an,
|
|
ao,
|
|
ap,
|
|
aq,
|
|
ar,
|
|
as,
|
|
at,
|
|
au,
|
|
av,
|
|
aw,
|
|
ax,
|
|
ay,
|
|
az,
|
|
}
|
|
|
|
const List<String> strings = ['cat', 'dog', 'mouse', 'lion', 'duck'];
|
|
const List<int> ints = [1, 2, 3, 4, 5];
|
|
const List<bool> bools = [true, false];
|
|
|
|
void switches() {
|
|
for (final animal in Animal.values) {
|
|
switch (animal) {
|
|
case Animal.cat:
|
|
Expect.equals(animal, Animal.cat);
|
|
case Animal.dog:
|
|
Expect.equals(animal, Animal.dog);
|
|
case Animal.mouse:
|
|
Expect.equals(animal, Animal.mouse);
|
|
case Animal.lion:
|
|
Expect.equals(animal, Animal.lion);
|
|
case Animal.duck:
|
|
Expect.equals(animal, Animal.duck);
|
|
}
|
|
}
|
|
|
|
final longEnum = LongEnum.ad;
|
|
switch (longEnum) {
|
|
case LongEnum.a:
|
|
Expect.equals(LongEnum.a, LongEnum.a);
|
|
case LongEnum.b:
|
|
Expect.equals(LongEnum.b, LongEnum.b);
|
|
default:
|
|
Expect.equals(longEnum, LongEnum.ad);
|
|
}
|
|
|
|
for (final string in strings) {
|
|
switch (string) {
|
|
case 'cat':
|
|
Expect.equals(string, 'cat');
|
|
case 'dog':
|
|
Expect.equals(string, 'dog');
|
|
case 'mouse':
|
|
Expect.equals(string, 'mouse');
|
|
case 'lion':
|
|
Expect.equals(string, 'lion');
|
|
case 'duck':
|
|
Expect.equals(string, 'duck');
|
|
default:
|
|
Expect.fail('Unknown string');
|
|
}
|
|
}
|
|
|
|
for (final i in ints) {
|
|
switch (i) {
|
|
case 1:
|
|
Expect.equals(i, 1);
|
|
case 2:
|
|
Expect.equals(i, 2);
|
|
case 3:
|
|
Expect.equals(i, 3);
|
|
case 4:
|
|
Expect.equals(i, 4);
|
|
case 5:
|
|
Expect.equals(i, 5);
|
|
default:
|
|
Expect.fail('Unknown int');
|
|
}
|
|
}
|
|
|
|
for (final b in bools) {
|
|
switch (b) {
|
|
case true:
|
|
Expect.isTrue(b);
|
|
case false:
|
|
Expect.isFalse(b);
|
|
}
|
|
}
|
|
}
|
|
|
|
Future<void> asyncSwitches() async {
|
|
for (final animal in Animal.values) {
|
|
switch (animal) {
|
|
case Animal.cat:
|
|
await 'something';
|
|
Expect.equals(animal, Animal.cat);
|
|
case Animal.dog:
|
|
Expect.equals(animal, Animal.dog);
|
|
case Animal.mouse:
|
|
Expect.equals(animal, Animal.mouse);
|
|
case Animal.lion:
|
|
Expect.equals(animal, Animal.lion);
|
|
case Animal.duck:
|
|
Expect.equals(animal, Animal.duck);
|
|
}
|
|
}
|
|
|
|
final longEnum = LongEnum.ad;
|
|
switch (longEnum) {
|
|
case LongEnum.a:
|
|
await 'something';
|
|
Expect.equals(LongEnum.a, LongEnum.a);
|
|
case LongEnum.b:
|
|
Expect.equals(LongEnum.b, LongEnum.b);
|
|
default:
|
|
Expect.equals(longEnum, LongEnum.ad);
|
|
}
|
|
|
|
for (final string in strings) {
|
|
switch (string) {
|
|
case 'cat':
|
|
await 'something';
|
|
Expect.equals(string, 'cat');
|
|
case 'dog':
|
|
Expect.equals(string, 'dog');
|
|
case 'mouse':
|
|
Expect.equals(string, 'mouse');
|
|
case 'lion':
|
|
Expect.equals(string, 'lion');
|
|
case 'duck':
|
|
Expect.equals(string, 'duck');
|
|
default:
|
|
Expect.fail('Unknown string');
|
|
}
|
|
}
|
|
|
|
for (final i in ints) {
|
|
switch (i) {
|
|
case 1:
|
|
await 'something';
|
|
Expect.equals(i, 1);
|
|
case 2:
|
|
Expect.equals(i, 2);
|
|
case 3:
|
|
Expect.equals(i, 3);
|
|
case 4:
|
|
Expect.equals(i, 4);
|
|
case 5:
|
|
Expect.equals(i, 5);
|
|
default:
|
|
Expect.fail('Unknown int');
|
|
}
|
|
}
|
|
|
|
for (final b in bools) {
|
|
switch (b) {
|
|
case true:
|
|
await 'something';
|
|
Expect.isTrue(b);
|
|
case false:
|
|
Expect.isFalse(b);
|
|
}
|
|
}
|
|
}
|
|
|
|
Future<void> main() async {
|
|
asyncStart();
|
|
|
|
switches();
|
|
await asyncSwitches();
|
|
|
|
asyncEnd();
|
|
}
|