// Copyright (c) 2012, 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:expect/expect.dart";
import 'dart:uri';
import 'parser_helper.dart';
import 'mock_compiler.dart';
import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';

testUnparse(String statement) {
  Node node = parseStatement(statement);
  Expect.equals(statement, unparse(node));
}

testUnparseMember(String member) {
  Node node = parseMember(member);
  Expect.equals(member, unparse(node));
}

testUnparseUnit(String code) {
  Node node = fullParseUnit(code);
  Expect.equals(code, unparse(node));
}

testUnparseTopLevelWithMetadata(String code) {
  testUnparseUnit(code);
  // TODO(ahe): Enable when supported.
  // testUnparseUnit('@foo $code');
}

testSignedConstants() {
  testUnparse('var x=+42;');
  testUnparse('var x=+.42;');
  testUnparse('var x=-42;');
  testUnparse('var x=-.42;');
  testUnparse('var x=+0;');
  testUnparse('var x=+0.0;');
  testUnparse('var x=+.0;');
  testUnparse('var x=-0;');
  testUnparse('var x=-0.0;');
  testUnparse('var x=-.0;');
}

testGenericTypes() {
  testUnparse('var x=new List<List<int>>();');
  testUnparse('var x=new List<List<List<int>>>();');
  testUnparse('var x=new List<List<List<List<int>>>>();');
  testUnparse('var x=new List<List<List<List<List<int>>>>>();');
}

testForLoop() {
  testUnparse('for(;i<100;i++ ){}');
  testUnparse('for(i=0;i<100;i++ ){}');
}

testEmptyList() {
  testUnparse('var x=[] ;');
}

testClosure() {
  testUnparse('var x=(var x)=>x;');
}

testIndexedOperatorDecl() {
  testUnparseMember('operator[](int i)=>null;');
  testUnparseMember('operator[]=(int i,int j)=>null;');
}

testNativeMethods() {
  testUnparseMember('foo()native;');
  testUnparseMember('foo()native "bar";');
  testUnparseMember('foo()native "this.x = 41";');
}

testPrefixIncrements() {
  testUnparse(' ++i;');
  testUnparse(' ++a[i];');
  testUnparse(' ++a[ ++b[i]];');
}

testConstModifier() {
  testUnparse('foo([var a=const[] ]){}');
  testUnparse('foo([var a=const{}]){}');
  testUnparse('foo(){var a=const[] ;var b=const{};}');
  testUnparse('foo([var a=const[const{"a":const[1,2,3]}]]){}');
}

testSimpleObjectInstantiation() {
  testUnparse('main(){new Object();}');
}

testLibraryName() {
  testUnparseTopLevelWithMetadata('library com;');
  testUnparseTopLevelWithMetadata('library com.example;');
  testUnparseTopLevelWithMetadata('library com.example.dart;');
}

testImport() {
  testUnparseTopLevelWithMetadata('import "søhest";');
  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest;');
}

testExport() {
  testUnparseTopLevelWithMetadata('export "søhest";');
}

testPart() {
  testUnparseTopLevelWithMetadata('part "søhest";');
}

testPartOf() {
  testUnparseTopLevelWithMetadata('part of com;');
  testUnparseTopLevelWithMetadata('part of com.example;');
  testUnparseTopLevelWithMetadata('part of com.example.dart;');
}

testCombinators() {
  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest show a;');
  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest show hide;');
  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest show show;');
  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest show a,hide;');
  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest show a,show;');

  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest hide a;');
  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest hide hide;');
  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest hide show;');
  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest hide a,hide;');
  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest hide a,show;');

  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest show a hide a;');
  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest show hide hide hide;');
  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest show show hide show;');
  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest show a,hide hide a,hide;');
  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest show a,show hide a,show;');

  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest hide a show a;');
  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest hide hide show hide;');
  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest hide show show show;');
  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest hide a,hide show a,hide;');
  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest hide a,show show a,show;');

  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest show a show a;');
  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest show hide show hide;');
  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest show show show show;');
  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest show a,hide show a,hide;');
  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest show a,show show a,show;');

  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest hide a hide a;');
  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest hide hide hide hide;');
  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest hide show hide show;');
  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest hide a,hide hide a,hide;');
  testUnparseTopLevelWithMetadata(
      'import "søhest" as fiskehest hide a,show hide a,show;');

  testUnparseTopLevelWithMetadata('export "søhest" show a;');
  testUnparseTopLevelWithMetadata('export "søhest" show hide;');
  testUnparseTopLevelWithMetadata('export "søhest" show show;');
  testUnparseTopLevelWithMetadata('export "søhest" show a,hide;');
  testUnparseTopLevelWithMetadata('export "søhest" show a,show;');

  testUnparseTopLevelWithMetadata('export "søhest" hide a;');
  testUnparseTopLevelWithMetadata('export "søhest" hide hide;');
  testUnparseTopLevelWithMetadata('export "søhest" hide show;');
  testUnparseTopLevelWithMetadata('export "søhest" hide a,hide;');
  testUnparseTopLevelWithMetadata('export "søhest" hide a,show;');

  testUnparseTopLevelWithMetadata('export "søhest" show a hide a;');
  testUnparseTopLevelWithMetadata('export "søhest" show hide hide hide;');
  testUnparseTopLevelWithMetadata('export "søhest" show show hide show;');
  testUnparseTopLevelWithMetadata('export "søhest" show a,hide hide a,hide;');
  testUnparseTopLevelWithMetadata('export "søhest" show a,show hide a,show;');

  testUnparseTopLevelWithMetadata('export "søhest" hide a show a;');
  testUnparseTopLevelWithMetadata('export "søhest" hide hide show hide;');
  testUnparseTopLevelWithMetadata('export "søhest" hide show show show;');
  testUnparseTopLevelWithMetadata('export "søhest" hide a,hide show a,hide;');
  testUnparseTopLevelWithMetadata('export "søhest" hide a,show show a,show;');

  testUnparseTopLevelWithMetadata('export "søhest" show a show a;');
  testUnparseTopLevelWithMetadata('export "søhest" show hide show hide;');
  testUnparseTopLevelWithMetadata('export "søhest" show show show show;');
  testUnparseTopLevelWithMetadata('export "søhest" show a,hide show a,hide;');
  testUnparseTopLevelWithMetadata('export "søhest" show a,show show a,show;');

  testUnparseTopLevelWithMetadata('export "søhest" hide a hide a;');
  testUnparseTopLevelWithMetadata('export "søhest" hide hide hide hide;');
  testUnparseTopLevelWithMetadata('export "søhest" hide show hide show;');
  testUnparseTopLevelWithMetadata('export "søhest" hide a,hide hide a,hide;');
  testUnparseTopLevelWithMetadata('export "søhest" hide a,show hide a,show;');
}

testUnparseMemberAndAsMemberOfFoo(String code) {
  testUnparseMember(code);
  testUnparseTopLevelWithMetadata('class Foo{$code}');
}

testRedirectingFactoryConstructors() {
  testUnparseMemberAndAsMemberOfFoo("factory Foo() = Bar;");
  testUnparseMemberAndAsMemberOfFoo("factory Foo() = Bar.baz;");
  testUnparseMemberAndAsMemberOfFoo("factory Foo() = Bar<T>;");
  testUnparseMemberAndAsMemberOfFoo("factory Foo() = Bar<List<T>,T>;");
  testUnparseMemberAndAsMemberOfFoo("factory Foo() = Bar<T>.baz;");
  testUnparseMemberAndAsMemberOfFoo("factory Foo() = Bar<List<T>,T>.baz;");
  testUnparseMemberAndAsMemberOfFoo("factory Foo() = prefix.Bar;");
  testUnparseMemberAndAsMemberOfFoo("factory Foo() = prefix.Bar.baz;");
  testUnparseMemberAndAsMemberOfFoo("factory Foo() = prefix.Bar<T>;");
  testUnparseMemberAndAsMemberOfFoo("factory Foo() = prefix.Bar<List<T>,T>;");
  testUnparseMemberAndAsMemberOfFoo("factory Foo() = prefix.Bar<T>.baz;");
  testUnparseMemberAndAsMemberOfFoo(
      "factory Foo() = prefix.Bar<List<T>,T>.baz;");
  testUnparseMemberAndAsMemberOfFoo("const factory Foo() = Bar;");
  testUnparseMemberAndAsMemberOfFoo("const factory Foo() = Bar.baz;");
  testUnparseMemberAndAsMemberOfFoo("const factory Foo() = Bar<T>;");
  testUnparseMemberAndAsMemberOfFoo("const factory Foo() = Bar<List<T>,T>;");
  testUnparseMemberAndAsMemberOfFoo("const factory Foo() = Bar<T>.baz;");
  testUnparseMemberAndAsMemberOfFoo(
      "const factory Foo() = Bar<List<T>,T>.baz;");
  testUnparseMemberAndAsMemberOfFoo("const factory Foo() = prefix.Bar;");
  testUnparseMemberAndAsMemberOfFoo("const factory Foo() = prefix.Bar.baz;");
  testUnparseMemberAndAsMemberOfFoo("const factory Foo() = prefix.Bar<T>;");
  testUnparseMemberAndAsMemberOfFoo(
      "const factory Foo() = prefix.Bar<List<T>,T>;");
  testUnparseMemberAndAsMemberOfFoo("const factory Foo() = prefix.Bar<T>.baz;");
  testUnparseMemberAndAsMemberOfFoo(
      "const factory Foo() = prefix.Bar<List<T>,T>.baz;");
  testUnparseMemberAndAsMemberOfFoo("external factory Foo() = Bar;");
  testUnparseMemberAndAsMemberOfFoo("external factory Foo() = Bar.baz;");
  testUnparseMemberAndAsMemberOfFoo("external factory Foo() = Bar<T>;");
  testUnparseMemberAndAsMemberOfFoo("external factory Foo() = Bar<List<T>,T>;");
  testUnparseMemberAndAsMemberOfFoo("external factory Foo() = Bar<T>.baz;");
  testUnparseMemberAndAsMemberOfFoo(
      "external factory Foo() = Bar<List<T>,T>.baz;");
  testUnparseMemberAndAsMemberOfFoo("external factory Foo() = prefix.Bar;");
  testUnparseMemberAndAsMemberOfFoo("external factory Foo() = prefix.Bar.baz;");
  testUnparseMemberAndAsMemberOfFoo("external factory Foo() = prefix.Bar<T>;");
  testUnparseMemberAndAsMemberOfFoo(
      "external factory Foo() = prefix.Bar<List<T>,T>;");
  testUnparseMemberAndAsMemberOfFoo(
      "external factory Foo() = prefix.Bar<T>.baz;");
  testUnparseMemberAndAsMemberOfFoo(
      "external factory Foo() = prefix.Bar<List<T>,T>.baz;");
  testUnparseMemberAndAsMemberOfFoo("external const factory Foo() = Bar;");
  testUnparseMemberAndAsMemberOfFoo("external const factory Foo() = Bar.baz;");
  testUnparseMemberAndAsMemberOfFoo("external const factory Foo() = Bar<T>;");
  testUnparseMemberAndAsMemberOfFoo(
      "external const factory Foo() = Bar<List<T>,T>;");
  testUnparseMemberAndAsMemberOfFoo(
      "external const factory Foo() = Bar<T>.baz;");
  testUnparseMemberAndAsMemberOfFoo(
      "external const factory Foo() = Bar<List<T>,T>.baz;");
  testUnparseMemberAndAsMemberOfFoo(
      "external const factory Foo() = prefix.Bar;");
  testUnparseMemberAndAsMemberOfFoo(
      "external const factory Foo() = prefix.Bar.baz;");
  testUnparseMemberAndAsMemberOfFoo(
      "external const factory Foo() = prefix.Bar<T>;");
  testUnparseMemberAndAsMemberOfFoo(
      "external const factory Foo() = prefix.Bar<List<T>,T>;");
  testUnparseMemberAndAsMemberOfFoo(
      "external const factory Foo() = prefix.Bar<T>.baz;");
  testUnparseMemberAndAsMemberOfFoo(
      "external const factory Foo() = prefix.Bar<List<T>,T>.baz;");
}

testClassDeclarations() {
  testUnparseTopLevelWithMetadata('class Foo{}');
  testUnparseTopLevelWithMetadata('abstract class Foo{}');
  testUnparseTopLevelWithMetadata('class Fisk{operator-(x){}}');
}

testMixinApplications() {
  testUnparseTopLevelWithMetadata('typedef C = S with M;');
  testUnparseTopLevelWithMetadata('typedef C = S with M1,M2;');
  testUnparseTopLevelWithMetadata('typedef C = S with M1,M2,M3;');

  testUnparseTopLevelWithMetadata('typedef C<A> = S with M;');
  testUnparseTopLevelWithMetadata('typedef C<A,B> = S with M;');

  testUnparseTopLevelWithMetadata('typedef C = S<A> with M;');
  testUnparseTopLevelWithMetadata('typedef C = S<A,B> with M;');

  testUnparseTopLevelWithMetadata('typedef C = S with M<A>;');
  testUnparseTopLevelWithMetadata('typedef C = S with M<A,B>;');
  testUnparseTopLevelWithMetadata('typedef C = S with M1<A>,M2;');
  testUnparseTopLevelWithMetadata('typedef C = S with M1,M2<A,B>;');
}

testUnparseParameters(List<String> variableDeclarations) {
  var sb = new StringBuffer();
  sb.write('Constructor(');
  int index = 0;
  for (String variableDeclaration in variableDeclarations) {
    if (index != 0) {
      sb.write(', ');
    }
    sb.write(variableDeclaration);
    index++;
  }
  sb.write(');');

  FunctionExpression node = parseMember(sb.toString());
  index = 0;
  for (VariableDefinitions parameter in node.parameters.nodes) {
    Expect.equals(variableDeclarations[index], unparse(parameter));
    index++;
  }

}

testParameters() {
  testUnparseParameters(
      ["foo", "bar=0", "int baz", "int boz=0"]);
  testUnparseParameters(
      ["this.foo", "this.bar=0", "int this.baz", "int this.boz=0"]);
  testUnparseParameters(
      ["foo()", "void bar()", "int baz(a)", "int boz(int a,int b)=null"]);
  testUnparseParameters(
      ["this.foo()",
       //"void this.bar()", // Commented out due to Issue 7852
       //"int this.baz(a)", // Commented out due to Issue 7852
       //"int this.boz(int a,int b)=null" // Commented out due to Issue 7852
       ]);
}

main() {
  testSignedConstants();
  testGenericTypes();
  testForLoop();
  testEmptyList();
  testClosure();
  testIndexedOperatorDecl();
  testNativeMethods();
  testPrefixIncrements();
  testConstModifier();
  testSimpleObjectInstantiation();
  testLibraryName();
  testImport();
  testExport();
  testPart();
  testPartOf();
  testCombinators();
  testRedirectingFactoryConstructors();
  testClassDeclarations();
  testMixinApplications();
  testParameters();
}
