diff --git a/sample-jar/Makefile b/sample-jar/Makefile new file mode 100644 index 0000000..be11926 --- /dev/null +++ b/sample-jar/Makefile @@ -0,0 +1,8 @@ +sample.jar: classes/a/A.class + jar -c -f $@ $^ + +classes/a/A.class: src/a/A.java + javac -d classes src/a/A.java + +clean: + rm -rf classes diff --git a/sample-jar/classes/a/A.class b/sample-jar/classes/a/A.class new file mode 100644 index 0000000..ea6785d Binary files /dev/null and b/sample-jar/classes/a/A.class differ diff --git a/sample-jar/sample.jar b/sample-jar/sample.jar new file mode 100644 index 0000000..03c5af9 Binary files /dev/null and b/sample-jar/sample.jar differ diff --git a/sample-jar/src/a/A.java b/sample-jar/src/a/A.java new file mode 100644 index 0000000..e367656 --- /dev/null +++ b/sample-jar/src/a/A.java @@ -0,0 +1,3 @@ +package a; + +public class A {} diff --git a/src/main/java/no/ion/jhms/modularizer/ModuleDescription.java b/src/main/java/no/ion/jhms/modularizer/ModuleDescription.java index 9ab52ff..9b72e9d 100644 --- a/src/main/java/no/ion/jhms/modularizer/ModuleDescription.java +++ b/src/main/java/no/ion/jhms/modularizer/ModuleDescription.java @@ -26,6 +26,11 @@ public Options setJarPath(Path path) { public PrintStream out() { return out; } } + /** + * Writes a description of the modular JAR given by {@link Options#jarPath()}. + * + * @throws ErrorException if jar file is not a module + */ public static void describeModule(PrintStream out, Options options) { new ModuleDescription(out, options).describe(); } diff --git a/src/test/java/no/ion/jhms/modularizer/ModuleUpdaterTest.java b/src/test/java/no/ion/jhms/modularizer/ModuleUpdaterTest.java index d28df11..cf0c5fc 100644 --- a/src/test/java/no/ion/jhms/modularizer/ModuleUpdaterTest.java +++ b/src/test/java/no/ion/jhms/modularizer/ModuleUpdaterTest.java @@ -1,17 +1,59 @@ package no.ion.jhms.modularizer; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; -import java.lang.module.ModuleDescriptor; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.nio.file.Path; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; class ModuleUpdaterTest { + private final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + private final PrintStream printStream = new PrintStream(baos); + private Path path; + + @TempDir + Path tmpDirectory; + + @BeforeEach + void setUp() { + path = tmpDirectory.resolve("sample.jar"); + } + @Test - public void addModuleInfoClass() { - ModuleInfoClassReader reader = ModuleInfoClassReader.open(Path.of("src/test/resources/min-descriptor/module-info.class")); - ModuleInfoClass moduleInfoClass = reader.parse(); + public void verifyUpdate() throws IOException { + Files.copy(Path.of("sample-jar/sample.jar"), path); + + var describeOptions = new ModuleDescription.Options().setJarPath(path); + try { + ModuleDescription.describeModule(printStream, describeOptions); + fail(); + } catch (ErrorException e) { + assertTrue(e.getMessage().startsWith("error: no module declaration found:"), e::getMessage); + assertTrue(e.getMessage().endsWith("/sample.jar")); + } + assertEquals("", output()); + + var updateOptions = new ModuleUpdater.Options() + .setJarPath(path) + .setModuleName("module.name"); + ModuleUpdater.update(printStream, updateOptions); + assertEquals("", output()); + } + + private String getDeclaration() { + + } + + private String output() { + return baos.toString(StandardCharsets.UTF_8); } }