From de85e6bc6e7ad420f815ea70c9d119419236ff45 Mon Sep 17 00:00:00 2001 From: Mikhail Dzianishchyts Date: Fri, 11 Oct 2024 12:53:10 +0300 Subject: [PATCH 01/11] Upgrade jupyter-jvm-basekernel tests to JUnit 5 --- jupyter-jvm-basekernel/pom.xml | 9 +- .../RenderRequestTypesResolutionTest.java | 72 ++- .../jupyter/kernel/display/RendererTest.java | 468 +++++++++-------- .../kernel/display/mime/MIMETypeTest.java | 67 +-- .../jupyter/kernel/magic/MagicParserTest.java | 46 +- .../kernel/magic/registry/MagicsArgsTest.java | 396 ++++++++++----- .../kernel/magic/registry/MagicsTest.java | 60 ++- .../jupyter/kernel/util/GlobFinderTest.java | 478 ++++++++++++------ .../kernel/util/InheritanceIteratorTest.java | 143 ++++-- pom.xml | 15 +- 10 files changed, 1048 insertions(+), 706 deletions(-) diff --git a/jupyter-jvm-basekernel/pom.xml b/jupyter-jvm-basekernel/pom.xml index 0de849d..0ef627b 100644 --- a/jupyter-jvm-basekernel/pom.xml +++ b/jupyter-jvm-basekernel/pom.xml @@ -22,8 +22,13 @@ - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-params test diff --git a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/RenderRequestTypesResolutionTest.java b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/RenderRequestTypesResolutionTest.java index b7cb0ca..7bfee15 100644 --- a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/RenderRequestTypesResolutionTest.java +++ b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/RenderRequestTypesResolutionTest.java @@ -1,46 +1,21 @@ package org.dflib.jjava.jupyter.kernel.display; import org.dflib.jjava.jupyter.kernel.display.mime.MIMEType; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; import java.util.List; +import java.util.stream.Stream; -import static org.junit.Assert.assertEquals; - -@RunWith(Parameterized.class) public class RenderRequestTypesResolutionTest { - @Parameterized.Parameters - public static Collection data() { - return Arrays.asList(new Object[][]{ - { "image/svg+xml", "image/svg+xml", Collections.singletonList("image/svg+xml") }, - { "image/svg+xml", "image/svg", Collections.singletonList("image/svg") }, - { "image/svg+xml", "image/svg+xml", Collections.singletonList("image/*") }, - { "image/svg+xml", "image/svg+xml", Collections.singletonList("image") }, - { "image/svg+xml", "application/xml", Collections.singletonList("application/xml") }, - { "image/svg+xml", "application/xml", Collections.singletonList("application/*") }, - { "image/svg+xml", "application/xml", Collections.singletonList("application") }, - { "image/svg+xml", "image/svg+xml", Collections.singletonList("*") }, - - { "image/svg", "image/svg", Collections.singletonList("image/svg") }, - - { "image/svg", null, Collections.singletonList("application/xml") }, - { "image/svg+xml", null, Collections.singletonList("application/json") }, - }); - } - - private final MIMEType supported; - private final MIMEType expected; - private final RenderRequestTypes requestTypes; - - public RenderRequestTypesResolutionTest(String supported, String expected, List requestTypes) { - this.supported = supported == null ? null : MIMEType.parse(supported); - this.expected = expected == null ? null : MIMEType.parse(expected); + @ParameterizedTest + @MethodSource("data") + public void test(String supported, String expected, List requestTypes) { + MIMEType supportedMime = MIMEType.parse(supported); + MIMEType expectedMime = expected == null ? null : MIMEType.parse(expected); RenderRequestTypes.Builder builder = new RenderRequestTypes.Builder(group -> { switch (group) { case "xml": @@ -54,13 +29,26 @@ public RenderRequestTypesResolutionTest(String supported, String expected, List< requestTypes.stream() .map(MIMEType::parse) .forEach(builder::withType); - this.requestTypes = builder.build(); - } + RenderRequestTypes renderRequestTypes = builder.build(); - @Test - public void test() { - MIMEType actual = this.requestTypes.resolveSupportedType(this.supported); + MIMEType actualMime = renderRequestTypes.resolveSupportedType(supportedMime); + + Assertions.assertEquals(expectedMime, actualMime); + } - assertEquals(expected, actual); + public static Stream data() { + return Stream.of( + Arguments.of("image/svg+xml", "image/svg+xml", List.of("image/svg+xml")), + Arguments.of("image/svg+xml", "image/svg", List.of("image/svg")), + Arguments.of("image/svg+xml", "image/svg+xml", List.of("image/*")), + Arguments.of("image/svg+xml", "image/svg+xml", List.of("image")), + Arguments.of("image/svg+xml", "application/xml", List.of("application/xml")), + Arguments.of("image/svg+xml", "application/xml", List.of("application/*")), + Arguments.of("image/svg+xml", "application/xml", List.of("application")), + Arguments.of("image/svg+xml", "image/svg+xml", List.of("*")), + Arguments.of("image/svg", "image/svg", List.of("image/svg")), + Arguments.of("image/svg", null, List.of("application/xml")), + Arguments.of("image/svg+xml", null, List.of("application/json")) + ); } -} \ No newline at end of file +} diff --git a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/RendererTest.java b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/RendererTest.java index 534e617..a759d8f 100644 --- a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/RendererTest.java +++ b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/RendererTest.java @@ -1,21 +1,19 @@ package org.dflib.jjava.jupyter.kernel.display; import org.dflib.jjava.jupyter.kernel.display.mime.MIMEType; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashSet; import java.util.Set; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; - -public class RendererTest { +class RendererTest { private Renderer renderer; - @Before + @BeforeEach public void setUp() { this.renderer = new Renderer(); this.renderer.createRegistration(D.class) @@ -49,6 +47,233 @@ public void setUp() { }); } + @Test + void rendersPlainText() { + DisplayData data = this.renderer.render(new A()); + + Assertions.assertEquals("A", data.getData(MIMEType.TEXT_PLAIN)); + } + + @Test + void alwaysRendersPlainText() { + DisplayData data = this.renderer.render(new B()); + + Assertions.assertEquals("B", data.getData(MIMEType.TEXT_PLAIN)); + } + + @Test + void rendersPreferred() { + DisplayData data = this.renderer.render(new B()); + + Assertions.assertEquals("**B**", data.getData(MIMEType.TEXT_MARKDOWN)); + } + + @Test + void rendersJustPreferred() { + DisplayData data = this.renderer.render(new C()); + + Assertions.assertEquals(".c{}", data.getData(MIMEType.TEXT_CSS)); + Assertions.assertEquals("C", data.getData(MIMEType.TEXT_PLAIN)); + Assertions.assertNull(data.getData(MIMEType.TEXT_MARKDOWN)); + } + + @Test + void rendersExternal() { + DisplayData data = this.renderer.render(new D()); + + Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); + Assertions.assertEquals("D", data.getData(MIMEType.TEXT_PLAIN)); + Assertions.assertNull(data.getData(MIMEType.TEXT_LATEX)); + } + + @Test + void rendersAs() { + DisplayData data = this.renderer.renderAs(new C(), "text/markdown"); + + Assertions.assertEquals("**C**", data.getData(MIMEType.TEXT_MARKDOWN)); + Assertions.assertEquals("C", data.getData(MIMEType.TEXT_PLAIN)); + Assertions.assertNull(data.getData(MIMEType.TEXT_CSS)); + } + + @Test + void rendersAsExternal() { + DisplayData data = this.renderer.renderAs(new D(), "text/latex"); + + Assertions.assertEquals("\\d", data.getData(MIMEType.TEXT_LATEX)); + Assertions.assertEquals("D", data.getData(MIMEType.TEXT_PLAIN)); + Assertions.assertNull(data.getData(MIMEType.TEXT_HTML)); + } + + @Test + void supportsPreferringAll() { + DisplayData data = this.renderer.render(new E()); + + Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); + Assertions.assertEquals(".e{}", data.getData(MIMEType.TEXT_CSS)); + Assertions.assertEquals("e();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + Assertions.assertEquals("E", data.getData(MIMEType.TEXT_PLAIN)); + } + + @Test + void supportsPreferringAllExternal() { + DisplayData data = this.renderer.render(new F()); + + Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); + Assertions.assertEquals(".f{}", data.getData(MIMEType.TEXT_CSS)); + Assertions.assertEquals("f();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + Assertions.assertEquals("F", data.getData(MIMEType.TEXT_PLAIN)); + } + + @Test + void supportsPreferringAllRequestingAll() { + DisplayData data = this.renderer.renderAs(new E(), "*"); + + Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); + Assertions.assertEquals(".e{}", data.getData(MIMEType.TEXT_CSS)); + Assertions.assertEquals("e();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + Assertions.assertEquals("E", data.getData(MIMEType.TEXT_PLAIN)); + } + + @Test + void supportsPreferringAllRequestingAllExternal() { + DisplayData data = this.renderer.renderAs(new F(), "*"); + + Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); + Assertions.assertEquals(".f{}", data.getData(MIMEType.TEXT_CSS)); + Assertions.assertEquals("f();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + Assertions.assertEquals("F", data.getData(MIMEType.TEXT_PLAIN)); + } + + @Test + void supportsPreferringAllRequestingSome() { + DisplayData data = this.renderer.renderAs(new E(), "text/html"); + + Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); + Assertions.assertNull(data.getData(MIMEType.TEXT_CSS)); + Assertions.assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + Assertions.assertEquals("E", data.getData(MIMEType.TEXT_PLAIN)); + } + + @Test + void supportsPreferringAllRequestingSomeExternal() { + DisplayData data = this.renderer.renderAs(new F(), "text/html"); + + Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); + Assertions.assertNull(data.getData(MIMEType.TEXT_CSS)); + Assertions.assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + Assertions.assertEquals("F", data.getData(MIMEType.TEXT_PLAIN)); + } + + @Test + void supportsPreferringAllRequestingGroup() { + DisplayData data = this.renderer.renderAs(new E(), "text/*"); + + Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); + Assertions.assertEquals(".e{}", data.getData(MIMEType.TEXT_CSS)); + Assertions.assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + Assertions.assertEquals("E", data.getData(MIMEType.TEXT_PLAIN)); + } + + @Test + void supportsPreferringAllRequestingGroupExternal() { + DisplayData data = this.renderer.renderAs(new F(), "text/*"); + + Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); + Assertions.assertEquals(".f{}", data.getData(MIMEType.TEXT_CSS)); + Assertions.assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + Assertions.assertEquals("F", data.getData(MIMEType.TEXT_PLAIN)); + } + + @Test + void supportsPreferringGroup() { + DisplayData data = this.renderer.render(new G()); + + Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); + Assertions.assertEquals(".g{}", data.getData(MIMEType.TEXT_CSS)); + Assertions.assertEquals("g();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + Assertions.assertEquals("G", data.getData(MIMEType.TEXT_PLAIN)); + } + + @Test + void supportsPreferringGroupExternal() { + DisplayData data = this.renderer.render(new H()); + + Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); + Assertions.assertEquals(".h{}", data.getData(MIMEType.TEXT_CSS)); + Assertions.assertEquals("h();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + Assertions.assertEquals("H", data.getData(MIMEType.TEXT_PLAIN)); + } + + @Test + void supportsPreferringGroupRequestingSome() { + DisplayData data = this.renderer.renderAs(new G(), "text/html"); + + Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); + Assertions.assertNull(data.getData(MIMEType.TEXT_CSS)); + Assertions.assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + Assertions.assertEquals("G", data.getData(MIMEType.TEXT_PLAIN)); + } + + @Test + void supportsPreferringGroupRequestingSomeExternal() { + DisplayData data = this.renderer.renderAs(new H(), "text/html"); + + Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); + Assertions.assertNull(data.getData(MIMEType.TEXT_CSS)); + Assertions.assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + Assertions.assertEquals("H", data.getData(MIMEType.TEXT_PLAIN)); + } + + @Test + void supportsPreferringGroupRequestingGroup() { + DisplayData data = this.renderer.renderAs(new G(), "text/*"); + + Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); + Assertions.assertEquals(".g{}", data.getData(MIMEType.TEXT_CSS)); + Assertions.assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + Assertions.assertEquals("G", data.getData(MIMEType.TEXT_PLAIN)); + } + + @Test + void supportsPreferringGroupRequestingGroupExternal() { + DisplayData data = this.renderer.renderAs(new H(), "text/*"); + + Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); + Assertions.assertEquals(".h{}", data.getData(MIMEType.TEXT_CSS)); + Assertions.assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + Assertions.assertEquals("H", data.getData(MIMEType.TEXT_PLAIN)); + } + + @Test + void supportsOverridingTextRepresentation() { + DisplayData data = this.renderer.render(new I()); + + Assertions.assertEquals("I!", data.getData(MIMEType.TEXT_PLAIN)); + } + + @Test + void supportsOverridingTextRepresentationExternal() { + DisplayData data = this.renderer.render(new J()); + + Assertions.assertEquals("J!", data.getData(MIMEType.TEXT_PLAIN)); + } + + @Test + void supportsOverridingTextRepresentationWhenNotRequested() { + DisplayData data = this.renderer.renderAs(new I(), "application/javascript"); + + Assertions.assertEquals("i();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + Assertions.assertEquals("I!", data.getData(MIMEType.TEXT_PLAIN)); + } + + @Test + void supportsOverridingTextRepresentationWhenNotRequestedExternal() { + DisplayData data = this.renderer.renderAs(new J(), "application/javascript"); + + Assertions.assertEquals("j();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + Assertions.assertEquals("J!", data.getData(MIMEType.TEXT_PLAIN)); + } + class A { @Override public String toString() { @@ -228,231 +453,4 @@ public String toString() { return "J"; } } - - @Test - public void rendersPlainText() { - DisplayData data = this.renderer.render(new A()); - - assertEquals("A", data.getData(MIMEType.TEXT_PLAIN)); - } - - @Test - public void alwaysRendersPlainText() { - DisplayData data = this.renderer.render(new B()); - - assertEquals("B", data.getData(MIMEType.TEXT_PLAIN)); - } - - @Test - public void rendersPreferred() { - DisplayData data = this.renderer.render(new B()); - - assertEquals("**B**", data.getData(MIMEType.TEXT_MARKDOWN)); - } - - @Test - public void rendersJustPreferred() { - DisplayData data = this.renderer.render(new C()); - - assertEquals(".c{}", data.getData(MIMEType.TEXT_CSS)); - assertEquals("C", data.getData(MIMEType.TEXT_PLAIN)); - assertNull(data.getData(MIMEType.TEXT_MARKDOWN)); - } - - @Test - public void rendersExternal() { - DisplayData data = this.renderer.render(new D()); - - assertEquals("", data.getData(MIMEType.TEXT_HTML)); - assertEquals("D", data.getData(MIMEType.TEXT_PLAIN)); - assertNull(data.getData(MIMEType.TEXT_LATEX)); - } - - @Test - public void rendersAs() { - DisplayData data = this.renderer.renderAs(new C(), "text/markdown"); - - assertEquals("**C**", data.getData(MIMEType.TEXT_MARKDOWN)); - assertEquals("C", data.getData(MIMEType.TEXT_PLAIN)); - assertNull(data.getData(MIMEType.TEXT_CSS)); - } - - @Test - public void rendersAsExternal() { - DisplayData data = this.renderer.renderAs(new D(), "text/latex"); - - assertEquals("\\d", data.getData(MIMEType.TEXT_LATEX)); - assertEquals("D", data.getData(MIMEType.TEXT_PLAIN)); - assertNull(data.getData(MIMEType.TEXT_HTML)); - } - - @Test - public void supportsPreferringAll() { - DisplayData data = this.renderer.render(new E()); - - assertEquals("", data.getData(MIMEType.TEXT_HTML)); - assertEquals(".e{}", data.getData(MIMEType.TEXT_CSS)); - assertEquals("e();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - assertEquals("E", data.getData(MIMEType.TEXT_PLAIN)); - } - - @Test - public void supportsPreferringAllExternal() { - DisplayData data = this.renderer.render(new F()); - - assertEquals("", data.getData(MIMEType.TEXT_HTML)); - assertEquals(".f{}", data.getData(MIMEType.TEXT_CSS)); - assertEquals("f();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - assertEquals("F", data.getData(MIMEType.TEXT_PLAIN)); - } - - @Test - public void supportsPreferringAllRequestingAll() { - DisplayData data = this.renderer.renderAs(new E(), "*"); - - assertEquals("", data.getData(MIMEType.TEXT_HTML)); - assertEquals(".e{}", data.getData(MIMEType.TEXT_CSS)); - assertEquals("e();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - assertEquals("E", data.getData(MIMEType.TEXT_PLAIN)); - } - - @Test - public void supportsPreferringAllRequestingAllExternal() { - DisplayData data = this.renderer.renderAs(new F(), "*"); - - assertEquals("", data.getData(MIMEType.TEXT_HTML)); - assertEquals(".f{}", data.getData(MIMEType.TEXT_CSS)); - assertEquals("f();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - assertEquals("F", data.getData(MIMEType.TEXT_PLAIN)); - } - - @Test - public void supportsPreferringAllRequestingSome() { - DisplayData data = this.renderer.renderAs(new E(), "text/html"); - - assertEquals("", data.getData(MIMEType.TEXT_HTML)); - assertNull(data.getData(MIMEType.TEXT_CSS)); - assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - assertEquals("E", data.getData(MIMEType.TEXT_PLAIN)); - } - - @Test - public void supportsPreferringAllRequestingSomeExternal() { - DisplayData data = this.renderer.renderAs(new F(), "text/html"); - - assertEquals("", data.getData(MIMEType.TEXT_HTML)); - assertNull(data.getData(MIMEType.TEXT_CSS)); - assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - assertEquals("F", data.getData(MIMEType.TEXT_PLAIN)); - } - - @Test - public void supportsPreferringAllRequestingGroup() { - DisplayData data = this.renderer.renderAs(new E(), "text/*"); - - assertEquals("", data.getData(MIMEType.TEXT_HTML)); - assertEquals(".e{}", data.getData(MIMEType.TEXT_CSS)); - assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - assertEquals("E", data.getData(MIMEType.TEXT_PLAIN)); - } - - @Test - public void supportsPreferringAllRequestingGroupExternal() { - DisplayData data = this.renderer.renderAs(new F(), "text/*"); - - assertEquals("", data.getData(MIMEType.TEXT_HTML)); - assertEquals(".f{}", data.getData(MIMEType.TEXT_CSS)); - assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - assertEquals("F", data.getData(MIMEType.TEXT_PLAIN)); - } - - @Test - public void supportsPreferringGroup() { - DisplayData data = this.renderer.render(new G()); - - assertEquals("", data.getData(MIMEType.TEXT_HTML)); - assertEquals(".g{}", data.getData(MIMEType.TEXT_CSS)); - assertEquals("g();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - assertEquals("G", data.getData(MIMEType.TEXT_PLAIN)); - } - - @Test - public void supportsPreferringGroupExternal() { - DisplayData data = this.renderer.render(new H()); - - assertEquals("", data.getData(MIMEType.TEXT_HTML)); - assertEquals(".h{}", data.getData(MIMEType.TEXT_CSS)); - assertEquals("h();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - assertEquals("H", data.getData(MIMEType.TEXT_PLAIN)); - } - - @Test - public void supportsPreferringGroupRequestingSome() { - DisplayData data = this.renderer.renderAs(new G(), "text/html"); - - assertEquals("", data.getData(MIMEType.TEXT_HTML)); - assertNull(data.getData(MIMEType.TEXT_CSS)); - assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - assertEquals("G", data.getData(MIMEType.TEXT_PLAIN)); - } - - @Test - public void supportsPreferringGroupRequestingSomeExternal() { - DisplayData data = this.renderer.renderAs(new H(), "text/html"); - - assertEquals("", data.getData(MIMEType.TEXT_HTML)); - assertNull(data.getData(MIMEType.TEXT_CSS)); - assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - assertEquals("H", data.getData(MIMEType.TEXT_PLAIN)); - } - - @Test - public void supportsPreferringGroupRequestingGroup() { - DisplayData data = this.renderer.renderAs(new G(), "text/*"); - - assertEquals("", data.getData(MIMEType.TEXT_HTML)); - assertEquals(".g{}", data.getData(MIMEType.TEXT_CSS)); - assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - assertEquals("G", data.getData(MIMEType.TEXT_PLAIN)); - } - - @Test - public void supportsPreferringGroupRequestingGroupExternal() { - DisplayData data = this.renderer.renderAs(new H(), "text/*"); - - assertEquals("", data.getData(MIMEType.TEXT_HTML)); - assertEquals(".h{}", data.getData(MIMEType.TEXT_CSS)); - assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - assertEquals("H", data.getData(MIMEType.TEXT_PLAIN)); - } - - @Test - public void supportsOverridingTextRepresentation() { - DisplayData data = this.renderer.render(new I()); - - assertEquals("I!", data.getData(MIMEType.TEXT_PLAIN)); - } - - @Test - public void supportsOverridingTextRepresentationExternal() { - DisplayData data = this.renderer.render(new J()); - - assertEquals("J!", data.getData(MIMEType.TEXT_PLAIN)); - } - - @Test - public void supportsOverridingTextRepresentationWhenNotRequested() { - DisplayData data = this.renderer.renderAs(new I(), "application/javascript"); - - assertEquals("i();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - assertEquals("I!", data.getData(MIMEType.TEXT_PLAIN)); - } - - @Test - public void supportsOverridingTextRepresentationWhenNotRequestedExternal() { - DisplayData data = this.renderer.renderAs(new J(), "application/javascript"); - - assertEquals("j();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - assertEquals("J!", data.getData(MIMEType.TEXT_PLAIN)); - } -} \ No newline at end of file +} diff --git a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/mime/MIMETypeTest.java b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/mime/MIMETypeTest.java index e61342b..f05e728 100644 --- a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/mime/MIMETypeTest.java +++ b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/mime/MIMETypeTest.java @@ -1,51 +1,28 @@ package org.dflib.jjava.jupyter.kernel.display.mime; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; -import java.util.Arrays; - -import static org.junit.Assert.assertEquals; - -@RunWith(Parameterized.class) public class MIMETypeTest { - @Parameters(name = "{index}: MIMEType.parse({0}) = new MIMEType({1}, {2}, {3}, {4})") - public static Iterable data() { - return Arrays.asList(new Object[][]{ - { "application/json", "application", null, "json", null }, - { "application/xhtml+xml", "application", null, "xhtml", "xml" }, - { "image/*", "image", null, "*", null }, - { "image/", "image", null, "", null }, - { "video", "video", null, null, null }, - { "video", "video", null, null, null }, - { "application/vnd.media", "application", "vnd", "media", null }, - { "application/vnd.media.producer", "application", "vnd", "media.producer", null }, - { "application/vnd.media.producer+suffix", "application", "vnd", "media.producer", "suffix" }, - { "application/vnd.media.named+producer+suffix", "application", "vnd", "media.named+producer", "suffix" }, - }); - } - - private final String raw; - private final String type; - private final String tree; - private final String subtype; - private final String suffix; - - public MIMETypeTest(String raw, String type, String tree, String subtype, String suffix) { - this.raw = raw; - this.type = type; - this.tree = tree; - this.subtype = subtype; - this.suffix = suffix; - } - - @Test - public void test() { - MIMEType parsed = MIMEType.parse(this.raw); - MIMEType expected = new MIMEType(this.type, this.tree, this.subtype, this.suffix); - assertEquals(expected, parsed); + @ParameterizedTest(name = "{index}: MIMEType.parse({0}) = new MIMEType({1}, {2}, {3}, {4})") + @CsvSource({ + "application/json, application, , json, ", + "application/xhtml+xml, application, , xhtml, xml", + "image/*, image, , *, ", + "image/, image, , '', ", + "video, video, , , ", + "video, video, , , ", + "application/vnd.media, application, vnd, media, ", + "application/vnd.media.producer, application, vnd, media.producer, ", + "application/vnd.media.producer+suffix, application, vnd, media.producer, suffix", + "application/vnd.media.named+producer+suffix, application, vnd, media.named+producer, suffix" + }) + public void test(String raw, String type, String tree, String subtype, String suffix) { + MIMEType expected = new MIMEType(type, tree, subtype, suffix); + MIMEType actual = MIMEType.parse(raw); + + Assertions.assertEquals(expected, actual); } -} \ No newline at end of file +} diff --git a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/MagicParserTest.java b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/MagicParserTest.java index 1747ac5..71c5956 100644 --- a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/MagicParserTest.java +++ b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/MagicParserTest.java @@ -1,25 +1,17 @@ package org.dflib.jjava.jupyter.kernel.magic; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; public class MagicParserTest { - public static List split(String args) { - return MagicParser.split(args); - } - private MagicParser inlineParser; private MagicParser solParser; - @Before + @BeforeEach public void setUp() { this.inlineParser = new MagicParser("//%", "//%%"); this.solParser = new MagicParser("^\\s*//%", "//%%"); @@ -45,7 +37,7 @@ public void transformLineMagics() { "**magicName3-arg1,arg2 arg2" ); - assertEquals(expectedTransformedCell, transformedCell); + Assertions.assertEquals(expectedTransformedCell, transformedCell); } @Test @@ -58,12 +50,12 @@ public void parseCellMagic() { CellMagicParseContext ctx = this.inlineParser.parseCellMagic(cell); - assertNotNull(ctx); - assertEquals("cellMagicName", ctx.getMagicCall().getName()); - assertEquals(Arrays.asList("arg1", "arg2 arg2", "arg3"), ctx.getMagicCall().getArgs()); - assertEquals("This is the body\nwith multiple lines", ctx.getMagicCall().getBody()); - assertEquals("//%%cellMagicName arg1 \"arg2 arg2\" arg3 ", ctx.getRawArgsLine()); - assertEquals(cell, ctx.getRawCell()); + Assertions.assertNotNull(ctx); + Assertions.assertEquals("cellMagicName", ctx.getMagicCall().getName()); + Assertions.assertEquals(Arrays.asList("arg1", "arg2 arg2", "arg3"), ctx.getMagicCall().getArgs()); + Assertions.assertEquals("This is the body\nwith multiple lines", ctx.getMagicCall().getBody()); + Assertions.assertEquals("//%%cellMagicName arg1 \"arg2 arg2\" arg3 ", ctx.getRawArgsLine()); + Assertions.assertEquals(cell, ctx.getRawCell()); } @Test @@ -81,7 +73,7 @@ public void transformCellMagic() { String expectedTransformedCell = "cellMagicName(arg1,arg2 arg2,arg3)\nThis is the body\nwith multiple lines"; - assertEquals(expectedTransformedCell, transformedCell); + Assertions.assertEquals(expectedTransformedCell, transformedCell); } @Test @@ -94,7 +86,7 @@ public void dontTransformNonMagicCell() { String transformedCell = this.inlineParser.transformCellMagic(cell, ctx -> "transformer applied"); - assertEquals(cell, transformedCell); + Assertions.assertEquals(cell, transformedCell); } @Test @@ -103,7 +95,7 @@ public void startOfLineParserSkipsInlineMagics() { String transformedCell = this.solParser.transformLineMagics(cell, ctx -> ""); - assertEquals(cell, transformedCell); + Assertions.assertEquals(cell, transformedCell); } @Test @@ -121,7 +113,7 @@ public void startOfLineParserAllowsWhitespace() { "sol3" ); - assertEquals(expectedTransformedCell, transformedCell); + Assertions.assertEquals(expectedTransformedCell, transformedCell); } @Test @@ -137,6 +129,10 @@ public void startOfLineParserSkipsInline() { "Not //%sol" ); - assertEquals(expectedTransformedCell, transformedCell); + Assertions.assertEquals(expectedTransformedCell, transformedCell); + } + + public static List split(String args) { + return MagicParser.split(args); } -} \ No newline at end of file +} diff --git a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/registry/MagicsArgsTest.java b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/registry/MagicsArgsTest.java index ab40cda..8490a69 100644 --- a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/registry/MagicsArgsTest.java +++ b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/registry/MagicsArgsTest.java @@ -2,195 +2,353 @@ import org.dflib.jjava.jupyter.kernel.magic.MagicParserTest; import org.hamcrest.Matcher; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.hamcrest.MatcherAssert; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import java.util.Arrays; -import java.util.Collection; import java.util.List; import java.util.Map; import java.util.function.Consumer; +import java.util.stream.Stream; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.hasEntry; -import static org.junit.Assert.assertThat; -@RunWith(Parameterized.class) public class MagicsArgsTest { - private static MagicsArgs args(Consumer config) { - MagicsArgs.MagicsArgsBuilder builder = MagicsArgs.builder(); - config.accept(builder); - return builder.build(); - } - private static List list(String... args) { - return Arrays.asList(args); + @ParameterizedTest(name = "{index}: \"{0}\" with \"{1}\"") + @MethodSource + public void values(MagicsArgs schema, String args, Matcher>> matcher) { + List rawArgs = MagicParserTest.split(args); + Map> actual = Assertions.assertDoesNotThrow(() -> schema.parse(rawArgs)); + + MatcherAssert.assertThat(actual, matcher); } - @Parameterized.Parameters(name = "{index}: \"{0}\" with \"{1}\"") - public static Collection data() { - return Arrays.asList(new Object[][]{ - { args(b -> b.required("a")), + public static Stream values() { + return Stream.of( + Arguments.of( + args(b -> b.required("a")), "value-a", - hasEntry("a", list("value-a")) }, - { args(b -> b.required("a").optional("b")), + hasEntry("a", list("value-a")) + ), + Arguments.of( + args(b -> b.required("a").optional("b")), "value-a", - allOf( - hasEntry("a", list("value-a")), - hasEntry("b", list()) - ) }, - { args(b -> b.required("a").optional("b")), + allOf(hasEntry("a", list("value-a")), hasEntry("b", list())) + ), + Arguments.of( + args(b -> b.required("a").optional("b")), "value-a value-b", allOf( hasEntry("a", list("value-a")), hasEntry("b", list("value-b")) - ) }, - { args(b -> b.required("a").optional("b").varargs("c")), + ) + ), + Arguments.of( + args(b -> b.required("a").optional("b").varargs("c")), "value-a value-b", allOf( hasEntry("a", list("value-a")), hasEntry("b", list("value-b")), hasEntry("c", list()) - ) }, - { args(b -> b.required("a").optional("b").varargs("c")), + ) + ), + Arguments.of(args(b -> b.required("a").optional("b").varargs("c")), "value-a value-b value-c", allOf( hasEntry("a", list("value-a")), hasEntry("b", list("value-b")), hasEntry("c", list("value-c")) - ) }, - { args(b -> b.required("a").optional("b").varargs("c")), + ) + ), + Arguments.of( + args(b -> b.required("a").optional("b").varargs("c")), "value-a value-b value-c-1 value-c-2", allOf( hasEntry("a", list("value-a")), hasEntry("b", list("value-b")), hasEntry("c", list("value-c-1", "value-c-2")) - ) }, - { args(b -> b.required("a").required("b").varargs("c")), + ) + ), + Arguments.of( + args(b -> b.required("a").required("b").varargs("c")), "value-a value-b value-c-1 value-c-2", allOf( hasEntry("a", list("value-a")), hasEntry("b", list("value-b")), hasEntry("c", list("value-c-1", "value-c-2")) - ) }, - { args(b -> b.optional("a")), "", hasEntry("a", list()) }, - { args(b -> b.optional("a").varargs("b")), + ) + ), + Arguments.of( + args(b -> b.optional("a")), + "", + hasEntry("a", list()) + ), + Arguments.of( + args(b -> b.optional("a").varargs("b")), "", allOf( hasEntry("a", list()), hasEntry("b", list()) - ) }, - { args(b -> b.optional("a").varargs("b")), + ) + ), + Arguments.of( + args(b -> b.optional("a").varargs("b")), + "value-a", + allOf( + hasEntry("a", list("value-a")), + hasEntry("b", list()) + ) + ), + Arguments.of( + args(b -> b.optional("a").varargs("b")), "value-a", allOf( hasEntry("a", list("value-a")), hasEntry("b", list()) - ) }, - { args(b -> b.optional("a").varargs("b")), - "value-a", allOf( - hasEntry("a", list("value-a")), - hasEntry("b", list()) - ) }, - { args(b -> b.varargs("a")), + ) + ), + Arguments.of( + args(b -> b.varargs("a")), "", - hasEntry("a", list()) }, - { args(b -> b.varargs("a")), + hasEntry("a", list()) + ), + Arguments.of( + args(b -> b.varargs("a")), "value-a", - hasEntry("a", list("value-a")) }, - { args(b -> b.required("a").optional("a")), + hasEntry("a", list("value-a")) + ), + Arguments.of( + args(b -> b.required("a").optional("a")), "value-a extra-a", - hasEntry("a", list("value-a", "extra-a")) }, - { args(b -> b.required("a").optional("a")), + hasEntry("a", list("value-a", "extra-a")) + ), + Arguments.of( + args(b -> b.required("a").optional("a")), "value-a", - hasEntry("a", list("value-a")) }, - { args(b -> b.required("a").varargs("a")), + hasEntry("a", list("value-a")) + ), + Arguments.of( + args(b -> b.required("a").varargs("a")), "value-a extra-a extra-a-2", - hasEntry("a", list("value-a", "extra-a", "extra-a-2")) }, - - // FLAGS - { args(b -> {}), "-f", hasEntry("f", list("")) }, - { args(b -> {}), "-fff", hasEntry("f", list("", "", "")) }, - { args(b -> {}), "-fg -g", allOf( - hasEntry("f", list("")), - hasEntry("g", list("", "")) - ) }, - { args(b -> b.flag("test", 'f')), "", hasEntry("test", list()) }, - { args(b -> b.flag("verbose", 'v', "true")), + hasEntry("a", list("value-a", "extra-a", "extra-a-2")) + ) + ); + } + + @ParameterizedTest(name = "{index}: \"{0}\" with \"{1}\"") + @MethodSource + public void flags(MagicsArgs schema, String args, Matcher>> matcher) { + List rawArgs = MagicParserTest.split(args); + Map> actual = Assertions.assertDoesNotThrow(() -> schema.parse(rawArgs)); + + MatcherAssert.assertThat(actual, matcher); + } + + public static Stream flags() { + return Stream.of( + Arguments.of( + args(b -> {}), + "-f", + hasEntry("f", list("")) + ), + Arguments.of( + args(b -> {}), + "-fff", + hasEntry("f", list("", "", "")) + ), + Arguments.of( + args(b -> {}), + "-fg -g", + allOf(hasEntry("f", list("")), hasEntry("g", list("", ""))) + ), + Arguments.of( + args(b -> b.flag("test", 'f')), + "", + hasEntry("test", list()) + ), + Arguments.of( + args(b -> b.flag("verbose", 'v', "true")), "-v", - hasEntry("verbose", list("true")) }, - - // KEYWORDS - { args(b -> {}), "--f=10", hasEntry("f", list("10")) }, - { args(b -> {}), "--f=10 --f=11", hasEntry("f", list("10", "11")) }, - { args(b -> {}), "--f 10 --f=11 --f 12", hasEntry("f", list("10", "11", "12")) }, - { args(b -> b.keyword("test")), "--test=10 --test 11 --test=12", hasEntry("test", list("10", "11", "12")) }, - { args(b -> b.keyword("test", MagicsArgs.KeywordSpec.REPLACE)), + hasEntry("verbose", list("true")) + ) + ); + } + + @ParameterizedTest(name = "{index}: \"{0}\" with \"{1}\"") + @MethodSource + public void keywords(MagicsArgs schema, String args, Matcher>> matcher) { + List rawArgs = MagicParserTest.split(args); + Map> actual = Assertions.assertDoesNotThrow(() -> schema.parse(rawArgs)); + + MatcherAssert.assertThat(actual, matcher); + } + + public static Stream keywords() { + return Stream.of( + Arguments.of( + args(b -> {}), + "--f=10", + hasEntry("f", list("10")) + ), + Arguments.of( + args(b -> {}), + "--f=10 --f=11", + hasEntry("f", list("10", "11")) + ), + Arguments.of( + args(b -> {}), + "--f 10 --f=11 --f 12", + hasEntry("f", list("10", "11", "12")) + ), + Arguments.of( + args(b -> b.keyword("test")), + "--test=10 --test 11 --test=12", + hasEntry("test", list("10", "11", "12")) + ), + Arguments.of( + args(b -> b.keyword("test", MagicsArgs.KeywordSpec.REPLACE)), "--test=10 --test 11 --test=12", - hasEntry("test", list("12")) }, - { args(b -> b.keyword("test")), "", hasEntry("test", list()) }, + hasEntry("test", list("12")) + ), + Arguments.of( + args(b -> b.keyword("test")), + "", + hasEntry("test", list()) + ) + ); + } + + @ParameterizedTest(name = "{index}: \"{0}\" with \"{1}\"") + @MethodSource + public void flagsAndKeyWords(MagicsArgs schema, String args, Matcher>> matcher) { + List rawArgs = MagicParserTest.split(args); + Map> actual = Assertions.assertDoesNotThrow(() -> schema.parse(rawArgs)); + + MatcherAssert.assertThat(actual, matcher); + } - // FLAGS and KEYWORDS - { args(b -> b.flag("log-level", 'v', "100").keyword("log-level")), + public static Stream flagsAndKeyWords() { + return Stream.of( + Arguments.of( + args(b -> b.flag("log-level", 'v', "100").keyword("log-level")), "-v --log-level=200 --log-level 300", - hasEntry("log-level", list("100", "200", "300")) }, + hasEntry("log-level", list("100", "200", "300")) + ) + ); + } + + @ParameterizedTest(name = "{index}: \"{0}\" with \"{1}\"") + @MethodSource + public void positionalsAndFlagsAndKeywords(MagicsArgs schema, String args, + Matcher>> matcher) { + List rawArgs = MagicParserTest.split(args); + Map> actual = Assertions.assertDoesNotThrow(() -> schema.parse(rawArgs)); + + MatcherAssert.assertThat(actual, matcher); + } - // POSITIONALS and FLAGS and KEYWORDS - { args(b -> b.required("a").optional("b").flag("log-level", 'v', "100").keyword("log-level")), + public static Stream positionalsAndFlagsAndKeywords() { + return Stream.of( + Arguments.of( + args(b -> b.required("a") + .optional("b") + .flag("log-level", 'v', "100") + .keyword("log-level")), "-v value-a --log-level=200 value-b --log-level 300", allOf( hasEntry("log-level", list("100", "200", "300")), hasEntry("a", list("value-a")), hasEntry("b", list("value-b")) - ) }, - - // Exceptions - { args(b -> b.required("a")), "", null }, - { args(b -> b.required("a")), "value-a extra-a", null }, - { args(b -> b.optional("a")), "value-a extra-a", null }, - { args(b -> b.onlyKnownKeywords()), "--unknown=val", null }, - { args(b -> b.onlyKnownKeywords()), "--unknown val", null }, - { args(b -> b.onlyKnownFlags()), "-idk", null }, - { args(b -> b.flag("test", 'i').onlyKnownFlags()), "-idk", null }, - { args(b -> b.keyword("a", MagicsArgs.KeywordSpec.ONCE)), "--a a --a not-ok...", null }, - - // Strange - { args(b -> b.keyword("a")), + )) + ); + } + + @ParameterizedTest(name = "{index}: \"{0}\" with \"{1}\"") + @MethodSource + public void strange(MagicsArgs schema, String args, Matcher>> matcher) { + List rawArgs = MagicParserTest.split(args); + Map> actual = Assertions.assertDoesNotThrow(() -> schema.parse(rawArgs)); + + MatcherAssert.assertThat(actual, matcher); + } + + public static Stream strange() { + return Stream.of( + Arguments.of( + args(b -> b.keyword("a")), "\"--a=value with spaces\"", - hasEntry("a", list("value with spaces")) }, - { args(b -> b.keyword("a")), + hasEntry("a", list("value with spaces")) + ), + Arguments.of( + args(b -> b.keyword("a")), "--a=\"value with spaces\"", - hasEntry("a", list("value with spaces")) }, - { args(b -> b.keyword("a")), + hasEntry("a", list("value with spaces")) + ), + Arguments.of( + args(b -> b.keyword("a")), "--a \"value with spaces\"", - hasEntry("a", list("value with spaces")) }, - }); + hasEntry("a", list("value with spaces")) + ) + ); } - @Rule - public final ExpectedException exception = ExpectedException.none(); + @ParameterizedTest(name = "{index}: \"{0}\" with \"{1}\"") + @MethodSource + public void any_throws(MagicsArgs schema, String args) { + List rawArgs = MagicParserTest.split(args); - private MagicsArgs schema; - private String args; - private Matcher>> test; - - public MagicsArgsTest(MagicsArgs schema, String args, Matcher>> test) { - this.schema = schema; - this.args = args; - this.test = test; + Assertions.assertThrows(MagicArgsParseException.class, () -> schema.parse(rawArgs)); } - @Test - public void test() { - List rawArgs = MagicParserTest.split(this.args); - if (this.test == null) - exception.expect(MagicArgsParseException.class); + public static Stream any_throws() { + return Stream.of( + Arguments.of( + args(b -> b.required("a")), + "" + ), + Arguments.of( + args(b -> b.required("a")), + "value-a extra-a" + ), + Arguments.of( + args(b -> b.optional("a")), + "value-a extra-a" + ), + Arguments.of( + args(b -> b.onlyKnownKeywords()), + "--unknown=val" + ), + Arguments.of( + args(b -> b.onlyKnownKeywords()), + "--unknown val" + ), + Arguments.of( + args(b -> b.onlyKnownFlags()), + "-idk" + ), + Arguments.of( + args(b -> b.flag("test", 'i').onlyKnownFlags()), + "-idk" + ), + Arguments.of( + args(b -> b.keyword("a", MagicsArgs.KeywordSpec.ONCE)), + "--a a --a not-ok..." + ) + ); + } - Map> args = this.schema.parse(rawArgs); + private static MagicsArgs args(Consumer config) { + MagicsArgs.MagicsArgsBuilder builder = MagicsArgs.builder(); + config.accept(builder); + return builder.build(); + } - if (this.test != null) - assertThat(args, this.test); + private static List list(String... args) { + return Arrays.asList(args); } -} \ No newline at end of file +} diff --git a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/registry/MagicsTest.java b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/registry/MagicsTest.java index c8f8d10..bf6c673 100644 --- a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/registry/MagicsTest.java +++ b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/registry/MagicsTest.java @@ -1,7 +1,8 @@ package org.dflib.jjava.jupyter.kernel.magic.registry; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.Collections; @@ -9,13 +10,10 @@ import java.util.List; import java.util.Set; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; - public class MagicsTest { private Magics magics; - @Before + @BeforeEach public void setUp() { magics = new Magics(); } @@ -27,7 +25,7 @@ public void lineMagic() throws Exception { List args = Arrays.asList("arg1", "arg2"); List out = magics.applyLineMagic("test", args); - assertEquals(args, out); + Assertions.assertEquals(args, out); } @Test @@ -45,7 +43,7 @@ public void cellMagic() throws Exception { List expected = new LinkedList<>(args); expected.add(body); - assertEquals(expected, out); + Assertions.assertEquals(expected, out); } @Test @@ -75,8 +73,8 @@ public List execute(List args) { List expectedCell = new LinkedList<>(args); expectedCell.add(body); - assertEquals(args, lineOut); - assertEquals(expectedCell, cellOut); + Assertions.assertEquals(args, lineOut); + Assertions.assertEquals(expectedCell, cellOut); } @Test @@ -107,16 +105,16 @@ public int returnInt(List args) { magics.applyLineMagic("list", args); magics.applyLineMagic("iterable", args); magics.applyLineMagic("named", args); - assertEquals((Integer) 2, magics.applyLineMagic("returnInt", args)); + Assertions.assertEquals((Integer) 2, magics.applyLineMagic("returnInt", args)); try { magics.applyLineMagic("unusedName", args); - fail("named magic was also registered under the method name"); + Assertions.fail("named magic was also registered under the method name"); } catch (UndefinedMagicException ignored) { } } - @Test(expected = IllegalArgumentException.class) + @Test public void badReflectionLineMagicsType() { class BadMagic { @LineMagic @@ -124,10 +122,10 @@ public void set(Set args) { } } - magics.registerMagics(new BadMagic()); + Assertions.assertThrows(IllegalArgumentException.class, () -> magics.registerMagics(new BadMagic())); } - @Test(expected = IllegalArgumentException.class) + @Test public void badReflectionLineMagicsTypeParam() { class BadMagic { @LineMagic @@ -135,7 +133,7 @@ public void intList(List args) { } } - magics.registerMagics(new BadMagic()); + Assertions.assertThrows(IllegalArgumentException.class, () -> magics.registerMagics(new BadMagic())); } @Test @@ -167,16 +165,16 @@ public int returnInt(List args, String body) { magics.applyCellMagic("list", args, body); magics.applyCellMagic("iterable", args, body); magics.applyCellMagic("named", args, body); - assertEquals((Integer) 2, magics.applyCellMagic("returnInt", args, body)); + Assertions.assertEquals((Integer) 2, magics.applyCellMagic("returnInt", args, body)); try { magics.applyCellMagic("unusedName", args, body); - fail("named magic was also registered under the method name"); + Assertions.fail("named magic was also registered under the method name"); } catch (UndefinedMagicException ignored) { } } - @Test(expected = IllegalArgumentException.class) + @Test public void badReflectionCellMagicsType() { class BadMagic { @LineMagic @@ -184,10 +182,10 @@ public void set(Set args, String body) { } } - magics.registerMagics(new BadMagic()); + Assertions.assertThrows(IllegalArgumentException.class, () -> magics.registerMagics(new BadMagic())); } - @Test(expected = IllegalArgumentException.class) + @Test public void badReflectionCellMagicsTypeParam() { class BadMagic { @LineMagic @@ -195,10 +193,10 @@ public void intList(List args, String body) { } } - magics.registerMagics(new BadMagic()); + Assertions.assertThrows(IllegalArgumentException.class, () -> magics.registerMagics(new BadMagic())); } - @Test(expected = IllegalArgumentException.class) + @Test public void badReflectionCellMagicsBodyTypeParam() { class BadMagic { @LineMagic @@ -206,7 +204,7 @@ public void body(List args, Character body) { } } - magics.registerMagics(new BadMagic()); + Assertions.assertThrows(IllegalArgumentException.class, () -> magics.registerMagics(new BadMagic())); } @Test @@ -242,16 +240,16 @@ public int returnInt(List args, String body) { magics.applyLineMagic("list", args); magics.applyLineMagic("iterable", args); magics.applyLineMagic("lineNamed", args); - assertEquals((Integer) 3, magics.applyLineMagic("returnInt", args)); + Assertions.assertEquals((Integer) 3, magics.applyLineMagic("returnInt", args)); magics.applyCellMagic("list", args, body); magics.applyCellMagic("iterable", args, body); magics.applyCellMagic("cellNamed", args, body); - assertEquals((Integer) 4, magics.applyCellMagic("returnInt", args, body)); + Assertions.assertEquals((Integer) 4, magics.applyCellMagic("returnInt", args, body)); try { magics.applyCellMagic("unusedName", args, body); - fail("named magic was also registered under the method name"); + Assertions.fail("named magic was also registered under the method name"); } catch (UndefinedMagicException ignored) { } } @@ -270,14 +268,14 @@ public int getAndIncrement() { magics.registerMagics(new Magic()); for (int i = 0; i < 3; i++) - assertEquals((Integer) i, magics.applyLineMagic("getAndIncrement", Collections.emptyList())); + Assertions.assertEquals((Integer) i, magics.applyLineMagic("getAndIncrement", Collections.emptyList())); } @Test public void staticMagic() throws Exception { magics.registerMagics(StaticMagics.class); - assertEquals((Integer) 0, magics.applyLineMagic("staticMagic", Collections.emptyList())); - assertEquals("body", magics.applyCellMagic("staticMagic", Collections.emptyList(), "body")); + Assertions.assertEquals((Integer) 0, magics.applyLineMagic("staticMagic", Collections.emptyList())); + Assertions.assertEquals("body", magics.applyCellMagic("staticMagic", Collections.emptyList(), "body")); } -} \ No newline at end of file +} diff --git a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/util/GlobFinderTest.java b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/util/GlobFinderTest.java index 1e43bf6..ee97df3 100644 --- a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/util/GlobFinderTest.java +++ b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/util/GlobFinderTest.java @@ -3,18 +3,16 @@ import com.google.common.jimfs.Configuration; import com.google.common.jimfs.Jimfs; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import java.nio.file.FileAlreadyExistsException; import java.nio.file.FileSystem; import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Set; @@ -24,9 +22,6 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; -import static org.junit.Assert.assertEquals; - -@RunWith(Parameterized.class) public class GlobFinderTest { private static final Configuration WIN_FS = Configuration.windows().toBuilder().setWorkingDirectory("C:/dir-a").build(); private static final Configuration UNIX_FS = Configuration.unix().toBuilder().setWorkingDirectory("/dir-a").build(); @@ -35,6 +30,333 @@ public class GlobFinderTest { private static final Set TEST_FILES_ALL = setOf("a.txt", "b.txt", "c.txt", "a.pdf", "b.c.pdf", "abc.svg"); private static final Set TEST_DIRS_ALL = setOf("dir-a", "dir-b", "dir.c"); + @ParameterizedTest(name = "{index} :: {1}") + @MethodSource("data") + public void test(Configuration fsConfig, String glob, Set files, Set paths) throws Exception { + FileSystem fs = Jimfs.newFileSystem(fsConfig); + List roots = StreamSupport.stream(fs.getRootDirectories().spliterator(), false) + .collect(Collectors.toList()); + roots.add(fs.getPath(".")); + + for (Path dir1 : roots) { + for (String dir2 : new String[]{".", "dir-a", "dir-b", "dir.c"}) { + for (String dir3 : new String[]{".", "dir-a", "dir-b", "dir.c"}) { + for (String dir4 : new String[]{".", "dir-a", "dir-b", "dir.c"}) { + Files.createDirectories(fs.getPath(dir1.toString(), dir2, dir3, dir4)); + + for (String file : TEST_FILES_ALL) { + try { + Files.createFile(fs.getPath(dir1.toString(), dir2, dir3, dir4, file)); + } catch (FileAlreadyExistsException ignore) { + } + } + } + } + } + } + + Set expected; + Set actual; + GlobFinder finder = new GlobFinder(fs, glob); + + expected = files.stream() + .map(fs::getPath) + .map(Path::normalize) + .map(Path::toAbsolutePath) + .collect(Collectors.toSet()); + actual = StreamSupport.stream(finder.computeMatchingFiles().spliterator(), false) + .map(Path::normalize) + .map(Path::toAbsolutePath) + .collect(Collectors.toSet()); + Assertions.assertEquals(expected, actual, String.format("Glob files: '%s'", glob)); + + expected = paths.stream() + .map(fs::getPath) + .map(Path::normalize) + .map(Path::toAbsolutePath) + .collect(Collectors.toSet()); + actual = StreamSupport.stream(finder.computeMatchingPaths().spliterator(), false) + .map(Path::normalize) + .map(Path::toAbsolutePath) + .collect(Collectors.toSet()); + Assertions.assertEquals(expected, actual, String.format("Glob paths: '%s'", glob)); + } + + public static Stream data() { + return Stream.of( + Arguments.of( + WIN_FS, + "C:/*", + allFilesMapped(s -> "C:/" + s), + allFilesAndDirsMapped(s -> "C:/" + s) + ), + Arguments.of( + UNIX_FS, + "/*", + allFilesMapped(s -> "/" + s), + allFilesAndDirsMapped(s -> "/" + s) + ), + Arguments.of( + OSX_FS, "/*", + allFilesMapped(s -> "/" + s), + allFilesAndDirsMapped(s -> "/" + s) + ), + + // Implicit * appended with trailing / in file mode but not path mode. + Arguments.of( + WIN_FS, + "C:/*/", + allDirsFlatMapped(d -> allFilesMapped(s -> "C:/" + d + "/" + s)), + allFilesAndDirsMapped(s -> "C:/" + s) + ), + Arguments.of( + UNIX_FS, + "/*/", + allDirsFlatMapped(d -> allFilesMapped(s -> "/" + d + "/" + s)), + allFilesAndDirsMapped(s -> "/" + s)), + Arguments.of( + OSX_FS, + "/*/", + allDirsFlatMapped(d -> allFilesMapped(s -> "/" + d + "/" + s)), + allFilesAndDirsMapped(s -> "/" + s) + ), + + Arguments.of( + WIN_FS, + "C:/c.txt", + setOf("C:/c.txt"), + setOf("C:/c.txt") + ), + Arguments.of( + UNIX_FS, + "/c.txt", + setOf("/c.txt"), + setOf("/c.txt") + ), + Arguments.of( + OSX_FS, + "/c.txt", + setOf("/c.txt"), + setOf("/c.txt") + ), + + Arguments.of( + WIN_FS, + "C:/*/c.txt", + allDirsMapped(d -> "C:/" + d + "/c.txt"), + allDirsMapped(d -> "C:/" + d + "/c.txt") + ), + Arguments.of( + UNIX_FS, + "/*/c.txt", + allDirsMapped(d -> "/" + d + "/c.txt"), + allDirsMapped(d -> "/" + d + "/c.txt") + ), + Arguments.of( + OSX_FS, + "/*/c.txt", + allDirsMapped(d -> "/" + d + "/c.txt"), + allDirsMapped(d -> "/" + d + "/c.txt") + ), + + Arguments.of( + WIN_FS, + "C:/dir-b/*.txt", + allFilesFilterMapped(f -> f.endsWith(".txt"), f -> "C:/dir-b/" + f), + allFilesFilterMapped(f -> f.endsWith(".txt"), f -> "C:/dir-b/" + f) + ), + Arguments.of( + UNIX_FS, + "/dir-b/*.txt", + allFilesFilterMapped(f -> f.endsWith(".txt"), f -> "/dir-b/" + f), + allFilesFilterMapped(f -> f.endsWith(".txt"), f -> "/dir-b/" + f) + ), + Arguments.of( + OSX_FS, + "/dir-b/*.txt", + allFilesFilterMapped(f -> f.endsWith(".txt"), f -> "/dir-b/" + f), + allFilesFilterMapped(f -> f.endsWith(".txt"), f -> "/dir-b/" + f) + ), + + Arguments.of( + WIN_FS, + "*.pdf", + allFilesFilterMapped(f -> f.endsWith(".pdf"), f -> "./" + f), + allFilesFilterMapped(f -> f.endsWith(".pdf"), f -> "./" + f) + ), + Arguments.of( + UNIX_FS, + "*.pdf", + allFilesFilterMapped(f -> f.endsWith(".pdf"), f -> "./" + f), + allFilesFilterMapped(f -> f.endsWith(".pdf"), f -> "./" + f) + ), + Arguments.of( + OSX_FS, + "*.pdf", + allFilesFilterMapped(f -> f.endsWith(".pdf"), f -> "./" + f), + allFilesFilterMapped(f -> f.endsWith(".pdf"), f -> "./" + f) + ), + + Arguments.of( + WIN_FS, + "*/dir.c/*.svg", + allDirsFlatMapped(d -> allFilesFilterMapped(f -> f.endsWith(".svg"), f -> "./" + d + "/dir.c/" + f)), + allDirsFlatMapped(d -> allFilesFilterMapped(f -> f.endsWith(".svg"), f -> "./" + d + "/dir.c/" + f)) + ), + Arguments.of( + UNIX_FS, + "*/dir.c/*.svg", + allDirsFlatMapped(d -> allFilesFilterMapped(f -> f.endsWith(".svg"), f -> "./" + d + "/dir.c/" + f)), + allDirsFlatMapped(d -> allFilesFilterMapped(f -> f.endsWith(".svg"), f -> "./" + d + "/dir.c/" + f)) + ), + Arguments.of( + OSX_FS, + "*/dir.c/*.svg", + allDirsFlatMapped(d -> allFilesFilterMapped(f -> f.endsWith(".svg"), f -> "./" + d + "/dir.c/" + f)), + allDirsFlatMapped(d -> allFilesFilterMapped(f -> f.endsWith(".svg"), f -> "./" + d + "/dir.c/" + f)) + ), + + Arguments.of( + WIN_FS, + "?.pdf", + setOf("C:/dir-a/a.pdf"), + setOf("C:/dir-a/a.pdf") + ), + Arguments.of( + UNIX_FS, + "?.pdf", + setOf("/dir-a/a.pdf"), + setOf("/dir-a/a.pdf") + ), + Arguments.of( + OSX_FS, + "?.pdf", + setOf("/dir-a/a.pdf"), + setOf("/dir-a/a.pdf") + ), + + Arguments.of( + WIN_FS, + "C:/dir-?/?.pdf", + setOf("C:/dir-a/a.pdf", "C:/dir-b/a.pdf"), + setOf("C:/dir-a/a.pdf", "C:/dir-b/a.pdf") + ), + Arguments.of( + UNIX_FS, + "/dir-?/?.pdf", + setOf("/dir-a/a.pdf", "/dir-b/a.pdf"), + setOf("/dir-a/a.pdf", "/dir-b/a.pdf") + ), + Arguments.of( + OSX_FS, + "/dir-?/?.pdf", + setOf("/dir-a/a.pdf", "/dir-b/a.pdf"), + setOf("/dir-a/a.pdf", "/dir-b/a.pdf") + ), + + Arguments.of( + WIN_FS, + "C:/dir.c/abc.svg", + setOf("C:/dir.c/abc.svg"), + setOf("C:/dir.c/abc.svg") + ), + Arguments.of( + UNIX_FS, + "/dir.c/abc.svg", + setOf("/dir.c/abc.svg"), + setOf("/dir.c/abc.svg") + ), + Arguments.of( + OSX_FS, + "/dir.c/abc.svg", + setOf("/dir.c/abc.svg"), + setOf("/dir.c/abc.svg") + ), + + Arguments.of( + WIN_FS, + "C:/bad", + Collections.emptySet(), + Collections.emptySet() + ), + Arguments.of( + UNIX_FS, + "/bad", + Collections.emptySet(), + Collections.emptySet() + ), + Arguments.of( + OSX_FS, + "/bad", + Collections.emptySet(), + Collections.emptySet() + ), + + Arguments.of( + WIN_FS, + "C:/*/*/*/*/*/*/*", + Collections.emptySet(), + Collections.emptySet() + ), + Arguments.of( + UNIX_FS, + "/*/*/*/*/*/*/*", + Collections.emptySet(), + Collections.emptySet() + ), + Arguments.of( + OSX_FS, + "/*/*/*/*/*/*/*", + Collections.emptySet(), + Collections.emptySet() + ), + + Arguments.of( + WIN_FS, + "C:/dir-?/", + allDirsFlatMapped(d -> !d.startsWith("dir-") + ? Collections.emptySet() + : allFilesMapped(f -> "C:/" + d + "/" + f)), + setOf("C:/dir-a", "C:/dir-b") + ), + Arguments.of( + UNIX_FS, + "/dir-?/", + allDirsFlatMapped(d -> !d.startsWith("dir-") + ? Collections.emptySet() + : allFilesMapped(f -> "/" + d + "/" + f)), + setOf("/dir-a", "/dir-b") + ), + Arguments.of( + OSX_FS, + "/dir-?/", + allDirsFlatMapped(d -> !d.startsWith("dir-") + ? Collections.emptySet() + : allFilesMapped(f -> "/" + d + "/" + f)), + setOf("/dir-a", "/dir-b") + ), + + Arguments.of( + WIN_FS, + "C:/*c*", + allFilesFilterMapped(f -> f.contains("c"), f -> "C:/" + f), + allFilesAndDirsFilterMapped(f -> f.contains("c"), f -> "C:/" + f) + ), + Arguments.of( + UNIX_FS, + "/*c*", + allFilesFilterMapped(f -> f.contains("c"), f -> "/" + f), + allFilesAndDirsFilterMapped(f -> f.contains("c"), f -> "/" + f) + ), + Arguments.of( + OSX_FS, + "/*c*", + allFilesFilterMapped(f -> f.contains("c"), f -> "/" + f), + allFilesAndDirsFilterMapped(f -> f.contains("c"), f -> "/" + f) + ) + ); + } + private static Set allFilesMapped(Function mapper) { return TEST_FILES_ALL .stream() @@ -81,140 +403,4 @@ private static Set allFilesAndDirsFilterMapped(Predicate filter, private static Set setOf(String... files) { return Arrays.stream(files).collect(Collectors.toSet()); } - - @Parameterized.Parameters(name = "{index} :: {1}") - public static Collection data() { - return Arrays.asList(new Object[][]{ - { WIN_FS, "C:/*", allFilesMapped(s -> "C:/" + s), allFilesAndDirsMapped(s -> "C:/" + s) }, - { UNIX_FS, "/*", allFilesMapped(s -> "/" + s), allFilesAndDirsMapped(s -> "/" + s) }, - { OSX_FS, "/*", allFilesMapped(s -> "/" + s), allFilesAndDirsMapped(s -> "/" + s) }, - - // Implicit * appended with trailing / in file mode but not path mode. - { WIN_FS, "C:/*/", allDirsFlatMapped(d -> allFilesMapped(s -> "C:/" + d + "/" + s)), allFilesAndDirsMapped(s -> "C:/" + s) }, - { UNIX_FS, "/*/", allDirsFlatMapped(d -> allFilesMapped(s -> "/" + d + "/" + s)), allFilesAndDirsMapped(s -> "/" + s) }, - { OSX_FS, "/*/", allDirsFlatMapped(d -> allFilesMapped(s -> "/" + d + "/" + s)), allFilesAndDirsMapped(s -> "/" + s) }, - - { WIN_FS, "C:/c.txt", setOf("C:/c.txt"), setOf("C:/c.txt") }, - { UNIX_FS, "/c.txt", setOf("/c.txt"), setOf("/c.txt") }, - { OSX_FS, "/c.txt", setOf("/c.txt"), setOf("/c.txt") }, - - { WIN_FS, "C:/*/c.txt", allDirsMapped(d -> "C:/" + d + "/c.txt"), allDirsMapped(d -> "C:/" + d + "/c.txt") }, - { UNIX_FS, "/*/c.txt", allDirsMapped(d -> "/" + d + "/c.txt"), allDirsMapped(d -> "/" + d + "/c.txt") }, - { OSX_FS, "/*/c.txt", allDirsMapped(d -> "/" + d + "/c.txt"), allDirsMapped(d -> "/" + d + "/c.txt") }, - - { WIN_FS, "C:/dir-b/*.txt", allFilesFilterMapped(f -> f.endsWith(".txt"), f -> "C:/dir-b/" + f), allFilesFilterMapped(f -> f.endsWith(".txt"), f -> "C:/dir-b/" + f) }, - { UNIX_FS, "/dir-b/*.txt", allFilesFilterMapped(f -> f.endsWith(".txt"), f -> "/dir-b/" + f), allFilesFilterMapped(f -> f.endsWith(".txt"), f -> "/dir-b/" + f) }, - { OSX_FS, "/dir-b/*.txt", allFilesFilterMapped(f -> f.endsWith(".txt"), f -> "/dir-b/" + f), allFilesFilterMapped(f -> f.endsWith(".txt"), f -> "/dir-b/" + f) }, - - { WIN_FS, "*.pdf", allFilesFilterMapped(f -> f.endsWith(".pdf"), f -> "./" + f), allFilesFilterMapped(f -> f.endsWith(".pdf"), f -> "./" + f) }, - { UNIX_FS, "*.pdf", allFilesFilterMapped(f -> f.endsWith(".pdf"), f -> "./" + f), allFilesFilterMapped(f -> f.endsWith(".pdf"), f -> "./" + f) }, - { OSX_FS, "*.pdf", allFilesFilterMapped(f -> f.endsWith(".pdf"), f -> "./" + f), allFilesFilterMapped(f -> f.endsWith(".pdf"), f -> "./" + f) }, - - { WIN_FS, "*/dir.c/*.svg", allDirsFlatMapped(d -> allFilesFilterMapped(f -> f.endsWith(".svg"), f -> "./" + d + "/dir.c/" + f)), allDirsFlatMapped(d -> allFilesFilterMapped(f -> f.endsWith(".svg"), f -> "./" + d + "/dir.c/" + f)) }, - { UNIX_FS, "*/dir.c/*.svg", allDirsFlatMapped(d -> allFilesFilterMapped(f -> f.endsWith(".svg"), f -> "./" + d + "/dir.c/" + f)), allDirsFlatMapped(d -> allFilesFilterMapped(f -> f.endsWith(".svg"), f -> "./" + d + "/dir.c/" + f)) }, - { OSX_FS, "*/dir.c/*.svg", allDirsFlatMapped(d -> allFilesFilterMapped(f -> f.endsWith(".svg"), f -> "./" + d + "/dir.c/" + f)), allDirsFlatMapped(d -> allFilesFilterMapped(f -> f.endsWith(".svg"), f -> "./" + d + "/dir.c/" + f)) }, - - { WIN_FS, "?.pdf", setOf("C:/dir-a/a.pdf"), setOf("C:/dir-a/a.pdf") }, - { UNIX_FS, "?.pdf", setOf("/dir-a/a.pdf"), setOf("/dir-a/a.pdf") }, - { OSX_FS, "?.pdf", setOf("/dir-a/a.pdf"), setOf("/dir-a/a.pdf") }, - - { WIN_FS, "C:/dir-?/?.pdf", setOf("C:/dir-a/a.pdf", "C:/dir-b/a.pdf"), setOf("C:/dir-a/a.pdf", "C:/dir-b/a.pdf") }, - { UNIX_FS, "/dir-?/?.pdf", setOf("/dir-a/a.pdf", "/dir-b/a.pdf"), setOf("/dir-a/a.pdf", "/dir-b/a.pdf") }, - { OSX_FS, "/dir-?/?.pdf", setOf("/dir-a/a.pdf", "/dir-b/a.pdf"), setOf("/dir-a/a.pdf", "/dir-b/a.pdf") }, - - { WIN_FS, "C:/dir.c/abc.svg", setOf("C:/dir.c/abc.svg"), setOf("C:/dir.c/abc.svg") }, - { UNIX_FS, "/dir.c/abc.svg", setOf("/dir.c/abc.svg"), setOf("/dir.c/abc.svg") }, - { OSX_FS, "/dir.c/abc.svg", setOf("/dir.c/abc.svg"), setOf("/dir.c/abc.svg") }, - - { WIN_FS, "C:/bad", Collections.emptySet(), Collections.emptySet() }, - { UNIX_FS, "/bad", Collections.emptySet(), Collections.emptySet() }, - { OSX_FS, "/bad", Collections.emptySet(), Collections.emptySet() }, - - { WIN_FS, "C:/*/*/*/*/*/*/*", Collections.emptySet(), Collections.emptySet() }, - { UNIX_FS, "/*/*/*/*/*/*/*", Collections.emptySet(), Collections.emptySet() }, - { OSX_FS, "/*/*/*/*/*/*/*", Collections.emptySet(), Collections.emptySet() }, - - { WIN_FS, "C:/dir-?/", allDirsFlatMapped(d -> !d.startsWith("dir-") ? Collections.emptySet() : allFilesMapped(f -> "C:/" + d + "/" + f)), setOf("C:/dir-a", "C:/dir-b") }, - { UNIX_FS, "/dir-?/", allDirsFlatMapped(d -> !d.startsWith("dir-") ? Collections.emptySet() : allFilesMapped(f -> "/" + d + "/" + f)), setOf("/dir-a", "/dir-b") }, - { OSX_FS, "/dir-?/", allDirsFlatMapped(d -> !d.startsWith("dir-") ? Collections.emptySet() : allFilesMapped(f -> "/" + d + "/" + f)), setOf("/dir-a", "/dir-b") }, - - { WIN_FS, "C:/*c*", allFilesFilterMapped(f -> f.contains("c"), f -> "C:/" + f), allFilesAndDirsFilterMapped(f -> f.contains("c"), f -> "C:/" + f) }, - { UNIX_FS, "/*c*", allFilesFilterMapped(f -> f.contains("c"), f -> "/" + f), allFilesAndDirsFilterMapped(f -> f.contains("c"), f -> "/" + f) }, - { OSX_FS, "/*c*", allFilesFilterMapped(f -> f.contains("c"), f -> "/" + f), allFilesAndDirsFilterMapped(f -> f.contains("c"), f -> "/" + f) }, - }); - } - - private final Configuration fsConfig; - private final String glob; - private final Set files; - private final Set paths; - - private FileSystem fs; - - public GlobFinderTest(Configuration fsConfig, String glob, Set files, Set paths) { - this.fsConfig = fsConfig; - this.glob = glob; - this.files = files; - this.paths = paths; - } - - @Before - public void setUp() throws Exception { - this.fs = Jimfs.newFileSystem(this.fsConfig); - - List roots = StreamSupport.stream(this.fs.getRootDirectories().spliterator(), false).collect(Collectors.toList()); - roots.add(this.fs.getPath(".")); - - for (Path dir1 : roots) { - for (String dir2 : new String[]{ ".", "dir-a", "dir-b", "dir.c" }) { - for (String dir3 : new String[]{ ".", "dir-a", "dir-b", "dir.c" }) { - for (String dir4 : new String[]{ ".", "dir-a", "dir-b", "dir.c" }) { - Files.createDirectories(this.fs.getPath(dir1.toString(), dir2, dir3, dir4)); - - for (String file : TEST_FILES_ALL) { - try { - Files.createFile(this.fs.getPath(dir1.toString(), dir2, dir3, dir4, file)); - } catch (FileAlreadyExistsException ignore) {} - } - } - } - } - } - } - - @After - public void tearDown() throws Exception { - this.fs = null; - } - - @Test - public void test() throws Exception { - GlobFinder finder = new GlobFinder(this.fs, this.glob); - - assertEquals( - String.format("Glob files: '%s'", this.glob), - this.files.stream() - .map(this.fs::getPath) - .map(Path::normalize) - .map(Path::toAbsolutePath) - .collect(Collectors.toSet()), - StreamSupport.stream(finder.computeMatchingFiles().spliterator(), false) - .map(Path::normalize) - .map(Path::toAbsolutePath) - .collect(Collectors.toSet()) - ); - - assertEquals( - String.format("Glob paths: '%s'", this.glob), - this.paths.stream() - .map(this.fs::getPath) - .map(Path::normalize) - .map(Path::toAbsolutePath) - .collect(Collectors.toSet()), - StreamSupport.stream(finder.computeMatchingPaths().spliterator(), false) - .map(Path::normalize) - .map(Path::toAbsolutePath) - .collect(Collectors.toSet()) - ); - } -} \ No newline at end of file +} diff --git a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/util/InheritanceIteratorTest.java b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/util/InheritanceIteratorTest.java index 08eeec8..7a13413 100644 --- a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/util/InheritanceIteratorTest.java +++ b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/util/InheritanceIteratorTest.java @@ -1,87 +1,120 @@ package org.dflib.jjava.jupyter.kernel.util; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; import java.util.LinkedList; import java.util.List; +import java.util.stream.Stream; -import static org.junit.Assert.assertEquals; - -@RunWith(Parameterized.class) public class InheritanceIteratorTest { - interface I {} - - interface J extends I {} - interface K extends J, I {} + @ParameterizedTest + @MethodSource("data") + public void test(Class root, List> expected) { + List> actual = collectIteration(root); - interface L extends J, K {} + Assertions.assertEquals(expected, actual); + } - class A {} + public static Stream data() { + return Stream.of( + Arguments.of( + A.class, + List.of(A.class, Object.class) + ), + Arguments.of( + B.class, + List.of(B.class, A.class, Object.class) + ), + Arguments.of( + C.class, + List.of(C.class, B.class, A.class, Object.class) + ), + Arguments.of( + int.class, + List.of(int.class) + ), + Arguments.of( + D.class, + List.of(D.class, Object.class) + ), + Arguments.of( + E.class, + List.of(E.class, L.class, J.class, K.class, I.class, D.class, Object.class) + ), + Arguments.of( + F.class, + List.of(F.class, J.class, K.class, I.class, E.class, L.class, D.class, Object.class) + ), + Arguments.of( + G.class, + List.of(G.class, N.class, O.class, Object.class) + ), + Arguments.of( + H.class, + List.of(H.class, Q.class, P.class, M.class, N.class, Object.class) + ) + ); + } - class B extends A {} + private List> collectIteration(Class root) { + List> data = new LinkedList<>(); + InheritanceIterator it = new InheritanceIterator(root); + while (it.hasNext()) data.add(it.next()); + return data; + } - class C extends B {} + interface I { + } - class D {} + interface J extends I { + } - class E extends D implements L {} + interface K extends J, I { + } - class F extends E implements J, K {} + interface L extends J, K { + } - interface M {} + class A { + } - interface N {} + class B extends A { + } - interface O extends N {} + class C extends B { + } - interface P extends N, M {} + class D { + } - interface Q extends P, M {} + class E extends D implements L { + } - class G implements N, O {} + class F extends E implements J, K { + } - class H implements Q {} + interface M { + } - @Parameterized.Parameters - public static Collection data() { - return Arrays.asList(new Object[][]{ - { A.class, Arrays.asList(A.class, Object.class) }, - { B.class, Arrays.asList(B.class, A.class, Object.class) }, - { C.class, Arrays.asList(C.class, B.class, A.class, Object.class) }, - { int.class, Collections.singletonList(int.class) }, - { D.class, Arrays.asList(D.class, Object.class) }, - { E.class, Arrays.asList(E.class, L.class, J.class, K.class, I.class, D.class, Object.class) }, - { F.class, Arrays.asList(F.class, J.class, K.class, I.class, E.class, L.class, D.class, Object.class) }, - { G.class, Arrays.asList(G.class, N.class, O.class, Object.class) }, - { H.class, Arrays.asList(H.class, Q.class, P.class, M.class, N.class, Object.class) }, - }); + interface N { } - private final Class root; - private final List expectedOrder; + interface O extends N { + } - public InheritanceIteratorTest(Class root, List expectedOrder) { - this.root = root; - this.expectedOrder = expectedOrder; + interface P extends N, M { } - private List collectIteration(Class root) { - List data = new LinkedList<>(); - InheritanceIterator it = new InheritanceIterator(root); - while (it.hasNext()) data.add(it.next()); - return data; + interface Q extends P, M { } - @Test - public void test() { - List actual = collectIteration(this.root); + class G implements N, O { + } - assertEquals(this.expectedOrder, actual); + class H implements Q { } -} \ No newline at end of file +} diff --git a/pom.xml b/pom.xml index cb5804f..0e34cb6 100644 --- a/pom.xml +++ b/pom.xml @@ -44,13 +44,12 @@ UTF-8 11 - 2.3.0 2.5.2 3.6.0 2.11.0 0.6.0 - 4.13.1 + 5.11.2 1.3 1.3.0 @@ -101,10 +100,14 @@ ${jeromq.version} - - junit - junit - ${junit4.version} + org.junit.jupiter + junit-jupiter-api + ${junit5.version} + + + org.junit.jupiter + junit-jupiter-params + ${junit5.version} org.hamcrest From c687b2eab885fab0ce221a71e5052d026839831a Mon Sep 17 00:00:00 2001 From: Mikhail Dzianishchyts Date: Fri, 11 Oct 2024 17:48:49 +0300 Subject: [PATCH 02/11] Provide IT setup --- jjava/pom.xml | 17 +++++- .../kernel/testcontainers/KernelIT.java | 57 +++++++++++++++++++ .../testcontainers/KernelStartupTestIT.java | 18 ++++++ pom.xml | 12 ++++ 4 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 jjava/src/test/java/org/dflib/jjava/jupyter/kernel/testcontainers/KernelIT.java create mode 100644 jjava/src/test/java/org/dflib/jjava/jupyter/kernel/testcontainers/KernelStartupTestIT.java diff --git a/jjava/pom.xml b/jjava/pom.xml index 76daa2d..a326bf6 100644 --- a/jjava/pom.xml +++ b/jjava/pom.xml @@ -31,6 +31,21 @@ org.apache.maven maven-model-builder + + org.junit.jupiter + junit-jupiter-api + test + + + org.testcontainers + testcontainers + test + + + org.slf4j + slf4j-simple + test + @@ -177,4 +192,4 @@ - \ No newline at end of file + diff --git a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/testcontainers/KernelIT.java b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/testcontainers/KernelIT.java new file mode 100644 index 0000000..dde5bed --- /dev/null +++ b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/testcontainers/KernelIT.java @@ -0,0 +1,57 @@ +package org.dflib.jjava.jupyter.kernel.testcontainers; + +import org.testcontainers.containers.BindMode; +import org.testcontainers.containers.Container; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; + +import java.io.IOException; +import java.time.Duration; + +public abstract class KernelIT { + + private static final String BASE_IMAGE = String.format("eclipse-temurin:%s", Runtime.version().version().get(0)); + private static final String FS_KERNELSPEC = "../kernelspec/java"; + private static final String CONTAINER_KERNELSPEC = "/usr/share/jupyter/kernels/java"; + private static final String WORKING_DIRECTORY = "/test"; + + protected static final GenericContainer container; + + static { + container = new GenericContainer<>(BASE_IMAGE) + .withWorkingDirectory(WORKING_DIRECTORY) + .withCommand("bash", "-c", getStartupCommand()) + .withFileSystemBind(FS_KERNELSPEC, CONTAINER_KERNELSPEC, BindMode.READ_ONLY) + .waitingFor(Wait.forSuccessfulCommand(getSuccessfulCommand())) + .withStartupTimeout(Duration.ofMinutes(3)); + container.start(); + } + + private static String getStartupCommand() { + return String.join(" && ", + "apt-get update", + "apt-get install --no-install-recommends -y python3 python3-pip python3-venv", + "python3 -m venv ./venv", + venvCommand("pip install jupyter-console --progress-bar off"), + "tail -f /dev/null" + ); + } + + private static String getSuccessfulCommand() { + return venvCommand("jupyter kernelspec list") + + "| grep ' java ' &&" + + venvCommand("jupyter console --version"); + } + + private static String venvCommand(String command) { + return WORKING_DIRECTORY + "/venv/bin/" + command; + } + + protected Container.ExecResult executeInKernel(String snippet) throws IOException, InterruptedException { + return container.execInContainer( + "bash", + "-c", + "echo '" + snippet + "' | " + venvCommand("jupyter console --kernel=java --simple-prompt") + ); + } +} diff --git a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/testcontainers/KernelStartupTestIT.java b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/testcontainers/KernelStartupTestIT.java new file mode 100644 index 0000000..fd6ed4d --- /dev/null +++ b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/testcontainers/KernelStartupTestIT.java @@ -0,0 +1,18 @@ +package org.dflib.jjava.jupyter.kernel.testcontainers; + +import org.hamcrest.CoreMatchers; +import org.hamcrest.MatcherAssert; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.Container; + +class KernelStartupTestIT extends KernelIT { + + @Test + void startUp() throws Exception { + Container.ExecResult snippetResult = executeInKernel("System.out.println(\"Hello world!\");"); + + Assertions.assertEquals(0, snippetResult.getExitCode(), snippetResult.getStderr()); + MatcherAssert.assertThat(snippetResult.getStdout(), CoreMatchers.containsString("Hello world!")); + } +} diff --git a/pom.xml b/pom.xml index 0e34cb6..9b4e057 100644 --- a/pom.xml +++ b/pom.xml @@ -52,6 +52,8 @@ 5.11.2 1.3 1.3.0 + 1.20.2 + 1.7.36 https://github.com/dflib/jjava @@ -119,6 +121,16 @@ jimfs ${jimfs.version} + + org.testcontainers + testcontainers + ${testcontainers.version} + + + org.slf4j + slf4j-simple + ${slf4j.version} + From 6ceefe7213576647e60033675fa005888e5861ed Mon Sep 17 00:00:00 2001 From: Mikhail Dzianishchyts Date: Fri, 25 Oct 2024 19:20:36 +0300 Subject: [PATCH 03/11] Simplify with static imports --- .../RenderRequestTypesResolutionTest.java | 5 +- .../jupyter/kernel/display/RendererTest.java | 158 +++++++++--------- .../kernel/display/mime/MIMETypeTest.java | 5 +- .../jupyter/kernel/magic/MagicParserTest.java | 28 ++-- .../kernel/magic/registry/MagicsArgsTest.java | 14 +- .../kernel/magic/registry/MagicsTest.java | 43 ++--- .../jupyter/kernel/util/GlobFinderTest.java | 7 +- .../kernel/util/InheritanceIteratorTest.java | 5 +- 8 files changed, 138 insertions(+), 127 deletions(-) diff --git a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/RenderRequestTypesResolutionTest.java b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/RenderRequestTypesResolutionTest.java index 7bfee15..fd42cfb 100644 --- a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/RenderRequestTypesResolutionTest.java +++ b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/RenderRequestTypesResolutionTest.java @@ -1,7 +1,6 @@ package org.dflib.jjava.jupyter.kernel.display; import org.dflib.jjava.jupyter.kernel.display.mime.MIMEType; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -9,6 +8,8 @@ import java.util.List; import java.util.stream.Stream; +import static org.junit.jupiter.api.Assertions.assertEquals; + public class RenderRequestTypesResolutionTest { @ParameterizedTest @@ -33,7 +34,7 @@ public void test(String supported, String expected, List requestTypes) { MIMEType actualMime = renderRequestTypes.resolveSupportedType(supportedMime); - Assertions.assertEquals(expectedMime, actualMime); + assertEquals(expectedMime, actualMime); } public static Stream data() { diff --git a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/RendererTest.java b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/RendererTest.java index a759d8f..ac69d03 100644 --- a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/RendererTest.java +++ b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/RendererTest.java @@ -1,7 +1,6 @@ package org.dflib.jjava.jupyter.kernel.display; import org.dflib.jjava.jupyter.kernel.display.mime.MIMEType; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,6 +9,9 @@ import java.util.LinkedHashSet; import java.util.Set; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + class RendererTest { private Renderer renderer; @@ -51,227 +53,227 @@ public void setUp() { void rendersPlainText() { DisplayData data = this.renderer.render(new A()); - Assertions.assertEquals("A", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("A", data.getData(MIMEType.TEXT_PLAIN)); } @Test void alwaysRendersPlainText() { DisplayData data = this.renderer.render(new B()); - Assertions.assertEquals("B", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("B", data.getData(MIMEType.TEXT_PLAIN)); } @Test void rendersPreferred() { DisplayData data = this.renderer.render(new B()); - Assertions.assertEquals("**B**", data.getData(MIMEType.TEXT_MARKDOWN)); + assertEquals("**B**", data.getData(MIMEType.TEXT_MARKDOWN)); } @Test void rendersJustPreferred() { DisplayData data = this.renderer.render(new C()); - Assertions.assertEquals(".c{}", data.getData(MIMEType.TEXT_CSS)); - Assertions.assertEquals("C", data.getData(MIMEType.TEXT_PLAIN)); - Assertions.assertNull(data.getData(MIMEType.TEXT_MARKDOWN)); + assertEquals(".c{}", data.getData(MIMEType.TEXT_CSS)); + assertEquals("C", data.getData(MIMEType.TEXT_PLAIN)); + assertNull(data.getData(MIMEType.TEXT_MARKDOWN)); } @Test void rendersExternal() { DisplayData data = this.renderer.render(new D()); - Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); - Assertions.assertEquals("D", data.getData(MIMEType.TEXT_PLAIN)); - Assertions.assertNull(data.getData(MIMEType.TEXT_LATEX)); + assertEquals("", data.getData(MIMEType.TEXT_HTML)); + assertEquals("D", data.getData(MIMEType.TEXT_PLAIN)); + assertNull(data.getData(MIMEType.TEXT_LATEX)); } @Test void rendersAs() { DisplayData data = this.renderer.renderAs(new C(), "text/markdown"); - Assertions.assertEquals("**C**", data.getData(MIMEType.TEXT_MARKDOWN)); - Assertions.assertEquals("C", data.getData(MIMEType.TEXT_PLAIN)); - Assertions.assertNull(data.getData(MIMEType.TEXT_CSS)); + assertEquals("**C**", data.getData(MIMEType.TEXT_MARKDOWN)); + assertEquals("C", data.getData(MIMEType.TEXT_PLAIN)); + assertNull(data.getData(MIMEType.TEXT_CSS)); } @Test void rendersAsExternal() { DisplayData data = this.renderer.renderAs(new D(), "text/latex"); - Assertions.assertEquals("\\d", data.getData(MIMEType.TEXT_LATEX)); - Assertions.assertEquals("D", data.getData(MIMEType.TEXT_PLAIN)); - Assertions.assertNull(data.getData(MIMEType.TEXT_HTML)); + assertEquals("\\d", data.getData(MIMEType.TEXT_LATEX)); + assertEquals("D", data.getData(MIMEType.TEXT_PLAIN)); + assertNull(data.getData(MIMEType.TEXT_HTML)); } @Test void supportsPreferringAll() { DisplayData data = this.renderer.render(new E()); - Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); - Assertions.assertEquals(".e{}", data.getData(MIMEType.TEXT_CSS)); - Assertions.assertEquals("e();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - Assertions.assertEquals("E", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("", data.getData(MIMEType.TEXT_HTML)); + assertEquals(".e{}", data.getData(MIMEType.TEXT_CSS)); + assertEquals("e();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + assertEquals("E", data.getData(MIMEType.TEXT_PLAIN)); } @Test void supportsPreferringAllExternal() { DisplayData data = this.renderer.render(new F()); - Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); - Assertions.assertEquals(".f{}", data.getData(MIMEType.TEXT_CSS)); - Assertions.assertEquals("f();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - Assertions.assertEquals("F", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("", data.getData(MIMEType.TEXT_HTML)); + assertEquals(".f{}", data.getData(MIMEType.TEXT_CSS)); + assertEquals("f();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + assertEquals("F", data.getData(MIMEType.TEXT_PLAIN)); } @Test void supportsPreferringAllRequestingAll() { DisplayData data = this.renderer.renderAs(new E(), "*"); - Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); - Assertions.assertEquals(".e{}", data.getData(MIMEType.TEXT_CSS)); - Assertions.assertEquals("e();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - Assertions.assertEquals("E", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("", data.getData(MIMEType.TEXT_HTML)); + assertEquals(".e{}", data.getData(MIMEType.TEXT_CSS)); + assertEquals("e();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + assertEquals("E", data.getData(MIMEType.TEXT_PLAIN)); } @Test void supportsPreferringAllRequestingAllExternal() { DisplayData data = this.renderer.renderAs(new F(), "*"); - Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); - Assertions.assertEquals(".f{}", data.getData(MIMEType.TEXT_CSS)); - Assertions.assertEquals("f();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - Assertions.assertEquals("F", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("", data.getData(MIMEType.TEXT_HTML)); + assertEquals(".f{}", data.getData(MIMEType.TEXT_CSS)); + assertEquals("f();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + assertEquals("F", data.getData(MIMEType.TEXT_PLAIN)); } @Test void supportsPreferringAllRequestingSome() { DisplayData data = this.renderer.renderAs(new E(), "text/html"); - Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); - Assertions.assertNull(data.getData(MIMEType.TEXT_CSS)); - Assertions.assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - Assertions.assertEquals("E", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("", data.getData(MIMEType.TEXT_HTML)); + assertNull(data.getData(MIMEType.TEXT_CSS)); + assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + assertEquals("E", data.getData(MIMEType.TEXT_PLAIN)); } @Test void supportsPreferringAllRequestingSomeExternal() { DisplayData data = this.renderer.renderAs(new F(), "text/html"); - Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); - Assertions.assertNull(data.getData(MIMEType.TEXT_CSS)); - Assertions.assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - Assertions.assertEquals("F", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("", data.getData(MIMEType.TEXT_HTML)); + assertNull(data.getData(MIMEType.TEXT_CSS)); + assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + assertEquals("F", data.getData(MIMEType.TEXT_PLAIN)); } @Test void supportsPreferringAllRequestingGroup() { DisplayData data = this.renderer.renderAs(new E(), "text/*"); - Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); - Assertions.assertEquals(".e{}", data.getData(MIMEType.TEXT_CSS)); - Assertions.assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - Assertions.assertEquals("E", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("", data.getData(MIMEType.TEXT_HTML)); + assertEquals(".e{}", data.getData(MIMEType.TEXT_CSS)); + assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + assertEquals("E", data.getData(MIMEType.TEXT_PLAIN)); } @Test void supportsPreferringAllRequestingGroupExternal() { DisplayData data = this.renderer.renderAs(new F(), "text/*"); - Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); - Assertions.assertEquals(".f{}", data.getData(MIMEType.TEXT_CSS)); - Assertions.assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - Assertions.assertEquals("F", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("", data.getData(MIMEType.TEXT_HTML)); + assertEquals(".f{}", data.getData(MIMEType.TEXT_CSS)); + assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + assertEquals("F", data.getData(MIMEType.TEXT_PLAIN)); } @Test void supportsPreferringGroup() { DisplayData data = this.renderer.render(new G()); - Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); - Assertions.assertEquals(".g{}", data.getData(MIMEType.TEXT_CSS)); - Assertions.assertEquals("g();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - Assertions.assertEquals("G", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("", data.getData(MIMEType.TEXT_HTML)); + assertEquals(".g{}", data.getData(MIMEType.TEXT_CSS)); + assertEquals("g();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + assertEquals("G", data.getData(MIMEType.TEXT_PLAIN)); } @Test void supportsPreferringGroupExternal() { DisplayData data = this.renderer.render(new H()); - Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); - Assertions.assertEquals(".h{}", data.getData(MIMEType.TEXT_CSS)); - Assertions.assertEquals("h();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - Assertions.assertEquals("H", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("", data.getData(MIMEType.TEXT_HTML)); + assertEquals(".h{}", data.getData(MIMEType.TEXT_CSS)); + assertEquals("h();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + assertEquals("H", data.getData(MIMEType.TEXT_PLAIN)); } @Test void supportsPreferringGroupRequestingSome() { DisplayData data = this.renderer.renderAs(new G(), "text/html"); - Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); - Assertions.assertNull(data.getData(MIMEType.TEXT_CSS)); - Assertions.assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - Assertions.assertEquals("G", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("", data.getData(MIMEType.TEXT_HTML)); + assertNull(data.getData(MIMEType.TEXT_CSS)); + assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + assertEquals("G", data.getData(MIMEType.TEXT_PLAIN)); } @Test void supportsPreferringGroupRequestingSomeExternal() { DisplayData data = this.renderer.renderAs(new H(), "text/html"); - Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); - Assertions.assertNull(data.getData(MIMEType.TEXT_CSS)); - Assertions.assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - Assertions.assertEquals("H", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("", data.getData(MIMEType.TEXT_HTML)); + assertNull(data.getData(MIMEType.TEXT_CSS)); + assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + assertEquals("H", data.getData(MIMEType.TEXT_PLAIN)); } @Test void supportsPreferringGroupRequestingGroup() { DisplayData data = this.renderer.renderAs(new G(), "text/*"); - Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); - Assertions.assertEquals(".g{}", data.getData(MIMEType.TEXT_CSS)); - Assertions.assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - Assertions.assertEquals("G", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("", data.getData(MIMEType.TEXT_HTML)); + assertEquals(".g{}", data.getData(MIMEType.TEXT_CSS)); + assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + assertEquals("G", data.getData(MIMEType.TEXT_PLAIN)); } @Test void supportsPreferringGroupRequestingGroupExternal() { DisplayData data = this.renderer.renderAs(new H(), "text/*"); - Assertions.assertEquals("", data.getData(MIMEType.TEXT_HTML)); - Assertions.assertEquals(".h{}", data.getData(MIMEType.TEXT_CSS)); - Assertions.assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - Assertions.assertEquals("H", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("", data.getData(MIMEType.TEXT_HTML)); + assertEquals(".h{}", data.getData(MIMEType.TEXT_CSS)); + assertNull(data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + assertEquals("H", data.getData(MIMEType.TEXT_PLAIN)); } @Test void supportsOverridingTextRepresentation() { DisplayData data = this.renderer.render(new I()); - Assertions.assertEquals("I!", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("I!", data.getData(MIMEType.TEXT_PLAIN)); } @Test void supportsOverridingTextRepresentationExternal() { DisplayData data = this.renderer.render(new J()); - Assertions.assertEquals("J!", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("J!", data.getData(MIMEType.TEXT_PLAIN)); } @Test void supportsOverridingTextRepresentationWhenNotRequested() { DisplayData data = this.renderer.renderAs(new I(), "application/javascript"); - Assertions.assertEquals("i();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - Assertions.assertEquals("I!", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("i();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + assertEquals("I!", data.getData(MIMEType.TEXT_PLAIN)); } @Test void supportsOverridingTextRepresentationWhenNotRequestedExternal() { DisplayData data = this.renderer.renderAs(new J(), "application/javascript"); - Assertions.assertEquals("j();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); - Assertions.assertEquals("J!", data.getData(MIMEType.TEXT_PLAIN)); + assertEquals("j();", data.getData(MIMEType.APPLICATION_JAVASCRIPT)); + assertEquals("J!", data.getData(MIMEType.TEXT_PLAIN)); } class A { diff --git a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/mime/MIMETypeTest.java b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/mime/MIMETypeTest.java index f05e728..b96c44c 100644 --- a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/mime/MIMETypeTest.java +++ b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/display/mime/MIMETypeTest.java @@ -1,9 +1,10 @@ package org.dflib.jjava.jupyter.kernel.display.mime; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; +import static org.junit.jupiter.api.Assertions.assertEquals; + public class MIMETypeTest { @ParameterizedTest(name = "{index}: MIMEType.parse({0}) = new MIMEType({1}, {2}, {3}, {4})") @@ -23,6 +24,6 @@ public void test(String raw, String type, String tree, String subtype, String su MIMEType expected = new MIMEType(type, tree, subtype, suffix); MIMEType actual = MIMEType.parse(raw); - Assertions.assertEquals(expected, actual); + assertEquals(expected, actual); } } diff --git a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/MagicParserTest.java b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/MagicParserTest.java index 71c5956..dac440b 100644 --- a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/MagicParserTest.java +++ b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/MagicParserTest.java @@ -1,12 +1,14 @@ package org.dflib.jjava.jupyter.kernel.magic; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.List; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + public class MagicParserTest { private MagicParser inlineParser; private MagicParser solParser; @@ -37,7 +39,7 @@ public void transformLineMagics() { "**magicName3-arg1,arg2 arg2" ); - Assertions.assertEquals(expectedTransformedCell, transformedCell); + assertEquals(expectedTransformedCell, transformedCell); } @Test @@ -50,12 +52,12 @@ public void parseCellMagic() { CellMagicParseContext ctx = this.inlineParser.parseCellMagic(cell); - Assertions.assertNotNull(ctx); - Assertions.assertEquals("cellMagicName", ctx.getMagicCall().getName()); - Assertions.assertEquals(Arrays.asList("arg1", "arg2 arg2", "arg3"), ctx.getMagicCall().getArgs()); - Assertions.assertEquals("This is the body\nwith multiple lines", ctx.getMagicCall().getBody()); - Assertions.assertEquals("//%%cellMagicName arg1 \"arg2 arg2\" arg3 ", ctx.getRawArgsLine()); - Assertions.assertEquals(cell, ctx.getRawCell()); + assertNotNull(ctx); + assertEquals("cellMagicName", ctx.getMagicCall().getName()); + assertEquals(Arrays.asList("arg1", "arg2 arg2", "arg3"), ctx.getMagicCall().getArgs()); + assertEquals("This is the body\nwith multiple lines", ctx.getMagicCall().getBody()); + assertEquals("//%%cellMagicName arg1 \"arg2 arg2\" arg3 ", ctx.getRawArgsLine()); + assertEquals(cell, ctx.getRawCell()); } @Test @@ -73,7 +75,7 @@ public void transformCellMagic() { String expectedTransformedCell = "cellMagicName(arg1,arg2 arg2,arg3)\nThis is the body\nwith multiple lines"; - Assertions.assertEquals(expectedTransformedCell, transformedCell); + assertEquals(expectedTransformedCell, transformedCell); } @Test @@ -86,7 +88,7 @@ public void dontTransformNonMagicCell() { String transformedCell = this.inlineParser.transformCellMagic(cell, ctx -> "transformer applied"); - Assertions.assertEquals(cell, transformedCell); + assertEquals(cell, transformedCell); } @Test @@ -95,7 +97,7 @@ public void startOfLineParserSkipsInlineMagics() { String transformedCell = this.solParser.transformLineMagics(cell, ctx -> ""); - Assertions.assertEquals(cell, transformedCell); + assertEquals(cell, transformedCell); } @Test @@ -113,7 +115,7 @@ public void startOfLineParserAllowsWhitespace() { "sol3" ); - Assertions.assertEquals(expectedTransformedCell, transformedCell); + assertEquals(expectedTransformedCell, transformedCell); } @Test @@ -129,7 +131,7 @@ public void startOfLineParserSkipsInline() { "Not //%sol" ); - Assertions.assertEquals(expectedTransformedCell, transformedCell); + assertEquals(expectedTransformedCell, transformedCell); } public static List split(String args) { diff --git a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/registry/MagicsArgsTest.java b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/registry/MagicsArgsTest.java index 8490a69..9260b94 100644 --- a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/registry/MagicsArgsTest.java +++ b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/registry/MagicsArgsTest.java @@ -2,7 +2,6 @@ import org.dflib.jjava.jupyter.kernel.magic.MagicParserTest; import org.hamcrest.Matcher; -import org.hamcrest.MatcherAssert; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -14,6 +13,7 @@ import java.util.function.Consumer; import java.util.stream.Stream; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.hasEntry; @@ -25,7 +25,7 @@ public void values(MagicsArgs schema, String args, Matcher rawArgs = MagicParserTest.split(args); Map> actual = Assertions.assertDoesNotThrow(() -> schema.parse(rawArgs)); - MatcherAssert.assertThat(actual, matcher); + assertThat(actual, matcher); } public static Stream values() { @@ -146,7 +146,7 @@ public void flags(MagicsArgs schema, String args, Matcher rawArgs = MagicParserTest.split(args); Map> actual = Assertions.assertDoesNotThrow(() -> schema.parse(rawArgs)); - MatcherAssert.assertThat(actual, matcher); + assertThat(actual, matcher); } public static Stream flags() { @@ -185,7 +185,7 @@ public void keywords(MagicsArgs schema, String args, Matcher rawArgs = MagicParserTest.split(args); Map> actual = Assertions.assertDoesNotThrow(() -> schema.parse(rawArgs)); - MatcherAssert.assertThat(actual, matcher); + assertThat(actual, matcher); } public static Stream keywords() { @@ -229,7 +229,7 @@ public void flagsAndKeyWords(MagicsArgs schema, String args, Matcher rawArgs = MagicParserTest.split(args); Map> actual = Assertions.assertDoesNotThrow(() -> schema.parse(rawArgs)); - MatcherAssert.assertThat(actual, matcher); + assertThat(actual, matcher); } public static Stream flagsAndKeyWords() { @@ -249,7 +249,7 @@ public void positionalsAndFlagsAndKeywords(MagicsArgs schema, String args, List rawArgs = MagicParserTest.split(args); Map> actual = Assertions.assertDoesNotThrow(() -> schema.parse(rawArgs)); - MatcherAssert.assertThat(actual, matcher); + assertThat(actual, matcher); } public static Stream positionalsAndFlagsAndKeywords() { @@ -274,7 +274,7 @@ public void strange(MagicsArgs schema, String args, Matcher rawArgs = MagicParserTest.split(args); Map> actual = Assertions.assertDoesNotThrow(() -> schema.parse(rawArgs)); - MatcherAssert.assertThat(actual, matcher); + assertThat(actual, matcher); } public static Stream strange() { diff --git a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/registry/MagicsTest.java b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/registry/MagicsTest.java index bf6c673..b2e54c4 100644 --- a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/registry/MagicsTest.java +++ b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/magic/registry/MagicsTest.java @@ -1,6 +1,5 @@ package org.dflib.jjava.jupyter.kernel.magic.registry; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,6 +9,10 @@ import java.util.List; import java.util.Set; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.fail; + public class MagicsTest { private Magics magics; @@ -25,7 +28,7 @@ public void lineMagic() throws Exception { List args = Arrays.asList("arg1", "arg2"); List out = magics.applyLineMagic("test", args); - Assertions.assertEquals(args, out); + assertEquals(args, out); } @Test @@ -43,7 +46,7 @@ public void cellMagic() throws Exception { List expected = new LinkedList<>(args); expected.add(body); - Assertions.assertEquals(expected, out); + assertEquals(expected, out); } @Test @@ -73,8 +76,8 @@ public List execute(List args) { List expectedCell = new LinkedList<>(args); expectedCell.add(body); - Assertions.assertEquals(args, lineOut); - Assertions.assertEquals(expectedCell, cellOut); + assertEquals(args, lineOut); + assertEquals(expectedCell, cellOut); } @Test @@ -105,11 +108,11 @@ public int returnInt(List args) { magics.applyLineMagic("list", args); magics.applyLineMagic("iterable", args); magics.applyLineMagic("named", args); - Assertions.assertEquals((Integer) 2, magics.applyLineMagic("returnInt", args)); + assertEquals((Integer) 2, magics.applyLineMagic("returnInt", args)); try { magics.applyLineMagic("unusedName", args); - Assertions.fail("named magic was also registered under the method name"); + fail("named magic was also registered under the method name"); } catch (UndefinedMagicException ignored) { } } @@ -122,7 +125,7 @@ public void set(Set args) { } } - Assertions.assertThrows(IllegalArgumentException.class, () -> magics.registerMagics(new BadMagic())); + assertThrows(IllegalArgumentException.class, () -> magics.registerMagics(new BadMagic())); } @Test @@ -133,7 +136,7 @@ public void intList(List args) { } } - Assertions.assertThrows(IllegalArgumentException.class, () -> magics.registerMagics(new BadMagic())); + assertThrows(IllegalArgumentException.class, () -> magics.registerMagics(new BadMagic())); } @Test @@ -165,11 +168,11 @@ public int returnInt(List args, String body) { magics.applyCellMagic("list", args, body); magics.applyCellMagic("iterable", args, body); magics.applyCellMagic("named", args, body); - Assertions.assertEquals((Integer) 2, magics.applyCellMagic("returnInt", args, body)); + assertEquals((Integer) 2, magics.applyCellMagic("returnInt", args, body)); try { magics.applyCellMagic("unusedName", args, body); - Assertions.fail("named magic was also registered under the method name"); + fail("named magic was also registered under the method name"); } catch (UndefinedMagicException ignored) { } } @@ -182,7 +185,7 @@ public void set(Set args, String body) { } } - Assertions.assertThrows(IllegalArgumentException.class, () -> magics.registerMagics(new BadMagic())); + assertThrows(IllegalArgumentException.class, () -> magics.registerMagics(new BadMagic())); } @Test @@ -193,7 +196,7 @@ public void intList(List args, String body) { } } - Assertions.assertThrows(IllegalArgumentException.class, () -> magics.registerMagics(new BadMagic())); + assertThrows(IllegalArgumentException.class, () -> magics.registerMagics(new BadMagic())); } @Test @@ -204,7 +207,7 @@ public void body(List args, Character body) { } } - Assertions.assertThrows(IllegalArgumentException.class, () -> magics.registerMagics(new BadMagic())); + assertThrows(IllegalArgumentException.class, () -> magics.registerMagics(new BadMagic())); } @Test @@ -240,16 +243,16 @@ public int returnInt(List args, String body) { magics.applyLineMagic("list", args); magics.applyLineMagic("iterable", args); magics.applyLineMagic("lineNamed", args); - Assertions.assertEquals((Integer) 3, magics.applyLineMagic("returnInt", args)); + assertEquals((Integer) 3, magics.applyLineMagic("returnInt", args)); magics.applyCellMagic("list", args, body); magics.applyCellMagic("iterable", args, body); magics.applyCellMagic("cellNamed", args, body); - Assertions.assertEquals((Integer) 4, magics.applyCellMagic("returnInt", args, body)); + assertEquals((Integer) 4, magics.applyCellMagic("returnInt", args, body)); try { magics.applyCellMagic("unusedName", args, body); - Assertions.fail("named magic was also registered under the method name"); + fail("named magic was also registered under the method name"); } catch (UndefinedMagicException ignored) { } } @@ -268,14 +271,14 @@ public int getAndIncrement() { magics.registerMagics(new Magic()); for (int i = 0; i < 3; i++) - Assertions.assertEquals((Integer) i, magics.applyLineMagic("getAndIncrement", Collections.emptyList())); + assertEquals((Integer) i, magics.applyLineMagic("getAndIncrement", Collections.emptyList())); } @Test public void staticMagic() throws Exception { magics.registerMagics(StaticMagics.class); - Assertions.assertEquals((Integer) 0, magics.applyLineMagic("staticMagic", Collections.emptyList())); - Assertions.assertEquals("body", magics.applyCellMagic("staticMagic", Collections.emptyList(), "body")); + assertEquals((Integer) 0, magics.applyLineMagic("staticMagic", Collections.emptyList())); + assertEquals("body", magics.applyCellMagic("staticMagic", Collections.emptyList(), "body")); } } diff --git a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/util/GlobFinderTest.java b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/util/GlobFinderTest.java index ee97df3..e54b9db 100644 --- a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/util/GlobFinderTest.java +++ b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/util/GlobFinderTest.java @@ -3,7 +3,6 @@ import com.google.common.jimfs.Configuration; import com.google.common.jimfs.Jimfs; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -22,6 +21,8 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; +import static org.junit.jupiter.api.Assertions.assertEquals; + public class GlobFinderTest { private static final Configuration WIN_FS = Configuration.windows().toBuilder().setWorkingDirectory("C:/dir-a").build(); private static final Configuration UNIX_FS = Configuration.unix().toBuilder().setWorkingDirectory("/dir-a").build(); @@ -68,7 +69,7 @@ public void test(Configuration fsConfig, String glob, Set files, Set files, Set data() { diff --git a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/util/InheritanceIteratorTest.java b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/util/InheritanceIteratorTest.java index 7a13413..46e2bfc 100644 --- a/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/util/InheritanceIteratorTest.java +++ b/jupyter-jvm-basekernel/src/test/java/org/dflib/jjava/jupyter/kernel/util/InheritanceIteratorTest.java @@ -1,6 +1,5 @@ package org.dflib.jjava.jupyter.kernel.util; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -9,6 +8,8 @@ import java.util.List; import java.util.stream.Stream; +import static org.junit.jupiter.api.Assertions.assertEquals; + public class InheritanceIteratorTest { @ParameterizedTest @@ -16,7 +17,7 @@ public class InheritanceIteratorTest { public void test(Class root, List> expected) { List> actual = collectIteration(root); - Assertions.assertEquals(expected, actual); + assertEquals(expected, actual); } public static Stream data() { From b47eac0120f7f6ec6792bcf7e407a8e2b7e7c85a Mon Sep 17 00:00:00 2001 From: Mikhail Dzianishchyts Date: Fri, 25 Oct 2024 19:22:13 +0300 Subject: [PATCH 04/11] Provide env IT cases --- jjava/src/main/java/org/dflib/jjava/Env.java | 3 +- .../kernel/ContainerizedKernelCase.java | 94 ++++++++++++++++ .../jjava/jupyter/kernel/KernelEnvIT.java | 103 ++++++++++++++++++ .../jjava/jupyter/kernel/KernelStartupIT.java | 22 ++++ .../kernel/testcontainers/KernelIT.java | 57 ---------- .../testcontainers/KernelStartupTestIT.java | 18 --- .../resources/src/org/dflib/jjava/Dummy.java | 4 + jjava/src/test/resources/test-init.jshell | 3 + 8 files changed, 227 insertions(+), 77 deletions(-) create mode 100644 jjava/src/test/java/org/dflib/jjava/jupyter/kernel/ContainerizedKernelCase.java create mode 100644 jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelEnvIT.java create mode 100644 jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelStartupIT.java delete mode 100644 jjava/src/test/java/org/dflib/jjava/jupyter/kernel/testcontainers/KernelIT.java delete mode 100644 jjava/src/test/java/org/dflib/jjava/jupyter/kernel/testcontainers/KernelStartupTestIT.java create mode 100644 jjava/src/test/resources/src/org/dflib/jjava/Dummy.java create mode 100644 jjava/src/test/resources/test-init.jshell diff --git a/jjava/src/main/java/org/dflib/jjava/Env.java b/jjava/src/main/java/org/dflib/jjava/Env.java index 795c30e..aa0764f 100644 --- a/jjava/src/main/java/org/dflib/jjava/Env.java +++ b/jjava/src/main/java/org/dflib/jjava/Env.java @@ -12,7 +12,6 @@ public final class Env { public static final String JJAVA_STARTUP_SCRIPT = "JJAVA_STARTUP_SCRIPT"; public static final String JJAVA_LOAD_EXTENSIONS = "JJAVA_LOAD_EXTENSIONS"; - // not used by Java, but rather by the Python kernel boot script + // not used by JJava, but rather by the kernel launcher script public static final String JJAVA_JVM_OPTS = "JJAVA_JVM_OPTS"; - } diff --git a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/ContainerizedKernelCase.java b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/ContainerizedKernelCase.java new file mode 100644 index 0000000..84398e2 --- /dev/null +++ b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/ContainerizedKernelCase.java @@ -0,0 +1,94 @@ +package org.dflib.jjava.jupyter.kernel; + +import org.junit.jupiter.api.BeforeAll; +import org.testcontainers.containers.Container; +import org.testcontainers.containers.ExecConfig; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.MountableFile; + +import java.io.IOException; +import java.time.Duration; +import java.util.ArrayList; +import java.util.Base64; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public abstract class ContainerizedKernelCase { + + protected static final GenericContainer container; + protected static final String WORKING_DIRECTORY = "/test"; + protected static final String CONTAINER_KERNELSPEC = "/usr/share/jupyter/kernels/java"; + protected static final String CONTAINER_RESOURCES = WORKING_DIRECTORY + "/resources"; + protected static final String TEST_CLASSPATH = CONTAINER_RESOURCES + "/classes"; + + private static final String BASE_IMAGE = String.format("eclipse-temurin:%s", Runtime.version().version().get(0)); + private static final String FS_KERNELSPEC = "../kernelspec/java"; + private static final String FS_RESOURCES = "src/test/resources"; + + static { + container = new GenericContainer<>(BASE_IMAGE) + .withWorkingDirectory(WORKING_DIRECTORY) + .withCopyToContainer(MountableFile.forHostPath(FS_KERNELSPEC), CONTAINER_KERNELSPEC) + .withCopyToContainer(MountableFile.forHostPath(FS_RESOURCES), CONTAINER_RESOURCES) + .withCommand("bash", "-c", getStartupCommand()) + .waitingFor(Wait.forSuccessfulCommand(getSuccessfulCommand())) + .withStartupTimeout(Duration.ofMinutes(5)); + container.start(); + } + + @BeforeAll + static void compileSources() throws IOException, InterruptedException { + String source = "$(find " + CONTAINER_RESOURCES + "/src -name '*.java')"; + Container.ExecResult compileResult = executeInContainer("javac -d " + TEST_CLASSPATH + " " + source); + + assertEquals("", compileResult.getStdout()); + assertEquals("", compileResult.getStderr()); + } + + protected static Container.ExecResult executeInContainer(String... commands) throws IOException, InterruptedException { + List wrappedCommands = new ArrayList<>(); + wrappedCommands.add("bash"); + wrappedCommands.add("-c"); + wrappedCommands.addAll(List.of(commands)); + return container.execInContainer(wrappedCommands.toArray(new String[]{})); + } + + protected static Container.ExecResult executeInKernel(String snippet) throws IOException, InterruptedException { + return executeInKernel(snippet, Collections.emptyMap()); + } + + protected static Container.ExecResult executeInKernel(String snippet, Map env) throws IOException, InterruptedException { + String snippet64 = Base64.getEncoder().encodeToString(snippet.getBytes()); + String jupyterCommand = venvCommand("jupyter console --kernel=java --simple-prompt"); + String[] containerCommand = new String[]{"bash", "-c", "base64 -d <<< " + snippet64 + " | " + jupyterCommand}; + return container.execInContainer(ExecConfig.builder() + .envVars(env) + .command(containerCommand) + .build() + ); + } + + private static String getStartupCommand() { + return String.join(" && ", + "apt-get update", + "apt-get install --no-install-recommends -y python3 python3-pip python3-venv", + "python3 -m venv ./venv", + venvCommand("pip install jupyter-console --progress-bar off"), + "tail -f /dev/null" + ); + } + + private static String getSuccessfulCommand() { + return venvCommand("jupyter kernelspec list") + + " | grep ' java ' && " + + venvCommand("jupyter console --version"); + } + + private static String venvCommand(String command) { + return WORKING_DIRECTORY + "/venv/bin/" + command; + } +} diff --git a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelEnvIT.java b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelEnvIT.java new file mode 100644 index 0000000..1d8ca41 --- /dev/null +++ b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelEnvIT.java @@ -0,0 +1,103 @@ +package org.dflib.jjava.jupyter.kernel; + +import org.dflib.jjava.Env; +import org.hamcrest.CoreMatchers; +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.Container; + +import java.util.Map; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; + +class KernelEnvIT extends ContainerizedKernelCase { + + @Test + void compilerOpts() throws Exception { + Map env = Map.of(Env.JJAVA_COMPILER_OPTS, "-source 9"); + String snippet = "var value = 1"; + Container.ExecResult snippetResult = executeInKernel(snippet, env); + + assertThat(snippetResult.getStderr(), CoreMatchers.allOf( + containsString("| var value = 1;"), + containsString("'var' is a restricted local variable type") + )); + } + + @Test + void timeout() throws Exception { + Map env = Map.of(Env.JJAVA_TIMEOUT, "3000"); + String snippet = "Thread.sleep(5000);"; + Container.ExecResult snippetResult = executeInKernel(snippet, env); + + assertThat(snippetResult.getStderr(), CoreMatchers.allOf( + containsString("| " + snippet), + containsString("Evaluation timed out after 3000 milliseconds.") + )); + } + + @Test + void classpath() throws Exception { + Map env = Map.of(Env.JJAVA_CLASSPATH, TEST_CLASSPATH); + String snippet = String.join("\n", + "import org.dflib.jjava.Dummy;", + "Dummy.class.getName()" + ); + Container.ExecResult snippetResult = executeInKernel(snippet, env); + + assertThat(snippetResult.getStderr(), not(containsString("|"))); + assertThat(snippetResult.getStdout(), containsString("org.dflib.jjava.Dummy")); + } + + @Test + void startUpScriptsPath() throws Exception { + Map env = Map.of(Env.JJAVA_STARTUP_SCRIPTS_PATH, CONTAINER_RESOURCES + "/test-init.jshell"); + String snippet = "ping()"; + Container.ExecResult snippetResult = executeInKernel(snippet, env); + + assertThat(snippetResult.getStderr(), not(containsString("|"))); + assertThat(snippetResult.getStdout(), containsString("pong!")); + } + + @Test + void startUpScript() throws Exception { + Map env = Map.of(Env.JJAVA_STARTUP_SCRIPT, "public String ping() { return \"pong!\"; }"); + String snippet = "ping()"; + Container.ExecResult snippetResult = executeInKernel(snippet, env); + + assertThat(snippetResult.getStderr(), not(containsString("|"))); + assertThat(snippetResult.getStdout(), containsString("pong!")); + } + + @Test + void loadExtensions_Default() throws Exception { + String snippet = "printf(\"Hello, %s!\", \"world\");"; + Container.ExecResult snippetResult = executeInKernel(snippet); + + assertThat(snippetResult.getStderr(), not(containsString("|"))); + assertThat(snippetResult.getStdout(), containsString("Hello, world!")); + } + + @Test + void loadExtensions_Disable() throws Exception { + Map env = Map.of(Env.JJAVA_LOAD_EXTENSIONS, "0"); + String snippet = "printf(\"Hello, %s!\", \"world\");"; + Container.ExecResult snippetResult = executeInKernel(snippet, env); + + assertThat(snippetResult.getStderr(), CoreMatchers.allOf( + containsString("| " + snippet), + containsString("cannot find symbol") + )); + } + + @Test + void jvmOpts() throws Exception { + Map env = Map.of(Env.JJAVA_JVM_OPTS, "-Xmx300m"); + String snippet = "Runtime.getRuntime().maxMemory()"; + Container.ExecResult snippetResult = executeInKernel(snippet, env); + + assertThat(snippetResult.getStderr(), not(containsString("|"))); + assertThat(snippetResult.getStdout(), containsString(String.valueOf(300 * (int) Math.pow(1024, 2)))); + } +} diff --git a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelStartupIT.java b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelStartupIT.java new file mode 100644 index 0000000..937bf9a --- /dev/null +++ b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelStartupIT.java @@ -0,0 +1,22 @@ +package org.dflib.jjava.jupyter.kernel; + +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.Container; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class KernelStartupIT extends ContainerizedKernelCase { + + @Test + void startUp() throws Exception { + String snippet = "1000d + 1"; + Container.ExecResult snippetResult = executeInKernel(snippet); + + assertEquals(0, snippetResult.getExitCode(), snippetResult.getStderr()); + assertThat(snippetResult.getStderr(), not(containsString("|"))); + assertThat(snippetResult.getStdout(), containsString("1001.0")); + } +} diff --git a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/testcontainers/KernelIT.java b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/testcontainers/KernelIT.java deleted file mode 100644 index dde5bed..0000000 --- a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/testcontainers/KernelIT.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.dflib.jjava.jupyter.kernel.testcontainers; - -import org.testcontainers.containers.BindMode; -import org.testcontainers.containers.Container; -import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; - -import java.io.IOException; -import java.time.Duration; - -public abstract class KernelIT { - - private static final String BASE_IMAGE = String.format("eclipse-temurin:%s", Runtime.version().version().get(0)); - private static final String FS_KERNELSPEC = "../kernelspec/java"; - private static final String CONTAINER_KERNELSPEC = "/usr/share/jupyter/kernels/java"; - private static final String WORKING_DIRECTORY = "/test"; - - protected static final GenericContainer container; - - static { - container = new GenericContainer<>(BASE_IMAGE) - .withWorkingDirectory(WORKING_DIRECTORY) - .withCommand("bash", "-c", getStartupCommand()) - .withFileSystemBind(FS_KERNELSPEC, CONTAINER_KERNELSPEC, BindMode.READ_ONLY) - .waitingFor(Wait.forSuccessfulCommand(getSuccessfulCommand())) - .withStartupTimeout(Duration.ofMinutes(3)); - container.start(); - } - - private static String getStartupCommand() { - return String.join(" && ", - "apt-get update", - "apt-get install --no-install-recommends -y python3 python3-pip python3-venv", - "python3 -m venv ./venv", - venvCommand("pip install jupyter-console --progress-bar off"), - "tail -f /dev/null" - ); - } - - private static String getSuccessfulCommand() { - return venvCommand("jupyter kernelspec list") - + "| grep ' java ' &&" - + venvCommand("jupyter console --version"); - } - - private static String venvCommand(String command) { - return WORKING_DIRECTORY + "/venv/bin/" + command; - } - - protected Container.ExecResult executeInKernel(String snippet) throws IOException, InterruptedException { - return container.execInContainer( - "bash", - "-c", - "echo '" + snippet + "' | " + venvCommand("jupyter console --kernel=java --simple-prompt") - ); - } -} diff --git a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/testcontainers/KernelStartupTestIT.java b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/testcontainers/KernelStartupTestIT.java deleted file mode 100644 index fd6ed4d..0000000 --- a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/testcontainers/KernelStartupTestIT.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.dflib.jjava.jupyter.kernel.testcontainers; - -import org.hamcrest.CoreMatchers; -import org.hamcrest.MatcherAssert; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.testcontainers.containers.Container; - -class KernelStartupTestIT extends KernelIT { - - @Test - void startUp() throws Exception { - Container.ExecResult snippetResult = executeInKernel("System.out.println(\"Hello world!\");"); - - Assertions.assertEquals(0, snippetResult.getExitCode(), snippetResult.getStderr()); - MatcherAssert.assertThat(snippetResult.getStdout(), CoreMatchers.containsString("Hello world!")); - } -} diff --git a/jjava/src/test/resources/src/org/dflib/jjava/Dummy.java b/jjava/src/test/resources/src/org/dflib/jjava/Dummy.java new file mode 100644 index 0000000..121a247 --- /dev/null +++ b/jjava/src/test/resources/src/org/dflib/jjava/Dummy.java @@ -0,0 +1,4 @@ +package org.dflib.jjava; + +public class Dummy { +} diff --git a/jjava/src/test/resources/test-init.jshell b/jjava/src/test/resources/test-init.jshell new file mode 100644 index 0000000..46fcb4d --- /dev/null +++ b/jjava/src/test/resources/test-init.jshell @@ -0,0 +1,3 @@ +public String ping() { + return "pong!"; +} From 8865ce0f4857641d686c097d33ecba150e9ab861 Mon Sep 17 00:00:00 2001 From: Mikhail Dzianishchyts Date: Sat, 26 Oct 2024 03:28:15 +0300 Subject: [PATCH 05/11] Fix compilerOpts() case --- .../test/java/org/dflib/jjava/jupyter/kernel/KernelEnvIT.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelEnvIT.java b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelEnvIT.java index 1d8ca41..75970cc 100644 --- a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelEnvIT.java +++ b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelEnvIT.java @@ -21,7 +21,9 @@ void compilerOpts() throws Exception { assertThat(snippetResult.getStderr(), CoreMatchers.allOf( containsString("| var value = 1;"), - containsString("'var' is a restricted local variable type") + containsString(Runtime.version().feature() == 11 + ? "'var' is a restricted local variable type" + : "'var' is a restricted type name") )); } From 101e86653b46fc1abe01b3c0021c3d835642248d Mon Sep 17 00:00:00 2001 From: Mikhail Dzianishchyts Date: Sat, 26 Oct 2024 03:28:53 +0300 Subject: [PATCH 06/11] Rename test-init.jshell --- .../test/java/org/dflib/jjava/jupyter/kernel/KernelEnvIT.java | 2 +- jjava/src/test/resources/{test-init.jshell => test-ping.jshell} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename jjava/src/test/resources/{test-init.jshell => test-ping.jshell} (100%) diff --git a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelEnvIT.java b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelEnvIT.java index 75970cc..5c20e76 100644 --- a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelEnvIT.java +++ b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelEnvIT.java @@ -54,7 +54,7 @@ void classpath() throws Exception { @Test void startUpScriptsPath() throws Exception { - Map env = Map.of(Env.JJAVA_STARTUP_SCRIPTS_PATH, CONTAINER_RESOURCES + "/test-init.jshell"); + Map env = Map.of(Env.JJAVA_STARTUP_SCRIPTS_PATH, CONTAINER_RESOURCES + "/test-ping.jshell"); String snippet = "ping()"; Container.ExecResult snippetResult = executeInKernel(snippet, env); diff --git a/jjava/src/test/resources/test-init.jshell b/jjava/src/test/resources/test-ping.jshell similarity index 100% rename from jjava/src/test/resources/test-init.jshell rename to jjava/src/test/resources/test-ping.jshell From 45a4c62564539bf1d1a7313b37ebf64e90316f61 Mon Sep 17 00:00:00 2001 From: Mikhail Dzianishchyts Date: Sat, 26 Oct 2024 03:29:25 +0300 Subject: [PATCH 07/11] Add some magic IT cases --- .../jjava/jupyter/kernel/KernelMagicIT.java | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelMagicIT.java diff --git a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelMagicIT.java b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelMagicIT.java new file mode 100644 index 0000000..569f820 --- /dev/null +++ b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelMagicIT.java @@ -0,0 +1,71 @@ +package org.dflib.jjava.jupyter.kernel; + +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.Container; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class KernelMagicIT extends ContainerizedKernelCase { + + @Test + void jars() throws Exception { + String jar = CONTAINER_RESOURCES + "/jakarta.annotation-api-3.0.0.jar"; + Container.ExecResult fetchResult = container.execInContainer( + "curl", "-L", "-s", "-S", "-f", + "https://repo1.maven.org/maven2/jakarta/annotation/jakarta.annotation-api/3.0.0/jakarta.annotation-api-3.0.0.jar", + "-o", jar + ); + assertEquals("", fetchResult.getStderr()); + + String snippet = String.join("\n", + "%jars " + jar, + "import jakarta.annotation.Nullable;", + "Nullable.class.getName()" + ); + Container.ExecResult snippetResult = executeInKernel(snippet); + + assertThat(snippetResult.getStderr(), not(containsString("|"))); + assertThat(snippetResult.getStdout(), containsString("jakarta.annotation.Nullable")); + } + + @Test + void classpath() throws Exception { + String snippet = String.join("\n", + "%classpath " + TEST_CLASSPATH, + "import org.dflib.jjava.Dummy;", + "Dummy.class.getName()" + ); + Container.ExecResult snippetResult = executeInKernel(snippet); + + assertThat(snippetResult.getStderr(), not(containsString("|"))); + assertThat(snippetResult.getStdout(), containsString("org.dflib.jjava.Dummy")); + } + + @Test + void addMavenDependencies() throws Exception { + String snippet = String.join("\n", + "%maven org.dflib:dflib-jupyter:1.0.0-RC1", + "System.getProperty(\"java.class.path\")" + ); + Container.ExecResult snippetResult = executeInKernel(snippet); + + assertThat(snippetResult.getStderr(), not(containsString("|"))); + assertThat(snippetResult.getStdout(), containsString("dflib-jupyter-1.0.0-RC1.jar")); + } + + @Test + void load() throws Exception { + String script = CONTAINER_RESOURCES + "/test-ping.jshell"; + String snippet = String.join("\n", + "%load " + script, + "ping()" + ); + Container.ExecResult snippetResult = executeInKernel(snippet); + + assertThat(snippetResult.getStderr(), not(containsString("|"))); + assertThat(snippetResult.getStdout(), containsString("pong!")); + } +} From 6dff96238dc8f32526fe33d1496191f7b1dc301a Mon Sep 17 00:00:00 2001 From: Mikhail Dzianishchyts Date: Sat, 26 Oct 2024 03:47:51 +0300 Subject: [PATCH 08/11] Do not check the exit code, it doesn't seem to change --- .../java/org/dflib/jjava/jupyter/kernel/KernelStartupIT.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelStartupIT.java b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelStartupIT.java index 937bf9a..53ad6fd 100644 --- a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelStartupIT.java +++ b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelStartupIT.java @@ -6,7 +6,6 @@ import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; class KernelStartupIT extends ContainerizedKernelCase { @@ -15,7 +14,6 @@ void startUp() throws Exception { String snippet = "1000d + 1"; Container.ExecResult snippetResult = executeInKernel(snippet); - assertEquals(0, snippetResult.getExitCode(), snippetResult.getStderr()); assertThat(snippetResult.getStderr(), not(containsString("|"))); assertThat(snippetResult.getStdout(), containsString("1001.0")); } From 26da613446119628413f1459d97ba882659cec47 Mon Sep 17 00:00:00 2001 From: Mikhail Dzianishchyts Date: Sat, 26 Oct 2024 03:53:07 +0300 Subject: [PATCH 09/11] Get java version in a cleaner way --- .../org/dflib/jjava/jupyter/kernel/ContainerizedKernelCase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/ContainerizedKernelCase.java b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/ContainerizedKernelCase.java index 84398e2..1bc337c 100644 --- a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/ContainerizedKernelCase.java +++ b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/ContainerizedKernelCase.java @@ -25,7 +25,7 @@ public abstract class ContainerizedKernelCase { protected static final String CONTAINER_RESOURCES = WORKING_DIRECTORY + "/resources"; protected static final String TEST_CLASSPATH = CONTAINER_RESOURCES + "/classes"; - private static final String BASE_IMAGE = String.format("eclipse-temurin:%s", Runtime.version().version().get(0)); + private static final String BASE_IMAGE = String.format("eclipse-temurin:%s", Runtime.version().feature()); private static final String FS_KERNELSPEC = "../kernelspec/java"; private static final String FS_RESOURCES = "src/test/resources"; From f5e7075bf5252b104db6a3191c7d379670ec623e Mon Sep 17 00:00:00 2001 From: Mikhail Dzianishchyts Date: Fri, 22 Nov 2024 12:52:44 +0300 Subject: [PATCH 10/11] Add loadFromPOM magic test --- .../jjava/jupyter/kernel/KernelMagicIT.java | 16 +++++++++++++++- jjava/src/test/resources/test-pom.xml | 15 +++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 jjava/src/test/resources/test-pom.xml diff --git a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelMagicIT.java b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelMagicIT.java index 569f820..2bf71a6 100644 --- a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelMagicIT.java +++ b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelMagicIT.java @@ -8,7 +8,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; -public class KernelMagicIT extends ContainerizedKernelCase { +class KernelMagicIT extends ContainerizedKernelCase { @Test void jars() throws Exception { @@ -68,4 +68,18 @@ void load() throws Exception { assertThat(snippetResult.getStderr(), not(containsString("|"))); assertThat(snippetResult.getStdout(), containsString("pong!")); } + + @Test + void loadFromPOM() throws Exception { + String pom = CONTAINER_RESOURCES + "/test-pom.xml"; + String snippet = String.join("\n", + "%loadFromPOM " + pom, + "import jakarta.annotation.Nullable;", + "Nullable.class.getName()" + ); + Container.ExecResult snippetResult = executeInKernel(snippet); + + assertThat(snippetResult.getStderr(), not(containsString("|"))); + assertThat(snippetResult.getStdout(), containsString("jakarta.annotation.Nullable")); + } } diff --git a/jjava/src/test/resources/test-pom.xml b/jjava/src/test/resources/test-pom.xml new file mode 100644 index 0000000..8e72f59 --- /dev/null +++ b/jjava/src/test/resources/test-pom.xml @@ -0,0 +1,15 @@ + + 4.0.0 + + org.dflib.jjava + jjava-test + 1.0 + + + + jakarta.annotation + jakarta.annotation-api + 3.0.0 + + + From c93ffefadede02fa51dc3bd49637f1e4975aae50 Mon Sep 17 00:00:00 2001 From: Mikhail Dzianishchyts Date: Fri, 29 Nov 2024 17:40:35 +0300 Subject: [PATCH 11/11] Fix test hanging --- .../jupyter/kernel/ContainerizedKernelCase.java | 15 +++++++++++++-- .../dflib/jjava/jupyter/kernel/KernelEnvIT.java | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/ContainerizedKernelCase.java b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/ContainerizedKernelCase.java index 1bc337c..1c6fb6a 100644 --- a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/ContainerizedKernelCase.java +++ b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/ContainerizedKernelCase.java @@ -1,9 +1,12 @@ package org.dflib.jjava.jupyter.kernel; import org.junit.jupiter.api.BeforeAll; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.testcontainers.containers.Container; import org.testcontainers.containers.ExecConfig; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.utility.MountableFile; @@ -19,6 +22,8 @@ public abstract class ContainerizedKernelCase { + private static final Logger LOGGER = LoggerFactory.getLogger(ContainerizedKernelCase.class); + protected static final GenericContainer container; protected static final String WORKING_DIRECTORY = "/test"; protected static final String CONTAINER_KERNELSPEC = "/usr/share/jupyter/kernels/java"; @@ -35,6 +40,7 @@ public abstract class ContainerizedKernelCase { .withCopyToContainer(MountableFile.forHostPath(FS_KERNELSPEC), CONTAINER_KERNELSPEC) .withCopyToContainer(MountableFile.forHostPath(FS_RESOURCES), CONTAINER_RESOURCES) .withCommand("bash", "-c", getStartupCommand()) + .withLogConsumer(new Slf4jLogConsumer(LOGGER)) .waitingFor(Wait.forSuccessfulCommand(getSuccessfulCommand())) .withStartupTimeout(Duration.ofMinutes(5)); container.start(); @@ -64,12 +70,17 @@ protected static Container.ExecResult executeInKernel(String snippet) throws IOE protected static Container.ExecResult executeInKernel(String snippet, Map env) throws IOException, InterruptedException { String snippet64 = Base64.getEncoder().encodeToString(snippet.getBytes()); String jupyterCommand = venvCommand("jupyter console --kernel=java --simple-prompt"); - String[] containerCommand = new String[]{"bash", "-c", "base64 -d <<< " + snippet64 + " | " + jupyterCommand}; - return container.execInContainer(ExecConfig.builder() + String[] containerCommand = new String[]{"bash", "-c", "echo \"" + snippet64 + "\" | base64 -d | " + jupyterCommand}; + Container.ExecResult execResult = container.execInContainer(ExecConfig.builder() .envVars(env) .command(containerCommand) .build() ); + LOGGER.info("env = {}", env); + LOGGER.info("snippet = {}", snippet); + LOGGER.debug("stderr = {}", execResult.getStderr()); + LOGGER.debug("stdout = {}", execResult.getStdout()); + return execResult; } private static String getStartupCommand() { diff --git a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelEnvIT.java b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelEnvIT.java index 5c20e76..bf1e32a 100644 --- a/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelEnvIT.java +++ b/jjava/src/test/java/org/dflib/jjava/jupyter/kernel/KernelEnvIT.java @@ -16,7 +16,7 @@ class KernelEnvIT extends ContainerizedKernelCase { @Test void compilerOpts() throws Exception { Map env = Map.of(Env.JJAVA_COMPILER_OPTS, "-source 9"); - String snippet = "var value = 1"; + String snippet = "var value = 1;"; Container.ExecResult snippetResult = executeInKernel(snippet, env); assertThat(snippetResult.getStderr(), CoreMatchers.allOf(