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