/** * Formats the given parameters and arguments to a comma-separated list of {@code $parameterName=$argumentName}. * Arguments {@link String} representation are therefore treated specially. * * @param parameters used to for formatting * @param arguments to be formatted * @return the formatted {@link String} of the given {@link Parameter}{@code []} and {@link List}{@code <Object>} */ protected String formatAll(Parameter[] parameters, List<Object> arguments) { StringBuilder stringBuilder = new StringBuilder(); for (int idx = 0; idx < arguments.size(); idx++) { String parameterName = (parameters.length > idx) ? parameters[idx].getName() : "?"; Object argument = arguments.get(idx); stringBuilder.append(parameterName).append("=").append(format(argument)); if (idx < arguments.size() - 1) { stringBuilder.append(", "); } } return stringBuilder.toString(); }
@Override protected String getReplacementFor(String placeholder, ReplacementData data) { FromAndTo fromAndTo = calcFromAndToForSubscriptAndArguments(placeholder, 4, data.getArguments().size()); return formatAll(getSubArrayOfMethodParameters(data.getTestMethod(), fromAndTo), data.getArguments().subList(fromAndTo.from, fromAndTo.to)); }
/** * @return the list of placeholders used to create the display name for each dataprovider test case */ protected List<? extends BasePlaceholder> getDefaultPlaceholders() { List<BasePlaceholder> result = new ArrayList<>(); result.add(new ArgumentPlaceholder()); result.add(new CanonicalClassNamePlaceholder()); // must be before SimpleClassNamePlaceholder result.add(new CompleteMethodSignaturePlaceholder()); // must be before SimpleClassNamePlaceholder result.add(new IndexPlaceholder()); result.add(new NamedArgumentPlaceholder()); result.add(new SimpleClassNamePlaceholder()); result.add(new SimpleMethodNamePlaceholder()); return result; }
@Test void testFormatAllHandleComplexExampleCorrectly() { // Given: Date now = new Date(); // @formatter:off final List<Object> arguments = list( now, Double.valueOf(3.5), new StringBuilder("1").append("|2").append("|3"), new File("src/main/java/com/tngtech") ); // @formatter:on // When: String result = underTest.formatAll(paramsWith(4), arguments); // Then: assertThat(result).isEqualTo("c0=" + now.toString() + ", i1=3.5, l2=1|2|3, d3=src/main/java/com/tngtech"); }
@Test void testProcessShouldReplaceSingleValueRangeSubscriptArgumentPlaceholderUsingOnlyNegativeIndices() { // Given: final List<Object> arguments = list('a', 1, 2l, 3.3, "four", 'f', 6, 7l, 8.8, 9.99f); ReplacementData data = ReplacementData.of(tenParamMethod, 0, arguments); // When: String result = underTest.process(data, "%na[-3..-3]"); // Then: assertThat(result).isEqualTo("l7=7"); }
@Test void testFormatAllShouldHandleSingleValueCorrectly() { // Given: final List<Object> arguments = list(12.45); // When: String result = underTest.formatAll(paramsWith(1), arguments); // Then: assertThat(result).isEqualTo("c0=12.45"); }
@Test void testProcessShouldReplaceWholeWithoutFirstRangeSubscriptArgumentPlaceholder() { // Given: final List<Object> arguments = list('a', 1, 2l, 3.3, "four", 'f', 6, 7l, 8.8, 9.99f); ReplacementData data = ReplacementData.of(tenParamMethod, 0, arguments); // When: String result = underTest.process(data, "%na[1..-1]"); // Then: assertThat(result).isEqualTo("i1=1, l2=2, d3=3.3, s4=four, c5=f, i6=6, l7=7, d8=8.8, f9=9.99"); }
@Test void testFormatAllReplacesNonPrintableCharactersWithPredefinedPrintableCounterpartEvenIfWithText() { // Given: final List<Object> arguments = list("test\btest\uFFFF"); // When: String result = underTest.formatAll(paramsWith(1), arguments); // Then: assertThat(result).isEqualTo("c0=test" + STRING_NON_PRINTABLE + "test" + STRING_NON_PRINTABLE); }
@Test void testFormatForCustomObjectReplacesLineFeedWithTheirPrintableCounterpart() { // Given: final TestToString argument = new TestToString("\n"); // When: String result = underTest.format(argument); // Then: assertThat(result).isEqualTo("\\n"); }
@Test void testProcessShouldReplaceIndexSubscriptArgumentPlaceholderUsingPositiveIndex() { // Given: final List<Object> arguments = list('a', 1, 2l, 3.3, "four", 'f', 6, 7l, 8.8, 9.99f); ReplacementData data = ReplacementData.of(tenParamMethod, 0, arguments); // When: String result = underTest.process(data, "%na[2]"); // Then: assertThat(result).isEqualTo("l2=2"); }
@Test void testFormatAllHandlePrimitiveCharTypeArrayCorrectly() { // Given: final List<Object> arguments = list(new char[] { 'a', '0' }); // When: String result = underTest.formatAll(paramsWith(1), arguments); // Then: assertThat(result).isEqualTo("c0=[a, 0]"); }
@Test void testFormatForCustomObjectReplacesCarriageReturnsWithTheirPrintableCounterpartEvenIfWithText() { // Given: final TestToString argument = new TestToString("test\rtest\r"); // When: String result = underTest.format(argument); // Then: assertThat(result).isEqualTo("test\\rtest\\r"); }
@Test void testProcessShouldReplaceWholeRangeSubscriptArgumentPlaceholderUsingMixedIndices() { // Given: final List<Object> arguments = list('a', 1, 2l, 3.3, "four", 'f', 6, 7l, 8.8, 9.99f); ReplacementData data = ReplacementData.of(tenParamMethod, 0, arguments); // When: String result = underTest.process(data, "%na[0..-1]"); // Then: assertThat(result).isEqualTo("c0=a, i1=1, l2=2, d3=3.3, s4=four, c5=f, i6=6, l7=7, d8=8.8, f9=9.99"); }
@Test void testFormatAllReplacesLineFeedsWithTheirPrintableCounterpartEvenIfWithText() { // Given: final List<Object> arguments = list("1\n2\n3"); // When: String result = underTest.formatAll(paramsWith(1), arguments); // Then: assertThat(result).isEqualTo("c0=1\\n2\\n3"); }
@Test void testFormatForCustomObjectReplacesLineFeedsWithTheirPrintableCounterpartEvenIfWithText() { // Given: final TestToString argument = new TestToString("1\n2\n3"); // When: String result = underTest.format(argument); // Then: assertThat(result).isEqualTo("1\\n2\\n3"); }
@Test void testProcessShouldReplaceWholeRangeSubscriptArgumentPlaceholderUsingOnlyNegativeIndices() { // Given: final List<Object> arguments = list('a', 1, 2l, 3.3, "four", 'f', 6, 7l, 8.8, 9.99f); ReplacementData data = ReplacementData.of(tenParamMethod, 0, arguments); // When: String result = underTest.process(data, "%na[-10..-1]"); // Then: assertThat(result).isEqualTo("c0=a, i1=1, l2=2, d3=3.3, s4=four, c5=f, i6=6, l7=7, d8=8.8, f9=9.99"); }
@Test void testFormatAllReplacesNonPrintableCharactersWithPredefinedPrintableCounterpart() { // Given: final List<Object> arguments = list("\u001F"); // When: String result = underTest.formatAll(paramsWith(1), arguments); // Then: assertThat(result).isEqualTo("c0=" + STRING_NON_PRINTABLE); }
@Test void testFormatForCustomObjectReplacesCarriageReturnWithTheirPrintableCounterpart() { // Given: final TestToString argument = new TestToString("\r"); // When: String result = underTest.format(argument); // Then: assertThat(result).isEqualTo("\\r"); }
@Test void testProcessShouldReplaceWholeWithoutLastRangeSubscriptArgumentPlaceholderUsingOnlyPositiveIndices() { // Given: final List<Object> arguments = list('a', 1, 2l, 3.3, "four", 'f', 6, 7l, 8.8, 9.99f); ReplacementData data = ReplacementData.of(tenParamMethod, 0, arguments); // When: String result = underTest.process(data, "%na[0..8]"); // Then: assertThat(result).isEqualTo("c0=a, i1=1, l2=2, d3=3.3, s4=four, c5=f, i6=6, l7=7, d8=8.8"); }
@Test void testFormatAllReplacesCarriageReturnsAndLineFeedsWithTheirPrintableCounterpart() { // Given: final List<Object> arguments = list("A very\r\nlong text\nwith multiple\rdifferent newline\n\rvariations."); // When: String result = underTest.formatAll(paramsWith(1), arguments); // Then: assertThat(result).isEqualTo("c0=A very\\r\\nlong text\\nwith multiple\\rdifferent newline\\n\\rvariations."); }