blob: 03a7c939a618b732a780ff5fc6878db733fec9c5 [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(NonBoolConditionWithoutNullSafetyTest);
defineReflectiveTests(
NonBoolConditionWithoutNullSafetyAndNoImplicitCastsTest);
defineReflectiveTests(NonBoolConditionTest);
defineReflectiveTests(NonBoolConditionWithStrictCastsTest);
});
}
@reflectiveTest
class NonBoolConditionTest extends PubPackageResolutionTest {
test_if_null() async {
await assertErrorsInCode(r'''
void f(Null a) {
if (a) {}
}
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 23, 1),
]);
}
test_ternary_condition_null() async {
await assertErrorsInCode(r'''
void f(Null a) {
a ? 0 : 1;
}
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 19, 1),
]);
}
}
@reflectiveTest
class NonBoolConditionWithoutNullSafetyAndNoImplicitCastsTest
extends PubPackageResolutionTest
with WithoutNullSafetyMixin, WithNoImplicitCastsMixin {
test_map_ifElement_condition_dynamic() async {
await assertErrorsWithNoImplicitCasts(r'''
void f(dynamic c) {
<int, int>{if (c) 0: 0};
}
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 37, 1),
]);
}
test_map_ifElement_condition_object() async {
await assertErrorsWithNoImplicitCasts(r'''
void f(Object c) {
<int, int>{if (c) 0: 0};
}
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 36, 1),
]);
}
test_set_ifElement_condition_dynamic() async {
await assertErrorsWithNoImplicitCasts(r'''
void f(dynamic c) {
<int>{if (c) 0};
}
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 32, 1),
]);
}
test_set_ifElement_condition_object() async {
await assertErrorsWithNoImplicitCasts(r'''
void f(Object c) {
<int>{if (c) 0};
}
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 31, 1),
]);
}
}
@reflectiveTest
class NonBoolConditionWithoutNullSafetyTest extends PubPackageResolutionTest
with WithoutNullSafetyMixin {
test_conditional() async {
await assertErrorsInCode('''
f() { return 3 ? 2 : 1; }
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 13, 1),
]);
}
test_conditional_implicitCast_fromLiteral() async {
await assertErrorsInCode('''
f() { return [1, 2, 3] ? 2 : 1; }
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 13, 9),
]);
}
test_conditional_implicitCast_fromSupertype() async {
await assertNoErrorsInCode('''
Object o;
f() { return o ? 2 : 1; }
''');
}
test_do() async {
await assertErrorsInCode(r'''
f() {
do {} while (3);
}
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 21, 1),
]);
}
test_do_implicitCast_fromLiteral() async {
await assertErrorsInCode('''
Object o;
f() {
do {} while ([1, 2, 3]);
}
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 31, 9),
]);
}
test_do_implicitCast_fromSupertype() async {
await assertNoErrorsInCode('''
Object o;
f() {
do {} while (o);
}
''');
}
test_for() async {
// https://github.com/dart-lang/sdk/issues/24713
await assertErrorsInCode(r'''
f() {
for (;3;) {}
}
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 14, 1),
]);
}
test_for_declaration() async {
// https://github.com/dart-lang/sdk/issues/24713
await assertErrorsInCode(r'''
f() {
for (int i = 0; 3;) {}
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 17, 1),
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 24, 1),
]);
}
test_for_expression() async {
// https://github.com/dart-lang/sdk/issues/24713
await assertErrorsInCode(r'''
f() {
int i;
for (i = 0; 3;) {}
}''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 12, 1),
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 29, 1),
]);
}
test_for_implicitCast_fromLiteral() async {
await assertErrorsInCode('''
f() {
for (;[1, 2, 3];) {}
}
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 14, 9),
]);
}
test_for_implicitCast_fromSupertype() async {
await assertNoErrorsInCode('''
Object o;
f() {
for (;o;) {}
}
''');
}
test_forElement() async {
await assertErrorsInCode('''
var v = [for (; 0;) 1];
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 16, 1),
]);
}
test_if() async {
await assertErrorsInCode(r'''
f() {
if (3) return 2; else return 1;
}
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 12, 1),
]);
}
test_if_implicitCast_fromLiteral() async {
await assertErrorsInCode('''
f() {
if ([1, 2, 3]) return 2; else return 1;
}
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 12, 9),
]);
}
test_if_implicitCast_fromSupertype() async {
await assertNoErrorsInCode('''
f(Object o) {
if (o) return 2; else return 1;
}
''');
}
test_ifElement() async {
await assertErrorsInCode('''
var v = [if (3) 1];
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 13, 1),
]);
}
test_ifElement_implicitCast_fromLiteral() async {
await assertErrorsInCode('''
var v = [if ([1, 2, 3]) 'x'];
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 13, 9),
]);
}
test_ifElement_implicitCast_fromSupertype() async {
await assertNoErrorsInCode('''
Object o;
var v = [if (o) 'x'];
''');
}
test_while() async {
await assertErrorsInCode(r'''
f() {
while (3) {}
}
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 15, 1),
]);
}
test_while_implicitCast_fromLiteral() async {
await assertErrorsInCode('''
f() {
while ([1, 2, 3]) {}
}
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 15, 9),
]);
}
test_while_implicitCast_fromSupertype() async {
await assertNoErrorsInCode('''
f(Object o) {
while (o) {}
}
''');
}
}
@reflectiveTest
class NonBoolConditionWithStrictCastsTest extends PubPackageResolutionTest
with WithStrictCastsMixin {
test_map_ifElement_condition() async {
await assertErrorsWithStrictCasts('''
void f(dynamic c) {
<int, int>{if (c) 0: 0};
}
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 37, 1),
]);
}
test_set_ifElement_condition() async {
await assertErrorsWithStrictCasts('''
void f(dynamic c) {
<int>{if (c) 0};
}
''', [
error(CompileTimeErrorCode.NON_BOOL_CONDITION, 32, 1),
]);
}
}