From fcb762a10e06ae9bb9b23cff0d2745b849ea972a Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Sat, 8 Mar 2025 07:56:42 +0300 Subject: Fix empty validLocations set failing to be decoded (#1197) * Fix empty `validLocations` set failing to be decoded * Remove unnecessary override * Add encode tests --------- Co-authored-by: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> --- .../skyblock/chat/ChatRulesConfigScreen.java | 5 ----- .../java/de/hysky/skyblocker/utils/CodecUtils.java | 6 ++++-- .../java/de/hysky/skyblocker/utils/Location.java | 2 +- .../skyblocker/skyblock/chat/ChatRuleTest.java | 24 ++++++++++++++++++++++ 4 files changed, 29 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigScreen.java index d986f9c7..b4e7334a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigScreen.java @@ -19,11 +19,6 @@ public class ChatRulesConfigScreen extends Screen { this.parent = parent; } - @Override - public void setTooltip(Text tooltip) { - super.setTooltip(tooltip); - } - @Override protected void init() { super.init(); diff --git a/src/main/java/de/hysky/skyblocker/utils/CodecUtils.java b/src/main/java/de/hysky/skyblocker/utils/CodecUtils.java index 5b17dfa4..649f2dc4 100644 --- a/src/main/java/de/hysky/skyblocker/utils/CodecUtils.java +++ b/src/main/java/de/hysky/skyblocker/utils/CodecUtils.java @@ -44,7 +44,9 @@ public final class CodecUtils { * @param The enum type * @return EnumSet codec for the given enum */ - public static > Codec> enumSetCodec(Codec enumCodec) { - return enumCodec.listOf().xmap(EnumSet::copyOf, List::copyOf); + public static > Codec> enumSetCodec(Codec enumCodec, Class enumClass) { + // EnumSet#copyOf finds type from the first element of the list passed to it, so if it's empty the enum type is unknown and an exception is thrown + // So we have to manually handle the case where the list empty + return enumCodec.listOf().xmap(list -> list.isEmpty() ? EnumSet.noneOf(enumClass) : EnumSet.copyOf(list), List::copyOf); } } diff --git a/src/main/java/de/hysky/skyblocker/utils/Location.java b/src/main/java/de/hysky/skyblocker/utils/Location.java index 4c3aa6f4..b43783ab 100644 --- a/src/main/java/de/hysky/skyblocker/utils/Location.java +++ b/src/main/java/de/hysky/skyblocker/utils/Location.java @@ -47,7 +47,7 @@ public enum Location implements StringIdentifiable { UNKNOWN("unknown"); public static final Codec CODEC = StringIdentifiable.createCodec(Location::values); - public static final Codec> SET_CODEC = CodecUtils.enumSetCodec(CODEC); + public static final Codec> SET_CODEC = CodecUtils.enumSetCodec(CODEC, Location.class); /** * location id from Hypixel API diff --git a/src/test/java/de/hysky/skyblocker/skyblock/chat/ChatRuleTest.java b/src/test/java/de/hysky/skyblocker/skyblock/chat/ChatRuleTest.java index 1c5004fc..21831918 100644 --- a/src/test/java/de/hysky/skyblocker/skyblock/chat/ChatRuleTest.java +++ b/src/test/java/de/hysky/skyblocker/skyblock/chat/ChatRuleTest.java @@ -70,4 +70,28 @@ class ChatRuleTest { )).getOrThrow() ); } + + @Test + void codecParseEmptySet() { + Assertions.assertEquals( + EnumSet.noneOf(Location.class), + ChatRule.LOCATION_FIXING_CODEC.parse(JsonOps.INSTANCE, JsonOps.INSTANCE.createList(Stream.empty())).getOrThrow() + ); + } + + @Test + void codecEncode() { + Assertions.assertEquals( + JsonOps.INSTANCE.createList(Stream.empty()), + ChatRule.LOCATION_FIXING_CODEC.encodeStart(JsonOps.INSTANCE, EnumSet.noneOf(Location.class)).getOrThrow() + ); + + Assertions.assertEquals( + JsonOps.INSTANCE.createList(Stream.of(Location.DWARVEN_MINES, Location.WINTER_ISLAND) + .map(Location::asString) + .map(JsonOps.INSTANCE::createString) + ), + ChatRule.LOCATION_FIXING_CODEC.encodeStart(JsonOps.INSTANCE, EnumSet.of(Location.DWARVEN_MINES, Location.WINTER_ISLAND)).getOrThrow() + ); + } } -- cgit