// Implementation class: // https://pastebin.com/sfBYAjN3 import org.junit.Test; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import static org.junit.Assert.*; public class SquareWithDiagonalJUnitTests { @Test public void simpleBoxWithCount() { assertSquareWithDiagonalOutputEquals(new String[]{ "00000", "01000", "00200", "00030", "00004", }, () -> { // Simplistic implementation hard-coded to produce the above: SquareWithDiagonalImpl.main(null); }); } @Test public void box0() { assertSquareWithDiagonalOutputEquals(new String[]{ "0", }, 0); } @Test public void box1() { assertSquareWithDiagonalOutputEquals(new String[]{ "00", "01", }, 1); } @Test public void box2() { assertSquareWithDiagonalOutputEquals(new String[]{ "000", "010", "002", }, 2); } @Test public void box3() { assertSquareWithDiagonalOutputEquals(new String[]{ "0000", "0100", "0020", "0003", }, 3); } @Test public void box4() { assertSquareWithDiagonalOutputEquals(new String[]{ "00000", "01000", "00200", "00030", "00004", }, 4); } @Test public void box5() { assertSquareWithDiagonalOutputEquals(new String[]{ "000000", "010000", "002000", "000300", "000040", "000005", }, 5); } @Test public void box6() { assertSquareWithDiagonalOutputEquals(new String[]{ "0000000", "0100000", "0020000", "0003000", "0000400", "0000050", "0000006", }, 6); } @Test public void box9() { assertSquareWithDiagonalOutputEquals(new String[]{ "0000000000", "0100000000", "0020000000", "0003000000", "0000400000", "0000050000", "0000006000", "0000000700", "0000000080", "0000000009", }, 9); } private static void assertSquareWithDiagonalOutputEquals(final String[] expectedOutputLines, final int size) { assertSquareWithDiagonalOutputEquals(expectedOutputLines, () -> { SquareWithDiagonalImpl.simplisticImplementation_withSeparatePrintStatements(size); }); assertSquareWithDiagonalOutputEquals(expectedOutputLines, () -> { SquareWithDiagonalImpl.simplisticImplementation_withTernaryOperator(size); }); assertSquareWithDiagonalOutputEquals(expectedOutputLines, () -> { SquareWithDiagonalImpl.streamImplementation(size); }); } private static void assertSquareWithDiagonalOutputEquals(final String[] expectedOutputLines, final Runnable callback) { final PrintStream oldSystemOut = System.out; final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); final PrintStream printStream = new PrintStream(byteArrayOutputStream); System.setOut(printStream); try { // Call code under test, which is expected to send output to "System.out" callback.run(); } finally { System.setOut(oldSystemOut); printStream.close(); } final String expectedOutput = buildExpectedOutputString(expectedOutputLines); assertEquals(expectedOutput, byteArrayOutputStream.toString()); } private static String buildExpectedOutputString(String[] expectedOutputLines) { final String NL = System.lineSeparator(); // Local system newline final StringBuilder expectedOutputStringBuilder = new StringBuilder(); for (String line : expectedOutputLines) { expectedOutputStringBuilder.append(line); expectedOutputStringBuilder.append(NL); } return expectedOutputStringBuilder.toString(); } }