This is an automated email from the ASF dual-hosted git repository. kinow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-text.git
The following commit(s) were added to refs/heads/master by this push: new f0d378a (doc) add missing exception javadocs, add a couple more unit tests new fbe4013 Merge branch 'pr-311' f0d378a is described below commit f0d378a90be6949f5bf4c38ef37d57f23159816e Author: Diego Marcilio <dvmarci...@gmail.com> AuthorDate: Fri Mar 25 15:50:45 2022 +0100 (doc) add missing exception javadocs, add a couple more unit tests --- .../org/apache/commons/text/FormattableUtils.java | 4 ++++ .../org/apache/commons/text/StringSubstitutor.java | 8 ++++++++ .../org/apache/commons/text/TextStringBuilder.java | 8 ++++++++ .../text/translate/SinglePassTranslator.java | 4 ++++ .../apache/commons/text/FormattableUtilsTest.java | 8 ++++++++ .../apache/commons/text/StringSubstitutorTest.java | 23 ++++++++++++++++++++++ 6 files changed, 55 insertions(+) diff --git a/src/main/java/org/apache/commons/text/FormattableUtils.java b/src/main/java/org/apache/commons/text/FormattableUtils.java index 62a2380..642a141 100644 --- a/src/main/java/org/apache/commons/text/FormattableUtils.java +++ b/src/main/java/org/apache/commons/text/FormattableUtils.java @@ -86,6 +86,8 @@ public class FormattableUtils { * @param ellipsis the ellipsis to use when precision dictates truncation, null or * empty causes a hard truncation * @return The {@code formatter} instance, not null + * @throws IllegalArgumentException if {@code ellipsis.length() > precision}, + * given that {@code ellipsis} is not null and {@code precision >= 0} */ public static Formatter append(final CharSequence seq, final Formatter formatter, final int flags, final int width, final int precision, final char padChar, final CharSequence ellipsis) { @@ -125,6 +127,8 @@ public class FormattableUtils { * @param ellipsis the ellipsis to use when precision dictates truncation, null or * empty causes a hard truncation * @return The {@code formatter} instance, not null + * @throws IllegalArgumentException if {@code ellipsis.length() > precision}, + * given that {@code ellipsis} is not null and {@code precision >= 0} */ public static Formatter append(final CharSequence seq, final Formatter formatter, final int flags, final int width, final int precision, final CharSequence ellipsis) { diff --git a/src/main/java/org/apache/commons/text/StringSubstitutor.java b/src/main/java/org/apache/commons/text/StringSubstitutor.java index 5502943..71fb5c4 100644 --- a/src/main/java/org/apache/commons/text/StringSubstitutor.java +++ b/src/main/java/org/apache/commons/text/StringSubstitutor.java @@ -734,6 +734,10 @@ public class StringSubstitutor { * @param length the length within the array to be processed, must be valid * @return The result of the replace operation * @throws IllegalArgumentException if variable is not found when its allowed to throw exception + * @throws StringIndexOutOfBoundsException if {@code offset} is not in the + * range {@code 0 <= offset <= chars.length} + * @throws StringIndexOutOfBoundsException if {@code length < 0} + * @throws StringIndexOutOfBoundsException if {@code offset + length > chars.length} */ public String replace(final char[] source, final int offset, final int length) { if (source == null) { @@ -831,6 +835,10 @@ public class StringSubstitutor { * @param length the length within the source to be processed, must be valid * @return The result of the replace operation * @throws IllegalArgumentException if variable is not found when its allowed to throw exception + * @throws StringIndexOutOfBoundsException if {@code offset} is not in the + * range {@code 0 <= offset <= source.length()} + * @throws StringIndexOutOfBoundsException if {@code length < 0} + * @throws StringIndexOutOfBoundsException if {@code offset + length > source.length()} */ public String replace(final String source, final int offset, final int length) { if (source == null) { diff --git a/src/main/java/org/apache/commons/text/TextStringBuilder.java b/src/main/java/org/apache/commons/text/TextStringBuilder.java index cbf9b22..1d3186f 100644 --- a/src/main/java/org/apache/commons/text/TextStringBuilder.java +++ b/src/main/java/org/apache/commons/text/TextStringBuilder.java @@ -440,6 +440,10 @@ public class TextStringBuilder implements CharSequence, Appendable, Serializable * @param startIndex the start index, inclusive, must be valid * @param length the length to append, must be valid * @return this, to enable chaining + * @throws StringIndexOutOfBoundsException if {@code startIndex} is not in the + * range {@code 0 <= startIndex <= chars.length} + * @throws StringIndexOutOfBoundsException if {@code length < 0} + * @throws StringIndexOutOfBoundsException if {@code startIndex + length > chars.length} */ public TextStringBuilder append(final char[] chars, final int startIndex, final int length) { if (chars == null) { @@ -621,6 +625,10 @@ public class TextStringBuilder implements CharSequence, Appendable, Serializable * @param startIndex the start index, inclusive, must be valid * @param length the length to append, must be valid * @return this, to enable chaining + * @throws StringIndexOutOfBoundsException if {@code startIndex} is not in the + * range {@code 0 <= startIndex <= str.length()} + * @throws StringIndexOutOfBoundsException if {@code length < 0} + * @throws StringIndexOutOfBoundsException if {@code startIndex + length > str.length()} */ public TextStringBuilder append(final String str, final int startIndex, final int length) { if (str == null) { diff --git a/src/main/java/org/apache/commons/text/translate/SinglePassTranslator.java b/src/main/java/org/apache/commons/text/translate/SinglePassTranslator.java index db82bdb..dd19ab5 100644 --- a/src/main/java/org/apache/commons/text/translate/SinglePassTranslator.java +++ b/src/main/java/org/apache/commons/text/translate/SinglePassTranslator.java @@ -35,6 +35,10 @@ abstract class SinglePassTranslator extends CharSequenceTranslator { return clazz.isAnonymousClass() ? clazz.getName() : clazz.getSimpleName(); } + /** + * {@inheritDoc} + * @throws IllegalArgumentException if {@code index != 0} + */ @Override public int translate(final CharSequence input, final int index, final Writer writer) throws IOException { if (index != 0) { diff --git a/src/test/java/org/apache/commons/text/FormattableUtilsTest.java b/src/test/java/org/apache/commons/text/FormattableUtilsTest.java index 4dda6e6..8e68936 100644 --- a/src/test/java/org/apache/commons/text/FormattableUtilsTest.java +++ b/src/test/java/org/apache/commons/text/FormattableUtilsTest.java @@ -161,6 +161,14 @@ public class FormattableUtilsTest { } @Test + public void testIllegalEllipsisWith7Args() { + String ellipsis = "xxxx"; + int precisionLessThanEllipsisLength = ellipsis.length() - 1; + assertThatIllegalArgumentException().isThrownBy(() -> FormattableUtils.append("foo", createFormatter(), 0, 0, + precisionLessThanEllipsisLength, '}', ellipsis)); + } + + @Test public void testPublicConstructorExists() { new FormattableUtils(); } diff --git a/src/test/java/org/apache/commons/text/StringSubstitutorTest.java b/src/test/java/org/apache/commons/text/StringSubstitutorTest.java index 25a5ad5..2dbe6e9 100644 --- a/src/test/java/org/apache/commons/text/StringSubstitutorTest.java +++ b/src/test/java/org/apache/commons/text/StringSubstitutorTest.java @@ -17,6 +17,7 @@ package org.apache.commons.text; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.assertThatNullPointerException; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -1085,4 +1086,26 @@ public class StringSubstitutorTest { assertEqualsCharSeq("value $${escaped}", replace(sub, org)); } + @Test + public void testReplaceThrowsStringIndexOutOfBoundsException() { + final StringSubstitutor sub = new StringSubstitutor(); + + // replace(char[], int, int) + final char[] emptyCharArray = new char[] {}; + // offset greater than array length + assertThatExceptionOfType(StringIndexOutOfBoundsException.class).isThrownBy( + () -> sub.replace(emptyCharArray, 0, 1)); + // source != null && (offset > source.length || offset < 0) + assertThatExceptionOfType(StringIndexOutOfBoundsException.class).isThrownBy( + () -> sub.replace(emptyCharArray, 1, 0)); + + // replace(String, int, int) + // offset greater than source length + assertThatExceptionOfType(StringIndexOutOfBoundsException.class).isThrownBy( + () -> sub.replace("", 1, 1)); + // source != null && offset >= 0 && offset <= source.length() && (length > -offset + source.length() || length < 0) + assertThatExceptionOfType(StringIndexOutOfBoundsException.class).isThrownBy( + () -> sub.replace("", 0, 1)); + } + }