[AB-246] changing parameter handling to only actually evaluate the necessary parameter handlers, this helps avoiding providing the wrong parameter to the actual command

This commit is contained in:
Sheldan
2021-05-02 17:40:52 +02:00
parent 23dd02312a
commit 2a5c462c35
43 changed files with 210 additions and 92 deletions

View File

@@ -33,10 +33,11 @@ public class TrackedEmoteParameterHandler implements CommandParameterHandler {
/**
* This {@link CommandParameterHandler} only handles {@link TrackedEmote}
* @param clazz The desired {@link Class} of a parameter
* @param value
* @return Whether or not the given {@link Class} will be handled by this {@link CommandParameterHandler}
*/
@Override
public boolean handles(Class clazz) {
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(TrackedEmote.class);
}

View File

@@ -37,10 +37,11 @@ public class TrackedEmoteParameterParameterHandler implements CommandParameterHa
/**
* This {@link CommandParameterHandler} only handles {@link TrackEmoteParameter}
* @param clazz The desired {@link Class} of a parameter
* @param value
* @return Whether or not the given {@link Class} will be handled by this {@link CommandParameterHandler}
*/
@Override
public boolean handles(Class clazz) {
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(TrackEmoteParameter.class);
}

View File

@@ -58,16 +58,19 @@ public class TrackedEmoteParameterHandlerTest {
@Mock
private TrackedEmote trackedEmote;
@Mock
private UnparsedCommandParameterPiece unparsedCommandParameterPiece;
private static final String WRONG_FORMATTED_INPUT = "input";
@Test
public void testHandleIncorrect() {
Assert.assertFalse(testUnit.handles(String.class));
Assert.assertFalse(testUnit.handles(String.class, unparsedCommandParameterPiece));
}
@Test
public void testHandleCorrect() {
Assert.assertTrue(testUnit.handles(TrackedEmote.class));
Assert.assertTrue(testUnit.handles(TrackedEmote.class, unparsedCommandParameterPiece));
}
@Test

View File

@@ -61,16 +61,19 @@ public class TrackedEmoteParameterParameterHandlerTest {
@Mock
private Command command;
@Mock
private UnparsedCommandParameterPiece unparsedCommandParameterPiece;
private static final String WRONG_FORMATTED_INPUT = "input";
@Test
public void testHandleIncorrect() {
Assert.assertFalse(testUnit.handles(String.class));
Assert.assertFalse(testUnit.handles(String.class, unparsedCommandParameterPiece));
}
@Test
public void testHandleCorrect() {
Assert.assertTrue(testUnit.handles(TrackEmoteParameter.class));
Assert.assertTrue(testUnit.handles(TrackEmoteParameter.class, unparsedCommandParameterPiece));
}
@Test

View File

@@ -37,10 +37,7 @@ import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
@@ -257,17 +254,22 @@ public class CommandReceivedHandler extends ListenerAdapter {
Iterator<Role> roleIterator = message.getMentionedRolesBag().iterator();
Parameter param = parameters.get(0);
CommandParameterIterators iterators = new CommandParameterIterators(channelIterator, emoteIterator, memberIterator, roleIterator);
Set<CommandParameterHandler> usedParameterHandler = findNecessaryCommandParameterHandlers(parameters, unParsedCommandParameter);
List<CompletableFuture> futures = new ArrayList<>();
// the actual parameters which were handled, might not coincide with the unparsed parameters
// because we might ignore some parameters (for example referenced messages) in case the command does not use this as a parameter
int parsedParameter = 0;
for (int i = 0; i < unParsedCommandParameter.getParameters().size(); i++) {
if(i < parameters.size() && !param.isRemainder()) {
param = parameters.get(i);
if(parsedParameter < parameters.size() && !param.isRemainder()) {
param = parameters.get(parsedParameter);
} else {
param = parameters.get(parameters.size() - 1);
}
UnparsedCommandParameterPiece value = unParsedCommandParameter.getParameters().get(i);
for (CommandParameterHandler handler : parameterHandlers) {
// TODO might be able to do this without iterating, if we directly associated the handler required for each parameter
for (CommandParameterHandler handler : usedParameterHandler) {
try {
if (handler.handles(param.getType())) {
if (handler.handles(param.getType(), value)) {
if (handler.async()) {
CompletableFuture future = handler.handleAsync(value, iterators, param, message, command);
futures.add(future);
@@ -278,6 +280,7 @@ public class CommandReceivedHandler extends ListenerAdapter {
parsedParameters.add(ParseResult.builder().parameter(param).result(result).build());
}
}
parsedParameter++;
break;
}
} catch (AbstractoRunTimeException abstractoRunTimeException) {
@@ -327,6 +330,29 @@ public class CommandReceivedHandler extends ListenerAdapter {
}
}
private Set<CommandParameterHandler> findNecessaryCommandParameterHandlers(List<Parameter> parameters, UnParsedCommandParameter unParsedCommandParameter) {
Set<CommandParameterHandler> foundHandlers = new HashSet<>();
Parameter param = parameters.get(0);
int parsedParameter = 0;
for (int i = 0; i < unParsedCommandParameter.getParameters().size(); i++) {
if (parsedParameter < parameters.size() && !param.isRemainder()) {
param = parameters.get(parsedParameter);
} else {
param = parameters.get(parameters.size() - 1);
}
UnparsedCommandParameterPiece value = unParsedCommandParameter.getParameters().get(i);
for (Parameter parameter : parameters) {
for (CommandParameterHandler handler : parameterHandlers) {
if (!foundHandlers.contains(handler) && handler.handles(parameter.getType(), value)) {
foundHandlers.add(handler);
parsedParameter++;
}
}
}
}
return foundHandlers;
}
private List<Object> extractParametersFromParsed(List<ParseResult> results) {
List<Object> usableParameters = new ArrayList<>();
results.forEach(parseResult -> {

View File

@@ -27,7 +27,7 @@ public class AChannelParameterHandlerImpl implements AChannelParameterHandler {
private ChannelManagementService channelManagementService;
@Override
public boolean handles(Class clazz) {
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(AChannel.class);
}

View File

@@ -27,7 +27,7 @@ public class AEmoteParameterHandlerImpl implements AEmoteParameterHandler {
private CommandService commandService;
@Override
public boolean handles(Class clazz) {
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(AEmote.class);
}

View File

@@ -27,7 +27,7 @@ public class ARoleParameterHandlerImpl implements ARoleParameterHandler {
private CommandService commandService;
@Override
public boolean handles(Class clazz) {
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(ARole.class);
}

View File

@@ -55,7 +55,7 @@ public class AUserInAServerParameterHandlerImpl implements AUserInAServerParamet
}
@Override
public boolean handles(Class clazz) {
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(AUserInAServer.class);
}

View File

@@ -3,6 +3,7 @@ package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import dev.sheldan.abstracto.core.command.handler.provided.BooleanParameterHandler;
import net.dv8tion.jda.api.entities.Message;
@@ -11,8 +12,8 @@ import org.springframework.stereotype.Component;
@Component
public class BooleanParameterHandlerImpl implements BooleanParameterHandler {
@Override
public boolean handles(Class clazz) {
return clazz.equals(Boolean.class);
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(Boolean.class) && value.getType().equals(ParameterPieceType.STRING);
}
@Override

View File

@@ -4,6 +4,7 @@ import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.exception.ChannelGroupNotFoundException;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import dev.sheldan.abstracto.core.command.handler.provided.ChannelGroupParameterHandler;
import dev.sheldan.abstracto.core.models.database.AChannelGroup;
@@ -44,8 +45,8 @@ public class ChannelGroupParameterHandlerImpl implements ChannelGroupParameterHa
}
@Override
public boolean handles(Class clazz) {
return clazz.equals(AChannelGroup.class);
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(AChannelGroup.class) && value.getType().equals(ParameterPieceType.STRING);
}
@Override

View File

@@ -3,6 +3,7 @@ package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import dev.sheldan.abstracto.core.command.handler.provided.ChannelGroupTypeParameterHandler;
import dev.sheldan.abstracto.core.models.database.ChannelGroupType;
@@ -22,8 +23,8 @@ public class ChannelGroupTypeParameterHandlerImpl implements ChannelGroupTypePar
private ServerManagementService serverManagementService;
@Override
public boolean handles(Class clazz) {
return clazz.equals(ChannelGroupType.class);
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(ChannelGroupType.class) && value.getType().equals(ParameterPieceType.STRING);
}
@Override

View File

@@ -44,7 +44,7 @@ public class CombinedParameterHandlerImpl implements CombinedParametersHandler {
for (Object concreteParameter: possibleTypes) {
for (CommandParameterHandler handler : parameterHandlers) {
try {
if (handler.handles((Class) concreteParameter)) {
if (handler.handles((Class) concreteParameter, input)) {
if (handler.async()) {
futures.add(handler.handleAsync(input, iterators, param, context, command));
} else {
@@ -75,7 +75,7 @@ public class CombinedParameterHandlerImpl implements CombinedParametersHandler {
}
@Override
public boolean handles(Class clazz) {
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(CombinedParameter.class);
}

View File

@@ -4,6 +4,7 @@ import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.CommandParameterKey;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import dev.sheldan.abstracto.core.command.handler.provided.CommandKeyParameterHandler;
import net.dv8tion.jda.api.entities.Message;
@@ -13,8 +14,8 @@ import org.springframework.stereotype.Component;
public class CommandKeyParameterHandlerImpl implements CommandKeyParameterHandler {
@Override
public boolean handles(Class clazz) {
return CommandParameterKey.class.isAssignableFrom(clazz);
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return CommandParameterKey.class.isAssignableFrom(clazz) && value.getType().equals(ParameterPieceType.STRING);
}
@Override

View File

@@ -3,6 +3,7 @@ package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import dev.sheldan.abstracto.core.command.handler.provided.DoubleParameterHandler;
import net.dv8tion.jda.api.entities.Message;
@@ -11,8 +12,8 @@ import org.springframework.stereotype.Component;
@Component
public class DoubleParameterHandlerImpl implements DoubleParameterHandler {
@Override
public boolean handles(Class clazz) {
return clazz.equals(Double.class);
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(Double.class) && value.getType().equals(ParameterPieceType.STRING);
}
@Override

View File

@@ -3,6 +3,7 @@ package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import dev.sheldan.abstracto.core.command.handler.provided.DurationParameterHandler;
import dev.sheldan.abstracto.core.utils.ParseUtils;
@@ -14,8 +15,8 @@ import java.time.Duration;
@Component
public class DurationParameterHandlerImpl implements DurationParameterHandler {
@Override
public boolean handles(Class clazz) {
return clazz.equals(Duration.class);
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(Duration.class) && value.getType().equals(ParameterPieceType.STRING);
}
@Override

View File

@@ -16,7 +16,7 @@ import java.util.regex.Matcher;
public class EmoteParameterHandlerImpl implements EmoteParameterHandler {
@Override
public boolean handles(Class clazz) {
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(Emote.class);
}
@@ -24,7 +24,7 @@ public class EmoteParameterHandlerImpl implements EmoteParameterHandler {
public Object handle(UnparsedCommandParameterPiece input, CommandParameterIterators iterators, Parameter param, Message context, Command command) {
String inputString = (String) input.getValue();
Matcher matcher = Message.MentionType.EMOTE.getPattern().matcher(inputString);
if(matcher.matches()) {
if(matcher.matches() && iterators.getEmoteIterator().hasNext()) {
return iterators.getEmoteIterator().next();
} else {
if(StringUtils.isNumeric(inputString)) {

View File

@@ -4,6 +4,7 @@ import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.exception.NoAttachmentFoundException;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import dev.sheldan.abstracto.core.command.handler.provided.FileParameterHandler;
import dev.sheldan.abstracto.core.service.HttpService;
@@ -44,8 +45,8 @@ public class FileParameterHandlerImpl implements FileParameterHandler {
}
@Override
public boolean handles(Class clazz) {
return clazz.equals(File.class);
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(File.class) && value.getType().equals(ParameterPieceType.ATTACHMENT);
}
@Override

View File

@@ -28,7 +28,7 @@ public class FullEmoteParameterHandlerImpl implements FullEmoteParameterHandler
private CommandService commandService;
@Override
public boolean handles(Class clazz) {
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(FullEmote.class);
}

View File

@@ -28,7 +28,7 @@ public class FullRoleParameterHandlerImpl implements FullRoleParameterHandler {
private CommandService commandService;
@Override
public boolean handles(Class clazz) {
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(FullRole.class);
}

View File

@@ -3,6 +3,7 @@ package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import dev.sheldan.abstracto.core.command.handler.provided.IntegerParameterHandler;
import net.dv8tion.jda.api.entities.Message;
@@ -12,8 +13,8 @@ import org.springframework.stereotype.Component;
public class IntegerParameterHandlerImpl implements IntegerParameterHandler {
@Override
public boolean handles(Class clazz) {
return clazz.equals(Integer.class);
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(Integer.class) && value.getType().equals(ParameterPieceType.STRING);
}
@Override

View File

@@ -3,6 +3,7 @@ package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import dev.sheldan.abstracto.core.command.handler.provided.LongParameterHandler;
import net.dv8tion.jda.api.entities.Message;
@@ -12,8 +13,8 @@ import org.springframework.stereotype.Component;
public class LongParameterHandlerImpl implements LongParameterHandler {
@Override
public boolean handles(Class clazz) {
return clazz.equals(Long.class);
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(Long.class) && value.getType().equals(ParameterPieceType.STRING);
}
@Override

View File

@@ -19,7 +19,7 @@ import java.util.regex.Matcher;
@Component
public class MemberParameterHandlerImpl implements MemberParameterHandler {
@Override
public boolean handles(Class clazz) {
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(Member.class);
}
@@ -32,7 +32,7 @@ public class MemberParameterHandlerImpl implements MemberParameterHandler {
public CompletableFuture<Object> handleAsync(UnparsedCommandParameterPiece input, CommandParameterIterators iterators, Parameter param, Message context, Command command) {
String inputString = (String) input.getValue();
Matcher matcher = Message.MentionType.USER.getPattern().matcher(inputString);
if(matcher.matches()) {
if(matcher.matches() && iterators.getMemberIterator().hasNext()) {
return CompletableFuture.completedFuture(iterators.getMemberIterator().next());
} else {
if(NumberUtils.isParsable(inputString)) {

View File

@@ -3,6 +3,7 @@ package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import dev.sheldan.abstracto.core.command.handler.provided.MessageParameterHandler;
import dev.sheldan.abstracto.core.service.MessageService;
@@ -29,8 +30,8 @@ public class MessageParameterHandlerImpl implements MessageParameterHandler {
}
@Override
public boolean handles(Class clazz) {
return clazz.equals(Message.class);
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(Message.class) && value.getType().equals(ParameterPieceType.REFERENCED_MESSAGE);
}
@Override

View File

@@ -4,6 +4,7 @@ import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.exception.AbstractoTemplatedException;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import dev.sheldan.abstracto.core.command.handler.provided.RoleParameterHandler;
import net.dv8tion.jda.api.entities.Message;
@@ -17,15 +18,15 @@ import java.util.regex.Matcher;
@Component
public class RoleParameterHandlerImpl implements RoleParameterHandler {
@Override
public boolean handles(Class clazz) {
return clazz.equals(Role.class);
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(Role.class) && value.getType().equals(ParameterPieceType.STRING);
}
@Override
public Object handle(UnparsedCommandParameterPiece input, CommandParameterIterators iterators, Parameter param, Message context, Command command) {
String inputString = (String) input.getValue();
Matcher matcher = Message.MentionType.ROLE.getPattern().matcher(inputString);
if(matcher.matches()) {
if(matcher.matches() && iterators.getRoleIterator().hasNext()) {
return iterators.getRoleIterator().next();
} else {
if(NumberUtils.isParsable(inputString)) {

View File

@@ -21,7 +21,7 @@ public class StringParameterHandlerImpl implements StringParameterHandler {
}
@Override
public boolean handles(Class clazz) {
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(String.class);
}

View File

@@ -4,6 +4,7 @@ import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.exception.AbstractoTemplatedException;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import dev.sheldan.abstracto.core.command.handler.provided.TextChannelParameterHandler;
import net.dv8tion.jda.api.entities.Message;
@@ -17,15 +18,15 @@ import java.util.regex.Matcher;
@Component
public class TextChannelParameterHandlerImpl implements TextChannelParameterHandler {
@Override
public boolean handles(Class clazz) {
return clazz.equals(TextChannel.class);
public boolean handles(Class clazz, UnparsedCommandParameterPiece value) {
return clazz.equals(TextChannel.class) && value.getType().equals(ParameterPieceType.STRING);
}
@Override
public Object handle(UnparsedCommandParameterPiece input, CommandParameterIterators iterators, Parameter param, Message context, Command command) {
String inputString = (String) input.getValue();
Matcher matcher = Message.MentionType.CHANNEL.getPattern().matcher(inputString);
if(matcher.matches()) {
if(matcher.matches() && iterators.getChannelIterator().hasNext()) {
return iterators.getChannelIterator().next();
} else {
if(NumberUtils.isParsable(inputString)) {

View File

@@ -175,7 +175,7 @@ public class CommandReceivedHandlerTest {
when(commandConfiguration.getParameters()).thenReturn(Arrays.asList(parameter));
when(parameter.getType()).thenReturn(Duration.class);
Duration parsedDuration = Duration.ofMinutes(1);
when(parameterHandler.handles(Duration.class)).thenReturn(true);
when(parameterHandler.handles(eq(Duration.class), any())).thenReturn(true);
when(parameterHandler.handle(any(UnparsedCommandParameterPiece.class), any(CommandParameterIterators.class), eq(parameter), eq(message), eq(command))).thenReturn(parsedDuration);
testUnit.onMessageReceived(event);
verify(self, times(1)).executeCommand(eq(event), eq(command), parametersArgumentCaptor.capture());
@@ -190,7 +190,7 @@ public class CommandReceivedHandlerTest {
setupCommandAndMessage(MESSAGE_CONTENT_ONE_PARAMETER);
when(commandConfiguration.getParameters()).thenReturn(Arrays.asList(parameter));
when(parameter.getType()).thenReturn(String.class);
when(parameterHandler.handles(String.class)).thenReturn(true);
when(parameterHandler.handles(eq(String.class), any())).thenReturn(true);
when(parameterHandler.handle(any(UnparsedCommandParameterPiece.class), any(CommandParameterIterators.class), eq(parameter), eq(message), eq(command))).thenReturn(PARAMETER_TEXT_1);
testUnit.onMessageReceived(event);
verify(self, times(1)).executeCommand(eq(event), eq(command), parametersArgumentCaptor.capture());
@@ -206,7 +206,7 @@ public class CommandReceivedHandlerTest {
when(parameter.isRemainder()).thenReturn(true);
when(parameter.getType()).thenReturn(String.class);
when(commandConfiguration.getParameters()).thenReturn(Arrays.asList(parameter));
when(parameterHandler.handles(String.class)).thenReturn(true);
when(parameterHandler.handles(eq(String.class), any())).thenReturn(true);
when(parameterHandler.handle(argThat(parameterPieceMatcher(PARAMETER_TEXT_1)), any(CommandParameterIterators.class), eq(parameter), eq(message), eq(command))).thenReturn(PARAMETER_TEXT_1);
when(parameterHandler.handle(argThat(parameterPieceMatcher(PARAMETER_TEXT_2)), any(CommandParameterIterators.class), eq(parameter), eq(message), eq(command))).thenReturn(PARAMETER_TEXT_2);
testUnit.onMessageReceived(event);
@@ -225,8 +225,8 @@ public class CommandReceivedHandlerTest {
when(secondParameter.getType()).thenReturn(String.class);
when(secondParameter.isRemainder()).thenReturn(true);
when(commandConfiguration.getParameters()).thenReturn(Arrays.asList(parameter, secondParameter));
when(parameterHandler.handles(Duration.class)).thenReturn(true);
when(secondParameterHandler.handles(String.class)).thenReturn(true);
when(parameterHandler.handles(eq(Duration.class), any())).thenReturn(true);
when(secondParameterHandler.handles(eq(String.class), any())).thenReturn(true);
Duration parsedDuration = Duration.ofMinutes(1);
when(parameterHandler.handle(argThat(parameterPieceMatcher(PARAMETER_TEXT_1)), any(CommandParameterIterators.class), eq(parameter), eq(message), eq(command))).thenReturn(parsedDuration);
when(secondParameterHandler.handle(argThat(parameterPieceMatcher(PARAMETER_TEXT_2)), any(CommandParameterIterators.class), eq(secondParameter), eq(message), eq(command))).thenReturn(PARAMETER_TEXT_2);
@@ -245,7 +245,7 @@ public class CommandReceivedHandlerTest {
when(parameter.getType()).thenReturn(Duration.class);
when(parameter.isRemainder()).thenReturn(false);
when(commandConfiguration.getParameters()).thenReturn(Arrays.asList(parameter, secondParameter));
when(parameterHandler.handles(Duration.class)).thenReturn(true);
when(parameterHandler.handles(eq(Duration.class), any())).thenReturn(true);
when(parameterHandler.async()).thenReturn(true);
Duration parsedDuration = Duration.ofMinutes(1);
when(parameterHandler.handleAsync(argThat(parameterPieceMatcher(PARAMETER_TEXT_1)), any(CommandParameterIterators.class),
@@ -266,8 +266,8 @@ public class CommandReceivedHandlerTest {
when(secondParameter.getType()).thenReturn(String.class);
when(secondParameter.isRemainder()).thenReturn(true);
when(commandConfiguration.getParameters()).thenReturn(Arrays.asList(parameter, secondParameter));
when(parameterHandler.handles(Duration.class)).thenReturn(true);
when(secondParameterHandler.handles(String.class)).thenReturn(true);
when(parameterHandler.handles(eq(Duration.class), any())).thenReturn(true);
when(secondParameterHandler.handles(eq(String.class), any())).thenReturn(true);
when(secondParameterHandler.async()).thenReturn(true);
Duration parsedDuration = Duration.ofMinutes(1);
when(parameterHandler.handle(argThat(parameterPieceMatcher(PARAMETER_TEXT_1)), any(CommandParameterIterators.class), eq(parameter), eq(message), eq(command))).thenReturn(parsedDuration);

View File

@@ -46,14 +46,17 @@ public class AChannelParameterHandlerImplTest extends AbstractParameterHandlerTe
@Mock
private Command command;
@Mock
private UnparsedCommandParameterPiece unparsedCommandParameterPiece;
@Test
public void testSuccessfulCondition() {
Assert.assertTrue(testUnit.handles(AChannel.class));
Assert.assertTrue(testUnit.handles(AChannel.class, unparsedCommandParameterPiece));
}
@Test
public void testWrongCondition() {
Assert.assertFalse(testUnit.handles(String.class));
Assert.assertFalse(testUnit.handles(String.class, unparsedCommandParameterPiece));
}
@Test

View File

@@ -54,14 +54,17 @@ public class AEmoteParameterHandlerImplImplTest extends AbstractParameterHandler
@Mock
private Command command;
@Mock
private UnparsedCommandParameterPiece unparsedCommandParameterPiece;
@Test
public void testSuccessfulCondition() {
Assert.assertTrue(testUnit.handles(AEmote.class));
Assert.assertTrue(testUnit.handles(AEmote.class, unparsedCommandParameterPiece));
}
@Test
public void testWrongCondition() {
Assert.assertFalse(testUnit.handles(String.class));
Assert.assertFalse(testUnit.handles(String.class, unparsedCommandParameterPiece));
}
@Test

View File

@@ -4,7 +4,6 @@ import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import dev.sheldan.abstracto.core.command.service.CommandService;
import dev.sheldan.abstracto.core.models.database.AEmote;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.service.RoleService;
import net.dv8tion.jda.api.entities.Message;
@@ -54,14 +53,17 @@ public class ARoleParameterHandlerImplImplTest extends AbstractParameterHandlerT
@Mock
private Command command;
@Mock
private UnparsedCommandParameterPiece unparsedCommandParameterPiece;
@Test
public void testSuccessfulCondition() {
Assert.assertTrue(testUnit.handles(ARole.class));
Assert.assertTrue(testUnit.handles(ARole.class, unparsedCommandParameterPiece));
}
@Test
public void testWrongCondition() {
Assert.assertFalse(testUnit.handles(String.class));
Assert.assertFalse(testUnit.handles(String.class, unparsedCommandParameterPiece));
}
@Test

View File

@@ -2,6 +2,7 @@ package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import org.junit.Assert;
import org.junit.Test;
@@ -10,6 +11,8 @@ import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class BooleanParameterHandlerImplTest extends AbstractParameterHandlerTest {
@@ -22,14 +25,18 @@ public class BooleanParameterHandlerImplTest extends AbstractParameterHandlerTes
@Mock
private Command command;
@Mock
private UnparsedCommandParameterPiece unparsedCommandParameterPiece;
@Test
public void testSuccessfulCondition() {
Assert.assertTrue(testUnit.handles(Boolean.class));
when(unparsedCommandParameterPiece.getType()).thenReturn(ParameterPieceType.STRING);
Assert.assertTrue(testUnit.handles(Boolean.class, unparsedCommandParameterPiece));
}
@Test
public void testWrongCondition() {
Assert.assertFalse(testUnit.handles(String.class));
Assert.assertFalse(testUnit.handles(String.class, unparsedCommandParameterPiece));
}
@Test

View File

@@ -2,6 +2,8 @@ package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -9,6 +11,8 @@ import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class DoubleParameterHandlerImplTest extends AbstractParameterHandlerTest {
@@ -21,14 +25,18 @@ public class DoubleParameterHandlerImplTest extends AbstractParameterHandlerTest
@Mock
private Command command;
@Mock
private UnparsedCommandParameterPiece unparsedCommandParameterPiece;
@Test
public void testSuccessfulCondition() {
Assert.assertTrue(testUnit.handles(Double.class));
when(unparsedCommandParameterPiece.getType()).thenReturn(ParameterPieceType.STRING);
Assert.assertTrue(testUnit.handles(Double.class, unparsedCommandParameterPiece));
}
@Test
public void testWrongCondition() {
Assert.assertFalse(testUnit.handles(String.class));
Assert.assertFalse(testUnit.handles(String.class, unparsedCommandParameterPiece));
}
@Test

View File

@@ -2,6 +2,8 @@ package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import dev.sheldan.abstracto.core.exception.DurationFormatException;
import org.junit.Assert;
import org.junit.Test;
@@ -13,6 +15,8 @@ import org.mockito.junit.MockitoJUnitRunner;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class DurationParameterHandlerImplTest extends AbstractParameterHandlerTest {
@@ -25,14 +29,18 @@ public class DurationParameterHandlerImplTest extends AbstractParameterHandlerTe
@Mock
private Command command;
@Mock
private UnparsedCommandParameterPiece unparsedCommandParameterPiece;
@Test
public void testSuccessfulCondition() {
Assert.assertTrue(testUnit.handles(Duration.class));
when(unparsedCommandParameterPiece.getType()).thenReturn(ParameterPieceType.STRING);
Assert.assertTrue(testUnit.handles(Duration.class, unparsedCommandParameterPiece));
}
@Test
public void testWrongCondition() {
Assert.assertFalse(testUnit.handles(String.class));
Assert.assertFalse(testUnit.handles(String.class, unparsedCommandParameterPiece));
}
@Test

View File

@@ -2,6 +2,7 @@ package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import net.dv8tion.jda.api.entities.Emote;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Message;
@@ -41,17 +42,20 @@ public class EmoteParameterHandlerImplTest extends AbstractParameterHandlerTest
@Mock
private Command command;
@Mock
private UnparsedCommandParameterPiece unparsedCommandParameterPiece;
private static final Long EMOTE_ID = 111111111111111111L;
private static final String EMOTE_NAME = "test";
@Test
public void testSuccessfulCondition() {
Assert.assertTrue(testUnit.handles(Emote.class));
Assert.assertTrue(testUnit.handles(Emote.class, unparsedCommandParameterPiece));
}
@Test
public void testWrongCondition() {
Assert.assertFalse(testUnit.handles(String.class));
Assert.assertFalse(testUnit.handles(String.class, unparsedCommandParameterPiece));
}
@Test

View File

@@ -54,14 +54,17 @@ public class FullEmoteParameterHandlerImplImplTest extends AbstractParameterHand
@Mock
private Command command;
@Mock
private UnparsedCommandParameterPiece unparsedCommandParameterPiece;
@Test
public void testSuccessfulCondition() {
Assert.assertTrue(testUnit.handles(FullEmote.class));
Assert.assertTrue(testUnit.handles(FullEmote.class, unparsedCommandParameterPiece));
}
@Test
public void testWrongCondition() {
Assert.assertFalse(testUnit.handles(String.class));
Assert.assertFalse(testUnit.handles(String.class, unparsedCommandParameterPiece));
}
@Test

View File

@@ -54,14 +54,17 @@ public class FullRoleParameterHandlerImplImplTest extends AbstractParameterHandl
@Mock
private Command command;
@Mock
private UnparsedCommandParameterPiece unparsedCommandParameterPiece;
@Test
public void testSuccessfulCondition() {
Assert.assertTrue(testUnit.handles(FullRole.class));
Assert.assertTrue(testUnit.handles(FullRole.class, unparsedCommandParameterPiece));
}
@Test
public void testWrongCondition() {
Assert.assertFalse(testUnit.handles(String.class));
Assert.assertFalse(testUnit.handles(String.class, unparsedCommandParameterPiece));
}
@Test

View File

@@ -2,6 +2,8 @@ package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -9,6 +11,8 @@ import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class IntegerParameterHandlerImplTest extends AbstractParameterHandlerTest {
@@ -21,14 +25,18 @@ public class IntegerParameterHandlerImplTest extends AbstractParameterHandlerTes
@Mock
private Command command;
@Mock
private UnparsedCommandParameterPiece unparsedCommandParameterPiece;
@Test
public void testSuccessfulCondition() {
Assert.assertTrue(testUnit.handles(Integer.class));
when(unparsedCommandParameterPiece.getType()).thenReturn(ParameterPieceType.STRING);
Assert.assertTrue(testUnit.handles(Integer.class, unparsedCommandParameterPiece));
}
@Test
public void testWrongCondition() {
Assert.assertFalse(testUnit.handles(String.class));
Assert.assertFalse(testUnit.handles(String.class, unparsedCommandParameterPiece));
}
@Test

View File

@@ -2,6 +2,8 @@ package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -9,6 +11,8 @@ import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class LongParameterHandlerImplTest extends AbstractParameterHandlerTest {
@@ -21,14 +25,18 @@ public class LongParameterHandlerImplTest extends AbstractParameterHandlerTest {
@Mock
private Command command;
@Mock
private UnparsedCommandParameterPiece unparsedCommandParameterPiece;
@Test
public void testSuccessfulCondition() {
Assert.assertTrue(testUnit.handles(Long.class));
when(unparsedCommandParameterPiece.getType()).thenReturn(ParameterPieceType.STRING);
Assert.assertTrue(testUnit.handles(Long.class, unparsedCommandParameterPiece));
}
@Test
public void testWrongCondition() {
Assert.assertFalse(testUnit.handles(String.class));
Assert.assertFalse(testUnit.handles(String.class, unparsedCommandParameterPiece));
}
@Test

View File

@@ -2,7 +2,7 @@ package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.exception.AbstractoTemplatedException;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
@@ -47,16 +47,19 @@ public class MemberParameterHandlerImplTest extends AbstractParameterHandlerTest
@Mock
private Command command;
@Mock
private UnparsedCommandParameterPiece unparsedCommandParameterPiece;
private static final Long USER_ID = 111111111111111111L;
@Test
public void testSuccessfulCondition() {
Assert.assertTrue(testUnit.handles(Member.class));
Assert.assertTrue(testUnit.handles(Member.class, unparsedCommandParameterPiece));
}
@Test
public void testWrongCondition() {
Assert.assertFalse(testUnit.handles(String.class));
Assert.assertFalse(testUnit.handles(String.class, unparsedCommandParameterPiece));
}
@Test

View File

@@ -3,6 +3,8 @@ package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.exception.AbstractoTemplatedException;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.Role;
@@ -44,16 +46,20 @@ public class RoleParameterHandlerImplTest extends AbstractParameterHandlerTest {
@Mock
private Command command;
@Mock
private UnparsedCommandParameterPiece unparsedCommandParameterPiece;
private static final Long ROLE_ID = 111111111111111111L;
@Test
public void testSuccessfulCondition() {
Assert.assertTrue(testUnit.handles(Role.class));
when(unparsedCommandParameterPiece.getType()).thenReturn(ParameterPieceType.STRING);
Assert.assertTrue(testUnit.handles(Role.class, unparsedCommandParameterPiece));
}
@Test
public void testWrongCondition() {
Assert.assertFalse(testUnit.handles(String.class));
Assert.assertFalse(testUnit.handles(String.class, unparsedCommandParameterPiece));
}
@Test

View File

@@ -3,6 +3,8 @@ package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.exception.AbstractoTemplatedException;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.TextChannel;
@@ -44,16 +46,20 @@ public class TextChannelParameterHandlerImplTest extends AbstractParameterHandle
@Mock
private Command command;
@Mock
private UnparsedCommandParameterPiece unparsedCommandParameterPiece;
private static final Long CHANNEL_ID = 111111111111111111L;
@Test
public void testSuccessfulCondition() {
Assert.assertTrue(testUnit.handles(TextChannel.class));
when(unparsedCommandParameterPiece.getType()).thenReturn(ParameterPieceType.STRING);
Assert.assertTrue(testUnit.handles(TextChannel.class, unparsedCommandParameterPiece));
}
@Test
public void testWrongCondition() {
Assert.assertFalse(testUnit.handles(String.class));
Assert.assertFalse(testUnit.handles(String.class, unparsedCommandParameterPiece));
}
@Test

View File

@@ -9,7 +9,7 @@ import net.dv8tion.jda.api.entities.Message;
import java.util.concurrent.CompletableFuture;
public interface CommandParameterHandler {
boolean handles(Class clazz);
boolean handles(Class clazz, UnparsedCommandParameterPiece value);
default boolean async() { return false; }
default Object handle(UnparsedCommandParameterPiece input, CommandParameterIterators iterators, Parameter param, Message context, Command command) { return new Object();}
default CompletableFuture<Object> handleAsync(UnparsedCommandParameterPiece input, CommandParameterIterators iterators, Parameter param, Message context, Command command) { return CompletableFuture.completedFuture(null); }