Skip to content

Move many package and library tests from end2end to unit tests #2345

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Sep 12, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lib/src/package_config_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ class FakePackageConfigProvider implements PackageConfigProvider {

@override
Future<package_config.PackageConfig> findPackageConfig(Folder dir) async {
assert(_packageConfigData[dir.path] != null,
'Package config data at ${dir.path} should not be null');
return package_config.PackageConfig(_packageConfigData[dir.path]);
}
}
6 changes: 6 additions & 0 deletions lib/src/package_meta.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/file_system/physical_file_system.dart';
import 'package:analyzer/src/generated/sdk.dart';
import 'package:dartdoc/dartdoc.dart';
import 'package:meta/meta.dart';
import 'package:path/path.dart' as p;
import 'package:yaml/yaml.dart';

Expand Down Expand Up @@ -487,3 +488,8 @@ class _SdkMeta extends PubPackageMeta {
@override
File getChangelogContents() => null;
}

@visibleForTesting
void clearPackageMetaCache() {
_packageMetaCache.clear();
}
1 change: 0 additions & 1 deletion test/end2end/html_generator_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,6 @@ void main() {
generator = await _initGeneratorForTest();
packageGraph = await utils.bootBasicPackage(
testPackageDuplicateDir.path,
[],
pubPackageMetaProvider,
PhysicalPackageConfigProvider());
tempOutput = await resourceProvider.createSystemTemp('doc_test_temp');
Expand Down
136 changes: 45 additions & 91 deletions test/end2end/model_special_cases_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,27 +27,30 @@ final Version _platformVersion = Version.parse(_platformVersionString);
final _testPackageGraphExperimentsMemo = AsyncMemoizer<PackageGraph>();
Future<PackageGraph> get _testPackageGraphExperiments =>
_testPackageGraphExperimentsMemo.runOnce(() => utils.bootBasicPackage(
'testing/test_package_experiments',
[],
pubPackageMetaProvider,
PhysicalPackageConfigProvider(),
additionalArguments: [
'--enable-experiment',
'non-nullable',
'--no-link-to-remote'
]));
'testing/test_package_experiments',
pubPackageMetaProvider,
PhysicalPackageConfigProvider(),
additionalArguments: [
'--enable-experiment',
'non-nullable',
'--no-link-to-remote'
]));

final _testPackageGraphGinormousMemo = AsyncMemoizer<PackageGraph>();
Future<PackageGraph> get _testPackageGraphGinormous =>
_testPackageGraphGinormousMemo.runOnce(() => utils.bootBasicPackage(
'testing/test_package',
['css', 'code_in_commnets', 'excluded'],
pubPackageMetaProvider,
PhysicalPackageConfigProvider(),
additionalArguments: [
'--auto-include-dependencies',
'--no-link-to-remote'
]));
'testing/test_package',
pubPackageMetaProvider,
PhysicalPackageConfigProvider(),
excludeLibraries: [
'css',
'code_in_commnets',
'excluded'
],
additionalArguments: [
'--auto-include-dependencies',
'--no-link-to-remote'
]));

final _testPackageGraphSdkMemo = AsyncMemoizer<PackageGraph>();
Future<PackageGraph> get _testPackageGraphSdk =>
Expand Down Expand Up @@ -261,9 +264,9 @@ void main() {
setUpAll(() async {
injectionPackageGraph = await utils.bootBasicPackage(
'testing/test_package',
['css', 'code_in_comments', 'excluded'],
pubPackageMetaProvider,
PhysicalPackageConfigProvider(),
excludeLibraries: ['css', 'code_in_comments', 'excluded'],
additionalArguments: ['--inject-html']);

injectionExLibrary =
Expand Down Expand Up @@ -429,79 +432,30 @@ void main() {
sdkAsPackageGraph = await _testPackageGraphSdk;
});

group('test package', () {
test('sdk name', () {
expect(sdkAsPackageGraph.defaultPackage.name, equals('Dart'));
expect(sdkAsPackageGraph.defaultPackage.kind, equals('SDK'));
});

test('sdk homepage', () {
expect(sdkAsPackageGraph.defaultPackage.hasHomepage, isTrue);
expect(sdkAsPackageGraph.defaultPackage.homepage,
equals('https://github.com/dart-lang/sdk'));
});

test('sdk version', () {
expect(sdkAsPackageGraph.defaultPackage.version, isNotNull);
});

test('sdk description', () {
expect(sdkAsPackageGraph.defaultPackage.documentation,
startsWith('Welcome'));
});
});

group('SDK-specific cases', () {
test('Verify Interceptor is hidden from inheritance in docs', () {
var htmlLibrary = sdkAsPackageGraph.libraries
.singleWhere((l) => l.name == 'dart:html');
var EventTarget =
htmlLibrary.allClasses.singleWhere((c) => c.name == 'EventTarget');
var hashCode = EventTarget.publicInstanceFields
.singleWhere((f) => f.name == 'hashCode');
var objectModelElement =
sdkAsPackageGraph.specialClasses[SpecialClass.object];
// If this fails, EventTarget might have been changed to no longer
// inherit from Interceptor. If that's true, adjust test case to
// another class that does.
expect(
hashCode.inheritance.any((c) => c.name == 'Interceptor'), isTrue);
// If EventTarget really does start implementing hashCode, this will
// fail.
expect(hashCode.href,
equals('${HTMLBASE_PLACEHOLDER}dart-core/Object/hashCode.html'));
expect(
hashCode.canonicalEnclosingContainer, equals(objectModelElement));
expect(
EventTarget.publicSuperChainReversed
.any((et) => et.name == 'Interceptor'),
isFalse);
});

test('Verify pragma is hidden in SDK docs', () {
var pragmaModelElement =
sdkAsPackageGraph.specialClasses[SpecialClass.pragma];
expect(pragmaModelElement.name, equals('pragma'));
});
});
});

group('Library', () {
Library dartAsyncLib;

setUpAll(() async {
dartAsyncLib = (await _testPackageGraphSdk)
.libraries
.firstWhere((l) => l.name == 'dart:async');
// Make sure the first library is dart:async
expect(dartAsyncLib.name, 'dart:async');
});

test('sdk library have formatted names', () {
expect(dartAsyncLib.name, 'dart:async');
expect(dartAsyncLib.dirName, 'dart-async');
expect(dartAsyncLib.href,
'${HTMLBASE_PLACEHOLDER}dart-async/dart-async-library.html');
// Analyzer's MockSdk's html library doesn't conform to the expectations
// of this test.
test('Verify Interceptor is hidden from inheritance in docs', () {
var htmlLibrary =
sdkAsPackageGraph.libraries.singleWhere((l) => l.name == 'dart:html');
var EventTarget =
htmlLibrary.allClasses.singleWhere((c) => c.name == 'EventTarget');
var hashCode = EventTarget.publicInstanceFields
.singleWhere((f) => f.name == 'hashCode');
var objectModelElement =
sdkAsPackageGraph.specialClasses[SpecialClass.object];
// If this fails, EventTarget might have been changed to no longer
// inherit from Interceptor. If that's true, adjust test case to
// another class that does.
expect(hashCode.inheritance.any((c) => c.name == 'Interceptor'), isTrue);
// If EventTarget really does start implementing hashCode, this will
// fail.
expect(hashCode.href,
equals('${HTMLBASE_PLACEHOLDER}dart-core/Object/hashCode.html'));
expect(hashCode.canonicalEnclosingContainer, equals(objectModelElement));
expect(
EventTarget.publicSuperChainReversed
.any((et) => et.name == 'Interceptor'),
isFalse);
});
});
}
74 changes: 1 addition & 73 deletions test/end2end/model_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ final _testPackageGraphMemo = AsyncMemoizer<PackageGraph>();
Future<PackageGraph> get _testPackageGraph =>
_testPackageGraphMemo.runOnce(() => utils.bootBasicPackage(
'testing/test_package',
['css', 'code_in_comments'],
pubPackageMetaProvider,
PhysicalPackageConfigProvider(),
excludeLibraries: ['css', 'code_in_comments'],
additionalArguments: ['--no-link-to-remote']));

/// For testing sort behavior.
Expand Down Expand Up @@ -70,7 +70,6 @@ void main() {
Library exLibrary;
Library fakeLibrary;
Library twoExportsLib;
Library interceptorsLib;
Library baseClassLib;
Library dartAsync;

Expand All @@ -85,8 +84,6 @@ void main() {
packageGraph.libraries.firstWhere((lib) => lib.name == 'dart:async');
twoExportsLib =
packageGraph.libraries.firstWhere((lib) => lib.name == 'two_exports');
interceptorsLib = packageGraph.libraries
.firstWhere((lib) => lib.name == 'dart:_interceptors');
baseClassLib =
packageGraph.libraries.firstWhere((lib) => lib.name == 'base_class');
});
Expand Down Expand Up @@ -474,75 +471,6 @@ void main() {
});
});

group('Package', () {
group('test package', () {
test('name', () {
expect(packageGraph.defaultPackage.name, 'test_package');
});

test('libraries', () {
expect(packageGraph.localPublicLibraries,
hasLength(utils.kTestPackagePublicLibraries));
expect(interceptorsLib.isPublic, isFalse);
});

test('homepage', () {
expect(packageGraph.defaultPackage.hasHomepage, true);
expect(packageGraph.defaultPackage.homepage,
equals('http://github.com/dart-lang'));
});

test('packages', () {
expect(packageGraph.localPackages, hasLength(1));

var package = packageGraph.localPackages.first;
expect(package.name, 'test_package');
expect(package.publicLibraries,
hasLength(utils.kTestPackagePublicLibraries));
});

test('is documented in library', () {
expect(exLibrary.isDocumented, isTrue);
});

test('has documentation', () {
expect(packageGraph.defaultPackage.hasDocumentationFile, isTrue);
expect(packageGraph.defaultPackage.hasDocumentation, isTrue);
});

test('documentation exists', () {
expect(
packageGraph.defaultPackage.documentation
.startsWith('# Best Package'),
isTrue);
});

test('documentation can be rendered as HTML', () {
expect(packageGraph.defaultPackage.documentationAsHtml,
contains('<h1 id="best-package">Best Package</h1>'));
});

test('has anonymous libraries', () {
expect(
packageGraph.libraries
.where((lib) => lib.name == 'anonymous_library'),
hasLength(1));
expect(
packageGraph.libraries
.where((lib) => lib.name == 'another_anonymous_lib'),
hasLength(1));
});
});

group('SDK-specific cases', () {
test('Verify pragma is hidden in docs', () {
var HasPragma = fakeLibrary.allClasses
.firstWhere((Class c) => c.name == 'HasPragma');
expect(HasPragma.annotations, isEmpty);
});
});
});

group('Library', () {
Library anonLib,
isDeprecated,
Expand Down
67 changes: 67 additions & 0 deletions test/library_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// Copyright (c) 2020, 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/file_system/file_system.dart';
import 'package:analyzer/file_system/memory_file_system.dart';
import 'package:analyzer/src/test_utilities/mock_sdk.dart';
import 'package:dartdoc/src/dartdoc_options.dart';
import 'package:dartdoc/src/model/model.dart';
import 'package:dartdoc/src/package_config_provider.dart';
import 'package:dartdoc/src/package_meta.dart';
import 'package:test/test.dart';

import 'src/utils.dart' as utils;

void main() {
MemoryResourceProvider resourceProvider;
MockSdk mockSdk;
Folder sdkFolder;

PackageMetaProvider packageMetaProvider;
FakePackageConfigProvider packageConfigProvider;

setUp(() async {
resourceProvider = MemoryResourceProvider();
mockSdk = MockSdk(resourceProvider: resourceProvider);
sdkFolder = utils.writeMockSdkFiles(mockSdk);

packageMetaProvider = PackageMetaProvider(
PubPackageMeta.fromElement,
PubPackageMeta.fromFilename,
PubPackageMeta.fromDir,
resourceProvider,
sdkFolder,
defaultSdk: mockSdk,
);
var optionSet = await DartdocOptionSet.fromOptionGenerators(
'dartdoc', [createDartdocOptions], packageMetaProvider);
optionSet.parseArguments([]);
packageConfigProvider = FakePackageConfigProvider();
// To build the package graph, we always ask package_config for a
// [PackageConfig] for the SDK directory. Put a dummy entry in.
packageConfigProvider.addPackageToConfigFor(
sdkFolder.path, 'analyzer', Uri.file('/sdk/pkg/analyzer/'));
});

test('libraries in SDK package have appropriate data', () async {
var packageGraph = await utils.bootBasicPackage(
sdkFolder.path, packageMetaProvider, packageConfigProvider,
additionalArguments: [
'--input',
packageMetaProvider.defaultSdkDir.path,
]);

var localPackages = packageGraph.localPackages;
expect(localPackages, hasLength(1));
var sdkPackage = localPackages.single;
expect(sdkPackage.name, equals('Dart'));

var dartAsyncLib =
sdkPackage.libraries.firstWhere((l) => l.name == 'dart:async');
expect(dartAsyncLib.name, 'dart:async');
expect(dartAsyncLib.dirName, 'dart-async');
expect(dartAsyncLib.href,
'${HTMLBASE_PLACEHOLDER}dart-async/dart-async-library.html');
});
}
Loading