blob: cd815c85238f806a9774b33390b85c0caf9e1503 [file] [log] [blame]
// 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 'parser_helper.dart';
import 'package:compiler/src/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=-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";');
}
testConditionalImport() {
testUnparseTopLevelWithMetadata('import "søhest" if(some.dotted.id)"other";');
testUnparseTopLevelWithMetadata('import "søhest" if(id=="some str")"other";');
testUnparseTopLevelWithMetadata('import "søhest"'
' if(id=="some str")"other"'
' if(id)"other2";');
testUnparseTopLevelWithMetadata(
'import "søhest" if(some.dotted.id)"other" as fiskehest;');
testUnparseTopLevelWithMetadata(
'import "søhest" if(id=="some str")"other" as fiskehest;');
testUnparseTopLevelWithMetadata('import "søhest"'
' if(id=="some str")"other"'
' if(id)"other2"'
' as fiskehest;');
testUnparseTopLevelWithMetadata(
'import "søhest" if(some.dotted.id)"other" deferred as fiskehest;');
testUnparseTopLevelWithMetadata(
'import "søhest" if(id=="some str")"other" deferred as fiskehest;');
testUnparseTopLevelWithMetadata('import "søhest"'
' if(id=="some str")"other"'
' if(id)"other2"'
' deferred as fiskehest;');
testUnparseTopLevelWithMetadata('import "søhest"'
' if(id=="some str")"other"'
' if(id)"other2"'
' deferred as fiskehest'
' show foo,bar;');
}
testConditionalExport() {
testUnparseTopLevelWithMetadata('export "søhest" if(some.dotted.id)"other";');
testUnparseTopLevelWithMetadata('export "søhest" if(id=="some str")"other";');
testUnparseTopLevelWithMetadata('export "søhest"'
' if(id=="some str")"other"'
' if(id)"other2";');
testUnparseTopLevelWithMetadata('export "søhest"'
' if(id=="some str")"other"'
' if(id)"other2"'
' show foo,bar;');
}
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;');
}
testDeferredImport() {
testUnparseTopLevelWithMetadata('import "lib.dart" as a;');
testUnparseTopLevelWithMetadata('import "lib.dart" deferred as a;');
testUnparseTopLevelWithMetadata('import "lib.dart" deferred as a show b;');
testUnparseTopLevelWithMetadata('import "lib.dart" deferred as a hide b;');
}
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('class C = S with M;');
testUnparseTopLevelWithMetadata('class C = S with M1,M2;');
testUnparseTopLevelWithMetadata('class C = S with M1,M2,M3;');
testUnparseTopLevelWithMetadata('class C<A> = S with M;');
testUnparseTopLevelWithMetadata('class C<A,B> = S with M;');
testUnparseTopLevelWithMetadata('class C = S<A> with M;');
testUnparseTopLevelWithMetadata('class C = S<A,B> with M;');
testUnparseTopLevelWithMetadata('class C = S with M<A>;');
testUnparseTopLevelWithMetadata('class C = S with M<A,B>;');
testUnparseTopLevelWithMetadata('class C = S with M1<A>,M2;');
testUnparseTopLevelWithMetadata('class C = S with M1,M2<A,B>;');
testUnparseTopLevelWithMetadata('abstract class C = S with M;');
testUnparseTopLevelWithMetadata('abstract class C<A> = S<A> with M<A>;');
}
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
]);
testUnparseParameters(
["@a foo", "@b @c bar=0", "@D(0) int baz", "@E([f],{g:h}) int boz=0"]);
}
testSymbolLiterals() {
testUnparse("#+;");
testUnparse("#-;");
testUnparse("#*;");
testUnparse("#/;");
testUnparse("#~/;");
testUnparse("#%;");
testUnparse("#<;");
testUnparse("#<=;");
testUnparse("#>;");
testUnparse("#>=;");
testUnparse("#==;");
testUnparse("#&;");
testUnparse("#|;");
testUnparse("#^;");
testUnparse("#a;");
testUnparse("#a.b;");
testUnparse("#a.b.c;");
testUnparse("#aa.bb.cc.dd;");
}
main() {
testSignedConstants();
testGenericTypes();
testForLoop();
testEmptyList();
testClosure();
testIndexedOperatorDecl();
testNativeMethods();
testPrefixIncrements();
testConstModifier();
testSimpleObjectInstantiation();
testLibraryName();
testImport();
testExport();
testConditionalImport();
testConditionalExport();
testPart();
testPartOf();
testCombinators();
testDeferredImport();
testRedirectingFactoryConstructors();
testClassDeclarations();
testMixinApplications();
testParameters();
testSymbolLiterals();
}