diff options
Diffstat (limited to 'gson/src/test/java/moe/nea')
-rw-r--r-- | gson/src/test/java/moe/nea/jcp/gson/test/TestBasic.java | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/gson/src/test/java/moe/nea/jcp/gson/test/TestBasic.java b/gson/src/test/java/moe/nea/jcp/gson/test/TestBasic.java new file mode 100644 index 0000000..c0e42b6 --- /dev/null +++ b/gson/src/test/java/moe/nea/jcp/gson/test/TestBasic.java @@ -0,0 +1,95 @@ +package moe.nea.jcp.gson.test; + +import com.google.gson.JsonElement; +import com.google.gson.JsonNull; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import moe.nea.jcp.gson.GsonCodecs; +import moe.nea.jcp.gson.GsonOperations; +import moe.nea.pcj.Decode; +import moe.nea.pcj.Result; +import moe.nea.pcj.json.JsonLikeError; +import moe.nea.pcj.json.JsonLikeOperations; +import moe.nea.pcj.json.MissingKey; +import moe.nea.pcj.json.RecordJoiners; +import moe.nea.pcj.json.UnexpectedJsonElement; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.stream.Collectors; + +public class TestBasic { + private <T> void assertFail(Result<T, ?> result, JsonLikeError... expectedError) { + if (result.isOk()) + throw new AssertionError("Expected fail"); + Assertions.assertEquals( + Arrays.stream(expectedError).collect(Collectors.toSet()), + new HashSet<>(result.errors()) + ); + } + + private <T> void assertSuccess(Result<T, ?> result, T expected) { + for (Object error : result.errors()) { + throw new AssertionError(error.toString()); + } + Assertions.assertEquals(expected, result.valueOrPartial().get()); + } + + <T> Result<T, JsonLikeError> decode(Decode<T, JsonElement, JsonLikeOperations<JsonElement>, JsonLikeError> decode, JsonElement element) { + return Result.cast(decode.decode(element, GsonOperations.INSTANCE)); + } + + GsonCodecs codecs = GsonCodecs.INSTANCE; + + @Test + void testString() { + assertSuccess(decode(codecs.STRING, new JsonPrimitive("test")), "test"); + } + + @Test + void testInt() { + assertSuccess(decode(codecs.INTEGER, new JsonPrimitive(1000)), 1000); + assertFail(decode(codecs.INTEGER, new JsonPrimitive("hehehe")), + new UnexpectedJsonElement("number", mkPrim("hehehe"))); + assertFail(decode(codecs.INTEGER, new JsonPrimitive("1")), + new UnexpectedJsonElement("number", mkPrim("1"))); + } + + record TestObject( + String foo, + int bar + ) {} + + static JsonElement mkPrim(Object arg) { + if (arg instanceof JsonElement el) return el; + if (arg instanceof String str) return new JsonPrimitive(str); + if (arg instanceof Number num) return new JsonPrimitive(num); + if (arg == null) return JsonNull.INSTANCE; + if (arg instanceof Boolean b) return new JsonPrimitive(b); + throw new IllegalArgumentException("Cannot convert " + arg + " to json object"); + } + + static JsonObject mkJsonObject(Object... args) { + JsonObject obj = new JsonObject(); + for (int i = 0; i < args.length; i += 2) { + obj.add((String) args[i], mkPrim(args[i + 1])); + } + return obj; + } + + @Test + void testObject() { + var codec = RecordJoiners.join( + codecs.STRING.fieldOf("foo").withGetter(TestObject::foo), + codecs.INTEGER.fieldOf("bar").withGetter(TestObject::bar), + TestObject::new + ); + assertSuccess(decode(codec, mkJsonObject("foo", "fooValue", "bar", -10)), + new TestObject("fooValue", -10)); + assertFail(decode(codec, mkJsonObject("foo", "fooValue")), + new MissingKey("bar")); + } +} + |