blob: 9b13ab01e435df1685684152d6d54d9e9bf6d23a [file] [log] [blame]
// Copyright (c) 2020, 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:analysis_server/src/services/correction/fix/data_driven/add_type_parameter_change.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/element_descriptor.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/value_extractor.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'data_driven_test_support.dart';
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(AddTypeParameterChange_DeprecatedMemberUseTest);
defineReflectiveTests(AddTypeParameterChange_InvalidOverrideTest);
defineReflectiveTests(
AddTypeParameterChange_WrongNumberOfTypeArgumentsTest);
});
}
@reflectiveTest
class AddTypeParameterChange_DeprecatedMemberUseTest
extends _AddTypeParameterChange {
Future<void> test_method_first() async {
setPackageContent('''
class C {
@deprecated
void m<T>() {}
}
''');
setPackageData(_add(0));
await resolveTestUnit('''
import '$importUri';
void f(C c) {
c.m<int>();
}
''');
await assertHasFix('''
import '$importUri';
void f(C c) {
c.m<String, int>();
}
''');
}
Future<void> test_method_last() async {
setPackageContent('''
class C {
@deprecated
void m<S, T>() {}
}
''');
setPackageData(_add(2));
await resolveTestUnit('''
import '$importUri';
void f(C c) {
c.m<int, double>();
}
''');
await assertHasFix('''
import '$importUri';
void f(C c) {
c.m<int, double, String>();
}
''');
}
Future<void> test_method_middle() async {
setPackageContent('''
class C {
@deprecated
void m<S, U>() {}
}
''');
setPackageData(_add(1));
await resolveTestUnit('''
import '$importUri';
void f(C c) {
c.m<int, double>();
}
''');
await assertHasFix('''
import '$importUri';
void f(C c) {
c.m<int, String, double>();
}
''');
}
Future<void> test_method_only() async {
setPackageContent('''
class C {
@deprecated
void m() {}
}
''');
setPackageData(_add(0));
await resolveTestUnit('''
import '$importUri';
void f(C c) {
c.m();
}
''');
await assertHasFix('''
import '$importUri';
void f(C c) {
c.m<String>();
}
''');
}
}
@reflectiveTest
class AddTypeParameterChange_InvalidOverrideTest
extends _AddTypeParameterChange {
Future<void> test_method_bound() async {
setPackageContent('''
class C {
void m<T extends num>() {}
}
''');
setPackageData(_add(0, extendedType: 'num'));
await resolveTestUnit('''
import '$importUri';
class D extends C {
@override
void m() {}
}
''');
await assertHasFix('''
import '$importUri';
class D extends C {
@override
void m<T extends num>() {}
}
''');
}
Future<void> test_method_noBound() async {
setPackageContent('''
class C {
void m<T>() {}
}
''');
setPackageData(_add(0));
await resolveTestUnit('''
import '$importUri';
class D extends C {
@override
void m() {}
}
''');
await assertHasFix('''
import '$importUri';
class D extends C {
@override
void m<T>() {}
}
''');
}
}
@reflectiveTest
class AddTypeParameterChange_WrongNumberOfTypeArgumentsTest
extends _AddTypeParameterChange {
Future<void> test_class() async {
setPackageContent('''
class C<S, T> {}
''');
setPackageData(_add(0, components: ['C']));
await resolveTestUnit('''
import '$importUri';
void f(C<int> c) {}
''');
await assertHasFix('''
import '$importUri';
void f(C<String, int> c) {}
''');
}
Future<void> test_constructor() async {
setPackageContent('''
class C<S, T> {
void C() {}
}
''');
setPackageData(_add(0, components: ['C', 'C']));
await resolveTestUnit('''
import '$importUri';
C f() {
return C<int>();
}
''');
await assertHasFix('''
import '$importUri';
C f() {
return C<String, int>();
}
''');
}
Future<void> test_extension() async {
setPackageContent('''
class C {}
extension E<S, T> on C {
void m() {}
}
''');
setPackageData(_add(0, components: ['E']));
await resolveTestUnit('''
import '$importUri';
void f(C c) {
E<int>(c).m();
}
''');
await assertHasFix('''
import '$importUri';
void f(C c) {
E<String, int>(c).m();
}
''');
}
Future<void> test_method() async {
setPackageContent('''
class C {
void m<S, T>() {}
}
''');
setPackageData(_add(0));
await resolveTestUnit('''
import '$importUri';
void f(C c) {
c.m<int>();
}
''');
await assertHasFix('''
import '$importUri';
void f(C c) {
c.m<String, int>();
}
''');
}
}
abstract class _AddTypeParameterChange extends DataDrivenFixProcessorTest {
Transform _add(int index, {List<String> components, String extendedType}) =>
Transform(
title: 'title',
element: ElementDescriptor(
libraryUris: [importUri], components: components ?? ['C', 'm']),
changes: [
AddTypeParameterChange(
extendedType: extendedType,
index: index,
name: 'T',
value: LiteralExtractor('String')),
]);
}