blob: 0a4f13e4903867b5d6ac9be0c5cbce10f9d82605 [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.
library test.operation.queue;
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/operation/operation.dart';
import 'package:analysis_server/src/operation/operation_analysis.dart';
import 'package:analysis_server/src/operation/operation_queue.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:typed_mock/typed_mock.dart';
import 'package:unittest/unittest.dart';
import '../mocks.dart';
import 'package:analyzer/src/generated/source.dart';
main() {
groupSep = ' | ';
group('ServerOperationQueue', () {
ServerOperationQueue queue;
setUp(() {
queue = new ServerOperationQueue();
});
test('clear', () {
var operationA = mockOperation(ServerOperationPriority.ANALYSIS);
var operationB = mockOperation(ServerOperationPriority.ANALYSIS_CONTINUE);
queue.add(operationA);
queue.add(operationB);
// there are some operations
expect(queue.isEmpty, false);
// clear - no operations
queue.clear();
expect(queue.isEmpty, true);
});
group('isEmpty', () {
test('true', () {
expect(queue.isEmpty, isTrue);
});
test('false', () {
var operation = mockOperation(ServerOperationPriority.ANALYSIS);
queue.add(operation);
expect(queue.isEmpty, isFalse);
});
});
group('take', () {
test('empty', () {
expect(queue.take(), isNull);
});
test('use operation priorities', () {
var operationA = mockOperation(ServerOperationPriority.ANALYSIS);
var operationB =
mockOperation(ServerOperationPriority.ANALYSIS_CONTINUE);
var operationC =
mockOperation(ServerOperationPriority.PRIORITY_ANALYSIS);
queue.add(operationA);
queue.add(operationB);
queue.add(operationC);
expect(queue.take(), operationC);
expect(queue.take(), operationB);
expect(queue.take(), operationA);
expect(queue.take(), isNull);
});
test('continue analysis first', () {
var analysisContext = new AnalysisContextMock();
var operationA = new PerformAnalysisOperation(analysisContext, false);
var operationB = new PerformAnalysisOperation(analysisContext, true);
queue.add(operationA);
queue.add(operationB);
expect(queue.take(), operationB);
expect(queue.take(), operationA);
expect(queue.take(), isNull);
});
test('priority context first', () {
var prioritySource = new MockSource();
var analysisContextA = new AnalysisContextMock();
var analysisContextB = new AnalysisContextMock();
analysisContextB.prioritySources = [prioritySource];
var operationA = new PerformAnalysisOperation(analysisContextA, false);
var operationB = new PerformAnalysisOperation(analysisContextB, false);
queue.add(operationA);
queue.add(operationB);
expect(queue.take(), operationB);
expect(queue.take(), operationA);
expect(queue.take(), isNull);
});
test('reschedule', () {
var prioritySource = new MockSource();
var analysisContextA = new AnalysisContextMock();
var analysisContextB = new AnalysisContextMock();
var operationA = new PerformAnalysisOperation(analysisContextA, false);
var operationB = new PerformAnalysisOperation(analysisContextB, false);
queue.add(operationA);
queue.add(operationB);
// update priority sources and reschedule
analysisContextB.prioritySources = [prioritySource];
queue.reschedule();
// verify order
expect(queue.take(), operationB);
expect(queue.take(), operationA);
expect(queue.take(), isNull);
});
});
});
}
/**
* Return a [ServerOperation] mock with the given priority.
*/
ServerOperation mockOperation(ServerOperationPriority priority) {
ServerOperation operation = new ServerOperationMock();
when(operation.priority).thenReturn(priority);
return operation;
}
class AnalysisContextMock extends TypedMock implements InternalAnalysisContext {
List<Source> prioritySources = <Source>[];
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}
class AnalysisServerMock extends TypedMock implements AnalysisServer {
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}
class ServerContextManagerMock extends TypedMock implements ServerContextManager
{
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}
class ServerOperationMock extends TypedMock implements ServerOperation {
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}