diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-07-07 19:36:00 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-07-07 19:36:00 +0100 |
| commit | 9bc1704339c846de19f68543b05901ee18d1befc (patch) | |
| tree | 08d609a10e972bc2a9765973bf945dcc22c0e389 /src/test/java/org | |
| parent | 2536899969733a81a0001eb2da0d1d478c092e4b (diff) | |
Reorder Java writer body to match AST declarations
Diffstat (limited to 'src/test/java/org')
| -rw-r--r-- | src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java | 444 |
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()); } |
