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

garydgregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-dbutils.git


The following commit(s) were added to refs/heads/master by this push:
     new 5385191  [DBUTILS-86] Cover non-null result set values across rows 
(#418)
5385191 is described below

commit 5385191dcb3946710fa6435c05492d25976fc4ab
Author: Tiefang Hu <[email protected]>
AuthorDate: Thu Nov 12 09:52:29 2026 +0800

    [DBUTILS-86] Cover non-null result set values across rows (#418)
    
    Exercise the shared fixture, NULL-state transitions, and custom replacements
    without replacing genuine zero, false, or empty-string values.
    
    Assisted-By: DeepSeek
    Assisted-By: Codex
---
 .../wrappers/SqlNullCheckedResultSetTest.java      | 106 +++++++++++++++++++++
 1 file changed, 106 insertions(+)

diff --git 
a/src/test/java/org/apache/commons/dbutils/wrappers/SqlNullCheckedResultSetTest.java
 
b/src/test/java/org/apache/commons/dbutils/wrappers/SqlNullCheckedResultSetTest.java
index c42487f..6eda112 100644
--- 
a/src/test/java/org/apache/commons/dbutils/wrappers/SqlNullCheckedResultSetTest.java
+++ 
b/src/test/java/org/apache/commons/dbutils/wrappers/SqlNullCheckedResultSetTest.java
@@ -40,6 +40,7 @@ import java.sql.Blob;
 import java.sql.Clob;
 import java.sql.Ref;
 import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 import java.sql.Time;
 import java.sql.Timestamp;
@@ -48,6 +49,8 @@ import java.util.Calendar;
 import java.util.Map;
 
 import org.apache.commons.dbutils.BaseTestCase;
+import org.apache.commons.dbutils.MockResultSet;
+import org.apache.commons.dbutils.MockResultSetMetaData;
 import org.apache.commons.dbutils.ProxyFactory;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -252,6 +255,33 @@ class SqlNullCheckedResultSetTest extends BaseTestCase {
         rs = getResultSet();
     }
 
+    /**
+     * Verifies non-null fixture values pass through the wrapper unchanged by 
index and label for both rows.
+     */
+    @Test
+    void testFixtureNonNullValuesByIndexAndLabel() throws SQLException {
+        final ResultSet wrapped = 
SqlNullCheckedResultSet.wrap(createMockResultSet());
+        assertTrue(wrapped.next());
+        assertEquals("1", wrapped.getString(1));
+        assertEquals("1", wrapped.getString("one"));
+        assertEquals("THREE", wrapped.getString(3));
+        assertEquals("THREE", wrapped.getString("three"));
+        assertEquals(1, wrapped.getInt(5));
+        assertEquals(1, wrapped.getInt("intTest"));
+        assertEquals(2, wrapped.getInt("integerTest"));
+        assertFalse(wrapped.wasNull());
+        assertTrue(wrapped.next());
+        assertEquals("4", wrapped.getString(1));
+        assertEquals("4", wrapped.getString("one"));
+        assertEquals("SIX", wrapped.getString(3));
+        assertEquals("SIX", wrapped.getString("three"));
+        assertEquals(3, wrapped.getInt(5));
+        assertEquals(3, wrapped.getInt("intTest"));
+        assertEquals(4, wrapped.getInt("integerTest"));
+        assertFalse(wrapped.wasNull());
+        assertFalse(wrapped.next());
+    }
+
     /**
      * Tests the getAsciiStream implementation.
      */
@@ -660,6 +690,56 @@ class SqlNullCheckedResultSetTest extends BaseTestCase {
         assertEquals(ts, rs.getTimestamp("column", Calendar.getInstance()));
     }
 
+    /**
+     * Verifies configured replacements preserve non-null values across row 
transitions.
+     */
+    @Test
+    void testNullReplacementsDoNotOverrideGenuineValues() throws SQLException {
+        final ResultSetMetaData metaData = MockResultSetMetaData.create(new 
String[] { "zero", "falseValue", "emptyString", "nullInt", "nullString" });
+        final Object[][] rows = {
+            { Integer.valueOf(0), Boolean.FALSE, "", null, null },
+            { null, null, null, null, null },
+            { Integer.valueOf(5), Boolean.TRUE, "y", Integer.valueOf(3), 
"real" }
+        };
+        final SqlNullCheckedResultSet handler = new 
SqlNullCheckedResultSet(MockResultSet.create(metaData, rows, false));
+        handler.setNullInt(99);
+        handler.setNullBoolean(true);
+        handler.setNullString("REPLACED");
+        final ResultSet wrapped = 
ProxyFactory.instance().createResultSet(handler);
+        assertTrue(wrapped.next());
+        assertEquals(0, wrapped.getInt(1));
+        assertEquals(0, wrapped.getInt("zero"));
+        assertFalse(wrapped.getBoolean(2));
+        assertFalse(wrapped.getBoolean("falseValue"));
+        assertEquals("", wrapped.getString(3));
+        assertEquals("", wrapped.getString("emptyString"));
+        assertEquals(99, wrapped.getInt(4));
+        assertTrue(wrapped.wasNull());
+        assertEquals("REPLACED", wrapped.getString(5));
+        assertTrue(wrapped.wasNull());
+        assertTrue(wrapped.next());
+        assertTrue(wrapped.getBoolean(2));
+        assertTrue(wrapped.wasNull());
+        assertEquals("REPLACED", wrapped.getString(3));
+        assertTrue(wrapped.wasNull());
+        assertEquals(99, wrapped.getInt(4));
+        assertTrue(wrapped.wasNull());
+        assertEquals("REPLACED", wrapped.getString(5));
+        assertTrue(wrapped.wasNull());
+        assertTrue(wrapped.next());
+        assertEquals(5, wrapped.getInt("zero"));
+        assertFalse(wrapped.wasNull());
+        assertTrue(wrapped.getBoolean("falseValue"));
+        assertFalse(wrapped.wasNull());
+        assertEquals("y", wrapped.getString("emptyString"));
+        assertFalse(wrapped.wasNull());
+        assertEquals(3, wrapped.getInt("nullInt"));
+        assertFalse(wrapped.wasNull());
+        assertEquals("real", wrapped.getString("nullString"));
+        assertFalse(wrapped.wasNull());
+        assertFalse(wrapped.next());
+    }
+
     /**
      * Tests the setNullAsciiStream implementation.
      */
@@ -1026,6 +1106,32 @@ class SqlNullCheckedResultSetTest extends BaseTestCase {
         assertEquals(u, rs.getURL("column"));
     }
 
+    /**
+     * Verifies wasNull flips true for a null column then false for a non-null 
column in both fixture rows.
+     */
+    @Test
+    void testWasNullTransitionsBetweenNullAndNonNull() throws SQLException {
+        final ResultSet wrapped = 
SqlNullCheckedResultSet.wrap(createMockResultSet());
+        assertTrue(wrapped.next());
+        assertNull(wrapped.getObject(7));
+        assertTrue(wrapped.wasNull());
+        assertEquals("1", wrapped.getString("one"));
+        assertFalse(wrapped.wasNull());
+        assertNull(wrapped.getString("nullObjectTest"));
+        assertTrue(wrapped.wasNull());
+        assertEquals(1, wrapped.getInt("intTest"));
+        assertFalse(wrapped.wasNull());
+        assertTrue(wrapped.next());
+        assertNull(wrapped.getObject(7));
+        assertTrue(wrapped.wasNull());
+        assertEquals("4", wrapped.getString("one"));
+        assertFalse(wrapped.wasNull());
+        assertNull(wrapped.getString("nullObjectTest"));
+        assertTrue(wrapped.wasNull());
+        assertEquals(3, wrapped.getInt("intTest"));
+        assertFalse(wrapped.wasNull());
+    }
+
     @Test
     void testWrapResultSet() throws SQLException {
         final ResultSet wrappedRs = mock(ResultSet.class);

Reply via email to