Skip to content

Commit e802ee7

Browse files
committed
Add real fixture probe and validation coverage
Add parameterized facade tests that run against real example media files to verify detected mime type, extension, media type, and strict validation success. Include shared fixture expectations and example resources to improve regression coverage across audio, video, and image formats, plus new round-trip conversion test scaffolding.
1 parent 6d9a9ca commit e802ee7

11 files changed

+142
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ CodecMedia is a Java library for media probing, validation, metadata sidecar per
1212
<img src="https://codecmedia.tamkungz.me/CodecMedia_Full_Logo.png" width="70%" alt="CodecMedia Logo">
1313
</p>
1414

15-
## Approaches:
15+
## Approaches
1616
- Zero-Dependency
1717
- Self-Contained
1818
- Multi-Platform

src/test/java/me/tamkungz/codecmedia/CodecMediaFacadeTest.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.nio.file.Files;
66
import java.nio.file.Path;
77
import java.util.Map;
8+
import java.util.stream.Stream;
89

910
import javax.imageio.ImageIO;
1011

@@ -13,15 +14,53 @@
1314
import static org.junit.jupiter.api.Assertions.assertNotNull;
1415
import static org.junit.jupiter.api.Assertions.assertTrue;
1516
import org.junit.jupiter.api.Test;
17+
import org.junit.jupiter.params.ParameterizedTest;
18+
import org.junit.jupiter.params.provider.MethodSource;
1619

1720
class CodecMediaFacadeTest {
1821

22+
private record ExampleFixtureExpectation(
23+
String fileName,
24+
String mimeType,
25+
String extension,
26+
me.tamkungz.codecmedia.model.MediaType mediaType
27+
) {
28+
}
29+
1930
@Test
2031
void createDefault_shouldReturnEngine() {
2132
CodecMediaEngine engine = CodecMedia.createDefault();
2233
assertNotNull(engine);
2334
}
2435

36+
@ParameterizedTest(name = "probe real fixture: {0}")
37+
@MethodSource("exampleFixtures")
38+
void probe_shouldDetectRealExampleFixtures(ExampleFixtureExpectation fixture) throws Exception {
39+
CodecMediaEngine engine = CodecMedia.createDefault();
40+
Path input = Path.of("src/test/resources/example", fixture.fileName());
41+
42+
assertTrue(Files.exists(input));
43+
44+
var result = engine.probe(input);
45+
assertEquals(fixture.mimeType(), result.mimeType());
46+
assertEquals(fixture.extension(), result.extension());
47+
assertEquals(fixture.mediaType(), result.mediaType());
48+
assertTrue(result.tags().containsKey("sizeBytes"));
49+
}
50+
51+
@ParameterizedTest(name = "validate real fixture: {0}")
52+
@MethodSource("exampleFixtures")
53+
void validate_strictShouldAcceptRealExampleFixtures(ExampleFixtureExpectation fixture) throws Exception {
54+
CodecMediaEngine engine = CodecMedia.createDefault();
55+
Path input = Path.of("src/test/resources/example", fixture.fileName());
56+
57+
assertTrue(Files.exists(input));
58+
59+
var result = engine.validate(input, new me.tamkungz.codecmedia.options.ValidationOptions(true, 0));
60+
assertTrue(result.valid());
61+
assertTrue(result.errors().isEmpty());
62+
}
63+
2564
@Test
2665
void probe_shouldDetectMp3ByExtension() throws Exception {
2766
CodecMediaEngine engine = CodecMedia.createDefault();
@@ -705,4 +744,17 @@ private static void deleteDirectory(Path dir) throws IOException {
705744
});
706745
}
707746
}
747+
748+
private static Stream<ExampleFixtureExpectation> exampleFixtures() {
749+
return Stream.of(
750+
new ExampleFixtureExpectation("file_example_MP3_1MG.mp3", "audio/mpeg", "mp3", me.tamkungz.codecmedia.model.MediaType.AUDIO),
751+
new ExampleFixtureExpectation("file_example_MP3_700KB.mp3", "audio/mpeg", "mp3", me.tamkungz.codecmedia.model.MediaType.AUDIO),
752+
new ExampleFixtureExpectation("file_example_MP4_480_1_5MG.mp4", "video/mp4", "mp4", me.tamkungz.codecmedia.model.MediaType.VIDEO),
753+
new ExampleFixtureExpectation("file_example_MP4_640_3MG.mp4", "video/mp4", "mp4", me.tamkungz.codecmedia.model.MediaType.VIDEO),
754+
new ExampleFixtureExpectation("file_example_PNG_1MB.png", "image/png", "png", me.tamkungz.codecmedia.model.MediaType.IMAGE),
755+
new ExampleFixtureExpectation("file_example_PNG_500kB.png", "image/png", "png", me.tamkungz.codecmedia.model.MediaType.IMAGE),
756+
new ExampleFixtureExpectation("file_example_WEBM_480_900KB.webm", "video/webm", "webm", me.tamkungz.codecmedia.model.MediaType.VIDEO),
757+
new ExampleFixtureExpectation("file_example_WEBM_640_1_4MB.webm", "video/webm", "webm", me.tamkungz.codecmedia.model.MediaType.VIDEO)
758+
);
759+
}
708760
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package me.tamkungz.codecmedia;
2+
3+
import java.io.IOException;
4+
import java.nio.file.Files;
5+
import java.nio.file.Path;
6+
import java.util.stream.Stream;
7+
8+
import static org.junit.jupiter.api.Assertions.assertEquals;
9+
import static org.junit.jupiter.api.Assertions.assertFalse;
10+
import static org.junit.jupiter.api.Assertions.assertTrue;
11+
import org.junit.jupiter.params.ParameterizedTest;
12+
import org.junit.jupiter.params.provider.MethodSource;
13+
14+
import me.tamkungz.codecmedia.model.MediaType;
15+
import me.tamkungz.codecmedia.options.ConversionOptions;
16+
17+
class CodecMediaRoundTripConversionTest {
18+
19+
private record FixtureExpectation(
20+
String fileName,
21+
String extension,
22+
String mimeType,
23+
MediaType mediaType
24+
) {
25+
}
26+
27+
@ParameterizedTest(name = "round-trip same extension: {0}")
28+
@MethodSource("exampleFixtures")
29+
void convert_roundTripSameExtension_shouldWorkForAllExampleFixtures(FixtureExpectation fixture) throws Exception {
30+
CodecMediaEngine engine = CodecMedia.createDefault();
31+
Path input = Path.of("src/test/resources/example", fixture.fileName());
32+
Path workDir = Files.createTempDirectory("codecmedia-roundtrip-");
33+
34+
try {
35+
assertTrue(Files.exists(input));
36+
37+
Path firstOutput = workDir.resolve("step1." + fixture.extension());
38+
var first = engine.convert(input, firstOutput, new ConversionOptions(fixture.extension(), "balanced", true));
39+
40+
assertTrue(Files.exists(first.outputFile()));
41+
assertTrue(Files.size(first.outputFile()) > 0);
42+
assertEquals(fixture.extension(), first.format());
43+
assertFalse(first.reencoded());
44+
45+
Path secondOutput = workDir.resolve("step2." + fixture.extension());
46+
var second = engine.convert(first.outputFile(), secondOutput, new ConversionOptions(fixture.extension(), "balanced", true));
47+
48+
assertTrue(Files.exists(second.outputFile()));
49+
assertTrue(Files.size(second.outputFile()) > 0);
50+
assertEquals(fixture.extension(), second.format());
51+
assertFalse(second.reencoded());
52+
53+
var probed = engine.probe(second.outputFile());
54+
assertEquals(fixture.mimeType(), probed.mimeType());
55+
assertEquals(fixture.extension(), probed.extension());
56+
assertEquals(fixture.mediaType(), probed.mediaType());
57+
} finally {
58+
deleteDirectory(workDir);
59+
}
60+
}
61+
62+
private static Stream<FixtureExpectation> exampleFixtures() {
63+
return Stream.of(
64+
new FixtureExpectation("file_example_MP3_1MG.mp3", "mp3", "audio/mpeg", MediaType.AUDIO),
65+
new FixtureExpectation("file_example_MP3_700KB.mp3", "mp3", "audio/mpeg", MediaType.AUDIO),
66+
new FixtureExpectation("file_example_MP4_480_1_5MG.mp4", "mp4", "video/mp4", MediaType.VIDEO),
67+
new FixtureExpectation("file_example_MP4_640_3MG.mp4", "mp4", "video/mp4", MediaType.VIDEO),
68+
new FixtureExpectation("file_example_PNG_1MB.png", "png", "image/png", MediaType.IMAGE),
69+
new FixtureExpectation("file_example_PNG_500kB.png", "png", "image/png", MediaType.IMAGE),
70+
new FixtureExpectation("file_example_WEBM_480_900KB.webm", "webm", "video/webm", MediaType.VIDEO),
71+
new FixtureExpectation("file_example_WEBM_640_1_4MB.webm", "webm", "video/webm", MediaType.VIDEO)
72+
);
73+
}
74+
75+
private static void deleteDirectory(Path dir) throws IOException {
76+
if (!Files.exists(dir)) {
77+
return;
78+
}
79+
try (var walk = Files.walk(dir)) {
80+
walk.sorted((a, b) -> b.compareTo(a)).forEach(path -> {
81+
try {
82+
Files.deleteIfExists(path);
83+
} catch (IOException ignored) {
84+
// ignore cleanup errors in tests
85+
}
86+
});
87+
}
88+
}
89+
}
1.01 MB
Binary file not shown.
716 KB
Binary file not shown.
1.5 MB
Binary file not shown.
2.97 MB
Binary file not shown.
983 KB
Loading
501 KB
Loading
880 KB
Binary file not shown.

0 commit comments

Comments
 (0)