blob: 243fd9b2b5f14617145f8b1578f0155effdd376b [file] [log] [blame]
// Copyright (c) 2014, 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/name_suggestion.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../abstract_single_unit.dart';
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(VariableNameSuggestionTest);
});
}
@reflectiveTest
class VariableNameSuggestionTest extends AbstractSingleUnitTest {
Future<void> test_forExpression_cast() async {
await resolveTestCode('''
main() {
var sortedNodes;
var res = sortedNodes as String;
}
''');
var excluded = <String>{};
var expr = findNode.as_('as String');
expect(getVariableNameSuggestionsForExpression(null, expr, excluded),
unorderedEquals(['sortedNodes', 'nodes']));
}
Future<void> test_forExpression_expectedType() async {
await resolveTestCode('''
class TreeNode {}
main() {
TreeNode node = null;
}
''');
var excluded = <String>{};
var expectedType = findElement.localVar('node').type;
var assignedExpression = findNode.nullLiteral('null;');
var suggestions = getVariableNameSuggestionsForExpression(
expectedType, assignedExpression, excluded);
expect(suggestions, unorderedEquals(['treeNode', 'node']));
}
Future<void> test_forExpression_expectedType_double() async {
await resolveTestCode('''
main() {
double res = 0.0;
}
''');
var expectedType = findElement.localVar('res').type;
var assignedExpression = findNode.doubleLiteral('0.0;');
// first choice for "double" is "d"
expect(
getVariableNameSuggestionsForExpression(
expectedType, assignedExpression, {}),
unorderedEquals(['d']));
// if "d" is used, try "e", "f", etc
expect(
getVariableNameSuggestionsForExpression(
expectedType, assignedExpression, {'d', 'e'}),
unorderedEquals(['f']));
}
Future<void> test_forExpression_expectedType_int() async {
await resolveTestCode('''
main() {
int res = 0;
}
''');
var expectedType = findElement.localVar('res').type;
var assignedExpression = findNode.integerLiteral('0;');
// first choice for "int" is "i"
expect(
getVariableNameSuggestionsForExpression(
expectedType, assignedExpression, {}),
unorderedEquals(['i']));
// if "i" is used, try "j", "k", etc
expect(
getVariableNameSuggestionsForExpression(
expectedType, assignedExpression, {'i', 'j'}),
unorderedEquals(['k']));
}
Future<void> test_forExpression_expectedType_String() async {
await resolveTestCode('''
main() {
String res = 'abc';
}
''');
var expectedType = findElement.localVar('res').type;
var assignedExpression = findNode.stringLiteral("'abc';");
// first choice for "String" is "s"
expect(
getVariableNameSuggestionsForExpression(
expectedType, assignedExpression, {}),
unorderedEquals(['s']));
}
Future<void> test_forExpression_inBuildMethod() async {
await resolveTestCode('''
class A {
void build() {
List l = new List();
}
}
''');
var excluded = <String>{};
var expr = findNode.instanceCreation('new List');
expect(
getVariableNameSuggestionsForExpression(null, expr, excluded,
isMethod: false),
unorderedEquals(['list']));
expect(
getVariableNameSuggestionsForExpression(null, expr, excluded,
isMethod: true),
unorderedEquals(['buildList']));
}
Future<void> test_forExpression_indexExpression_endsWithE() async {
await resolveTestCode('''
main() {
var topNodes = [0, 1, 2];
print(topNodes[0]);
}
''');
var excluded = <String>{};
var expr = findNode.index('topNodes[0]');
var names = getVariableNameSuggestionsForExpression(null, expr, excluded);
expect(names, unorderedEquals(['topNode', 'node', 'object']));
}
Future<void> test_forExpression_instanceCreation() async {
verifyNoTestUnitErrors = false;
await resolveTestCode('''
import 'dart:math' as p;
main(p) {
new NoSuchClass();
new p.NoSuchClass();
new NoSuchClass.named();
}
''');
var excluded = <String>{};
expect(
getVariableNameSuggestionsForExpression(
null, findNode.instanceCreation('new NoSuchClass()'), excluded),
unorderedEquals(['noSuchClass', 'suchClass', 'class']));
expect(
getVariableNameSuggestionsForExpression(null,
findNode.instanceCreation('new NoSuchClass.named()'), excluded),
unorderedEquals(['noSuchClass', 'suchClass', 'class']));
// TODO(scheglov) This test does not work.
// In "p.NoSuchClass" the identifier "p" is not resolved to a PrefixElement.
// expect(
// getVariableNameSuggestionsForExpression(
// null,
// findNodeAtString('new p.NoSuchClass()'),
// excluded),
// unorderedEquals(['noSuchClass', 'suchClass', 'class']));
}
Future<void> test_forExpression_invocationArgument_named() async {
await resolveTestCode('''
foo({a, b, c}) {}
main() {
foo(a: 111, c: 333, b: 222);
}
''');
var excluded = <String>{};
{
var expr = findNode.integerLiteral('111');
expect(getVariableNameSuggestionsForExpression(null, expr, excluded),
unorderedEquals(['a']));
}
{
var expr = findNode.integerLiteral('222');
expect(getVariableNameSuggestionsForExpression(null, expr, excluded),
unorderedEquals(['b']));
}
{
var expr = findNode.integerLiteral('333');
expect(getVariableNameSuggestionsForExpression(null, expr, excluded),
unorderedEquals(['c']));
}
}
Future<void> test_forExpression_invocationArgument_optional() async {
await resolveTestCode('''
foo(a, [b = 2, c = 3]) {}
main() {
foo(111, 222, 333);
}
''');
var excluded = <String>{};
{
var expr = findNode.integerLiteral('111');
expect(getVariableNameSuggestionsForExpression(null, expr, excluded),
unorderedEquals(['a']));
}
{
var expr = findNode.integerLiteral('222');
expect(getVariableNameSuggestionsForExpression(null, expr, excluded),
unorderedEquals(['b']));
}
{
var expr = findNode.integerLiteral('333');
expect(getVariableNameSuggestionsForExpression(null, expr, excluded),
unorderedEquals(['c']));
}
}
Future<void> test_forExpression_invocationArgument_positional() async {
await resolveTestCode('''
foo(a, b) {}
main() {
foo(111, 222);
}
''');
var excluded = <String>{};
{
var expr = findNode.integerLiteral('111');
expect(getVariableNameSuggestionsForExpression(null, expr, excluded),
unorderedEquals(['a']));
}
{
var expr = findNode.integerLiteral('222');
expect(getVariableNameSuggestionsForExpression(null, expr, excluded),
unorderedEquals(['b']));
}
}
Future<void> test_forExpression_methodInvocation() async {
await resolveTestCode('''
main(p) {
var res = p.getSortedNodes();
}
''');
var excluded = <String>{};
var expr = findNode.methodInvocation('p.get');
expect(getVariableNameSuggestionsForExpression(null, expr, excluded),
unorderedEquals(['sortedNodes', 'nodes']));
}
Future<void> test_forExpression_methodInvocation_noPrefix() async {
await resolveTestCode('''
main(p) {
var res = p.sortedNodes();
}
''');
var excluded = <String>{};
var expr = findNode.methodInvocation('p.sorted');
expect(getVariableNameSuggestionsForExpression(null, expr, excluded),
unorderedEquals(['sortedNodes', 'nodes']));
}
Future<void> test_forExpression_name_get() async {
await resolveTestCode('''
main(p) {
var res = p.get();
}
''');
var excluded = <String>{};
var expr = findNode.methodInvocation('p.get');
expect(getVariableNameSuggestionsForExpression(null, expr, excluded),
unorderedEquals([]));
}
Future<void> test_forExpression_prefixedIdentifier() async {
await resolveTestCode('''
main(p) {
var res = p.sortedNodes;
}
''');
var excluded = <String>{};
expect(
getVariableNameSuggestionsForExpression(
null, findNode.prefixed('p.sorted'), excluded),
unorderedEquals(['sortedNodes', 'nodes']));
}
Future<void> test_forExpression_privateName() async {
await resolveTestCode('''
main(p) {
p._name;
p._computeSuffix();
}
''');
var excluded = <String>{};
expect(
getVariableNameSuggestionsForExpression(
null, findNode.prefixed('p._name'), excluded),
unorderedEquals(['name']));
expect(
getVariableNameSuggestionsForExpression(
null, findNode.methodInvocation('p._compute'), excluded),
unorderedEquals(['computeSuffix', 'suffix']));
}
Future<void> test_forExpression_propertyAccess() async {
await resolveTestCode('''
main(p) {
var res = p.q.sortedNodes;
}
''');
var excluded = <String>{};
var expression = findNode.propertyAccess('.sorted');
expect(getVariableNameSuggestionsForExpression(null, expression, excluded),
unorderedEquals(['sortedNodes', 'nodes']));
}
Future<void> test_forExpression_simpleName() async {
await resolveTestCode('''
main(p) {
var sortedNodes = null;
var res = sortedNodes;
}
''');
var excluded = <String>{};
var expr = findNode.simple('sortedNodes;');
expect(getVariableNameSuggestionsForExpression(null, expr, excluded),
unorderedEquals(['sortedNodes', 'nodes']));
}
Future<void> test_forExpression_unqualifiedInvocation() async {
await resolveTestCode('''
getSortedNodes() => [];
main(p) {
var res = getSortedNodes();
}
''');
var excluded = <String>{};
expect(
getVariableNameSuggestionsForExpression(
null, findNode.methodInvocation('getSortedNodes();'), excluded),
unorderedEquals(['sortedNodes', 'nodes']));
}
void test_forText() {
{
var excluded = <String>{};
var suggestions =
getVariableNameSuggestionsForText('Goodbye, cruel world!', excluded);
expect(suggestions,
unorderedEquals(['goodbyeCruelWorld', 'cruelWorld', 'world']));
}
{
var excluded = <String>{'world'};
var suggestions =
getVariableNameSuggestionsForText('Goodbye, cruel world!', excluded);
expect(suggestions,
unorderedEquals(['goodbyeCruelWorld', 'cruelWorld', 'world2']));
}
}
}