blob: 25be790583d287177c48bf63db38073e184195dd [file] [log] [blame]
// 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/memory_file_system.dart';
import 'package:dartdoc/src/model/model.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'dartdoc_test_base.dart';
import 'src/test_descriptor_utils.dart' as d;
import 'src/utils.dart';
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(LibrariesTest);
defineReflectiveTests(LibrariesInAdditionalPackageTest);
});
// TODO(srawlins): Migrate to test_reflective_loader tests.
test('A named library', () async {
var packageMetaProvider = testPackageMetaProvider;
var packagePath = await d.createPackage(
'test_package',
libFiles: [
d.file('lib.dart', '''
/// A doc comment.
///
/// **Details**.
library name.and.dots;
'''),
],
resourceProvider:
packageMetaProvider.resourceProvider as MemoryResourceProvider,
);
final packageConfigProvider =
getTestPackageConfigProvider(packageMetaProvider.defaultSdkDir.path);
packageConfigProvider.addPackageToConfigFor(
packagePath, 'library_test', Uri.file('$packagePath/'));
final packageGraph = await bootBasicPackage(
packagePath,
packageMetaProvider,
packageConfigProvider,
);
final library = packageGraph.libraries.named('name.and.dots');
expect(library.name, 'name.and.dots');
expect(library.fullyQualifiedName, 'name.and.dots');
expect(library.packageName, 'test_package');
expect(library.documentationComment, '''
/// A doc comment.
///
/// **Details**.''');
expect(library.documentation, '''
A doc comment.
**Details**.''');
expect(library.oneLineDoc, 'A doc comment.');
});
test('An unnamed library', () async {
var packageMetaProvider = testPackageMetaProvider;
var packagePath = await d.createPackage(
'test_package',
libFiles: [
d.file('lib.dart', '''
/// A doc comment.
///
/// **Details**.
library;
'''),
],
resourceProvider:
packageMetaProvider.resourceProvider as MemoryResourceProvider,
);
final packageConfigProvider =
getTestPackageConfigProvider(packageMetaProvider.defaultSdkDir.path);
packageConfigProvider.addPackageToConfigFor(
packagePath, 'library_test', Uri.file('$packagePath/'));
final packageGraph = await bootBasicPackage(
packagePath,
packageMetaProvider,
packageConfigProvider,
);
final library = packageGraph.libraries.named('lib');
expect(library.name, 'lib');
expect(library.fullyQualifiedName, 'lib');
expect(library.packageName, 'test_package');
expect(library.documentationComment, '''
/// A doc comment.
///
/// **Details**.''');
expect(library.documentation, '''
A doc comment.
**Details**.''');
expect(library.oneLineDoc, 'A doc comment.');
});
test('Libraries are sorted properly', () async {
var packageMetaProvider = testPackageMetaProvider;
var resourceProvider =
packageMetaProvider.resourceProvider as MemoryResourceProvider;
var packagePath = await d.createPackage(
'test_package',
libFiles: [
d.dir('d', [d.file('a.dart', '')]),
d.dir('e', [d.file('a.dart', '')]),
// Unnamed library with library directive.
d.file('b.dart', 'library;'),
// Unnamed library without library directives.
d.file('c.dart', ''),
d.file('d.dart', 'library;'),
d.file('e.dart', ''),
],
resourceProvider: resourceProvider,
);
final packageConfigProvider =
getTestPackageConfigProvider(packageMetaProvider.defaultSdkDir.path);
packageConfigProvider.addPackageToConfigFor(
packagePath, 'library_test', Uri.file('$packagePath/'));
final packageGraph = await bootBasicPackage(
packagePath,
packageMetaProvider,
packageConfigProvider,
);
final daName = resourceProvider.convertPath('d/a');
final eaName = resourceProvider.convertPath('e/a');
final daLibrary = packageGraph.libraries.displayNamed(daName);
final eaLibrary = packageGraph.libraries.displayNamed(eaName);
final bLibrary = packageGraph.libraries.displayNamed('b');
final cLibrary = packageGraph.libraries.displayNamed('c');
final dLibrary = packageGraph.libraries.displayNamed('d');
final eLibrary = packageGraph.libraries.displayNamed('e');
var libraries = [
daLibrary,
eaLibrary,
bLibrary,
cLibrary,
dLibrary,
eLibrary,
]..sort(byName);
expect(
libraries.map((l) => l.displayName),
containsAllInOrder(['b', 'c', 'd', daName, 'e', eaName]),
);
});
test('libraries in SDK package have appropriate data',
onPlatform: {'windows': Skip('Test does not work on Windows (#2446)')},
() async {
var packageMetaProvider = testPackageMetaProvider;
var sdkFolder = packageMetaProvider.defaultSdkDir;
var packageConfigProvider = getTestPackageConfigProvider(sdkFolder.path);
var packageGraph = await 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.named('dart:async');
expect(dartAsyncLib.name, 'dart:async');
expect(dartAsyncLib.dirName, 'dart-async');
expect(dartAsyncLib.href, '${htmlBasePlaceholder}dart-async/');
});
}
@reflectiveTest
class LibrariesTest extends DartdocTestBase {
@override
String get libraryName => 'libraries';
void test_publicLibrary() async {
var library = await bootPackageWithLibrary(
'var x = 1;',
libraryFilePath: 'lib/library.dart',
);
expect(library.name, 'libraries');
expect(library.qualifiedName, 'libraries');
expect(library.href, '${placeholder}libraries/');
}
void test_library_containsClassWithSameNameAsDartSdk() async {
var library = await bootPackageWithLibrary(
'export "dart:io";',
libraryFilePath: 'lib/library.dart',
);
expect(library.classes.named('FileSystemEntity').linkedName,
'<a href="$dartSdkUrlPrefix/dart-io/FileSystemEntity-class.html">FileSystemEntity</a>');
}
void test_publicLibrary_unnamed() async {
var library =
(await bootPackageFromFiles([d.file('lib/lib1.dart', 'library;')]))
.libraries
.named('lib1');
expect(library.name, 'lib1');
expect(library.qualifiedName, 'lib1');
expect(library.href, '${placeholder}lib1/');
expect(library.redirectingPath, 'lib1/lib1-library.html');
}
void test_exportedLibrary() async {
var library = await bootPackageWithLibrary(
'var x = 1;',
libraryFilePath: 'lib/src/library.dart',
extraFiles: [
d.dir('lib', [
d.file('public.dart', '''
export 'src/library.dart';
''')
]),
],
);
expect(library.qualifiedName, 'libraries');
expect(library.name, 'libraries');
expect(library.href, '${placeholder}public/');
}
}
@reflectiveTest
class LibrariesInAdditionalPackageTest extends DartdocTestBase {
@override
String get libraryName => 'libraries';
@override
Map<String, String> get pubDependencyPaths => const {'two': './vendor/two'};
/// Boots up a package with an additional dependency package inside.
///
/// This emulates the Flutter SDK layout (or the fake layout created by
/// Flutter's `create_api_docs.dart` script), so that we have library's whose
/// `dirName` contains long text based on the package URI, something like
/// 'package-two_lib2'.
Future<PackageGraph> bootPackageWithInnerPackageLibrary(
d.FileDescriptor libraryFile,
) {
packageConfigProvider.addPackageToConfigFor(
'$packagePath/vendor/two', 'two', Uri.file('$packagePath/vendor/two/'));
return bootPackageFromFiles(
[
d.file('lib/lib1.dart', "import 'package:two/lib2.dart';"),
d.dir(resourceProvider.convertPath('vendor/two'), [
d.file('pubspec.yaml', '''
name: two
version: 0.0.1
'''),
libraryFile,
]),
],
additionalArguments: [
'--auto-include-dependencies',
],
);
}
void test_dependencyPackageLibrary_noLibraryDirective() async {
var graph = await bootPackageWithInnerPackageLibrary(
d.file('lib/lib2.dart', '// No content.'));
var library = graph.libraries.named('lib2');
expect(library.name, 'lib2');
expect(library.qualifiedName, 'lib2');
expect(library.href, '${placeholder}package-two_lib2/');
expect(
library.redirectingPath,
'package-two_lib2/package-two_lib2-library.html',
);
}
void test_dependencyPackageLibrary_unnamedLibraryDirective() async {
var graph = await bootPackageWithInnerPackageLibrary(
d.file('lib/lib2.dart', 'library;'));
var library = graph.libraries.named('lib2');
expect(library.name, 'lib2');
expect(library.qualifiedName, 'lib2');
expect(library.href, '${placeholder}package-two_lib2/');
expect(
library.redirectingPath,
'package-two_lib2/package-two_lib2-library.html',
);
}
void test_dependencyPackageLibrary_namedLibraryDirective() async {
var graph = await bootPackageWithInnerPackageLibrary(
d.file('lib/lib2.dart', 'library lib2;'));
var library = graph.libraries.named('lib2');
expect(library.name, 'lib2');
expect(library.qualifiedName, 'lib2');
expect(library.href, '${placeholder}lib2/');
expect(library.redirectingPath, 'lib2/lib2-library.html');
}
}