Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions src/test/java/spoon/test/constructor/ConstructorTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,12 @@
import org.junit.jupiter.api.Test;
import spoon.Launcher;
import spoon.SpoonAPI;
import spoon.reflect.CtModel;
import spoon.reflect.code.CtAssignment;
import spoon.reflect.code.CtConstructorCall;
import spoon.reflect.code.CtIf;
import spoon.reflect.code.CtInvocation;
import spoon.reflect.code.CtStatement;
import spoon.reflect.declaration.CtClass;
import spoon.reflect.declaration.CtConstructor;
import spoon.reflect.declaration.CtParameter;
Expand All @@ -36,6 +41,7 @@
import spoon.reflect.reference.CtIntersectionTypeReference;
import spoon.reflect.reference.CtTypeParameterReference;
import spoon.reflect.reference.CtTypeReference;
import spoon.reflect.visitor.Filter;
import spoon.reflect.visitor.filter.TypeFilter;
import spoon.test.constructor.testclasses.AClass;
import spoon.test.constructor.testclasses.ImplicitConstructor;
Expand All @@ -50,6 +56,7 @@
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
import static spoon.testing.assertions.SpoonAssertions.assertThat;
import static spoon.testing.utils.ModelUtils.canBeBuilt;

public class ConstructorTest {
Expand Down Expand Up @@ -243,4 +250,68 @@ public void test_addFormalCtTypeParameterAt_throwsOutOfBoundsException_whenPosit
assertThrows(IndexOutOfBoundsException.class,
() -> constructor.addFormalCtTypeParameterAt(1, typeParam));
}

@Test
public void testFlexibleConstructorBody() {
// contract: with Java 25 flexible constructor bodies, statements can be inserted before super() or this() in constructors
Launcher launcher = new Launcher();
launcher.getEnvironment().setComplianceLevel(25);
launcher.addInputResource("src/test/resources/constructor/Employee.java");
CtModel model = launcher.buildModel();

CtClass<?> cl = model.getElements(
(Filter<CtClass<?>>) element -> element.getSimpleName().equals("Employee")
).get(0);
assertThat(cl).getConstructors().hasSize(2);

// Test for public Employee(String name, int age, String officeID)
CtConstructor<?> constructor0 = cl.getConstructors().stream()
.filter(c -> c.getParameters().size() == 3)
.iterator().next();
assertThat(constructor0).getBody().getStatements().hasSize(3);
List<CtStatement> statements0 = constructor0.getBody().getStatements();
assertThat(statements0.get(0)).isInstanceOf(CtIf.class);
assertThat(statements0.get(1)).isInstanceOf(CtInvocation.class);
assertTrue(((CtInvocation<?>) statements0.get(1)).getExecutable().isConstructor());
assertThat(statements0.get(2)).isInstanceOf(CtAssignment.class);

assertEquals(
Arrays.asList(
"""
if ((age < 18) || (age > 65)) {
throw new java.lang.IllegalArgumentException();
}""",
"super(name, age)",
"this.officeID = officeID"
),
statements0.stream()
.map(String::valueOf)
.map(s -> s.replaceAll("\\R", "\n")) // fix newlines on windows
.collect(Collectors.toList())
);

// Test for public Employee(int age, String officeID)
CtConstructor<?> constructor1 = cl.getConstructors().stream()
.filter(c -> c.getParameters().size() == 2)
.iterator().next();
assertThat(constructor1).getBody().getStatements().hasSize(2);
List<CtStatement> statements1 = constructor1.getBody().getStatements();
assertThat(statements1.get(0)).isInstanceOf(CtIf.class);
assertThat(statements1.get(1)).isInstanceOf(CtInvocation.class);
assertTrue(((CtInvocation<?>) statements1.get(1)).getExecutable().isConstructor());

assertEquals(
Arrays.asList(
"""
if ((age < 18) || (age > 65)) {
throw new java.lang.IllegalArgumentException();
}""",
"this(\"Bob\", age, officeID)"
),
statements1.stream()
.map(String::valueOf)
.map(s -> s.replaceAll("\\R", "\n")) // fix newlines on windows
.collect(Collectors.toList())
);
}
}
29 changes: 29 additions & 0 deletions src/test/resources/constructor/Employee.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package constructor;

public class Employee extends Person {
private String officeID;

public Employee(String name, int age, String officeID) {
if (age < 18 || age > 65) {
throw new IllegalArgumentException();
}
super(name, age);
this.officeID = officeID;
}

public Employee(int age, String officeID) {
if (age < 18 || age > 65) {
throw new IllegalArgumentException();
}
this("Bob", age, officeID);
}
}

class Person {
private String name;
private int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Loading