From f2b9e2520a587ae121edf4b8596bb456da53a030 Mon Sep 17 00:00:00 2001 From: sahvx655-wq Date: Sun, 14 Jun 2026 21:53:34 +0530 Subject: [PATCH] compare CAS and EC check digit against validated code, not raw input REGEX_VALIDATOR trims and reformats the input, so the check digit should be read from the validated string rather than the raw argument; otherwise a trailing space rejects an otherwise valid code while a leading space is accepted. --- .../routines/checkdigit/CASNumberCheckDigit.java | 5 +++-- .../routines/checkdigit/ECNumberCheckDigit.java | 5 +++-- .../routines/checkdigit/CASNumberCheckDigitTest.java | 12 ++++++++++++ .../routines/checkdigit/ECNumberCheckDigitTest.java | 12 ++++++++++++ 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/commons/validator/routines/checkdigit/CASNumberCheckDigit.java b/src/main/java/org/apache/commons/validator/routines/checkdigit/CASNumberCheckDigit.java index 4139ab890..db740f94c 100644 --- a/src/main/java/org/apache/commons/validator/routines/checkdigit/CASNumberCheckDigit.java +++ b/src/main/java/org/apache/commons/validator/routines/checkdigit/CASNumberCheckDigit.java @@ -110,9 +110,10 @@ public boolean isValid(final String code) { if (!(cde instanceof String)) { return false; } + final String validated = (String) cde; try { - final int modulusResult = INSTANCE.calculateModulus((String) cde, true); - return modulusResult == Character.getNumericValue(code.charAt(code.length() - 1)); + final int modulusResult = INSTANCE.calculateModulus(validated, true); + return modulusResult == Character.getNumericValue(validated.charAt(validated.length() - 1)); } catch (final CheckDigitException ex) { return false; } diff --git a/src/main/java/org/apache/commons/validator/routines/checkdigit/ECNumberCheckDigit.java b/src/main/java/org/apache/commons/validator/routines/checkdigit/ECNumberCheckDigit.java index 50f6d11a3..7b73d2fdc 100644 --- a/src/main/java/org/apache/commons/validator/routines/checkdigit/ECNumberCheckDigit.java +++ b/src/main/java/org/apache/commons/validator/routines/checkdigit/ECNumberCheckDigit.java @@ -98,9 +98,10 @@ public boolean isValid(final String code) { if (!(cde instanceof String)) { return false; } + final String validated = (String) cde; try { - final int modulusResult = INSTANCE.calculateModulus((String) cde, true); - return modulusResult == Character.getNumericValue(code.charAt(code.length() - 1)); + final int modulusResult = INSTANCE.calculateModulus(validated, true); + return modulusResult == Character.getNumericValue(validated.charAt(validated.length() - 1)); } catch (final CheckDigitException ex) { return false; } diff --git a/src/test/java/org/apache/commons/validator/routines/checkdigit/CASNumberCheckDigitTest.java b/src/test/java/org/apache/commons/validator/routines/checkdigit/CASNumberCheckDigitTest.java index f36e77685..940a154d5 100644 --- a/src/test/java/org/apache/commons/validator/routines/checkdigit/CASNumberCheckDigitTest.java +++ b/src/test/java/org/apache/commons/validator/routines/checkdigit/CASNumberCheckDigitTest.java @@ -16,7 +16,10 @@ */ package org.apache.commons.validator.routines.checkdigit; +import static org.junit.jupiter.api.Assertions.assertTrue; + import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; /** * CAS Number Check Digit Tests. @@ -55,4 +58,13 @@ protected void setUp() { valid = new String[] {MIN, WATER, ETHANOL, ASPIRIN, COFFEIN, FORMALDEHYDE, DEXAMETHASONE, ARSENIC, ASBESTOS, MAX}; } + /** + * The format validator trims the input, so surrounding whitespace must not change the result. + */ + @Test + void testIsValidSurroundingWhitespace() { + assertTrue(routine.isValid(" " + WATER), "leading whitespace"); + assertTrue(routine.isValid(WATER + " "), "trailing whitespace"); + } + } diff --git a/src/test/java/org/apache/commons/validator/routines/checkdigit/ECNumberCheckDigitTest.java b/src/test/java/org/apache/commons/validator/routines/checkdigit/ECNumberCheckDigitTest.java index 89a8a4ee7..7d3ba8654 100644 --- a/src/test/java/org/apache/commons/validator/routines/checkdigit/ECNumberCheckDigitTest.java +++ b/src/test/java/org/apache/commons/validator/routines/checkdigit/ECNumberCheckDigitTest.java @@ -16,7 +16,10 @@ */ package org.apache.commons.validator.routines.checkdigit; +import static org.junit.jupiter.api.Assertions.assertTrue; + import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; /** * EC Number Check Digit Tests. @@ -51,4 +54,13 @@ protected void setUp() { valid = new String[] {MIN, FORMALDEHYDE, DEXAMETHASONE, ARSENIC, ASBESTOS, MAX}; } + /** + * The format validator trims the input, so surrounding whitespace must not change the result. + */ + @Test + void testIsValidSurroundingWhitespace() { + assertTrue(routine.isValid(" " + DEXAMETHASONE), "leading whitespace"); + assertTrue(routine.isValid(DEXAMETHASONE + " "), "trailing whitespace"); + } + }