Skip to content

Commit 1162e80

Browse files
committed
Improve tests, bug fixes
1 parent 7363455 commit 1162e80

File tree

9 files changed

+339
-73
lines changed

9 files changed

+339
-73
lines changed

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ subprojects {
3636
dependencies {
3737
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.3'
3838
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.3'
39+
testImplementation 'org.mockito:mockito-core:4.0.0'
3940
}
4041

4142
if (!(project.name in ['shared'])) {

shared/src/main/java/cz/foresttech/commandapi/shared/AbstractCommandAPI.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,8 @@ public List<String> tabComplete(T commandSender, String cmd, String[] args) {
8989
if (argsTogether.toLowerCase().startsWith(name.toLowerCase()) || argsTogether.equalsIgnoreCase(name)) {
9090

9191
String subString = argsTogether.substring(name.length()).trim();
92-
if (subString.isBlank()) {
93-
subString = "";
94-
}
95-
9692
String[] argsToCheck = subString.split(" ");
93+
9794
long params = Arrays.stream(method.getParameters())
9895
.filter(parameter -> parameter.isAnnotationPresent(Arg.class))
9996
.count();
@@ -107,7 +104,7 @@ public List<String> tabComplete(T commandSender, String cmd, String[] args) {
107104
if (parameter.isAnnotationPresent(Arg.class)) {
108105
ArgumentTypeProcessor<?> processor = argumentTypeProcessorMap.get(parameter.getType());
109106
if (processor != null) {
110-
List<String> result = processor.tabComplete(argsToCheck[argsToCheck.length-1]);
107+
List<String> result = processor.tabComplete(argsToCheck[argsToCheck.length - 1]);
111108
if (result != null) {
112109
list.addAll(result);
113110
} else {
@@ -145,7 +142,7 @@ public boolean onCommand(T commandSender, String cmd, String[] args) {
145142
return true;
146143
}
147144

148-
String argsTogether = String.join(" ", args);
145+
String argsTogether = String.join(" ", args) + " ";
149146
String[] invokeArgs = null;
150147

151148
// Check specifically declared subcommands
@@ -206,7 +203,7 @@ private Method findUniversalSubCommandWithArgs(CommandProcessor command, String[
206203
Arg arg = parameter.getAnnotation(Arg.class);
207204
return arg.required();
208205
}
209-
return false;
206+
return false;
210207
}).count();
211208

212209
if (requiredParameters > args.length) {
@@ -307,6 +304,11 @@ private String[] extractArguments(Method method, String[] args, String argsToget
307304
return new String[0];
308305
}
309306

307+
// Remove ending whitespaces
308+
if (remainingPart.endsWith(" ")) {
309+
remainingPart = remainingPart.substring(0, remainingPart.length() - 1);
310+
}
311+
310312
return remainingPart.split(" ");
311313
}
312314

@@ -339,9 +341,9 @@ private Object[] prepareParameters(Method method, T commandSender, String[] args
339341
}
340342

341343
private String namesCheck(String[] names, String[] args) {
342-
String mergedArgs = String.join(" ", args);
344+
String mergedArgs = String.join(" ", args) + " ";
343345
for (String name : names) {
344-
if (mergedArgs.toLowerCase().startsWith(name.toLowerCase())) {
346+
if (mergedArgs.toLowerCase().startsWith(name.toLowerCase() + " ")) {
345347
return name;
346348
}
347349
}

shared/src/test/java/cz/foresttech/commandapi/shared/AbstractCommandAPITest.java

Lines changed: 0 additions & 62 deletions
This file was deleted.
Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
package cz.foresttech.commandapi.shared;
2+
3+
import org.junit.jupiter.api.BeforeEach;
4+
import org.junit.jupiter.api.Test;
5+
import org.mockito.Mockito;
6+
7+
import java.util.List;
8+
9+
import static org.junit.jupiter.api.Assertions.assertEquals;
10+
import static org.junit.jupiter.api.Assertions.assertTrue;
11+
import static org.mockito.ArgumentMatchers.any;
12+
import static org.mockito.Mockito.*;
13+
14+
class OnCommandTest {
15+
16+
private TestCommandAPI testCommandAPI;
17+
private TestCommand testCommand;
18+
private TestCommandSenderWrapper testCommandSenderWrapper;
19+
20+
@BeforeEach
21+
public void setUp() {
22+
testCommandAPI = new TestCommandAPI();
23+
testCommand = Mockito.mock(TestCommand.class);
24+
testCommandSenderWrapper = new TestCommandSenderWrapper("apik007");
25+
assertTrue(testCommandAPI.registerCommand(testCommand));
26+
}
27+
28+
@Test
29+
void onNonExistingCommand() {
30+
assertTrue(testCommandAPI.onCommand(testCommandSenderWrapper, "non_exist_cmd", new String[]{}));
31+
verify(testCommand, never()).defaultSubCmd(any());
32+
verify(testCommand, never()).defaultSubCmd(any(), any(), any());
33+
verify(testCommand, never()).testSubCmd(any());
34+
verify(testCommand, never()).testSubCmdAlias(any());
35+
verify(testCommand, never()).argSubCmd(any(), any());
36+
verify(testCommand, never()).argSubCmd(any(), any(), any());
37+
verify(testCommand, never()).argSubCmdReq(any(), any(), any());
38+
}
39+
40+
@Test
41+
void onDefaultSubCommand() {
42+
assertTrue(testCommandAPI.onCommand(testCommandSenderWrapper, "cmd", new String[]{}));
43+
verify(testCommand).defaultSubCmd("apik007");
44+
reset(testCommand);
45+
46+
assertTrue(testCommandAPI.onCommand(testCommandSenderWrapper, "cmd", new String[]{"rng"}));
47+
verify(testCommand, never()).defaultSubCmd(any());
48+
verify(testCommand, never()).defaultSubCmd(any(), any(), any());
49+
reset(testCommand);
50+
51+
assertTrue(testCommandAPI.onCommand(testCommandSenderWrapper, "cmd", new String[]{"10.5", "rng"}));
52+
verify(testCommand, never()).defaultSubCmd(any());
53+
verify(testCommand).defaultSubCmd("apik007", 10.5, "rng");
54+
reset(testCommand);
55+
56+
assertTrue(testCommandAPI.onCommand(testCommandSenderWrapper, "cmd", new String[]{"10.5", "rng", "message"}));
57+
verify(testCommand, never()).defaultSubCmd(any());
58+
verify(testCommand).defaultSubCmd("apik007", 10.5, "rng message");
59+
}
60+
61+
@Test
62+
void parsing() {
63+
assertTrue(testCommandAPI.onCommand(testCommandSenderWrapper, "cmd", new String[]{"10.5s", "rng", "message"}));
64+
verify(testCommand, never()).defaultSubCmd(any());
65+
verify(testCommand, never()).defaultSubCmd(any(), any(), any());
66+
verify(testCommand, never()).testSubCmd(any());
67+
verify(testCommand, never()).testSubCmdAlias(any());
68+
verify(testCommand, never()).argSubCmd(any(), any());
69+
verify(testCommand, never()).argSubCmd(any(), any(), any());
70+
verify(testCommand, never()).argSubCmdReq(any(), any(), any());
71+
72+
assertTrue(testCommandAPI.onCommand(testCommandSenderWrapper, "cmd", new String[]{"-100.5", "rng", "message"}));
73+
verify(testCommand, never()).defaultSubCmd(any());
74+
verify(testCommand, never()).testSubCmd(any());
75+
verify(testCommand, never()).testSubCmdAlias(any());
76+
verify(testCommand, never()).argSubCmd(any(), any());
77+
verify(testCommand, never()).argSubCmd(any(), any(), any());
78+
verify(testCommand, never()).argSubCmdReq(any(), any(), any());
79+
verify(testCommand).defaultSubCmd("apik007", -100.5, "rng message");
80+
81+
assertTrue(testCommandAPI.onCommand(testCommandSenderWrapper, "cmd", new String[]{"-100", "rng", "message"}));
82+
verify(testCommand, never()).defaultSubCmd(any());
83+
verify(testCommand, never()).testSubCmd(any());
84+
verify(testCommand, never()).testSubCmdAlias(any());
85+
verify(testCommand, never()).argSubCmd(any(), any());
86+
verify(testCommand, never()).argSubCmd(any(), any(), any());
87+
verify(testCommand, never()).argSubCmdReq(any(), any(), any());
88+
verify(testCommand).defaultSubCmd("apik007", -100.0, "rng message");
89+
}
90+
91+
@Test
92+
void onSubCommandNoArgs() {
93+
assertTrue(testCommandAPI.onCommand(testCommandSenderWrapper, "cmd", new String[]{"test"}));
94+
verify(testCommand, never()).defaultSubCmd(any());
95+
verify(testCommand, never()).defaultSubCmd(any(), any(), any());
96+
verify(testCommand).testSubCmd("apik007");
97+
reset(testCommand);
98+
99+
assertTrue(testCommandAPI.onCommand(testCommandSenderWrapper, "cmd", new String[]{"test_alias"}));
100+
verify(testCommand, never()).defaultSubCmd(any());
101+
verify(testCommand, never()).defaultSubCmd(any(), any(), any());
102+
verify(testCommand, never()).testSubCmd(any());
103+
verify(testCommand).testSubCmdAlias("apik007");
104+
reset(testCommand);
105+
106+
assertTrue(testCommandAPI.onCommand(testCommandSenderWrapper, "cmd", new String[]{"test_alias2"}));
107+
verify(testCommand, never()).defaultSubCmd(any());
108+
verify(testCommand, never()).defaultSubCmd(any(), any(), any());
109+
verify(testCommand, never()).testSubCmd(any());
110+
verify(testCommand).testSubCmdAlias("apik007");
111+
}
112+
113+
@Test
114+
void onSubCommandArgs() {
115+
assertTrue(testCommandAPI.onCommand(testCommandSenderWrapper, "cmd", new String[]{"arg"}));
116+
verify(testCommand, never()).defaultSubCmd(any());
117+
verify(testCommand, never()).defaultSubCmd(any(), any(), any());
118+
verify(testCommand, never()).testSubCmd(any());
119+
verify(testCommand, never()).testSubCmdAlias(any());
120+
verify(testCommand, never()).argSubCmd(any(), any());
121+
verify(testCommand, never()).argSubCmd(any(), any(), any());
122+
verify(testCommand, never()).argSubCmdReq(any(), any(), any());
123+
reset(testCommand);
124+
125+
assertTrue(testCommandAPI.onCommand(testCommandSenderWrapper, "cmd", new String[]{"arg", "rng"}));
126+
verify(testCommand, never()).defaultSubCmd(any());
127+
verify(testCommand, never()).defaultSubCmd(any(), any(), any());
128+
verify(testCommand, never()).testSubCmd(any());
129+
verify(testCommand, never()).testSubCmdAlias(any());
130+
verify(testCommand, never()).argSubCmd(any(), any(), any());
131+
verify(testCommand, never()).argSubCmdReq(any(), any(), any());
132+
verify(testCommand).argSubCmd("apik007", "rng");
133+
reset(testCommand);
134+
135+
assertTrue(testCommandAPI.onCommand(testCommandSenderWrapper, "cmd", new String[]{"non-required", "rng"}));
136+
verify(testCommand, never()).defaultSubCmd(any());
137+
verify(testCommand, never()).defaultSubCmd(any(), any(), any());
138+
verify(testCommand, never()).testSubCmd(any());
139+
verify(testCommand, never()).testSubCmdAlias(any());
140+
verify(testCommand, never()).argSubCmd(any(), any());
141+
verify(testCommand, never()).argSubCmdReq(any(), any(), any());
142+
verify(testCommand).argSubCmd("apik007", "rng", null);
143+
reset(testCommand);
144+
145+
assertTrue(testCommandAPI.onCommand(testCommandSenderWrapper, "cmd", new String[]{"non-required", "rng", "unneeded"}));
146+
verify(testCommand, never()).defaultSubCmd(any());
147+
verify(testCommand, never()).defaultSubCmd(any(), any(), any());
148+
verify(testCommand, never()).testSubCmd(any());
149+
verify(testCommand, never()).testSubCmdAlias(any());
150+
verify(testCommand, never()).argSubCmd(any(), any());
151+
verify(testCommand, never()).argSubCmdReq(any(), any(), any());
152+
verify(testCommand).argSubCmd("apik007", "rng", "unneeded");
153+
reset(testCommand);
154+
155+
assertTrue(testCommandAPI.onCommand(testCommandSenderWrapper, "cmd", new String[]{"required", "rng"}));
156+
verify(testCommand, never()).defaultSubCmd(any());
157+
verify(testCommand, never()).defaultSubCmd(any(), any(), any());
158+
verify(testCommand, never()).testSubCmd(any());
159+
verify(testCommand, never()).testSubCmdAlias(any());
160+
verify(testCommand, never()).argSubCmd(any(), any());
161+
verify(testCommand, never()).argSubCmd(any(), any(), any());
162+
verify(testCommand, never()).argSubCmdReq(any(), any(), any());
163+
reset(testCommand);
164+
165+
assertTrue(testCommandAPI.onCommand(testCommandSenderWrapper, "cmd", new String[]{"required", "rng", "needed"}));
166+
verify(testCommand, never()).defaultSubCmd(any());
167+
verify(testCommand, never()).defaultSubCmd(any(), any(), any());
168+
verify(testCommand, never()).testSubCmd(any());
169+
verify(testCommand, never()).testSubCmdAlias(any());
170+
verify(testCommand, never()).argSubCmd(any(), any());
171+
verify(testCommand, never()).argSubCmd(any(), any(), any());
172+
verify(testCommand).argSubCmdReq("apik007", "rng", "needed");
173+
reset(testCommand);
174+
}
175+
176+
@Test
177+
void tabComplete() {
178+
List<String> autoComplete = testCommandAPI.tabComplete(testCommandSenderWrapper, "cmd", new String[]{});
179+
assertTrue(autoComplete.contains("test"));
180+
assertTrue(autoComplete.contains("arg"));
181+
assertTrue(autoComplete.contains("non-required"));
182+
assertTrue(autoComplete.contains("required"));
183+
assertTrue(autoComplete.contains("test_alias"));
184+
assertTrue(autoComplete.contains("test_alias2"));
185+
assertEquals(6, autoComplete.size());
186+
187+
autoComplete = testCommandAPI.tabComplete(testCommandSenderWrapper, "cmd", new String[]{"req"});
188+
assertTrue(autoComplete.contains("required"));
189+
assertEquals(1, autoComplete.size());
190+
191+
autoComplete = testCommandAPI.tabComplete(testCommandSenderWrapper, "cmd", new String[]{"required", "test", "t"});
192+
assertTrue(autoComplete.contains("test2"));
193+
assertEquals(1, autoComplete.size());
194+
}
195+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package cz.foresttech.commandapi.shared;
2+
3+
import org.junit.jupiter.api.BeforeEach;
4+
import org.junit.jupiter.api.Test;
5+
import org.mockito.Mockito;
6+
7+
import java.util.List;
8+
9+
import static org.junit.jupiter.api.Assertions.*;
10+
11+
class OnTabCompleteTest {
12+
13+
private TestCommandAPI testCommandAPI;
14+
private TestTabCommand testCommand;
15+
private TestCommandSenderWrapper testCommandSenderWrapper;
16+
17+
@BeforeEach
18+
public void setUp() {
19+
testCommandAPI = new TestCommandAPI();
20+
testCommand = Mockito.mock(TestTabCommand.class);
21+
testCommandSenderWrapper = new TestCommandSenderWrapper("apik007");
22+
23+
TestArgProcessor testArgProcessor = new TestArgProcessor();
24+
25+
assertTrue(testCommandAPI.registerArgumentTypeProcessor(TestObject.class, testArgProcessor));
26+
assertTrue(testCommandAPI.registerCommand(testCommand));
27+
}
28+
29+
@Test
30+
void tabComplete() {
31+
List<String> autoComplete = testCommandAPI.tabComplete(testCommandSenderWrapper, "cmd", new String[]{});
32+
assertTrue(autoComplete.contains("test"));
33+
assertTrue(autoComplete.contains("arg"));
34+
assertTrue(autoComplete.contains("non-required"));
35+
assertTrue(autoComplete.contains("required"));
36+
assertTrue(autoComplete.contains("test_alias"));
37+
assertTrue(autoComplete.contains("test_alias2"));
38+
assertEquals(6, autoComplete.size());
39+
40+
autoComplete = testCommandAPI.tabComplete(testCommandSenderWrapper, "cmd", new String[]{"req"});
41+
assertTrue(autoComplete.contains("required"));
42+
assertEquals(1, autoComplete.size());
43+
44+
autoComplete = testCommandAPI.tabComplete(testCommandSenderWrapper, "cmd", new String[]{"required", "t"});
45+
assertTrue(autoComplete.contains("test"));
46+
assertEquals(1, autoComplete.size());
47+
48+
autoComplete = testCommandAPI.tabComplete(testCommandSenderWrapper, "cmd", new String[]{"required", "test", "a"});
49+
assertTrue(autoComplete.contains("apik007"));
50+
assertEquals(1, autoComplete.size());
51+
52+
autoComplete = testCommandAPI.tabComplete(testCommandSenderWrapper, "cmd", new String[]{"required", "test", "A"});
53+
assertTrue(autoComplete.contains("Apik777"));
54+
assertEquals(1, autoComplete.size());
55+
56+
autoComplete = testCommandAPI.tabComplete(testCommandSenderWrapper, "cmd", new String[]{"tes"});
57+
assertTrue(autoComplete.contains("test"));
58+
assertTrue(autoComplete.contains("test_alias"));
59+
assertTrue(autoComplete.contains("test_alias2"));
60+
assertEquals(3, autoComplete.size());
61+
}
62+
}

0 commit comments

Comments
 (0)