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