blob: 1e8db7d2b9a2b5056b200094c2ac697382c958cc [file] [log] [blame]
// Copyright (c) 2023, 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:test_reflective_loader/test_reflective_loader.dart';
import '../rule_test_support.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(NoDuplicateCaseValuesTestLanguage219);
defineReflectiveTests(NoDuplicateCaseValuesTest);
});
}
abstract class BaseNoDuplicateCaseValuesTest extends LintRuleTest {
@override
String get lintRule => 'no_duplicate_case_values';
}
@reflectiveTest
class NoDuplicateCaseValuesTest extends BaseNoDuplicateCaseValuesTest {
test_duplicateConstClassValue_ok() async {
await assertDiagnostics(r'''
class ConstClass {
final int v;
const ConstClass(this.v);
}
void switchConstClass() {
ConstClass v = new ConstClass(1);
switch (v) {
case const ConstClass(1):
case const ConstClass(2):
case const ConstClass(3):
case const ConstClass(2):
default:
}
}
''', [
error(WarningCode.UNREACHABLE_SWITCH_CASE, 237, 4),
]);
}
test_duplicateEnumValue_ok() async {
await assertDiagnostics(r'''
enum E {
one,
two,
three
}
void switchEnum() {
E v = E.one;
switch (v) {
case E.one:
case E.two:
case E.three:
case E.two:
default:
}
}
''', [
// No lint.
error(WarningCode.UNREACHABLE_SWITCH_CASE, 139, 4),
]);
}
test_duplicateIntConstant_ok() async {
await assertDiagnostics(r'''
void switchInt() {
const int A = 1;
int v = 5;
switch (v) {
case 1:
case 2:
case A:
case 2:
case 3:
default:
}
}
''', [
// No lint.
error(WarningCode.UNREACHABLE_SWITCH_CASE, 95, 4),
error(WarningCode.UNREACHABLE_SWITCH_CASE, 107, 4),
]);
}
test_duplicateStringConstant_ok() async {
await assertDiagnostics(r'''
void switchString() {
const String A = 'a';
String v = 'aa';
switch (v) {
case 'aa':
case 'bb':
case A + A:
case 'bb':
case A + 'b':
default:
}
}
''', [
// No lint.
error(WarningCode.UNREACHABLE_SWITCH_CASE, 115, 4),
error(ParserErrorCode.INVALID_CONSTANT_PATTERN_BINARY, 122, 1),
error(WarningCode.UNREACHABLE_SWITCH_CASE, 131, 4),
error(ParserErrorCode.INVALID_CONSTANT_PATTERN_BINARY, 153, 1),
]);
}
}
@reflectiveTest
class NoDuplicateCaseValuesTestLanguage219 extends BaseNoDuplicateCaseValuesTest
with LanguageVersion219Mixin {
test_duplicateConstClassValue() async {
await assertDiagnostics(r'''
class ConstClass {
final int v;
const ConstClass(this.v);
}
void switchConstClass() {
ConstClass v = new ConstClass(1);
switch (v) {
case const ConstClass(1):
case const ConstClass(2):
case const ConstClass(3):
case const ConstClass(2):
default:
}
}
''', [
lint(242, 19),
]);
}
test_duplicateEnumValue() async {
await assertDiagnostics(r'''
enum E {
one,
two,
three
}
void switchEnum() {
E v = E.one;
switch (v) {
case E.one:
case E.two:
case E.three:
case E.two:
default:
}
}
''', [
lint(144, 5),
]);
}
test_duplicateIntConstant() async {
await assertDiagnostics(r'''
void switchInt() {
const int A = 1;
int v = 5;
switch (v) {
case 1:
case 2:
case A:
case 2:
case 3:
default:
}
}
''', [
lint(100, 1),
lint(112, 1),
]);
}
test_duplicateStringConstant() async {
await assertDiagnostics(r'''
void switchString() {
const String A = 'a';
String v = 'aa';
switch (v) {
case 'aa':
case 'bb':
case A + A:
case 'bb':
case A + 'b':
default:
}
}
''', [
lint(120, 5),
lint(136, 4),
]);
}
}