// Copyright (c) 2011, 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:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import 'mock_compiler.dart';
import 'package:compiler/src/js/js.dart' as jsAst;
import 'package:compiler/src/js/js.dart' show js;

Future testExpression(String expression, [String expect = ""]) {
  jsAst.Node node = js(expression);
  return MockCompiler.create((MockCompiler compiler) {
    String jsText =
        jsAst.prettyPrint(node, compiler, allowVariableMinification: false);
    if (expect == "") {
      Expect.stringEquals(expression, jsText);
    } else {
      Expect.stringEquals(expect, jsText);
    }
  });
}

Future testError(String expression, [String expect = ""]) {
  return new Future.sync(() {
    bool doCheck(exception) {
      Expect.isTrue(exception.toString().contains(expect));
      return true;
    }

    Expect.throws(() => js(expression), doCheck);
  });
}

void main() {
  asyncTest(() => Future.wait([
        // Asterisk indicates deviations from real JS.
        // Simple var test.
        testExpression('var a = ""'),
        // Parse and print will normalize whitespace.
        testExpression(' var  a  =  "" ', 'var a = ""'),
        // Operator precedence.
        testExpression('x = a + b * c'),
        testExpression('x = a * b + c'),
        testExpression('x = a + b * c + d'),
        testExpression('x = a * b + c * d'),
        testExpression('remaining = (remaining / 88) | 0',
            'remaining = remaining / 88 | 0'),
        // Binary operators have left associativity.
        testExpression('x = a + b + c'),
        // We can cope with relational operators and non-relational.
        testExpression('a + b == c + d'),
        // The prettyprinter will insert braces where needed.
        testExpression('a + (b == c) + d'),
        // We can handle () for calls.
        testExpression('foo(bar)'),
        testExpression('foo(bar, baz)'),
        // Chained calls without parentheses.
        testExpression('foo(bar)(baz)'),
        // Chaned calls with and without new.
        testExpression('new foo(bar)(baz)'),
        testExpression('new foo.bar(bar)(baz)'),
        testExpression('foo.bar(bar)(baz)'),
        testExpression('constructor = new Function(str)()'),
        // The prettyprinter understands chained calls without extra parentheses.
        testExpression('(foo(bar))(baz)', 'foo(bar)(baz)'),
        // Chains of dotting and calls.
        testExpression('foo.bar(baz)'),
        // String literal.
        testExpression('var x = "fisk"'),
        // String literal with \n.
        testExpression(r'var x = "\n"'),
        // String literal with escaped quote.
        testExpression(r'var x = "\""'),
        // *No clever escapes.
        testError(r'var x = "\x42"', 'escapes are not allowed in literals'),
        // Operator new.
        testExpression('new Foo()'),
        // New with dotted access.
        testExpression('new Frobinator.frobinate()'),
        testExpression('new Frobinator().frobinate()'),
        // The prettyprinter strips some superfluous parentheses.
        testExpression(
            '(new Frobinator()).frobinate()', 'new Frobinator().frobinate()'),
        // *We want a bracket on 'new'.
        testError('new Foo', 'Parentheses are required'),
        testError('(new Foo)', 'Parentheses are required'),
        // Bogus operators.
        testError('a +++ b', 'Unknown operator'),
        // This isn't perl.  There are rules.
        testError('a <=> b', 'Unknown operator'),
        // Typeof.
        testExpression('typeof foo == "number"'),
        // Strange relation.
        testExpression('a < b < c'),
        // Chained var.
        testExpression('var x = 0, y = 1.2, z = 42'),
        // Empty object literal.
        testExpression('foo({}, {})'),
        // *Can't handle non-empty object literals
        testExpression('foo({meaning: 42})'),
        // Literals.
        testExpression('x(false, true, null)'),
        // *We should really throw here.
        testExpression('var false = 42'),
        testExpression('var new = 42'),
        // Bad keyword.
        testError('var typeof = 42', "Expected ALPHA"),
        // Malformed decimal/hex.
        testError('var x = 1.1.1', "Unparseable number"),
        testError('var x = 0xabcdefga', "Unparseable number"),
        testError('var x = 0xabcdef\$a', "Unparseable number"),
        testError('var x = 0x ', "Unparseable number"),
        // Good hex constants.
        testExpression('var x = 0xff'),
        testExpression('var x = 0xff + 0xff'),
        testExpression('var x = 0xaF + 0x0123456789abcdefABCDEF'),
        // All sorts of keywords are allowed as property names in ES5.
        testExpression('x.new = 0'),
        testExpression('x.delete = 0'),
        testExpression('x.for = 0'),
        testExpression('x.instanceof = 0'),
        testExpression('x.in = 0'),
        testExpression('x.void = 0'),
        testExpression('x.continue = 0'),
        // More unary.
        testExpression('x = !x'),
        testExpression('!x == false'),
        testExpression('var foo = void 0'),
        testExpression('delete foo.bar'),
        testExpression('delete foo'),
        testExpression('x in y'),
        testExpression('x instanceof y'),
        testExpression('a * b in c * d'),
        testExpression('a * b instanceof c * d'),
        testError('x typeof y', 'Unparsed junk'),
        testExpression('x &= ~mask'),
        // Await is parsed as an unary prefix operator.
        testExpression('var foo = await 0'),
        testExpression('await x++'),
        testExpression('void (await (x++))', 'void await x++'),
        testExpression('void (await x)++'),
        testExpression('++(await x)++'),
        // Adjacent tokens.
        testExpression('foo[x[bar]]'),
        testExpression('foo[[bar]]'),
        // Prefix ++ etc.
        testExpression("++x"),
        testExpression("++foo.bar"),
        testExpression("+x"),
        testExpression("+foo.bar"),
        testExpression("-x"),
        testExpression("-foo.bar"),
        testExpression("--x"),
        testExpression("--foo.bar"),
        // Postfix ++ etc.
        testExpression("x++"),
        testExpression("foo.bar++"),
        testExpression("x--"),
        testExpression("foo.bar--"),
        // Both!
        testExpression("++x++"),
        testExpression("++foo.bar++"),
        testExpression("--x--"),
        testExpression("--foo.bar--"),
        // *We can't handle stacked unary operators (apart from !).
        testError("x++ ++"),
        testError("++ typeof x"),
        testExpression(r"var $supportsProtoName = !!{}.__proto__"),
        // ++ used as a binary operator.
        testError("x++ ++ 42"),
        // Shift operators.
        testExpression("x << 5"),
        testExpression("x << y + 1"),
        testExpression("x <<= y + 1"),
        // Array initializers.
        testExpression("x = ['foo', 'bar', x[4]]"),
        testExpression("[]"),
        testError("[42 42]"),
        testExpression('beebop([1, 2, 3])'),
        // Array literals with holes in them.
        testExpression("[1,, 2]"),
        testExpression("[1,]", "[1]"),
        testExpression("[1,,]", "[1,,]"),
        testExpression("[,]"),
        testExpression("[,,]"),
        testExpression("[, 42]"),
        // Ternary operator.
        testExpression("x = a ? b : c"),
        testExpression("y = a == null ? b : a"),
        testExpression("y = a == null ? b + c : a + c"),
        testExpression("foo = a ? b : c ? d : e"),
        testExpression("foo = a ? b ? c : d : e"),
        testExpression("foo = (a = v) ? b = w : c = x ? d = y : e = z"),
        testExpression("foo = (a = v) ? b = w ? c = x : d = y : e = z"),
        // Stacked assignment.
        testExpression("a = b = c"),
        testExpression("var a = b = c"),
      ]));
}
