// Copyright (c) 2014, 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 'dart:async';
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
import 'type_test_helper.dart';

test(String constantInitializer, [String expectedOutput]) {
  if (expectedOutput == null) {
    expectedOutput = constantInitializer;
  }
  return () => TypeEnvironment
          .create(
              """
    class Class<T, S> {
      final a;
      final b;
      final c;
      const Class(this.a, {this.b, this.c: true});
      const Class.named([this.a, this.b = 0, this.c = 2]);

      static const staticConstant = 0;
      static staticFunction() {}
    }
    const t = true;
    const f = false;
    const toplevelConstant = 0;
    toplevelFunction() {}
    const constant = $constantInitializer;
""",
              expectNoWarningsOrErrors: true)
          .then((env) {
        var element = env.getElement('constant');
        Expect.isNotNull(element, "Element 'constant' not found.");
        var constant = element.constant;
        var value = env.compiler.constants.getConstantValue(constant);
        Expect.isNotNull(constant, "No constant computed for '$element'.");
        Expect.equals(
            expectedOutput,
            constant.toDartText(),
            "Unexpected to string '${constant.toDartText()}' for constant "
            "'$constantInitializer' of value "
            "${value.toStructuredText()}");
      });
}

void main() {
  asyncTest(() => Future.forEach([
        test('null'),
        test('0'),
        test('1.5'),
        test('true'),
        test('false'),
        test('"f"'),
        test('"a" "b"', '"ab"'),
        test('const []'),
        test('const <int>[0, 1]'),
        test('const <dynamic>[0, 1]', 'const [0, 1]'),
        test('const {}'),
        test('const {0: 1, 2: 3}'),
        test('const <String, int>{"0": 1, "2": 3}'),
        test('const <String, dynamic>{"0": 1, "2": 3}'),
        test('const <dynamic, dynamic>{"0": 1, "2": 3}',
            'const {"0": 1, "2": 3}'),
        test('const Class(0)'),
        test('const Class(0, b: 1)'),
        test('const Class(0, c: 2)'),
        test('const Class(0, b: 3, c: 4)'),
        test('const Class.named()'),
        test('const Class.named(0)'),
        test('const Class.named(0, 1)'),
        test('const Class.named(0, 1, 2)'),
        test('const Class<String, int>(0)'),
        test('const Class<String, dynamic>(0)'),
        test('const Class<dynamic, String>(0)'),
        test('const Class<dynamic, dynamic>(0)', 'const Class(0)'),
        test('toplevelConstant'),
        test('toplevelFunction'),
        test('Class.staticConstant'),
        test('Class.staticFunction'),
        test('#a'),
        test('1 + 2'),
        test('1 + 2 + 3'),
        test('1 + -2'),
        test('-1 + 2'),
        test('(1 + 2) + 3', '1 + 2 + 3'),
        test('1 + (2 + 3)', '1 + 2 + 3'),
        test('1 * 2'),
        test('1 * 2 + 3'),
        test('1 * (2 + 3)'),
        test('1 + 2 * 3'),
        test('(1 + 2) * 3'),
        test('false || identical(0, 1)'),
        test('!identical(0, 1)'),
        test('!identical(0, 1) || false'),
        test('!(identical(0, 1) || false)'),
        test('identical(0, 1) ? 3 * 4 + 5 : 6 + 7 * 8'),
        test('t ? f ? 0 : 1 : 2'),
        test('(t ? t : f) ? f ? 0 : 1 : 2'),
        test('t ? t : f ? f ? 0 : 1 : 2'),
        test('t ? t ? t : t : t ? t : t'),
        test('t ? (t ? t : t) : (t ? t : t)', 't ? t ? t : t : t ? t : t'),
        test(
            'const [const <dynamic, dynamic>{0: true, "1": "c" "d"}, '
            'const Class(const Class<dynamic, dynamic>(toplevelConstant))]',
            'const [const {0: true, "1": "cd"}, '
            'const Class(const Class(toplevelConstant))]'),
      ], (f) => f()));
}
