From fd0658d32045112db5bc464a3b7c65d775cb3a59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Wed, 14 Oct 2020 01:07:56 +0200 Subject: [PATCH] :bug: Fix number suggestions. Again. --- .../arguments/standard/IntegerArgument.java | 41 ++++++++++--------- .../CommandSuggestionsTest.java | 27 +++++++++++- 2 files changed, 47 insertions(+), 21 deletions(-) diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/IntegerArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/IntegerArgument.java index d7715079..286556eb 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/IntegerArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/IntegerArgument.java @@ -35,9 +35,9 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Queue; +import java.util.Set; +import java.util.TreeSet; import java.util.function.BiFunction; -import java.util.stream.Collectors; -import java.util.stream.IntStream; @SuppressWarnings("unused") public final class IntegerArgument extends CommandArgument { @@ -190,28 +190,29 @@ public final class IntegerArgument extends CommandArgument { } static @NonNull List<@NonNull String> getSuggestions(final long min, final long max, final @NonNull String input) { - if (input.isEmpty()) { - return IntStream.range(0, MAX_SUGGESTIONS_INCREMENT).mapToObj(Integer::toString).collect(Collectors.toList()); - } else if (input.equals("-")) { - return IntStream - .range((MAX_SUGGESTIONS_INCREMENT - 1) * -1, 0) - .mapToObj(Integer::toString) - .collect(Collectors.toList()); - } + final Set numbers = new TreeSet<>(); + try { - final long inputNum = Long.parseLong(input); - if (inputNum > max) { - return Collections.emptyList(); - } - if (inputNum < min) { - return Collections.emptyList(); - } - final List suggestions = new LinkedList<>(); - suggestions.add(input); /* It's a valid number, so we suggest it */ + final long inputNum = Long.parseLong(input.equals("-") ? "-0" : input.isEmpty() ? "0" : input); + final long inputNumAbsolute = Math.abs(inputNum); + + numbers.add(inputNumAbsolute); /* It's a valid number, so we suggest it */ for (int i = 0; i < MAX_SUGGESTIONS_INCREMENT && (inputNum * NUMBER_SHIFT_MULTIPLIER) + i <= max; i++) { - suggestions.add(Long.toString((inputNum * NUMBER_SHIFT_MULTIPLIER) + i)); + numbers.add((inputNumAbsolute * NUMBER_SHIFT_MULTIPLIER) + i); } + + final List suggestions = new LinkedList<>(); + for (long number : numbers) { + if (input.startsWith("-")) { + number = -number; /* Preserve sign */ + } + if (number < min || number > max) { + continue; + } + suggestions.add(String.valueOf(number)); + } + return suggestions; } catch (final Exception ignored) { return Collections.emptyList(); diff --git a/cloud-core/src/test/java/cloud/commandframework/CommandSuggestionsTest.java b/cloud-core/src/test/java/cloud/commandframework/CommandSuggestionsTest.java index 53cdf5ec..c667b554 100644 --- a/cloud-core/src/test/java/cloud/commandframework/CommandSuggestionsTest.java +++ b/cloud-core/src/test/java/cloud/commandframework/CommandSuggestionsTest.java @@ -79,6 +79,11 @@ public class CommandSuggestionsTest { .flag(manager.flagBuilder("static") .build()) .build()); + + manager.command(manager.commandBuilder("numbers").argument(IntegerArgument.of("num"))); + + manager.command(manager.commandBuilder("numberswithmin") + .argument(IntegerArgument.newBuilder("num").withMin(5).withMax(100))); } @Test @@ -124,7 +129,7 @@ public class CommandSuggestionsTest { Assertions.assertEquals(Arrays.asList("one", "two"), suggestions); final String input2 = "test comb one "; final List suggestions2 = manager.suggest(new TestCommandSender(), input2); - Assertions.assertEquals(Arrays.asList("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"), suggestions2); + Assertions.assertEquals(Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9"), suggestions2); final String input3 = "test comb one 9"; final List suggestions3 = manager.suggest(new TestCommandSender(), input3); Assertions.assertEquals(Arrays.asList("9", "90", "91", "92", "93", "94", "95"), suggestions3); @@ -166,6 +171,26 @@ public class CommandSuggestionsTest { Assertions.assertEquals(Collections.singletonList("--static"), suggestions3); } + @Test + void testNumbers() { + final String input = "numbers "; + final List suggestions = manager.suggest(new TestCommandSender(), input); + Assertions.assertEquals(Arrays.asList("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"), suggestions); + final String input2 = "numbers 1"; + final List suggestions2 = manager.suggest(new TestCommandSender(), input2); + Assertions.assertEquals(Arrays.asList("1", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"), suggestions2); + final String input3 = "numbers -"; + final List suggestions3 = manager.suggest(new TestCommandSender(), input3); + Assertions.assertEquals(Arrays.asList("-1", "-2", "-3", "-4", "-5", "-6", "-7", "-8", "-9"), suggestions3); + final String input4 = "numbers -1"; + final List suggestions4 = manager.suggest(new TestCommandSender(), input4); + Assertions.assertEquals(Arrays.asList("-1", "-10", "-11", "-12", "-13", "-14", "-15", "-16", "-17", "-18", "-19"), + suggestions4); + final String input5 = "numberswithmin "; + final List suggestions5 = manager.suggest(new TestCommandSender(), input5); + Assertions.assertEquals(Arrays.asList("5", "6", "7", "8", "9"), suggestions5); + } + public enum TestEnum { FOO,