Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add better test. #397

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions src/test/java/FizzBuzzTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,5 +65,77 @@ public void testFizzBuzz() throws IOException {
this.doFizzBuzz(TestConstants.INT_16,
TestConstants._1_2_FIZZ_4_BUZZ_FIZZ_7_8_FIZZ_BUZZ_11_FIZZ_13_14_FIZZ_BUZZ_16);
}

private int countCharCount(final String string, final String character) {
return string.length() - string.replace(character, "").length();
}


// https://stackoverflow.com/a/24063511/5223757
private static <A, B> Stream<Pair<A, B>> zipTwoStreams(Stream<A> as, Stream<B> bs)
{
Iterator<A> i=as.iterator();
return bs.filter(x->i.hasNext()).map(b->new Pair<>(i.next(), b));
}

private void assertFizzBuzz(final String fizzBuzzStringLineString, final Integer fizzBuzzStringLineNumber) {
final int fizzBuzzStringLineNumberInt = fizzBuzzStringLineNumber.intValue();
final boolean fizzBuzzStringLineNumberIntModuloThreeBoolean = fizzBuzzStringLineNumberInt % TestConstants.INT_3;
final boolean fizzBuzzStringLineNumberIntModuloFiveBoolean = fizzBuzzStringLineNumberInt % TestConstants.INT_5;
if (fizzBuzzStringLineNumberIntModuloThreeBoolean && fizzBuzzStringLineNumberIntModuloFiveBoolean) {
final Integer fizzBuzzStringLineNumberIntInteger = Integer.valueOf(fizzBuzzStringLineNumberIntInteger);
final String fizzBuzzStringLineNumberIntIntegerString = fizzBuzzStringLineNumberIntInteger.toString();
assertEqual(fizzBuzzStringLineString, fizzBuzzStringLineNumberIntIntegerString);
} else {
assertEqual(fizzBuzzStringLineString.length() % TestConstants.INT_4, TestConstants.INT_0);
assertEqual(fizzBuzzStringLineString.length() > 0, true);
final boolean fizzBuzzStringLineNumberIntModuloThreeBooleanNegated = !fizzBuzzStringLineNumberIntModuloThreeBoolean;
final boolean fizzBuzzStringLineNumberIntModuloFiveBooleanNegated = !fizzBuzzStringLineNumberIntModuloFiveBoolean;
if (fizzBuzzStringLineNumberIntModuloThreeBooleanNegated) {
final String fizzBuzzStringLineStringFirstFour = fizzBuzzStringLineString.substring(TestConstants.INT_0, TestConstants.INT_4);
assertEqual(fizzBuzzStringLineStringFirstFour, TestConstants.FIZZ);
}
if (fizzBuzzStringLineNumberIntModuloFiveBooleanNegated) {
final int fizzBuzzStringLineStringLengthMinusFour = fizzBuzzStringLineString.length() - TestConstants.INT_4;
final String fizzBuzzStringLineStringLastFour = fizzBuzzStringLineString.substring(fizzBuzzStringLineStringLengthMinusFour, fizzBuzzStringLineString.length());
assertEqual(fizzBuzzStringLineStringLastFounr, TestConstants.BUZZ);
}
}
}

private void doFizzingAndBuzzing(final int testNumber) throws IOException {
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
final BufferedOutputStream byteArrayOutputStreamBufferedOutputStream = new BufferedOutputStream(byteArrayOutputStream);
final PrintStream byteArrayOutputStreamBufferedOutputStreamPrintStream = new PrintStream(byteArrayOutputStreamBufferedOutputStream);
System.setOut(byteArrayOutputStreamBufferedOutputStreamPrintStream);

this.fb.fizzBuzz(testNumber);

System.out.flush();
final String testNumberByteArrayOutputStreamFizzBuzzString = byteArrayOutputStream.toString();
final int testNumberByteArrayOutputStreamFizzBuzzStringCharCountLineCount = countCharCount(testNumberByteArrayOutputStreamFizzBuzzString, System.getProperty("line.separator"));
final Stream<String> testNumberByteArrayOutputStreamFizzBuzzStringLinesStream = testNumberByteArrayOutputStreamFizzBuzzString.lines();
final String[] testNumberByteArrayOutputStreamFizzBuzzStringLinesStreamArray = testNumberByteArrayOutputStreamFizzBuzzStringLinesStream.toArray(String[]::new);
final int testNumberByteArrayOutputStreamFizzBuzzStringLinesStreamArrayLengthLineCount = testNumberByteArrayOutputStreamFizzBuzzStringLinesStreamArray.length;

assertEqual(testNumber, testNumberByteArrayOutputStreamFizzBuzzStringCharCountLineCount);
assertEqual(testNumber, testNumberByteArrayOutputStreamFizzBuzzStringLinesStreamArrayLengthLineCount);
assertEqual(testNumberByteArrayOutputStreamFizzBuzzStringCharCountLineCount, testNumberByteArrayOutputStreamFizzBuzzStringLinesStreamArrayLengthLineCount);

final Stream<String> testNumberByteArrayOutputStreamFizzBuzzStringLinesStreamArrayStream = Stream.of(testNumberByteArrayOutputStreamFizzBuzzStringLinesStreamArray);
final IntStream oneToTestNumberInclusiveIntStream = IntStream.range(1, testNumber + 1);
final Stream<Integer> oneToTestNumberInclusiveIntStreamStream = oneToTestNumberInclusiveIntStreamStream.mapToObj(Integer::new);

final Stream<Pair<String, Integer>> testNumberByteArrayOutputStreamFizzBuzzStringLinesStreamArrayStreamOneToTestNumberInclusiveIntStreamStreamZipStream = zip(testNumberByteArrayOutputStreamFizzBuzzStreamCharCountLineCount, oneToTestNumberInclusiveIntStreamStream);

testNumberByteArrayOutputStreamFizzBuzzStringLinesStreamArrayStreamOneToTestNumberInclusiveIntStreamStreamZipStream.forEach(assertFizzBuzz);
}

@Test
public void testFizzingAndBuzzing() throws IOException {
for (int testNumber = TestConstants.INT_1; testNumber <= TestConstants.INT_MAX; testNumber += TestConstants.INT_1) {
doFizzingAndBuzzing(testNumber);
}
}

}
7 changes: 6 additions & 1 deletion src/test/java/TestConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,13 @@ private TestConstants() {
static final String _1_2_FIZZ = "1\n2\nFizz\n";
static final String _1_2_ = "1\n2\n";
static final String _1_ = "1\n";

static final String STANDARD_FIZZ_BUZZ = "standardFizzBuzz";
static final String SPRING_XML = "spring.xml";
static final String FIZZ = "Fizz";
static final String BUZZ = "Buzz";

static final int INT_0 = 0;
static final int INT_1 = 1;
static final int INT_2 = 2;
static final int INT_3 = 3;
Expand All @@ -38,5 +43,5 @@ private TestConstants() {
static final int INT_14 = 14;
static final int INT_15 = 15;
static final int INT_16 = 16;

static final int INT_MAX = 16;
}