diff --git a/commons-compiler-tests/src/test/java/org/codehaus/commons/compiler/tests/ReportedBugsTest.java b/commons-compiler-tests/src/test/java/org/codehaus/commons/compiler/tests/ReportedBugsTest.java index 31b7910e..79cac771 100644 --- a/commons-compiler-tests/src/test/java/org/codehaus/commons/compiler/tests/ReportedBugsTest.java +++ b/commons-compiler-tests/src/test/java/org/codehaus/commons/compiler/tests/ReportedBugsTest.java @@ -1938,4 +1938,25 @@ interface Nukable { ); this.assertCompilationUnitMainReturnsTrue(body, "MyClass"); } + + @Test public void + testIssue212AssignmentConversionNotPossibleFromTypeInterfaceClassToTypeAbstractClass() throws Exception { + + String body = ( + "" + + "import org.codehaus.commons.compiler.tests.issue212.base.IBase;\n" + + "import org.codehaus.commons.compiler.tests.issue212.base.BaseClass;\n" + + "import org.codehaus.commons.compiler.tests.issue212.base.DerivedClass;\n" + + "import org.codehaus.commons.compiler.tests.issue212.base.MapperClass;\n" + + "\n" + + "public class MyClass {\n" + + " public static String main() {\n" + + " IBase o1 = new MapperClass().mapper().path();\n" + + " BaseClass o2 = new MapperClass().mapper().path();\n" + + " return o2.toString();\n" + + " }\n" + + "}\n" + ); + this.assertCompilationUnitMainEquals("BaseClass [baseId=0]DerivedClass [name=default]", body, "MyClass"); + } } diff --git a/commons-compiler-tests/src/test/java/org/codehaus/commons/compiler/tests/issue212/base/BaseClass.java b/commons-compiler-tests/src/test/java/org/codehaus/commons/compiler/tests/issue212/base/BaseClass.java new file mode 100644 index 00000000..ca8a53bb --- /dev/null +++ b/commons-compiler-tests/src/test/java/org/codehaus/commons/compiler/tests/issue212/base/BaseClass.java @@ -0,0 +1,24 @@ + +package org.codehaus.commons.compiler.tests.issue212.base; + +public abstract class BaseClass implements IBase { + + private String baseId; + + public + BaseClass() {} + + public + BaseClass(String baseId) { + super(); + this.baseId = baseId; + } + + @Override public abstract BaseClass + path(); + + @Override public String + toString() { + return "BaseClass [baseId=" + this.baseId + "]"; + } +} diff --git a/commons-compiler-tests/src/test/java/org/codehaus/commons/compiler/tests/issue212/base/DerivedClass.java b/commons-compiler-tests/src/test/java/org/codehaus/commons/compiler/tests/issue212/base/DerivedClass.java new file mode 100644 index 00000000..219561d8 --- /dev/null +++ b/commons-compiler-tests/src/test/java/org/codehaus/commons/compiler/tests/issue212/base/DerivedClass.java @@ -0,0 +1,29 @@ + +package org.codehaus.commons.compiler.tests.issue212.base; + +public +class DerivedClass extends BaseClass { + + private String name; + + public + DerivedClass() { + super(); + } + + public + DerivedClass(String baseId, String name) { + super(baseId); + this.name = name; + } + + @Override public BaseClass + path() { + return new DerivedClass("0", "default"); + } + + @Override public String + toString() { + return super.toString() + "DerivedClass [name=" + this.name + "]"; + } +} diff --git a/commons-compiler-tests/src/test/java/org/codehaus/commons/compiler/tests/issue212/base/IBase.java b/commons-compiler-tests/src/test/java/org/codehaus/commons/compiler/tests/issue212/base/IBase.java new file mode 100644 index 00000000..31d1fb83 --- /dev/null +++ b/commons-compiler-tests/src/test/java/org/codehaus/commons/compiler/tests/issue212/base/IBase.java @@ -0,0 +1,7 @@ + +package org.codehaus.commons.compiler.tests.issue212.base; + +public +interface IBase { + IBase path(); +} diff --git a/commons-compiler-tests/src/test/java/org/codehaus/commons/compiler/tests/issue212/base/MapperClass.java b/commons-compiler-tests/src/test/java/org/codehaus/commons/compiler/tests/issue212/base/MapperClass.java new file mode 100644 index 00000000..127b44fb --- /dev/null +++ b/commons-compiler-tests/src/test/java/org/codehaus/commons/compiler/tests/issue212/base/MapperClass.java @@ -0,0 +1,11 @@ + +package org.codehaus.commons.compiler.tests.issue212.base; + +public +class MapperClass { + + public BaseClass + mapper() { + return new DerivedClass(); + } +} diff --git a/commons-compiler-tests/src/test/java/util/CommonsCompilerTestSuite.java b/commons-compiler-tests/src/test/java/util/CommonsCompilerTestSuite.java index 39e62821..d571088f 100644 --- a/commons-compiler-tests/src/test/java/util/CommonsCompilerTestSuite.java +++ b/commons-compiler-tests/src/test/java/util/CommonsCompilerTestSuite.java @@ -461,7 +461,7 @@ class ClassBodyTest extends CompileAndExecuteTest { /** * Asserts that the given compilationUnit can be cooked by the {@link ISimpleCompiler} and its {@code - * public static boolean }className{@code .main()} method returns TRUE, or issues an error that matches + * public static boolean }className{@code .main()} method returns TRUE, or issues an error that matches * the messageRegex. */ protected void @@ -469,6 +469,15 @@ class ClassBodyTest extends CompileAndExecuteTest { new SimpleCompilerTest(compilationUnit, className).assertResultTrue(messageRegex); } + /** + * Asserts that the given compilationUnit can be cooked by the {@link ISimpleCompiler}, and its {@code + * public static any-type }className{@code .main()} method returns a value that equals expected. + */ + protected void + assertCompilationUnitMainEquals(Object expected, String compilationUnit, String className) throws Exception { + new SimpleCompilerTest(compilationUnit, className).assertResultEquals(expected); + } + public class SimpleCompilerTest extends CompileAndExecuteTest { @@ -732,6 +741,16 @@ class CompileAndExecuteTest { Assert.assertTrue("Test result is FALSE", (Boolean) result); } + /** + * Asserts that cooking completes normally and executing returns a value that equals expected. + */ + public void + assertResultEquals(@Nullable Object expected) throws Exception { + this.cook(); + Object result = this.execute(); + Assert.assertEquals(expected, result); + } + /** * Asserts that cooking completes normally and executing returns {@code null}. */