Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(313)

Unified Diff: pkg/analyzer/test/src/task/html_work_manager_test.dart

Issue 1200313002: Initial HTML work manager (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/analyzer/lib/src/task/html_work_manager.dart ('k') | pkg/analyzer/test/src/task/test_all.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/test/src/task/html_work_manager_test.dart
diff --git a/pkg/analyzer/test/src/task/html_work_manager_test.dart b/pkg/analyzer/test/src/task/html_work_manager_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..94015ae11e82030e2c2f87efa9042a7c9277dc90
--- /dev/null
+++ b/pkg/analyzer/test/src/task/html_work_manager_test.dart
@@ -0,0 +1,352 @@
+// Copyright (c) 2015, 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.src.task.html_work_manager_test;
+
+import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/generated/engine.dart'
+ show
+ AnalysisEngine,
+ AnalysisErrorInfo,
+ AnalysisErrorInfoImpl,
+ CacheState,
+ ChangeNoticeImpl,
+ InternalAnalysisContext;
+import 'package:analyzer/src/generated/error.dart'
+ show AnalysisError, HtmlErrorCode;
+import 'package:analyzer/src/generated/java_engine.dart' show CaughtException;
+import 'package:analyzer/src/generated/scanner.dart' show ScannerErrorCode;
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/driver.dart';
+import 'package:analyzer/src/task/html.dart';
+import 'package:analyzer/src/task/html_work_manager.dart';
+import 'package:analyzer/task/dart.dart';
+import 'package:analyzer/task/general.dart';
+import 'package:analyzer/task/html.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:typed_mock/typed_mock.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../generated/test_support.dart';
+import '../../reflective_tests.dart';
+
+main() {
+ groupSep = ' | ';
+ runReflectiveTests(HtmlWorkManagerTest);
+}
+
+@reflectiveTest
+class HtmlWorkManagerTest {
+ InternalAnalysisContext context = new _InternalAnalysisContextMock();
+ AnalysisCache cache;
+ HtmlWorkManager manager;
+
+ CaughtException caughtException = new CaughtException(null, null);
+
+ Source source1 = new TestSource('1.html');
+ Source source2 = new TestSource('2.html');
+ Source source3 = new TestSource('3.html');
+ Source source4 = new TestSource('4.html');
+ CacheEntry entry1;
+ CacheEntry entry2;
+ CacheEntry entry3;
+ CacheEntry entry4;
+
+ void expect_sourceQueue(List<Source> sources) {
+ expect(manager.sourceQueue, unorderedEquals(sources));
+ }
+
+ void setUp() {
+ cache = context.analysisCache;
+ manager = new HtmlWorkManager(context);
+ entry1 = context.getCacheEntry(source1);
+ entry2 = context.getCacheEntry(source2);
+ entry3 = context.getCacheEntry(source3);
+ entry4 = context.getCacheEntry(source4);
+ }
+
+ void test_applyChange_add() {
+ // add source1
+ manager.applyChange([source1], [], []);
+ expect_sourceQueue([source1]);
+ // add source2
+ manager.applyChange([source2], [], []);
+ expect_sourceQueue([source1, source2]);
+ }
+
+ void test_applyChange_add_duplicate() {
+ // add source1
+ manager.applyChange([source1], [], []);
+ expect_sourceQueue([source1]);
+ // add source1 again
+ manager.applyChange([source1], [], []);
+ expect_sourceQueue([source1]);
+ }
+
+ void test_applyChange_change() {
+ // change source1
+ manager.applyChange([], [source1], []);
+ expect_sourceQueue([source1]);
+ }
+
+ void test_applyChange_change_afterAdd() {
+ manager.applyChange([source1, source2], [], []);
+ // change source1
+ manager.applyChange([], [source1], []);
+ expect_sourceQueue([source1, source2]);
+ }
+
+ void test_applyChange_remove() {
+ manager.applyChange([source1, source2], [], []);
+ // remove source1
+ manager.applyChange([], [], [source1]);
+ expect_sourceQueue([source2]);
+ // remove source2
+ manager.applyChange([], [], [source2]);
+ expect_sourceQueue([]);
+ // remove source3
+ manager.applyChange([], [], [source3]);
+ expect_sourceQueue([]);
+ }
+
+ void test_applyPriorityTargets() {
+ when(context.shouldErrorsBeAnalyzed(source2, null)).thenReturn(true);
+ when(context.shouldErrorsBeAnalyzed(source3, null)).thenReturn(true);
+ manager.priorityResultQueue.add(new TargetedResult(source1, HTML_ERRORS));
+ manager.priorityResultQueue.add(new TargetedResult(source2, HTML_ERRORS));
+ // -source1 +source3
+ manager.applyPriorityTargets([source2, source3]);
+ expect(manager.priorityResultQueue, unorderedEquals([
+ new TargetedResult(source2, HTML_ERRORS),
+ new TargetedResult(source3, HTML_ERRORS)
+ ]));
+ // get next request
+ TargetedResult request = manager.getNextResult();
+ expect(request.target, source2);
+ expect(request.result, HTML_ERRORS);
+ }
+
+ void test_getErrors_fullList() {
+ AnalysisError error1 =
+ new AnalysisError(source1, 1, 0, HtmlErrorCode.PARSE_ERROR, ['']);
+ AnalysisError error2 =
+ new AnalysisError(source1, 2, 0, HtmlErrorCode.PARSE_ERROR, ['']);
+ LineInfo lineInfo = new LineInfo([0]);
+ entry1.setValue(HTML_DOCUMENT_ERRORS, <AnalysisError>[error1], []);
+ entry1.setValue(LINE_INFO, lineInfo, []);
+
+ DartScript script = new DartScript(source1, []);
+ entry1.setValue(DART_SCRIPTS, [script], []);
+ CacheEntry scriptEntry = context.getCacheEntry(script);
+ scriptEntry.setValue(DART_ERRORS, [error2], []);
+
+ AnalysisErrorInfo errorInfo = manager.getErrors(source1);
+ expect(errorInfo.errors, unorderedEquals([error1, error2]));
+ expect(errorInfo.lineInfo, lineInfo);
+ }
+
+ void test_getErrors_partialList() {
+ AnalysisError error1 =
+ new AnalysisError(source1, 1, 0, HtmlErrorCode.PARSE_ERROR, ['']);
+ AnalysisError error2 =
+ new AnalysisError(source1, 2, 0, HtmlErrorCode.PARSE_ERROR, ['']);
+ LineInfo lineInfo = new LineInfo([0]);
+ entry1.setValue(HTML_DOCUMENT_ERRORS, <AnalysisError>[error1, error2], []);
+ entry1.setValue(LINE_INFO, lineInfo, []);
+
+ AnalysisErrorInfo errorInfo = manager.getErrors(source1);
+ expect(errorInfo.errors, unorderedEquals([error1, error2]));
+ expect(errorInfo.lineInfo, lineInfo);
+ }
+
+ void test_getNextResult_hasNormal_firstIsError() {
+ entry1.setErrorState(caughtException, [HTML_ERRORS]);
+ manager.sourceQueue.addAll([source1, source2]);
+ TargetedResult request = manager.getNextResult();
+ expect(request.target, source2);
+ expect(request.result, HTML_ERRORS);
+ // source1 is out, source2 is waiting
+ expect_sourceQueue([source2]);
+ }
+
+ void test_getNextResult_hasNormal_firstIsInvalid() {
+ entry1.setState(HTML_ERRORS, CacheState.INVALID);
+ manager.sourceQueue.addAll([source1, source2]);
+ TargetedResult request = manager.getNextResult();
+ expect(request.target, source1);
+ expect(request.result, HTML_ERRORS);
+ // no changes until computed
+ expect_sourceQueue([source1, source2]);
+ }
+
+ void test_getNextResult_hasNormal_firstIsValid() {
+ entry1.setValue(HTML_ERRORS, [], []);
+ manager.sourceQueue.addAll([source1, source2]);
+ TargetedResult request = manager.getNextResult();
+ expect(request.target, source2);
+ expect(request.result, HTML_ERRORS);
+ // source1 is out, source2 is waiting
+ expect_sourceQueue([source2]);
+ }
+
+ void test_getNextResult_hasNormalAndPriority() {
+ entry1.setState(HTML_ERRORS, CacheState.INVALID);
+ manager.sourceQueue.addAll([source1, source2]);
+ manager.addPriorityResult(source3, HTML_ERRORS);
+
+ TargetedResult request = manager.getNextResult();
+ expect(request.target, source3);
+ expect(request.result, HTML_ERRORS);
+ // no changes until computed
+ expect_sourceQueue([source1, source2]);
+ }
+
+ void test_getNextResult_hasPriority() {
+ manager.addPriorityResult(source1, HTML_ERRORS);
+ manager.addPriorityResult(source2, HTML_ERRORS);
+ expect(manager.priorityResultQueue, unorderedEquals([
+ new TargetedResult(source1, HTML_ERRORS),
+ new TargetedResult(source2, HTML_ERRORS)
+ ]));
+
+ TargetedResult request = manager.getNextResult();
+ expect(request.target, source1);
+ expect(request.result, HTML_ERRORS);
+ // no changes until computed
+ expect(manager.priorityResultQueue, unorderedEquals([
+ new TargetedResult(source1, HTML_ERRORS),
+ new TargetedResult(source2, HTML_ERRORS)
+ ]));
+ }
+
+ void test_getNextResult_nothingToDo() {
+ TargetedResult request = manager.getNextResult();
+ expect(request, isNull);
+ }
+
+ void test_getNextResultPriority_hasPriority() {
+ manager.addPriorityResult(source1, SOURCE_KIND);
+ expect(manager.getNextResultPriority(), WorkOrderPriority.PRIORITY);
+ }
+
+ void test_getNextResultPriority_hasSource() {
+ manager.sourceQueue.addAll([source1]);
+ expect(manager.getNextResultPriority(), WorkOrderPriority.NORMAL);
+ }
+
+ void test_getNextResultPriority_nothingToDo() {
+ expect(manager.getNextResultPriority(), WorkOrderPriority.NONE);
+ }
+
+ void test_onAnalysisOptionsChanged() {
+ when(context.exists(anyObject)).thenReturn(true);
+ // set cache values
+ entry1.setValue(DART_SCRIPTS, [], []);
+ entry1.setValue(HTML_DOCUMENT, null, []);
+ entry1.setValue(HTML_DOCUMENT_ERRORS, [], []);
+ entry1.setValue(HTML_ERRORS, [], []);
+ entry1.setValue(REFERENCED_LIBRARIES, [], []);
+ // notify
+ manager.onAnalysisOptionsChanged();
+ // Only resolution-based values are invalidated.
+ expect(entry1.getState(DART_SCRIPTS), CacheState.VALID);
+ expect(entry1.getState(HTML_DOCUMENT), CacheState.VALID);
+ expect(entry1.getState(HTML_DOCUMENT_ERRORS), CacheState.VALID);
+ expect(entry1.getState(HTML_ERRORS), CacheState.INVALID);
+ expect(entry1.getState(REFERENCED_LIBRARIES), CacheState.VALID);
+ }
+
+ void test_onResultInvalidated_scheduleInvalidatedLibraries() {
+ // set HTML_ERRORS for source1 and source3
+ entry1.setValue(HTML_ERRORS, [], []);
+ entry3.setValue(HTML_ERRORS, [], []);
+ // invalidate HTML_ERRORS for source1, schedule it
+ entry1.setState(HTML_ERRORS, CacheState.INVALID);
+ expect_sourceQueue([source1]);
+ // invalidate HTML_ERRORS for source3, schedule it
+ entry3.setState(HTML_ERRORS, CacheState.INVALID);
+ expect_sourceQueue([source1, source3]);
+ }
+
+ void test_onSourceFactoryChanged() {
+ when(context.exists(anyObject)).thenReturn(true);
+ // set cache values
+ entry1.setValue(DART_SCRIPTS, [], []);
+ entry1.setValue(HTML_DOCUMENT, null, []);
+ entry1.setValue(HTML_DOCUMENT_ERRORS, [], []);
+ entry1.setValue(HTML_ERRORS, [], []);
+ entry1.setValue(REFERENCED_LIBRARIES, [], []);
+ // notify
+ manager.onSourceFactoryChanged();
+ // Only resolution-based values are invalidated.
+ expect(entry1.getState(DART_SCRIPTS), CacheState.VALID);
+ expect(entry1.getState(HTML_DOCUMENT), CacheState.VALID);
+ expect(entry1.getState(HTML_DOCUMENT_ERRORS), CacheState.VALID);
+ expect(entry1.getState(HTML_ERRORS), CacheState.INVALID);
+ expect(entry1.getState(REFERENCED_LIBRARIES), CacheState.INVALID);
+ }
+
+ void test_resultsComputed_errors() {
+ AnalysisError error1 =
+ new AnalysisError(source1, 1, 0, HtmlErrorCode.PARSE_ERROR, ['']);
+ AnalysisError error2 =
+ new AnalysisError(source1, 2, 0, HtmlErrorCode.PARSE_ERROR, ['']);
+ LineInfo lineInfo = new LineInfo([0]);
+ entry1.setValue(LINE_INFO, lineInfo, []);
+ entry1.setValue(HTML_ERRORS, <AnalysisError>[error1, error2], []);
+ // RESOLVED_UNIT is ready, set errors
+ manager.resultsComputed(source1, {HTML_ERRORS: null});
+ // all of the errors are included
+ ChangeNoticeImpl notice = context.getNotice(source1);
+ expect(notice.errors, unorderedEquals([error1, error2]));
+ expect(notice.lineInfo, lineInfo);
+ }
+}
+
+class _InternalAnalysisContextMock extends TypedMock
+ implements InternalAnalysisContext {
+ @override
+ CachePartition privateAnalysisCachePartition;
+
+ @override
+ AnalysisCache analysisCache;
+
+ Map<Source, ChangeNoticeImpl> _pendingNotices = <Source, ChangeNoticeImpl>{};
+
+ _InternalAnalysisContextMock() {
+ privateAnalysisCachePartition = new UniversalCachePartition(this);
+ analysisCache = new AnalysisCache([privateAnalysisCachePartition]);
+ }
+
+ @override
+ CacheEntry getCacheEntry(AnalysisTarget target) {
+ CacheEntry entry = analysisCache.get(target);
+ if (entry == null) {
+ entry = new CacheEntry(target);
+ analysisCache.put(entry);
+ }
+ return entry;
+ }
+
+ @override
+ AnalysisErrorInfo getErrors(Source source) {
+ String name = source.shortName;
+ List<AnalysisError> errors = AnalysisError.NO_ERRORS;
+ if (AnalysisEngine.isDartFileName(name) || source is DartScript) {
+ errors = getCacheEntry(source).getValue(DART_ERRORS);
+ } else if (AnalysisEngine.isHtmlFileName(name)) {
+ errors = getCacheEntry(source).getValue(HTML_ERRORS);
+ }
+ return new AnalysisErrorInfoImpl(
+ errors, getCacheEntry(source).getValue(LINE_INFO));
+ }
+
+ @override
+ ChangeNoticeImpl getNotice(Source source) {
+ return _pendingNotices.putIfAbsent(
+ source, () => new ChangeNoticeImpl(source));
+ }
+
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
« no previous file with comments | « pkg/analyzer/lib/src/task/html_work_manager.dart ('k') | pkg/analyzer/test/src/task/test_all.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698