blob: 22cafe80ab7c2522d5c9da96c4a75b123f2dfa09 [file] [log] [blame]
/*
* Copyright (c) 2012, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.dart.java2dart;
import com.google.dart.engine.ast.CompilationUnit;
import com.google.dart.java2dart.processor.PropertySemanticProcessor;
import com.google.dart.java2dart.processor.RenameConstructorsSemanticProcessor;
import java.io.File;
/**
* Test for general Java semantics to Dart translation.
*/
public class SemanticTest extends AbstractSemanticTest {
private final Context context = new Context();
private CompilationUnit unit;
public void test_anonymousClass_extendsClass() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public Test(int i) {",
" }",
" public boolean foo() {",
" return false;",
" }",
" public static main() {",
" Test v = new Test(42) {",
" public boolean foo() {",
" return true;",
" }",
" };",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
" Test(int i);",
" bool foo() => false;",
" static main() {",
" Test v = new Test_main(42);",
" }",
"}",
"class Test_main extends Test {",
" Test_main(int arg0) : super(arg0);",
" bool foo() => true;",
"}"),
getFormattedSource(unit));
}
public void test_anonymousClass_extendsClass_referenceFinalVariables() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public Test(int i, double f) {",
" }",
" public static main() {",
" final int myValue = 5;",
" Test v = new Test(1, 2.3) {",
" public int foo() {",
" return myValue;",
" }",
" };",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
" Test(int i, double f);",
" static main() {",
" int myValue = 5;",
" Test v = new Test_main(1, 2.3, myValue);",
" }",
"}",
"class Test_main extends Test {",
" int myValue = 0;",
" Test_main(int arg0, double arg1, this.myValue) : super(arg0, arg1);",
" int foo() => myValue;",
"}"),
getFormattedSource(unit));
}
public void test_anonymousClass_implementsInterface() throws Exception {
setFileLines(
"test/MyInterface.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public interface MyInterface {",
"}"));
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public static main() {",
" MyInterface v = new MyInterface() {",
" };",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"abstract class MyInterface {",
"}",
"class Test {",
" static main() {",
" MyInterface v = new MyInterface_Test_main();",
" }",
"}",
"class MyInterface_Test_main implements MyInterface {",
"}"),
getFormattedSource(unit));
}
public void test_anonymousClass_implementsInterface_referenceFinalVariables() throws Exception {
setFileLines(
"test/ErrorListener.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public interface ErrorListener {",
" public void onError();",
"}"));
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public static void main() {",
" final boolean[] hasErrors = {false};",
" ErrorListener v = new ErrorListener() {",
" public void onError() {",
" hasErrors[0] = false;",
" hasErrors[0] = true;",
" }",
" };",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"abstract class ErrorListener {",
" void onError();",
"}",
"class Test {",
" static void main() {",
" List<bool> hasErrors = [false];",
" ErrorListener v = new ErrorListener_Test_main(hasErrors);",
" }",
"}",
"class ErrorListener_Test_main implements ErrorListener {",
" List<bool> hasErrors;",
" ErrorListener_Test_main(this.hasErrors);",
" void onError() {",
" hasErrors[0] = false;",
" hasErrors[0] = true;",
" }",
"}"),
getFormattedSource(unit));
}
public void test_anonymousClass_referenceEnclosingClassField() throws Exception {
setFileLines(
"test/ErrorListener.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public interface ErrorListener {",
" public void onError();",
"}"));
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" boolean hasErrors;",
" static boolean staticField;",
" public void foo() {};",
" public void main() {",
" ErrorListener v = new ErrorListener() {",
" public void onError() {",
" foo();",
" hasErrors = true;",
" staticField = true;",
" }",
" };",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"abstract class ErrorListener {",
" void onError();",
"}",
"class Test {",
" bool _hasErrors = false;",
" static bool _staticField = false;",
" void foo() {",
" }",
" void main() {",
" ErrorListener v = new ErrorListener_Test_main(this);",
" }",
"}",
"class ErrorListener_Test_main implements ErrorListener {",
" final Test Test_this;",
" ErrorListener_Test_main(this.Test_this);",
" void onError() {",
" Test_this.foo();",
" Test_this._hasErrors = true;",
" Test._staticField = true;",
" }",
"}"),
getFormattedSource(unit));
}
public void test_buildSingleDartUnit() throws Exception {
setFileLines(
"test/Main.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Main {",
" public static void foo() {}",
"}",
""));
setFileLines(
"test/Second.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Second {",
" public static void bar() {",
" Main.foo();",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Main {",
" static void foo() {",
" }",
"}",
"class Second {",
" static void bar() {",
" Main.foo();",
" }",
"}"),
getFormattedSource(unit));
}
public void test_classInner() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"public class A {",
" public static class B {",
" public B() {}",
" }",
" public void test1(B p) {}",
" public void test2(A.B p) {}",
" public void test3() {",
" new B();",
" new A.B();",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
// do translate
translate();
assertEquals(
toString(
"class A {",
" void test1(A_B p) {",
" }",
" void test2(A_B p) {",
" }",
" void test3() {",
" new A_B();",
" new A_B();",
" }",
"}",
"class A_B {",
"}"),
getFormattedSource(unit));
}
public void test_classInner_enclosingSuperClass() throws Exception {
setFileLines(
"test/S.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"public class S {",
" public void outerMethod() {}",
"}"));
setFileLines(
"test/A.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"public class A extends S {",
" public class B {",
" public B() {}",
" public void test() {",
" outerMethod();",
" }",
" }",
" public B test2() {",
" return new B();",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
// do translate
translate();
assertEquals(
toString(
"class A extends S {",
" A_B test2() => new A_B(this);",
"}",
"class A_B {",
" final A A_this;",
" A_B(this.A_this);",
" void test() {",
" A_this.outerMethod();",
" }",
"}",
"class S {",
" void outerMethod() {",
" }",
"}"),
getFormattedSource(unit));
}
public void test_classInner_enclosingThisQualifier() throws Exception {
setFileLines(
"test/A.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"public class A {",
" public class B {",
" public void test() {",
" A.this.outerField = 5;",
" A.this.outerMethod();",
" test3(A.this);",
" }",
" }",
" int outerField;",
" public void outerMethod() {}",
" public B test2() {",
" return new B();",
" }",
" public void test3(A) {",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
// do translate
translate();
assertEquals(
toString(
"class A {",
" int _outerField = 0;",
" void outerMethod() {",
" }",
" A_B test2() => new A_B(this);",
" void test3() {",
" }",
"}",
"class A_B {",
" final A A_this;",
" A_B(this.A_this);",
" void test() {",
" A_this._outerField = 5;",
" A_this.outerMethod();",
" A_this.test3(A_this);",
" }",
"}"),
getFormattedSource(unit));
}
public void test_classInner_referenceEnclosingClassField_array() throws Exception {
setFileLines(
"test/A.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"public class A {",
" public class B {",
" public int test() {",
" return values.length;",
" }",
" }",
" int[] values;",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
// do translate
translate();
assertEquals(
toString(
"class A {",
" List<int> _values;",
"}",
"class A_B {",
" final A A_this;",
" A_B(this.A_this);",
" int test() => A_this._values.length;",
"}"),
getFormattedSource(unit));
}
public void test_classInner_referenceFromAnonymous() throws Exception {
setFileLines(
"test/A.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"public class A {",
" public class B {",
" public void foo() {}",
" }",
" public void test(final B p) {",
" return new Object() {",
" public void main() {",
" p.foo();",
" }",
" };",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
// do translate
translate();
assertEquals(
toString(
"class A {",
" void test(A_B p) => new Object_A_test(p);",
"}",
"class A_B {",
" void foo() {",
" }",
"}",
"class Object_A_test extends Object {",
" A_B p;",
" Object_A_test(this.p) : super();",
" void main() {",
" p.foo();",
" }",
"}"),
getFormattedSource(unit));
}
public void test_classInner_static_generic() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"public class A<T> {",
" public static class B<T> {",
" public B(A<T> a) {",
" }",
" public int getValue() {",
" return 42;",
" }",
" }",
" int test() {",
" B<T> b = new B<T>(this);",
" return b.getValue();",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
// do translate
translate();
assertEquals(
toString(
"class A<T> {",
" int _test() {",
" A_B<T> b = new A_B<T>(this);",
" return b.getValue();",
" }",
"}",
"class A_B<T> {",
" A_B(A<T> a);",
" int getValue() => 42;",
"}"),
getFormattedSource(unit));
}
public void test_classInner2() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"public interface A {",
" public interface B {",
" }",
" void test(B p) {}",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
// do translate
translate();
assertEquals(
toString(
"abstract class A {",
" void test(A_B p) {",
" }",
"}",
"abstract class A_B {",
"}"),
getFormattedSource(unit));
}
public void test_classInner3() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"public class A {",
" public static class B {",
" private static final int ZERO = 0;",
" public int getValue() {",
" return ZERO + 1;",
" }",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
// do translate
translate();
assertEquals(
toString(
"class A {",
"}",
"class A_B {",
" static int _ZERO = 0;",
" int getValue() => _ZERO + 1;",
"}"),
getFormattedSource(unit));
}
public void test_classInner4() throws Exception {
setFileLines(
"test/A.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"public class A {",
" public interface B {",
" }",
" public void test1(B p) {}",
" public A.B test2() {",
" return new A.B() {};",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
// do translate
translate();
assertEquals(
toString(
"class A {",
" void test1(A_B p) {",
" }",
" A_B test2() => new A_B_A_test2();",
"}",
"abstract class A_B {",
"}",
"class A_B_A_test2 implements A_B {",
"}"),
getFormattedSource(unit));
}
public void test_classInner5() throws Exception {
setFileLines(
"test/A.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"public class A {",
" public class B {",
" }",
" public void test1(B p) {}",
" public A.B test2() {",
" return new A.B() {};",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
// do translate
translate();
assertEquals(
toString(
"class A {",
" void test1(A_B p) {",
" }",
" A_B test2() => new A_B_A_test2();",
"}",
"class A_B {",
"}",
"class A_B_A_test2 extends A_B {",
"}"),
getFormattedSource(unit));
}
public void test_classInner6() throws Exception {
setFileLines(
"test/A.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"public class A {",
" public class B {",
" public B(int p) {}",
" public void test() {",
" outerMethod();",
" }",
" }",
" public void outerMethod() {}",
" public B test2() {",
" return new B(42);",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
// do translate
translate();
assertEquals(
toString(
"class A {",
" void outerMethod() {",
" }",
" A_B test2() => new A_B(this, 42);",
"}",
"class A_B {",
" final A A_this;",
" A_B(this.A_this, int p);",
" void test() {",
" A_this.outerMethod();",
" }",
"}"),
getFormattedSource(unit));
}
public void test_configureRenameField() throws Exception {
setFileLines(
"test/A.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class A {",
" public int foo;",
" public static void foo() {}",
"}",
""));
setFileLines(
"test/B.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class B {",
" public static void bar() {",
" print(A.foo);",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
context.addRename("Ltest/A;.foo", "myField");
translate();
assertEquals(
toString(
"class A {",
" int myField = 0;",
" static void foo() {",
" }",
"}",
"class B {",
" static void bar() {",
" print(A.myField);",
" }",
"}"),
getFormattedSource(unit));
}
public void test_configureRenameMethod() throws Exception {
setFileLines(
"test/A.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class A {",
" public static void foo() {}",
" public static void foo(int p) {}",
"}",
""));
setFileLines(
"test/B.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class B {",
" public static void bar() {",
" A.foo(42);",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
context.addRename("Ltest/A;.foo(I)", "fooWithInt");
translate();
assertEquals(
toString(
"class A {",
" static void foo() {",
" }",
" static void fooWithInt(int p) {",
" }",
"}",
"class B {",
" static void bar() {",
" A.fooWithInt(42);",
" }",
"}"),
getFormattedSource(unit));
}
public void test_constructor_defaultNames() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public Test() {",
" print(0);",
" }",
" public Test(int p) {",
" print(1);",
" }",
" public Test(double p) {",
" print(2);",
" }",
" public static void main() {",
" new Test();",
" new Test(2);",
" new Test(3.0);",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
" Test() {",
" print(0);",
" }",
" Test.con1(int p) {",
" print(1);",
" }",
" Test.con2(double p) {",
" print(2);",
" }",
" static void main() {",
" new Test();",
" new Test.con1(2);",
" new Test.con2(3.0);",
" }",
"}"),
getFormattedSource(unit));
}
public void test_constructor_typeArgs() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test<T> {",
" public Test() {",
" print(0);",
" }",
" public Test(int p) {",
" print(1);",
" }",
" public static void main() {",
" new Test<String>();",
" new Test<String>(2);",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test<T> {",
" Test() {",
" print(0);",
" }",
" Test.con1(int p) {",
" print(1);",
" }",
" static void main() {",
" new Test<String>();",
" new Test<String>.con1(2);",
" }",
"}"),
getFormattedSource(unit));
}
public void test_ensurePrimitiveFieldInitializer() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public boolean booleanF;",
" public byte byteF;",
" public char charF;",
" public short shortF;",
" public int intF;",
" public long longF;",
" public float floatF;",
" public double doubleF;",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
" bool booleanF = false;",
" int byteF = 0;",
" int charF = 0;",
" int shortF = 0;",
" int intF = 0;",
" int longF = 0;",
" double floatF = 0.0;",
" double doubleF = 0.0;",
"}"),
getFormattedSource(unit));
}
public void test_enum_constantWithSubclass() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public enum Test {",
" EOF(5) {",
" public void foo() {",
" print(2);",
" }",
" }, DEF;",
" private Test() {",
" }",
" private Test(int p) {",
" }",
" public void foo() {",
" print(1);",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test extends Enum<Test> {",
" static const Test EOF = const Test_EOF('EOF', 0, 5);",
" static const Test DEF = const Test.con1('DEF', 1);",
" static const List<Test> values = const [EOF, DEF];",
" const Test.con1(String name, int ordinal) : super(name, ordinal);",
" const Test.con2(String name, int ordinal, int p) : super(name, ordinal);",
" void foo() {",
" print(1);",
" }",
"}",
"class Test_EOF extends Test {",
" const Test_EOF(String name, int ordinal, int arg0) : super.con2(name, ordinal, arg0);",
" void foo() {",
" print(2);",
" }",
"}"),
getFormattedSource(unit));
}
public void test_enum_equals() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"public class A {",
" public static enum Direction {",
" LEFT, RIGHT;",
" }",
" ",
" public void test(Object a, Direction b) {",
" print(a == Direction.LEFT);",
" print(a != Direction.RIGHT);",
" print(b == Direction.LEFT);",
" print(b != Direction.RIGHT);",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class A {",
" void test(Object a, Direction b) {",
" print(identical(a, Direction.LEFT));",
" print(!identical(a, Direction.RIGHT));",
" print(b == Direction.LEFT);",
" print(b != Direction.RIGHT);",
" }",
"}",
"class Direction extends Enum<Direction> {",
" static const Direction LEFT = const Direction('LEFT', 0);",
" static const Direction RIGHT = const Direction('RIGHT', 1);",
" static const List<Direction> values = const [LEFT, RIGHT];",
" const Direction(String name, int ordinal) : super(name, ordinal);",
"}"),
getFormattedSource(unit));
}
public void test_enum_inner() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public enum MyEnum {",
" ONE, TWO;",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
"}",
"class MyEnum extends Enum<MyEnum> {",
" static const MyEnum ONE = const MyEnum('ONE', 0);",
" static const MyEnum TWO = const MyEnum('TWO', 1);",
" static const List<MyEnum> values = const [ONE, TWO];",
" const MyEnum(String name, int ordinal) : super(name, ordinal);",
"}"),
getFormattedSource(unit));
}
public void test_enum_noConstructor() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public enum Test {",
" ONE(), TWO;",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test extends Enum<Test> {",
" static const Test ONE = const Test('ONE', 0);",
" static const Test TWO = const Test('TWO', 1);",
" static const List<Test> values = const [ONE, TWO];",
" const Test(String name, int ordinal) : super(name, ordinal);",
"}"),
getFormattedSource(unit));
}
public void test_enum_twoConstructors() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public enum Test {",
" ONE(), TWO(2);",
" private Test() {",
" this(0);",
" }",
" private Test(int p) {",
" print(p);",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test extends Enum<Test> {",
" static const Test ONE = const Test.con1('ONE', 0);",
" static const Test TWO = const Test.con2('TWO', 1, 2);",
" static const List<Test> values = const [ONE, TWO];",
" const Test.con1(String name, int ordinal) : this.con2(name, ordinal, 0);",
" const Test.con2(String name, int ordinal, int p) : super(name, ordinal) {",
" print(p);",
" }",
"}"),
getFormattedSource(unit));
}
public void test_expression_equals() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"public class Test {",
" boolean testObject(Object a, Object b) {",
" return a == b;",
" }",
" boolean testNull(Object p) {",
" return p == null;",
" }",
" boolean testBool(Object p, boolean t) {",
" return p == true || p == t;",
" }",
" boolean testChar(Object p, char t) {",
" return p == '0' || p == t;",
" }",
" boolean testByte(Object p, byte t) {",
" return p == (byte) 1 || p == t;",
" }",
" boolean testInt(Object p, int t) {",
" return p == 2 || p == t;",
" }",
" boolean testLong(Object p, long t) {",
" return p == 3L || p == t;",
" }",
" boolean testFloat(Object p, float t) {",
" return p == 4.0f || p == t;",
" }",
" boolean testDouble(Object p, double t) {",
" return p == 5.0d || p == t;",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
" bool _testObject(Object a, Object b) => identical(a, b);",
" bool _testNull(Object p) => p == null;",
" bool _testBool(Object p, bool t) => p == true || p == t;",
" bool _testChar(Object p, int t) => p == 0x30 || p == t;",
" bool _testByte(Object p, int t) => p == 1 || p == t;",
" bool _testInt(Object p, int t) => p == 2 || p == t;",
" bool _testLong(Object p, int t) => p == 3 || p == t;",
" bool _testFloat(Object p, double t) => p == 4.0 || p == t;",
" bool _testDouble(Object p, double t) => p == 5.0 || p == t;",
"}"),
getFormattedSource(unit));
}
/**
* <p>
* https://code.google.com/p/dart/issues/detail?id=9845
*/
public void test_expression_equals_Class() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"public class A {",
" public boolean testA(Class a, Class b) {",
" return a == b;",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(toString(//
"class A {",
" bool testA(Class a, Class b) => a == b;",
"}"), getFormattedSource(unit));
}
public void test_forbiddenNames_forEach() throws Exception {
File file = setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public static void main(String [] vars) {",
" for (String var: vars) {",
" print(var);",
" }",
" }",
" public static void print(String p) {}",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFile(file);
translate();
assertEquals(
toString(
"class Test {",
" static void main(List<String> vars) {",
" for (String var2 in vars) {",
" print(var2);",
" }",
" }",
" static void print(String p) {",
" }",
"}"),
getFormattedSource(unit));
}
public void test_forbiddenNames_methods() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public void in() {}",
" public void with() {}",
" public void with(int p) {}",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
" void in2() {",
" }",
" void with2() {",
" }",
" void with3(int p) {",
" }",
"}"),
getFormattedSource(unit));
}
public void test_forbiddenNames_variable() throws Exception {
File file = setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public static void main() {",
" int in = 1;",
" int with = 2;",
" print(in);",
" print(with);",
" }",
" public static void print(int p) {}",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFile(file);
translate();
assertEquals(
toString(
"class Test {",
" static void main() {",
" int in2 = 1;",
" int with2 = 2;",
" print(in2);",
" print(with2);",
" }",
" static void print(int p) {",
" }",
"}"),
getFormattedSource(unit));
}
public void test_genericField() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"import java.util.List;",
"public class Test<T> {",
" private List<T> elements;",
" public void foo() {",
" elements.add(null);",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
// This will rename "elements" to "_elements".
// We need to make sure that all references are renamed.
new PropertySemanticProcessor(context).process(unit);
assertEquals(
toString(
"class Test<T> {",
" List<T> _elements;",
" void foo() {",
" _elements.add(null);",
" }",
"}"),
getFormattedSource(unit));
}
public void test_giveUniqueName_methodField() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" private int value;",
" public int value() {",
" return value;",
" }",
" public void bar() {",
" value();",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
" int _value = 0;",
" int value() => _value;",
" void bar() {",
" value();",
" }",
"}"),
getFormattedSource(unit));
}
/**
* In Java we can have method parameter "foo" and invoke method named "foo", and parameter will
* not shadow invoked method. But in Dart it will.
*/
public void test_giveUniqueName_methodParameter() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public int foo() {",
" return 42;",
" }",
" public int bar1(int foo) {",
" return foo(foo);",
" }",
" public int bar2(int foo) {",
" return foo;",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
" int foo() => 42;",
" int bar1(int foo) => this.foo(foo);",
" int bar2(int foo) => foo;",
"}"),
getFormattedSource(unit));
}
public void test_giveUniqueName_methods() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public static void foo() {}",
" public static void foo(int p) {}",
" public static void foo(double p) {}",
" public static void bar() {",
" foo(42);",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
" static void foo() {",
" }",
" static void foo2(int p) {",
" }",
" static void foo3(double p) {",
" }",
" static void bar() {",
" foo2(42);",
" }",
"}"),
getFormattedSource(unit));
}
/**
* We should not rename "equals" which comes from Object.
*/
public void test_giveUniqueName_methods_fromObject() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public static boolean equals(int a, int b) {",
" return a < b;",
" }",
" public boolean equals(Object o) {",
" return false;",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
" static bool equals2(int a, int b) => a < b;",
" bool equals(Object o) => false;",
"}"),
getFormattedSource(unit));
}
public void test_giveUniqueName_methods_hierarchy() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public void foo() {}",
" public void foo(int p) {}",
" public void foo(double p) {}",
"}",
""));
setFileLines(
"test/Test2.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test2 extends Test {",
" public void foo() {}",
" public void foo(int p) {}",
" public void foo(double p) {}",
"}",
""));
setFileLines(
"test/Test3.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test3 extends Test2 {",
" public void foo() {}",
" public void foo(int p) {}",
" public void foo(double p) {}",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
" void foo() {",
" }",
" void foo2(int p) {",
" }",
" void foo3(double p) {",
" }",
"}",
"class Test2 extends Test {",
" void foo() {",
" }",
" void foo2(int p) {",
" }",
" void foo3(double p) {",
" }",
"}",
"class Test3 extends Test2 {",
" void foo() {",
" }",
" void foo2(int p) {",
" }",
" void foo3(double p) {",
" }",
"}"),
getFormattedSource(unit));
}
public void test_giveUniqueName_methods_hierarchy_overloaded() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" <E> public E void foo(E p) {",
" return null;",
" }",
"}",
""));
setFileLines(
"test/Test2.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test2 extends Test {",
" public int foo(int p) {",
" return 0;",
" }",
" public void main() {",
" foo(this);",
" foo(42);",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
" void foo(Object p) => null;",
"}",
"class Test2 extends Test {",
" int foo2(int p) => 0;",
" void main() {",
" foo(this);",
" foo2(42);",
" }",
"}"),
getFormattedSource(unit));
}
public void test_giveUniqueName_withStatic() throws Exception {
setFileLines(
"test/Super.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Super {",
" public static int add(int a, int b) {return a + b;}",
"}",
""));
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Sub extends Super {",
" public int add(int a) {return add(a, 2);}",
" public void main() {",
" add(1, 2);",
" add(3);",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Super {",
" static int add(int a, int b) => a + b;",
"}",
"class Sub extends Super {",
" int add2(int a) => Super.add(a, 2);",
" void main() {",
" Super.add(1, 2);",
" add2(3);",
" }",
"}"),
getFormattedSource(unit));
}
public void test_importStatic_field() throws Exception {
setFileLines(
"test/A.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class A {",
" public static final int ZERO;",
"}",
""));
setFileLines(
"test/B.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"import static test.A.ZERO;",
"public class B {",
" public int myInstanceField;",
" public static int myStaticField;",
" public void main() {",
" print(A.ZERO);",
" print(ZERO);",
" this.myInstanceField = 1;",
" myInstanceField = 2;",
" myInstanceField = ZERO;",
" myInstanceField = ZERO + 1;",
" myInstanceField = 2 + ZERO;",
" myInstanceField = 1 + 2 + 3 + ZERO;",
" myStaticField = 3;",
" }",
" public int main2() {",
" return ZERO;",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class A {",
" static int ZERO = 0;",
"}",
"class B {",
" int myInstanceField = 0;",
" static int myStaticField = 0;",
" void main() {",
" print(A.ZERO);",
" print(A.ZERO);",
" this.myInstanceField = 1;",
" myInstanceField = 2;",
" myInstanceField = A.ZERO;",
" myInstanceField = A.ZERO + 1;",
" myInstanceField = 2 + A.ZERO;",
" myInstanceField = 1 + 2 + 3 + A.ZERO;",
" myStaticField = 3;",
" }",
" int main2() => A.ZERO;",
"}"),
getFormattedSource(unit));
}
public void test_importStatic_method() throws Exception {
setFileLines(
"test/A.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class A {",
" public static int zero() {return 0;}",
"}",
""));
setFileLines(
"test/B.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"import static test.A.zero;",
"public class B {",
" public static int one() {return 1;}",
" public void main() {",
" print(A.zero());",
" print(zero());",
" print(one());",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class A {",
" static int zero() => 0;",
"}",
"class B {",
" static int one() => 1;",
" void main() {",
" print(A.zero());",
" print(A.zero());",
" print(one());",
" }",
"}"),
getFormattedSource(unit));
}
/**
* https://code.google.com/p/dart/issues/detail?id=8854
*/
public void test_initializePrimitiveArrays() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public void main() {",
" Object res;",
" res = new boolean[5];",
" res = new byte[5];",
" res = new char[5];",
" res = new short[5];",
" res = new int[5];",
" res = new long[5];",
" res = new float[5];",
" res = new double[5];",
" res = new Object[5];",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
" void main() {",
" Object res;",
" res = new List<bool>.filled(5, false);",
" res = new List<int>.filled(5, 0);",
" res = new List<int>.filled(5, 0);",
" res = new List<int>.filled(5, 0);",
" res = new List<int>.filled(5, 0);",
" res = new List<int>.filled(5, 0);",
" res = new List<double>.filled(5, 0.0);",
" res = new List<double>.filled(5, 0.0);",
" res = new List<Object>(5);",
" }",
"}"),
getFormattedSource(unit));
}
public void test_localVariableShadow_qualified() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public int element;",
" public void main() {",
" int v = this.element;",
" int element = 42;",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
" int element = 0;",
" void main() {",
" int v = this.element;",
" int element = 42;",
" }",
"}"),
getFormattedSource(unit));
}
public void test_localVariableShadow_renamedProperty_catch() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" private int test;",
" int getTest() { return test; }",
" public void main() {",
" try {",
" } catch (Exception test) {",
" int v = getTest();",
" }",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
new PropertySemanticProcessor(context).process(unit);
context.applyLocalVariableSemanticChanges(unit);
assertEquals(
toString(
"class Test {",
" final int test = 0;",
" void main() {",
" try {",
" } catch (test) {",
" int v = this.test;",
" }",
" }",
"}"),
getFormattedSource(unit));
}
public void test_localVariableShadow_renamedProperty_var() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" private int test;",
" public int getTest() { return test; }",
" public void main(int test) {",
" int v = getTest();",
" int element = 42;",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
new PropertySemanticProcessor(context).process(unit);
context.applyLocalVariableSemanticChanges(unit);
assertEquals(
toString(
"class Test {",
" final int test = 0;",
" void main(int test) {",
" int v = this.test;",
" int element = 42;",
" }",
"}"),
getFormattedSource(unit));
}
public void test_localVariableShadow_shadowedField() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public int element;",
" public void main() {",
" int v = element;",
" int element = 42;",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
" int element = 0;",
" void main() {",
" int v = this.element;",
" int element = 42;",
" }",
"}"),
getFormattedSource(unit));
}
public void test_localVariableShadow_shadowedMethod() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public void element() {}",
" public void main() {",
" element();",
" int element = 42;",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
" void element() {",
" }",
" void main() {",
" this.element();",
" int element = 42;",
" }",
"}"),
getFormattedSource(unit));
}
public void test_localVariableShadow_staticMethod() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public static void element() {}",
" public void main() {",
" element();",
" int element = 42;",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
" static void element() {",
" }",
" void main() {",
" Test.element();",
" int element = 42;",
" }",
"}"),
getFormattedSource(unit));
}
public void test_private_field() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"public class A {",
" private int field = 42;",
" public int foo() {",
" return field;",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
// do translate
translate();
assertEquals(toString(//
"class A {",
" int _field = 42;",
" int foo() => _field;",
"}"), getFormattedSource(unit));
}
public void test_private_method() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"public class A {",
" private void test() {}",
" private void foo() {",
" test();",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
// do translate
translate();
assertEquals(toString(//
"class A {",
" void _test() {",
" }",
" void _foo() {",
" _test();",
" }",
"}"), getFormattedSource(unit));
}
public void test_redirectingConstructorInvocation() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public Test() {",
" this(42);",
" }",
" public Test(int p) {",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(toString(//
"class Test {",
" Test() : this.con1(42);",
" Test.con1(int p);",
"}"), getFormattedSource(unit));
}
public void test_statementSwitch_enum() throws Exception {
setFileLines(
"test/A.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public enum A {",
" ONE, TWO;",
"}",
""));
setFileLines(
"test/B.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class B {",
" public void main(A p) {",
" switch (p) {",
" case ONE:",
" print(1);",
" break;",
" case TWO:",
" print(2);",
" break;",
" }",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class A extends Enum<A> {",
" static const A ONE = const A('ONE', 0);",
" static const A TWO = const A('TWO', 1);",
" static const List<A> values = const [ONE, TWO];",
" const A(String name, int ordinal) : super(name, ordinal);",
"}",
"class B {",
" void main(A p) {",
" while (true) {",
" if (p == A.ONE) {",
" print(1);",
" } else if (p == A.TWO) {",
" print(2);",
" }",
" break;",
" }",
" }",
"}"),
getFormattedSource(unit));
}
public void test_superConstructorInvocation() throws Exception {
setFileLines(
"test/A.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class A {",
" A(int p) {}",
" A(double p) {}",
"}",
""));
setFileLines(
"test/B.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class B extends A {",
" B() {",
" super(1.0);",
" print(2);",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class A {",
" A.con1(int p);",
" A.con2(double p);",
"}",
"class B extends A {",
" B() : super.con2(1.0) {",
" print(2);",
" }",
"}"),
getFormattedSource(unit));
}
public void test_superMethodInvocation() throws Exception {
setFileLines(
"test/A.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class A {",
" public void test(int p) {}",
"}",
""));
setFileLines(
"test/B.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class B extends A {",
" public void test() {",
" print(1);",
" super.test(2);",
" print(3);",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class A {",
" void test(int p) {",
" }",
"}",
"class B extends A {",
" void test2() {",
" print(1);",
" super.test(2);",
" print(3);",
" }",
"}"),
getFormattedSource(unit));
}
public void test_thisInFieldInitializer_noConstructor() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public Object foo = this;",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(toString(//
"class Test {",
" Object foo;",
" Test() {",
" this.foo = this;",
" }",
"}"), getFormattedSource(unit));
}
public void test_thisInFieldInitializer_singleConstructor() throws Exception {
setFileLines(
"test/Super.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Super {",
" public Super(int p) {",
" }",
"}",
""));
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public Object foo = this;",
" public Test(int p) {",
" super(p);",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Super {",
" Super(int p);",
"}",
"class Test {",
" Object foo;",
" Test(int p) : super(p) {",
" this.foo = this;",
" }",
"}"),
getFormattedSource(unit));
}
public void test_thisInFieldInitializer_twoConstructors() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public Object foo = this;",
" public Object bar = this;",
" public Test() {",
" print(1);",
" }",
" public Test(int p) {",
" print(2);",
" }",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
" Object foo;",
" Object bar;",
" Test() {",
" this.foo = this;",
" this.bar = this;",
" print(1);",
" }",
" Test.con1(int p) {",
" this.foo = this;",
" this.bar = this;",
" print(2);",
" }",
"}"),
getFormattedSource(unit));
}
public void test_tryCatch_Throwable() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"public class Test {",
" public void main() {",
" try {",
" } catch (Throwable e) {",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
// do translate
translate();
assertEquals(
toString(
"class Test {",
" void main() {",
" try {",
" } catch (e) {",
" }",
" }",
"}"),
getFormattedSource(unit));
}
public void test_typeVariable_inGenericMethod() throws Exception {
setFileLines(
"test/A.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class A {",
"}"));
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"import java.util.ArrayList;",
"public class Test {",
" public static <T extends A> ArrayList<T> foo() {",
" return new ArrayList<T>();",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class A {",
"}",
"class Test {",
" static ArrayList foo() => new ArrayList();",
"}"),
getFormattedSource(unit));
}
public void test_varArgs() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class A {",
" public void test(int errorCode, Object ...args) {",
" }",
" public void main() {",
" test(-1);",
" test(-1, 2, 3.0);",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class A {",
" void test(int errorCode, List<Object> args) {",
" }",
" void main() {",
" test(-1, []);",
" test(-1, [2, 3.0]);",
" }",
"}"),
getFormattedSource(unit));
}
public void test_varArgs_alreadyArray() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class A {",
" public String[] EMPTY = {};",
" public void test(String ...args) {",
" }",
" public void main() {",
" test(EMPTY);",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class A {",
" List<String> EMPTY = [];",
" void test(List<String> args) {",
" }",
" void main() {",
" test(EMPTY);",
" }",
"}"),
getFormattedSource(unit));
}
public void test_varArgs_alreadyArray_constructor() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public Test(String o, int ...args) {",
" }",
" public Test(int ...args) {",
" this(null, args);",
" }",
" public void main(int ...args) {",
" new Test(null, 1, 2, 3);",
" new Test(1, 2, 3);",
" new Test(null, args);",
" new Test(args);",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
" Test.con1(String o, List<int> args);",
" Test.con2(List<int> args) : this.con1(null, args);",
" void main(List<int> args) {",
" new Test.con1(null, [1, 2, 3]);",
" new Test.con2([1, 2, 3]);",
" new Test.con1(null, args);",
" new Test.con2(args);",
" }",
"}"),
getFormattedSource(unit));
}
public void test_varArgs_alreadyArray_superConstructor() throws Exception {
setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" private static class A {",
" A(int ...args) {",
" }",
" }",
" private static class B extends A {",
" B(int ...args) {",
" super(args);",
" }",
" }",
"}"));
context.addSourceFolder(tmpFolder);
context.addSourceFiles(tmpFolder);
translate();
assertEquals(
toString(
"class Test {",
"}",
"class Test_A {",
" Test_A(List<int> args);",
"}",
"class Test_B extends Test_A {",
" Test_B(List<int> args) : super(args);",
"}"),
getFormattedSource(unit));
}
public void test_variableInitializer_qualifiedReference() throws Exception {
File file = setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public int foo() {return 42;}",
" public int bar;",
" public static void mainA() {",
" int foo = this.foo();",
" process(foo);",
" }",
" public static void mainB() {",
" int bar = this.bar;",
" process(bar);",
" }",
" public void process(int x) {}",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFile(file);
translate();
assertEquals(
toString(
"class Test {",
" int foo() => 42;",
" int bar = 0;",
" static void mainA() {",
" int foo = this.foo();",
" process(foo);",
" }",
" static void mainB() {",
" int bar = this.bar;",
" process(bar);",
" }",
" void process(int x) {",
" }",
"}"),
getFormattedSource(unit));
}
public void test_variableInitializer_useThisQualifier() throws Exception {
File file = setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public static int foo() {return 42;}",
" public static void barA() {",
" int foo = foo();",
" baz(foo);",
" }",
" public static void barB() {",
" int foo = foo();",
" baz(foo);",
" }",
" public static void baz(int p) {}",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFile(file);
translate();
assertEquals(
toString(
"class Test {",
" static int foo() => 42;",
" static void barA() {",
" int foo = Test.foo();",
" baz(foo);",
" }",
" static void barB() {",
" int foo = Test.foo();",
" baz(foo);",
" }",
" static void baz(int p) {",
" }",
"}"),
getFormattedSource(unit));
}
public void test_variableInitializer_useThisQualifier_propertyReference() throws Exception {
File file = setFileLines(
"test/Test.java",
toString(
"// filler filler filler filler filler filler filler filler filler filler",
"package test;",
"public class Test {",
" public int getFoo() {return 42;}",
" public static void main() {",
" int foo = getFoo();",
" process(foo);",
" }",
" public void process(int x) {}",
"}",
""));
context.addSourceFolder(tmpFolder);
context.addSourceFile(file);
translate();
// convert to properties and run variable checks again
new PropertySemanticProcessor(context).process(unit);
context.applyLocalVariableSemanticChanges(unit);
// verify
assertEquals(
toString(
"class Test {",
" int get foo => 42;",
" static void main() {",
" int foo = this.foo;",
" process(foo);",
" }",
" void process(int x) {",
" }",
"}"),
getFormattedSource(unit));
}
private void translate() throws Exception {
unit = context.translate();
context.ensureUniqueClassMemberNames();
context.applyLocalVariableSemanticChanges(unit);
new RenameConstructorsSemanticProcessor(context).process(unit);
}
}