| Index: pkg/analyzer/test/src/dart/sdk/patch_test.dart
|
| diff --git a/pkg/analyzer/test/src/dart/sdk/patch_test.dart b/pkg/analyzer/test/src/dart/sdk/patch_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..25fc34a5cd1fa24417467d90e9244c01b5e368a9
|
| --- /dev/null
|
| +++ b/pkg/analyzer/test/src/dart/sdk/patch_test.dart
|
| @@ -0,0 +1,176 @@
|
| +// 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.
|
| +
|
| +import 'package:analyzer/dart/ast/ast.dart';
|
| +import 'package:analyzer/file_system/file_system.dart';
|
| +import 'package:analyzer/file_system/memory_file_system.dart';
|
| +import 'package:analyzer/src/dart/sdk/patch.dart';
|
| +import 'package:analyzer/src/dart/sdk/sdk.dart';
|
| +import 'package:analyzer/src/generated/engine.dart';
|
| +import 'package:analyzer/src/generated/sdk.dart';
|
| +import 'package:analyzer/src/generated/source.dart';
|
| +import 'package:analyzer/src/util/fast_uri.dart';
|
| +import 'package:test/test.dart';
|
| +import 'package:test_reflective_loader/test_reflective_loader.dart';
|
| +
|
| +main() {
|
| + defineReflectiveSuite(() {
|
| + defineReflectiveTests(SdkPatcherTest);
|
| + });
|
| +}
|
| +
|
| +@reflectiveTest
|
| +class SdkPatcherTest {
|
| + MemoryResourceProvider provider = new MemoryResourceProvider();
|
| + Folder sdkFolder;
|
| + FolderBasedDartSdk sdk;
|
| +
|
| + SdkPatcher patcher = new SdkPatcher();
|
| + RecordingErrorListener listener = new RecordingErrorListener();
|
| +
|
| + void setUp() {
|
| + sdkFolder = provider.getFolder(_p('/sdk'));
|
| + }
|
| +
|
| + test_fail_noSuchLibrary() {
|
| + expect(() {
|
| + _setSdkLibraries('const LIBRARIES = const {};');
|
| + _createSdk();
|
| + File file = provider.newFile(_p('/sdk/lib/test/test.dart'), '');
|
| + Source source = file.createSource(FastUri.parse('dart:test'));
|
| + CompilationUnit unit = SdkPatcher.parse(source, true, listener);
|
| + patcher.patch(sdk, SdkLibraryImpl.VM_PLATFORM, listener, source, unit);
|
| + }, throwsArgumentError);
|
| + }
|
| +
|
| + test_fail_patchFileDoesNotExist() {
|
| + expect(() {
|
| + _setSdkLibraries(r'''
|
| +final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> {
|
| + 'test' : const LibraryInfo(
|
| + 'test/test.dart',
|
| + patches: {VM_PLATFORM: ['does_not_exists.dart']}),
|
| +};''');
|
| + _createSdk();
|
| + File file = provider.newFile(_p('/sdk/lib/test/test.dart'), '');
|
| + Source source = file.createSource(FastUri.parse('dart:test'));
|
| + CompilationUnit unit = SdkPatcher.parse(source, true, listener);
|
| + patcher.patch(sdk, SdkLibraryImpl.VM_PLATFORM, listener, source, unit);
|
| + }, throwsArgumentError);
|
| + }
|
| +
|
| + test_topLevel_append() {
|
| + CompilationUnit unit = _doTopLevelPatching(
|
| + r'''
|
| +int bar() => 2;
|
| +''',
|
| + r'''
|
| +int _foo1() => 1;
|
| +int get _foo2 => 1;
|
| +void set _foo3(int val) {}
|
| +''');
|
| + _assertUnitCode(
|
| + unit,
|
| + 'int bar() => 2; int _foo1() => 1; '
|
| + 'int get _foo2 => 1; void set _foo3(int val) {}');
|
| + }
|
| +
|
| + test_topLevel_fail_append_notPrivate() {
|
| + expect(() {
|
| + _doTopLevelPatching(
|
| + r'''
|
| +int foo() => 1;
|
| +''',
|
| + r'''
|
| +int bar() => 2;
|
| +''');
|
| + }, throwsArgumentError);
|
| + }
|
| +
|
| + test_topLevel_fail_noExternalKeyword() {
|
| + expect(() {
|
| + _doTopLevelPatching(
|
| + r'''
|
| +int foo();
|
| +''',
|
| + r'''
|
| +@patch
|
| +int foo() => 1;
|
| +''');
|
| + }, throwsArgumentError);
|
| + }
|
| +
|
| + test_topLevel_patch_function() {
|
| + CompilationUnit unit = _doTopLevelPatching(
|
| + r'''
|
| +external int foo();
|
| +int bar() => 2;
|
| +''',
|
| + r'''
|
| +@patch
|
| +int foo() => 1;
|
| +''');
|
| + _assertUnitCode(unit, 'int foo() => 1; int bar() => 2;');
|
| + }
|
| +
|
| + test_topLevel_patch_getter() {
|
| + CompilationUnit unit = _doTopLevelPatching(
|
| + r'''
|
| +external int get foo;
|
| +int bar() => 2;
|
| +''',
|
| + r'''
|
| +@patch
|
| +int get foo => 1;
|
| +''');
|
| + _assertUnitCode(unit, 'int get foo => 1; int bar() => 2;');
|
| + }
|
| +
|
| + test_topLevel_patch_setter() {
|
| + CompilationUnit unit = _doTopLevelPatching(
|
| + r'''
|
| +external void set foo(int val);
|
| +int bar() => 2;
|
| +''',
|
| + r'''
|
| +@patch
|
| +void set foo(int val) {}
|
| +''');
|
| + _assertUnitCode(unit, 'void set foo(int val) {} int bar() => 2;');
|
| + }
|
| +
|
| + void _assertUnitCode(CompilationUnit unit, String expectedCode) {
|
| + expect(unit.toSource(), expectedCode);
|
| + }
|
| +
|
| + void _createSdk() {
|
| + sdk = new FolderBasedDartSdk(provider, sdkFolder);
|
| + sdk.analysisOptions = new AnalysisOptionsImpl()..strongMode = true;
|
| + }
|
| +
|
| + CompilationUnit _doTopLevelPatching(String baseCode, String patchCode) {
|
| + _setSdkLibraries(r'''
|
| +final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> {
|
| + 'test' : const LibraryInfo(
|
| + 'test/test.dart',
|
| + patches: {VM_PLATFORM: ['test/test_patch.dart']}),
|
| +};''');
|
| + File file = provider.newFile(_p('/sdk/lib/test/test.dart'), baseCode);
|
| + provider.newFile(_p('/sdk/lib/test/test_patch.dart'), patchCode);
|
| +
|
| + _createSdk();
|
| +
|
| + Source source = file.createSource(FastUri.parse('dart:test'));
|
| + CompilationUnit unit = SdkPatcher.parse(source, true, listener);
|
| + patcher.patch(sdk, SdkLibraryImpl.VM_PLATFORM, listener, source, unit);
|
| + return unit;
|
| + }
|
| +
|
| + String _p(String path) => provider.convertPath(path);
|
| +
|
| + void _setSdkLibraries(String code) {
|
| + provider.newFile(
|
| + _p('/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart'), code);
|
| + }
|
| +}
|
|
|