diff --git a/stella-core/src/main/java/br/com/caelum/stella/DigitoPara.java b/stella-core/src/main/java/br/com/caelum/stella/DigitoPara.java index e66914c6..9f3c8314 100644 --- a/stella-core/src/main/java/br/com/caelum/stella/DigitoPara.java +++ b/stella-core/src/main/java/br/com/caelum/stella/DigitoPara.java @@ -35,6 +35,7 @@ */ public class DigitoPara { + private static final int ZERO_ASCII = 48; private LinkedList numero; private List multiplicadores = new ArrayList(); private boolean complementar; @@ -56,7 +57,7 @@ public DigitoPara(String trecho) { this.numero = new LinkedList(); char[] digitos = trecho.toCharArray(); for (char digito : digitos) { - this.numero.add(Character.getNumericValue(digito)); + this.numero.add(((int) digito) - ZERO_ASCII); } Collections.reverse(numero); } diff --git a/stella-core/src/main/java/br/com/caelum/stella/validation/CNPJValidator.java b/stella-core/src/main/java/br/com/caelum/stella/validation/CNPJValidator.java index fc6429b3..0fa3728b 100644 --- a/stella-core/src/main/java/br/com/caelum/stella/validation/CNPJValidator.java +++ b/stella-core/src/main/java/br/com/caelum/stella/validation/CNPJValidator.java @@ -19,8 +19,10 @@ */ public class CNPJValidator implements Validator { - public static final Pattern FORMATED = Pattern.compile("(\\d{2})[.](\\d{3})[.](\\d{3})/(\\d{4})-(\\d{2})"); - public static final Pattern UNFORMATED = Pattern.compile("(\\d{2})(\\d{3})(\\d{3})(\\d{4})(\\d{2})"); + public static final Pattern FORMATED = Pattern.compile( + "([0-9A-Z]{2})[.]([0-9A-Z]{3})[.]([0-9A-Z]{3})/([0-9A-Z]{4})-([0-9A-Z]{2})"); + public static final Pattern UNFORMATED = Pattern.compile( + "([0-9A-Z]{2})([0-9A-Z]{3})([0-9A-Z]{3})([0-9A-Z]{4})([0-9A-Z]{2})"); private boolean isFormatted = false; private boolean isIgnoringRepeatedDigits; @@ -97,8 +99,8 @@ private List getInvalidValues(String cnpj) { errors.add(messageProducer.getMessage(CNPJError.INVALID_DIGITS)); return errors; } - - if(unformatedCNPJ.length() != 14 || !unformatedCNPJ.matches("[0-9]*")){ + + if (unformatedCNPJ.length() != 14 || !unformatedCNPJ.matches("[0-9A-Z]*")) { errors.add(messageProducer.getMessage(CNPJError.INVALID_DIGITS)); } diff --git a/stella-core/src/test/java/br/com/caelum/stella/validation/CNPJValidatorTest.java b/stella-core/src/test/java/br/com/caelum/stella/validation/CNPJValidatorTest.java index c2b28dd6..7070b0d2 100644 --- a/stella-core/src/test/java/br/com/caelum/stella/validation/CNPJValidatorTest.java +++ b/stella-core/src/test/java/br/com/caelum/stella/validation/CNPJValidatorTest.java @@ -21,7 +21,11 @@ public class CNPJValidatorTest { private final String validString = "26.637.142/0001-58"; private final String validStringNotFormatted = "26637142000158"; + private final String validStringAlpha = "12.ABC.345/01DE-35"; + private final String validStringAlphaNotFormatted = "12ABC34501DE35"; + private final String firstCheckDigitWrongNotFormatted = "26637142000168"; + private final String alphaFirstCheckDigitWrongNotFormatted = "12ABC34501DE45"; @Test public void shouldHaveDefaultConstructorThatUsesSimpleMessageProducerAndAssumesThatStringIsNotFormatted() { @@ -34,6 +38,14 @@ public void shouldHaveDefaultConstructorThatUsesSimpleMessageProducerAndAssumesT InvalidStateException invalidStateException = (InvalidStateException) e; assertMessage(invalidStateException, INVALID_CHECK_DIGITS); } + + try { + new CNPJValidator().assertValid(alphaFirstCheckDigitWrongNotFormatted); + fail("Test expected to throw exception"); + } catch (InvalidStateException e) { + InvalidStateException invalidStateException = (InvalidStateException) e; + assertMessage(invalidStateException, INVALID_CHECK_DIGITS); + } } private void assertMessage(InvalidStateException invalidStateException, String expected) { @@ -87,6 +99,7 @@ public void shouldValidateValidCNPJ() { validator.assertValid("63025530002409"); validator.assertValid("61519128000150"); validator.assertValid("68745386000102"); + validator.assertValid("12ABC34501DE35"); } @Test @@ -186,6 +199,9 @@ public void shouldBeEligibleDefaultConstructor() { final CNPJValidator cnpjValidator = new CNPJValidator(); assertTrue(cnpjValidator.isEligible(validStringNotFormatted)); assertFalse(cnpjValidator.isEligible(validString)); + + assertTrue(cnpjValidator.isEligible(validStringAlphaNotFormatted)); + assertFalse(cnpjValidator.isEligible(validStringAlpha)); } @Test @@ -193,6 +209,9 @@ public void shouldBeEligibleConstructorNotFormatted() { final CNPJValidator cnpjValidator = new CNPJValidator(false); assertTrue(cnpjValidator.isEligible(validStringNotFormatted)); assertFalse(cnpjValidator.isEligible(validString)); + + assertTrue(cnpjValidator.isEligible(validStringAlphaNotFormatted)); + assertFalse(cnpjValidator.isEligible(validStringAlpha)); } @Test @@ -200,6 +219,9 @@ public void shouldBeEligibleConstructorFormatted() { final CNPJValidator cnpjValidator = new CNPJValidator(true); assertFalse(cnpjValidator.isEligible(validStringNotFormatted)); assertTrue(cnpjValidator.isEligible(validString)); + + assertFalse(cnpjValidator.isEligible(validStringAlphaNotFormatted)); + assertTrue(cnpjValidator.isEligible(validStringAlpha)); } @Test