Files
sdk/tests/language/switch/enum_compare_test.dart
Nate Biggs e96f6ca6bc [dart2wasm] Add tests for switch case br_table handling.
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>
2025-07-28 17:13:46 -07:00

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();
}