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

  final $LinkedHashMap = refer('LinkedHashMap', 'dart:collection');

  final library = Library(
    (b) =>
        b
          ..directives.add(Directive.export('../relative.dart'))
          ..directives.add(Directive.export('package:foo/foo.dart'))
          ..directives.add(Directive.part('lib.g.dart'))
          ..body.add(
            Field(
              (b) =>
                  b
                    ..name = 'relativeRef'
                    ..modifier = FieldModifier.final$
                    ..assignment =
                        refer(
                          'Relative',
                          '../relative.dart',
                        ).newInstance([]).code,
            ),
          )
          ..body.add(
            Field(
              (b) =>
                  b
                    ..name = 'pkgRefFoo'
                    ..modifier = FieldModifier.final$
                    ..assignment =
                        refer(
                          'Foo',
                          'package:foo/foo.dart',
                        ).newInstance([]).code,
            ),
          )
          ..body.add(
            Field(
              (b) =>
                  b
                    ..name = 'pkgRefBar'
                    ..modifier = FieldModifier.final$
                    ..assignment =
                        refer(
                          'Bar',
                          'package:foo/bar.dart',
                        ).newInstance([]).code,
            ),
          )
          ..body.add(
            Field(
              (b) =>
                  b
                    ..name = 'collectionRef'
                    ..modifier = FieldModifier.final$
                    ..assignment = $LinkedHashMap.newInstance([]).code,
            ),
          ),
  );

  test('should emit a source file with imports in defined order', () {
    expect(
      library,
      equalsDart(r'''
          // ignore_for_file: no_leading_underscores_for_library_prefixes
          import '../relative.dart' as _i1;
          import 'package:foo/foo.dart' as _i2;
          import 'package:foo/bar.dart' as _i3;
          import 'dart:collection' as _i4;
          export '../relative.dart';
          export 'package:foo/foo.dart';
          part 'lib.g.dart';

          final relativeRef = _i1.Relative();
          final pkgRefFoo = _i2.Foo();
          final pkgRefBar = _i3.Bar();
          final collectionRef = _i4.LinkedHashMap();''', DartEmitter.scoped()),
    );
  });

  test('should emit a source file with ordered', () {
    expect(
      library,
      equalsDart(
        r'''
          // ignore_for_file: no_leading_underscores_for_library_prefixes
          import 'dart:collection' as _i4;

          import 'package:foo/bar.dart' as _i3;
          import 'package:foo/foo.dart' as _i2;

          import '../relative.dart' as _i1;

          export 'package:foo/foo.dart';
          export '../relative.dart';

          part 'lib.g.dart';

          final relativeRef = _i1.Relative();
          final pkgRefFoo = _i2.Foo();
          final pkgRefBar = _i3.Bar();
          final collectionRef = _i4.LinkedHashMap();''',
        DartEmitter.scoped(orderDirectives: true),
      ),
    );
  });
}
