// Copyright (c) 2015, 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.

library dart2js.constants.expressions.evaluate_test;

import 'dart:async';
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
import 'package:compiler/src/constants/evaluation.dart';
import 'package:compiler/src/constants/expressions.dart';
import 'package:compiler/src/constants/values.dart';
import 'package:compiler/src/constant_system_dart.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/elements/elements.dart';
import 'memory_compiler.dart';

class TestData {
  /// Declarations needed for the [constants].
  final String declarations;
  /// Tested constants.
  final List constants;

  const TestData(this.declarations, this.constants);
}

class ConstantData {
  /// Source code for the constant expression.
  final String code;
  /// Map from environment to expected constant value as structured text.
  final Map<Map<String, String>, String> expectedValues;

  const ConstantData(this.code,
                     this.expectedValues);
}

class MemoryEnvironment implements Environment {
  final Compiler compiler;
  final Map<String, String> env;

  MemoryEnvironment(this.compiler,
                    [this.env = const <String, String>{}]);

  @override
  String readFromEnvironment(String name) => env[name];
}

const List<TestData> DATA = const [
  const TestData('', const [
    const ConstantData('null', const { const {} : 'NullConstant' }),
    const ConstantData('false', const { const {} : 'BoolConstant(false)' }),
    const ConstantData('true', const { const {} : 'BoolConstant(true)' }),
    const ConstantData('0', const { const {} : 'IntConstant(0)' }),
    const ConstantData('0.0', const { const {} : 'DoubleConstant(0.0)' }),
    const ConstantData('"foo"', const { const {} : 'StringConstant("foo")' }),
    const ConstantData('1 + 2', const { const {} : 'IntConstant(3)' }),
    const ConstantData('-(1)', const { const {} : 'IntConstant(-1)' }),
    const ConstantData('1 == 2', const { const {} : 'BoolConstant(false)' }),
    const ConstantData('1 != 2', const { const {} : 'BoolConstant(true)' }),
    const ConstantData('"foo".length', const { const {} : 'IntConstant(3)' }),
    const ConstantData('identical(0, 1)',
                       const { const {} : 'BoolConstant(false)' }),
    const ConstantData('"a" "b"', const { const {} : 'StringConstant("ab")' }),
    const ConstantData(r'"${null}"',
        const { const {} : 'StringConstant("null")' }),
    const ConstantData('identical',
        const { const {} : 'FunctionConstant(identical)' }),
    const ConstantData('true ? 0 : 1', const { const {} : 'IntConstant(0)' }),
    const ConstantData('proxy',
        const { const {} : 'ConstructedConstant(_Proxy())' }),
    const ConstantData('Object', const { const {} : 'TypeConstant(Object)' }),
    const ConstantData('const [0, 1]',
        const { const {} : 'ListConstant([IntConstant(0), IntConstant(1)])' }),
    const ConstantData('const <int>[0, 1]', const {
        const {} : 'ListConstant(<int>[IntConstant(0), IntConstant(1)])' }),
    const ConstantData('const {0: 1, 2: 3}',
        const { const {} :
          'MapConstant({IntConstant(0): IntConstant(1), '
                       'IntConstant(2): IntConstant(3)})' }),
    const ConstantData('const <int, int>{0: 1, 2: 3}',
        const { const {} :
          'MapConstant(<int, int>{IntConstant(0): IntConstant(1), '
                                 'IntConstant(2): IntConstant(3)})' }),
    const ConstantData('const <int, int>{0: 1, 0: 2}',
        const { const {} :
        'MapConstant(<int, int>{IntConstant(0): IntConstant(2)})' }),
    const ConstantData(
        'const bool.fromEnvironment("foo", defaultValue: false)',
        const { const {} : 'BoolConstant(false)',
                const {'foo': 'true'} : 'BoolConstant(true)'}),
    const ConstantData(
        'const int.fromEnvironment("foo", defaultValue: 42)',
        const { const {} : 'IntConstant(42)',
                const {'foo': '87'} : 'IntConstant(87)'}),
    const ConstantData(
        'const String.fromEnvironment("foo", defaultValue: "bar")',
        const { const {} : 'StringConstant("bar")',
                const {'foo': 'foo'} : 'StringConstant("foo")'}),
  ]),
  const TestData('''
const a = const bool.fromEnvironment("foo", defaultValue: true);
const b = const int.fromEnvironment("bar", defaultValue: 42);

class A {
  const A();
}
class B {
  final field1;
  const B(this.field1);
}
class C extends B {
  final field2;
  const C({field1: 42, this.field2: false}) : super(field1);
  const C.named([field = false]) : this(field1: field, field2: field);
}
class D extends C {
  final field3 = 99;
  const D(a, b) : super(field2: a, field1: b);
}
''', const [
    const ConstantData('const Object()',
        const { const {} : 'ConstructedConstant(Object())' }),
    const ConstantData('const A()',
        const { const {} : 'ConstructedConstant(A())' }),
    const ConstantData('const B(0)',
        const { const {} : 'ConstructedConstant(B(field1=IntConstant(0)))' }),
    const ConstantData('const B(const A())',
        const { const {} :
          'ConstructedConstant(B(field1=ConstructedConstant(A())))' }),
    const ConstantData('const C()', const { const {} :
        'ConstructedConstant(C(field1=IntConstant(42),'
                              'field2=BoolConstant(false)))' }),
    const ConstantData('const C(field1: 87)', const { const {} :
        'ConstructedConstant(C(field1=IntConstant(87),'
                              'field2=BoolConstant(false)))' }),
    const ConstantData('const C(field2: true)', const { const {} :
        'ConstructedConstant(C(field1=IntConstant(42),'
                              'field2=BoolConstant(true)))' }),
    const ConstantData('const C.named()', const { const {} :
        'ConstructedConstant(C(field1=BoolConstant(false),'
                              'field2=BoolConstant(false)))' }),
    const ConstantData('const C.named(87)', const { const {} :
        'ConstructedConstant(C(field1=IntConstant(87),'
                              'field2=IntConstant(87)))' }),
    const ConstantData('const C(field1: a, field2: b)', const {
        const {} :
          'ConstructedConstant(C(field1=BoolConstant(true),'
                                'field2=IntConstant(42)))',
        const {'foo': 'false', 'bar': '87'} :
          'ConstructedConstant(C(field1=BoolConstant(false),'
                                'field2=IntConstant(87)))', }),
    const ConstantData('const D(42, 87)', const { const {} :
       'ConstructedConstant(D(field1=IntConstant(87),'
                             'field2=IntConstant(42),'
                             'field3=IntConstant(99)))' }),
  ]),
  const TestData('''
class A<T> implements B {
  final field1;
  const A({this.field1:42});
}
class B<S> implements C {
  const factory B({field1}) = A<B<S>>;
  const factory B.named() = A<S>;
}
class C<U> {
  const factory C({field1}) = A<B<double>>;
}
''', const [
    const ConstantData('const A()',
        const { const {} :
          'ConstructedConstant(A<dynamic>(field1=IntConstant(42)))' }),
    const ConstantData('const A<int>(field1: 87)',
        const { const {} :
          'ConstructedConstant(A<int>(field1=IntConstant(87)))' }),
    const ConstantData('const B()',
        const { const {} :
          'ConstructedConstant(A<B<dynamic>>(field1=IntConstant(42)))' }),
    const ConstantData('const B<int>()',
        const { const {} :
          'ConstructedConstant(A<B<int>>(field1=IntConstant(42)))' }),
    const ConstantData('const B<int>(field1: 87)',
        const { const {} :
          'ConstructedConstant(A<B<int>>(field1=IntConstant(87)))' }),
    const ConstantData('const C<int>(field1: 87)',
        const { const {} :
          'ConstructedConstant(A<B<double>>(field1=IntConstant(87)))' }),
    const ConstantData('const B<int>.named()',
        const { const {} :
          'ConstructedConstant(A<int>(field1=IntConstant(42)))' }),
  ]),
  const TestData('''
const c = const int.fromEnvironment("foo", defaultValue: 5);
const d = const int.fromEnvironment("bar", defaultValue: 10);

class A {
  final field;
  const A(a, b) : field = a + b;
}

class B extends A {
  const B(a) : super(a, a * 2);
}
''', const [
    const ConstantData('const A(c, d)', const {
        const {} :
          'ConstructedConstant(A(field=IntConstant(15)))',
        const {'foo': '7', 'bar': '11'} :
          'ConstructedConstant(A(field=IntConstant(18)))', }),
    const ConstantData('const B(d)', const {
        const {} :
          'ConstructedConstant(B(field=IntConstant(30)))',
        const {'bar': '42'} :
          'ConstructedConstant(B(field=IntConstant(126)))', }),
  ]),
];

main() {
  asyncTest(() => Future.forEach(DATA, testData));
}

Future testData(TestData data) async {
  StringBuffer sb = new StringBuffer();
  sb.write('${data.declarations}\n');
  Map constants = {};
  data.constants.forEach((ConstantData constantData) {
    String name = 'c${constants.length}';
    sb.write('const $name = ${constantData.code};\n');
    constants[name] = constantData;
  });
  sb.write('main() {}\n');
  String source = sb.toString();
  CompilationResult result = await runCompiler(
      memorySourceFiles: {'main.dart': source}, options: ['--analyze-all']);
  Compiler compiler = result.compiler;
  var library = compiler.mainApp;
  constants.forEach((String name, ConstantData data) {
    FieldElement field = library.localLookup(name);
    ConstantExpression constant = field.constant;
    data.expectedValues.forEach(
        (Map<String, String> env, String expectedText) {
      Environment environment = new MemoryEnvironment(compiler, env);
      ConstantValue value =
          constant.evaluate(environment, DART_CONSTANT_SYSTEM);
      String valueText = value.toStructuredText();
      Expect.equals(expectedText, valueText,
          "Unexpected value '${valueText}' for contant "
          "`${constant.toDartText()}`, expected '${expectedText}'.");
    });
  });
}
