// Copyright 2014 The Flutter Authors. 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:file/file.dart'; import 'package:file/memory.dart'; import 'package:path/path.dart' as path; import 'package:pub_semver/pub_semver.dart'; import 'package:snippets/snippets.dart'; import 'package:test/test.dart' hide TypeMatcher, isInstanceOf; import 'filesystem_resource_provider.dart'; class FakeFlutterInformation extends FlutterInformation { FakeFlutterInformation(this.flutterRoot); final Directory flutterRoot; @override Directory getFlutterRoot() { return flutterRoot; } @override Map getFlutterInformation() { return { 'flutterRoot': flutterRoot, 'frameworkVersion': Version(2, 10, 0), 'dartSdkVersion': Version(2, 12, 1), }; } } void main() { group('Parser', () { late MemoryFileSystem memoryFileSystem = MemoryFileSystem(); late FlutterRepoSnippetConfiguration configuration; late SnippetGenerator generator; late Directory tmpDir; late Directory flutterRoot; void writeSkeleton(String type) { switch (type) { case 'dartpad': configuration.getHtmlSkeletonFile('dartpad').writeAsStringSync('''
HTML Bits (DartPad-style)
More HTML Bits
'''); case 'sample': case 'snippet': configuration.getHtmlSkeletonFile(type).writeAsStringSync('''
HTML Bits
{{description}}
{{code}}
{{app}}
More HTML Bits
'''); } } setUp(() { // Create a new filesystem. memoryFileSystem = MemoryFileSystem(); tmpDir = memoryFileSystem.systemTempDirectory .createTempSync('flutter_snippets_test.'); flutterRoot = memoryFileSystem .directory(path.join(tmpDir.absolute.path, 'flutter')); configuration = FlutterRepoSnippetConfiguration( flutterRoot: flutterRoot, filesystem: memoryFileSystem); configuration.skeletonsDirectory.createSync(recursive: true); ['dartpad', 'sample', 'snippet'].forEach(writeSkeleton); FlutterInformation.instance = FakeFlutterInformation(flutterRoot); generator = SnippetGenerator( configuration: configuration, filesystem: memoryFileSystem, flutterRoot: configuration.skeletonsDirectory.parent); }); test('parses from comments', () async { final File inputFile = _createSnippetSourceFile(tmpDir, memoryFileSystem); final Iterable elements = getFileElements(inputFile, resourceProvider: FileSystemResourceProvider(memoryFileSystem)); expect(elements, isNotEmpty); final SnippetDartdocParser sampleParser = SnippetDartdocParser(memoryFileSystem); sampleParser.parseFromComments(elements); sampleParser.parseAndAddAssumptions(elements, inputFile); expect(elements.length, equals(7)); int sampleCount = 0; for (final SourceElement element in elements) { expect(element.samples.length, greaterThanOrEqualTo(1)); sampleCount += element.samples.length; final String code = generator.generateCode(element.samples.first); expect(code, contains('// Description')); expect( code, contains(RegExp( '''^String elementName = '${element.elementName}';\$''', multiLine: true))); final String html = generator.generateHtml(element.samples.first); expect( html, contains(RegExp( '''^
String elementName = '${element.elementName}';.*\$''',
                multiLine: true)));
        expect(
            html,
            contains(
                '
{@end-inject-html}Description{@inject-html}
\n')); } expect(sampleCount, equals(8)); }); test('parses dartpad samples from linked file', () async { final File inputFile = _createDartpadSourceFile( tmpDir, memoryFileSystem, flutterRoot, linked: true); final Iterable elements = getFileElements(inputFile, resourceProvider: FileSystemResourceProvider(memoryFileSystem)); expect(elements, isNotEmpty); final SnippetDartdocParser sampleParser = SnippetDartdocParser(memoryFileSystem); sampleParser.parseFromComments(elements); expect(elements.length, equals(1)); int sampleCount = 0; for (final SourceElement element in elements) { expect(element.samples.length, greaterThanOrEqualTo(1)); sampleCount += element.samples.length; final String code = generator.generateCode(element.samples.first, formatOutput: false); expect(code, contains('// Description')); expect( code, contains(RegExp('^void ${element.name}Sample\\(\\) \\{.*\$', multiLine: true))); final String html = generator.generateHtml(element.samples.first); expect( html, contains(RegExp( '''^