Skip to content

Commit

Permalink
Added Charset parameter and fix UTs for cp1252 charset
Browse files Browse the repository at this point in the history
  • Loading branch information
jebeaudet committed Jul 9, 2023
1 parent b593254 commit c650458
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.Objects;
import java.util.function.Consumer;

/**
Expand All @@ -35,10 +36,16 @@
class LineRedirectOutputStream extends OutputStream {

private final Consumer<String> linePrinter;
private final Charset charset;
private ByteArrayOutputStream buffer = new ByteArrayOutputStream();

public LineRedirectOutputStream(Consumer<String> linePrinter) {
this.linePrinter = linePrinter;
this(linePrinter, Charset.defaultCharset());
}

public LineRedirectOutputStream(Consumer<String> linePrinter, Charset charset) {
this.linePrinter = Objects.requireNonNull(linePrinter);
this.charset = Objects.requireNonNull(charset);
}

@Override
Expand All @@ -63,7 +70,7 @@ public void close() {
}

private void printAndReset() {
linePrinter.accept(new String(buffer.toByteArray(), Charset.defaultCharset()));
linePrinter.accept(new String(buffer.toByteArray(), charset));
buffer = new ByteArrayOutputStream();
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,74 @@
package org.codehaus.mojo.exec;

import org.junit.Assert;
import org.junit.Assume;
import org.junit.Test;

import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.function.Function;

public class LineRedirectOutputStreamTest {

@Test
public void givenUtf8Output_whenRedirecting_thenShouldDecodeProperly() throws IOException {
public void givenExtendedUnicodeCharacterOutput_whenRedirectingWithUtf8Charset_thenShouldDecodeProperly()
throws IOException {
internalTestForCharset(StandardCharsets.UTF_8);
}

@Test
public void givenExtendedUnicodeCharacterOutput_whenRedirectingWithIso8859Charset_thenShouldDecodeProperly()
throws IOException {
internalTestForCharset(StandardCharsets.ISO_8859_1);
}

@Test
public void givenExtendedUnicodeCharacterOutput_whenRedirectingWithCp1252_thenShouldDecodeProperly()
throws IOException {
Assume.assumeTrue("The JVM does not contain the cp-1252 charset", Charset.availableCharsets().containsKey("windows-1252"));
internalTestForCharset(Charset.forName("windows-1252"));
}

@Test
public void givenExtendedUnicodeCharacterOutput_whenRedirectingWithDefaultCharset_thenShouldDecodeProperly()
throws IOException {
internalTestForCharset(Charset.defaultCharset());
}

@Test
public void givenExtendedUnicodeCharacterOutput_whenRedirectingWithCharsetUnspecified_thenShouldDecodeProperly()
throws IOException {
internalTestForCharset(sb -> new LineRedirectOutputStream(sb::append), Charset.defaultCharset());
}

@Test(expected = NullPointerException.class)
public void givenNullCharset_whenInstantiating_thenShouldThrow() {
new LineRedirectOutputStream(new StringBuilder()::append, null);
}

@Test(expected = NullPointerException.class)
public void givenNullStringConsumer_whenInstantiating_thenShouldThrow() {
new LineRedirectOutputStream(null, Charset.defaultCharset());
}

private void internalTestForCharset(Charset charset) throws IOException {
internalTestForCharset(sb -> new LineRedirectOutputStream(sb::append, charset), charset);
}

private void internalTestForCharset(Function<StringBuilder, LineRedirectOutputStream> lineRedirectOutputStream,
Charset charset) throws IOException {
StringBuilder sb = new StringBuilder();
String firstLine = "Hello 😃 😄";
String secondLine = "foo bar éà";
String firstLine = "Hello, 你好, नमस्ते, مرحبا, γεια σας, שלום, こんにちは, 안녕하세요!";
String secondLine = "🌍 Welcome to the world! 🌟✨🎉🔥";
String expectedString = firstLine + secondLine;

try (LineRedirectOutputStream os = new LineRedirectOutputStream(sb::append)) {
os.write(String.join("\n", firstLine, secondLine).getBytes(Charset.defaultCharset()));
try (LineRedirectOutputStream os = lineRedirectOutputStream.apply(sb)) {
os.write(String.join("\n", firstLine, secondLine).getBytes(charset));
}

Assert.assertEquals(firstLine + secondLine, sb.toString());
// The String to bytes to String is required here because StringCoding uses the Charset.defaultCharset()
// internally so it would make the test fail when testing for different charsets.
Assert.assertEquals(new String(expectedString.getBytes(charset), charset), sb.toString());
}
}

0 comments on commit c650458

Please sign in to comment.