Skip to content

Commit 230b2db

Browse files
committed
MalformedInputException test functions are added
1 parent e8f8343 commit 230b2db

File tree

2 files changed

+70
-5
lines changed

2 files changed

+70
-5
lines changed

core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package com.baeldung.encoding;
22

3-
import java.io.File;
4-
import java.io.FileInputStream;
5-
import java.io.IOException;
6-
import java.io.InputStreamReader;
7-
import java.io.UnsupportedEncodingException;
3+
import java.io.*;
4+
import java.nio.charset.Charset;
5+
import java.nio.charset.CharsetDecoder;
6+
import java.nio.charset.CodingErrorAction;
87

98
public class CharacterEncodingExamples {
109

@@ -29,4 +28,15 @@ static String convertToBinary(String input, String encoding) throws UnsupportedE
2928
}
3029
return buffer.toString();
3130
}
31+
32+
static String decodeText(String input, Charset charset, CodingErrorAction codingErrorAction) throws IOException {
33+
CharsetDecoder charsetDecoder = charset.newDecoder();
34+
charsetDecoder.onMalformedInput(codingErrorAction);
35+
return new BufferedReader(
36+
new InputStreamReader(
37+
new ByteArrayInputStream(input.getBytes()),
38+
charsetDecoder))
39+
.readLine();
40+
41+
}
3242
}

core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,21 @@
11
package com.baeldung.encoding;
22

3+
import java.io.BufferedReader;
34
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
import java.io.Reader;
7+
import java.nio.charset.*;
8+
import java.nio.file.Path;
9+
import java.nio.file.Paths;
10+
import java.util.ArrayList;
11+
import java.util.Arrays;
12+
import java.util.List;
413

514
import org.junit.Assert;
615
import org.junit.Test;
16+
import org.junit.jupiter.api.Assertions;
17+
18+
import static java.nio.file.Files.newInputStream;
719

820
public class CharacterEncodingExamplesUnitTest {
921

@@ -58,4 +70,47 @@ public void givenCharacterCh_whenConvertedtoBinaryWithEncodingUTF32_thenProduceR
5870
"0 0 10001010 10011110 ");
5971
}
6072

73+
@Test
74+
public void givenUTF8String_decodeByUS_ASCII_ReplaceMalformedInputSequence() throws IOException {
75+
String input = "The façade pattern is a software design pattern.";
76+
Assertions.assertEquals(CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.REPLACE),
77+
"The fa��ade pattern is a software design pattern.");
78+
}
79+
80+
@Test
81+
public void givenUTF8String_decodeByUS_ASCII_IgnoreMalformedInputSequence() throws IOException {
82+
String input = "The façade pattern is a software design pattern.";
83+
Assertions.assertEquals(
84+
CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.IGNORE),
85+
"The faade pattern is a software design pattern.");
86+
}
87+
88+
@Test
89+
public void givenUTF8String_decodeByUS_ASCII_ReportMalformedInputSequence() {
90+
String input = "The façade pattern is a software design pattern.";
91+
Assertions.assertThrows(MalformedInputException.class,
92+
() -> CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.REPORT));
93+
}
94+
95+
@Test
96+
public void givenTextFile_FindSuitableCandidateEncodings() {
97+
Path path = Paths.get("src/test/resources/encoding.txt");
98+
List<Charset> allCandidateCharSets = Arrays.asList(StandardCharsets.US_ASCII, StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1);
99+
List<Charset> suitableCharsets = new ArrayList<>();
100+
allCandidateCharSets.forEach(charset -> {
101+
try {
102+
CharsetDecoder charsetDecoder = charset.newDecoder().onMalformedInput(CodingErrorAction.REPORT);
103+
Reader reader = new InputStreamReader(newInputStream(path), charsetDecoder);
104+
BufferedReader bufferedReader = new BufferedReader(reader);
105+
while (bufferedReader.readLine() != null) {
106+
}
107+
suitableCharsets.add(charset);
108+
} catch (MalformedInputException ignored) {
109+
} catch (IOException ex) {
110+
ex.printStackTrace();
111+
}
112+
});
113+
Assertions.assertEquals(suitableCharsets, Arrays.asList(StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1));
114+
}
115+
61116
}

0 commit comments

Comments
 (0)