summaryrefslogtreecommitdiff
path: root/gson/src/test/java/moe/nea
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2024-11-14 02:14:48 +0100
committerLinnea Gräf <nea@nea.moe>2024-11-14 02:14:48 +0100
commitde24bd3786441914c8071092274ac160cc2c02c3 (patch)
tree9fbf620f23748622be6f29e6d9c2214d95558c2f /gson/src/test/java/moe/nea
parented8eb00566a5e3b7f2d5564d7977a4b3ec8fe5b3 (diff)
downloadprofunctor-codecs-java-de24bd3786441914c8071092274ac160cc2c02c3.tar.gz
profunctor-codecs-java-de24bd3786441914c8071092274ac160cc2c02c3.tar.bz2
profunctor-codecs-java-de24bd3786441914c8071092274ac160cc2c02c3.zip
Add tests
Diffstat (limited to 'gson/src/test/java/moe/nea')
-rw-r--r--gson/src/test/java/moe/nea/jcp/gson/test/TestBasic.java95
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"));
+ }
+}
+