// 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 constMap = literalConstMap({
    'list': literalConstList([]),
    'duration': refer('Duration').constInstance([]),
  });

  test('expression', () {
    expect(
      constMap,
      equalsDart(r'''
          const {'list': [], 'duration': Duration(), }'''),
    );
  });

  test('assignConst', () {
    expect(
      constMap.assignConst('constField'),
      equalsDart(
        r'''
          const constField = {'list': [], 'duration': Duration(), }''',
        DartEmitter.scoped(),
      ),
    );
  });

  test('assign to declared constant', () {
    expect(
      declareConst('constField').assign(constMap),
      equalsDart(
        r'''
          const constField = {'list': [], 'duration': Duration(), }''',
        DartEmitter.scoped(),
      ),
    );
  });

  test('assign to declared non-constant', () {
    expect(
      declareVar('varField').assign(constMap),
      equalsDart(
        r'''
          var varField = const {'list': [], 'duration': Duration(), }''',
        DartEmitter.scoped(),
      ),
    );
  });

  final library = Library(
    (b) =>
        b
          ..body.add(
            Field(
              (b) =>
                  b
                    ..name = 'val1'
                    ..modifier = FieldModifier.constant
                    ..assignment = refer('ConstClass').constInstance([]).code,
            ),
          )
          ..body.add(
            Field(
              (b) =>
                  b
                    ..name = 'val2'
                    ..modifier = FieldModifier.constant
                    ..assignment =
                        refer(
                          'ConstClass',
                        ).constInstanceNamed('other', []).code,
            ),
          ),
  );

  test('should emit a source file with imports in defined order', () {
    expect(
      library,
      equalsDart(r'''
        const val1 = ConstClass();
        const val2 = ConstClass.other();'''),
    );
  });
}
