diff --git a/resources/bytecode/javFiles/GenericRecordSwitchCase.jav b/resources/bytecode/javFiles/GenericRecordSwitchCase.jav new file mode 100644 index 00000000..772da5e5 --- /dev/null +++ b/resources/bytecode/javFiles/GenericRecordSwitchCase.jav @@ -0,0 +1,27 @@ +import java.lang.Object; +import java.lang.String; + + + +sealed interface List permits LinkedElem {} + + +public record LinkedElem(T a,List l) implements List{} //Implementiert List und wird auch permittet +public record Elem(T c) implements List{} //Implementiert List, wird aber nicht permittet + +public class SwitchCaseHeritageDetection { + public main(o) { + return switch(o) { + case LinkedElem(a, Elem(e)) -> a ; + case LinkedElem(a, LinkedElem(e, Elem(f))) -> e; + default -> null; + }; + } +} + + + + + + + diff --git a/src/test/java/TestComplete.java b/src/test/java/TestComplete.java index 5b1dce9b..9a2d5cb5 100644 --- a/src/test/java/TestComplete.java +++ b/src/test/java/TestComplete.java @@ -749,7 +749,6 @@ public class TestComplete { assertEquals(swtch.invoke(instance, r1), "Second Element is a Text"); assertEquals(swtch.invoke(instance, r2), "Second Element is a Number"); } - @Ignore("Not implemented") @Test public void testSwitchListRecord() throws Exception { var classFiles = generateClassFiles(new ByteArrayClassLoader(), "SwitchRecordList.jav"); @@ -765,7 +764,7 @@ public class TestComplete { var constructorLinkedElem = linkedElem.getDeclaredConstructor(Integer.class, listInterface); - var constructorElem = elem.getConstructor(Integer.class); + var constructorElem = elem.getDeclaredConstructor(Integer.class); @@ -776,6 +775,33 @@ public class TestComplete { assertEquals(swtch.invoke(instance, listWithOneElement), 10); } + @Test + public void testGenericRecordSwitchCase() throws Exception { + var classFiles = generateClassFiles(new ByteArrayClassLoader(), "GenericRecordSwitchCase.jav"); + + var clazz = classFiles.get("SwitchCaseHeritageDetection"); + + var instance = clazz.getDeclaredConstructor().newInstance(); + var swtch = clazz.getDeclaredMethod("main", Object.class); + + var linkedElem = classFiles.get("LinkedElem"); + var listInterface = classFiles.get("List"); + var elem = classFiles.get("Elem"); + + + var constructorLinkedElem = linkedElem.getDeclaredConstructor(Object.class, listInterface); + var constructorElem = elem.getConstructor(Object.class); + + + + var listWithMoreThanOneElement = constructorLinkedElem.newInstance(5, constructorLinkedElem.newInstance(1, constructorElem.newInstance(5))); + assertEquals(swtch.invoke(instance, listWithMoreThanOneElement), 1); + + var listWithOneElement = constructorLinkedElem.newInstance(5, constructorElem.newInstance(5)); + assertEquals(swtch.invoke(instance, listWithOneElement), 5); + } + + @Ignore("Not implemented") @Test public void testSwitch2() throws Exception {