From 2ecea906b173a15dd40ab11aa8eab9304a780bbf Mon Sep 17 00:00:00 2001 From: RatzzFatzz Date: Tue, 16 Dec 2025 00:22:10 +0100 Subject: [PATCH] Add tests for attributeupdater --- .../processors/CoherentAttributeUpdater.java | 2 +- .../impl/processors/MkvFileProcessor.java | 2 +- .../model/AttributeConfig.java | 4 + .../model/InputConfig.java | 18 ++-- .../impl/FileFilterTest.java | 3 +- .../CoherentAttributeUpdaterTest.java | 93 +++++++++++++++++++ 6 files changed, 111 insertions(+), 11 deletions(-) create mode 100644 src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/CoherentAttributeUpdaterTest.java diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/CoherentAttributeUpdater.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/CoherentAttributeUpdater.java index 365d87b..b386058 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/CoherentAttributeUpdater.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/CoherentAttributeUpdater.java @@ -61,7 +61,7 @@ public class CoherentAttributeUpdater extends SingleFileAttributeUpdater { if (config.isForceCoherent()) { log.info("No coherent match found, aborting: {}", rootDir.getPath()); - statistic.increaseNoSuitableConfigFoundBy(files.size()); // TODO: should matchedFiles count as already fit config? + statistic.increaseNoSuitableConfigFoundBy(files.size()); return; } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/MkvFileProcessor.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/MkvFileProcessor.java index 62dede4..3000610 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/MkvFileProcessor.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/MkvFileProcessor.java @@ -162,7 +162,7 @@ public class MkvFileProcessor implements FileProcessor { log.debug("Executing '{}'", String.join(" ", command)); InputStream inputstream = Runtime.getRuntime().exec(command.toArray(new String[0])).getInputStream(); String output = IOUtils.toString(new InputStreamReader(inputstream)); - log.debug("Result: {}", output); + log.debug("Result: {}", output.replaceAll("\\n", " '")); if (output.contains("Error")) throw new MkvToolNixException(output); } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/AttributeConfig.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/AttributeConfig.java index a5bc872..45b278e 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/AttributeConfig.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/AttributeConfig.java @@ -13,6 +13,10 @@ public class AttributeConfig { private final String audioLanguage; private final String subtitleLanguage; + public static AttributeConfig of(String audioLanguage, String subtitleLanguage) { + return new AttributeConfig(audioLanguage, subtitleLanguage); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/InputConfig.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/InputConfig.java index 782cf49..d207fb6 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/InputConfig.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/InputConfig.java @@ -51,8 +51,9 @@ public class InputConfig implements CommandLine.IVersionProvider { @Option(names = {"-cf", "--force-coherent"}, description = "only applies changes if a coherent match was found for the specifically entered depth") private boolean forceCoherent; - @Option(names = {"-n", "--only-new-file"}, description = "sets filter-date to last successful execution (overwrites input of filter-date)") - private boolean onlyNewFiles; // TODO: implement usage + // TODO: implement usage +// @Option(names = {"-n", "--only-new-file"}, description = "sets filter-date to last successful execution (overwrites input of filter-date)") +// private boolean onlyNewFiles; @Option(names = {"-d", "--filter-date"}, defaultValue = Option.NULL_VALUE, description = "only consider files created newer than entered date (format: \"dd.MM.yyyy-HH:mm:ss\")") private Date filterDate; @Option(names = {"-i", "--include-pattern"}, defaultValue = ".*", description = "include files matching pattern (default: \".*\")") @@ -92,20 +93,23 @@ public class InputConfig implements CommandLine.IVersionProvider { public String toString() { return new StringJoiner(", ", InputConfig.class.getSimpleName() + "[", "]") .add("configPath=" + configPath) + .add("spec=" + spec) + .add("attributeConfig=" + Arrays.toString(attributeConfig)) .add("libraryPath=" + libraryPath) .add("mkvToolNix=" + mkvToolNix) - .add("threads=" + threads) - .add("includePattern=" + includePattern) .add("safeMode=" + safeMode) + .add("threads=" + threads) .add("coherent=" + coherent) .add("forceCoherent=" + forceCoherent) - .add("onlyNewFiles=" + onlyNewFiles) .add("filterDate=" + filterDate) + .add("includePattern=" + includePattern) + .add("excluded=" + excluded) + .add("overwriteForced=" + overwriteForced) .add("forcedKeywords=" + forcedKeywords) .add("commentaryKeywords=" + commentaryKeywords) - .add("excludedDirectories=" + excluded) + .add("hearingImpaired=" + hearingImpaired) .add("preferredSubtitles=" + preferredSubtitles) - .add("attributeConfig=" + attributeConfig) + .add("debug=" + debug) .toString(); } diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/FileFilterTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/FileFilterTest.java index 1b92cb5..5de4539 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/FileFilterTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/FileFilterTest.java @@ -71,8 +71,7 @@ class FileFilterTest { .when(() -> DateUtils.convert(anyLong())) .thenReturn(new Date(currentTime)); - assertEquals(expectedHit, fileFilter.accept(file, new HashSet<>(args)), "File is accepted"); - assertEquals(total, ResultStatistic.getInstance().getTotal(), "Total files"); + assertEquals(expectedHit, fileFilter.accept(file, new HashSet<>(extensions)), "File is accepted"); assertEquals(total, ResultStatistic.getInstance().total(), "Total files"); assertEquals(excluded, ResultStatistic.getInstance().getExcluded(), "Excluded files"); } diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/CoherentAttributeUpdaterTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/CoherentAttributeUpdaterTest.java new file mode 100644 index 0000000..47aa3e5 --- /dev/null +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/CoherentAttributeUpdaterTest.java @@ -0,0 +1,93 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.processors; + +import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.CommandRunner; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.AttributeConfig; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileInfo; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.InputConfig; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.TrackAttributes; +import org.apache.commons.lang3.tuple.Pair; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import picocli.CommandLine; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.*; +import java.util.stream.Stream; + +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.FileInfoTestUtil.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class CoherentAttributeUpdaterTest { + @Mock(lenient = true) + FileProcessor fileProcessor; + + @Test + void process() { + } + + private static Stream findMatch() { + return Stream.of( + Arguments.of(AttributeConfig.of("ger", "ger"), + List.of(), false, 0), + Arguments.of(AttributeConfig.of("ger", "ger"), + List.of(fileInfoMock("test.mkv", AUDIO_GER, SUB_GER)), true, 1), + Arguments.of(AttributeConfig.of("ger", "ger"), + List.of(fileInfoMock("test.mkv", AUDIO_GER, SUB_GER), + fileInfoMock("test2.mkv", AUDIO_GER, SUB_GER)), true, 2), + Arguments.of(AttributeConfig.of("ger", "ger"), + List.of(fileInfoMock("test.mkv", AUDIO_GER, SUB_GER), + fileInfoMock("test2.mkv", AUDIO_ENG, SUB_ENG)), false, 1), + Arguments.of(AttributeConfig.of("ger", "ger"), + List.of(fileInfoMock("test.mkv", AUDIO_GER, SUB_GER), + fileInfoMock("test2.mkv", AUDIO_GER, SUB_GER), + fileInfoMock("test3.mkv", AUDIO_GER, SUB_GER), + fileInfoMock("test4.mkv", AUDIO_GER, SUB_GER), + fileInfoMock("test5.mkv", AUDIO_ENG, SUB_ENG)), false, 4), + Arguments.of(AttributeConfig.of("ger", "ger"), + List.of(fileInfoMock("test.mkv", AUDIO_GER, SUB_GER), + fileInfoMock("test2.mkv", AUDIO_ENG, SUB_GER), + fileInfoMock("test3.mkv", AUDIO_GER, SUB_GER), + fileInfoMock("test4.mkv", AUDIO_GER, SUB_GER), + fileInfoMock("test5.mkv", AUDIO_GER, SUB_ENG)), false, 1) + ); + } + + @ParameterizedTest + @MethodSource("findMatch") + void findMatch(AttributeConfig attributeConfig, List> fileInfoMock, boolean expectedMatch, int expectedMatchCount) throws InvocationTargetException, IllegalAccessException { + CommandRunner commandRunner = new CommandRunner(); + new CommandLine(commandRunner).parseArgs("-l", "/arst", "-a", "ger:ger"); + InputConfig config = commandRunner.getConfig(); + CoherentAttributeUpdater updater = new CoherentAttributeUpdater(config, fileProcessor); + Set matchedFiles = new HashSet<>(fileInfoMock.size() * 2); + + List files = new ArrayList<>(); + for (Pair pair : fileInfoMock) { + when(fileProcessor.readAttributes(pair.getKey())).thenReturn(pair.getRight()); + files.add(pair.getKey()); + } + + Method underTest = Arrays.stream(updater.getClass().getDeclaredMethods()).filter(m -> "findMatch".equals(m.getName())).findFirst().get(); + underTest.setAccessible(true); + AttributeConfig actualMatch = (AttributeConfig) underTest.invoke(updater, attributeConfig, matchedFiles, files); + + assertEquals(expectedMatch ? attributeConfig : null, actualMatch, "Matched AttributeConfig"); + assertEquals(expectedMatchCount, matchedFiles.size(), "Matched files count"); + } + + private static Pair fileInfoMock(String path, TrackAttributes... tracks) { + File file = new File(path); + FileInfo fileInfo = new FileInfo(file); + fileInfo.addTracks(List.of(tracks)); + return Pair.of(file, fileInfo); + } +} \ No newline at end of file