// 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()),
        );
      },
    );
  });
}
