package br.com.caelum.stella.validation;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.List;
import org.junit.Test;
import br.com.caelum.stella.ValidationMessage;
public class RenavamValidationTest {
private final String validUnformattedRenavam1 = "00639884962";
private final String validUnformattedRenavam2 = "00811443620";
private final String validFormattedRenavam1 = "0073.640767-7";
private final String validFormattedRenavam2 = "0096.525195-0";
private final String renavamUnformattedWithInvalidCheckDigit = "00639884969";
private final String renavamFormattedWithInvalidCheckDigit = "0096.525195-2";
private final String renavamWithLessThenElevenDigits = "9999999999";
private final String renavamWithMoreThenElevenDigits = "999999999999";
private final String renavamWithNineDigits = "639884962";
@Test
public void shouldValidateValidUnformatedRenavam() {
RenavamValidator validator = new RenavamValidator();
validator.assertValid(validUnformattedRenavam1);
validator.assertValid(validUnformattedRenavam2);
List<ValidationMessage> errorMessages = validator.invalidMessagesFor(validUnformattedRenavam1);
assertTrue(errorMessages.isEmpty());
}
@Test
public void shouldValidateFormattedValidRenavam() {
RenavamValidator validator = new RenavamValidator(true);
validator.assertValid(validFormattedRenavam1);
validator.assertValid(validFormattedRenavam2);
List<ValidationMessage> errorMessages = validator.invalidMessagesFor(validFormattedRenavam1);
assertTrue(errorMessages.isEmpty());
}
@Test
public void shouldConsiderAValidFormattedRenavamAsEligible() {
RenavamValidator validator = new RenavamValidator(true);
assertTrue(validator.isEligible(validFormattedRenavam1));
assertTrue(validator.isEligible(validFormattedRenavam2));
assertTrue(validator.isEligible(renavamFormattedWithInvalidCheckDigit));
}
@Test
public void shouldConsiderAValidUnformattedRenavamAsEligible() {
RenavamValidator validator = new RenavamValidator();
assertTrue("Renamvam " + validUnformattedRenavam1 + " must be eligible.", validator
.isEligible(validUnformattedRenavam1));
assertTrue(validator.isEligible(validUnformattedRenavam2));
assertTrue(validator.isEligible(renavamUnformattedWithInvalidCheckDigit));
}
@Test(expected = InvalidStateException.class)
public void shouldNotValidadeUnformattedRenavamWithInvalidCheckDigit() {
RenavamValidator validator = new RenavamValidator();
validator.assertValid(renavamUnformattedWithInvalidCheckDigit);
}
@Test(expected = InvalidStateException.class)
public void shouldNotValidadeFormattedRenavamWithInvalidCheckDigit() {
RenavamValidator validator = new RenavamValidator(true);
validator.assertValid(renavamFormattedWithInvalidCheckDigit);
}
@Test
public void onlyRenavamWithNineOrElevenDigitsAreEligible() {
RenavamValidator validator = new RenavamValidator();
assertTrue(validator.isEligible(renavamWithNineDigits));
assertTrue(validator.isEligible(renavamWithLessThenElevenDigits));
assertFalse(validator.isEligible(renavamWithMoreThenElevenDigits));
}
@Test(expected = InvalidStateException.class)
public void shouldNotValidateARenavamWithLessThenElevenDigits() {
RenavamValidator validator = new RenavamValidator();
validator.assertValid(renavamWithLessThenElevenDigits);
}
@Test(expected = InvalidStateException.class)
public void shouldNotValidateARenavamWithMoreThenElevenDigits() {
RenavamValidator validator = new RenavamValidator();
validator.assertValid(renavamWithMoreThenElevenDigits);
}
@Test
public void renavamMustHaveOnlyNumbers() {
RenavamValidator validator = new RenavamValidator();
assertFalse(validator.isEligible("99999999x"));
assertFalse(validator.isEligible("9999999 9"));
}
@Test
public void shouldGenerateExplanatoryErrorMessagesForUnformattedRenavam() {
RenavamValidator validator = new RenavamValidator();
List<ValidationMessage> invalidMessagesFor = null;
invalidMessagesFor = validator.invalidMessagesFor("999");
assertTrue(invalidMessagesFor.size() == 1);
assertEquals("RenavamError : INVALID DIGITS", invalidMessagesFor.get(0).getMessage());
invalidMessagesFor = validator.invalidMessagesFor(renavamUnformattedWithInvalidCheckDigit);
assertTrue(invalidMessagesFor.size() == 1);
assertEquals("RenavamError : INVALID CHECK DIGIT", invalidMessagesFor.get(0).getMessage());
}
@Test
public void shouldGenerateExplanatoryErrorMessagesForFormattedRenavam() {
RenavamValidator validator = new RenavamValidator(true);
List<ValidationMessage> invalidMessagesFor = null;
invalidMessagesFor = validator.invalidMessagesFor("999");
assertTrue(invalidMessagesFor.size() == 2);
assertEquals("RenavamError : INVALID FORMAT", invalidMessagesFor.get(0).getMessage());
assertEquals("RenavamError : INVALID DIGITS", invalidMessagesFor.get(1).getMessage());
invalidMessagesFor = validator.invalidMessagesFor(renavamFormattedWithInvalidCheckDigit);
assertTrue(invalidMessagesFor.size() == 1);
assertEquals("RenavamError : INVALID CHECK DIGIT", invalidMessagesFor.get(0).getMessage());
}
@Test
public void shouldUseAnSimpleMessageProducerAsDefault() {
RenavamValidator validator = new RenavamValidator();
try {
validator.assertValid(renavamFormattedWithInvalidCheckDigit);
fail();
} catch (InvalidStateException e) {
List<ValidationMessage> errors = e.getInvalidMessages();
assertTrue(errors.size() == 1);
assertEquals("RenavamError : INVALID CHECK DIGIT", errors.get(0).getMessage());
}
}
@Test
public void shouldValidateValidRenavamWithNineDigits() {
RenavamValidator validator = new RenavamValidator();
validator.assertValid(renavamWithNineDigits);
List<ValidationMessage> errorMessages = validator.invalidMessagesFor(renavamWithNineDigits);
assertTrue(errorMessages.isEmpty());
}
@Test
public void shouldGenerateValidFormattedRenavam() {
final RenavamValidator renavamValidator = new RenavamValidator(true);
final String generated = renavamValidator.generateRandomValid();
renavamValidator.assertValid(generated);
}
@Test
public void shouldGenerateValidUnformattedRenavam() {
final RenavamValidator renavamValidator = new RenavamValidator();
final String generated = renavamValidator.generateRandomValid();
renavamValidator.assertValid(generated);
}
}