| Index: pkg/analysis_server/test/integration/analysis/get_hover_test.dart
|
| diff --git a/pkg/analysis_server/test/integration/analysis/get_hover_test.dart b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..718b4167c916a449cac640e46285b0c42f8e3677
|
| --- /dev/null
|
| +++ b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
|
| @@ -0,0 +1,176 @@
|
| +// 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.
|
| +
|
| +library test.integration.analysis.get.hover;
|
| +
|
| +import 'dart:async';
|
| +
|
| +import 'package:analysis_testing/reflective_tests.dart';
|
| +import 'package:path/path.dart';
|
| +import 'package:unittest/unittest.dart';
|
| +
|
| +import '../integration_tests.dart';
|
| +
|
| +@ReflectiveTestCase()
|
| +class AnalysisGetHoverIntegrationTest extends
|
| + AbstractAnalysisServerIntegrationTest {
|
| + /**
|
| + * Pathname of the file containing Dart code.
|
| + */
|
| + String pathname;
|
| +
|
| + /**
|
| + * Dart code under test.
|
| + */
|
| + final String text =
|
| + r'''
|
| +library lib.test;
|
| +
|
| +List topLevelVar;
|
| +
|
| +/**
|
| + * Documentation for func
|
| + */
|
| +void func(int param) {
|
| + num localVar = topLevelVar.length;
|
| + topLevelVar.length = param;
|
| + topLevelVar.add(localVar);
|
| +}
|
| +
|
| +main() {
|
| + // comment
|
| + func(35);
|
| +}
|
| +''';
|
| +
|
| + setUp() {
|
| + return super.setUp().then((_) {
|
| + pathname = sourcePath('test.dart');
|
| + });
|
| + }
|
| +
|
| + test_getHover() {
|
| + writeFile(pathname, text);
|
| + standardAnalysisSetup();
|
| +
|
| + // Note: analysis.getHover doesn't wait for analysis to complete--it simply
|
| + // returns the latest results that are available at the time that the
|
| + // request is made. So wait for analysis to finish before testing anything.
|
| + return analysisFinished.then((_) {
|
| + List<Future> tests = [];
|
| + tests.add(checkHover('topLevelVar;', 11, ['List', 'topLevelVar'],
|
| + 'top level variable', ['List']));
|
| + tests.add(checkHover('func(', 4, ['func', 'int', 'param'], 'function',
|
| + ['int', 'void'], docRegexp: 'Documentation for func'));
|
| + tests.add(checkHover('int param', 3, ['int'], 'class', ['int'], isCore:
|
| + true, docRegexp: '.*'));
|
| + tests.add(checkHover('param)', 5, ['int', 'param'], 'parameter', ['int'],
|
| + docRegexp: 'Documentation for func'));
|
| + tests.add(checkHover('num localVar', 3, ['num'], 'class', ['num'], isCore:
|
| + true, docRegexp: '.*'));
|
| + tests.add(checkHover('localVar =', 8, ['num', 'localVar'],
|
| + 'local variable', ['num'], propagatedType: 'int'));
|
| + tests.add(checkHover('topLevelVar.length;', 11, ['List', 'topLevelVar'],
|
| + 'top level variable', ['List']));
|
| + tests.add(checkHover('length;', 6, ['get', 'length', 'int'], 'getter',
|
| + ['int'], isCore: true, docRegexp: '.*'));
|
| + tests.add(checkHover('length =', 6, ['set', 'length', 'int'], 'setter',
|
| + ['int'], isCore: true, docRegexp: '.*'));
|
| + tests.add(checkHover('param;', 5, ['int', 'param'], 'parameter', ['int'],
|
| + docRegexp: 'Documentation for func'));
|
| + tests.add(checkHover('add(', 3, ['List', 'add'], 'method', null, isCore:
|
| + true, docRegexp: '.*'));
|
| + tests.add(checkHover('localVar)', 8, ['num', 'localVar'],
|
| + 'local variable', ['num'], parameterRegexps: ['.*'], propagatedType: 'int'));
|
| + tests.add(checkHover('func(35', 4, ['func', 'int', 'param'], 'function',
|
| + null, docRegexp: 'Documentation for func'));
|
| + tests.add(checkHover('35', 2, null, null, ['int'], isLiteral: true,
|
| + parameterRegexps: ['int', 'param']));
|
| + tests.add(checkNoHover('comment'));
|
| + return Future.wait(tests);
|
| + });
|
| + }
|
| +
|
| + /**
|
| + * Check that a getHover request on the substring [target] produces a result
|
| + * which has length [length], has an elementDescription matching every
|
| + * regexp in [descriptionRegexps], has a kind of [kind], and has a staticType
|
| + * matching [staticTypeRegexps].
|
| + *
|
| + * [isCore] means the hover info should indicate that the element is defined
|
| + * in dart.core. [docRegexp], if specified, should match the documentation
|
| + * string of the element. [isLiteral] means the hover should indicate a
|
| + * literal value. [parameterRegexps] means is a set of regexps which should
|
| + * match the hover parameters. [propagatedType], if specified, is the
|
| + * expected propagated type of the element.
|
| + */
|
| + checkHover(String target, int length, List<String> descriptionRegexps, String
|
| + kind, List<String> staticTypeRegexps, {bool isCore: false, String docRegexp:
|
| + null, bool isLiteral: false, List<String> parameterRegexps:
|
| + null, propagatedType: null}) {
|
| + int offset = text.indexOf(target);
|
| + return sendAnalysisGetHover(pathname, offset).then((result) {
|
| + expect(result['hovers'], hasLength(1));
|
| + var info = result['hovers'][0];
|
| + expect(info['offset'], equals(offset));
|
| + expect(info['length'], equals(length));
|
| + if (isCore) {
|
| + expect(basename(info['containingLibraryPath']), equals('core.dart'));
|
| + expect(info['containingLibraryName'], equals('dart.core'));
|
| + } else if (isLiteral) {
|
| + expect(info['containingLibraryPath'], isNull);
|
| + expect(info['containingLibraryName'], isNull);
|
| + } else {
|
| + expect(info['containingLibraryPath'], equals(pathname));
|
| + expect(info['containingLibraryName'], equals('lib.test'));
|
| + }
|
| + if (docRegexp == null) {
|
| + expect(info['dartdoc'], isNull);
|
| + } else {
|
| + expect(info['dartdoc'], matches(docRegexp));
|
| + }
|
| + if (descriptionRegexps == null) {
|
| + expect(info['elementDescription'], isNull);
|
| + } else {
|
| + expect(info['elementDescription'], isString);
|
| + for (String descriptionRegexp in descriptionRegexps) {
|
| + expect(info['elementDescription'], matches(descriptionRegexp));
|
| + }
|
| + }
|
| + expect(info['elementKind'], equals(kind));
|
| + if (parameterRegexps == null) {
|
| + expect(info['parameter'], isNull);
|
| + } else {
|
| + expect(info['parameter'], isString);
|
| + for (String parameterRegexp in parameterRegexps) {
|
| + expect(info['parameter'], matches(parameterRegexp));
|
| + }
|
| + }
|
| + expect(info['propagatedType'], equals(propagatedType));
|
| + if (staticTypeRegexps == null) {
|
| + expect(info['staticType'], isNull);
|
| + } else {
|
| + expect(info['staticType'], isString);
|
| + for (String staticTypeRegexp in staticTypeRegexps) {
|
| + expect(info['staticType'], matches(staticTypeRegexp));
|
| + }
|
| + }
|
| + });
|
| + }
|
| +
|
| + /**
|
| + * Check that a getHover request on the substring [target] produces no
|
| + * results.
|
| + */
|
| + Future checkNoHover(String target) {
|
| + int offset = text.indexOf(target);
|
| + return sendAnalysisGetHover(pathname, offset).then((result) {
|
| + expect(result['hovers'], hasLength(0));
|
| + });
|
| + }
|
| +}
|
| +
|
| +main() {
|
| + runReflectiveTests(AnalysisGetHoverIntegrationTest);
|
| +}
|
|
|