// 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 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(); } }