Chromium Code Reviews| Index: pkg/analyzer/test/src/summary/summary_sdk_test.dart |
| diff --git a/pkg/analyzer/test/src/summary/summary_sdk_test.dart b/pkg/analyzer/test/src/summary/summary_sdk_test.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..46e715ef257e1d1fbb252171ff0d6989c50be5c2 |
| --- /dev/null |
| +++ b/pkg/analyzer/test/src/summary/summary_sdk_test.dart |
| @@ -0,0 +1,262 @@ |
| +// Copyright (c) 2016, 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.summary.summary_sdk_test; |
| + |
| +import 'dart:io'; |
| + |
| +import 'package:analyzer/dart/element/element.dart'; |
| +import 'package:analyzer/src/context/cache.dart'; |
| +import 'package:analyzer/src/generated/engine.dart' |
| + show AnalysisContext, CacheState; |
| +import 'package:analyzer/src/generated/resolver.dart' show TypeProvider; |
| +import 'package:analyzer/src/generated/sdk.dart'; |
| +import 'package:analyzer/src/generated/source.dart'; |
| +import 'package:analyzer/src/summary/format.dart'; |
| +import 'package:analyzer/src/summary/summary_sdk.dart'; |
| +import 'package:analyzer/src/task/dart.dart'; |
| +import 'package:analyzer/task/dart.dart'; |
| +import 'package:analyzer/task/model.dart' show AnalysisContextTarget; |
| +import 'package:analyzer/task/model.dart'; |
| +import 'package:path/path.dart' as pathos; |
| +import 'package:unittest/unittest.dart'; |
| + |
| +import '../../generated/test_support.dart'; |
| +import '../../reflective_tests.dart'; |
| + |
| +main() { |
| + groupSep = ' | '; |
| + runReflectiveTests(SummarySdkAnalysisContextTest); |
| +} |
| + |
| +@reflectiveTest |
| +class SummarySdkAnalysisContextTest { |
| + static String _analyzerPackagePath; |
| + static bool _analyzerPackagePathInitialized = false; |
| + |
| + static SdkBundle sdkBundle; |
| + |
| + SummarySdkAnalysisContext context; |
| + |
| + void setUp() { |
| + _initializeSdkContext(); |
| + } |
| + |
| + test_libraryResults() { |
| + if (context == null) { |
| + return; |
| + } |
| + for (String uri in sdkBundle.prelinkedLibraryUris) { |
| + // TODO(scheglov) breaks at _LibraryResynthesizer.buildImplicitTopLevelVariable |
| + if (uri == 'dart:io' || uri == 'dart:_isolate_helper') { |
| + continue; |
| + } |
| + _assertLibraryResults(uri); |
| + } |
| + } |
| + |
| + test_sourceKind() { |
| + if (context == null) { |
| + return; |
| + } |
| + // libraries |
| + _assertHasSourceKind('dart:core', SourceKind.LIBRARY); |
| + _assertHasSourceKind('dart:async', SourceKind.LIBRARY); |
| + _assertHasSourceKind('dart:math', SourceKind.LIBRARY); |
| + // parts |
| + _assertHasSourceKind('dart:core/bool.dart', SourceKind.PART); |
| + _assertHasSourceKind('dart:async/future.dart', SourceKind.PART); |
| + // unknown |
| + _assertHasSourceKind('dart:no_such_library.dart', null); |
| + _assertHasSourceKind('dart:core/no_such_part.dart', null); |
| + } |
| + |
| + test_typeProvider() { |
| + if (context == null) { |
| + return; |
| + } |
| + AnalysisContextTarget target = AnalysisContextTarget.request; |
| + CacheEntry cacheEntry = context.getCacheEntry(target); |
| + bool hasResult = context.aboutToComputeResult(cacheEntry, TYPE_PROVIDER); |
| + expect(hasResult, isTrue); |
| + expect(cacheEntry.getState(TYPE_PROVIDER), CacheState.VALID); |
| + TypeProvider typeProvider = cacheEntry.getValue(TYPE_PROVIDER); |
| + expect(typeProvider.objectType, isNotNull); |
| + expect(typeProvider.boolType, isNotNull); |
| + expect(typeProvider.intType, isNotNull); |
| + expect(typeProvider.futureType, isNotNull); |
| + expect(typeProvider.futureDynamicType, isNotNull); |
| + expect(typeProvider.streamType, isNotNull); |
| + expect(typeProvider.streamDynamicType, isNotNull); |
| + } |
| + |
| + void _assertHasLibraryElement(CacheEntry cacheEntry, |
| + ResultDescriptor<LibraryElement> resultDescriptor) { |
| + bool hasResult = context.aboutToComputeResult(cacheEntry, resultDescriptor); |
| + expect(hasResult, isTrue); |
| + expect(cacheEntry.getState(resultDescriptor), CacheState.VALID); |
| + LibraryElement library = cacheEntry.getValue(resultDescriptor); |
| + expect(library, isNotNull); |
| + } |
| + |
| + void _assertHasSourceKind(String uri, SourceKind expectedValue) { |
| + Source target = context.sourceFactory.forUri(uri); |
| + CacheEntry cacheEntry = context.getCacheEntry(target); |
| + ResultDescriptor<SourceKind> resultDescriptor = SOURCE_KIND; |
| + bool hasResult = context.aboutToComputeResult(cacheEntry, resultDescriptor); |
| + if (expectedValue == null) { |
| + expect(hasResult, isFalse); |
| + expect(cacheEntry.getState(resultDescriptor), CacheState.INVALID); |
| + } else { |
| + expect(hasResult, isTrue); |
| + expect(cacheEntry.getState(resultDescriptor), CacheState.VALID); |
| + SourceKind value = cacheEntry.getValue(resultDescriptor); |
| + expect(value, expectedValue); |
| + } |
| + } |
| + |
| + void _assertIsLibraryElementReady( |
| + CacheEntry cacheEntry, ResultDescriptor<bool> resultDescriptor) { |
| + bool hasResult = context.aboutToComputeResult(cacheEntry, resultDescriptor); |
| + expect(hasResult, isTrue); |
| + expect(cacheEntry.getState(resultDescriptor), CacheState.VALID); |
| + bool ready = cacheEntry.getValue(resultDescriptor); |
| + expect(ready, isTrue); |
| + } |
| + |
| + void _assertLibraryResults(String uri) { |
| + Source target = context.sourceFactory.forUri(uri); |
| + CacheEntry cacheEntry = context.getCacheEntry(target); |
| + _assertHasLibraryElement(cacheEntry, LIBRARY_ELEMENT1); |
| + _assertHasLibraryElement(cacheEntry, LIBRARY_ELEMENT2); |
| + _assertHasLibraryElement(cacheEntry, LIBRARY_ELEMENT3); |
| + _assertHasLibraryElement(cacheEntry, LIBRARY_ELEMENT4); |
| + _assertHasLibraryElement(cacheEntry, LIBRARY_ELEMENT5); |
| + _assertHasLibraryElement(cacheEntry, LIBRARY_ELEMENT6); |
| + _assertHasLibraryElement(cacheEntry, LIBRARY_ELEMENT7); |
| + _assertHasLibraryElement(cacheEntry, LIBRARY_ELEMENT8); |
| + _assertHasLibraryElement(cacheEntry, LIBRARY_ELEMENT); |
| + _assertIsLibraryElementReady(cacheEntry, READY_LIBRARY_ELEMENT2); |
| + _assertIsLibraryElementReady(cacheEntry, READY_LIBRARY_ELEMENT5); |
| + _assertIsLibraryElementReady(cacheEntry, READY_LIBRARY_ELEMENT6); |
| + } |
| + |
| + void _initializeSdkBundle() { |
| + if (sdkBundle != null) { |
| + return; |
| + } |
| + // prepare analyzer path |
| + String analyzerPath = getAnalyzerPackagePath(); |
| + if (analyzerPath == null) { |
| + return; |
| + } |
| + // prepare summary path |
| + String sdkSummaryPath = pathos.join( |
| + analyzerPath, 'test', 'src', 'summary', 'sdk_analysis_summary'); |
| + File file = new File(sdkSummaryPath); |
| + if (!file.existsSync()) { |
| + return; |
| + } |
| + // load SdkBundle |
| + List<int> bytes = file.readAsBytesSync(); |
| + sdkBundle = new SdkBundle.fromBuffer(bytes); |
| + } |
| + |
| + void _initializeSdkContext() { |
| + _initializeSdkBundle(); |
| + if (sdkBundle == null) { |
| + return; |
| + } |
| +// print(sdkBundle); |
|
Paul Berry
2016/01/06 15:46:15
Did you mean to delete these commented-out lines?
|
| + context = new _TestSummarySdkAnalysisContext(sdkBundle); |
| +// print(context); |
| + context.sourceFactory = |
| + new SourceFactory([new DartUriResolver(new _TestSummaryDartSdk())]); |
| +// context.sourceFactory = new SourceFactory([new _TestSdkUriResolver()]); |
| +// context.sourceFactory = new _TestSourceFactory(); |
| +// DirectoryBasedDartSdk defaultSdk = DirectoryBasedDartSdk.defaultSdk; |
| +// context.sourceFactory = |
| +// new SourceFactory([new DartUriResolver(defaultSdk)]); |
| + } |
| + |
| + static String getAnalyzerPackagePath() { |
| + if (!_analyzerPackagePathInitialized) { |
| + _analyzerPackagePathInitialized = true; |
| + _analyzerPackagePath = _computeAnalyzerPackagePath(); |
| + } |
| + return _analyzerPackagePath; |
| + } |
| + |
| + /** |
| + * Return the path to the `analyzer` package root, or `null` if it cannot |
| + * be determined. |
| + * |
| + * This method expects that one of the `analyzer` tests was run, so |
| + * [Platform.script] is inside of the `analyzer/test` folder. |
| + */ |
| + static String _computeAnalyzerPackagePath() { |
| + Uri uri = Platform.script; |
| + if (uri == null || uri.scheme != 'file') { |
| + return null; |
| + } |
| + String path = pathos.fromUri(uri); |
| + List<String> segments = pathos.split(path); |
| + while (segments.length > 2) { |
| + if (segments[segments.length - 1] == 'test' && |
| + segments[segments.length - 2] == 'analyzer') { |
| + segments.removeLast(); |
| + return pathos.joinAll(segments); |
| + } |
| + segments.removeLast(); |
| + } |
| + return null; |
| + } |
| +} |
| + |
| +class _TestSummaryDartSdk implements DartSdk { |
| + @override |
| + Source mapDartUri(String uriStr) { |
| + Uri uri = Uri.parse(uriStr); |
| + List<String> segments = uri.pathSegments; |
| + if (segments.length == 1) { |
| + String libraryName = segments.first; |
| + String path = '/sdk/$libraryName/$libraryName.dart'; |
| + return new _TestSummarySdkSource(path, uri); |
| + } else { |
| + String path = '/sdk/' + segments.join('/'); |
| + return new _TestSummarySdkSource(path, uri); |
| + } |
| + } |
| + |
| + noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
| +} |
| + |
| +/** |
| + * [SummarySdkAnalysisContext] with simplified cache creation. |
| + */ |
| +class _TestSummarySdkAnalysisContext extends SummarySdkAnalysisContext { |
| + _TestSummarySdkAnalysisContext(SdkBundle bundle) : super(bundle); |
| + |
| + @override |
| + AnalysisCache createCacheFromSourceFactory(SourceFactory factory) { |
| + return new AnalysisCache(<CachePartition>[new SdkCachePartition(this)]); |
| + } |
| +} |
| + |
| +class _TestSummarySdkSource extends TestSourceWithUri { |
| + _TestSummarySdkSource(String path, Uri uri) : super(path, uri); |
| + |
| + @override |
| + bool get isInSystemLibrary => true; |
| + |
| + @override |
| + Uri resolveRelativeUri(Uri relativeUri) { |
| + Uri baseUri = uri; |
| + if (uri.scheme == 'dart') { |
| + String libraryName = uri.path; |
| + baseUri = Uri.parse('dart:$libraryName/$libraryName.dart'); |
| + } |
| + return baseUri.resolveUri(relativeUri); |
| + } |
| +} |