summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2024-11-14 02:26:29 +0100
committerLinnea Gräf <nea@nea.moe>2024-11-14 02:26:29 +0100
commit05937d237c2fdf793e21b36523d06902c5a0a725 (patch)
tree5dd003d917197e58cbbe8642fec61fd558eb1b56
parentd19c25d5d58944d03011a99ff2dbeaaa29e416d2 (diff)
downloadprofunctor-codecs-java-05937d237c2fdf793e21b36523d06902c5a0a725.tar.gz
profunctor-codecs-java-05937d237c2fdf793e21b36523d06902c5a0a725.tar.bz2
profunctor-codecs-java-05937d237c2fdf793e21b36523d06902c5a0a725.zip
Add duplicate keys test
-rw-r--r--gson/src/test/java/moe/nea/jcp/gson/test/TestBasic.java48
1 files changed, 32 insertions, 16 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
index c525303..58727f2 100644
--- a/gson/src/test/java/moe/nea/jcp/gson/test/TestBasic.java
+++ b/gson/src/test/java/moe/nea/jcp/gson/test/TestBasic.java
@@ -9,6 +9,8 @@ import moe.nea.jcp.gson.GsonOperations;
import moe.nea.pcj.Codec;
import moe.nea.pcj.Decode;
import moe.nea.pcj.Result;
+import moe.nea.pcj.json.AtField;
+import moe.nea.pcj.json.DuplicateJsonKey;
import moe.nea.pcj.json.JsonLikeError;
import moe.nea.pcj.json.JsonLikeOperations;
import moe.nea.pcj.json.MissingKey;
@@ -44,6 +46,23 @@ public class TestBasic {
return result;
}
+ 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;
+ }
+
GsonCodecs codecs = GsonCodecs.INSTANCE;
@Test
@@ -65,22 +84,6 @@ public class TestBasic {
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() {
@@ -93,6 +96,19 @@ public class TestBasic {
new TestObject("fooValue", -10));
assertFail(decode(codec, mkJsonObject("foo", "fooValue")),
new MissingKey("bar"));
+ assertFail(decode(codec, mkJsonObject("foo", "fooValue", "bar", "test")),
+ new AtField("bar", new UnexpectedJsonElement("number", mkPrim("test"))));
+ }
+ @Test
+ void testDuplicateKeys() {
+ var codec = RecordJoiners.join(
+ codecs.STRING.fieldOf("foo").withGetter(TestObject::foo),
+ codecs.INTEGER.fieldOf("foo").withGetter(TestObject::bar),
+ TestObject::new
+ );
+ // TODO: add test for decoding with duplicate keys warning (esp. optional fields)
+ assertFail(codec.encode(new TestObject("", 0), GsonOperations.INSTANCE),
+ new DuplicateJsonKey("foo"));
}
}