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