blob: 4b9d36efaa016e9669b69d0b92930c9eea3318ea [file] [log] [blame]
// Copyright (c) 2019, 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:analyzer/src/error/codes.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(UnnecessaryCastTest);
defineReflectiveTests(UnnecessaryCastTestWithNullSafety);
});
}
@reflectiveTest
class UnnecessaryCastTest extends PubPackageResolutionTest {
test_conditionalExpression_changesResultType_left() async {
await assertNoErrorsInCode(r'''
class A {}
class B extends A {}
dynamic f(bool c, B x, B y) {
return c ? x as A : y;
}
''');
}
test_conditionalExpression_changesResultType_right() async {
await assertNoErrorsInCode(r'''
class A {}
class B extends A {}
dynamic f(bool c, B x, B y) {
return c ? x : y as A;
}
''');
}
test_conditionalExpression_leftDynamic_rightUnnecessary() async {
await assertErrorsInCode(r'''
dynamic f(bool c, int a, int b) {
return c ? a : b as int;
}
''', [
error(HintCode.UNNECESSARY_CAST, 51, 8),
]);
}
test_conditionalExpression_leftUnnecessary() async {
await assertErrorsInCode(r'''
dynamic f(bool c, int a, int b) {
return c ? a as int : b;
}
''', [
error(HintCode.UNNECESSARY_CAST, 47, 8),
]);
}
test_conditionalExpression_leftUnnecessary_rightDynamic() async {
await assertErrorsInCode(r'''
dynamic f(bool c, int a, dynamic b) {
return c ? a as int : b;
}
''', [
error(HintCode.UNNECESSARY_CAST, 51, 8),
]);
}
test_conditionalExpression_leftUnnecessary_rightUnnecessary() async {
await assertErrorsInCode(r'''
dynamic f(bool c, int a, int b) {
return c ? a as int : b as int;
}
''', [
error(HintCode.UNNECESSARY_CAST, 47, 8),
error(HintCode.UNNECESSARY_CAST, 58, 8),
]);
}
test_conditionalExpression_rightUnnecessary() async {
await assertErrorsInCode(r'''
dynamic f(bool c, int a, int b) {
return c ? a : b as int;
}
''', [
error(HintCode.UNNECESSARY_CAST, 51, 8),
]);
}
test_dynamic_type() async {
await assertNoErrorsInCode(r'''
void f(a) {
a as Object;
}
''');
}
test_function_toSubtype_viaParameter() async {
await assertNoErrorsInCode(r'''
void f(void Function(int) a) {
(a as void Function(num))(3);
}
''');
}
test_function_toSubtype_viaReturnType() async {
await assertNoErrorsInCode(r'''
void f(num Function() a) {
(a as int Function())();
}
''');
}
test_function_toSupertype_viaParameter() async {
await assertErrorsInCode(r'''
void f(void Function(num) a) {
(a as void Function(int))(3);
}
''', [
error(HintCode.UNNECESSARY_CAST, 34, 23),
]);
}
test_function_toSupertype_viaReturnType() async {
await assertErrorsInCode(r'''
void f(int Function() a) {
(a as num Function())();
}
''', [
error(HintCode.UNNECESSARY_CAST, 30, 19),
]);
}
test_function_toUnrelated() async {
await assertNoErrorsInCode(r'''
void f(num Function(num) a) {
(a as int Function(int))(3);
}
''');
}
test_function_toUnrelated_generic() async {
await assertNoErrorsInCode(r'''
void f<T extends num>(T Function(T) a) {
(a as int Function(int))(3);
}
''');
}
test_type_dynamic() async {
await assertNoErrorsInCode(r'''
void f() {
Object as dynamic;
}
''');
}
test_type_supertype() async {
await assertErrorsInCode(r'''
void f(int a) {
a as Object;
}
''', [
error(HintCode.UNNECESSARY_CAST, 18, 11),
]);
}
test_type_type() async {
await assertErrorsInCode(r'''
void f(num a) {
a as num;
}
''', [
error(HintCode.UNNECESSARY_CAST, 18, 8),
]);
}
test_typeParameter_hasBound_same() async {
await assertErrorsInCode(r'''
void f<T extends num>(T a) {
a as num;
}
''', [
error(HintCode.UNNECESSARY_CAST, 31, 8),
]);
}
test_typeParameter_hasBound_subtype() async {
await assertErrorsInCode(r'''
void f<T extends int>(T a) {
a as num;
}
''', [
error(HintCode.UNNECESSARY_CAST, 31, 8),
]);
}
test_typeParameter_hasBound_unrelated() async {
await assertNoErrorsInCode(r'''
void f<T extends num>(T a) {
a as String;
}
''');
}
test_typeParameter_noBound() async {
await assertNoErrorsInCode(r'''
void f<T>(T a) {
a as num;
}
''');
}
}
@reflectiveTest
class UnnecessaryCastTestWithNullSafety extends UnnecessaryCastTest
with WithNullSafetyMixin {
test_interfaceType_star_toNone() async {
newFile('$testPackageLibPath/a.dart', content: r'''
// @dart = 2.7
int a = 0;
''');
await assertErrorsInCode(r'''
import 'a.dart';
void f() {
var b = a as int;
b;
}
''', [
error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8),
error(HintCode.UNNECESSARY_CAST, 39, 8),
]);
}
test_interfaceType_star_toQuestion() async {
newFile('$testPackageLibPath/a.dart', content: r'''
// @dart = 2.7
int a = 0;
''');
await assertErrorsInCode(r'''
import 'a.dart';
void f() {
var b = a as int?;
b;
}
''', [
error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8),
]);
}
}