From 7fec263af057f71d5c34ddaf3c7899e0cd9de9f1 Mon Sep 17 00:00:00 2001 From: Siphalor Date: Sun, 3 Aug 2025 20:47:10 +0200 Subject: [PATCH] [serde-hjson] Apply generic JSON read test to Hjson reader --- tweed5-serde-hjson/build.gradle.kts | 2 + .../tweed5/data/hjson/HjsonReader.java | 38 +++++++++++++------ .../tweed5/data/hjson/HjsonReaderTest.java | 11 +++++- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/tweed5-serde-hjson/build.gradle.kts b/tweed5-serde-hjson/build.gradle.kts index ccaea05..2005fc0 100644 --- a/tweed5-serde-hjson/build.gradle.kts +++ b/tweed5-serde-hjson/build.gradle.kts @@ -5,6 +5,8 @@ plugins { dependencies { api(project(":tweed5-serde-api")) + + testImplementation(project(":serde-json-test-utils")) } tasks.shadowJar { diff --git a/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonReader.java b/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonReader.java index 0e8fc44..aad6b77 100644 --- a/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonReader.java +++ b/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonReader.java @@ -75,7 +75,7 @@ public class HjsonReader implements TweedDataReader { if (lexerToken.type() == HjsonLexerToken.Type.BRACE_CLOSE) { contexts.pop(); state = State.AFTER_VALUE; - return TweedDataTokens.getMapEnd(); + return wrapValueLikeTokenContextAppropriate(TweedDataTokens.getMapEnd()); } else if (lexerToken.type() == HjsonLexerToken.Type.LINE_FEED || lexerToken.type() == HjsonLexerToken.Type.COMMA) { state = State.BEFORE_OBJECT_KEY; } else { @@ -90,7 +90,7 @@ public class HjsonReader implements TweedDataReader { if (lexerToken.type() == HjsonLexerToken.Type.BRACE_CLOSE) { contexts.pop(); state = State.AFTER_VALUE; - return TweedDataTokens.getMapEnd(); + return wrapValueLikeTokenContextAppropriate(TweedDataTokens.getMapEnd()); } else if (lexerToken.type() == HjsonLexerToken.Type.QUOTELESS_STRING || lexerToken.type() == HjsonLexerToken.Type.JSON_STRING) { state = State.AFTER_OBJECT_KEY; return TweedDataTokens.asMapEntryKey(createStringToken(lexerToken)); @@ -108,7 +108,7 @@ public class HjsonReader implements TweedDataReader { if (lexerToken.type() == HjsonLexerToken.Type.BRACKET_CLOSE) { contexts.pop(); state = State.AFTER_VALUE; - return TweedDataTokens.getListEnd(); + return wrapValueLikeTokenContextAppropriate(TweedDataTokens.getListEnd()); } else if (lexerToken.type() == HjsonLexerToken.Type.COMMA || lexerToken.type() == HjsonLexerToken.Type.LINE_FEED) { state = State.BEFORE_VALUE; } else { @@ -124,7 +124,7 @@ public class HjsonReader implements TweedDataReader { eatGeneralLexerToken(); contexts.pop(); state = State.AFTER_VALUE; - return TweedDataTokens.getListEnd(); + return wrapValueLikeTokenContextAppropriate(TweedDataTokens.getListEnd()); } return TweedDataTokens.asListValue(nextValueToken()); } @@ -138,27 +138,31 @@ public class HjsonReader implements TweedDataReader { switch (lexerToken.type()) { case NULL: state = State.AFTER_VALUE; - return TweedDataTokens.getNull(); + return wrapValueLikeTokenContextAppropriate(TweedDataTokens.getNull()); case TRUE: case FALSE: state = State.AFTER_VALUE; - return createBooleanToken(lexerToken); + return wrapValueLikeTokenContextAppropriate(createBooleanToken(lexerToken)); case NUMBER: state = State.AFTER_VALUE; - return createNumberToken(lexerToken); + return wrapValueLikeTokenContextAppropriate(createNumberToken(lexerToken)); case QUOTELESS_STRING: case JSON_STRING: case MULTILINE_STRING: state = State.AFTER_VALUE; - return createStringToken(lexerToken); - case BRACKET_OPEN: + return wrapValueLikeTokenContextAppropriate(createStringToken(lexerToken)); + case BRACKET_OPEN: { state = State.BEFORE_VALUE; + TweedDataToken token = wrapValueLikeTokenContextAppropriate(TweedDataTokens.getListStart()); contexts.push(Context.LIST); - return TweedDataTokens.getListStart(); - case BRACE_OPEN: + return token; + } + case BRACE_OPEN: { state = State.BEFORE_OBJECT_KEY; + TweedDataToken token = wrapValueLikeTokenContextAppropriate(TweedDataTokens.getMapStart()); contexts.push(Context.OBJECT); - return TweedDataTokens.getMapStart(); + return token; + } default: throw createIllegalTokenException( lexerToken, @@ -625,6 +629,16 @@ public class HjsonReader implements TweedDataReader { return lexer.nextInnerObjectToken(); } + private TweedDataToken wrapValueLikeTokenContextAppropriate(TweedDataToken token) { + if (currentContext() == Context.LIST) { + return TweedDataTokens.asListValue(token); + } else if (currentContext() == Context.OBJECT) { + return TweedDataTokens.asMapEntryValue(token); + } else { + return token; + } + } + private Context currentContext() { assert contexts.peek() != null; return contexts.peek(); diff --git a/tweed5-serde-hjson/src/test/java/de/siphalor/tweed5/data/hjson/HjsonReaderTest.java b/tweed5-serde-hjson/src/test/java/de/siphalor/tweed5/data/hjson/HjsonReaderTest.java index 89ee821..3f1b18a 100644 --- a/tweed5-serde-hjson/src/test/java/de/siphalor/tweed5/data/hjson/HjsonReaderTest.java +++ b/tweed5-serde-hjson/src/test/java/de/siphalor/tweed5/data/hjson/HjsonReaderTest.java @@ -1,7 +1,9 @@ package de.siphalor.tweed5.data.hjson; import de.siphalor.tweed5.dataapi.api.TweedDataReadException; +import de.siphalor.tweed5.dataapi.api.TweedDataReader; import de.siphalor.tweed5.dataapi.api.TweedDataToken; +import de.siphalor.tweed5.testutils.serde.json.JsonReaderTest; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; @@ -10,9 +12,14 @@ import java.io.StringReader; import static org.junit.jupiter.api.Assertions.*; -class HjsonReaderTest { +class HjsonReaderTest implements JsonReaderTest { private static final double DOUBLE_PRECISION = 0.000000001D; + @Override + public TweedDataReader createJsonReader(String text) { + return new HjsonReader(new HjsonLexer(new StringReader(text))); + } + @ParameterizedTest @CsvSource({ "127,127", @@ -170,4 +177,4 @@ class HjsonReaderTest { private HjsonReader setupReaderWithLexer(String input) { return new HjsonReader(new HjsonLexer(new StringReader(input))); } -} \ No newline at end of file +}