| // 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 'dart:async'; | |
| import 'dart:io'; | |
| import 'package:analyzer_plugin/protocol/protocol_common.dart'; | |
| import 'package:path/path.dart'; | |
| import '../timing_framework.dart'; | |
| /** | |
| * Perform the timing test, printing the minimum, average and maximum times, as | |
| * well as the standard deviation to the output. | |
| */ | |
| void main(List<String> args) { | |
| SimpleTest test = new SimpleTest(); | |
| test.run().then((TimingResult result) { | |
| print('minTime = ${result.minTime}'); | |
| print('averageTime = ${result.averageTime}'); | |
| print('maxTime = ${result.maxTime}'); | |
| print('standardDeviation = ${result.standardDeviation}'); | |
| print(''); | |
| print('Press return to exit'); | |
| return stdin.first; | |
| }); | |
| } | |
| /** | |
| * A test of how long it takes to get code completion results after making a | |
| * minor change inside a method body. | |
| */ | |
| class SimpleTest extends TimingTest { | |
| /** | |
| * The path to the file in which code completion is to be performed. | |
| */ | |
| String mainFilePath; | |
| /** | |
| * The original content of the file. | |
| */ | |
| String originalContent; | |
| /** | |
| * The offset of the cursor when requesting code completion. | |
| */ | |
| int cursorOffset; | |
| /** | |
| * A completer that will be completed when code completion results have been | |
| * received from the server. | |
| */ | |
| Completer completionReceived; | |
| /** | |
| * Initialize a newly created test. | |
| */ | |
| SimpleTest(); | |
| @override | |
| Future oneTimeSetUp() { | |
| return super.oneTimeSetUp().then((_) { | |
| mainFilePath = sourcePath('test.dart'); | |
| originalContent = r''' | |
| class C { | |
| m() { | |
| return 0; | |
| } | |
| } | |
| f(C c) { | |
| return c; | |
| } | |
| '''; | |
| cursorOffset = originalContent.indexOf('c;') + 1; | |
| writeFile(mainFilePath, originalContent); | |
| }); | |
| } | |
| @override | |
| Future perform() { | |
| sendAnalysisUpdateContent({ | |
| mainFilePath: | |
| new ChangeContentOverlay([new SourceEdit(cursorOffset, 0, '.')]) | |
| }); | |
| sendCompletionGetSuggestions(mainFilePath, cursorOffset + 1); | |
| return completionReceived.future; | |
| } | |
| @override | |
| Future setUp() { | |
| completionReceived = new Completer(); | |
| onCompletionResults.listen((_) { | |
| // We only care about the time to the first response. | |
| if (!completionReceived.isCompleted) { | |
| completionReceived.complete(); | |
| } | |
| }); | |
| sendAnalysisSetAnalysisRoots([dirname(mainFilePath)], []); | |
| sendAnalysisUpdateContent( | |
| {mainFilePath: new AddContentOverlay(originalContent)}); | |
| return new Future.value(); | |
| } | |
| @override | |
| Future tearDown() { | |
| sendAnalysisSetAnalysisRoots([], []); | |
| return new Future.value(); | |
| } | |
| } |