From bec8b4abff4d9f373efe3340b4e507e8a48696a3 Mon Sep 17 00:00:00 2001 From: Jonathan Cook Date: Wed, 19 Feb 2020 09:07:58 +0100 Subject: [PATCH 01/10] BAEL-3491 - Check for null before calling parse in the Double.parseDouble --- java-numbers-3/pom.xml | 86 ++++++---- .../StringToDoubleParserUnitTest.java | 149 ++++++++++++++++++ 2 files changed, 202 insertions(+), 33 deletions(-) create mode 100644 java-numbers-3/src/test/java/com/baeldung/parsedouble/StringToDoubleParserUnitTest.java diff --git a/java-numbers-3/pom.xml b/java-numbers-3/pom.xml index bf5fe9b0e7..ce0f61cd30 100644 --- a/java-numbers-3/pom.xml +++ b/java-numbers-3/pom.xml @@ -1,38 +1,58 @@ - 4.0.0 - java-numbers-3 - java-numbers-3 - jar + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + java-numbers-3 + java-numbers-3 + jar - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../parent-java - - - - - it.unimi.dsi - dsiutils - ${dsiutils.version} - - - - - java-numbers-3 - - - src/main/resources - true - - - + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + - - 2.6.0 - + + + it.unimi.dsi + dsiutils + ${dsiutils.version} + + + io.vavr + vavr + ${vavr.version} + + + org.apache.commons + commons-lang3 + ${commons.version} + test + + + org.assertj + assertj-core + ${assertj.version} + test + + + + + java-numbers-3 + + + src/main/resources + true + + + + + + 2.6.0 + 0.10.2 + 3.9 + 3.6.1 + diff --git a/java-numbers-3/src/test/java/com/baeldung/parsedouble/StringToDoubleParserUnitTest.java b/java-numbers-3/src/test/java/com/baeldung/parsedouble/StringToDoubleParserUnitTest.java new file mode 100644 index 0000000000..b3dec3d14f --- /dev/null +++ b/java-numbers-3/src/test/java/com/baeldung/parsedouble/StringToDoubleParserUnitTest.java @@ -0,0 +1,149 @@ +package com.baeldung.parsedouble; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Optional; + +import org.apache.commons.lang3.math.NumberUtils; +import org.junit.Test; + +import com.google.common.base.MoreObjects; +import com.google.common.primitives.Doubles; + +import io.vavr.control.Try; + +public class StringToDoubleParserUnitTest { + + @Test + public void givenNullValue_whenParseStringToDouble_thenDefaultNaNValueIsReturned() { + assertThat(parseStringToDouble(null)).isNaN(); + } + + @Test + public void givenEmptyStringValue_whenParseStringToDouble_thenDefaultNaNValueIsReturned() { + assertThat(parseStringToDouble("")).isNaN(); + } + + @Test + public void givenStringValue_whenParseStringToDouble_thenDoubleValueIsReturned() { + assertThat(parseStringToDouble("1")).isEqualTo(1.0d); + } + + @Test + public void givenStringValue_whenParseStringToDoubleWithDefault_thenDoubleValueIsReturned() { + assertThat(parseStringToDouble("1", 2.0d)).isEqualTo(1.0d); + } + + @Test + public void givenEmptyStringValue_whenParseStringToDoubleWithDefault_thenDefaultValueIsReturned() { + assertThat(parseStringToDouble("", 1.0d)).isEqualTo(1.0d); + } + + @Test + public void givenNullValue_whenParseStringToDoubleWithDefault_thenDefaultValueIsReturned() { + assertThat(parseStringToDouble(null, 1.0d)).isEqualTo(1.0d); + } + + @Test + public void givenStringValue_whenParseStringToOptionalDouble_thenOptionalValueIsReturned() { + assertThat(parseStringToOptionalDouble("1")).isEqualTo(Optional.of(1.0d)); + } + + @Test + public void givenNullValue_whenParseStringToOptionalDouble_thenOptionalValueIsEmpty() { + assertThat(parseStringToOptionalDouble(null)).isEqualTo(Optional.empty()); + } + + @Test + public void givenEmptyStringValue_whenParseStringToOptionalDouble_thenOptionalValueIsEmpty() { + assertThat(parseStringToOptionalDouble("")).isEqualTo(Optional.empty()); + } + + @Test + public void givenEmptyStringValue_whenParseStringToOptionalDouble_thenDefaulOptionalValueIsReturned() { + assertThat(parseStringToOptionalDouble("").orElse(1.0d)).isEqualTo(1.0d); + } + + @Test + public void givenNullValue_whenParseStringToOptionalDouble_thenDefaulOptionalValueIsReturned() { + assertThat(parseStringToOptionalDouble(null).orElse(1.0d)).isEqualTo(1.0d); + } + + @Test + public void givenStringValue_whenTryStringToDouble_thenDoubleValueIsReturned() { + assertThat(tryStringToDouble("1", 2.0d)).isEqualTo(1.0d); + } + + @Test + public void givenNullValue_whenTryStringToDoubleWithDefault_thenDoubleValueIsReturned() { + assertThat(tryStringToDouble(null, 2.0d)).isEqualTo(2.0d); + } + + @Test + public void givenEmptyStringValue_whenTryStringToDoubleWithDefault_thenDoubleValueIsReturned() { + assertThat(tryStringToDouble("", 2.0d)).isEqualTo(2.0d); + } + + @Test + public void givenTwoStringValues_whenTryParseFirstNonNull_thenDoubleValueIsReturned() { + assertThat(Doubles.tryParse(MoreObjects.firstNonNull("1.0", "2.0"))).isEqualTo(1.0d); + } + + @Test + public void givenNullStringValue_whenTryParseFirstNonNull_thenSecondDoubleValueIsReturned() { + assertThat(Doubles.tryParse(MoreObjects.firstNonNull(null, "2.0"))).isEqualTo(2.0d); + } + + @Test + public void givenEmptyStringValue_whenTryParseFirstNonNull_thenNullIsReturned() { + assertThat(Doubles.tryParse(MoreObjects.firstNonNull("", "2.0"))).isEqualTo(null); + } + + @Test + public void givenStringValue_whenToDouble_thenDoubleValueIsReturned() { + assertThat(NumberUtils.toDouble("1.0")).isEqualTo(1.0d); + } + + @Test + public void givenNullValue_whenToDouble_thenLibraryDefaultDoubleValueIsReturned() { + String nullString = null; + assertThat(NumberUtils.toDouble(nullString)).isEqualTo(0.0d); + } + + @Test + public void givenEmptyStringValue_whenToDouble_thenLibraryDefaultDoubleValueIsReturned() { + assertThat(NumberUtils.toDouble("")).isEqualTo(0.0d); + } + + @Test + public void givenEmptyStringValue_whenToDoubleWithDefault_thenDoubleValueIsReturned() { + assertThat(NumberUtils.toDouble("", 2.0d)).isEqualTo(2.0d); + } + + @Test + public void givenNullValue_whenToDoubleWithDefault_thenDoubleValueIsReturned() { + String nullString = null; + assertThat(NumberUtils.toDouble(nullString, 2.0d)).isEqualTo(2.0d); + } + + @Test + public void givenStringValue_whenToDoubleWithDefault_thenDoubleValueIsReturned() { + assertThat(NumberUtils.toDouble("1.0", 2.0d)).isEqualTo(1.0d); + } + + private static Optional parseStringToOptionalDouble(String value) { + return value == null || value.isEmpty() ? Optional.empty() : Optional.of(Double.valueOf(value)); + } + + private static double parseStringToDouble(String value) { + return value == null || value.isEmpty() ? Double.NaN : Double.parseDouble(value); + } + + private static double parseStringToDouble(String value, double defaultValue) { + return value == null || value.isEmpty() ? defaultValue : Double.parseDouble(value); + } + + private static double tryStringToDouble(String value, double defaultValue) { + return Try.of(() -> Double.parseDouble(value)).getOrElse(defaultValue); + } +} From 32ba74d06c4e6a317950c46e834a10fe3e853153 Mon Sep 17 00:00:00 2001 From: Jonathan Cook Date: Mon, 24 Feb 2020 09:57:36 +0100 Subject: [PATCH 02/10] BAEL-3491 - Check for null before calling parse in the Double.parseDouble - Return to indentation with spaces. --- java-numbers-3/pom.xml | 102 ++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/java-numbers-3/pom.xml b/java-numbers-3/pom.xml index ce0f61cd30..495618885a 100644 --- a/java-numbers-3/pom.xml +++ b/java-numbers-3/pom.xml @@ -1,58 +1,58 @@ - 4.0.0 - java-numbers-3 - java-numbers-3 - jar + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + java-numbers-3 + java-numbers-3 + jar - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../parent-java - + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + - - - it.unimi.dsi - dsiutils - ${dsiutils.version} - - - io.vavr - vavr - ${vavr.version} - - - org.apache.commons - commons-lang3 - ${commons.version} - test - - - org.assertj - assertj-core - ${assertj.version} - test - - + + + it.unimi.dsi + dsiutils + ${dsiutils.version} + + + io.vavr + vavr + ${vavr.version} + + + org.apache.commons + commons-lang3 + ${commons.version} + test + + + org.assertj + assertj-core + ${assertj.version} + test + + - - java-numbers-3 - - - src/main/resources - true - - - + + java-numbers-3 + + + src/main/resources + true + + + - - 2.6.0 - 0.10.2 - 3.9 - 3.6.1 - + + 2.6.0 + 0.10.2 + 3.9 + 3.6.1 + From f0e23cabda49ab7768d36652b30627553dbf0a57 Mon Sep 17 00:00:00 2001 From: Jonathan Cook Date: Sun, 1 Mar 2020 08:36:51 +0100 Subject: [PATCH 03/10] BAEL-3854 - Pattern Matching for instanceof in Java 14 --- .../PatternMatchingForInstanceOf.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 core-java-modules/core-java-14/src/main/java/com/baeldung/java14/patternmatchingforinstanceof/PatternMatchingForInstanceOf.java diff --git a/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/patternmatchingforinstanceof/PatternMatchingForInstanceOf.java b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/patternmatchingforinstanceof/PatternMatchingForInstanceOf.java new file mode 100644 index 0000000000..ccade84bea --- /dev/null +++ b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/patternmatchingforinstanceof/PatternMatchingForInstanceOf.java @@ -0,0 +1,26 @@ +package com.baeldung.java14.patternmatchingforinstanceof; + +public class PatternMatchingForInstanceOf { + + public void performAnimalOperations(Animal animal) { + if (animal instanceof Cat cat) { + cat.meow(); + } else if(animal instanceof Dog dog) { + dog.woof(); + } + } + + private abstract class Animal { + } + + private final class Cat extends Animal { + private void meow() { + } + } + + private final class Dog extends Animal { + private void woof() { + } + } + +} From 09e5ac39cf14c23725c28a70ec7ee0b39144ed73 Mon Sep 17 00:00:00 2001 From: Jonathan Cook Date: Mon, 2 Mar 2020 22:35:53 +0100 Subject: [PATCH 04/10] BAEL-3854 - Pattern Matching for instanceof in Java 14 - add unit test --- .../PatternMatchingForInstanceOf.java | 10 +++--- .../PatternMatchingForInstanceOfUnitTest.java | 33 +++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 core-java-modules/core-java-14/src/test/java/com/baeldung/java14/patternmatchingforinstanceof/PatternMatchingForInstanceOfUnitTest.java diff --git a/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/patternmatchingforinstanceof/PatternMatchingForInstanceOf.java b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/patternmatchingforinstanceof/PatternMatchingForInstanceOf.java index ccade84bea..11026f45f9 100644 --- a/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/patternmatchingforinstanceof/PatternMatchingForInstanceOf.java +++ b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/patternmatchingforinstanceof/PatternMatchingForInstanceOf.java @@ -10,16 +10,16 @@ public class PatternMatchingForInstanceOf { } } - private abstract class Animal { + abstract class Animal { } - private final class Cat extends Animal { - private void meow() { + final class Cat extends Animal { + void meow() { } } - private final class Dog extends Animal { - private void woof() { + final class Dog extends Animal { + void woof() { } } diff --git a/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/patternmatchingforinstanceof/PatternMatchingForInstanceOfUnitTest.java b/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/patternmatchingforinstanceof/PatternMatchingForInstanceOfUnitTest.java new file mode 100644 index 0000000000..0270e34dec --- /dev/null +++ b/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/patternmatchingforinstanceof/PatternMatchingForInstanceOfUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.java14.patternmatchingforinstanceof; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +import org.junit.jupiter.api.Test; + +import com.baeldung.java14.patternmatchingforinstanceof.PatternMatchingForInstanceOf.Cat; +import com.baeldung.java14.patternmatchingforinstanceof.PatternMatchingForInstanceOf.Dog; + +class PatternMatchingForInstanceOfUnitTest { + + @Test + void givenAnAnimal_whenTypeIsCat_ThenCatGoesMeow() { + Cat animal = mock(Cat.class); + + PatternMatchingForInstanceOf instanceOf = new PatternMatchingForInstanceOf(); + instanceOf.performAnimalOperations(animal); + + verify(animal).meow(); + } + + @Test + void givenAnAnimal_whenTypeIsDog_ThenDogGoesWoof() { + Dog animal = mock(Dog.class); + + PatternMatchingForInstanceOf instanceOf = new PatternMatchingForInstanceOf(); + instanceOf.performAnimalOperations(animal); + + verify(animal).woof(); + } + +} From af0fc5f058d956c995fa61a752b79d55c060848e Mon Sep 17 00:00:00 2001 From: Jonathan Cook Date: Sun, 5 Apr 2020 16:40:23 +0200 Subject: [PATCH 05/10] BAEL-3868 - Fix the integrations tests in mocks --- .../jmockit/ExpectationsCollaborator.java | 2 +- .../jmockit/ExpectationsIntegrationTest.java | 35 ++++++++++--------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/testing-modules/mocks/src/main/java/com/baeldung/jmockit/ExpectationsCollaborator.java b/testing-modules/mocks/src/main/java/com/baeldung/jmockit/ExpectationsCollaborator.java index 799e7721e0..1aafa28a6a 100644 --- a/testing-modules/mocks/src/main/java/com/baeldung/jmockit/ExpectationsCollaborator.java +++ b/testing-modules/mocks/src/main/java/com/baeldung/jmockit/ExpectationsCollaborator.java @@ -15,5 +15,5 @@ public interface ExpectationsCollaborator { void methodForArgThat(Object o); String methodReturnsString(); int methodReturnsInt(); - Object methodForDelegate(int i); + int methodForDelegate(int i); } diff --git a/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ExpectationsIntegrationTest.java b/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ExpectationsIntegrationTest.java index 8b0c3ab4ec..1ff90111d1 100644 --- a/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ExpectationsIntegrationTest.java +++ b/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ExpectationsIntegrationTest.java @@ -1,21 +1,21 @@ package com.baeldung.jmockit; -import com.baeldung.jmockit.ExpectationsCollaborator; -import com.baeldung.jmockit.Model; -import mockit.Delegate; -import mockit.Expectations; -import mockit.Mocked; -import mockit.Verifications; -import mockit.integration.junit4.JMockit; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import java.util.ArrayList; +import java.util.List; + import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.junit.Test; import org.junit.runner.RunWith; -import java.util.ArrayList; -import java.util.List; - -import static org.junit.Assert.assertEquals; +import mockit.Delegate; +import mockit.Expectations; +import mockit.Mocked; +import mockit.Verifications; +import mockit.integration.junit4.JMockit; @RunWith(JMockit.class) @SuppressWarnings("unchecked") @@ -112,17 +112,16 @@ public class ExpectationsIntegrationTest { result = "foo"; result = new Exception(); result = "bar"; - mock.methodReturnsInt(); - result = new int[]{1, 2, 3}; - mock.methodReturnsString(); returns("foo", "bar"); mock.methodReturnsInt(); + result = new int[]{1, 2, 3}; result = 1; }}; assertEquals("Should return foo", "foo", mock.methodReturnsString()); try { mock.methodReturnsString(); + fail("Shouldn't reach here"); } catch (Exception e) { // NOOP } @@ -134,13 +133,14 @@ public class ExpectationsIntegrationTest { assertEquals("Should return bar", "bar", mock.methodReturnsString()); assertEquals("Should return 1", 1, mock.methodReturnsInt()); } - + @Test public void testDelegate(@Mocked ExpectationsCollaborator mock) { new Expectations() {{ mock.methodForDelegate(anyInt); - result = new Delegate() { - public int delegate(int i) throws Exception { + + result = new Delegate() { + int delegate(int i) throws Exception { if (i < 3) { return 5; } else { @@ -153,6 +153,7 @@ public class ExpectationsIntegrationTest { assertEquals("Should return 5", 5, mock.methodForDelegate(1)); try { mock.methodForDelegate(3); + fail("Shouldn't reach here"); } catch (Exception e) { } } From f2ab5e245646a39f474ad7c2e694d1981965ebc4 Mon Sep 17 00:00:00 2001 From: Jonathan Cook Date: Tue, 12 May 2020 18:52:34 +0200 Subject: [PATCH 06/10] BAEL-3925 - How to call Python from Java --- java-python-interop/README.md | 5 + java-python-interop/pom.xml | 55 ++++++++ .../interop/ScriptEngineManagerUtils.java | 34 +++++ .../src/main/resources/logback.xml | 13 ++ .../interop/JavaPythonInteropUnitTest.java | 131 ++++++++++++++++++ .../src/test/resources/hello.py | 1 + pom.xml | 3 +- 7 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 java-python-interop/README.md create mode 100644 java-python-interop/pom.xml create mode 100644 java-python-interop/src/main/java/com/baeldung/python/interop/ScriptEngineManagerUtils.java create mode 100644 java-python-interop/src/main/resources/logback.xml create mode 100644 java-python-interop/src/test/java/com/baeldung/python/interop/JavaPythonInteropUnitTest.java create mode 100644 java-python-interop/src/test/resources/hello.py diff --git a/java-python-interop/README.md b/java-python-interop/README.md new file mode 100644 index 0000000000..dc9573ecde --- /dev/null +++ b/java-python-interop/README.md @@ -0,0 +1,5 @@ +## Java Python Interop + +This module contains articles about Java and Python interoperability. + +### Relevant Articles: diff --git a/java-python-interop/pom.xml b/java-python-interop/pom.xml new file mode 100644 index 0000000000..6ee5a0be3b --- /dev/null +++ b/java-python-interop/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + java-python-interop + 0.0.1-SNAPSHOT + java-python-interop + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.python + jython-slim + ${jython.version} + + + org.apache.commons + commons-exec + ${commons-exec.version} + + + org.assertj + assertj-core + ${assertj.version} + test + + + + + java-python-interop + + + src/main/resources + true + + + src/test/resources + true + + + + + + 2.7.2 + 1.3 + 3.6.1 + + + \ No newline at end of file diff --git a/java-python-interop/src/main/java/com/baeldung/python/interop/ScriptEngineManagerUtils.java b/java-python-interop/src/main/java/com/baeldung/python/interop/ScriptEngineManagerUtils.java new file mode 100644 index 0000000000..981f174c33 --- /dev/null +++ b/java-python-interop/src/main/java/com/baeldung/python/interop/ScriptEngineManagerUtils.java @@ -0,0 +1,34 @@ +package com.baeldung.python.interop; + +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.script.ScriptEngineFactory; +import javax.script.ScriptEngineManager; + +public class ScriptEngineManagerUtils { + + private static final Logger LOGGER = LoggerFactory.getLogger(ScriptEngineManagerUtils.class); + + private ScriptEngineManagerUtils() { + } + + public static void listEngines() { + ScriptEngineManager manager = new ScriptEngineManager(); + List engines = manager.getEngineFactories(); + + for (ScriptEngineFactory engine : engines) { + LOGGER.info("Engine name: {}", engine.getEngineName()); + LOGGER.info("Version: {}", engine.getEngineVersion()); + LOGGER.info("Language: {}", engine.getLanguageName()); + + LOGGER.info("Short Names:"); + for (String names : engine.getNames()) { + LOGGER.info(names); + } + } + } + +} diff --git a/java-python-interop/src/main/resources/logback.xml b/java-python-interop/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/java-python-interop/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/java-python-interop/src/test/java/com/baeldung/python/interop/JavaPythonInteropUnitTest.java b/java-python-interop/src/test/java/com/baeldung/python/interop/JavaPythonInteropUnitTest.java new file mode 100644 index 0000000000..5ec3a2b61f --- /dev/null +++ b/java-python-interop/src/test/java/com/baeldung/python/interop/JavaPythonInteropUnitTest.java @@ -0,0 +1,131 @@ +package com.baeldung.python.interop; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.StringWriter; +import java.util.List; +import java.util.stream.Collectors; + +import javax.script.ScriptContext; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.SimpleScriptContext; + +import org.apache.commons.exec.CommandLine; +import org.apache.commons.exec.DefaultExecutor; +import org.apache.commons.exec.ExecuteException; +import org.apache.commons.exec.PumpStreamHandler; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.python.core.PyException; +import org.python.core.PyObject; +import org.python.util.PythonInterpreter; + +public class JavaPythonInteropUnitTest { + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Test + public void givenPythonScript_whenPythonProcessInvoked_thenSuccess() throws Exception { + ProcessBuilder processBuilder = new ProcessBuilder("python", resolvePythonScriptPath("hello.py")); + processBuilder.redirectErrorStream(true); + + Process process = processBuilder.start(); + List results = readProcessOutput(process.getInputStream()); + + assertThat("Results should not be empty", results, is(not(empty()))); + assertThat("Results should contain output of script: ", results, hasItem(containsString("Hello Baeldung Readers!!"))); + + int exitCode = process.waitFor(); + assertEquals("No errors should be detected", 0, exitCode); + } + + @Test + public void givenPythonScriptEngineIsAvailable_whenScriptInvoked_thenOutputDisplayed() throws Exception { + StringWriter output = new StringWriter(); + ScriptContext context = new SimpleScriptContext(); + context.setWriter(output); + + ScriptEngineManager manager = new ScriptEngineManager(); + ScriptEngine engine = manager.getEngineByName("python"); + engine.eval(new FileReader(resolvePythonScriptPath("hello.py")), context); + assertEquals("Should contain script output: ", "Hello Baeldung Readers!!", output.toString() + .trim()); + } + + @Test + public void givenPythonInterpreter_whenPrintExecuted_thenOutputDisplayed() { + try (PythonInterpreter pyInterp = new PythonInterpreter()) { + StringWriter output = new StringWriter(); + pyInterp.setOut(output); + + pyInterp.exec("print('Hello Baeldung Readers!!')"); + assertEquals("Should contain script output: ", "Hello Baeldung Readers!!", output.toString() + .trim()); + } + } + + @Test + public void givenPythonInterpreter_whenNumbersAdded_thenOutputDisplayed() { + try (PythonInterpreter pyInterp = new PythonInterpreter()) { + pyInterp.exec("x = 10+10"); + PyObject x = pyInterp.get("x"); + assertEquals("x: ", 20, x.asInt()); + } + } + + @Test + public void givenPythonInterpreter_whenErrorOccurs_thenExceptionIsThrown() { + thrown.expect(PyException.class); + thrown.expectMessage("ImportError: No module named syds"); + + try (PythonInterpreter pyInterp = new PythonInterpreter()) { + pyInterp.exec("import syds"); + } + } + + @Test + public void givenPythonScript_whenPythonProcessExecuted_thenSuccess() throws ExecuteException, IOException { + String line = "python " + resolvePythonScriptPath("hello.py"); + CommandLine cmdLine = CommandLine.parse(line); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream); + + DefaultExecutor executor = new DefaultExecutor(); + executor.setStreamHandler(streamHandler); + + int exitCode = executor.execute(cmdLine); + assertEquals("No errors should be detected", 0, exitCode); + assertEquals("Should contain script output: ", "Hello Baeldung Readers!!", outputStream.toString() + .trim()); + } + + private List readProcessOutput(InputStream inputStream) throws IOException { + try (BufferedReader output = new BufferedReader(new InputStreamReader(inputStream))) { + return output.lines() + .collect(Collectors.toList()); + } + } + + private String resolvePythonScriptPath(String filename) { + File file = new File("src/test/resources/" + filename); + return file.getAbsolutePath(); + } + +} diff --git a/java-python-interop/src/test/resources/hello.py b/java-python-interop/src/test/resources/hello.py new file mode 100644 index 0000000000..13275d9257 --- /dev/null +++ b/java-python-interop/src/test/resources/hello.py @@ -0,0 +1 @@ +print("Hello Baeldung Readers!!") \ No newline at end of file diff --git a/pom.xml b/pom.xml index c6addfa6aa..1a56184de2 100644 --- a/pom.xml +++ b/pom.xml @@ -461,7 +461,8 @@ java-lite java-numbers java-numbers-2 - java-numbers-3 + java-numbers-3 + java-python-interop java-rmi java-spi java-vavr-stream From 7a73363a01635e66f396ac88e094f243e04aafce Mon Sep 17 00:00:00 2001 From: Jonathan Cook Date: Mon, 18 May 2020 16:25:47 +0200 Subject: [PATCH 07/10] BAEL-3925-How to call Python from Java --- java-python-interop/README.md | 5 ----- language-interop/README.md | 5 +++++ {java-python-interop => language-interop}/pom.xml | 8 ++++---- .../interop/python}/ScriptEngineManagerUtils.java | 2 +- .../src/main/resources/logback.xml | 0 .../interop/python}/JavaPythonInteropUnitTest.java | 2 +- .../src/test/resources/hello.py | 0 7 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 java-python-interop/README.md create mode 100644 language-interop/README.md rename {java-python-interop => language-interop}/pom.xml (91%) rename {java-python-interop/src/main/java/com/baeldung/python/interop => language-interop/src/main/java/com/baeldung/language/interop/python}/ScriptEngineManagerUtils.java (95%) rename {java-python-interop => language-interop}/src/main/resources/logback.xml (100%) rename {java-python-interop/src/test/java/com/baeldung/python/interop => language-interop/src/test/java/com/baeldung/language/interop/python}/JavaPythonInteropUnitTest.java (99%) rename {java-python-interop => language-interop}/src/test/resources/hello.py (100%) diff --git a/java-python-interop/README.md b/java-python-interop/README.md deleted file mode 100644 index dc9573ecde..0000000000 --- a/java-python-interop/README.md +++ /dev/null @@ -1,5 +0,0 @@ -## Java Python Interop - -This module contains articles about Java and Python interoperability. - -### Relevant Articles: diff --git a/language-interop/README.md b/language-interop/README.md new file mode 100644 index 0000000000..a28c4a5405 --- /dev/null +++ b/language-interop/README.md @@ -0,0 +1,5 @@ +## Language Interop + +This module contains articles about Java interop with other language integrations. + +### Relevant Articles: diff --git a/java-python-interop/pom.xml b/language-interop/pom.xml similarity index 91% rename from java-python-interop/pom.xml rename to language-interop/pom.xml index 6ee5a0be3b..bdf872a076 100644 --- a/java-python-interop/pom.xml +++ b/language-interop/pom.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - java-python-interop + language-interop 0.0.1-SNAPSHOT - java-python-interop + language-interop com.baeldung @@ -33,7 +33,7 @@ - java-python-interop + language-interop src/main/resources @@ -52,4 +52,4 @@ 3.6.1 - \ No newline at end of file + diff --git a/java-python-interop/src/main/java/com/baeldung/python/interop/ScriptEngineManagerUtils.java b/language-interop/src/main/java/com/baeldung/language/interop/python/ScriptEngineManagerUtils.java similarity index 95% rename from java-python-interop/src/main/java/com/baeldung/python/interop/ScriptEngineManagerUtils.java rename to language-interop/src/main/java/com/baeldung/language/interop/python/ScriptEngineManagerUtils.java index 981f174c33..7bf07cf598 100644 --- a/java-python-interop/src/main/java/com/baeldung/python/interop/ScriptEngineManagerUtils.java +++ b/language-interop/src/main/java/com/baeldung/language/interop/python/ScriptEngineManagerUtils.java @@ -1,4 +1,4 @@ -package com.baeldung.python.interop; +package com.baeldung.language.interop.python; import java.util.List; diff --git a/java-python-interop/src/main/resources/logback.xml b/language-interop/src/main/resources/logback.xml similarity index 100% rename from java-python-interop/src/main/resources/logback.xml rename to language-interop/src/main/resources/logback.xml diff --git a/java-python-interop/src/test/java/com/baeldung/python/interop/JavaPythonInteropUnitTest.java b/language-interop/src/test/java/com/baeldung/language/interop/python/JavaPythonInteropUnitTest.java similarity index 99% rename from java-python-interop/src/test/java/com/baeldung/python/interop/JavaPythonInteropUnitTest.java rename to language-interop/src/test/java/com/baeldung/language/interop/python/JavaPythonInteropUnitTest.java index 5ec3a2b61f..50e7403470 100644 --- a/java-python-interop/src/test/java/com/baeldung/python/interop/JavaPythonInteropUnitTest.java +++ b/language-interop/src/test/java/com/baeldung/language/interop/python/JavaPythonInteropUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.python.interop; +package com.baeldung.language.interop.python; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.empty; diff --git a/java-python-interop/src/test/resources/hello.py b/language-interop/src/test/resources/hello.py similarity index 100% rename from java-python-interop/src/test/resources/hello.py rename to language-interop/src/test/resources/hello.py From fd2c628b341f334c0990dbfae7309b23dc2aac7b Mon Sep 17 00:00:00 2001 From: Jonathan Cook Date: Mon, 18 May 2020 16:28:45 +0200 Subject: [PATCH 08/10] BAEL-3925-How to call Python from Java --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 89ac3534b6..e9d032a211 100644 --- a/pom.xml +++ b/pom.xml @@ -462,7 +462,6 @@ java-numbers java-numbers-2 java-numbers-3 - java-python-interop java-rmi java-spi java-vavr-stream @@ -496,7 +495,8 @@ kotlin-quasar - libraries-2 + language-interop + libraries-2 libraries-3 libraries-apache-commons libraries-apache-commons-collections From aa6d896b11ee9f20d15c43042ded20f6b4019ac9 Mon Sep 17 00:00:00 2001 From: Jonathan Cook Date: Mon, 25 May 2020 23:08:23 +0200 Subject: [PATCH 09/10] BAEL-3912 - Java: Get week number from any date? --- .../weeknumber/WeekNumberUsingCalendar.java | 14 ++++------- .../weeknumber/WeekNumberUsingLocalDate.java | 2 +- .../WeekNumberUsingCalendarUnitTest.java | 24 ++++++++++-------- .../WeekNumberUsingLocalDateUnitTest.java | 25 ++++++++----------- 4 files changed, 29 insertions(+), 36 deletions(-) diff --git a/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingCalendar.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingCalendar.java index db32421aa4..7f4a57d997 100644 --- a/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingCalendar.java +++ b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingCalendar.java @@ -8,11 +8,11 @@ import java.util.Locale; public class WeekNumberUsingCalendar { - public int getWeekNumberFrom(String day, String dateFormat, Locale locale) throws ParseException { + public int getWeekNumberFrom(String dateString, String dateFormat, Locale locale) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); - + Date date = sdf.parse(dateString); + Calendar calendar = Calendar.getInstance(locale); - Date date = sdf.parse(day); calendar.setTime(date); return calendar.get(Calendar.WEEK_OF_YEAR); @@ -25,8 +25,8 @@ public class WeekNumberUsingCalendar { return calendar.get(Calendar.WEEK_OF_YEAR); } - public int getWeekNumberFrom(int year, int month, int day, int firstDayOfWeek, int minimalDaysInFirstWeek, Locale locale) { - Calendar calendar = Calendar.getInstance(locale); + public int getWeekNumberFrom(int year, int month, int day, int firstDayOfWeek, int minimalDaysInFirstWeek) { + Calendar calendar = Calendar.getInstance(); calendar.setFirstDayOfWeek(firstDayOfWeek); calendar.setMinimalDaysInFirstWeek(minimalDaysInFirstWeek); calendar.set(year, month, day); @@ -34,8 +34,4 @@ public class WeekNumberUsingCalendar { return calendar.get(Calendar.WEEK_OF_YEAR); } - public static void main(String[] args) { - WeekNumberUsingCalendar calendar = new WeekNumberUsingCalendar(); - System.out.println(calendar.getWeekNumberFrom(2020, 2, 22, Locale.CANADA)); - } } diff --git a/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingLocalDate.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingLocalDate.java index 4e1b7be3be..86d60311a9 100644 --- a/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingLocalDate.java +++ b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingLocalDate.java @@ -15,7 +15,7 @@ public class WeekNumberUsingLocalDate { .weekOfYear()); } - public Integer getWeekNumberUsinWeekFieldsFrom(int year, int month, int day, Locale locale) { + public Integer getWeekNumberUsingWeekFieldsFrom(int year, int month, int day, Locale locale) { LocalDate date = LocalDate.of(year, month, day); return date.get(WeekFields.of(locale) diff --git a/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingCalendarUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingCalendarUnitTest.java index 587a459277..955f2e93a4 100644 --- a/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingCalendarUnitTest.java +++ b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingCalendarUnitTest.java @@ -9,38 +9,40 @@ import java.util.Locale; import org.junit.Test; public class WeekNumberUsingCalendarUnitTest { + @Test - public void givenDateInStringAndDateFormatUsingLocaleItaly_thenGettingWeekNumberUsingCalendarIsCorrectlyReturned() throws ParseException { + public void givenDateFormatAndLocaleItaly_whenGetWeekNumber_thenWeekIsReturnedCorrectly() throws ParseException { WeekNumberUsingCalendar calendar = new WeekNumberUsingCalendar(); assertEquals(12, calendar.getWeekNumberFrom("20200322", "yyyyMMdd", Locale.ITALY)); } @Test - public void givenDateInStringAndDateFormatUsingLocaleCanada_thenGettingWeekNumberUsingCalendarIsCorrectlyReturned() throws ParseException { + public void givenDateFormatAndLocaleCanada_whenGetWeekNumber_thenWeekIsReturnedCorrectly() throws ParseException { WeekNumberUsingCalendar calendar = new WeekNumberUsingCalendar(); assertEquals(13, calendar.getWeekNumberFrom("20200322", "yyyyMMdd", Locale.CANADA)); } @Test - public void givenDateInYearMonthDayNumbersLocaleItaly_thenGettingWeekNumberUsingCalendarIsCorrectlyReturned() { + public void givenDateUsingFieldsAndLocaleItaly_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { WeekNumberUsingCalendar calendar = new WeekNumberUsingCalendar(); assertEquals(12, calendar.getWeekNumberFrom(2020, 2, 22, Locale.ITALY)); } @Test - public void givenDateInYearMonthDayNumbersLocaleItalyChangingWeekCalculationSettings_thenGettingWeekNumberUsingCalendarIsCorrectlyReturned() { - WeekNumberUsingCalendar calendar = new WeekNumberUsingCalendar(); - - assertEquals(13, calendar.getWeekNumberFrom(2020, 2, 22, Calendar.SUNDAY, 4, Locale.ITALY)); - } - - @Test - public void givenDateInYearMonthDayNumbersLocaleCanada_thenGettingWeekNumberUsingCalendarIsCorrectlyReturned() { + public void givenDateUsingFieldsAndLocaleCanada_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { WeekNumberUsingCalendar calendar = new WeekNumberUsingCalendar(); assertEquals(13, calendar.getWeekNumberFrom(2020, 2, 22, Locale.CANADA)); } + + @Test + public void givenDateUsingFieldsAndLocaleItaly_whenChangingWeekCalcSettings_thenWeekIsReturnedCorrectly() { + WeekNumberUsingCalendar calendar = new WeekNumberUsingCalendar(); + + assertEquals(13, calendar.getWeekNumberFrom(2020, 2, 22, Calendar.SUNDAY, 4)); + } + } diff --git a/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingLocalDateUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingLocalDateUnitTest.java index 9b98222ece..6c8f1469b2 100644 --- a/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingLocalDateUnitTest.java +++ b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingLocalDateUnitTest.java @@ -8,42 +8,37 @@ import org.junit.Test; public class WeekNumberUsingLocalDateUnitTest { @Test - public void givenDateInStringAndDateFormatUsingWeekFieldsWithLocaleItaly_thenGettingWeekNumberUsingLocalDateIsCorrectlyReturned() { + public void givenDateFormatAndLocaleItaly_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { WeekNumberUsingLocalDate localDate = new WeekNumberUsingLocalDate(); - assertEquals(12, localDate.getWeekNumberUsingWeekFiedsFrom("20200322", "yyyyMMdd", Locale.ITALY) - .longValue()); + assertEquals(Integer.valueOf(12), localDate.getWeekNumberUsingWeekFiedsFrom("20200322", "yyyyMMdd", Locale.ITALY)); } @Test - public void givenDateInStringAndDateFormatUsingWeekFieldsWithLocaleCanada_thenGettingWeekNumberUsingLocalDateIsCorrectlyReturned() { + public void givenDateFormatAndLocaleCanada_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { WeekNumberUsingLocalDate localDate = new WeekNumberUsingLocalDate(); - assertEquals(13, localDate.getWeekNumberUsingWeekFiedsFrom("20200322", "yyyyMMdd", Locale.CANADA) - .longValue()); + assertEquals(Integer.valueOf(13), localDate.getWeekNumberUsingWeekFiedsFrom("20200322", "yyyyMMdd", Locale.CANADA)); } @Test - public void givenDateInStringAndDateFormatUsingChronoFieds_thenGettingWeekNumberUsingLocalDateIsCorrectlyReturned() { + public void givenDateUsingChronoFields_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { WeekNumberUsingLocalDate localDate = new WeekNumberUsingLocalDate(); - assertEquals(12, localDate.getWeekNumberUsingChronoFieldFrom(2020, 3, 22) - .longValue()); + assertEquals(Integer.valueOf(12), localDate.getWeekNumberUsingChronoFieldFrom(2020, 3, 22)); } @Test - public void givenDateInYearMonthDayNumbersUsingWeekFieldsWithLocaleItaly_thenGettingWeekNumberUsingLocalDateIsCorrectlyReturned() { + public void givenDateUsingFieldsWithLocaleItaly_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { WeekNumberUsingLocalDate localDate = new WeekNumberUsingLocalDate(); - assertEquals(12, localDate.getWeekNumberUsinWeekFieldsFrom(2020, 3, 22, Locale.ITALY) - .longValue()); + assertEquals(Integer.valueOf(12), localDate.getWeekNumberUsingWeekFieldsFrom(2020, 3, 22, Locale.ITALY)); } @Test - public void givenDateInYearMonthDayNumbersUsingWeekFieldsWithLocaleCanada_thenGettingWeekNumberUsingLocalDateIsCorrectlyReturned() { + public void givenDateUsingFieldsWithLocaleCanada_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { WeekNumberUsingLocalDate localDate = new WeekNumberUsingLocalDate(); - assertEquals(13, localDate.getWeekNumberUsinWeekFieldsFrom(2020, 3, 22, Locale.CANADA) - .longValue()); + assertEquals(Integer.valueOf(13), localDate.getWeekNumberUsingWeekFieldsFrom(2020, 3, 22, Locale.CANADA)); } } From 9c9064cdb38f836535ce7c8eec8000a29514bef3 Mon Sep 17 00:00:00 2001 From: Jonathan Cook Date: Sun, 14 Jun 2020 10:44:59 +0200 Subject: [PATCH 10/10] BAEL-3912 - Java: Get week number from any date? --- .../weeknumber/WeekNumberUsingCalendar.java | 37 ----------- .../weeknumber/WeekNumberUsingLocalDate.java | 30 --------- .../weeknumber/GetWeekNumberUnitTest.java | 64 +++++++++++++++++++ .../WeekNumberUsingCalendarUnitTest.java | 48 -------------- .../WeekNumberUsingLocalDateUnitTest.java | 44 ------------- 5 files changed, 64 insertions(+), 159 deletions(-) delete mode 100644 core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingCalendar.java delete mode 100644 core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingLocalDate.java create mode 100644 core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/GetWeekNumberUnitTest.java delete mode 100644 core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingCalendarUnitTest.java delete mode 100644 core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingLocalDateUnitTest.java diff --git a/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingCalendar.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingCalendar.java deleted file mode 100644 index 7f4a57d997..0000000000 --- a/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingCalendar.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.baeldung.weeknumber; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.Locale; - -public class WeekNumberUsingCalendar { - - public int getWeekNumberFrom(String dateString, String dateFormat, Locale locale) throws ParseException { - SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); - Date date = sdf.parse(dateString); - - Calendar calendar = Calendar.getInstance(locale); - calendar.setTime(date); - - return calendar.get(Calendar.WEEK_OF_YEAR); - } - - public int getWeekNumberFrom(int year, int month, int day, Locale locale) { - Calendar calendar = Calendar.getInstance(locale); - calendar.set(year, month, day); - - return calendar.get(Calendar.WEEK_OF_YEAR); - } - - public int getWeekNumberFrom(int year, int month, int day, int firstDayOfWeek, int minimalDaysInFirstWeek) { - Calendar calendar = Calendar.getInstance(); - calendar.setFirstDayOfWeek(firstDayOfWeek); - calendar.setMinimalDaysInFirstWeek(minimalDaysInFirstWeek); - calendar.set(year, month, day); - - return calendar.get(Calendar.WEEK_OF_YEAR); - } - -} diff --git a/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingLocalDate.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingLocalDate.java deleted file mode 100644 index 86d60311a9..0000000000 --- a/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingLocalDate.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.baeldung.weeknumber; - -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.time.temporal.ChronoField; -import java.time.temporal.WeekFields; -import java.util.Locale; - -public class WeekNumberUsingLocalDate { - - public Integer getWeekNumberUsingWeekFiedsFrom(String day, String dayFormat, Locale locale) { - LocalDate date = LocalDate.parse(day, DateTimeFormatter.ofPattern(dayFormat)); - - return date.get(WeekFields.of(locale) - .weekOfYear()); - } - - public Integer getWeekNumberUsingWeekFieldsFrom(int year, int month, int day, Locale locale) { - LocalDate date = LocalDate.of(year, month, day); - - return date.get(WeekFields.of(locale) - .weekOfYear()); - } - - public Integer getWeekNumberUsingChronoFieldFrom(int year, int month, int day) { - LocalDate date = LocalDate.of(year, month, day); - - return date.get(ChronoField.ALIGNED_WEEK_OF_YEAR); - } -} \ No newline at end of file diff --git a/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/GetWeekNumberUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/GetWeekNumberUnitTest.java new file mode 100644 index 0000000000..c94950da29 --- /dev/null +++ b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/GetWeekNumberUnitTest.java @@ -0,0 +1,64 @@ +package com.baeldung.weeknumber; + +import static org.junit.Assert.assertEquals; + +import java.time.LocalDate; +import java.time.temporal.ChronoField; +import java.time.temporal.WeekFields; +import java.util.Calendar; +import java.util.Locale; + +import org.junit.Test; + +public class GetWeekNumberUnitTest { + + @Test + public void givenDateUsingFieldsAndLocaleItaly_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { + Calendar calendar = Calendar.getInstance(Locale.ITALY); + calendar.set(2020, 10, 22); + + assertEquals(47, calendar.get(Calendar.WEEK_OF_YEAR)); + } + + @Test + public void givenDateUsingFieldsAndLocaleCanada_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { + Calendar calendar = Calendar.getInstance(Locale.CANADA); + calendar.set(2020, 10, 22); + + assertEquals(48, calendar.get(Calendar.WEEK_OF_YEAR)); + } + + @Test + public void givenDateUsingFieldsAndLocaleItaly_whenChangingWeekCalcSettings_thenWeekIsReturnedCorrectly() { + Calendar calendar = Calendar.getInstance(); + calendar.setFirstDayOfWeek(Calendar.SUNDAY); + calendar.setMinimalDaysInFirstWeek(4); + calendar.set(2020, 2, 22); + + assertEquals(13, calendar.get(Calendar.WEEK_OF_YEAR)); + } + + @Test + public void givenDateUsingChronoFields_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { + LocalDate date = LocalDate.of(2020, 3, 22); + + assertEquals(12, date.get(ChronoField.ALIGNED_WEEK_OF_YEAR)); + } + + @Test + public void givenDateUsingFieldsWithLocaleItaly_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { + LocalDate date = LocalDate.of(2020, 3, 22); + + assertEquals(12, date.get(WeekFields.of(Locale.ITALY) + .weekOfYear())); + } + + @Test + public void givenDateUsingFieldsWithLocaleCanada_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { + LocalDate date = LocalDate.of(2020, 3, 22); + + assertEquals(13, date.get(WeekFields.of(Locale.CANADA) + .weekOfYear())); + } + +} diff --git a/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingCalendarUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingCalendarUnitTest.java deleted file mode 100644 index 955f2e93a4..0000000000 --- a/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingCalendarUnitTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.weeknumber; - -import static org.junit.Assert.assertEquals; - -import java.text.ParseException; -import java.util.Calendar; -import java.util.Locale; - -import org.junit.Test; - -public class WeekNumberUsingCalendarUnitTest { - - @Test - public void givenDateFormatAndLocaleItaly_whenGetWeekNumber_thenWeekIsReturnedCorrectly() throws ParseException { - WeekNumberUsingCalendar calendar = new WeekNumberUsingCalendar(); - - assertEquals(12, calendar.getWeekNumberFrom("20200322", "yyyyMMdd", Locale.ITALY)); - } - - @Test - public void givenDateFormatAndLocaleCanada_whenGetWeekNumber_thenWeekIsReturnedCorrectly() throws ParseException { - WeekNumberUsingCalendar calendar = new WeekNumberUsingCalendar(); - - assertEquals(13, calendar.getWeekNumberFrom("20200322", "yyyyMMdd", Locale.CANADA)); - } - - @Test - public void givenDateUsingFieldsAndLocaleItaly_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { - WeekNumberUsingCalendar calendar = new WeekNumberUsingCalendar(); - - assertEquals(12, calendar.getWeekNumberFrom(2020, 2, 22, Locale.ITALY)); - } - - @Test - public void givenDateUsingFieldsAndLocaleCanada_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { - WeekNumberUsingCalendar calendar = new WeekNumberUsingCalendar(); - - assertEquals(13, calendar.getWeekNumberFrom(2020, 2, 22, Locale.CANADA)); - } - - @Test - public void givenDateUsingFieldsAndLocaleItaly_whenChangingWeekCalcSettings_thenWeekIsReturnedCorrectly() { - WeekNumberUsingCalendar calendar = new WeekNumberUsingCalendar(); - - assertEquals(13, calendar.getWeekNumberFrom(2020, 2, 22, Calendar.SUNDAY, 4)); - } - -} diff --git a/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingLocalDateUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingLocalDateUnitTest.java deleted file mode 100644 index 6c8f1469b2..0000000000 --- a/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingLocalDateUnitTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.baeldung.weeknumber; - -import static org.junit.Assert.assertEquals; - -import java.util.Locale; - -import org.junit.Test; - -public class WeekNumberUsingLocalDateUnitTest { - @Test - public void givenDateFormatAndLocaleItaly_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { - WeekNumberUsingLocalDate localDate = new WeekNumberUsingLocalDate(); - - assertEquals(Integer.valueOf(12), localDate.getWeekNumberUsingWeekFiedsFrom("20200322", "yyyyMMdd", Locale.ITALY)); - } - - @Test - public void givenDateFormatAndLocaleCanada_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { - WeekNumberUsingLocalDate localDate = new WeekNumberUsingLocalDate(); - - assertEquals(Integer.valueOf(13), localDate.getWeekNumberUsingWeekFiedsFrom("20200322", "yyyyMMdd", Locale.CANADA)); - } - - @Test - public void givenDateUsingChronoFields_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { - WeekNumberUsingLocalDate localDate = new WeekNumberUsingLocalDate(); - - assertEquals(Integer.valueOf(12), localDate.getWeekNumberUsingChronoFieldFrom(2020, 3, 22)); - } - - @Test - public void givenDateUsingFieldsWithLocaleItaly_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { - WeekNumberUsingLocalDate localDate = new WeekNumberUsingLocalDate(); - - assertEquals(Integer.valueOf(12), localDate.getWeekNumberUsingWeekFieldsFrom(2020, 3, 22, Locale.ITALY)); - } - - @Test - public void givenDateUsingFieldsWithLocaleCanada_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { - WeekNumberUsingLocalDate localDate = new WeekNumberUsingLocalDate(); - - assertEquals(Integer.valueOf(13), localDate.getWeekNumberUsingWeekFieldsFrom(2020, 3, 22, Locale.CANADA)); - } -}