From 647778a301c992adfb31379ee5c8a1ad3cd2698f Mon Sep 17 00:00:00 2001 From: tonasoft Date: Sat, 29 Mar 2025 23:30:41 -0400 Subject: [PATCH 1/6] Add boundary value test for StringEscapeUtils.escapeHtml4() with small and large inputs --- .../text/StringEscapeUtils_BoundaryTest.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/test/java/org/apache/commons/text/StringEscapeUtils_BoundaryTest.java diff --git a/src/test/java/org/apache/commons/text/StringEscapeUtils_BoundaryTest.java b/src/test/java/org/apache/commons/text/StringEscapeUtils_BoundaryTest.java new file mode 100644 index 0000000000..bdaa3b72a5 --- /dev/null +++ b/src/test/java/org/apache/commons/text/StringEscapeUtils_BoundaryTest.java @@ -0,0 +1,43 @@ +package org.apache.commons.text; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class StringEscapeUtils_BoundaryTest { + + @Test + void testEscapeEmptyString() { + String input = ""; + String result = StringEscapeUtils.escapeHtml4(input); + assertEquals("", result); + } + + @Test + void testEscapeSingleChar() { + String input = "<"; + String result = StringEscapeUtils.escapeHtml4(input); + assertEquals("<", result); + } + + @Test + void testEscapeCommonHtml() { + String input = "
Hello & Goodbye
"; + String result = StringEscapeUtils.escapeHtml4(input); + assertEquals("<div>Hello & Goodbye</div>", result); + } + + @Test + void testEscapeLargeInput() { + // Java 8 compatible: use StringBuilder instead of repeat() + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < 333; i++) { + builder.append("<>&"); + } + builder.append("<"); + String input = builder.toString(); + + String result = StringEscapeUtils.escapeHtml4(input); + assertTrue(result.length() > input.length()); + } +} From 363819da34fd3811533f28b4840f005762136616 Mon Sep 17 00:00:00 2001 From: tonasoft Date: Sun, 30 Mar 2025 00:12:01 -0400 Subject: [PATCH 2/6] Add equivalence partitioning test for RandomStringGenerator in commons-text --- src/test/java/RandomStringGenerator_EquivalenceTest.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/test/java/RandomStringGenerator_EquivalenceTest.java diff --git a/src/test/java/RandomStringGenerator_EquivalenceTest.java b/src/test/java/RandomStringGenerator_EquivalenceTest.java new file mode 100644 index 0000000000..c44d95224a --- /dev/null +++ b/src/test/java/RandomStringGenerator_EquivalenceTest.java @@ -0,0 +1,4 @@ +package PACKAGE_NAME; + +public class RandomStringGenerator_EquivalenceTest { +} From 80580ee2454163380df60e27f9ce7180a1255b5e Mon Sep 17 00:00:00 2001 From: tonasoft Date: Sun, 30 Mar 2025 00:20:41 -0400 Subject: [PATCH 3/6] Add path testing for StringTokenizer to verify behavior with delimiters and token edge cases --- src/test/java/StringTokenizer_PathTest.java | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/test/java/StringTokenizer_PathTest.java diff --git a/src/test/java/StringTokenizer_PathTest.java b/src/test/java/StringTokenizer_PathTest.java new file mode 100644 index 0000000000..f35ee3f9db --- /dev/null +++ b/src/test/java/StringTokenizer_PathTest.java @@ -0,0 +1,2 @@ +public class StringTokenizer_PathTest { +} From 7c6837b2a5f395ef8de2a4443c667542a1bc1c92 Mon Sep 17 00:00:00 2001 From: tonasoft Date: Sun, 30 Mar 2025 00:29:41 -0400 Subject: [PATCH 4/6] Add data flow test case for ASCII_ALPHA_NUMERALS in CharacterPredicates --- .../text/CharacterPredicatesDataFlowTest.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/test/java/org/apache/commons/text/CharacterPredicatesDataFlowTest.java diff --git a/src/test/java/org/apache/commons/text/CharacterPredicatesDataFlowTest.java b/src/test/java/org/apache/commons/text/CharacterPredicatesDataFlowTest.java new file mode 100644 index 0000000000..a02f6d264d --- /dev/null +++ b/src/test/java/org/apache/commons/text/CharacterPredicatesDataFlowTest.java @@ -0,0 +1,48 @@ +package org.apache.commons.text; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class CharacterPredicatesDataFlowTest { + + // Test case: lowercase alphabetic character (e.g., 'g' => ASCII 103) + @Test + void testLowercaseAlphabetic() { + int codePoint = 'g'; + boolean result = CharacterPredicates.ASCII_ALPHA_NUMERALS.test(codePoint); + assertTrue(result, "Expected 'g' to be alphanumeric."); + } + + // Test case: uppercase alphabetic character (e.g., 'Z' => ASCII 90) + @Test + void testUppercaseAlphabetic() { + int codePoint = 'Z'; + boolean result = CharacterPredicates.ASCII_ALPHA_NUMERALS.test(codePoint); + assertTrue(result, "Expected 'Z' to be alphanumeric."); + } + + // Test case: numeric character (e.g., '5' => ASCII 53) + @Test + void testNumericCharacter() { + int codePoint = '5'; + boolean result = CharacterPredicates.ASCII_ALPHA_NUMERALS.test(codePoint); + assertTrue(result, "Expected '5' to be alphanumeric."); + } + + // Test case: symbol (e.g., '#' => ASCII 35), should return false + @Test + void testSymbolCharacter() { + int codePoint = '#'; + boolean result = CharacterPredicates.ASCII_ALPHA_NUMERALS.test(codePoint); + assertFalse(result, "Expected '#' not to be alphanumeric."); + } + + // Test case: non-ASCII character (e.g., 'ñ' => ASCII 241), should return false + @Test + void testNonAsciiCharacter() { + int codePoint = 'ñ'; + boolean result = CharacterPredicates.ASCII_ALPHA_NUMERALS.test(codePoint); + assertFalse(result, "Expected 'ñ' not to be alphanumeric."); + } +} From c34823bb497d636be1986d84499a70cc0c753402 Mon Sep 17 00:00:00 2001 From: tonasoft Date: Sun, 30 Mar 2025 00:39:22 -0400 Subject: [PATCH 5/6] Add black box test case for StrBuilder.reverse() with diverse input cases --- .../commons/text/StrBuilder_BlackBoxTest.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/test/java/org/apache/commons/text/StrBuilder_BlackBoxTest.java diff --git a/src/test/java/org/apache/commons/text/StrBuilder_BlackBoxTest.java b/src/test/java/org/apache/commons/text/StrBuilder_BlackBoxTest.java new file mode 100644 index 0000000000..537a3dcd0c --- /dev/null +++ b/src/test/java/org/apache/commons/text/StrBuilder_BlackBoxTest.java @@ -0,0 +1,43 @@ +package org.apache.commons.text; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class StrBuilder_BlackBoxTest { + + @Test + void testReverseEmptyString() { + StrBuilder builder = new StrBuilder(""); + builder.reverse(); + assertEquals("", builder.toString()); + } + + @Test + void testReverseSingleCharacter() { + StrBuilder builder = new StrBuilder("A"); + builder.reverse(); + assertEquals("A", builder.toString()); + } + + @Test + void testReversePalindrome() { + StrBuilder builder = new StrBuilder("madam"); + builder.reverse(); + assertEquals("madam", builder.toString()); + } + + @Test + void testReverseSimpleWord() { + StrBuilder builder = new StrBuilder("hello"); + builder.reverse(); + assertEquals("olleh", builder.toString()); + } + + @Test + void testReverseWithSpecialCharacters() { + StrBuilder builder = new StrBuilder("a@b#c$"); + builder.reverse(); + assertEquals("$c#b@a", builder.toString()); + } +} From a182dc96d51ad08670a110058156fa9221f91736 Mon Sep 17 00:00:00 2001 From: tonasoft Date: Wed, 9 Apr 2025 21:50:14 -0400 Subject: [PATCH 6/6] Recommit full test case logic for RandomStringGenerator and StringTokenizer tests --- ...RandomStringGenerator_EquivalenceTest.java | 41 +++++++++++++- src/test/java/StringTokenizer_PathTest.java | 55 ++++++++++++++++++- 2 files changed, 94 insertions(+), 2 deletions(-) diff --git a/src/test/java/RandomStringGenerator_EquivalenceTest.java b/src/test/java/RandomStringGenerator_EquivalenceTest.java index c44d95224a..81a50372d5 100644 --- a/src/test/java/RandomStringGenerator_EquivalenceTest.java +++ b/src/test/java/RandomStringGenerator_EquivalenceTest.java @@ -1,4 +1,43 @@ -package PACKAGE_NAME; +package org.apache.commons.text; + +import org.apache.commons.text.RandomStringGenerator.Builder; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; public class RandomStringGenerator_EquivalenceTest { + + @Test + void testGenerateNegativeLength() { + RandomStringGenerator generator = new Builder().build(); + assertThrows(IllegalArgumentException.class, () -> generator.generate(-1)); + } + + @Test + void testGenerateLengthZero() { + RandomStringGenerator generator = new Builder().build(); + String result = generator.generate(0); + assertNotNull(result); + assertEquals(0, result.length()); + } + + @Test + void testGenerateLengthOne() { + RandomStringGenerator generator = new Builder() + .withinRange('a', 'z') // ? Ensures length matches input + .build(); + String result = generator.generate(1); + assertNotNull(result); + assertEquals(1, result.length()); + } + + @Test + void testGenerateValidLength() { + RandomStringGenerator generator = new Builder() + .withinRange('a', 'z') + .build(); + String result = generator.generate(10); + assertNotNull(result); + assertEquals(10, result.length()); + } } diff --git a/src/test/java/StringTokenizer_PathTest.java b/src/test/java/StringTokenizer_PathTest.java index f35ee3f9db..2c2ab5926a 100644 --- a/src/test/java/StringTokenizer_PathTest.java +++ b/src/test/java/StringTokenizer_PathTest.java @@ -1,2 +1,55 @@ -public class StringTokenizer_PathTest { +package org.apache.commons.text; + +import org.junit.jupiter.api.Test; + +import java.util.NoSuchElementException; + +import static org.junit.jupiter.api.Assertions.*; + +class StringTokenizer_PathTest { + + @Test + void testEmptyInput() { + StringTokenizer tokenizer = new StringTokenizer(""); + assertFalse(tokenizer.hasNext()); + } + + @Test + void testTrailingDelimiter() { + StringTokenizer tokenizer = new StringTokenizer("a,", ','); + assertTrue(tokenizer.hasNext()); + assertEquals("a", tokenizer.next()); + assertFalse(tokenizer.hasNext()); // Avoid NoSuchElementException + } + + @Test + void testMultipleTokensCustomDelimiter() { + StringTokenizer tokenizer = new StringTokenizer("x|y|z", '|'); + assertEquals("x", tokenizer.next()); + assertEquals("y", tokenizer.next()); + assertEquals("z", tokenizer.next()); + } + + @Test + void testMultipleTokensDefaultDelimiter() { + StringTokenizer tokenizer = new StringTokenizer("a b c"); + assertEquals("a", tokenizer.next()); + assertEquals("b", tokenizer.next()); + assertEquals("c", tokenizer.next()); + } + + @Test + void testConsecutiveDelimiters() { + StringTokenizer tokenizer = new StringTokenizer("a,,b", ','); + assertEquals("a", tokenizer.next()); + assertEquals("b", tokenizer.next()); // previously missing + assertFalse(tokenizer.hasNext()); + } + + @Test + void testSingleToken() { + StringTokenizer tokenizer = new StringTokenizer("onlyOneToken"); + assertEquals("onlyOneToken", tokenizer.next()); + assertFalse(tokenizer.hasNext()); + } }