blob: 441269e2013caf29c2d03157170ead52e35fe99f [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 '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){}}');
}
main() {
testSignedConstants();
testGenericTypes();
testForLoop();
testEmptyList();
testClosure();
testIndexedOperatorDecl();
testNativeMethods();
testPrefixIncrements();
testConstModifier();
testSimpleObjectInstantiation();
testLibraryName();
testImport();
testExport();
testPart();
testPartOf();
testCombinators();
testRedirectingFactoryConstructors();
testClassDeclarations();
}