diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java index 83c6231..7d85a52 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java @@ -32,9 +32,13 @@ public class Config { private File configPath; + @CommandLine.Spec + CommandLine.Model.CommandSpec spec; + @CommandLine.Option(names = {"-a", "--attribute-config"}, required = true, arity = "1..*", converter = AttributeConfigConverter.class) private List attributeConfig; - @CommandLine.Option(names = {"-l", "--library"}, required = true, description = "path to library") + + @Setter(AccessLevel.NONE) private File libraryPath; @CommandLine.Option(names = {"-s", "--safemode"}, description = "test run (no files will be changes)") @@ -74,6 +78,12 @@ public class Config { private Set preferredSubtitles = new HashSet<>(Arrays.asList("unstyled")); + @CommandLine.Option(names = {"-l", "--library"}, required = true, description = "path to library") + public void setLibraryPath(File libraryPath) { + this.libraryPath = libraryPath; + if (!libraryPath.exists()) throw new CommandLine.ParameterException(spec.commandLine(), "Path does not exist: " + libraryPath.getAbsolutePath()); + } + public static Config getInstance() { return getInstance(false); } diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/PathConfigParameterTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/PathConfigParameterTest.java new file mode 100644 index 0000000..1cb778b --- /dev/null +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/PathConfigParameterTest.java @@ -0,0 +1,68 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; + +import at.pcgamingfreaks.mkvaudiosubtitlechanger.Main; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.Options; +import org.junit.jupiter.api.BeforeAll; +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.File; +import java.nio.file.Path; +import java.util.function.Function; +import java.util.stream.Stream; + +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.LIBRARY; +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.CommandLineOptionsUtil.optionOf; +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.PathUtils.TEST_DIR; +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.PathUtils.TEST_FILE; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class PathConfigParameterTest { + private static CommandLineParser parser; + private static Options options; + + @BeforeAll + static void before() { + parser = new DefaultParser(); + options = new Options(); + options.addOption(optionOf(LIBRARY, LIBRARY.abrv(), LIBRARY.args())); + } + + private static Stream provideTestCases() { + return Stream.of( + Arguments.of(args("-l", TEST_DIR), Path.of(TEST_DIR).toFile(), true, (Function) Config::getLibraryPath), + Arguments.of(args("-l", TEST_FILE), Path.of(TEST_FILE).toFile(), true, (Function) Config::getLibraryPath) + ); + } + + @ParameterizedTest + @MethodSource("provideTestCases") + void validate(String[] cmdArgs, File expected, boolean exists, Function fieldUnderTest) { + Main sut = new Main(); + CommandLine.populateCommand(sut, cmdArgs); + assertEquals(expected.getAbsolutePath(), fieldUnderTest.apply(sut.getConfig()).getAbsolutePath()); + assertEquals(exists, fieldUnderTest.apply(sut.getConfig()).exists()); + } + + @Test + void validate() { + Main sut = new Main(); + assertThrows(CommandLine.ParameterException.class, () -> CommandLine.populateCommand(sut, args("-l", "arst"))); + assertThrows(CommandLine.MissingParameterException.class, () -> CommandLine.populateCommand(sut, args("-l"))); + assertThrows(CommandLine.UnmatchedArgumentException.class, () -> CommandLine.populateCommand(sut, args(""))); + } + + private static String[] args(String... args) { + String[] staticArray = new String[]{"-a", "ger:ger"}; + String[] result = new String[staticArray.length + args.length]; + System.arraycopy(staticArray, 0, result, 0, staticArray.length); + System.arraycopy(args, 0, result, staticArray.length, args.length); + return result; + } +} \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/PatternConfigParameterTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/PatternConfigParameterTest.java new file mode 100644 index 0000000..569de48 --- /dev/null +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/PatternConfigParameterTest.java @@ -0,0 +1,57 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; + +import at.pcgamingfreaks.mkvaudiosubtitlechanger.Main; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.Options; +import org.junit.jupiter.api.BeforeAll; +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.util.function.Function; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.INCLUDE_PATTERN; +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.CommandLineOptionsUtil.optionOf; +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.TestUtil.args; +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.TestUtil.argumentsOf; +import static org.junit.jupiter.api.Assertions.*; + +class PatternConfigParameterTest { + private static CommandLineParser parser; + private static Options options; + + @BeforeAll + static void before() { + parser = new DefaultParser(); + options = new Options(); + options.addOption(optionOf(INCLUDE_PATTERN, INCLUDE_PATTERN.abrv(), INCLUDE_PATTERN.args())); + } + + private static Stream provideTestCases() { + return Stream.of( + Arguments.of(args("-i", "[abd]?.*"), Pattern.compile("[abd]?.*"), (Function) Config::getIncludePattern), + Arguments.of(args("-i", ".*"), Pattern.compile(".*"), (Function) Config::getIncludePattern), + Arguments.of(args(), Pattern.compile(".*"), (Function) Config::getIncludePattern) + ); + } + + @ParameterizedTest + @MethodSource("provideTestCases") + void validate(String[] cmdArgs, Pattern expected, Function fieldUnderTest) { + Main sut = new Main(); + CommandLine.populateCommand(sut, cmdArgs); + assertEquals(expected.pattern(), fieldUnderTest.apply(sut.getConfig()).pattern()); + } + + @Test + void validate() { + Main sut = new Main(); + assertThrows(CommandLine.MissingParameterException.class, () -> CommandLine.populateCommand(sut, args("-i"))); + assertThrows(CommandLine.ParameterException.class, () -> CommandLine.populateCommand(sut, args("-i", "["))); + } +} \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PathValidatorTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PathValidatorTest.java deleted file mode 100644 index b3e710a..0000000 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PathValidatorTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator; - -import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty; -import at.pcgamingfreaks.yaml.YAML; -import at.pcgamingfreaks.yaml.YamlInvalidContentException; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import java.io.File; -import java.util.stream.Stream; - -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult.*; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult.INVALID; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.LIBRARY; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.CommandLineOptionsUtil.optionOf; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.PathUtils.TEST_DIR; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.PathUtils.TEST_FILE; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.TestUtil.argumentsOf; -import static org.junit.jupiter.api.Assertions.*; - -class PathValidatorTest { - private static CommandLineParser parser; - private static Options options; - - @BeforeAll - static void before() { - parser = new DefaultParser(); - options = new Options(); - options.addOption(optionOf(LIBRARY, LIBRARY.abrv(), LIBRARY.args())); - } - - private static Stream provideTestCases() { - return Stream.of( - argumentsOf(LIBRARY, false, null, "library-path: " + TEST_DIR, new String[]{}, VALID), - argumentsOf(LIBRARY, true, null, "", new String[]{"-l", TEST_FILE}, VALID), - - argumentsOf(LIBRARY, false, TEST_DIR, "", new String[]{}, DEFAULT), - argumentsOf(LIBRARY, true, TEST_FILE, "", new String[]{}, DEFAULT), - argumentsOf(LIBRARY, true, null, "", new String[]{}, MISSING), - argumentsOf(LIBRARY, false, null, "", new String[]{}, NOT_PRESENT), - - argumentsOf(LIBRARY, true, null, "", new String[]{"-l", TEST_DIR + "/invalid"}, INVALID), - argumentsOf(LIBRARY, false, null, "library-path: " + TEST_DIR + "/invalid", new String[]{}, INVALID), - argumentsOf(LIBRARY, true, TEST_DIR, "", new String[]{"-l", TEST_DIR + "/invalid"}, INVALID) - ); - } - - @ParameterizedTest - @MethodSource("provideTestCases") - void validate(ConfigProperty property, boolean required, File defaultValue, String yamlArgs, String[] cmdArgs, - ValidationResult expectedResult) throws ParseException, YamlInvalidContentException { - PathValidator underTest = new PathValidator(property, required, defaultValue); - - ValidationResult result = underTest.validate(new YAML(yamlArgs), parser.parse(options, cmdArgs)); - - assertEquals(expectedResult, result); - } -} \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PatternValidatorTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PatternValidatorTest.java deleted file mode 100644 index cae1059..0000000 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PatternValidatorTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator; - -import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty; -import at.pcgamingfreaks.yaml.YAML; -import at.pcgamingfreaks.yaml.YamlInvalidContentException; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import java.util.regex.Pattern; -import java.util.stream.Stream; - -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult.*; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult.INVALID; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.INCLUDE_PATTERN; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.CommandLineOptionsUtil.optionOf; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.TestUtil.argumentsOf; -import static org.junit.jupiter.api.Assertions.*; - -class PatternValidatorTest { - private static CommandLineParser parser; - private static Options options; - - @BeforeAll - static void before() { - parser = new DefaultParser(); - options = new Options(); - options.addOption(optionOf(INCLUDE_PATTERN, INCLUDE_PATTERN.abrv(), INCLUDE_PATTERN.args())); - } - - private static Stream provideTestCases() { - return Stream.of( - argumentsOf(INCLUDE_PATTERN, false, null, "include-pattern: \"[abd]?.*\"", new String[]{}, VALID), - argumentsOf(INCLUDE_PATTERN, true, null, "", new String[]{"-i", "[abd]?.*"}, VALID), - - argumentsOf(INCLUDE_PATTERN, false, Pattern.compile(".*"), "", new String[]{}, DEFAULT), - argumentsOf(INCLUDE_PATTERN, true, Pattern.compile(".*"), "", new String[]{}, DEFAULT), - - argumentsOf(INCLUDE_PATTERN, true, null, "", new String[]{}, MISSING), - argumentsOf(INCLUDE_PATTERN, false, null, "", new String[]{}, NOT_PRESENT), - - argumentsOf(INCLUDE_PATTERN, true, null, "", new String[]{"-i", "?."}, INVALID), - argumentsOf(INCLUDE_PATTERN, false, null, "include-pattern: \"[arst*\"", new String[]{}, INVALID), - argumentsOf(INCLUDE_PATTERN, true, Pattern.compile(".?"), "", new String[]{"-i", "?."}, INVALID) - ); - } - - @ParameterizedTest - @MethodSource("provideTestCases") - void validate(ConfigProperty property, boolean required, Pattern defaultValue, String yamlArgs, String[] cmdArgs, - ValidationResult expectedResult) throws ParseException, YamlInvalidContentException { - PatternValidator underTest = new PatternValidator(property, required, defaultValue); - - ValidationResult result = underTest.validate(new YAML(yamlArgs), parser.parse(options, cmdArgs)); - - assertEquals(expectedResult, result); - } -} \ No newline at end of file