blob: f55a4bd8b9ac6370175c6b63b824df102e0deb1b [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/dart/element/type.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer/src/generated/resolver.dart';
import 'package:analyzer/src/generated/testing/test_type_provider.dart';
import 'package:analyzer/src/generated/utilities_dart.dart';
import 'package:nnbd_migration/src/already_migrated_code_decorator.dart';
import 'package:nnbd_migration/src/decorated_type.dart';
import 'package:nnbd_migration/src/nullability_node.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(_AlreadyMigratedCodeDecoratorTest);
});
}
@reflectiveTest
class _AlreadyMigratedCodeDecoratorTest {
final TypeProvider typeProvider;
final AlreadyMigratedCodeDecorator decorator;
final NullabilityGraphForTesting graph;
factory _AlreadyMigratedCodeDecoratorTest() {
return _AlreadyMigratedCodeDecoratorTest._(NullabilityGraphForTesting());
}
_AlreadyMigratedCodeDecoratorTest._(this.graph)
: typeProvider = TestTypeProvider(),
decorator = AlreadyMigratedCodeDecorator(graph);
void checkDynamic(DecoratedType decoratedType) {
expect(decoratedType.type, same(typeProvider.dynamicType));
expect(decoratedType.node, same(graph.always));
}
void checkInt(DecoratedType decoratedType) {
expect(decoratedType.type, typeProvider.intType);
expect(decoratedType.node, same(graph.never));
}
void checkTypeParameter(
DecoratedType decoratedType, TypeParameterElementImpl expectedElement) {
var type = decoratedType.type as TypeParameterTypeImpl;
expect(type.element, same(expectedElement));
expect(decoratedType.node, same(graph.never));
}
void checkVoid(DecoratedType decoratedType) {
expect(decoratedType.type, same(typeProvider.voidType));
expect(decoratedType.node, same(graph.always));
}
DecoratedType decorate(DartType type) {
var decoratedType = decorator.decorate(type);
expect(decoratedType.type, same(type));
return decoratedType;
}
test_decorate_dynamic() {
checkDynamic(decorate(typeProvider.dynamicType));
}
test_decorate_functionType_named_parameter() {
checkDynamic(
decorate(FunctionTypeImpl.synthetic(typeProvider.voidType, [], [
ParameterElementImpl.synthetic(
'x', typeProvider.dynamicType, ParameterKind.NAMED)
])).namedParameters['x']);
}
test_decorate_functionType_ordinary_parameter() {
checkDynamic(
decorate(FunctionTypeImpl.synthetic(typeProvider.voidType, [], [
ParameterElementImpl.synthetic(
'x', typeProvider.dynamicType, ParameterKind.REQUIRED)
])).positionalParameters[0]);
}
test_decorate_functionType_positional_parameter() {
checkDynamic(
decorate(FunctionTypeImpl.synthetic(typeProvider.voidType, [], [
ParameterElementImpl.synthetic(
'x', typeProvider.dynamicType, ParameterKind.POSITIONAL)
])).positionalParameters[0]);
}
test_decorate_functionType_returnType() {
checkDynamic(
decorate(FunctionTypeImpl.synthetic(typeProvider.dynamicType, [], []))
.returnType);
}
test_decorate_functionType_star() {
expect(
decorate(FunctionTypeImpl.synthetic(typeProvider.voidType, [], [],
nullabilitySuffix: NullabilitySuffix.star))
.node,
same(graph.never));
}
test_decorate_interfaceType_simple_star() {
checkInt(decorate(InterfaceTypeImpl(typeProvider.intType.element,
nullabilitySuffix: NullabilitySuffix.star)));
}
test_decorate_typeParameterType_star() {
var element = TypeParameterElementImpl.synthetic('T');
checkTypeParameter(
decorate(TypeParameterTypeImpl(element,
nullabilitySuffix: NullabilitySuffix.star)),
element);
}
test_decorate_void() {
checkVoid(decorate(typeProvider.voidType));
}
}