blob: ed63635d22908bb315f65a00f41ec8641e7319c6 [file] [log] [blame]
// Copyright (c) 2022, 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.
// @dart = 2.9
// Test switches that use binary search or a jump table to dispatch cases.
import 'package:expect/expect.dart';
void main() {
Expect.isTrue(duplicateEnum(L._0) == 0);
Expect.isTrue(duplicateEnum(L._1) == 1);
Expect.isTrue(duplicateEnum(L._2) == 2);
Expect.isTrue(duplicateEnum(L._3) == null);
Expect.isTrue(duplicateInt(0) == 0);
Expect.isTrue(duplicateInt(1) == 1);
Expect.isTrue(duplicateInt(2) == 2);
Expect.isTrue(duplicateInt(3) == null);
Expect.isTrue(binarySearchEnumExhaustive(S._0) == 0);
Expect.isTrue(binarySearchEnumExhaustive(S._1) == 1);
Expect.isTrue(binarySearchEnumExhaustive(S._2) == 2);
Expect.isTrue(binarySearchEnumWithDefault(null) == null);
Expect.isTrue(binarySearchEnumWithDefault(S._0) == 0);
Expect.isTrue(binarySearchEnumWithDefault(S._1) == null);
Expect.isTrue(binarySearchEnumWithDefault(S._2) == 2);
Expect.isTrue(binarySearchEnumHole(S._0) == 0);
Expect.isTrue(binarySearchEnumHole(S._1) == null);
Expect.isTrue(binarySearchEnumHole(S._2) == 2);
Expect.isTrue(binarySearchEnumNoLowerBound(S._0) == null);
Expect.isTrue(binarySearchEnumNoLowerBound(S._1) == 1);
Expect.isTrue(binarySearchEnumNoLowerBound(S._2) == 2);
Expect.isTrue(binarySearchEnumNoUpperBound(S._0) == 0);
Expect.isTrue(binarySearchEnumNoUpperBound(S._1) == 1);
Expect.isTrue(binarySearchEnumNoUpperBound(S._2) == null);
Expect.isTrue(binarySearchInt(-2) == null);
Expect.isTrue(binarySearchInt(-1) == -1);
Expect.isTrue(binarySearchInt(0) == 0);
Expect.isTrue(binarySearchInt(1) == 1);
Expect.isTrue(binarySearchInt(2) == null);
Expect.isTrue(binarySearchIntWithDefault(null) == null);
Expect.isTrue(binarySearchIntWithDefault(-1) == null);
Expect.isTrue(binarySearchIntWithDefault(0) == 0);
Expect.isTrue(binarySearchIntWithDefault(1) == null);
Expect.isTrue(binarySearchIntWithDefault(2) == 2);
Expect.isTrue(binarySearchIntWithDefault(3) == null);
Expect.isTrue(jumpTableEnumExhaustive(L._0) == 0);
Expect.isTrue(jumpTableEnumExhaustive(L._1) == 1);
Expect.isTrue(jumpTableEnumExhaustive(L._2) == 2);
Expect.isTrue(jumpTableEnumExhaustive(L._3) == 3);
Expect.isTrue(jumpTableEnumExhaustive(L._4) == 4);
Expect.isTrue(jumpTableEnumExhaustive(L._5) == 5);
Expect.isTrue(jumpTableEnumExhaustive(L._6) == 6);
Expect.isTrue(jumpTableEnumExhaustive(L._7) == 7);
Expect.isTrue(jumpTableEnumExhaustive(L._8) == 8);
Expect.isTrue(jumpTableEnumExhaustive(L._9) == 9);
Expect.isTrue(jumpTableEnumExhaustive(L._10) == 10);
Expect.isTrue(jumpTableEnumExhaustive(L._11) == 11);
Expect.isTrue(jumpTableEnumExhaustive(L._12) == 12);
Expect.isTrue(jumpTableEnumExhaustive(L._13) == 13);
Expect.isTrue(jumpTableEnumExhaustive(L._14) == 14);
Expect.isTrue(jumpTableEnumExhaustive(L._15) == 15);
Expect.isTrue(jumpTableEnumExhaustive(L._16) == 16);
Expect.isTrue(jumpTableEnumWithDefault(null) == null);
Expect.isTrue(jumpTableEnumWithDefault(L._0) == 0);
Expect.isTrue(jumpTableEnumWithDefault(L._1) == 1);
Expect.isTrue(jumpTableEnumWithDefault(L._2) == 2);
Expect.isTrue(jumpTableEnumWithDefault(L._3) == 3);
Expect.isTrue(jumpTableEnumWithDefault(L._4) == 4);
Expect.isTrue(jumpTableEnumWithDefault(L._5) == 5);
Expect.isTrue(jumpTableEnumWithDefault(L._6) == 6);
Expect.isTrue(jumpTableEnumWithDefault(L._7) == 7);
Expect.isTrue(jumpTableEnumWithDefault(L._8) == null);
Expect.isTrue(jumpTableEnumWithDefault(L._9) == 9);
Expect.isTrue(jumpTableEnumWithDefault(L._10) == 10);
Expect.isTrue(jumpTableEnumWithDefault(L._11) == 11);
Expect.isTrue(jumpTableEnumWithDefault(L._12) == 12);
Expect.isTrue(jumpTableEnumWithDefault(L._13) == 13);
Expect.isTrue(jumpTableEnumWithDefault(L._14) == 14);
Expect.isTrue(jumpTableEnumWithDefault(L._15) == 15);
Expect.isTrue(jumpTableEnumWithDefault(L._16) == 16);
Expect.isTrue(jumpTableEnumHole(L._0) == 0);
Expect.isTrue(jumpTableEnumHole(L._1) == null);
Expect.isTrue(jumpTableEnumHole(L._2) == 2);
Expect.isTrue(jumpTableEnumHole(L._3) == 3);
Expect.isTrue(jumpTableEnumHole(L._4) == 4);
Expect.isTrue(jumpTableEnumHole(L._5) == 5);
Expect.isTrue(jumpTableEnumHole(L._6) == 6);
Expect.isTrue(jumpTableEnumHole(L._7) == 7);
Expect.isTrue(jumpTableEnumHole(L._8) == 8);
Expect.isTrue(jumpTableEnumHole(L._9) == 9);
Expect.isTrue(jumpTableEnumHole(L._10) == 10);
Expect.isTrue(jumpTableEnumHole(L._11) == 11);
Expect.isTrue(jumpTableEnumHole(L._12) == 12);
Expect.isTrue(jumpTableEnumHole(L._13) == 13);
Expect.isTrue(jumpTableEnumHole(L._14) == 14);
Expect.isTrue(jumpTableEnumHole(L._15) == 15);
Expect.isTrue(jumpTableEnumHole(L._16) == 16);
Expect.isTrue(jumpTableEnumNoLowerBound(L._0) == null);
Expect.isTrue(jumpTableEnumNoLowerBound(L._1) == 1);
Expect.isTrue(jumpTableEnumNoLowerBound(L._2) == 2);
Expect.isTrue(jumpTableEnumNoLowerBound(L._3) == 3);
Expect.isTrue(jumpTableEnumNoLowerBound(L._4) == 4);
Expect.isTrue(jumpTableEnumNoLowerBound(L._5) == 5);
Expect.isTrue(jumpTableEnumNoLowerBound(L._6) == 6);
Expect.isTrue(jumpTableEnumNoLowerBound(L._7) == 7);
Expect.isTrue(jumpTableEnumNoLowerBound(L._8) == 8);
Expect.isTrue(jumpTableEnumNoLowerBound(L._9) == 9);
Expect.isTrue(jumpTableEnumNoLowerBound(L._10) == 10);
Expect.isTrue(jumpTableEnumNoLowerBound(L._11) == 11);
Expect.isTrue(jumpTableEnumNoLowerBound(L._12) == 12);
Expect.isTrue(jumpTableEnumNoLowerBound(L._13) == 13);
Expect.isTrue(jumpTableEnumNoLowerBound(L._14) == 14);
Expect.isTrue(jumpTableEnumNoLowerBound(L._15) == 15);
Expect.isTrue(jumpTableEnumNoLowerBound(L._16) == 16);
Expect.isTrue(jumpTableEnumNoUpperBound(L._0) == 0);
Expect.isTrue(jumpTableEnumNoUpperBound(L._1) == 1);
Expect.isTrue(jumpTableEnumNoUpperBound(L._2) == 2);
Expect.isTrue(jumpTableEnumNoUpperBound(L._3) == 3);
Expect.isTrue(jumpTableEnumNoUpperBound(L._4) == 4);
Expect.isTrue(jumpTableEnumNoUpperBound(L._5) == 5);
Expect.isTrue(jumpTableEnumNoUpperBound(L._6) == 6);
Expect.isTrue(jumpTableEnumNoUpperBound(L._7) == 7);
Expect.isTrue(jumpTableEnumNoUpperBound(L._8) == 8);
Expect.isTrue(jumpTableEnumNoUpperBound(L._9) == 9);
Expect.isTrue(jumpTableEnumNoUpperBound(L._10) == 10);
Expect.isTrue(jumpTableEnumNoUpperBound(L._11) == 11);
Expect.isTrue(jumpTableEnumNoUpperBound(L._12) == 12);
Expect.isTrue(jumpTableEnumNoUpperBound(L._13) == 13);
Expect.isTrue(jumpTableEnumNoUpperBound(L._14) == 14);
Expect.isTrue(jumpTableEnumNoUpperBound(L._15) == 15);
Expect.isTrue(jumpTableEnumNoUpperBound(L._16) == null);
Expect.isTrue(jumpTableInt(-2) == null);
Expect.isTrue(jumpTableInt(-1) == -1);
Expect.isTrue(jumpTableInt(0) == 0);
Expect.isTrue(jumpTableInt(1) == 1);
Expect.isTrue(jumpTableInt(2) == 2);
Expect.isTrue(jumpTableInt(3) == 3);
Expect.isTrue(jumpTableInt(4) == 4);
Expect.isTrue(jumpTableInt(5) == 5);
Expect.isTrue(jumpTableInt(6) == 6);
Expect.isTrue(jumpTableInt(7) == 7);
Expect.isTrue(jumpTableInt(8) == 8);
Expect.isTrue(jumpTableInt(9) == 9);
Expect.isTrue(jumpTableInt(10) == 10);
Expect.isTrue(jumpTableInt(11) == 11);
Expect.isTrue(jumpTableInt(12) == 12);
Expect.isTrue(jumpTableInt(13) == 13);
Expect.isTrue(jumpTableInt(14) == 14);
Expect.isTrue(jumpTableInt(15) == null);
Expect.isTrue(jumpTableIntWithDefault(null) == null);
Expect.isTrue(jumpTableIntWithDefault(-1) == null);
Expect.isTrue(jumpTableIntWithDefault(0) == 0);
Expect.isTrue(jumpTableIntWithDefault(1) == 1);
Expect.isTrue(jumpTableIntWithDefault(2) == 2);
Expect.isTrue(jumpTableIntWithDefault(3) == 3);
Expect.isTrue(jumpTableIntWithDefault(4) == 4);
Expect.isTrue(jumpTableIntWithDefault(5) == 5);
Expect.isTrue(jumpTableIntWithDefault(6) == 6);
Expect.isTrue(jumpTableIntWithDefault(7) == 7);
Expect.isTrue(jumpTableIntWithDefault(8) == null);
Expect.isTrue(jumpTableIntWithDefault(9) == 9);
Expect.isTrue(jumpTableIntWithDefault(10) == 10);
Expect.isTrue(jumpTableIntWithDefault(11) == 11);
Expect.isTrue(jumpTableIntWithDefault(12) == 12);
Expect.isTrue(jumpTableIntWithDefault(13) == 13);
Expect.isTrue(jumpTableIntWithDefault(14) == 14);
Expect.isTrue(jumpTableIntWithDefault(15) == 15);
Expect.isTrue(jumpTableIntWithDefault(16) == 16);
Expect.isTrue(jumpTableIntWithDefault(17) == null);
}
/// Small enum that is used to test binary search switches.
enum S {
_0,
_1,
_2,
}
/// Large enum that is used to test jump table switches.
///
/// Must have enough values to trigger a jump table (currently 16) + 1 so
/// we can create a jump table switch that is not exhaustive.
enum L {
_0,
_1,
_2,
_3,
_4,
_5,
_6,
_7,
_8,
_9,
_10,
_11,
_12,
_13,
_14,
_15,
_16,
}
int duplicateEnum(L v) {
switch (v) {
case L._0:
return 0;
case L._1:
return 1;
case L._2:
return 2;
case L._1:
return 3;
}
}
int duplicateInt(int v) {
switch (v) {
case 0:
return 0;
case 1:
return 1;
case 2:
return 2;
case 1:
return 3;
}
}
int binarySearchEnumExhaustive(S v) {
switch (v) {
case S._0:
return 0;
case S._1:
return 1;
case S._2:
return 2;
}
}
int binarySearchEnumWithDefault(S v) {
switch (v) {
case S._0:
return 0;
case S._2:
return 2;
default:
return null;
}
}
int binarySearchEnumHole(S v) {
switch (v) {
case S._0:
return 0;
case S._2:
return 2;
}
}
int binarySearchEnumNoLowerBound(S v) {
switch (v) {
case S._1:
return 1;
case S._2:
return 2;
}
}
int binarySearchEnumNoUpperBound(S v) {
switch (v) {
case S._0:
return 0;
case S._1:
return 1;
}
}
int binarySearchInt(int v) {
switch (v) {
case -1:
return -1;
case 0:
return 0;
case 1:
return 1;
}
}
int binarySearchIntWithDefault(int v) {
switch (v) {
case 0:
return 0;
case 2:
return 2;
default:
return null;
}
}
int jumpTableEnumExhaustive(L v) {
switch (v) {
case L._0:
return 0;
case L._1:
return 1;
case L._2:
return 2;
case L._3:
return 3;
case L._4:
return 4;
case L._5:
return 5;
case L._6:
return 6;
case L._7:
return 7;
case L._8:
return 8;
case L._9:
return 9;
case L._10:
return 10;
case L._11:
return 11;
case L._12:
return 12;
case L._13:
return 13;
case L._14:
return 14;
case L._15:
return 15;
case L._16:
return 16;
}
}
int jumpTableEnumWithDefault(L v) {
switch (v) {
case L._0:
return 0;
case L._1:
return 1;
case L._2:
return 2;
case L._3:
return 3;
case L._4:
return 4;
case L._5:
return 5;
case L._6:
return 6;
case L._7:
return 7;
case L._9:
return 9;
case L._10:
return 10;
case L._11:
return 11;
case L._12:
return 12;
case L._13:
return 13;
case L._14:
return 14;
case L._15:
return 15;
case L._16:
return 16;
default:
return null;
}
}
int jumpTableEnumHole(L v) {
switch (v) {
case L._0:
return 0;
case L._2:
return 2;
case L._3:
return 3;
case L._4:
return 4;
case L._5:
return 5;
case L._6:
return 6;
case L._7:
return 7;
case L._8:
return 8;
case L._9:
return 9;
case L._10:
return 10;
case L._11:
return 11;
case L._12:
return 12;
case L._13:
return 13;
case L._14:
return 14;
case L._15:
return 15;
case L._16:
return 16;
}
}
int jumpTableEnumNoLowerBound(L v) {
switch (v) {
case L._1:
return 1;
case L._2:
return 2;
case L._3:
return 3;
case L._4:
return 4;
case L._5:
return 5;
case L._6:
return 6;
case L._7:
return 7;
case L._8:
return 8;
case L._9:
return 9;
case L._10:
return 10;
case L._11:
return 11;
case L._12:
return 12;
case L._13:
return 13;
case L._14:
return 14;
case L._15:
return 15;
case L._16:
return 16;
}
}
int jumpTableEnumNoUpperBound(L v) {
switch (v) {
case L._0:
return 0;
case L._1:
return 1;
case L._2:
return 2;
case L._3:
return 3;
case L._4:
return 4;
case L._5:
return 5;
case L._6:
return 6;
case L._7:
return 7;
case L._8:
return 8;
case L._9:
return 9;
case L._10:
return 10;
case L._11:
return 11;
case L._12:
return 12;
case L._13:
return 13;
case L._14:
return 14;
case L._15:
return 15;
}
}
int jumpTableInt(int v) {
switch (v) {
case -1:
return -1;
case 0:
return 0;
case 1:
return 1;
case 2:
return 2;
case 3:
return 3;
case 4:
return 4;
case 5:
return 5;
case 6:
return 6;
case 7:
return 7;
case 8:
return 8;
case 9:
return 9;
case 10:
return 10;
case 11:
return 11;
case 12:
return 12;
case 13:
return 13;
case 14:
return 14;
}
}
int jumpTableIntWithDefault(int v) {
switch (v) {
case 0:
return 0;
case 1:
return 1;
case 2:
return 2;
case 3:
return 3;
case 4:
return 4;
case 5:
return 5;
case 6:
return 6;
case 7:
return 7;
case 9:
return 9;
case 10:
return 10;
case 11:
return 11;
case 12:
return 12;
case 13:
return 13;
case 14:
return 14;
case 15:
return 15;
case 16:
return 16;
default:
return null;
}
}