blob: 79f87cec1bab90a26d155a2ef9a52d721f28a8a7 [file] [log] [blame]
// Copyright (c) 2021, 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(
ArgumentTypeNotAssignableToErrorHandler_FutureCatchErrorTest);
defineReflectiveTests(
ArgumentTypeNotAssignableToErrorHandler_FutureThenTest);
defineReflectiveTests(
ArgumentTypeNotAssignableToErrorHandler_StreamHandleErrorTest);
defineReflectiveTests(
ArgumentTypeNotAssignableToErrorHandler_StreamListenTest);
defineReflectiveTests(
ArgumentTypeNotAssignableToErrorHandler_StreamSubscriptionOnErrorTest);
});
}
@reflectiveTest
class ArgumentTypeNotAssignableToErrorHandler_FutureCatchErrorTest
extends PubPackageResolutionTest {
void test_firstParameterIsDynamic() async {
await assertNoErrorsInCode('''
void f(Future<int> future, Future<int> Function(dynamic a) callback) {
future.catchError(callback);
}
''');
}
void test_firstParameterIsNamed() async {
await assertErrorsInCode('''
void f(Future<int> future, Future<int> Function({Object a}) callback) {
future.catchError(callback);
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 92, 8),
]);
}
void test_firstParameterIsOptional() async {
await assertNoErrorsInCode('''
void f(Future<int> future, Future<int> Function([Object a]) callback) {
future.catchError(callback);
}
''');
}
void test_functionExpression_firstParameterIsDynamic() async {
await assertNoErrorsInCode('''
void f(Future<void> future) {
future.catchError((dynamic a) {});
}
''');
}
void test_functionExpression_firstParameterIsImplicit() async {
await assertNoErrorsInCode('''
void f(Future<void> future) {
future.catchError((a) {});
}
''');
}
void test_functionExpression_firstParameterIsNamed() async {
await assertErrorsInCode('''
void f(Future<void> future) {
future.catchError(({Object a = 1}) {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 50, 19),
]);
}
void test_functionExpression_firstParameterIsNullableObject() async {
await assertNoErrorsInCode('''
void f(Future<void> future) {
future.catchError((Object? a) {});
}
''');
}
void test_functionExpression_firstParameterIsOptional() async {
await assertNoErrorsInCode('''
void f(Future<void> future) {
future.catchError(([Object a = 1]) {});
}
''');
}
void test_functionExpression_firstParameterIsVar() async {
await assertNoErrorsInCode('''
void f(Future<void> future) {
future.catchError((var a) {});
}
''');
}
void test_functionExpression_noParameters() async {
await assertErrorsInCode('''
void f(Future<void> future) {
future.catchError(() {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 50, 5),
]);
}
void test_functionExpression_secondParameterIsDynamic() async {
await assertNoErrorsInCode('''
void f(Future<void> future) {
future.catchError((Object a, dynamic b) {});
}
''');
}
void test_functionExpression_secondParameterIsImplicit() async {
await assertNoErrorsInCode('''
void f(Future<void> future) {
future.catchError((Object a, b) {});
}
''');
}
void test_functionExpression_secondParameterIsNamed() async {
await assertErrorsInCode('''
void f(Future<void> future) {
future.catchError((Object a, {required StackTrace b}) {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 50, 38),
]);
}
void test_functionExpression_secondParameterIsNullableStackTrace() async {
await assertNoErrorsInCode('''
void f(Future<void> future) {
future.catchError((Object a, StackTrace? b) {});
}
''');
}
void test_functionExpression_secondParameterIsVar() async {
await assertNoErrorsInCode('''
void f(Future<void> future) {
future.catchError((Object a, var b) {});
}
''');
}
void test_functionExpression_tooManyParameters() async {
await assertErrorsInCode('''
void f(Future<void> future) {
future.catchError((a, b, c) {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 50, 12),
]);
}
void test_functionExpression_wrongFirstParameterType() async {
await assertErrorsInCode('''
void f(Future<void> future) {
future.catchError((String a) {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 50, 13),
]);
}
void test_functionExpression_wrongSecondParameterType() async {
await assertErrorsInCode('''
void f(Future<void> future) {
future.catchError((Object a, String b) {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 50, 23),
]);
}
void test_noParameters() async {
await assertErrorsInCode('''
void f(Future<int> future, Future<int> Function() callback) {
future.catchError(callback);
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 82, 8),
]);
}
void test_okType() async {
await assertNoErrorsInCode('''
void f(Future<int> future, Future<int> Function(Object, StackTrace) callback) {
future.catchError(callback);
}
''');
}
void test_secondParameterIsDynamic() async {
await assertNoErrorsInCode('''
void f(Future<int> future, Future<int> Function(Object a, dynamic b) callback) {
future.catchError(callback);
}
''');
}
void test_secondParameterIsNamed() async {
await assertErrorsInCode('''
void f(Future<int> future, Future<int> Function(Object a, {StackTrace b}) callback) {
future.catchError(callback);
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 106, 8),
]);
}
void test_tooManyParameters() async {
await assertErrorsInCode('''
void f(Future<int> future, Future<int> Function(int, int, int) callback) {
future.catchError(callback);
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 95, 8),
]);
}
void test_wrongFirstParameterType() async {
await assertErrorsInCode('''
void f(Future<int> future, Future<int> Function(String) callback) {
future.catchError(callback);
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 88, 8),
]);
}
void test_wrongSecondParameterType() async {
await assertErrorsInCode('''
void f(Future<int> future, Future<int> Function(Object, String) callback) {
future.catchError(callback);
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 96, 8),
]);
}
}
@reflectiveTest
class ArgumentTypeNotAssignableToErrorHandler_FutureThenTest
extends PubPackageResolutionTest {
void test_firstParameterIsDynamic() async {
await assertNoErrorsInCode('''
void f(Future<void> future, void Function(dynamic a) callback) {
future.then((_) {}, onError: callback);
}
''');
}
void test_firstParameterIsNamed() async {
await assertErrorsInCode('''
void f(Future<void> future, Future<int> Function({Object a}) callback) {
future.then((_) {}, onError: callback);
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 95, 17),
]);
}
void test_functionExpression_firstParameterIsNamed() async {
await assertErrorsInCode('''
void f(Future<void> future) {
future.then((_) {}, onError: ({Object a = 1}) {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 52, 28),
]);
}
void test_functionExpression_firstParameterIsNullableObject() async {
await assertNoErrorsInCode('''
void f(Future<void> future) {
future.then((_) {}, onError: (Object? a) {});
}
''');
}
void test_functionExpression_noParameters() async {
await assertErrorsInCode('''
void f(Future<void> future) {
future.then((_) {}, onError: () {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 52, 14),
]);
}
void test_functionExpression_secondParameterIsNamed() async {
await assertErrorsInCode('''
void f(Future<void> future) {
future.then((_) {}, onError: (Object a, {StackTrace? b}) {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 52, 39),
]);
}
void test_functionExpression_secondParameterIsNullableStackTrace() async {
await assertNoErrorsInCode('''
void f(Future<void> future) {
future.then((_) {}, onError: (Object a, StackTrace? b) {});
}
''');
}
void test_functionExpression_wrongFirstParameterType() async {
await assertErrorsInCode('''
void f(Future<void> future) {
future.then((_) {}, onError: (String a) {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 52, 22),
]);
}
void test_functionType() async {
await assertNoErrorsInCode('''
void f(Future<void> future, Function callback) {
future.then((_) {}, onError: callback);
}
''');
}
}
@reflectiveTest
class ArgumentTypeNotAssignableToErrorHandler_StreamHandleErrorTest
extends PubPackageResolutionTest {
void test_firstParameterIsDynamic() async {
await assertNoErrorsInCode('''
void f(Stream<void> stream, void Function(dynamic a) callback) {
stream.handleError(callback);
}
''');
}
void test_firstParameterIsNamed() async {
await assertErrorsInCode('''
void f(Stream<void> stream, Future<int> Function({Object a}) callback) {
stream.handleError(callback);
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 94, 8),
]);
}
void test_functionExpression_firstParameterIsNamed() async {
await assertErrorsInCode('''
void f(Stream<void> stream) {
stream.handleError(({Object a = 1}) {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 51, 19),
]);
}
void test_functionExpression_firstParameterIsNullableObject() async {
await assertNoErrorsInCode('''
void f(Stream<void> stream) {
stream.handleError((Object? a) {});
}
''');
}
void test_functionExpression_noParameters() async {
await assertErrorsInCode('''
void f(Stream<void> stream) {
stream.handleError(() {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 51, 5),
]);
}
void test_functionExpression_secondParameterIsNamed() async {
await assertErrorsInCode('''
void f(Stream<void> stream) {
stream.handleError((Object a, {StackTrace? b}) {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 51, 30),
]);
}
void test_functionExpression_secondParameterIsNullableStackTrace() async {
await assertNoErrorsInCode('''
void f(Stream<void> stream) {
stream.handleError((Object a, StackTrace? b) {});
}
''');
}
void test_functionExpression_wrongFirstParameterType() async {
await assertErrorsInCode('''
void f(Stream<void> stream) {
stream.handleError((String a) {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 51, 13),
]);
}
}
@reflectiveTest
class ArgumentTypeNotAssignableToErrorHandler_StreamListenTest
extends PubPackageResolutionTest {
void test_firstParameterIsDynamic() async {
await assertNoErrorsInCode('''
void f(Stream<void> stream, void Function(dynamic a) callback) {
stream.listen((_) {}, onError: callback);
}
''');
}
void test_firstParameterIsNamed() async {
await assertErrorsInCode('''
void f(Stream<void> stream, Future<int> Function({Object a}) callback) {
stream.listen((_) {}, onError: callback);
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 97, 17),
]);
}
void test_functionExpression_firstParameterIsNamed() async {
await assertErrorsInCode('''
void f(Stream<void> stream) {
stream.listen((_) {}, onError: ({Object a = 1}) {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 54, 28),
]);
}
void test_functionExpression_firstParameterIsNullableObject() async {
await assertNoErrorsInCode('''
void f(Stream<void> stream) {
stream.listen((_) {}, onError: (Object? a) {});
}
''');
}
void test_functionExpression_noParameters() async {
await assertErrorsInCode('''
void f(Stream<void> stream) {
stream.listen((_) {}, onError: () {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 54, 14),
]);
}
void test_functionExpression_secondParameterIsNamed() async {
await assertErrorsInCode('''
void f(Stream<void> stream) {
stream.listen((_) {}, onError: (Object a, {StackTrace? b}) {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 54, 39),
]);
}
void test_functionExpression_secondParameterIsNullableStackTrace() async {
await assertNoErrorsInCode('''
void f(Stream<void> stream) {
stream.listen((_) {}, onError: (Object a, StackTrace? b) {});
}
''');
}
void test_functionExpression_wrongFirstParameterType() async {
await assertErrorsInCode('''
void f(Stream<void> stream) {
stream.listen((_) {}, onError: (String a) {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 54, 22),
]);
}
}
@reflectiveTest
class ArgumentTypeNotAssignableToErrorHandler_StreamSubscriptionOnErrorTest
extends PubPackageResolutionTest {
void test_firstParameterIsDynamic() async {
await assertNoErrorsInCode('''
import 'dart:async';
void f(
StreamSubscription<void> subscription, void Function(dynamic a) callback) {
subscription.onError(callback);
}
''');
}
void test_firstParameterIsNamed() async {
await assertErrorsInCode('''
import 'dart:async';
void f(
StreamSubscription<void> subscription,
Future<int> Function({Object a}) callback) {
subscription.onError(callback);
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 144, 8),
]);
}
void test_functionExpression_firstParameterIsNamed() async {
await assertErrorsInCode('''
import 'dart:async';
void f(StreamSubscription<void> subscription) {
subscription.onError(({Object a = 1}) {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 92, 19),
]);
}
void test_functionExpression_firstParameterIsNullableObject() async {
await assertNoErrorsInCode('''
import 'dart:async';
void f(StreamSubscription<void> subscription) {
subscription.onError((Object? a) {});
}
''');
}
void test_functionExpression_noParameters() async {
await assertErrorsInCode('''
import 'dart:async';
void f(StreamSubscription<void> subscription) {
subscription.onError(() {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 92, 5),
]);
}
void test_functionExpression_secondParameterIsNamed() async {
await assertErrorsInCode('''
import 'dart:async';
void f(StreamSubscription<void> subscription) {
subscription.onError((Object a, {StackTrace? b}) {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 92, 30),
]);
}
void test_functionExpression_secondParameterIsNullableStackTrace() async {
await assertNoErrorsInCode('''
import 'dart:async';
void f(StreamSubscription<void> subscription) {
subscription.onError((Object a, StackTrace? b) {});
}
''');
}
void test_functionExpression_wrongFirstParameterType() async {
await assertErrorsInCode('''
import 'dart:async';
void f(StreamSubscription<void> subscription) {
subscription.onError((String a) {});
}
''', [
error(WarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER, 92, 13),
]);
}
}