🐛 Fix number suggestions. Again.
This commit is contained in:
parent
15526c95ed
commit
fd0658d320
2 changed files with 47 additions and 21 deletions
|
|
@ -35,9 +35,9 @@ import java.util.Collections;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.TreeSet;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import java.util.stream.IntStream;
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public final class IntegerArgument<C> extends CommandArgument<C, Integer> {
|
public final class IntegerArgument<C> extends CommandArgument<C, Integer> {
|
||||||
|
|
@ -190,28 +190,29 @@ public final class IntegerArgument<C> extends CommandArgument<C, Integer> {
|
||||||
}
|
}
|
||||||
|
|
||||||
static @NonNull List<@NonNull String> getSuggestions(final long min, final long max, final @NonNull String input) {
|
static @NonNull List<@NonNull String> getSuggestions(final long min, final long max, final @NonNull String input) {
|
||||||
if (input.isEmpty()) {
|
final Set<Long> numbers = new TreeSet<>();
|
||||||
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());
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
final long inputNum = Long.parseLong(input);
|
final long inputNum = Long.parseLong(input.equals("-") ? "-0" : input.isEmpty() ? "0" : input);
|
||||||
if (inputNum > max) {
|
final long inputNumAbsolute = Math.abs(inputNum);
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
numbers.add(inputNumAbsolute); /* It's a valid number, so we suggest it */
|
||||||
if (inputNum < min) {
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
final List<String> suggestions = new LinkedList<>();
|
|
||||||
suggestions.add(input); /* It's a valid number, so we suggest it */
|
|
||||||
for (int i = 0; i < MAX_SUGGESTIONS_INCREMENT
|
for (int i = 0; i < MAX_SUGGESTIONS_INCREMENT
|
||||||
&& (inputNum * NUMBER_SHIFT_MULTIPLIER) + i <= max; i++) {
|
&& (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<String> 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;
|
return suggestions;
|
||||||
} catch (final Exception ignored) {
|
} catch (final Exception ignored) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,11 @@ public class CommandSuggestionsTest {
|
||||||
.flag(manager.flagBuilder("static")
|
.flag(manager.flagBuilder("static")
|
||||||
.build())
|
.build())
|
||||||
.build());
|
.build());
|
||||||
|
|
||||||
|
manager.command(manager.commandBuilder("numbers").argument(IntegerArgument.of("num")));
|
||||||
|
|
||||||
|
manager.command(manager.commandBuilder("numberswithmin")
|
||||||
|
.argument(IntegerArgument.<TestCommandSender>newBuilder("num").withMin(5).withMax(100)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -124,7 +129,7 @@ public class CommandSuggestionsTest {
|
||||||
Assertions.assertEquals(Arrays.asList("one", "two"), suggestions);
|
Assertions.assertEquals(Arrays.asList("one", "two"), suggestions);
|
||||||
final String input2 = "test comb one ";
|
final String input2 = "test comb one ";
|
||||||
final List<String> suggestions2 = manager.suggest(new TestCommandSender(), input2);
|
final List<String> 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 String input3 = "test comb one 9";
|
||||||
final List<String> suggestions3 = manager.suggest(new TestCommandSender(), input3);
|
final List<String> suggestions3 = manager.suggest(new TestCommandSender(), input3);
|
||||||
Assertions.assertEquals(Arrays.asList("9", "90", "91", "92", "93", "94", "95"), suggestions3);
|
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);
|
Assertions.assertEquals(Collections.singletonList("--static"), suggestions3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testNumbers() {
|
||||||
|
final String input = "numbers ";
|
||||||
|
final List<String> 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<String> 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<String> 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<String> 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<String> suggestions5 = manager.suggest(new TestCommandSender(), input5);
|
||||||
|
Assertions.assertEquals(Arrays.asList("5", "6", "7", "8", "9"), suggestions5);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public enum TestEnum {
|
public enum TestEnum {
|
||||||
FOO,
|
FOO,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue