| // Copyright (c) 2017, 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:code_builder/code_builder.dart'; | |
| import 'package:test/test.dart'; | |
| import '../common.dart'; | |
| void main() { | |
| useDartfmt(); | |
| group('File', () { | |
| final $LinkedHashMap = refer('LinkedHashMap', 'dart:collection'); | |
| test('should emit a source file with leading line comments', () { | |
| expect( | |
| Library( | |
| (b) => b | |
| ..comments.add('Generated by foo.') | |
| ..body.add(Class((b) => b..name = 'Foo')), | |
| ), | |
| equalsDart(r''' | |
| // Generated by foo. | |
| class Foo { } | |
| ''', DartEmitter(allocator: Allocator())), | |
| ); | |
| }); | |
| test('should emit a source file with multiple leading comments', () { | |
| expect( | |
| Library( | |
| (b) => b | |
| ..comments.addAll([ | |
| 'Generated by foo!', | |
| '', | |
| 'Avoid editing by hand.', | |
| ]) | |
| ..body.add(Class((b) => b..name = 'Foo')), | |
| ), | |
| equalsDart(r''' | |
| // Generated by foo! | |
| // | |
| // Avoid editing by hand. | |
| class Foo { } | |
| ''', DartEmitter(allocator: Allocator())), | |
| ); | |
| }); | |
| test('should emit a source file with a generated-by comment', () { | |
| expect( | |
| Library( | |
| (b) => b | |
| ..generatedByComment = 'Generated by fooBar.' | |
| ..body.add(Class((b) => b..name = 'Foo')), | |
| ), | |
| equalsDart(r''' | |
| // Generated by fooBar. | |
| class Foo { } | |
| ''', DartEmitter(allocator: Allocator())), | |
| ); | |
| }); | |
| test('should emit a source file with ignore comments', () { | |
| expect( | |
| Library( | |
| (b) => b | |
| ..ignoreForFile.add('sort_constructors_first') | |
| ..body.add(Class((b) => b..name = 'Foo')), | |
| ), | |
| equalsDart(r''' | |
| // ignore_for_file: sort_constructors_first | |
| class Foo { } | |
| ''', DartEmitter(allocator: Allocator())), | |
| ); | |
| }); | |
| test('should emit a source file with multiple, sorted ignore comments', () { | |
| expect( | |
| Library( | |
| (b) => b | |
| ..ignoreForFile.addAll([ | |
| 'type=lint', | |
| 'sort_constructors_first', | |
| 'implementation_imports', | |
| 'file_names', | |
| ]) | |
| ..body.add(Class((b) => b..name = 'Foo')), | |
| ), | |
| equalsDart(r''' | |
| // ignore_for_file: file_names, implementation_imports, sort_constructors_first | |
| // ignore_for_file: type=lint | |
| class Foo { } | |
| ''', DartEmitter(allocator: Allocator())), | |
| ); | |
| }); | |
| test( | |
| 'should emit with line comments, generated-by, and ignore-for-file', | |
| () { | |
| expect( | |
| Library( | |
| (b) => b | |
| ..comments.add('Generic copyright statement.') | |
| ..generatedByComment = 'Generated by fooBar.' | |
| ..ignoreForFile.add('sort_constructors_first') | |
| ..body.add(Class((b) => b..name = 'Foo')), | |
| ), | |
| equalsDart(r''' | |
| // Generic copyright statement. | |
| // Generated by fooBar. | |
| // ignore_for_file: sort_constructors_first | |
| class Foo { } | |
| ''', DartEmitter(allocator: Allocator())), | |
| ); | |
| }, | |
| ); | |
| test('should emit a source file with manual imports', () { | |
| expect( | |
| Library( | |
| (b) => b | |
| ..directives.add(Directive.import('dart:collection')) | |
| ..body.add( | |
| Field( | |
| (b) => b | |
| ..name = 'test' | |
| ..modifier = FieldModifier.final$ | |
| ..assignment = $LinkedHashMap.newInstance([]).code, | |
| ), | |
| ), | |
| ), | |
| equalsDart(r''' | |
| import 'dart:collection'; | |
| final test = LinkedHashMap(); | |
| ''', DartEmitter()), | |
| ); | |
| }); | |
| test('should emit a source file with a deferred import', () { | |
| expect( | |
| Library( | |
| (b) => b | |
| ..directives.add( | |
| Directive.importDeferredAs('package:foo/foo.dart', 'foo'), | |
| ), | |
| ), | |
| equalsDart(r''' | |
| import 'package:foo/foo.dart' deferred as foo; | |
| '''), | |
| ); | |
| }); | |
| test('should emit a source file with a "show" combinator', () { | |
| expect( | |
| Library( | |
| (b) => b | |
| ..directives.add( | |
| Directive.import('package:foo/foo.dart', show: ['Foo', 'Bar']), | |
| ), | |
| ), | |
| equalsDart(r''' | |
| import 'package:foo/foo.dart' show Foo, Bar; | |
| '''), | |
| ); | |
| }); | |
| test('should emit a source file with a "hide" combinator', () { | |
| expect( | |
| Library( | |
| (b) => b | |
| ..directives.add( | |
| Directive.import('package:foo/foo.dart', hide: ['Foo', 'Bar']), | |
| ), | |
| ), | |
| equalsDart(r''' | |
| import 'package:foo/foo.dart' hide Foo, Bar; | |
| '''), | |
| ); | |
| }); | |
| test('should emit a source file with allocation', () { | |
| expect( | |
| Library( | |
| (b) => b | |
| ..body.add( | |
| Field( | |
| (b) => b | |
| ..name = 'test' | |
| ..modifier = FieldModifier.final$ | |
| ..assignment = Code.scope((a) => '${a($LinkedHashMap)}()'), | |
| ), | |
| ), | |
| ), | |
| equalsDart(r''' | |
| import 'dart:collection'; | |
| final test = LinkedHashMap(); | |
| ''', DartEmitter(allocator: Allocator())), | |
| ); | |
| }); | |
| test('should emit a source file with allocation + prefixing', () { | |
| expect( | |
| Library( | |
| (b) => b | |
| ..body.add( | |
| Field( | |
| (b) => b | |
| ..name = 'test' | |
| ..modifier = FieldModifier.final$ | |
| ..assignment = Code.scope((a) => '${a($LinkedHashMap)}()'), | |
| ), | |
| ), | |
| ), | |
| equalsDart(r''' | |
| // ignore_for_file: no_leading_underscores_for_library_prefixes | |
| import 'dart:collection' as _i1; | |
| final test = _i1.LinkedHashMap(); | |
| ''', DartEmitter(allocator: Allocator.simplePrefixing())), | |
| ); | |
| }); | |
| test('should emit a source file with part directives', () { | |
| expect( | |
| Library((b) => b..directives.add(Directive.part('test.g.dart'))), | |
| equalsDart(r''' | |
| part 'test.g.dart'; | |
| ''', DartEmitter()), | |
| ); | |
| }); | |
| test('should emit a source file with part of directives', () { | |
| expect( | |
| Library((b) => b..directives.add(Directive.partOf('test.dart'))), | |
| equalsDart(r''' | |
| part of 'test.dart'; | |
| ''', DartEmitter()), | |
| ); | |
| }); | |
| test('should emit a source file with annotations', () { | |
| expect( | |
| Library( | |
| (b) => b | |
| ..name = 'js_interop' | |
| ..annotations.add(refer('JS', 'package:js/js.dart').call([])), | |
| ), | |
| equalsDart(r''' | |
| @JS() | |
| library js_interop; | |
| import 'package:js/js.dart'; | |
| ''', DartEmitter(allocator: Allocator())), | |
| ); | |
| }); | |
| test('should emit an unnamed library source file with annotations', () { | |
| expect( | |
| Library( | |
| (b) => b..annotations.add(refer('JS', 'package:js/js.dart').call([])), | |
| ), | |
| equalsDart(r''' | |
| @JS() | |
| library; | |
| import 'package:js/js.dart'; | |
| ''', DartEmitter(allocator: Allocator())), | |
| ); | |
| }); | |
| test('should emit an unnamed library source file with documentation', () { | |
| expect( | |
| Library((b) => b..docs.addAll(const ['/// My favorite library.'])), | |
| equalsDart(r''' | |
| /// My favorite library. | |
| library; | |
| '''), | |
| ); | |
| }); | |
| test( | |
| 'should emit scoped lint ignores before library annotations, directives', | |
| () { | |
| expect( | |
| Library( | |
| (b) => b | |
| ..annotations.add( | |
| refer('JS', 'dart:js_interop').call([literalString('vscode')]), | |
| ) | |
| ..body.add( | |
| Method( | |
| (m) => m | |
| ..name = 'foo' | |
| ..external = true, | |
| ), | |
| ), | |
| ), | |
| equalsDart(r''' | |
| // ignore_for_file: no_leading_underscores_for_library_prefixes | |
| @_i1.JS('vscode') | |
| library; | |
| import 'dart:js_interop' as _i1; | |
| external foo(); | |
| ''', DartEmitter.scoped()), | |
| ); | |
| }, | |
| ); | |
| }); | |
| } |