Skip to content

Commit 1c124ce

Browse files
authored
GH-499 Fix argument range validation while parsing. (#499)
1 parent 72a8b07 commit 1c124ce

File tree

8 files changed

+99
-11
lines changed

8 files changed

+99
-11
lines changed

buildSrc/src/main/kotlin/Versions.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ object Versions {
66
// Tests
77
const val JUNIT_JUPITER = "5.11.3"
88
const val ASSERTJ = "3.26.3"
9-
const val MOCKITO = "5.14.2"
9+
const val MOCKITO = "4.11.0"
1010
const val AWAITILITY = "4.2.2"
1111

1212
// Bukkit

buildSrc/src/main/kotlin/litecommands-unit-test.gradle.kts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ dependencies {
1111
testImplementation(project(":litecommands-unit"))
1212
testImplementation(kotlin("stdlib-jdk8"))
1313

14-
testImplementation("org.mockito:mockito-core:5.14.2")
15-
testImplementation("org.junit.jupiter:junit-jupiter-api:5.11.3")
16-
testImplementation("org.junit.jupiter:junit-jupiter-params:5.11.3")
17-
testImplementation("org.assertj:assertj-core:3.26.3")
18-
testImplementation("org.awaitility:awaitility:4.2.2")
19-
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.11.3")
14+
testImplementation("org.mockito:mockito-core:${Versions.MOCKITO}")
15+
testImplementation("org.junit.jupiter:junit-jupiter-api:${Versions.JUNIT_JUPITER}")
16+
testImplementation("org.junit.jupiter:junit-jupiter-params:${Versions.JUNIT_JUPITER}")
17+
testImplementation("org.assertj:assertj-core:${Versions.ASSERTJ}")
18+
testImplementation("org.awaitility:awaitility:${Versions.AWAITILITY}")
19+
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${Versions.JUNIT_JUPITER}")
2020
}
2121

2222
tasks.getByName<Test>("test") {

litecommands-bukkit/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
plugins {
22
`litecommands-java`
33
`litecommands-java-8`
4+
`litecommands-unit-test`
45
`litecommands-repositories`
56
`litecommands-publish`
67
}
@@ -11,10 +12,9 @@ dependencies {
1112
compileOnly("org.spigotmc:spigot-api:${Versions.SPIGOT_API}")
1213
compileOnly("org.spigotmc:spigot:${Versions.SPIGOT}")
1314
compileOnly("com.comphenix.protocol:ProtocolLib:${Versions.PROTOCOL_LIB}")
15+
testImplementation("org.spigotmc:spigot-api:${Versions.SPIGOT_API}")
1416
}
1517

16-
val bukkitArtifact: String by extra
17-
1818
litecommandsPublish {
1919
artifactId = "litecommands-bukkit"
2020
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package dev.rollczi.litecommands.bukkit.argument;
2+
3+
import dev.rollczi.litecommands.invocation.Invocation;
4+
import dev.rollczi.litecommands.unit.TestUtil;
5+
import org.bukkit.command.CommandSender;
6+
import org.mockito.Mockito;
7+
8+
public class BukkitTestSpec {
9+
10+
protected static Invocation<CommandSender> invocation(String command, String... args) {
11+
CommandSender sender = Mockito.mock(CommandSender.class);
12+
return TestUtil.invocation(sender, command, args);
13+
}
14+
15+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package dev.rollczi.litecommands.bukkit.argument;
2+
3+
import dev.rollczi.litecommands.argument.Argument;
4+
import dev.rollczi.litecommands.argument.ArgumentKey;
5+
import dev.rollczi.litecommands.argument.parser.ParserRegistryImpl;
6+
import dev.rollczi.litecommands.argument.resolver.optional.OptionalArgumentResolver;
7+
import dev.rollczi.litecommands.input.raw.RawInput;
8+
import dev.rollczi.litecommands.invocation.Invocation;
9+
import dev.rollczi.litecommands.message.MessageRegistry;
10+
import dev.rollczi.litecommands.reflect.type.TypeRange;
11+
import dev.rollczi.litecommands.reflect.type.TypeToken;
12+
import dev.rollczi.litecommands.requirement.RequirementResult;
13+
import java.util.Optional;
14+
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
15+
import org.bukkit.Location;
16+
import org.bukkit.command.CommandSender;
17+
import static org.junit.jupiter.api.Assertions.assertTrue;
18+
import org.junit.jupiter.api.BeforeEach;
19+
import org.junit.jupiter.api.Test;
20+
21+
class LocationArgumentTest extends BukkitTestSpec {
22+
23+
24+
public static final Argument<Optional<Location>> ARGUMENT = Argument.of("location", new TypeToken<Optional<Location>>() {});
25+
private ParserRegistryImpl<CommandSender> parsers = new ParserRegistryImpl<>();
26+
27+
@BeforeEach
28+
void before() {
29+
parsers.registerParser(Location.class, ArgumentKey.DEFAULT, new LocationArgument(new MessageRegistry<>()));
30+
parsers.registerParser(TypeRange.same(Optional.class), ArgumentKey.DEFAULT, new OptionalArgumentResolver<>());
31+
}
32+
33+
@Test
34+
void test() {
35+
Invocation<CommandSender> invocation = invocation("test", "pos1");
36+
RequirementResult<Optional<Location>> result = parsers.parse(invocation, ARGUMENT, RawInput.of("1", "2", "3"))
37+
.await();
38+
39+
assertTrue(result.isSuccessful());
40+
assertThat(result.getSuccess())
41+
.hasValue(new Location(null, 1, 2, 3));
42+
}
43+
44+
@Test
45+
void testFail() {
46+
Invocation<CommandSender> invocation = invocation("test", "pos1");
47+
RequirementResult<Optional<Location>> result = parsers.parse(invocation, ARGUMENT, RawInput.of("pos1"))
48+
.await();
49+
50+
assertTrue(result.isFailed());
51+
}
52+
53+
54+
}

litecommands-core/src/dev/rollczi/litecommands/argument/parser/ParserRegistryImpl.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@
33
import dev.rollczi.litecommands.argument.Argument;
44
import dev.rollczi.litecommands.argument.ArgumentKey;
55
import dev.rollczi.litecommands.input.raw.RawInput;
6+
import dev.rollczi.litecommands.invalidusage.InvalidUsage;
67
import dev.rollczi.litecommands.invocation.Invocation;
8+
import dev.rollczi.litecommands.range.Range;
79
import dev.rollczi.litecommands.reflect.type.TypeRange;
810
import dev.rollczi.litecommands.reflect.type.TypeIndex;
911
import java.util.ArrayList;
1012
import java.util.HashMap;
1113
import java.util.List;
1214
import java.util.Map;
1315

16+
import java.util.Optional;
1417
import org.jetbrains.annotations.NotNull;
1518

1619
public class ParserRegistryImpl<SENDER> implements ParserRegistry<SENDER>, ParserChainAccessor<SENDER> {
@@ -94,8 +97,20 @@ public <T> Parser<SENDER, T> getParserOrNull(Argument<T> argument) {
9497
@Override
9598
public <T> ParseResult<T> parse(Invocation<SENDER> invocation, Argument<T> argument, RawInput input) {
9699
Parser<SENDER, T> parser = getParser(argument);
100+
Range range = parser.getRange(argument);
97101

98-
return parser.parse(invocation, argument, input);
102+
if (range.isInRangeOrAbove(input.size())) {
103+
return parser.parse(invocation, argument, input);
104+
}
105+
106+
if (!input.hasNext()) {
107+
Optional<ParseResult<T>> optional = argument.getDefaultValue();
108+
109+
return optional
110+
.orElseGet(() -> ParseResult.failure(InvalidUsage.Cause.MISSING_ARGUMENT));
111+
}
112+
113+
return ParseResult.failure(InvalidUsage.Cause.MISSING_PART_OF_ARGUMENT);
99114
}
100115

101116
}

litecommands-unit/src/dev/rollczi/litecommands/unit/TestUtil.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,8 @@ public static Invocation<TestSender> invocation(String command, String... args)
1212
return new Invocation<>(new TestSender(), new TestPlatformSender(), command, command, ParseableInput.raw(args));
1313
}
1414

15+
public static <SENDER> Invocation<SENDER> invocation(SENDER sender, String command, String... args) {
16+
return new Invocation<>(sender, new TestPlatformSender(), command, command, ParseableInput.raw(args));
17+
}
18+
1519
}

settings.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ include(":litecommands-jakarta", VERSION_11)
3232
// platforms
3333
include(":litecommands-velocity", VERSION_11, tests = false)
3434
include(":litecommands-bungee", tests = false)
35-
include(":litecommands-bukkit", tests = false)
35+
include(":litecommands-bukkit")
3636
include(":litecommands-minestom", VERSION_21)
3737
include("litecommands-jda", VERSION_11)
3838
include(":litecommands-sponge", VERSION_21, tests = false)

0 commit comments

Comments
 (0)