diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java index 65b8989..5cb0485 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java @@ -1,6 +1,7 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger; import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.InputConfig; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validation.ValidationExecutionStrategy; import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.CachedMkvFileProcessor; import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.kernel.AttributeUpdaterKernel; import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.kernel.CoherentAttributeUpdaterKernel; @@ -35,7 +36,10 @@ public class Main implements Runnable { if (args.length == 0) { args = new String[] { "--help" }; } - new CommandLine(Main.class).execute(args); + + new CommandLine(Main.class) + .setExecutionStrategy(new ValidationExecutionStrategy()) + .execute(args); } @Override diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/InputConfig.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/InputConfig.java index 5790724..e0f70c0 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/InputConfig.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/InputConfig.java @@ -4,6 +4,7 @@ import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validation.ValidFile; import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validation.ValidMkvToolNix; import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.AttributeConfig; import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.MkvToolNix; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.util.FileUtils; import at.pcgamingfreaks.mkvaudiosubtitlechanger.util.ValidationUtil; import jakarta.validation.ConstraintViolation; import jakarta.validation.Validator; @@ -108,20 +109,6 @@ public class InputConfig { public static void setInstance(InputConfig c) { config = c; - validate(); - } - - private static void validate() { - Validator validator = ValidationUtil.getValidator(); - Set> violations = validator.validate(config); - - if (!violations.isEmpty()) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation violation : violations) { - errors.append(violation.getPropertyPath()).append(" ").append(violation.getMessage()).append("\n"); - } - throw new CommandLine.ParameterException(config.getSpec().commandLine(), errors.toString()); - } } /** @@ -129,13 +116,7 @@ public class InputConfig { * @return absolute path to desired application. */ public String getPathFor(MkvToolNix application) { - return mkvToolNix.getAbsolutePath().endsWith("/") - ? mkvToolNix.getAbsolutePath() + application - : mkvToolNix.getAbsolutePath() + "/" + application; - } - - public String getPathFor(MkvToolNix application, boolean isWindows) { - return getPathFor(application) + (isWindows ? ".exe" : ""); + return FileUtils.getPathFor(mkvToolNix, application).getAbsolutePath(); } public String getNormalizedLibraryPath() { diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validation/ValidMkvToolNixValidator.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validation/ValidMkvToolNixValidator.java index 2396010..6463a6e 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validation/ValidMkvToolNixValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validation/ValidMkvToolNixValidator.java @@ -1,14 +1,12 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validation; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.InputConfig; import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.MkvToolNix; import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; -import org.apache.commons.lang3.SystemUtils; - import java.io.File; -import java.nio.file.Path; + +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.FileUtils.getPathFor; public class ValidMkvToolNixValidator implements ConstraintValidator { @Override @@ -18,7 +16,9 @@ public class ValidMkvToolNixValidator implements ConstraintValidator> violations = validator.validate(((Main)spec.userObject()).getConfig()); + + if (!violations.isEmpty()) { + StringBuilder errors = new StringBuilder(); + for (ConstraintViolation violation : violations) { + errors.append(violation.getPropertyPath()).append(" ").append(violation.getMessage()).append("\n"); + } + throw new CommandLine.ParameterException(spec.commandLine(), errors.toString()); + } + } +} diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/FileUtils.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/FileUtils.java new file mode 100644 index 0000000..0dc7d1d --- /dev/null +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/FileUtils.java @@ -0,0 +1,21 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.util; + +import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.MkvToolNix; +import org.apache.commons.lang3.SystemUtils; + +import java.io.File; +import java.nio.file.Path; + +public class FileUtils { + private static final boolean isWindows = SystemUtils.IS_OS_WINDOWS; + + private static String expandPath(File dir, MkvToolNix application) { + return dir.getAbsolutePath().endsWith("/") + ? dir.getAbsolutePath() + application + : dir.getAbsolutePath() + "/" + application; + } + + public static File getPathFor(File dir, MkvToolNix application) { + return Path.of(expandPath(dir, application) + (isWindows ? ".exe" : "")).toFile(); + } +} diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/InputConfigTest.java similarity index 52% rename from src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigTest.java rename to src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/InputConfigTest.java index 0027f85..68885b6 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/InputConfigTest.java @@ -1,15 +1,25 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.Main; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validation.ValidationExecutionStrategy; import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.AttributeConfig; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import picocli.CommandLine; +import java.io.PrintWriter; +import java.io.StringWriter; import java.util.List; +import java.util.stream.Stream; import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.PathUtils.TEST_FILE; +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.TestUtil.args; import static org.junit.jupiter.api.Assertions.*; -class ConfigTest { +class InputConfigTest { + private static final String TEST_INVALID_DIR = "src/test/resources/test-dir"; @Test void initConfig() { @@ -42,4 +52,31 @@ class ConfigTest { assertNull(InputConfig.getInstance().getConfigPath()); } + + + private static Stream jakartaValidationData() { + return Stream.of( + Arguments.of(new String[]{"-l", "/arstarstarst", "-a", "jpn:ger"}, "libraryPath does not exist"), + Arguments.of(args("-m", TEST_INVALID_DIR), "mkvToolNix does not exist"), + Arguments.of(args("-t", "0"), "threads must be greater than or equal to 1"), + Arguments.of(args("-t", "-1"), "threads must be greater than or equal to 1"), + Arguments.of(args("-c", "-1"), "coherent must be greater than or equal to 0") + ); + } + + @ParameterizedTest + @MethodSource("jakartaValidationData") + void testJakartaValidation(String[] args, String expectedMessage) { + InputConfig.getInstance(true); + StringWriter writer = new StringWriter(); + PrintWriter printWriter = new PrintWriter(writer); + + new CommandLine(Main.class) + .setExecutionStrategy(new ValidationExecutionStrategy()) + .setErr(printWriter) + .execute(args); + + printWriter.flush(); + assertTrue(writer.toString().contains(expectedMessage)); + } } \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/AttributeConfigTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/AttributeConfigTest.java similarity index 97% rename from src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/AttributeConfigTest.java rename to src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/AttributeConfigTest.java index 5c31c2f..dcfe5ed 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/AttributeConfigTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/AttributeConfigTest.java @@ -1,4 +1,4 @@ -package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.fields; import at.pcgamingfreaks.mkvaudiosubtitlechanger.Main; import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.AttributeConfig; diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/BooleanConfigParameterTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/BooleanConfigParameterTest.java similarity index 93% rename from src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/BooleanConfigParameterTest.java rename to src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/BooleanConfigParameterTest.java index a3b163f..46ef8fb 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/BooleanConfigParameterTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/BooleanConfigParameterTest.java @@ -1,6 +1,7 @@ -package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.fields; import at.pcgamingfreaks.mkvaudiosubtitlechanger.Main; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.InputConfig; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/IntegerConfigParameterTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/IntegerConfigParameterTest.java similarity index 78% rename from src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/IntegerConfigParameterTest.java rename to src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/IntegerConfigParameterTest.java index f0d763c..6c0e8c7 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/IntegerConfigParameterTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/IntegerConfigParameterTest.java @@ -1,6 +1,7 @@ -package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.fields; import at.pcgamingfreaks.mkvaudiosubtitlechanger.Main; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.InputConfig; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -38,13 +39,5 @@ class IntegerConfigParameterTest { Main sut = new Main(); assertThrows(CommandLine.MissingParameterException.class, () -> CommandLine.populateCommand(sut, args("-t"))); assertThrows(CommandLine.MissingParameterException.class, () -> CommandLine.populateCommand(sut, args("--threads"))); - - StringWriter writer = new StringWriter(); - PrintWriter printWriter = new PrintWriter(writer); - CommandLine underTest = new CommandLine(sut); - underTest = underTest.setErr(printWriter); - underTest.execute(args("-t", "0")); - printWriter.flush(); - assertTrue(writer.toString().contains("threads must be greater than or equal to 1")); } } \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/MkvToolNixPathConfigParameterTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/MkvToolNixPathConfigParameterTest.java similarity index 87% rename from src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/MkvToolNixPathConfigParameterTest.java rename to src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/MkvToolNixPathConfigParameterTest.java index b4107c3..ddfd49a 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/MkvToolNixPathConfigParameterTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/MkvToolNixPathConfigParameterTest.java @@ -1,6 +1,7 @@ -package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.fields; import at.pcgamingfreaks.mkvaudiosubtitlechanger.Main; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.InputConfig; import org.apache.commons.lang3.SystemUtils; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -18,7 +19,6 @@ import static org.junit.jupiter.api.Assertions.*; class MkvToolNixPathConfigParameterTest { - private static final String TEST_INVALID_DIR = "src/test/resources/test-dir"; private static final String TEST_MKVTOOLNIX_DIR = SystemUtils.IS_OS_WINDOWS ? "src/test/resources/mkvtoolnix_exe" : "src/test/resources/mkvtoolnix"; private static Stream provideTestCases() { @@ -39,7 +39,6 @@ class MkvToolNixPathConfigParameterTest { @Test void validate() { Main sut = new Main(); -// assertThrows(CommandLine.ParameterException.class, () -> new CommandLine(sut).execute(args("-m", TEST_INVALID_DIR))); assertThrows(CommandLine.ParameterException.class, () -> CommandLine.populateCommand(sut, args("-m"))); assertThrows(CommandLine.ParameterException.class, () -> CommandLine.populateCommand(sut, args(""))); } diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/PathConfigParameterTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/PathConfigParameterTest.java similarity index 94% rename from src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/PathConfigParameterTest.java rename to src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/PathConfigParameterTest.java index 9fc6745..bef4a85 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/PathConfigParameterTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/PathConfigParameterTest.java @@ -1,6 +1,7 @@ -package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.fields; import at.pcgamingfreaks.mkvaudiosubtitlechanger.Main; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.InputConfig; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/PatternConfigParameterTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/PatternConfigParameterTest.java similarity index 92% rename from src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/PatternConfigParameterTest.java rename to src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/PatternConfigParameterTest.java index 485d344..d47f2de 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/PatternConfigParameterTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/PatternConfigParameterTest.java @@ -1,6 +1,7 @@ -package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.fields; import at.pcgamingfreaks.mkvaudiosubtitlechanger.Main; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.InputConfig; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/SetConfigParameterTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/SetConfigParameterTest.java similarity index 95% rename from src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/SetConfigParameterTest.java rename to src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/SetConfigParameterTest.java index 6da7438..986f3be 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/SetConfigParameterTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/fields/SetConfigParameterTest.java @@ -1,6 +1,7 @@ -package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.fields; import at.pcgamingfreaks.mkvaudiosubtitlechanger.Main; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.InputConfig; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments;