diff --git a/src/test/java/net/minestom/server/command/ArgumentParserTest.java b/src/test/java/net/minestom/server/command/ArgumentParserTest.java index d5da82040..f57cbf43c 100644 --- a/src/test/java/net/minestom/server/command/ArgumentParserTest.java +++ b/src/test/java/net/minestom/server/command/ArgumentParserTest.java @@ -8,11 +8,13 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertArrayEquals; +/** + * Test string version of arguments. + */ public class ArgumentParserTest { @Test public void testArgumentParser() { - // Test each argument assertParserEquals("Literal", ArgumentType.Literal("example")); assertParserEquals("Boolean", ArgumentType.Boolean("example")); @@ -54,5 +56,4 @@ public class ArgumentParserTest { private static void assertParserEquals(@NotNull String input, @NotNull Argument @NotNull ... args) { assertArrayEquals(ArgumentParser.generate(input), args); } - } diff --git a/src/test/java/net/minestom/server/command/ArgumentTest.java b/src/test/java/net/minestom/server/command/ArgumentTest.java index 93cacde1f..6aa58875c 100644 --- a/src/test/java/net/minestom/server/command/ArgumentTest.java +++ b/src/test/java/net/minestom/server/command/ArgumentTest.java @@ -24,7 +24,8 @@ public class ArgumentTest { var arg = ArgumentType.String("id"); assertFalse(arg.hasErrorCallback()); - arg.setCallback((sender, exception) -> {}); + arg.setCallback((sender, exception) -> { + }); assertTrue(arg.hasErrorCallback()); } @@ -52,5 +53,4 @@ public class ArgumentTest { assertEquals(suggestion.getEntries(), List.of(new SuggestionEntry("entry"))); } - } \ No newline at end of file diff --git a/src/test/java/net/minestom/server/command/ArgumentTypeTest.java b/src/test/java/net/minestom/server/command/ArgumentTypeTest.java index 7e5d2f009..53dd4f530 100644 --- a/src/test/java/net/minestom/server/command/ArgumentTypeTest.java +++ b/src/test/java/net/minestom/server/command/ArgumentTypeTest.java @@ -5,8 +5,7 @@ import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.Style; import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; -import net.minestom.server.command.builder.CommandContext; +import net.minestom.server.command.builder.arguments.Argument; import net.minestom.server.command.builder.arguments.ArgumentEnum; import net.minestom.server.command.builder.arguments.ArgumentType; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; @@ -37,91 +36,65 @@ public class ArgumentTypeTest { @Test public void testArgumentEnchantment() { var arg = ArgumentType.Enchantment("enchantment"); - - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("minecraft:invalid_enchantment")); - assertNotEquals(Enchantment.RESPIRATION, arg.parse(Enchantment.SWEEPING.namespace().asString())); - assertEquals(Enchantment.MENDING, arg.parse(Enchantment.MENDING.namespace().asString())); - - assertEquals("Enchantment", arg.toString()); + assertInvalidArg(arg, "minecraft:invalid_enchantment"); + assertArg(arg, Enchantment.SWEEPING, Enchantment.SWEEPING.name()); + assertArg(arg, Enchantment.MENDING, Enchantment.MENDING.name()); } @Test public void testArgumentEntityType() { var arg = ArgumentType.EntityType("entity_type"); - - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("minecraft:invalid_entity_type")); - assertNotEquals(EntityType.ARMOR_STAND, arg.parse(EntityType.HUSK.namespace().asString())); - assertEquals(EntityType.PLAYER, arg.parse(EntityType.PLAYER.namespace().asString())); - - - assertEquals("EntityType", arg.toString()); + assertInvalidArg(arg, "minecraft:invalid_entity_type"); + assertArg(arg, EntityType.ARMOR_STAND, EntityType.ARMOR_STAND.name()); + assertArg(arg, EntityType.PLAYER, EntityType.PLAYER.name()); } @Test public void testArgumentParticle() { var arg = ArgumentType.Particle("particle"); - - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("minecraft:invalid_particle")); - assertNotEquals(Particle.BLOCK, arg.parse(Particle.CAMPFIRE_SIGNAL_SMOKE.namespace().asString())); - assertEquals(Particle.TOTEM_OF_UNDYING, arg.parse(Particle.TOTEM_OF_UNDYING.namespace().asString())); - - assertEquals("Particle", arg.toString()); + assertInvalidArg(arg, "minecraft:invalid_particle"); + assertArg(arg, Particle.BLOCK, Particle.BLOCK.name()); + assertArg(arg, Particle.TOTEM_OF_UNDYING, Particle.TOTEM_OF_UNDYING.name()); } @Test public void testArgumentPotionEffect() { var arg = ArgumentType.Potion("potion"); - - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("minecraft:invalid_potion")); - assertNotEquals(PotionEffect.SPEED, arg.parse(PotionEffect.JUMP_BOOST.namespace().asString())); - assertEquals(PotionEffect.INSTANT_DAMAGE, arg.parse(PotionEffect.INSTANT_DAMAGE.namespace().asString())); - - assertEquals("Potion", arg.toString()); + assertInvalidArg(arg, "minecraft:invalid_potion"); + assertArg(arg, PotionEffect.JUMP_BOOST, PotionEffect.JUMP_BOOST.name()); + assertArg(arg, PotionEffect.INSTANT_DAMAGE, PotionEffect.INSTANT_DAMAGE.name()); } @Test public void testArgumentBlockState() { var arg = ArgumentType.BlockState("block_state"); + assertInvalidArg(arg, "minecraft:invalid_block[invalid_property=invalid_key]"); + assertInvalidArg(arg, "minecraft:stone[invalid_property=invalid_key]"); + assertInvalidArg(arg, "minecraft:kelp[age=invalid_key]"); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("minecraft:invalid_block[invalid_property=invalid_key]")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("minecraft:stone[invalid_property=invalid_key]")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("minecraft:kelp[age=invalid_key]")); - assertEquals(Block.COBBLESTONE, arg.parse("minecraft:cobblestone")); - assertEquals(Block.KELP.withProperty("age", "14"), arg.parse("minecraft:kelp[age=14]")); - assertNotEquals(Block.KELP.withProperty("age", "15"), arg.parse("minecraft:kelp[age=14]")); - assertNotEquals(Block.ATTACHED_MELON_STEM, arg.parse("minecraft:cobblestone")); - - assertEquals("BlockState", arg.toString()); + assertArg(arg, Block.COBBLESTONE, "minecraft:cobblestone"); + assertArg(arg, Block.KELP.withProperty("age", "14"), "minecraft:kelp[age=14]"); } @Test public void testArgumentColor() { var arg = ArgumentType.Color("color"); - - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("invalid_color")); - assertNotEquals(Style.style(NamedTextColor.AQUA), arg.parse("blue")); - assertEquals(Style.style(NamedTextColor.DARK_PURPLE), arg.parse("dark_purple")); - assertEquals(Style.empty(), arg.parse("reset")); - - assertEquals("Color", arg.toString()); + assertInvalidArg(arg, "invalid_color"); + assertArg(arg, Style.style(NamedTextColor.DARK_PURPLE), "dark_purple"); + assertArg(arg, Style.empty(), "reset"); } @Test public void testArgumentComponent() { var arg = ArgumentType.Component("component"); - var component1 = Component.text("Example text", NamedTextColor.DARK_AQUA); var component2 = Component.text("Other example text", Style.style(TextDecoration.OBFUSCATED)); - var json1 = GsonComponentSerializer.gson().serialize(component1); var json2 = GsonComponentSerializer.gson().serialize(component2); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("invalid component")); - assertNotEquals(component1, arg.parse(json2)); - assertEquals(component1, arg.parse(json1)); - assertEquals("Other example text", PlainTextComponentSerializer.plainText().serialize(arg.parse(json2))); - - assertEquals("Component", arg.toString()); + assertInvalidArg(arg, "invalid component"); + assertArg(arg, component1, json1); + assertArg(arg, component2, json2); } @Test @@ -130,329 +103,277 @@ public class ArgumentTypeTest { assertDoesNotThrow(() -> arg.parse("@a")); assertDoesNotThrow(() -> arg.parse("@p")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("@x")); + assertInvalidArg(arg, "@x"); assertDoesNotThrow(() -> arg.parse("@e[type=sheep]")); assertDoesNotThrow(() -> arg.parse("@e[type=!cow]")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("@e[type=invalid_entity]")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("@e[type=!invalid_entity_two]")); + assertInvalidArg(arg, "@e[type=invalid_entity]"); + assertInvalidArg(arg, "@e[type=!invalid_entity_two]"); assertDoesNotThrow(() -> arg.parse("@e[gamemode=creative]")); assertDoesNotThrow(() -> arg.parse("@e[gamemode=!survival]")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("@e[gamemode=invalid_gamemode]")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("@e[gamemode=!invalid_gamemode_2]")); + assertInvalidArg(arg, "@e[gamemode=invalid_gamemode]"); + assertInvalidArg(arg, "@e[gamemode=!invalid_gamemode_2]"); assertDoesNotThrow(() -> arg.parse("@e[limit=500]")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("@e[limit=-500]")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("@e[limit=invalid_integer]")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("@e[limit=2147483648]")); + assertInvalidArg(arg, "@e[limit=-500]"); + assertInvalidArg(arg, "@e[limit=invalid_integer]"); + assertInvalidArg(arg, "@e[limit=2147483648]"); assertDoesNotThrow(() -> arg.parse("@e[sort=nearest]")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("@e[sort=invalid_sort]")); + assertInvalidArg(arg, "@e[sort=invalid_sort]"); assertDoesNotThrow(() -> arg.parse("@e[level=55]")); assertDoesNotThrow(() -> arg.parse("@e[level=100..500]")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("@e[level=20-50]")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("@e[level=2147483648]")); + assertInvalidArg(arg, "@e[level=20-50]"); + assertInvalidArg(arg, "@e[level=2147483648]"); assertDoesNotThrow(() -> arg.parse("@e[distance=500]")); assertDoesNotThrow(() -> arg.parse("@e[distance=50..150]")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("@e[distance=-500-500]")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("@e[distance=2147483648]")); - - assertEquals("Entities", arg.toString()); + assertInvalidArg(arg, "@e[distance=-500-500]"); + assertInvalidArg(arg, "@e[distance=2147483648]"); } @Test public void testArgumentFloatRange() { var arg = ArgumentType.FloatRange("float_range"); - - assertEquals(new FloatRange(0f, 50f), arg.parse("0..50")); - assertEquals(new FloatRange(0f, 0f), arg.parse("0..0")); - assertEquals(new FloatRange(-50f, 0f), arg.parse("-50..0")); - assertEquals(new FloatRange(-Float.MAX_VALUE, 50f), arg.parse("..50")); - assertEquals(new FloatRange(0f, Float.MAX_VALUE), arg.parse("0..")); - assertEquals(new FloatRange(-Float.MAX_VALUE, Float.MAX_VALUE), arg.parse("-3.4028235E38..3.4028235E38")); - assertEquals(new FloatRange(0.5f, 24f), arg.parse("0.5..24")); - assertEquals(new FloatRange(12f, 45.6f), arg.parse("12..45.6")); - - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("..")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("0..50..")); - - assertEquals("FloatRange", arg.toString()); + assertArg(arg, new FloatRange(0f, 50f), "0..50"); + assertArg(arg, new FloatRange(0f, 0f), "0..0"); + assertArg(arg, new FloatRange(-50f, 0f), "-50..0"); + assertArg(arg, new FloatRange(-Float.MAX_VALUE, 50f), "..50"); + assertArg(arg, new FloatRange(0f, Float.MAX_VALUE), "0.."); + assertArg(arg, new FloatRange(-Float.MAX_VALUE, Float.MAX_VALUE), "-3.4028235E38..3.4028235E38"); + assertArg(arg, new FloatRange(0.5f, 24f), "0.5..24"); + assertArg(arg, new FloatRange(12f, 45.6f), "12..45.6"); + assertInvalidArg(arg, ".."); + assertInvalidArg(arg, "0..50.."); } @Test public void testArgumentIntRange() { var arg = ArgumentType.IntRange("int_range"); - assertEquals(new IntRange(0, 50), arg.parse("0..50")); - assertEquals(new IntRange(0, 0), arg.parse("0..0")); - assertEquals(new IntRange(-50, 0), arg.parse("-50..0")); - assertEquals(new IntRange(Integer.MIN_VALUE, 50), arg.parse("..50")); - assertEquals(new IntRange(0, Integer.MAX_VALUE), arg.parse("0..")); - assertEquals(new IntRange(Integer.MIN_VALUE, Integer.MAX_VALUE), arg.parse("-2147483648..2147483647")); + assertArg(arg, new IntRange(0, 50), "0..50"); + assertArg(arg, new IntRange(0, 0), "0..0"); + assertArg(arg, new IntRange(-50, 0), "-50..0"); + assertArg(arg, new IntRange(Integer.MIN_VALUE, 50), "..50"); + assertArg(arg, new IntRange(0, Integer.MAX_VALUE), "0.."); + assertArg(arg, new IntRange(Integer.MIN_VALUE, Integer.MAX_VALUE), "-2147483648..2147483647"); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("..")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("-2147483649..2147483647")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("-2147483648..2147483648")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("0..50..")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("0.5..24")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("12..45.6")); - - assertEquals("IntRange", arg.toString()); + assertInvalidArg(arg, ".."); + assertInvalidArg(arg, "-2147483649..2147483647"); + assertInvalidArg(arg, "-2147483648..2147483648"); + assertInvalidArg(arg, "0..50.."); + assertInvalidArg(arg, "0.5..24"); + assertInvalidArg(arg, "12..45.6"); } @Test public void testArgumentItemStack() { var arg = ArgumentType.ItemStack("item_stack"); - - assertEquals(ItemStack.AIR, arg.parse("air")); - assertEquals(ItemStack.of(Material.GLASS_PANE).withTag(Tag.String("tag"), "value"), arg.parse("glass_pane{tag:value}")); - - assertEquals("ItemStack", arg.toString()); + assertArg(arg, ItemStack.AIR, "air"); + assertArg(arg, ItemStack.of(Material.GLASS_PANE).withTag(Tag.String("tag"), "value"), "glass_pane{tag:value}"); } @Test public void testArgumentNbtCompoundTag() { var arg = ArgumentType.NbtCompound("nbt_compound"); + assertArg(arg, NBT.Compound(mut -> mut.put("long_array", NBT.LongArray(12, 49, 119))), "{\"long_array\":[L;12L,49L,119L]}"); + assertArg(arg, NBT.Compound(mut -> mut.put("nested", NBT.Compound(mut2 -> + mut2.put("complex", NBT.IntArray(124, 999, 33256)) + )) + ), "{\"nested\": {\"complex\": [I;124,999,33256]}}"); - assertEquals(NBT.Compound(mut -> mut.put("long_array", NBT.LongArray(12, 49, 119))), arg.parse("{\"long_array\":[L;12L,49L,119L]}")); - assertEquals(NBT.Compound(mut -> mut.put("nested", NBT.Compound(mut2 -> - mut2.put("complex", NBT.IntArray(124, 999, 33256)) - )) - ), arg.parse("{\"nested\": {\"complex\": [I;124,999,33256]}}")); - - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("string")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("\"string\"")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("44")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("[I;11,49,33]")); - - assertEquals("NbtCompound", arg.toString()); + assertInvalidArg(arg, "string"); + assertInvalidArg(arg, "\"string\""); + assertInvalidArg(arg, "44"); + assertInvalidArg(arg, "[I;11,49,33]"); } @Test public void testArgumentNbtTag() { var arg = ArgumentType.NBT("nbt"); + assertArg(arg, NBT.String("string"), "string"); + assertArg(arg, NBT.String("string"), "\"string\""); + assertArg(arg, NBT.Int(44), "44"); + assertArg(arg, NBT.IntArray(11, 49, 33), "[I;11,49,33]"); + assertArg(arg, NBT.Compound(mut -> mut.put("long_array", NBT.LongArray(12, 49, 119))), "{\"long_array\":[L;12L,49L,119L]}"); - assertEquals(NBT.String("string"), arg.parse("string")); - assertEquals(NBT.String("string"), arg.parse("\"string\"")); - assertEquals(NBT.Int(44), arg.parse("44")); - assertEquals(NBT.IntArray(11, 49, 33), arg.parse("[I;11,49,33]")); - assertEquals(NBT.Compound(mut -> mut.put("long_array", NBT.LongArray(12, 49, 119))), arg.parse("{\"long_array\":[L;12L,49L,119L]}")); - - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("\"unbalanced string")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("dd}")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("{unquoted: string)}")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("{\"array\": [D;123L,5L]}")); - - assertEquals("NBT", arg.toString()); + assertInvalidArg(arg, "\"unbalanced string"); + assertInvalidArg(arg, "dd}"); + assertInvalidArg(arg, "{unquoted: string)}"); + assertInvalidArg(arg, "{\"array\": [D;123L,5L]}"); } @Test public void testArgumentResourceLocation() { var arg = ArgumentType.ResourceLocation("resource_location"); - assertEquals("minecraft:resource_location_example", arg.parse("minecraft:resource_location_example")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("minecraft:invalid resource location")); + assertArg(arg, "minecraft:resource_location_example", arg.parse("minecraft:resource_location_example")); + assertInvalidArg(arg, "minecraft:invalid resource location"); - assertEquals("ResourceLocation", arg.toString()); + assertArg(arg, "ResourceLocation", arg.toString()); } @Test public void testArgumentTime() { var arg = ArgumentType.Time("time"); + assertArg(arg, Duration.of(20, TimeUnit.SERVER_TICK), "20"); + assertArg(arg, Duration.of(40, TimeUnit.SERVER_TICK), "40t"); + assertArg(arg, Duration.of(60, TimeUnit.SECOND), "60s"); + assertArg(arg, Duration.of(80, TimeUnit.DAY), "80d"); - assertEquals(Duration.of(20, TimeUnit.SERVER_TICK), arg.parse("20")); - assertEquals(Duration.of(40, TimeUnit.SERVER_TICK), arg.parse("40t")); - assertEquals(Duration.of(60, TimeUnit.SECOND), arg.parse("60s")); - assertEquals(Duration.of(80, TimeUnit.DAY), arg.parse("80d")); - - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("100x")); - assertThrows(ArgumentSyntaxException.class, () -> arg.parse("2147483648t")); - - assertEquals("Time