/*
* Copyright 2015-2017 the original author or authors.
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
* accompanies this distribution and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.junit.jupiter.api;
import static org.junit.jupiter.api.AssertLinesMatch.isFastForwardLine;
import static org.junit.jupiter.api.AssertLinesMatch.parseFastForwardLimit;
import static org.junit.jupiter.api.AssertionTestUtils.assertMessageEquals;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertLinesMatch;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import org.junit.platform.commons.util.PreconditionViolationException;
import org.opentest4j.AssertionFailedError;
/**
* Unit tests for JUnit Jupiter {@link Assertions}.
*
* @since 5.0
*/
class AssertionsAssertLinesMatchTests {
@Test
void assertLinesMatchEmptyLists() {
assertLinesMatch(Collections.emptyList(), new ArrayList<>());
}
@Test
void assertLinesMatchSameListInstance() {
List<String> list = Arrays.asList("first line", "second line", "third line", "last line");
assertLinesMatch(list, list);
}
@Test
void assertLinesMatchPlainEqualLists() {
List<String> expected = Arrays.asList("first line", "second line", "third line", "last line");
List<String> actual = Arrays.asList("first line", "second line", "third line", "last line");
assertLinesMatch(expected, actual);
}
@Test
void assertLinesMatchUsingRegexPatterns() {
List<String> expected = Arrays.asList("^first.+line", "second\\s*line", "th.rd l.ne", "last line$");
List<String> actual = Arrays.asList("first line", "second line", "third line", "last line");
assertLinesMatch(expected, actual);
}
@Test
void assertLinesMatchUsingFastForwardMarkerAtEndOfExpectedLines() {
List<String> expected = Arrays.asList("first line", ">> ignore all following lines >>");
List<String> actual = Arrays.asList("first line", "I", "II", "III", "IV", "V", "VI", "last line");
assertLinesMatch(expected, actual);
}
@Test
void assertLinesMatchUsingFastForwardMarker() {
List<String> expected = Arrays.asList("first line", ">> skip lines until next matches >>", "V", "last line");
List<String> actual = Arrays.asList("first line", "I", "II", "III", "IV", "V", "last line");
assertLinesMatch(expected, actual);
}
@Test
void assertLinesMatchUsingFastForwardMarkerWithLimit1() {
List<String> expected = Arrays.asList("first line", ">> 1 >>", "last line");
List<String> actual = Arrays.asList("first line", "skipped", "last line");
assertLinesMatch(expected, actual);
}
@Test
void assertLinesMatchUsingFastForwardMarkerWithLimit3() {
List<String> expected = Collections.singletonList(">> 3 >>");
List<String> actual = Arrays.asList("first line", "skipped", "last line");
assertLinesMatch(expected, actual);
}
@Test
void assertLinesMatchWithNullFails() {
assertThrows(PreconditionViolationException.class, () -> assertLinesMatch(null, null));
assertThrows(PreconditionViolationException.class, () -> assertLinesMatch(null, Collections.emptyList()));
assertThrows(PreconditionViolationException.class, () -> assertLinesMatch(Collections.emptyList(), null));
}
@Test
void assertLinesMatchMoreExpectedThanActualAvailableFails() {
List<String> expected = Arrays.asList("first line", "second line", "third line");
List<String> actual = Arrays.asList("first line", "third line");
Error error = assertThrows(AssertionFailedError.class, () -> assertLinesMatch(expected, actual));
List<String> expectedErrorMessageLines = Arrays.asList( //
"expected 3 lines, but only got 2 ==> expected: <first line", //
"second line", //
"third line> but was: <first line", //
"third line>");
assertLinesMatch(expectedErrorMessageLines, Arrays.asList(error.getMessage().split("\\R")));
}
@Test
void assertLinesMatchFailsWithDescriptiveErrorMessage() {
List<String> expected = Arrays.asList("first line", "second line", "third line");
List<String> actual = Arrays.asList("first line", "sec0nd line", "third line");
Error error = assertThrows(AssertionFailedError.class, () -> assertLinesMatch(expected, actual));
List<String> expectedErrorMessageLines = Arrays.asList( //
"expected line #2:`second line` doesn't match ==> expected: <first line", //
"second line", //
"third line> but was: <first line", //
"sec0nd line", //
"third line>");
assertLinesMatch(expectedErrorMessageLines, Arrays.asList(error.getMessage().split("\\R")));
}
@Test
void assertLinesMatchMoreActualLinesThenExpectedFails() {
List<String> expected = Arrays.asList("first line", "second line", "third line");
List<String> actual = Arrays.asList("first line", "second line", "third line", "last line");
Error error = assertThrows(AssertionFailedError.class, () -> assertLinesMatch(expected, actual));
List<String> expectedErrorMessageLines = Arrays.asList( //
"more actual lines than expected: 1 ==> expected: <first line", //
"second line", //
"third line> but was: <first line", //
"second line", //
"third line", "last line>");
assertLinesMatch(expectedErrorMessageLines, Arrays.asList(error.getMessage().split("\\R")));
}
@Test
void assertLinesMatchUsingFastForwardMarkerWithTooLowLimitFails() {
List<String> expected = Arrays.asList("first line", ">> 1 >>");
List<String> actual = Arrays.asList("first line", "skipped", "last line");
Error error = assertThrows(AssertionFailedError.class, () -> assertLinesMatch(expected, actual));
List<String> expectedErrorMessageLines = Arrays.asList( //
"terminal fast-forward(1) error: fast-forward(2) expected ==> expected: <first line", //
">> 1 >>> but was: <first line", //
"skipped", //
"last line>");
assertLinesMatch(expectedErrorMessageLines, Arrays.asList(error.getMessage().split("\\R")));
}
@Test
void assertLinesMatchUsingFastForwardMarkerWithTooHighLimitFails() {
List<String> expected = Arrays.asList("first line", ">> 100 >>");
List<String> actual = Arrays.asList("first line", "skipped", "last line");
Error error = assertThrows(AssertionFailedError.class, () -> assertLinesMatch(expected, actual));
List<String> expectedErrorMessageLines = Arrays.asList( //
"terminal fast-forward(100) error: fast-forward(2) expected ==> expected: <first line", //
">> 100 >>> but was: <first line", //
"skipped", //
"last line>");
assertLinesMatch(expectedErrorMessageLines, Arrays.asList(error.getMessage().split("\\R")));
}
@Test
void assertLinesMatchUsingFastForwardMarkerWithoutMatchingNextLineFails() {
List<String> expected = Arrays.asList("first line", ">> fails, because next line is >>", "not present");
List<String> actual = Arrays.asList("first line", "skipped", "last line");
Error error = assertThrows(AssertionFailedError.class, () -> assertLinesMatch(expected, actual));
List<String> expectedErrorMessageLines = Arrays.asList( //
"fast-forward(∞) didn't find: `not present` ==> expected: <first line", //
">> fails, because next line is >>", //
"not present> but was: <first line", //
"skipped", //
"last line>");
assertLinesMatch(expectedErrorMessageLines, Arrays.asList(error.getMessage().split("\\R")));
}
@Test
void assertLinesMatchIsFastForwardLine() {
assertAll("valid fast-forward lines", //
() -> assertTrue(isFastForwardLine(">>>>")), () -> assertTrue(isFastForwardLine(">> >>")),
() -> assertTrue(isFastForwardLine(">> stacktrace >>")),
() -> assertTrue(isFastForwardLine(">> single line, non Integer.parse()-able comment >>")),
() -> assertTrue(isFastForwardLine(">>9>>")), () -> assertTrue(isFastForwardLine(">> 9 >>")),
() -> assertTrue(isFastForwardLine(">> -9 >>")));
}
@Test
void assertLinesMatchParseFastForwardLimit() {
assertAll("valid fast-forward limits", //
() -> assertEquals(Integer.MAX_VALUE, parseFastForwardLimit(">>>>")),
() -> assertEquals(Integer.MAX_VALUE, parseFastForwardLimit(">> >>")),
() -> assertEquals(Integer.MAX_VALUE, parseFastForwardLimit(">> stacktrace >>")),
() -> assertEquals(Integer.MAX_VALUE, parseFastForwardLimit(">> non Integer.parse()-able comment >>")),
() -> assertEquals(9, parseFastForwardLimit(">>9>>")),
() -> assertEquals(9, parseFastForwardLimit(">> 9 >>")));
Throwable error = assertThrows(PreconditionViolationException.class, () -> parseFastForwardLimit(">>0>>"));
assertMessageEquals(error, "fast-forward(0) limit must be greater than zero");
error = assertThrows(PreconditionViolationException.class, () -> parseFastForwardLimit(">>-1>>"));
assertMessageEquals(error, "fast-forward(-1) limit must be greater than zero");
error = assertThrows(PreconditionViolationException.class, () -> parseFastForwardLimit(">>-2147483648>>"));
assertMessageEquals(error, "fast-forward(-2147483648) limit must be greater than zero");
}
@Test
void assertLinesMatchMatches() {
Random random = new Random();
assertAll("do match", //
() -> assertTrue(
AssertLinesMatch.matches("duration: [\\d]+ ms", "duration: " + random.nextInt(1000) + " ms")),
() -> assertTrue(AssertLinesMatch.matches("123", "123")),
() -> assertTrue(AssertLinesMatch.matches(".*", "123")),
() -> assertTrue(AssertLinesMatch.matches("\\d+", "123")));
assertAll("don't match", //
() -> assertFalse(
AssertLinesMatch.matches("duration: [\\d]+ ms", "duration: " + random.nextGaussian() + " ms")),
() -> assertFalse(AssertLinesMatch.matches("12", "123")),
() -> assertFalse(AssertLinesMatch.matches("..+", "1")),
() -> assertFalse(AssertLinesMatch.matches("\\d\\d+", "1")));
}
}