| // 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 '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=-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('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(); |
| testPart(); |
| testPartOf(); |
| testCombinators(); |
| testRedirectingFactoryConstructors(); |
| testClassDeclarations(); |
| testMixinApplications(); |
| testParameters(); |
| testSymbolLiterals(); |
| } |