summaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'src/test')
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java444
1 files changed, 257 insertions, 187 deletions
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java
index ecdcaff..5464116 100644
--- a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java
@@ -14,6 +14,8 @@ import static org.zwobble.precisely.AssertThat.assertThat;
import static org.zwobble.precisely.Matchers.equalTo;
public class JavaWriterTests {
+ // == Compilation units ==
+
@Test
public void compilationUnit() throws IOException {
var java = new JavaCompilationUnit(
@@ -43,6 +45,10 @@ public class JavaWriterTests {
));
}
+ // == Type declarations ==
+
+ // === Class declarations ===
+
@Test
public void emptyClassDeclaration() throws IOException {
var java = new JavaClassDeclaration(
@@ -168,6 +174,8 @@ public class JavaWriterTests {
));
}
+ // === Enum declarations ===
+
@Test
public void emptyEnumDeclaration() throws IOException {
var java = JavaEnumDeclaration.arbitrary()
@@ -227,6 +235,8 @@ public class JavaWriterTests {
));
}
+ // === Interface declarations ===
+
@Test
public void openInterfaceDeclaration() throws IOException {
var java = new JavaInterfaceDeclaration(
@@ -352,6 +362,8 @@ public class JavaWriterTests {
));
}
+ // === Record declarations ===
+
@Test
public void emptyRecordDeclaration() throws IOException {
var java = new JavaRecordDeclaration(
@@ -479,6 +491,118 @@ public class JavaWriterTests {
));
}
+ // == Type declaration bodies ==
+
+ // === Constructor declarations ===
+
+ @Test
+ public void emptyConstructor() throws IOException {
+ var java = new JavaConstructorDeclaration(
+ JavaIdentifier.of("Rectangle"),
+ JavaVisibility.PUBLIC,
+ List.of(),
+ JavaBlock.EMPTY
+ );
+
+ var string = write(writer -> writer.writeClassBodyDeclaration(java));
+
+ assertThat(string, equalTo("""
+ public Rectangle() {
+ }"""
+ ));
+ }
+
+ @Test
+ public void publicConstructor() throws IOException {
+ var java = new JavaConstructorDeclaration(
+ JavaIdentifier.of("Rectangle"),
+ JavaVisibility.PUBLIC,
+ List.of(),
+ JavaBlock.EMPTY
+ );
+
+ var string = write(writer -> writer.writeClassBodyDeclaration(java));
+
+ assertThat(string, equalTo("""
+ public Rectangle() {
+ }"""
+ ));
+ }
+
+ @Test
+ public void privateConstructor() throws IOException {
+ var java = new JavaConstructorDeclaration(
+ JavaIdentifier.of("Rectangle"),
+ JavaVisibility.PRIVATE,
+ List.of(),
+ JavaBlock.EMPTY
+ );
+
+ var string = write(writer -> writer.writeClassBodyDeclaration(java));
+
+ assertThat(string, equalTo("""
+ private Rectangle() {
+ }"""
+ ));
+ }
+
+ @Test
+ public void constructorWithParams() throws IOException {
+ var java = new JavaConstructorDeclaration(
+ JavaIdentifier.of("Rectangle"),
+ JavaVisibility.PUBLIC,
+ List.of(
+ new JavaParam(JavaTypeRef.INT, JavaIdentifier.of("b")),
+ new JavaParam(JavaTypeRef.LONG, JavaIdentifier.of("c"))
+ ),
+ JavaBlock.EMPTY
+ );
+
+ var string = write(writer -> writer.writeClassBodyDeclaration(java));
+
+ assertThat(string, equalTo("""
+ public Rectangle(int b, long c) {
+ }"""
+ ));
+ }
+
+ @Test
+ public void constructorWithBody() throws IOException {
+ var java = new JavaConstructorDeclaration(
+ JavaIdentifier.of("Rectangle"),
+ JavaVisibility.PUBLIC,
+ List.of(),
+ new JavaBlock(List.of(
+ new JavaReturn(new JavaIntegerLiteral(42))
+ ))
+ );
+
+ var string = write(writer -> writer.writeClassBodyDeclaration(java));
+
+ assertThat(string, equalTo("""
+ public Rectangle() {
+ return 42;
+ }"""
+ ));
+ }
+
+ // === Field declarations ===
+
+ @Test
+ public void fieldDeclaration() throws IOException {
+ var java = new JavaFieldDeclaration(
+ JavaVisibility.PRIVATE,
+ JavaTypeRef.INT,
+ JavaIdentifier.of("count")
+ );
+
+ var string = write(writer -> writer.writeClassBodyDeclaration(java));
+
+ assertThat(string, equalTo("private final int count;"));
+ }
+
+ // === Method declarations ===
+
@Test
public void emptyMethodWithoutBody() throws IOException {
var java = JavaMethodDeclaration.arbitrary()
@@ -633,109 +757,72 @@ public class JavaWriterTests {
));
}
- @Test
- public void emptyConstructor() throws IOException {
- var java = new JavaConstructorDeclaration(
- JavaIdentifier.of("Rectangle"),
- JavaVisibility.PUBLIC,
- List.of(),
- JavaBlock.EMPTY
- );
-
- var string = write(writer -> writer.writeClassBodyDeclaration(java));
+ // == Methods ==
- assertThat(string, equalTo("""
- public Rectangle() {
- }"""
- ));
- }
+ // == Type references ==
@Test
- public void publicConstructor() throws IOException {
- var java = new JavaConstructorDeclaration(
- JavaIdentifier.of("Rectangle"),
- JavaVisibility.PUBLIC,
- List.of(),
- JavaBlock.EMPTY
+ public void typeRefWithoutArgsHasNoAngleBrackets() throws IOException {
+ var java = JavaTypeRef.topLevel(
+ JavaPackageName.of("abc", "def"),
+ JavaIdentifier.of("One")
);
- var string = write(writer -> writer.writeClassBodyDeclaration(java));
+ var string = write(writer -> writer.writeTypeRef(java));
- assertThat(string, equalTo("""
- public Rectangle() {
- }"""
- ));
+ assertThat(string, equalTo("abc.def.One"));
}
@Test
- public void privateConstructor() throws IOException {
- var java = new JavaConstructorDeclaration(
- JavaIdentifier.of("Rectangle"),
- JavaVisibility.PRIVATE,
- List.of(),
- JavaBlock.EMPTY
+ public void typeRefWithArgsHasAngleBrackets() throws IOException {
+ var java = JavaTypeRef.topLevelGeneric(
+ JavaPackageName.of("abc", "def"),
+ JavaIdentifier.of("One"),
+ List.of(
+ JavaTypeArg.invariant(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Two"))),
+ JavaTypeArg.invariant(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Three")))
+ )
);
- var string = write(writer -> writer.writeClassBodyDeclaration(java));
+ var string = write(writer -> writer.writeTypeRef(java));
- assertThat(string, equalTo("""
- private Rectangle() {
- }"""
- ));
+ assertThat(string, equalTo("abc.def.One<Two, Three>"));
}
@Test
- public void constructorWithParams() throws IOException {
- var java = new JavaConstructorDeclaration(
- JavaIdentifier.of("Rectangle"),
- JavaVisibility.PUBLIC,
+ public void typeRefArgCanBeSuper() throws IOException {
+ var java = JavaTypeRef.topLevelGeneric(
+ JavaPackageName.of("abc", "def"),
+ JavaIdentifier.of("One"),
List.of(
- new JavaParam(JavaTypeRef.INT, JavaIdentifier.of("b")),
- new JavaParam(JavaTypeRef.LONG, JavaIdentifier.of("c"))
- ),
- JavaBlock.EMPTY
+ JavaTypeArg.superType(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Two"))),
+ JavaTypeArg.superType(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Three")))
+ )
);
- var string = write(writer -> writer.writeClassBodyDeclaration(java));
+ var string = write(writer -> writer.writeTypeRef(java));
- assertThat(string, equalTo("""
- public Rectangle(int b, long c) {
- }"""
- ));
+ assertThat(string, equalTo("abc.def.One<? super Two, ? super Three>"));
}
@Test
- public void constructorWithBody() throws IOException {
- var java = new JavaConstructorDeclaration(
- JavaIdentifier.of("Rectangle"),
- JavaVisibility.PUBLIC,
- List.of(),
- new JavaBlock(List.of(
- new JavaReturn(new JavaIntegerLiteral(42))
- ))
+ public void typeRefInnerTypeNameIsSeparatedByDot() throws IOException {
+ var java = JavaTypeRef.inner(
+ JavaPackageName.of("abc", "def"),
+ JavaIdentifier.of("One"),
+ JavaIdentifier.of("Two")
);
- var string = write(writer -> writer.writeClassBodyDeclaration(java));
+ var string = write(writer -> writer.writeTypeRef(java));
- assertThat(string, equalTo("""
- public Rectangle() {
- return 42;
- }"""
- ));
+ assertThat(string, equalTo("abc.def.One.Two"));
}
- @Test
- public void fieldDeclaration() throws IOException {
- var java = new JavaFieldDeclaration(
- JavaVisibility.PRIVATE,
- JavaTypeRef.INT,
- JavaIdentifier.of("count")
- );
+ // == Visibility ==
- var string = write(writer -> writer.writeClassBodyDeclaration(java));
+ // == Statements ==
- assertThat(string, equalTo("private final int count;"));
- }
+ // === Blocks ===
@Test
public void block() throws IOException {
@@ -749,6 +836,8 @@ public class JavaWriterTests {
assertThat(string, equalTo("return 42;\nreturn 47;"));
}
+ // === Expression statements ===
+
@Test
public void expressionStatement() throws IOException {
var java = new JavaExpressionStatement(new JavaIntegerLiteral(42));
@@ -758,6 +847,8 @@ public class JavaWriterTests {
assertThat(string, equalTo("42;"));
}
+ // === Local variable declarations ===
+
@Test
public void localVariableDeclarationUsingExplicitType() throws IOException {
var java = JavaLocalVariableDeclaration.arbitrary()
@@ -783,6 +874,8 @@ public class JavaWriterTests {
assertThat(string, equalTo("var count = 42;"));
}
+ // === Returns ===
+
@Test
public void returnStatement() throws IOException {
var java = new JavaReturn(new JavaIntegerLiteral(42));
@@ -792,59 +885,9 @@ public class JavaWriterTests {
assertThat(string, equalTo("return 42;"));
}
- @Test
- public void falseLiteral() throws IOException {
- var java = new JavaBooleanLiteral(false);
-
- var string = write(writer -> writer.writeTopLevelExpression(java));
-
- assertThat(string, equalTo("false"));
- }
-
- @Test
- public void trueLiteral() throws IOException {
- var java = new JavaBooleanLiteral(true);
-
- var string = write(writer -> writer.writeTopLevelExpression(java));
-
- assertThat(string, equalTo("true"));
- }
-
- @Test
- public void cast() throws IOException {
- var java = new JavaCast(JavaTypeRef.INT, new JavaIntegerLiteral(42));
-
- var string = write(writer -> writer.writeTopLevelExpression(java));
-
- assertThat(string, equalTo("(int) 42"));
- }
-
- @Test
- public void integerLiteral() throws IOException {
- var java = new JavaIntegerLiteral(42);
-
- var string = write(writer -> writer.writeTopLevelExpression(java));
-
- assertThat(string, equalTo("42"));
- }
-
- @Test
- public void nullLiteral() throws IOException {
- var java = new JavaNullLiteral();
-
- var string = write(writer -> writer.writeTopLevelExpression(java));
-
- assertThat(string, equalTo("null"));
- }
-
- @Test
- public void stringLiteral() throws IOException {
- var java = new JavaStringLiteral("hello");
-
- var string = write(writer -> writer.writeTopLevelExpression(java));
+ // == Expressions ==
- assertThat(string, equalTo("\"hello\""));
- }
+ // === Binary operations ===
@Test
public void binaryOperationAssignment() throws IOException {
@@ -937,6 +980,39 @@ public class JavaWriterTests {
assertThat(string, equalTo("x | y"));
}
+ // === Boolean literals ===
+
+ @Test
+ public void falseLiteral() throws IOException {
+ var java = new JavaBooleanLiteral(false);
+
+ var string = write(writer -> writer.writeTopLevelExpression(java));
+
+ assertThat(string, equalTo("false"));
+ }
+
+ @Test
+ public void trueLiteral() throws IOException {
+ var java = new JavaBooleanLiteral(true);
+
+ var string = write(writer -> writer.writeTopLevelExpression(java));
+
+ assertThat(string, equalTo("true"));
+ }
+
+ // === Casts ===
+
+ @Test
+ public void cast() throws IOException {
+ var java = new JavaCast(JavaTypeRef.INT, new JavaIntegerLiteral(42));
+
+ var string = write(writer -> writer.writeTopLevelExpression(java));
+
+ assertThat(string, equalTo("(int) 42"));
+ }
+
+ // === Field accesses ===
+
@Test
public void fieldAccess() throws IOException {
var java = new JavaFieldAccess(
@@ -949,18 +1025,19 @@ public class JavaWriterTests {
assertThat(string, equalTo("one.two"));
}
+ // === Integer literals ===
+
@Test
- public void staticFieldAccess() throws IOException {
- var java = new JavaStaticFieldAccess(
- JavaTypeRef.topLevel(JavaPackageName.of("one"), JavaIdentifier.of("Two")),
- JavaIdentifier.of("three")
- );
+ public void integerLiteral() throws IOException {
+ var java = new JavaIntegerLiteral(42);
var string = write(writer -> writer.writeTopLevelExpression(java));
- assertThat(string, equalTo("one.Two.three"));
+ assertThat(string, equalTo("42"));
}
+ // === Method refs ===
+
@Test
public void referenceToMethodOnType() throws IOException {
var java = new JavaMethodRef(
@@ -973,6 +1050,8 @@ public class JavaWriterTests {
assertThat(string, equalTo("one.Two::three"));
}
+ // === New expressions ===
+
@Test
public void newExpression() throws IOException {
var java = new JavaNewExpression(
@@ -985,6 +1064,19 @@ public class JavaWriterTests {
assertThat(string, equalTo("new one.Two(1, 2)"));
}
+ // === Null literals ===
+
+ @Test
+ public void nullLiteral() throws IOException {
+ var java = new JavaNullLiteral();
+
+ var string = write(writer -> writer.writeTopLevelExpression(java));
+
+ assertThat(string, equalTo("null"));
+ }
+
+ // === Refs ===
+
@Test
public void ref() throws IOException {
var java = new JavaRef(JavaIdentifier.of("x"));
@@ -994,6 +1086,22 @@ public class JavaWriterTests {
assertThat(string, equalTo("x"));
}
+ // === Static field accesses ===
+
+ @Test
+ public void staticFieldAccess() throws IOException {
+ var java = new JavaStaticFieldAccess(
+ JavaTypeRef.topLevel(JavaPackageName.of("one"), JavaIdentifier.of("Two")),
+ JavaIdentifier.of("three")
+ );
+
+ var string = write(writer -> writer.writeTopLevelExpression(java));
+
+ assertThat(string, equalTo("one.Two.three"));
+ }
+
+ // === Ternary conditionals ===
+
@Test
public void ternaryConditional() throws IOException {
var java = new JavaTernaryConditional(
@@ -1007,6 +1115,19 @@ public class JavaWriterTests {
assertThat(string, equalTo("x ? y : z"));
}
+ // === String literals ===
+
+ @Test
+ public void stringLiteral() throws IOException {
+ var java = new JavaStringLiteral("hello");
+
+ var string = write(writer -> writer.writeTopLevelExpression(java));
+
+ assertThat(string, equalTo("\"hello\""));
+ }
+
+ // === Precedence handling ===
+
@Test
public void whenSubExpressionHasLowerPrecedenceThenSubExpressionIsParenthesized() throws IOException {
var java = JavaBinaryOperation.arbitrary()
@@ -1071,62 +1192,9 @@ public class JavaWriterTests {
assertThat(string, equalTo("(a = b) = c = d"));
}
- @Test
- public void typeRefWithoutArgsHasNoAngleBrackets() throws IOException {
- var java = JavaTypeRef.topLevel(
- JavaPackageName.of("abc", "def"),
- JavaIdentifier.of("One")
- );
-
- var string = write(writer -> writer.writeTypeRef(java));
-
- assertThat(string, equalTo("abc.def.One"));
- }
-
- @Test
- public void typeRefWithArgsHasAngleBrackets() throws IOException {
- var java = JavaTypeRef.topLevelGeneric(
- JavaPackageName.of("abc", "def"),
- JavaIdentifier.of("One"),
- List.of(
- JavaTypeArg.invariant(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Two"))),
- JavaTypeArg.invariant(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Three")))
- )
- );
-
- var string = write(writer -> writer.writeTypeRef(java));
+ // == Identifiers ==
- assertThat(string, equalTo("abc.def.One<Two, Three>"));
- }
-
- @Test
- public void typeRefArgCanBeSuper() throws IOException {
- var java = JavaTypeRef.topLevelGeneric(
- JavaPackageName.of("abc", "def"),
- JavaIdentifier.of("One"),
- List.of(
- JavaTypeArg.superType(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Two"))),
- JavaTypeArg.superType(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Three")))
- )
- );
-
- var string = write(writer -> writer.writeTypeRef(java));
-
- assertThat(string, equalTo("abc.def.One<? super Two, ? super Three>"));
- }
-
- @Test
- public void typeRefInnerTypeNameIsSeparatedByDot() throws IOException {
- var java = JavaTypeRef.inner(
- JavaPackageName.of("abc", "def"),
- JavaIdentifier.of("One"),
- JavaIdentifier.of("Two")
- );
-
- var string = write(writer -> writer.writeTypeRef(java));
-
- assertThat(string, equalTo("abc.def.One.Two"));
- }
+ // == Custom areas ==
@Test
public void customAreaContentsArePreserved() throws IOException {
@@ -1158,6 +1226,8 @@ public class JavaWriterTests {
));
}
+ // == Doc comments ==
+
private String write(Write write) throws IOException {
return write(write, Optional.empty());
}