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}.
*/