🐛 Fix number suggestions. Again.

This commit is contained in:
Alexander Söderberg 2020-10-14 01:07:56 +02:00
parent 15526c95ed
commit fd0658d320
No known key found for this signature in database
GPG key ID: FACEA5B0F4C1BF80
2 changed files with 47 additions and 21 deletions

View file

@ -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<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) {
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<Long> numbers = new TreeSet<>();
try {
final long inputNum = Long.parseLong(input);
if (inputNum > max) {
return Collections.emptyList();
}
if (inputNum < min) {
return Collections.emptyList();
}
final List<String> 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<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;
} catch (final Exception ignored) {
return Collections.emptyList();

View file

@ -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.<TestCommandSender>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<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 List<String> 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<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 {
FOO,