// 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(
      // ignore: deprecated_member_use_from_same_package
      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();'''),
    );
  });
}
