diff --git a/pubspec.yaml b/pubspec.yaml index c474d64890..dfb7074c93 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -32,7 +32,6 @@ dev_dependencies: glob: ^1.1.5 grinder: ^0.8.2 http: ^0.12.0 - mockito: ^4.1.1 pedantic: ^1.9.0 test: ^1.3.0 diff --git a/test/comment_processable_test.dart b/test/comment_processable_test.dart index 0fe5066659..26024e8600 100644 --- a/test/comment_processable_test.dart +++ b/test/comment_processable_test.dart @@ -2,84 +2,94 @@ // 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/element/element.dart'; import 'package:analyzer/file_system/file_system.dart'; import 'package:analyzer/file_system/memory_file_system.dart'; -import 'package:analyzer/src/generated/source.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:dartdoc/src/render/model_element_renderer.dart'; -import 'package:dartdoc/src/render/renderer_factory.dart'; import 'package:dartdoc/src/warnings.dart'; -import 'package:path/path.dart' as p; -import 'package:mockito/mockito.dart'; import 'package:test/test.dart'; +import 'src/utils.dart' as utils; + void main() { MemoryResourceProvider resourceProvider; + PackageMetaProvider packageMetaProvider; + FakePackageConfigProvider packageConfigProvider; + MockSdk mockSdk; + Folder sdkFolder; Folder projectRoot; - String libFooPath; - _Processor processor; - String youtubeRender; + String projectPath; + var packageName = 'my_package'; + PackageGraph packageGraph; + ModelElement libraryModel; + + Matcher hasInvalidParameterWarning(String message) => + _HasWarning(PackageWarning.invalidParameter, message); - void verifyNoWarnings() => verifyNever(processor.packageGraph - .warnOnElement(processor, any, message: anyNamed('message'))); + Matcher hasMissingExampleWarning(String message) => + _HasWarning(PackageWarning.missingExampleFile, message); + + void expectNoWarnings() => + expect(packageGraph.packageWarningCounter.countedWarnings, isEmpty); setUp(() async { resourceProvider = MemoryResourceProvider(); - projectRoot = resourceProvider.getFolder(resourceProvider.pathContext - .canonicalize(resourceProvider.convertPath('/project'))); - projectRoot.create(); - resourceProvider - .getFile( - resourceProvider.pathContext.join(projectRoot.path, 'pubspec.yaml')) - .writeAsStringSync(''' -name: foo -'''); - var packageMetaProvider = PackageMetaProvider( + mockSdk = MockSdk(resourceProvider: resourceProvider); + sdkFolder = utils.writeMockSdkFiles(mockSdk); + + packageMetaProvider = PackageMetaProvider( PubPackageMeta.fromElement, PubPackageMeta.fromFilename, PubPackageMeta.fromDir, resourceProvider, - resourceProvider.getFolder(resourceProvider.convertPath(sdkRoot)), + sdkFolder, + defaultSdk: mockSdk, ); var optionSet = await DartdocOptionSet.fromOptionGenerators( 'dartdoc', [createDartdocOptions], packageMetaProvider); optionSet.parseArguments([]); - processor = _Processor( - DartdocOptionContext(optionSet, projectRoot, resourceProvider), - projectRoot, - resourceProvider); - when(processor.packageGraph.resourceProvider).thenReturn(resourceProvider); - - libFooPath = - resourceProvider.pathContext.join(projectRoot.path, 'foo.dart'); - processor.href = libFooPath; - youtubeRender = processor.modelElementRenderer - .renderYoutubeUrl('oHg5SJYRHA0', '200.00'); + 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/')); + + projectRoot = utils.writePackage( + packageName, resourceProvider, packageConfigProvider); + projectPath = projectRoot.path; + projectRoot + .getChildAssumingFolder('lib') + .getChildAssumingFile('a.dart') + .writeAsStringSync(''' +/// Documentation comment. +int x; +'''); + packageGraph = await utils.bootBasicPackage( + projectPath, packageMetaProvider, packageConfigProvider, + additionalArguments: []); + libraryModel = packageGraph.defaultPackage.libraries.first; }); test('removes triple slashes', () async { - var doc = await processor.processComment(''' + var doc = await libraryModel.processComment(''' /// Text. /// More text. '''); - verifyNoWarnings(); expect(doc, equals(''' Text. More text.''')); }); test('removes space after triple slashes', () async { - var doc = await processor.processComment(''' + var doc = await libraryModel.processComment(''' /// Text. /// More text. '''); - verifyNoWarnings(); // TODO(srawlins): Actually, the three spaces before 'More' is perhaps not // the best fit. Should it only be two, to match the indent from the first // line's "Text"? @@ -89,13 +99,12 @@ Text. }); test('leaves blank lines', () async { - var doc = await processor.processComment(''' + var doc = await libraryModel.processComment(''' /// Text. /// /// More text. '''); - verifyNoWarnings(); expect(doc, equals(''' Text. @@ -103,34 +112,31 @@ More text.''')); }); test('warns when an unknown directive is parsed', () async { - processor.element = _FakeElement(source: _FakeSource(fullName: libFooPath)); - await processor.processComment(''' + await libraryModel.processComment(''' /// Text. /// /// {@marco name} '''); - verify(processor.packageGraph.warnOnElement( - processor, PackageWarning.unknownDirective, - message: "'marco'")) - .called(1); + expect( + packageGraph.packageWarningCounter.hasWarning( + libraryModel, PackageWarning.unknownDirective, "'marco'"), + isTrue); }); test('warns when a directive with wrong case is parsed', () async { - processor.element = _FakeElement(source: _FakeSource(fullName: libFooPath)); - await processor.processComment(''' + await libraryModel.processComment(''' /// Text. /// /// {@youTube url} '''); - verify(processor.packageGraph.warnOnElement( - processor, PackageWarning.unknownDirective, - message: "'youTube' (use lowercase)")) - .called(1); + expect( + packageGraph.packageWarningCounter.hasWarning(libraryModel, + PackageWarning.unknownDirective, "'youTube' (use lowercase)"), + isTrue); }); test('processes @animation', () async { - processor.element = _FakeElement(source: _FakeSource(fullName: libFooPath)); - var doc = await processor.processComment(''' + var doc = await libraryModel.processComment(''' /// Text. /// /// {@animation 100 200 http://host/path/to/video.mp4 id=barHerderAnimation} @@ -138,8 +144,8 @@ More text.''')); /// End text. '''); - verifyNoWarnings(); - var rendered = processor.modelElementRenderer.renderAnimation( + expectNoWarnings(); + var rendered = libraryModel.modelElementRenderer.renderAnimation( 'barHerderAnimation', 100, 200, @@ -153,65 +159,142 @@ $rendered End text.''')); }); + test('renders an unnamed @animation', () async { + var doc = await libraryModel.processComment(''' +/// First line. +/// +/// {@animation 100 200 http://host/path/to/video.mp4} +'''); + + expectNoWarnings(); + expect(doc, contains('