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