From 230b2db438eb991de795be57daf08c08245399be Mon Sep 17 00:00:00 2001 From: Afshin Date: Sun, 29 Sep 2019 18:30:31 +0200 Subject: [PATCH 1/7] MalformedInputException test functions are added --- .../encoding/CharacterEncodingExamples.java | 20 +++++-- .../CharacterEncodingExamplesUnitTest.java | 55 +++++++++++++++++++ 2 files changed, 70 insertions(+), 5 deletions(-) diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java b/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java index bdd92e37f6..51b2347823 100644 --- a/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java +++ b/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java @@ -1,10 +1,9 @@ package com.baeldung.encoding; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; +import java.io.*; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CodingErrorAction; public class CharacterEncodingExamples { @@ -29,4 +28,15 @@ public class CharacterEncodingExamples { } return buffer.toString(); } + + static String decodeText(String input, Charset charset, CodingErrorAction codingErrorAction) throws IOException { + CharsetDecoder charsetDecoder = charset.newDecoder(); + charsetDecoder.onMalformedInput(codingErrorAction); + return new BufferedReader( + new InputStreamReader( + new ByteArrayInputStream(input.getBytes()), + charsetDecoder)) + .readLine(); + + } } diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java index 95b3605d95..1a875738d0 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java +++ b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java @@ -1,9 +1,21 @@ package com.baeldung.encoding; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.*; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import org.junit.Assert; import org.junit.Test; +import org.junit.jupiter.api.Assertions; + +import static java.nio.file.Files.newInputStream; public class CharacterEncodingExamplesUnitTest { @@ -58,4 +70,47 @@ public class CharacterEncodingExamplesUnitTest { "0 0 10001010 10011110 "); } + @Test + public void givenUTF8String_decodeByUS_ASCII_ReplaceMalformedInputSequence() throws IOException { + String input = "The façade pattern is a software design pattern."; + Assertions.assertEquals(CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.REPLACE), + "The fa��ade pattern is a software design pattern."); + } + + @Test + public void givenUTF8String_decodeByUS_ASCII_IgnoreMalformedInputSequence() throws IOException { + String input = "The façade pattern is a software design pattern."; + Assertions.assertEquals( + CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.IGNORE), + "The faade pattern is a software design pattern."); + } + + @Test + public void givenUTF8String_decodeByUS_ASCII_ReportMalformedInputSequence() { + String input = "The façade pattern is a software design pattern."; + Assertions.assertThrows(MalformedInputException.class, + () -> CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.REPORT)); + } + + @Test + public void givenTextFile_FindSuitableCandidateEncodings() { + Path path = Paths.get("src/test/resources/encoding.txt"); + List allCandidateCharSets = Arrays.asList(StandardCharsets.US_ASCII, StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1); + List suitableCharsets = new ArrayList<>(); + allCandidateCharSets.forEach(charset -> { + try { + CharsetDecoder charsetDecoder = charset.newDecoder().onMalformedInput(CodingErrorAction.REPORT); + Reader reader = new InputStreamReader(newInputStream(path), charsetDecoder); + BufferedReader bufferedReader = new BufferedReader(reader); + while (bufferedReader.readLine() != null) { + } + suitableCharsets.add(charset); + } catch (MalformedInputException ignored) { + } catch (IOException ex) { + ex.printStackTrace(); + } + }); + Assertions.assertEquals(suitableCharsets, Arrays.asList(StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1)); + } + } From 2bb48cbedc50c26d055ce82c79c0770f658ecce1 Mon Sep 17 00:00:00 2001 From: Afshin Date: Sat, 5 Oct 2019 21:07:21 +0200 Subject: [PATCH 2/7] Wildcard imports are replaced by named classes and static import is removed --- .../baeldung/encoding/CharacterEncodingExamples.java | 8 +++++++- .../encoding/CharacterEncodingExamplesUnitTest.java | 11 +++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java b/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java index 51b2347823..c1898a6723 100644 --- a/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java +++ b/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java @@ -1,6 +1,12 @@ package com.baeldung.encoding; -import java.io.*; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CodingErrorAction; diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java index 1a875738d0..d87eafcee9 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java +++ b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java @@ -4,7 +4,12 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; -import java.nio.charset.*; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CodingErrorAction; +import java.nio.charset.MalformedInputException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; @@ -15,8 +20,6 @@ import org.junit.Assert; import org.junit.Test; import org.junit.jupiter.api.Assertions; -import static java.nio.file.Files.newInputStream; - public class CharacterEncodingExamplesUnitTest { @Test @@ -100,7 +103,7 @@ public class CharacterEncodingExamplesUnitTest { allCandidateCharSets.forEach(charset -> { try { CharsetDecoder charsetDecoder = charset.newDecoder().onMalformedInput(CodingErrorAction.REPORT); - Reader reader = new InputStreamReader(newInputStream(path), charsetDecoder); + Reader reader = new InputStreamReader(Files.newInputStream(path), charsetDecoder); BufferedReader bufferedReader = new BufferedReader(reader); while (bufferedReader.readLine() != null) { } From 750aab063e2c2da5d6f9cfdb110a24ed9c1b38e3 Mon Sep 17 00:00:00 2001 From: Afshin Date: Sun, 6 Oct 2019 11:07:21 +0200 Subject: [PATCH 3/7] indentations are adjusted --- .../CharacterEncodingExamplesUnitTest.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java index d87eafcee9..a8cee6881d 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java +++ b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java @@ -76,37 +76,37 @@ public class CharacterEncodingExamplesUnitTest { @Test public void givenUTF8String_decodeByUS_ASCII_ReplaceMalformedInputSequence() throws IOException { String input = "The façade pattern is a software design pattern."; - Assertions.assertEquals(CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.REPLACE), - "The fa��ade pattern is a software design pattern."); + Assertions.assertEquals("The fa��ade pattern is a software design pattern.", + CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.REPLACE)); } @Test public void givenUTF8String_decodeByUS_ASCII_IgnoreMalformedInputSequence() throws IOException { String input = "The façade pattern is a software design pattern."; Assertions.assertEquals( - CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.IGNORE), - "The faade pattern is a software design pattern."); + "The faade pattern is a software design pattern.", + CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.IGNORE)); } @Test public void givenUTF8String_decodeByUS_ASCII_ReportMalformedInputSequence() { String input = "The façade pattern is a software design pattern."; Assertions.assertThrows(MalformedInputException.class, - () -> CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.REPORT)); + () -> CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.REPORT)); } @Test public void givenTextFile_FindSuitableCandidateEncodings() { Path path = Paths.get("src/test/resources/encoding.txt"); - List allCandidateCharSets = Arrays.asList(StandardCharsets.US_ASCII, StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1); + List allCandidateCharSets = Arrays.asList( + StandardCharsets.US_ASCII, StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1); List suitableCharsets = new ArrayList<>(); allCandidateCharSets.forEach(charset -> { try { CharsetDecoder charsetDecoder = charset.newDecoder().onMalformedInput(CodingErrorAction.REPORT); Reader reader = new InputStreamReader(Files.newInputStream(path), charsetDecoder); BufferedReader bufferedReader = new BufferedReader(reader); - while (bufferedReader.readLine() != null) { - } + bufferedReader.readLine(); suitableCharsets.add(charset); } catch (MalformedInputException ignored) { } catch (IOException ex) { From da1ac659fb1ae9c982fe3226a0906c5bdfb06a10 Mon Sep 17 00:00:00 2001 From: Afshin Date: Sun, 6 Oct 2019 11:22:18 +0200 Subject: [PATCH 4/7] decodeText implementation is reformatted --- .../com/baeldung/encoding/CharacterEncodingExamples.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java b/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java index c1898a6723..1ed5f9e62a 100644 --- a/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java +++ b/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java @@ -39,10 +39,7 @@ public class CharacterEncodingExamples { CharsetDecoder charsetDecoder = charset.newDecoder(); charsetDecoder.onMalformedInput(codingErrorAction); return new BufferedReader( - new InputStreamReader( - new ByteArrayInputStream(input.getBytes()), - charsetDecoder)) - .readLine(); - + new InputStreamReader( + new ByteArrayInputStream(input.getBytes()), charsetDecoder)).readLine(); } } From 78cb7a3a3fe59c25d491d6abc5965f77d1981ad4 Mon Sep 17 00:00:00 2001 From: Afshin Date: Mon, 7 Oct 2019 11:52:22 +0200 Subject: [PATCH 5/7] Enhanced: given_when_then pattern naming and formatting problems are resolved --- .../CharacterEncodingExamplesUnitTest.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java index a8cee6881d..821c434117 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java +++ b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java @@ -74,29 +74,28 @@ public class CharacterEncodingExamplesUnitTest { } @Test - public void givenUTF8String_decodeByUS_ASCII_ReplaceMalformedInputSequence() throws IOException { - String input = "The façade pattern is a software design pattern."; + public void givenUTF8String_whenDecodeByUS_ASCII_thenIgnoreMalformedInputSequence() throws IOException { + Assertions.assertEquals("The faade pattern is a software design pattern.", + CharacterEncodingExamples.decodeText( + "The façade pattern is a software design pattern.", StandardCharsets.US_ASCII, CodingErrorAction.IGNORE)); + } + + @Test + public void givenUTF8String_whenDecodeByUS_ASCII_thenReplaceMalformedInputSequence() throws IOException { Assertions.assertEquals("The fa��ade pattern is a software design pattern.", - CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.REPLACE)); + CharacterEncodingExamples.decodeText( + "The façade pattern is a software design pattern.", StandardCharsets.US_ASCII, CodingErrorAction.REPLACE)); } @Test - public void givenUTF8String_decodeByUS_ASCII_IgnoreMalformedInputSequence() throws IOException { - String input = "The façade pattern is a software design pattern."; - Assertions.assertEquals( - "The faade pattern is a software design pattern.", - CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.IGNORE)); - } - - @Test - public void givenUTF8String_decodeByUS_ASCII_ReportMalformedInputSequence() { - String input = "The façade pattern is a software design pattern."; + public void givenUTF8String_whenDecodeByUS_ASCII_thenReportMalformedInputSequence() { Assertions.assertThrows(MalformedInputException.class, - () -> CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.REPORT)); + () -> CharacterEncodingExamples.decodeText( + "The façade pattern is a software design pattern.", StandardCharsets.US_ASCII, CodingErrorAction.REPORT)); } @Test - public void givenTextFile_FindSuitableCandidateEncodings() { + public void givenTextFile_whenFindSuitableCandidateEncodings_thenProduceSuitableCandidateEncodings() { Path path = Paths.get("src/test/resources/encoding.txt"); List allCandidateCharSets = Arrays.asList( StandardCharsets.US_ASCII, StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1); @@ -113,6 +112,7 @@ public class CharacterEncodingExamplesUnitTest { ex.printStackTrace(); } }); + Assertions.assertEquals(suitableCharsets, Arrays.asList(StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1)); } From 7a9738b4bb1870bf3445c91e5810fbc3093251ba Mon Sep 17 00:00:00 2001 From: Afshin Date: Mon, 7 Oct 2019 12:20:54 +0200 Subject: [PATCH 6/7] Enhanced: reformatted code to synchronized it with the article --- .../CharacterEncodingExamplesUnitTest.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java index 821c434117..39152c6fb1 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java +++ b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java @@ -75,23 +75,27 @@ public class CharacterEncodingExamplesUnitTest { @Test public void givenUTF8String_whenDecodeByUS_ASCII_thenIgnoreMalformedInputSequence() throws IOException { - Assertions.assertEquals("The faade pattern is a software design pattern.", - CharacterEncodingExamples.decodeText( - "The façade pattern is a software design pattern.", StandardCharsets.US_ASCII, CodingErrorAction.IGNORE)); + Assertions.assertEquals("The faade pattern is a software design pattern.", CharacterEncodingExamples.decodeText("The façade pattern is a software design pattern.", StandardCharsets.US_ASCII, CodingErrorAction.IGNORE)); } @Test public void givenUTF8String_whenDecodeByUS_ASCII_thenReplaceMalformedInputSequence() throws IOException { - Assertions.assertEquals("The fa��ade pattern is a software design pattern.", + Assertions.assertEquals( + "The fa��ade pattern is a software design pattern.", CharacterEncodingExamples.decodeText( - "The façade pattern is a software design pattern.", StandardCharsets.US_ASCII, CodingErrorAction.REPLACE)); + "The façade pattern is a software design pattern.", + StandardCharsets.US_ASCII, + CodingErrorAction.REPLACE)); } @Test public void givenUTF8String_whenDecodeByUS_ASCII_thenReportMalformedInputSequence() { - Assertions.assertThrows(MalformedInputException.class, + Assertions.assertThrows( + MalformedInputException.class, () -> CharacterEncodingExamples.decodeText( - "The façade pattern is a software design pattern.", StandardCharsets.US_ASCII, CodingErrorAction.REPORT)); + "The façade pattern is a software design pattern.", + StandardCharsets.US_ASCII, + CodingErrorAction.REPORT)); } @Test @@ -99,6 +103,7 @@ public class CharacterEncodingExamplesUnitTest { Path path = Paths.get("src/test/resources/encoding.txt"); List allCandidateCharSets = Arrays.asList( StandardCharsets.US_ASCII, StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1); + List suitableCharsets = new ArrayList<>(); allCandidateCharSets.forEach(charset -> { try { From 3997dcc8e20b27063890d43961abcc5c27df3a7e Mon Sep 17 00:00:00 2001 From: Afshin Date: Mon, 7 Oct 2019 12:22:05 +0200 Subject: [PATCH 7/7] Enhanced: renamed a function --- .../baeldung/encoding/CharacterEncodingExamplesUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java index 39152c6fb1..fe3867a3c3 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java +++ b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java @@ -99,7 +99,7 @@ public class CharacterEncodingExamplesUnitTest { } @Test - public void givenTextFile_whenFindSuitableCandidateEncodings_thenProduceSuitableCandidateEncodings() { + public void givenTextFile_whenLoopOverAllCandidateEncodings_thenProduceSuitableCandidateEncodings() { Path path = Paths.get("src/test/resources/encoding.txt"); List allCandidateCharSets = Arrays.asList( StandardCharsets.US_ASCII, StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1);