| // 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_analysis.dart'; |
| import 'package:analysis_server/src/operation/operation.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'; |
| |
| main() { |
| groupSep = ' | '; |
| |
| group('ServerOperationQueue', () { |
| AnalysisServer server; |
| ServerOperationQueue queue; |
| |
| setUp(() { |
| server = new AnalysisServerMock(); |
| queue = new ServerOperationQueue(server); |
| }); |
| |
| test('clear', () { |
| var operationA = mockOperation(ServerOperationPriority.SEARCH); |
| var operationB = mockOperation(ServerOperationPriority.REFACTORING); |
| 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.SEARCH); |
| queue.add(operation); |
| expect(queue.isEmpty, isFalse); |
| }); |
| }); |
| |
| group('take', () { |
| test('empty', () { |
| expect(queue.take(), isNull); |
| }); |
| |
| test('use operation priorities', () { |
| // TODO(scheglov) update 'typed_mock' to make 'any*' fields dynamic |
| when(server.isPriorityContext(anyObject as dynamic)).thenReturn(false); |
| var analysisContext = new AnalysisContextMock(); |
| var operationA = mockOperation(ServerOperationPriority.SEARCH); |
| var operationB = mockOperation(ServerOperationPriority.REFACTORING); |
| var operationC = new PerformAnalysisOperation(analysisContext, false); |
| queue.add(operationA); |
| queue.add(operationB); |
| queue.add(operationC); |
| expect(queue.take(), operationC); |
| expect(queue.take(), operationA); |
| expect(queue.take(), operationB); |
| expect(queue.take(), isNull); |
| }); |
| |
| test('continue analysis first', () { |
| // TODO(scheglov) update 'typed_mock' to make 'any*' fields dynamic |
| when(server.isPriorityContext(anyObject as dynamic)).thenReturn(false); |
| 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 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); |
| when(server.isPriorityContext(analysisContextA)).thenReturn(false); |
| when(server.isPriorityContext(analysisContextB)).thenReturn(true); |
| 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 AnalysisContext { |
| noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
| } |
| |
| class ServerOperationMock extends TypedMock implements ServerOperation { |
| noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
| } |
| |
| class AnalysisServerMock extends TypedMock implements AnalysisServer { |
| noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
| } |