@Override
        public @NonNull CompletableFuture<ArgumentParseResult<@NonNull Monkey>> parseFuture(
                final @NonNull CommandContext<@NonNull TestCommandSender> commandContext,
                final @NonNull CommandInput commandInput
        ) {
            if (commandInput.remainingTokens() < 3) {
                return ArgumentParseResult.failureFuture(new IllegalArgumentException("Needs: name, fruit, age"));
            }
            final String name = commandInput.readString();
            final Fruit favoriteFruit = Fruit.valueOf(commandInput.readString().toUpperCase(Locale.ROOT));
            if (!commandInput.isValidInteger(0, Integer.MAX_VALUE)) {
                return ArgumentParseResult.failureFuture(new IllegalArgumentException(
                        commandInput.peekString() + " is not a valid age"));
            }
            final int age = commandInput.readInteger();
            return ArgumentParseResult.successFuture(new Monkey(name, favoriteFruit, age));
        }
Test for parsers that consume multiple tokens.
cloud-core/src/test/java/org/incendo/cloud/feature/MultiTokenParserTest.java