// 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 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/error/error.dart'; import 'package:analyzer/src/cancelable_future.dart'; import 'package:analyzer/src/context/builder.dart' show EmbedderYamlLocator; import 'package:analyzer/src/context/cache.dart'; import 'package:analyzer/src/context/context.dart'; import 'package:analyzer/src/context/source.dart'; import 'package:analyzer/src/generated/constant.dart'; import 'package:analyzer/src/generated/engine.dart'; import 'package:analyzer/src/generated/resolver.dart'; import 'package:analyzer/src/generated/source_io.dart'; import 'package:analyzer/src/plugin/resolver_provider.dart'; import 'package:analyzer/src/string_source.dart'; import 'package:analyzer/src/task/api/model.dart'; import 'package:html/dom.dart' show Document; import 'package:test/test.dart'; import 'package:test_reflective_loader/test_reflective_loader.dart'; main() { defineReflectiveSuite(() { defineReflectiveTests(AnalysisOptionsImplTest); defineReflectiveTests(SourcesChangedEventTest); }); } @reflectiveTest class AnalysisOptionsImplTest { test_resetToDefaults() { // Note that this only tests options visible from the interface. AnalysisOptionsImpl defaultOptions = new AnalysisOptionsImpl(); AnalysisOptionsImpl modifiedOptions = new AnalysisOptionsImpl(); modifiedOptions.dart2jsHint = true; modifiedOptions.disableCacheFlushing = true; modifiedOptions.enabledPluginNames = ['somePackage']; modifiedOptions.enableLazyAssignmentOperators = true; modifiedOptions.enableSuperMixins = true; modifiedOptions.enableTiming = true; modifiedOptions.errorProcessors = [null]; modifiedOptions.excludePatterns = ['a']; modifiedOptions.generateImplicitErrors = false; modifiedOptions.generateSdkErrors = true; modifiedOptions.hint = false; modifiedOptions.lint = true; modifiedOptions.lintRules = [null]; modifiedOptions.patchPaths = { 'dart:core': ['/dart_core.patch.dart'] }; modifiedOptions.preserveComments = false; modifiedOptions.strongMode = true; modifiedOptions.trackCacheDependencies = false; modifiedOptions.resetToDefaults(); expect(modifiedOptions.dart2jsHint, defaultOptions.dart2jsHint); expect(modifiedOptions.disableCacheFlushing, defaultOptions.disableCacheFlushing); expect(modifiedOptions.enabledPluginNames, isEmpty); expect(modifiedOptions.enableLazyAssignmentOperators, defaultOptions.enableLazyAssignmentOperators); expect(modifiedOptions.enableSuperMixins, defaultOptions.enableSuperMixins); expect(modifiedOptions.enableTiming, defaultOptions.enableTiming); expect(modifiedOptions.errorProcessors, defaultOptions.errorProcessors); expect(modifiedOptions.excludePatterns, defaultOptions.excludePatterns); expect(modifiedOptions.generateImplicitErrors, defaultOptions.generateImplicitErrors); expect(modifiedOptions.generateSdkErrors, defaultOptions.generateSdkErrors); expect(modifiedOptions.hint, defaultOptions.hint); expect(modifiedOptions.lint, defaultOptions.lint); expect(modifiedOptions.lintRules, defaultOptions.lintRules); expect(modifiedOptions.patchPaths, defaultOptions.patchPaths); expect(modifiedOptions.preserveComments, defaultOptions.preserveComments); expect(modifiedOptions.strongMode, defaultOptions.strongMode); expect(modifiedOptions.trackCacheDependencies, defaultOptions.trackCacheDependencies); } } /** * A listener used to gather the [ImplicitAnalysisEvent]s that are produced * during analysis. */ class AnalyzedSourcesListener { /** * The events that have been gathered. */ List actualEvents = []; /** * The sources that are being implicitly analyzed. */ List analyzedSources = []; /** * Assert that the given source is currently being implicitly analyzed. */ void expectAnalyzed(Source source) { expect(analyzedSources, contains(source)); } /** * Assert that the given source is not currently being implicitly analyzed. */ void expectNotAnalyzed(Source source) { expect(analyzedSources, isNot(contains(source))); } /** * Record that the given event was produced. */ void onData(ImplicitAnalysisEvent event) { actualEvents.add(event); if (event.isAnalyzed) { analyzedSources.add(event.source); } else { analyzedSources.remove(event.source); } } } class MockSourceFactory extends SourceFactoryImpl { MockSourceFactory() : super([]); Source resolveUri(Source containingSource, String containedUri) { throw new UnimplementedError(); } } @reflectiveTest class SourcesChangedEventTest { void test_added() { var source = new StringSource('', '/test.dart'); var changeSet = new ChangeSet(); changeSet.addedSource(source); var event = new SourcesChangedEvent(changeSet); assertEvent(event, wereSourcesAdded: true); } void test_changedContent() { var source = new StringSource('', '/test.dart'); var changeSet = new ChangeSet(); changeSet.changedContent(source, 'library A;'); var event = new SourcesChangedEvent(changeSet); assertEvent(event, changedSources: [source]); } void test_changedContent2() { var source = new StringSource('', '/test.dart'); var event = new SourcesChangedEvent.changedContent(source, 'library A;'); assertEvent(event, changedSources: [source]); } void test_changedRange() { var source = new StringSource('', '/test.dart'); var changeSet = new ChangeSet(); changeSet.changedRange(source, 'library A;', 0, 0, 13); var event = new SourcesChangedEvent(changeSet); assertEvent(event, changedSources: [source]); } void test_changedRange2() { var source = new StringSource('', '/test.dart'); var event = new SourcesChangedEvent.changedRange(source, 'library A;', 0, 0, 13); assertEvent(event, changedSources: [source]); } void test_changedSources() { var source = new StringSource('', '/test.dart'); var changeSet = new ChangeSet(); changeSet.changedSource(source); var event = new SourcesChangedEvent(changeSet); assertEvent(event, changedSources: [source]); } void test_empty() { var changeSet = new ChangeSet(); var event = new SourcesChangedEvent(changeSet); assertEvent(event); } void test_removed() { var source = new StringSource('', '/test.dart'); var changeSet = new ChangeSet(); changeSet.removedSource(source); var event = new SourcesChangedEvent(changeSet); assertEvent(event, wereSourcesRemoved: true); } static void assertEvent(SourcesChangedEvent event, {bool wereSourcesAdded: false, List changedSources: Source.EMPTY_LIST, bool wereSourcesRemoved: false}) { expect(event.wereSourcesAdded, wereSourcesAdded); expect(event.changedSources, changedSources); expect(event.wereSourcesRemoved, wereSourcesRemoved); } } class SourcesChangedListener { List actualEvents = []; void assertEvent( {bool wereSourcesAdded: false, List changedSources: Source.EMPTY_LIST, bool wereSourcesRemovedOrDeleted: false}) { if (actualEvents.isEmpty) { fail('Expected event but found none'); } SourcesChangedEvent actual = actualEvents.removeAt(0); SourcesChangedEventTest.assertEvent(actual, wereSourcesAdded: wereSourcesAdded, changedSources: changedSources, wereSourcesRemoved: wereSourcesRemovedOrDeleted); } void assertNoMoreEvents() { expect(actualEvents, []); } void onData(SourcesChangedEvent event) { actualEvents.add(event); } } /** * An analysis context in which almost every method will cause a test to fail * when invoked. */ class TestAnalysisContext implements InternalAnalysisContext { @override final ReentrantSynchronousStream onResultInvalidated = new ReentrantSynchronousStream(); @override ResultProvider resultProvider; @override AnalysisCache get analysisCache { fail("Unexpected invocation of analysisCache"); } @override AnalysisOptions get analysisOptions { fail("Unexpected invocation of getAnalysisOptions"); } @override void set analysisOptions(AnalysisOptions options) { fail("Unexpected invocation of setAnalysisOptions"); } @override void set analysisPriorityOrder(List sources) { fail("Unexpected invocation of setAnalysisPriorityOrder"); } @override CacheConsistencyValidator get cacheConsistencyValidator { fail("Unexpected invocation of cacheConsistencyValidator"); } @override set contentCache(ContentCache value) { fail("Unexpected invocation of setContentCache"); } @override DeclaredVariables get declaredVariables { fail("Unexpected invocation of getDeclaredVariables"); } @deprecated @override EmbedderYamlLocator get embedderYamlLocator { fail("Unexpected invocation of get embedderYamlLocator"); } @override List get explicitTargets { fail("Unexpected invocation of visitCacheItems"); } @override ResolverProvider get fileResolverProvider { fail("Unexpected invocation of fileResolverProvider"); } @override void set fileResolverProvider(ResolverProvider resolverProvider) { fail("Unexpected invocation of fileResolverProvider"); } @override List get htmlSources { fail("Unexpected invocation of getHtmlSources"); } @override Stream get implicitAnalysisEvents { fail("Unexpected invocation of analyzedSources"); } bool get isActive { fail("Unexpected invocation of isActive"); } void set isActive(bool isActive) { fail("Unexpected invocation of isActive"); } @override bool get isDisposed { fail("Unexpected invocation of isDisposed"); } @override List get launchableClientLibrarySources { fail("Unexpected invocation of getLaunchableClientLibrarySources"); } @override List get launchableServerLibrarySources { fail("Unexpected invocation of getLaunchableServerLibrarySources"); } @override List get librarySources { fail("Unexpected invocation of getLibrarySources"); } @override String get name { fail("Unexpected invocation of name"); } @override set name(String value) { fail("Unexpected invocation of name"); } @override Stream get onSourcesChanged { fail("Unexpected invocation of onSourcesChanged"); } @override List get prioritySources { fail("Unexpected invocation of getPrioritySources"); } @override List get priorityTargets { fail("Unexpected invocation of visitCacheItems"); } @override CachePartition get privateAnalysisCachePartition { fail("Unexpected invocation of privateAnalysisCachePartition"); } @override SourceFactory get sourceFactory { fail("Unexpected invocation of getSourceFactory"); } @override void set sourceFactory(SourceFactory factory) { fail("Unexpected invocation of setSourceFactory"); } @override List get sources { fail("Unexpected invocation of sources"); } @override TypeProvider get typeProvider { fail("Unexpected invocation of getTypeProvider"); } @override void set typeProvider(TypeProvider typeProvider) { fail("Unexpected invocation of set typeProvider"); } @override TypeSystem get typeSystem { fail("Unexpected invocation of getTypeSystem"); } @override List get workManagers { fail("Unexpected invocation of workManagers"); } @override bool aboutToComputeResult(CacheEntry entry, ResultDescriptor result) { fail("Unexpected invocation of aboutToComputeResult"); } @override void addListener(AnalysisListener listener) { fail("Unexpected invocation of addListener"); } @override void applyAnalysisDelta(AnalysisDelta delta) { fail("Unexpected invocation of applyAnalysisDelta"); } @override void applyChanges(ChangeSet changeSet) { fail("Unexpected invocation of applyChanges"); } @override String computeDocumentationComment(Element element) { fail("Unexpected invocation of computeDocumentationComment"); } @override List computeErrors(Source source) { fail("Unexpected invocation of computeErrors"); } @override List computeExportedLibraries(Source source) { fail("Unexpected invocation of computeExportedLibraries"); } @override List computeImportedLibraries(Source source) { fail("Unexpected invocation of computeImportedLibraries"); } @override SourceKind computeKindOf(Source source) { fail("Unexpected invocation of computeKindOf"); } @override LibraryElement computeLibraryElement(Source source) { fail("Unexpected invocation of computeLibraryElement"); } @override LineInfo computeLineInfo(Source source) { fail("Unexpected invocation of computeLineInfo"); } @override CancelableFuture computeResolvedCompilationUnitAsync( Source source, Source librarySource) { fail("Unexpected invocation of getResolvedCompilationUnitFuture"); } @override V computeResult(AnalysisTarget target, ResultDescriptor result) { fail("Unexpected invocation of computeResult"); } @override void dispose() { fail("Unexpected invocation of dispose"); } @override List ensureResolvedDartUnits(Source source) { fail("Unexpected invocation of ensureResolvedDartUnits"); } @override bool exists(Source source) { fail("Unexpected invocation of exists"); } @override CacheEntry getCacheEntry(AnalysisTarget target) { fail("Unexpected invocation of visitCacheItems"); } @override CompilationUnitElement getCompilationUnitElement( Source unitSource, Source librarySource) { fail("Unexpected invocation of getCompilationUnitElement"); } @deprecated @override V getConfigurationData(ResultDescriptor key) { fail("Unexpected invocation of getConfigurationData"); } @override TimestampedData getContents(Source source) { fail("Unexpected invocation of getContents"); } @override InternalAnalysisContext getContextFor(Source source) { fail("Unexpected invocation of getContextFor"); } @override Element getElement(ElementLocation location) { fail("Unexpected invocation of getElement"); } @override AnalysisErrorInfo getErrors(Source source) { fail("Unexpected invocation of getErrors"); } @override List getHtmlFilesReferencing(Source source) { fail("Unexpected invocation of getHtmlFilesReferencing"); } @override SourceKind getKindOf(Source source) { fail("Unexpected invocation of getKindOf"); } @override List getLibrariesContaining(Source source) { fail("Unexpected invocation of getLibrariesContaining"); } @override List getLibrariesDependingOn(Source librarySource) { fail("Unexpected invocation of getLibrariesDependingOn"); } @override List getLibrariesReferencedFromHtml(Source htmlSource) { fail("Unexpected invocation of getLibrariesReferencedFromHtml"); } @override LibraryElement getLibraryElement(Source source) { fail("Unexpected invocation of getLibraryElement"); } @override LineInfo getLineInfo(Source source) { fail("Unexpected invocation of getLineInfo"); } @override int getModificationStamp(Source source) { fail("Unexpected invocation of getModificationStamp"); } @override ChangeNoticeImpl getNotice(Source source) { fail("Unexpected invocation of getNotice"); } @override Namespace getPublicNamespace(LibraryElement library) { fail("Unexpected invocation of getPublicNamespace"); } @override CompilationUnit getResolvedCompilationUnit( Source unitSource, LibraryElement library) { fail("Unexpected invocation of getResolvedCompilationUnit"); } @override CompilationUnit getResolvedCompilationUnit2( Source unitSource, Source librarySource) { fail("Unexpected invocation of getResolvedCompilationUnit"); } @override V getResult(AnalysisTarget target, ResultDescriptor result) { fail("Unexpected invocation of getResult"); } @override List getSourcesWithFullName(String path) { fail("Unexpected invocation of getSourcesWithFullName"); } @override bool handleContentsChanged( Source source, String originalContents, String newContents, bool notify) { fail("Unexpected invocation of handleContentsChanged"); } @override void invalidateLibraryHints(Source librarySource) { fail("Unexpected invocation of invalidateLibraryHints"); } @override bool isClientLibrary(Source librarySource) { fail("Unexpected invocation of isClientLibrary"); } @override bool isServerLibrary(Source librarySource) { fail("Unexpected invocation of isServerLibrary"); } @override Stream onResultChanged(ResultDescriptor descriptor) { fail("Unexpected invocation of onResultChanged"); } @deprecated @override Stream onResultComputed(ResultDescriptor descriptor) { fail("Unexpected invocation of onResultComputed"); } @override CompilationUnit parseCompilationUnit(Source source) { fail("Unexpected invocation of parseCompilationUnit"); } @override Document parseHtmlDocument(Source source) { fail("Unexpected invocation of parseHtmlDocument"); } @override AnalysisResult performAnalysisTask() { fail("Unexpected invocation of performAnalysisTask"); } @override void recordLibraryElements(Map elementMap) { fail("Unexpected invocation of recordLibraryElements"); } @override void removeListener(AnalysisListener listener) { fail("Unexpected invocation of removeListener"); } @override CompilationUnit resolveCompilationUnit( Source unitSource, LibraryElement library) { fail("Unexpected invocation of resolveCompilationUnit"); } @override CompilationUnit resolveCompilationUnit2( Source unitSource, Source librarySource) { fail("Unexpected invocation of resolveCompilationUnit"); } @override void setChangedContents(Source source, String contents, int offset, int oldLength, int newLength) { fail("Unexpected invocation of setChangedContents"); } @deprecated @override void setConfigurationData(ResultDescriptor key, Object data) { fail("Unexpected invocation of setConfigurationData"); } @override void setContents(Source source, String contents) { fail("Unexpected invocation of setContents"); } @override bool shouldErrorsBeAnalyzed(Source source) { fail("Unexpected invocation of shouldErrorsBeAnalyzed"); } @override void test_flushAstStructures(Source source) { fail("Unexpected invocation of test_flushAstStructures"); } @override void visitContentCache(ContentCacheVisitor visitor) { fail("Unexpected invocation of visitContentCache"); } }