From ca29c22f004aacbe08d6c5cebe7d4364079afa93 Mon Sep 17 00:00:00 2001 From: RatzzFatzz Date: Tue, 16 Dec 2025 02:13:18 +0100 Subject: [PATCH] Add tests for reading attributes --- .../impl/processors/FileProcessor.java | 5 + .../impl/processors/MkvFileProcessor.java | 13 ++- .../impl/processors/MkvFileProcessorTest.java | 92 +++++++++++++++++++ 3 files changed, 103 insertions(+), 7 deletions(-) create mode 100644 src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/MkvFileProcessorTest.java diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/FileProcessor.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/FileProcessor.java index 2123d43..f14e4a7 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/FileProcessor.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/FileProcessor.java @@ -5,6 +5,7 @@ import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileInfo; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.util.List; public interface FileProcessor { @@ -43,4 +44,8 @@ public interface FileProcessor { * @throws MkvToolNixException when error occurs while sending query to mkvpropedit */ void update(FileInfo fileInfo) throws IOException, MkvToolNixException; + + default InputStream run(String[] command) throws IOException { + return Runtime.getRuntime().exec(command).getInputStream(); + } } 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 3000610..479853f 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/MkvFileProcessor.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/MkvFileProcessor.java @@ -1,7 +1,7 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.processors; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.FileFilter; import at.pcgamingfreaks.mkvaudiosubtitlechanger.exceptions.MkvToolNixException; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.FileFilter; import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.*; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; @@ -73,10 +73,10 @@ public class MkvFileProcessor implements FileProcessor { /** * Recursively explores directories to find items at the target depth. * - * @param currentDir The current directory being explored + * @param currentDir The current directory being explored * @param currentDepth The current depth level - * @param targetDepth The target depth to collect files - * @param result The collection to store found files + * @param targetDepth The target depth to collect files + * @param result The collection to store found files */ private static void exploreDirectory(File currentDir, int currentDepth, int targetDepth, List result) { if (currentDepth == targetDepth) { @@ -113,8 +113,7 @@ public class MkvFileProcessor implements FileProcessor { }; log.debug("Executing: {}", String.join(" ", command)); - InputStream inputStream = Runtime.getRuntime().exec(command) - .getInputStream(); + InputStream inputStream = run(command); Map jsonMap = mapper.readValue(inputStream, Map.class); List> tracks = (List>) jsonMap.get("tracks"); if (tracks != null) { @@ -160,7 +159,7 @@ public class MkvFileProcessor implements FileProcessor { changes.getHearingImpairedTrack().forEach((key, value) -> command.addAll(format(HEARING_IMPAIRED_TRACK, key.id(), value ? 1 : 0))); log.debug("Executing '{}'", String.join(" ", command)); - InputStream inputstream = Runtime.getRuntime().exec(command.toArray(new String[0])).getInputStream(); + InputStream inputstream = run(command.toArray(new String[0])); String output = IOUtils.toString(new InputStreamReader(inputstream)); log.debug("Result: {}", output.replaceAll("\\n", " '")); if (output.contains("Error")) throw new MkvToolNixException(output); diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/MkvFileProcessorTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/MkvFileProcessorTest.java new file mode 100644 index 0000000..e8dc9e7 --- /dev/null +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/MkvFileProcessorTest.java @@ -0,0 +1,92 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.processors; + +import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileInfo; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.TrackAttributes; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.TrackType; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; + +@ExtendWith(MockitoExtension.class) +class MkvFileProcessorTest { + + @Test + void readAttributes() throws IOException { + String mkvmergeResponse = """ + { + "tracks": [ + { + "id": 0, + "properties": { + "default_track": true, + "enabled_track": true, + "forced_track": false, + "language": "jpn", + "number": 1 + }, + "type": "video" + }, + { + "id": 1, + "properties": { + "track_name": "testing", + "default_track": true, + "enabled_track": true, + "forced_track": false, + "language": "jpn", + "number": 2 + }, + "type": "audio" + }, + { + "id": 2, + "properties": { + "default_track": true, + "enabled_track": true, + "forced_track": false, + "language": "eng", + "number": 3 + }, + "type": "subtitles" + } + ] + } + """; + + MkvFileProcessor underTest = spy(new MkvFileProcessor(new File("mkvtoolnix"), null)); + doReturn(new ByteArrayInputStream(mkvmergeResponse.getBytes(StandardCharsets.UTF_8))) + .when(underTest).run(any(String[].class)); + + FileInfo result = underTest.readAttributes(new File("arst")); + + TrackAttributes audio = result.getAudioTracks().get(0); + assertEquals(2, audio.id()); + assertEquals("testing", audio.trackName()); + assertEquals("jpn", audio.language()); + assertTrue(audio.defaultt()); + assertFalse(audio.forced()); + assertFalse(audio.hearingImpaired()); + assertFalse(audio.commentary()); + assertEquals(TrackType.AUDIO, audio.type()); + + TrackAttributes sub = result.getSubtitleTracks().get(0); + assertEquals(3, sub.id()); + assertNull(sub.trackName()); + assertEquals("eng", sub.language()); + assertTrue(sub.defaultt()); + assertFalse(sub.forced()); + assertFalse(sub.hearingImpaired()); + assertFalse(sub.commentary()); + assertEquals(TrackType.SUBTITLES, sub.type()); + } +} \ No newline at end of file