From d19c25d5d58944d03011a99ff2dbeaaa29e416d2 Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Thu, 14 Nov 2024 02:23:01 +0100 Subject: Add re-encode tests --- .../test/java/moe/nea/jcp/gson/test/TestBasic.java | 7 +++-- src/main/java/moe/nea/pcj/Result.java | 30 ++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 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 c0e42b6..c525303 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 @@ -6,6 +6,7 @@ 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.Codec; import moe.nea.pcj.Decode; import moe.nea.pcj.Result; import moe.nea.pcj.json.JsonLikeError; @@ -37,8 +38,10 @@ public class TestBasic { Assertions.assertEquals(expected, result.valueOrPartial().get()); } - Result decode(Decode, JsonLikeError> decode, JsonElement element) { - return Result.cast(decode.decode(element, GsonOperations.INSTANCE)); + Result decode(Codec, JsonLikeError, JsonLikeError> decode, JsonElement element) { + Result result = Result.cast(decode.decode(element, GsonOperations.INSTANCE)); + result.value().ifPresent(decoded -> Assertions.assertEquals(Result.ok(element), decode.encode(decoded, GsonOperations.INSTANCE))); + return result; } GsonCodecs codecs = GsonCodecs.INSTANCE; diff --git a/src/main/java/moe/nea/pcj/Result.java b/src/main/java/moe/nea/pcj/Result.java index e43633b..22c94f9 100644 --- a/src/main/java/moe/nea/pcj/Result.java +++ b/src/main/java/moe/nea/pcj/Result.java @@ -5,6 +5,7 @@ import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.function.Function; @@ -40,6 +41,7 @@ public sealed interface Result permits Result.Ok, Result.Fail { record Ok(Good okValue) implements Result { @Override public Result appendErrors(List errors) { + if (errors.isEmpty()) return new Ok<>(okValue); return new Fail<>(okValue, errors); } @@ -67,6 +69,20 @@ public sealed interface Result permits Result.Ok, Result.Fail { public Optional value() { return Optional.of(okValue); } + + @Override + public int hashCode() { + return Objects.hash(okValue); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) return true; + if (obj instanceof Result.Ok ok) { + return Objects.equals(ok.okValue, this.okValue); + } + return false; + } } record Fail(@Nullable Good partialValue, List badValue) implements Result { @@ -75,6 +91,20 @@ public sealed interface Result permits Result.Ok, Result.Fail { throw new IllegalArgumentException("Cannot create failure without any error values"); } + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj instanceof Result.Fail fail) { + return Objects.equals(partialValue, fail.partialValue) && badValue.equals(fail.badValue); + } + return false; + } + + @Override + public int hashCode() { + return Objects.hash(partialValue, badValue); + } + @Override public Optional value() { return Optional.empty(); -- cgit