This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 3f7b26b649 Unit tests
3f7b26b649 is described below

commit 3f7b26b649de0d023aef2ec33f78a2a72f299055
Author: James Bognar <[email protected]>
AuthorDate: Sun Nov 30 17:38:07 2025 -0500

    Unit tests
---
 .../java/org/apache/juneau/common/utils/Utils.java |   4 +-
 .../apache/juneau/html/BasicHtmlDocTemplate.java   |  17 +-
 .../juneau/common/utils/StringUtils_Test.java      |   8 -
 .../org/apache/juneau/common/utils/Utils_Test.java | 916 ++++++++++++++++++++-
 4 files changed, 922 insertions(+), 23 deletions(-)

diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/Utils.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/Utils.java
index accb0a3f3d..26aa1ad70b 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/Utils.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/Utils.java
@@ -282,8 +282,8 @@ public class Utils {
                        return 1;
                }
 
-               if (o1.getClass() == o2.getClass() && o1 instanceof Comparable 
o1_2)
-                       return o1_2.compareTo(o2);
+               if (eq(o1.getClass(), o2.getClass()) && o1 instanceof 
Comparable o1a)
+                       return o1a.compareTo(o2);
 
                return 0;
        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/BasicHtmlDocTemplate.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/BasicHtmlDocTemplate.java
index 997c566616..949046de39 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/BasicHtmlDocTemplate.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/BasicHtmlDocTemplate.java
@@ -20,6 +20,9 @@ import static 
org.apache.juneau.common.utils.CollectionUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
 import static org.apache.juneau.html.AsideFloat.*;
 
+import java.util.Collection;
+import java.util.Map;
+
 import org.apache.juneau.common.collections.*;
 import org.apache.juneau.common.utils.*;
 
@@ -40,6 +43,18 @@ public class BasicHtmlDocTemplate implements HtmlDocTemplate 
{
                return nn(s) && ! "NONE".equals(s);
        }
 
+       private static boolean isEmptyObject(Object o) {
+               if (o == null)
+                       return true;
+               if (o instanceof Collection<?> o2)
+                       return o2.isEmpty();
+               if (o instanceof Map<?,?> o2)
+                       return o2.isEmpty();
+               if (isArray(o))
+                       return (java.lang.reflect.Array.getLength(o) == 0);
+               return o.toString().isEmpty();
+       }
+
        @Override /* Overridden from HtmlDocTemplate */
        public void writeTo(HtmlDocSerializerSession session, HtmlWriter w, 
Object o) throws Exception {
                w.sTag("html").nl(0);
@@ -68,7 +83,7 @@ public class BasicHtmlDocTemplate implements HtmlDocTemplate {
 
                if (o == null) {
                        w.append(6, "<null/>").nl(6);
-               } else if (isEmpty(o)) {
+               } else if (isEmptyObject(o)) {
                        String m = session.getNoResultsMessage();
                        if (exists(m))
                                w.append(6, session.resolve(m)).nl(6);
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/common/utils/StringUtils_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/common/utils/StringUtils_Test.java
index dbb5546eeb..6b6796e490 100755
--- 
a/juneau-utest/src/test/java/org/apache/juneau/common/utils/StringUtils_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/common/utils/StringUtils_Test.java
@@ -1353,14 +1353,6 @@ class StringUtils_Test extends TestBase {
                assertTrue(isNotBlank("a"));
        }
 
-       @Test
-       void a43_isEmpty() {
-               assertTrue(Utils.isEmpty((String)null));
-               assertTrue(Utils.isEmpty(""));
-               assertFalse(Utils.isEmpty("   "));
-               assertFalse(Utils.isEmpty("hello"));
-               assertFalse(Utils.isEmpty("a"));
-       }
 
        @Test
        void a44_hasText() {
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/common/utils/Utils_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/common/utils/Utils_Test.java
index 39ed92c678..042b7f925e 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/common/utils/Utils_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/common/utils/Utils_Test.java
@@ -16,34 +16,356 @@
  */
 package org.apache.juneau.common.utils;
 
+import static org.apache.juneau.common.utils.CollectionUtils.a;
 import static org.apache.juneau.common.utils.Utils.*;
 import static org.junit.jupiter.api.Assertions.*;
 
+import java.lang.annotation.*;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.*;
+
 import org.apache.juneau.*;
+import org.apache.juneau.common.collections.Value;
+import org.apache.juneau.common.function.Snippet;
 import org.junit.jupiter.api.*;
 
+@Retention(RetentionPolicy.RUNTIME)
+@interface TestAnnotation {
+       String value() default "";
+       int num() default 0;
+}
+
 class Utils_Test extends TestBase {
 
        
//====================================================================================================
-       // nn(Object)
+       // b(Object)
        
//====================================================================================================
        @Test
-       void a01_nn_single() {
-               assertTrue(nn("test"));
-               assertTrue(nn(123));
-               assertTrue(nn(new Object()));
-               assertTrue(nn(""));
-               assertTrue(nn(0));
-               assertTrue(nn(false));
+       void a01_b() {
+               assertTrue(b(true));
+               assertTrue(b("true"));
+               assertTrue(b("TRUE"));
+               assertFalse(b(false));
+               assertFalse(b("false"));
+               assertFalse(b("FALSE"));
+               assertFalse(b(null));
+               assertFalse(b(""));
+               assertFalse(b(123));
+               assertFalse(b(new Object()));
+       }
 
-               assertFalse(nn(null));
+       
//====================================================================================================
+       // cast(Class<T>, Object)
+       
//====================================================================================================
+       @Test
+       void a02_cast() {
+               var obj = "Hello";
+               assertEquals("Hello", cast(String.class, obj));
+               assertNull(cast(Integer.class, obj));
+               assertNull(cast(String.class, null));
+               assertEquals(123, cast(Integer.class, 123));
+               assertNull(cast(String.class, 123));
+       }
+
+       
//====================================================================================================
+       // castOrNull(Object, Class<T>)
+       
//====================================================================================================
+       @Test
+       void a03_castOrNull() {
+               var obj = "Hello";
+               assertEquals("Hello", castOrNull(obj, String.class));
+               assertNull(castOrNull(obj, Integer.class));
+               assertNull(castOrNull(null, String.class));
+               assertEquals(123, castOrNull(123, Integer.class));
+               assertNull(castOrNull(123, String.class));
+       }
+
+       
//====================================================================================================
+       // cn(Object)
+       
//====================================================================================================
+       @Test
+       void a04_cn() {
+               assertEquals("java.lang.String", cn(String.class));
+               assertEquals("java.util.HashMap", cn(new HashMap<>()));
+               assertEquals("java.util.Map$Entry", cn(Map.Entry.class));
+               assertEquals("int", cn(int.class));
+               assertEquals("boolean", cn(boolean.class));
+               assertEquals("[Ljava.lang.String;", cn(String[].class));
+               assertEquals("[I", cn(int[].class));
+               assertNull(cn(null));
+       }
+
+       
//====================================================================================================
+       // cns(Object)
+       
//====================================================================================================
+       @Test
+       void a05_cns() {
+               assertEquals("String", cns(String.class));
+               assertEquals("HashMap", cns(new HashMap<>()));
+               assertEquals("Entry", cns(Map.Entry.class));
+               assertEquals("int", cns(int.class));
+               assertEquals("boolean", cns(boolean.class));
+               assertEquals("String[]", cns(String[].class));
+               assertEquals("int[]", cns(int[].class));
+               assertNull(cns(null));
+       }
+
+       
//====================================================================================================
+       // cnsq(Object)
+       
//====================================================================================================
+       @Test
+       void a06_cnsq() {
+               assertEquals("String", cnsq(String.class));
+               assertEquals("HashMap", cnsq(new HashMap<>()));
+               assertEquals("Map.Entry", cnsq(Map.Entry.class));
+               assertEquals("int", cnsq(int.class));
+               assertEquals("boolean", cnsq(boolean.class));
+               assertEquals("String[]", cnsq(String[].class));
+               assertEquals("int[]", cnsq(int[].class));
+               assertNull(cnsq(null));
+       }
+
+       
//====================================================================================================
+       // compare(Object, Object)
+       
//====================================================================================================
+       @Test
+       void a07_compare() {
+               assertTrue(compare("apple", "banana") < 0);
+               assertTrue(compare("banana", "apple") > 0);
+               assertEquals(0, compare("apple", "apple"));
+               assertEquals(0, compare(null, null));
+               assertTrue(compare(null, "apple") < 0);
+               assertTrue(compare("apple", null) > 0);
+               assertTrue(compare(5, 10) < 0);
+               assertTrue(compare(10, 5) > 0);
+               assertEquals(0, compare(5, 5));
+               assertEquals(0, compare("apple", 5)); // Different types, 
cannot compare
+
+               // Test line 285 branch: same class but not Comparable
+               class NotComparable {}
+               var nc1 = new NotComparable();
+               var nc2 = new NotComparable();
+               assertEquals(0, compare(nc1, nc2)); // Same class, but not 
Comparable - covers missing branch
+       }
+
+       
//====================================================================================================
+       // ea(Class<T>)
+       
//====================================================================================================
+       @Test
+       void a08_ea() {
+               var empty1 = ea(String.class);
+               assertEquals(0, empty1.length);
+               var empty2 = ea(Integer.class);
+               assertEquals(0, empty2.length);
+               var empty3 = ea(List.class);
+               assertEquals(0, empty3.length);
+       }
+
+       
//====================================================================================================
+       // emptyIfNull(Object)
+       
//====================================================================================================
+       @Test
+       void a09_emptyIfNull() {
+               assertEquals("Hello", emptyIfNull("Hello"));
+               assertEquals("123", emptyIfNull(123));
+               assertEquals("", emptyIfNull(null));
+       }
+
+       
//====================================================================================================
+       // env(String)
+       
//====================================================================================================
+       @Test
+       void a10_env() {
+               // Test with system property
+               System.setProperty("test.property", "testValue");
+               var result = env("test.property");
+               assertTrue(result.isPresent());
+               assertEquals("testValue", result.get());
+               System.clearProperty("test.property");
+
+               // Test with non-existent property
+               var missing = env("nonexistent.property.xyz");
+               assertFalse(missing.isPresent());
+       }
+
+       
//====================================================================================================
+       // env(String, T)
+       
//====================================================================================================
+       @Test
+       void a11_env_withDefault() {
+               // Test with system property - covers toType line 1489-1490 
(String)
+               System.setProperty("test.property2", "testValue2");
+               var result = env("test.property2", "default");
+               assertEquals("testValue2", result);
+               System.clearProperty("test.property2");
+
+               // Test with default value
+               var defaultValue = env("nonexistent.property.xyz2", "default");
+               assertEquals("default", defaultValue);
+
+               // Test with Boolean type - covers toType line 1493-1496 
(ENV_FUNCTIONS)
+               System.setProperty("test.boolean", "true");
+               var boolResult = env("test.boolean", false);
+               assertTrue(boolResult);
+               System.clearProperty("test.boolean");
+
+               // Test with Enum type - covers toType line 1491-1492 (Enum)
+               enum TestEnum { VALUE1, VALUE2 }
+               System.setProperty("test.enum", "VALUE1");
+               var enumResult = env("test.enum", TestEnum.VALUE2);
+               assertEquals(TestEnum.VALUE1, enumResult);
+               System.clearProperty("test.enum");
+
+               // Test null default - covers toType line 1486-1487 (def == 
null)
+               var nullResult = env("nonexistent.property.null", (String)null);
+               assertNull(nullResult);
+
+               // Test null string - covers toType line 1486-1487 (s == null, 
def != null)
+               // Use reflection to call private toType method directly
+               try {
+                       var toTypeMethod = 
Utils.class.getDeclaredMethod("toType", String.class, Object.class);
+                       toTypeMethod.setAccessible(true);
+                       var nullStringResult = 
(String)toTypeMethod.invoke(null, (String)null, "default");
+                       assertNull(nullStringResult);
+               } catch (Exception e) {
+                       fail("Failed to test toType with null string: " + 
e.getMessage());
+               }
+
+               // Test both null - covers toType line 1486-1487 (s == null && 
def == null)
+               // Use reflection to call private toType method directly
+               try {
+                       var toTypeMethod = 
Utils.class.getDeclaredMethod("toType", String.class, Object.class);
+                       toTypeMethod.setAccessible(true);
+                       var bothNullResult = (String)toTypeMethod.invoke(null, 
(String)null, (String)null);
+                       assertNull(bothNullResult);
+               } catch (Exception e) {
+                       fail("Failed to test toType with both null: " + 
e.getMessage());
+               }
+
+               // Test invalid type - covers toType line 1494-1495 (exception)
+               // Note: Charset doesn't work because def.getClass() returns 
concrete implementation class
+               System.setProperty("test.invalid", "value");
+               assertThrows(RuntimeException.class, () -> env("test.invalid", 
123)); // Integer not in ENV_FUNCTIONS
+               System.clearProperty("test.invalid");
+       }
+
+       
//====================================================================================================
+       // eq(boolean, String, String)
+       
//====================================================================================================
+       @Test
+       void a12_eq_caseSensitive() {
+               assertTrue(eq(false, "Hello", "Hello"));
+               assertFalse(eq(false, "Hello", "hello"));
+               assertTrue(eq(false, null, null));
+               assertFalse(eq(false, "Hello", null));
+               assertFalse(eq(false, null, "Hello"));
+               assertTrue(eq(true, "Hello", "hello"));
+               assertTrue(eq(true, "Hello", "HELLO"));
+               assertTrue(eq(true, null, null));
+       }
+
+       
//====================================================================================================
+       // eq(T, T)
+       
//====================================================================================================
+       @Test
+       void a13_eq() {
+               assertTrue(eq("Hello", "Hello"));
+               assertFalse(eq("Hello", "World"));
+               assertTrue(eq(null, null));
+               assertFalse(eq("Hello", null));
+               assertFalse(eq(null, "Hello"));
+               assertTrue(eq(123, 123));
+               assertFalse(eq(123, 456));
+
+               // Test arrays - covers line 456
+               var arr1 = a(1, 2, 3);
+               var arr2 = a(1, 2, 3);
+               var arr3 = a(1, 2, 4);
+               var arr4 = a(1, 2);  // Different length
+               // Test line 456: both are arrays
+               assertTrue(eq(arr1, arr2));  // Both arrays, same content
+               assertFalse(eq(arr1, arr3));  // Both arrays, different content
+               assertFalse(eq(arr1, arr4));  // Different lengths - covers 
line 459
+               // Test line 456 branch: one is array, other is not
+               assertFalse(eq(arr1, "not an array"));  // o1 is Array, o2 is 
not
+               assertFalse(eq("not an array", arr1));  // o1 is not, o2 is 
Array
+
+               // Test annotations - use actual annotation instances from 
classes
+               @TestAnnotation("test")
+               class T1 {}
+               @TestAnnotation("test")
+               class T2 {}
+               @TestAnnotation("different")
+               class T3 {}
+
+               var a1 = T1.class.getAnnotation(TestAnnotation.class);
+               var a2 = T2.class.getAnnotation(TestAnnotation.class);
+               var a3 = T3.class.getAnnotation(TestAnnotation.class);
+               // Test annotation equality - covers line 453 (both are 
annotations)
+               assertTrue(eq(a1, a2));
+               assertFalse(eq(a1, a3));
+               // Test line 453 branch: one is annotation, other is not
+               assertFalse(eq(a1, "not an annotation"));  // o1 is Annotation, 
o2 is not
+               assertFalse(eq("not an annotation", a1));  // o1 is not, o2 is 
Annotation
+       }
+
+       
//====================================================================================================
+       // eq(T, U, BiPredicate<T,U>)
+       
//====================================================================================================
+       @Test
+       void a14_eq_withPredicate() {
+               class Role {
+                       int id;
+                       String name;
+                       Role(int id, String name) { this.id = id; this.name = 
name; }
+               }
+
+               var r1 = new Role(1, "admin");
+               var r2 = new Role(1, "admin");
+               var r3 = new Role(2, "user");
+
+               assertTrue(eq(r1, r2, (x, y) -> x.id == y.id && 
x.name.equals(y.name)));
+               assertFalse(eq(r1, r3, (x, y) -> x.id == y.id && 
x.name.equals(y.name)));
+               assertTrue(eq(null, null, (x, y) -> false));
+               assertFalse(eq(r1, null, (x, y) -> true));
+               assertFalse(eq(null, r2, (x, y) -> true));
+               assertTrue(eq(r1, r1, (x, y) -> false)); // Same reference
+       }
+
+       
//====================================================================================================
+       // eqic(Object, Object)
+       
//====================================================================================================
+       @Test
+       void a15_eqic_object() {
+               assertTrue(eqic("Hello", "Hello"));
+               assertTrue(eqic("Hello", "hello"));
+               assertTrue(eqic("Hello", "HELLO"));
+               assertTrue(eqic(null, null));
+               assertFalse(eqic("Hello", null));
+               assertFalse(eqic(null, "Hello"));
+               assertTrue(eqic(123, 123));
+               assertFalse(eqic(123, 456));
+       }
+
+       
//====================================================================================================
+       // eqic(String, String)
+       
//====================================================================================================
+       @Test
+       void a16_eqic_string() {
+               assertTrue(eqic("Hello", "Hello"));
+               assertTrue(eqic("Hello", "hello"));
+               assertTrue(eqic("Hello", "HELLO"));
+               assertTrue(eqic(null, null));
+               assertFalse(eqic("Hello", null));
+               assertFalse(eqic(null, "Hello"));
        }
 
        
//====================================================================================================
        // f(String, Object...)
        
//====================================================================================================
        @Test
-       void a02_f() {
+       void a17_f() {
                // Basic formatting
                assertEquals("Hello John, you have 5 items", f("Hello %s, you 
have %d items", "John", 5));
                assertEquals("Hello world", f("Hello %s", "world"));
@@ -60,13 +382,33 @@ class Utils_Test extends TestBase {
                assertEquals("Value: null", f("Value: %s", (String)null));
                assertThrows(IllegalArgumentException.class, ()->f(null, 
"test"));
                assertEquals("test", f("test"));
+
+               // MessageFormat style
+               assertEquals("Hello John, you have 5 items", f("Hello {0}, you 
have {1} items", "John", 5));
+       }
+
+       
//====================================================================================================
+       // firstNonNull(T...)
+       
//====================================================================================================
+       @Test
+       void a18_firstNonNull() {
+               assertEquals("Hello", firstNonNull(null, null, "Hello", 
"World"));
+               assertEquals("Hello", firstNonNull("Hello", "World"));
+               assertNull(firstNonNull(null, null));
+               assertNull(firstNonNull());
+               assertEquals(123, firstNonNull(null, null, 123, 456));
+
+               // Test line 614 branch: null array (varargs array itself is 
null)
+               // This can happen if called with explicit null cast
+               String[] nullArray = null;
+               assertNull(firstNonNull(nullArray));  // Covers the nn(t) == 
false branch
        }
 
        
//====================================================================================================
        // fs(String, Object...)
        
//====================================================================================================
        @Test
-       void a03_fs() {
+       void a19_fs() {
                // Basic supplier
                var supplier = fs("Hello %s, you have %d items", "John", 5);
                assertNotNull(supplier);
@@ -89,5 +431,555 @@ class Utils_Test extends TestBase {
                var emptySupplier = fs("");
                assertEquals("", emptySupplier.get());
        }
-}
 
+       
//====================================================================================================
+       // hash(Object...)
+       
//====================================================================================================
+       @Test
+       void a20_hash() {
+               var hash1 = hash("Hello", 123, true);
+               var hash2 = hash("Hello", 123, true);
+               assertEquals(hash1, hash2);
+
+               var hash3 = hash("Hello", 123, false);
+               assertNotEquals(hash1, hash3);
+
+               // Test with annotations
+               @TestAnnotation("test")
+               class T {}
+               var a1 = T.class.getAnnotation(TestAnnotation.class);
+               var hash4 = hash(a1, "value");
+               assertNotNull(hash4);
+       }
+
+       
//====================================================================================================
+       // identity(Object)
+       
//====================================================================================================
+       @Test
+       void a21_identity() {
+               var obj = "test";
+               var identity = identity(obj);
+               assertNotNull(identity);
+               assertTrue(identity.contains("String"));
+               assertTrue(identity.contains("@"));
+               assertNull(identity(null));
+               assertNotNull(identity(Optional.of("test")));
+       }
+
+       
//====================================================================================================
+       // isArray(Object)
+       
//====================================================================================================
+       @Test
+       void a22_isArray() {
+               assertTrue(isArray(new int[]{1, 2, 3}));
+               assertTrue(isArray(a("a", "b")));
+               assertTrue(isArray(a()));
+               assertFalse(isArray("Hello"));
+               assertFalse(isArray(null));
+               assertFalse(isArray(123));
+               assertFalse(isArray(new ArrayList<>()));
+       }
+
+       
//====================================================================================================
+       // isBetween(int, int, int)
+       
//====================================================================================================
+       @Test
+       void a23_isBetween() {
+               assertTrue(isBetween(5, 1, 10));
+               assertTrue(isBetween(1, 1, 10));
+               assertTrue(isBetween(10, 1, 10));
+               assertFalse(isBetween(0, 1, 10));
+               assertFalse(isBetween(11, 1, 10));
+       }
+
+       
//====================================================================================================
+       // isEmpty(CharSequence)
+       
//====================================================================================================
+       @Test
+       void a24_isEmpty_CharSequence() {
+               assertTrue(isEmpty((String)null));
+               assertTrue(isEmpty(""));
+               assertFalse(isEmpty("   "));
+               assertFalse(isEmpty("hello"));
+               assertFalse(isEmpty("a"));
+       }
+
+       
//====================================================================================================
+       // isEmpty(Collection<?>)
+       
//====================================================================================================
+       @Test
+       void a25_isEmpty_Collection() {
+               assertTrue(isEmpty((Collection<?>)null));
+               assertTrue(isEmpty(Collections.emptyList()));
+               assertTrue(isEmpty(new ArrayList<>()));
+               assertFalse(isEmpty(Arrays.asList(1, 2, 3)));
+               assertFalse(isEmpty(Collections.singletonList("test")));
+       }
+
+       
//====================================================================================================
+       // isEmpty(Map<?,?>)
+       
//====================================================================================================
+       @Test
+       void a26_isEmpty_Map() {
+               assertTrue(isEmpty((Map<?,?>)null));
+               assertTrue(isEmpty(Collections.emptyMap()));
+               assertTrue(isEmpty(new HashMap<>()));
+               assertFalse(isEmpty(Map.of("key", "value")));
+               assertFalse(isEmpty(Collections.singletonMap("key", "value")));
+       }
+
+       @Test
+       void a27_isEmpty_Object() {
+               assertTrue(isEmpty((Object)null));
+               assertTrue(isEmpty((Object)""));
+               // Test line 835: Collection branch
+               assertTrue(isEmpty((Object)Collections.emptyList()));
+               assertFalse(isEmpty((Object)Arrays.asList(1, 2)));  // 
Non-empty collection
+               // Test line 837: Map branch
+               assertTrue(isEmpty((Object)Collections.emptyMap()));
+               assertFalse(isEmpty((Object)Map.of("key", "value")));  // 
Non-empty map
+               assertTrue(isEmpty(new int[0]));
+               assertTrue(isEmpty(new String[0]));
+               assertFalse(isEmpty((Object)"hello"));
+               assertFalse(isEmpty(a(1, 2)));
+               assertTrue(isEmpty(new Object() {
+                       @Override public String toString() { return ""; }
+               }));
+       }
+
+       
//====================================================================================================
+       // isNotEmpty(CharSequence)
+       
//====================================================================================================
+       @Test
+       void a28_isNotEmpty_CharSequence() {
+               assertFalse(isNotEmpty((String)null));
+               assertFalse(isNotEmpty(""));
+               assertTrue(isNotEmpty("   "));
+               assertTrue(isNotEmpty("hello"));
+               assertTrue(isNotEmpty("a"));
+       }
+
+       
//====================================================================================================
+       // isNotEmpty(Collection<?>)
+       
//====================================================================================================
+       @Test
+       void a29_isNotEmpty_Collection() {
+               assertFalse(isNotEmpty((Collection<?>)null));
+               assertFalse(isNotEmpty(Collections.emptyList()));
+               assertFalse(isNotEmpty(new ArrayList<>()));
+               assertTrue(isNotEmpty(Arrays.asList(1, 2, 3)));
+               assertTrue(isNotEmpty(Collections.singletonList("test")));
+       }
+
+       
//====================================================================================================
+       // isNotEmpty(Map<?,?>)
+       
//====================================================================================================
+       @Test
+       void a30_isNotEmpty_Map() {
+               assertFalse(isNotEmpty((Map<?,?>)null));
+               assertFalse(isNotEmpty(Collections.emptyMap()));
+               assertFalse(isNotEmpty(new HashMap<>()));
+               assertTrue(isNotEmpty(Map.of("key", "value")));
+               assertTrue(isNotEmpty(Collections.singletonMap("key", 
"value")));
+       }
+
+       
//====================================================================================================
+       // isNotEmpty(Object)
+       
//====================================================================================================
+       @Test
+       void a31_isNotEmpty_Object() {
+               assertFalse(isNotEmpty((Object)null));
+               // Test line 940: CharSequence branch
+               assertFalse(isNotEmpty((Object)""));
+               assertTrue(isNotEmpty((Object)"hello"));  // Non-empty 
CharSequence
+               // Test line 942: Collection branch
+               assertFalse(isNotEmpty((Object)Collections.emptyList()));
+               assertTrue(isNotEmpty((Object)Arrays.asList(1, 2)));  // 
Non-empty collection
+               // Test line 944: Map branch
+               assertFalse(isNotEmpty((Object)Collections.emptyMap()));
+               assertTrue(isNotEmpty((Object)Map.of("key", "value")));  // 
Non-empty map
+               assertFalse(isNotEmpty(new int[0]));
+               assertFalse(isNotEmpty(new String[0]));
+               assertTrue(isNotEmpty(a(1, 2)));
+               // Test line 947: fallback case (non-String, non-Collection, 
non-Map, non-Array)
+               assertTrue(isNotEmpty(new Object() {
+                       @Override public String toString() { return "test"; }
+               }));
+               assertFalse(isNotEmpty(new Object() {
+                       @Override public String toString() { return ""; }
+               }));
+       }
+
+       
//====================================================================================================
+       // isNotMinusOne(T)
+       
//====================================================================================================
+       @Test
+       void a32_isNotMinusOne() {
+               assertTrue(isNotMinusOne(5));
+               assertTrue(isNotMinusOne(0));
+               assertTrue(isNotMinusOne(100));
+               assertFalse(isNotMinusOne(-1));
+               assertFalse(isNotMinusOne((Integer)null));
+               assertTrue(isNotMinusOne(5L));
+               assertFalse(isNotMinusOne(-1L));
+       }
+
+       
//====================================================================================================
+       // isNotNull(T)
+       
//====================================================================================================
+       @Test
+       void a33_isNotNull() {
+               assertTrue(isNotNull("Hello"));
+               assertTrue(isNotNull(123));
+               assertTrue(isNotNull(new Object()));
+               assertFalse(isNotNull(null));
+       }
+
+       
//====================================================================================================
+       // isTrue(Boolean)
+       
//====================================================================================================
+       @Test
+       void a34_isTrue() {
+               assertTrue(isTrue(true));
+               assertFalse(isTrue(false));
+               assertFalse(isTrue(null));
+       }
+
+       
//====================================================================================================
+       // lc(String)
+       
//====================================================================================================
+       @Test
+       void a35_lc() {
+               assertEquals("hello", lc("Hello"));
+               assertEquals("hello", lc("HELLO"));
+               assertEquals("hello world", lc("Hello World"));
+               assertNull(lc(null));
+               assertEquals("", lc(""));
+       }
+
+       
//====================================================================================================
+       // memoize(Supplier<T>)
+       
//====================================================================================================
+       @Test
+       void a36_memoize() {
+               var callCount = new AtomicInteger(0);
+               var supplier = memoize(() -> {
+                       callCount.incrementAndGet();
+                       return "result";
+               });
+
+               var result1 = supplier.get();
+               var result2 = supplier.get();
+               var result3 = supplier.get();
+
+               assertEquals("result", result1);
+               assertEquals("result", result2);
+               assertEquals("result", result3);
+               assertEquals(1, callCount.get()); // Should only be called once
+       }
+
+       
//====================================================================================================
+       // memoizeResettable(Supplier<T>)
+       
//====================================================================================================
+       @Test
+       void a37_memoizeResettable() {
+               var callCount = new AtomicInteger(0);
+               var supplier = memoizeResettable(() -> {
+                       callCount.incrementAndGet();
+                       return "result";
+               });
+
+               var result1 = supplier.get();
+               var result2 = supplier.get();
+               assertEquals(1, callCount.get());
+
+               supplier.reset();
+               var result3 = supplier.get();
+               assertEquals(2, callCount.get());
+
+               assertEquals("result", result1);
+               assertEquals("result", result2);
+               assertEquals("result", result3);
+       }
+
+       
//====================================================================================================
+       // n(Class<T>)
+       
//====================================================================================================
+       @Test
+       void a38_n() {
+               assertNull(n(String.class));
+               assertNull(n(Integer.class));
+               assertNull(n(List.class));
+       }
+
+       
//====================================================================================================
+       // ne(T, T)
+       
//====================================================================================================
+       @Test
+       void a39_ne() {
+               assertTrue(ne("Hello", "World"));
+               assertFalse(ne("Hello", "Hello"));
+               assertFalse(ne(null, null));
+               assertTrue(ne("Hello", null));
+               assertTrue(ne(null, "Hello"));
+               assertTrue(ne(123, 456));
+               assertFalse(ne(123, 123));
+       }
+
+       
//====================================================================================================
+       // ne(T, U, BiPredicate<T,U>)
+       
//====================================================================================================
+       @Test
+       void a40_ne_withPredicate() {
+               class Role {
+                       int id;
+                       String name;
+                       Role(int id, String name) { this.id = id; this.name = 
name; }
+               }
+
+               var r1 = new Role(1, "admin");
+               var r2 = new Role(1, "admin");
+               var r3 = new Role(2, "user");
+
+               assertFalse(ne(r1, r2, (x, y) -> x.id == y.id && 
x.name.equals(y.name)));
+               assertTrue(ne(r1, r3, (x, y) -> x.id == y.id && 
x.name.equals(y.name)));
+               assertFalse(ne(null, null, (x, y) -> true));
+               assertTrue(ne(r1, null, (x, y) -> false));
+               assertTrue(ne(null, r2, (x, y) -> false));
+               assertFalse(ne(r1, r1, (x, y) -> true)); // Same reference
+       }
+
+       
//====================================================================================================
+       // neic(String, String)
+       
//====================================================================================================
+       @Test
+       void a41_neic() {
+               assertTrue(neic("Hello", "World"));
+               assertFalse(neic("Hello", "hello"));
+               assertFalse(neic("Hello", "HELLO"));
+               assertFalse(neic(null, null));
+               assertTrue(neic("Hello", null));
+               assertTrue(neic(null, "Hello"));
+       }
+
+       
//====================================================================================================
+       // nn(Object)
+       
//====================================================================================================
+       @Test
+       void a42_nn() {
+               assertTrue(nn("test"));
+               assertTrue(nn(123));
+               assertTrue(nn(new Object()));
+               assertTrue(nn(""));
+               assertTrue(nn(0));
+               assertTrue(nn(false));
+               assertFalse(nn(null));
+       }
+
+       
//====================================================================================================
+       // opt(T)
+       
//====================================================================================================
+       @Test
+       void a43_opt() {
+               var opt1 = opt("Hello");
+               assertTrue(opt1.isPresent());
+               assertEquals("Hello", opt1.get());
+
+               var opt2 = opt(null);
+               assertFalse(opt2.isPresent());
+       }
+
+       
//====================================================================================================
+       // opte()
+       
//====================================================================================================
+       @Test
+       void a44_opte() {
+               var empty = opte();
+               assertFalse(empty.isPresent());
+       }
+
+       
//====================================================================================================
+       // printLines(String[])
+       
//====================================================================================================
+       @Test
+       void a45_printLines() {
+               // This test just verifies the method doesn't throw
+               printLines(a("Line 1", "Line 2", "Line 3"));
+               printLines(a());
+       }
+
+       
//====================================================================================================
+       // r(Object)
+       
//====================================================================================================
+       @Test
+       void a46_r() {
+               assertEquals("hello", r("hello"));
+               assertEquals("123", r(123));
+               assertEquals("[1,2,3]", r(Arrays.asList(1, 2, 3)));
+               assertNull(r(null));
+               var bytes = new byte[]{1, 2};
+               assertEquals("0102", r(bytes));
+       }
+
+       
//====================================================================================================
+       // s(Object)
+       
//====================================================================================================
+       @Test
+       void a47_s() {
+               assertEquals("Hello", s("Hello"));
+               assertEquals("123", s(123));
+               assertEquals("true", s(true));
+               assertNull(s(null));
+       }
+
+       
//====================================================================================================
+       // safe(Snippet)
+       
//====================================================================================================
+       @Test
+       void a48_safe_Snippet() {
+               // Test normal execution - covers line 1371
+               AtomicInteger count = new AtomicInteger(0);
+               safe((Snippet)() -> {
+                       count.incrementAndGet();
+               });
+               assertEquals(1, count.get());
+
+               // Test RuntimeException is rethrown - covers lines 1372-1373
+               var re = assertThrows(RuntimeException.class, () -> 
safe((Snippet)() -> {
+                       throw new RuntimeException("test");
+               }));
+               assertEquals("test", re.getMessage());
+
+               // Test checked exception is wrapped - covers lines 1374-1375
+               var wrapped = assertThrows(RuntimeException.class, () -> 
safe((Snippet)() -> {
+                       throw new Exception("test");
+               }));
+               assertNotNull(wrapped.getCause());
+               assertEquals(Exception.class, wrapped.getCause().getClass());
+               assertEquals("test", wrapped.getCause().getMessage());
+
+               // Test Error is wrapped - covers lines 1374-1375 with Error
+               var wrappedError = assertThrows(RuntimeException.class, () -> 
safe((Snippet)() -> {
+                       throw new Error("test error");
+               }));
+               assertNotNull(wrappedError.getCause());
+               assertEquals(Error.class, wrappedError.getCause().getClass());
+               assertEquals("test error", 
wrappedError.getCause().getMessage());
+       }
+
+       
//====================================================================================================
+       // safe(ThrowingSupplier<T>)
+       
//====================================================================================================
+       @Test
+       void a49_safe_ThrowingSupplier() {
+               // Test normal execution
+               var result = safe(() -> "result");
+               assertEquals("result", result);
+
+               // Test RuntimeException is rethrown
+               assertThrows(RuntimeException.class, () -> safe(() -> {
+                       throw new RuntimeException("test");
+               }));
+
+               // Test checked exception is wrapped
+               assertThrows(RuntimeException.class, () -> safe(() -> {
+                       throw new Exception("test");
+               }));
+       }
+
+       
//====================================================================================================
+       // safeSupplier(ThrowableUtils.SupplierWithThrowable<T>)
+       
//====================================================================================================
+       @Test
+       void a50_safeSupplier() {
+               // Test normal execution
+               var result = safeSupplier(() -> "result");
+               assertEquals("result", result);
+
+               // Test RuntimeException is rethrown
+               assertThrows(RuntimeException.class, () -> safeSupplier(() -> {
+                       throw new RuntimeException("test");
+               }));
+
+               // Test checked exception is wrapped
+               assertThrows(RuntimeException.class, () -> safeSupplier(() -> {
+                       throw new Exception("test");
+               }));
+       }
+
+       
//====================================================================================================
+       // sb(String)
+       
//====================================================================================================
+       @Test
+       void a51_sb() {
+               var sb = sb("Hello");
+               assertNotNull(sb);
+               assertEquals("Hello", sb.toString());
+       }
+
+       
//====================================================================================================
+       // ss(Supplier<?>)
+       
//====================================================================================================
+       @Test
+       void a52_ss() {
+               var stringSupplier = ss(() -> "test");
+               assertEquals("test", stringSupplier.get());
+
+               var intSupplier = ss(() -> 123);
+               assertEquals("123", intSupplier.get());
+       }
+
+       
//====================================================================================================
+       // uc(String)
+       
//====================================================================================================
+       @Test
+       void a53_uc() {
+               assertEquals("HELLO", uc("Hello"));
+               assertEquals("HELLO", uc("hello"));
+               assertEquals("HELLO WORLD", uc("Hello World"));
+               assertNull(uc(null));
+               assertEquals("", uc(""));
+       }
+
+       
//====================================================================================================
+       // unwrap(Object)
+       
//====================================================================================================
+       @Test
+       void a54_unwrap() {
+               // Test with Supplier
+               Supplier<String> supplier = () -> "test";
+               assertEquals("test", unwrap(supplier));
+
+               // Test with Value
+               var value = Value.of("test");
+               assertEquals("test", unwrap(value));
+
+               // Test with Optional
+               var optional = Optional.of("test");
+               assertEquals("test", unwrap(optional));
+
+               // Test nested unwrapping
+               Supplier<Optional<String>> nested = () -> Optional.of("test");
+               assertEquals("test", unwrap(nested));
+
+               // Test regular object
+               assertEquals("test", unwrap("test"));
+               assertEquals(123, unwrap(123));
+       }
+
+       
//====================================================================================================
+       // Utils() constructor
+       
//====================================================================================================
+       @Test
+       void a55_Utils_constructor() {
+               // Test protected constructor - covers line 1500
+               // Create a subclass to access the protected constructor
+               class TestUtils extends Utils {
+                       TestUtils() {
+                               super(); // This calls the protected Utils() 
constructor
+                       }
+               }
+               var testUtils = new TestUtils();
+               assertNotNull(testUtils);
+       }
+}


Reply via email to