-
Notifications
You must be signed in to change notification settings - Fork 15
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(documento): Titulo eleitor validation
* Implemented TituloEleitorValidator * Improvements in get digits and compare digits. Co-authored-by: Alex Oliveira <[email protected]>
- Loading branch information
1 parent
33eb3a0
commit edca543
Showing
4 changed files
with
184 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
using NetDevPack.Utilities; | ||
using NetDevPack.Brasil.Documentos.Validacao; | ||
using NetDevPack.Domain; | ||
|
||
namespace NetDevPack.Brasil.Documentos | ||
{ | ||
public class TituloEleitor | ||
{ | ||
public string Numero { get; } | ||
|
||
public TituloEleitor(string numero) | ||
{ | ||
Numero = numero.OnlyNumbers(); | ||
if (!EstaValido()) throw new DomainException("TituloEleitor Invalido"); | ||
} | ||
|
||
public bool EstaValido() => new TituloEleitorValidator(Numero).EstaValido(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
76 changes: 76 additions & 0 deletions
76
src/NetDevPack.Brasil/Documentos/Validacao/TituloEleitorValidator.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
using NetDevPack.Utilities; | ||
using System.Collections.Generic; | ||
|
||
namespace NetDevPack.Brasil.Documentos.Validacao | ||
{ | ||
public class TituloEleitorValidator | ||
{ | ||
private const int TamanhoTituloEleitor = 12; | ||
private readonly string _tituloEleitorTratado; | ||
private static readonly HashSet<string> _titulosEleitorInvalidos = new HashSet<string> | ||
{ | ||
"000000000000", | ||
"111111111111", | ||
"222222222222", | ||
"333333333333", | ||
"444444444444", | ||
"555555555555", | ||
"666666666666", | ||
"777777777777", | ||
"888888888888", | ||
"999999999999" | ||
}; | ||
|
||
public TituloEleitorValidator(string numero) => _tituloEleitorTratado = numero.OnlyNumbers(); | ||
|
||
public bool EstaValido() | ||
{ | ||
if (!PossuiTamanhoValido()) return false; | ||
if (PossuiDigitosRepetidos()) return false; | ||
return PossuiDigitosValidos(); | ||
} | ||
|
||
private bool PossuiTamanhoValido() => _tituloEleitorTratado.Length == TamanhoTituloEleitor; | ||
|
||
private bool PossuiDigitosRepetidos() => _titulosEleitorInvalidos.Contains(_tituloEleitorTratado); | ||
|
||
private bool PossuiDigitosValidos() | ||
{ | ||
var primeiroDigito = ObtemPrimeiroDigito(); | ||
var segundoDigito = ObtemSegundoDigito(primeiroDigito); | ||
|
||
return DigitosCalculadosSaoIguaisAosDigitosInformados(primeiroDigito, segundoDigito); | ||
} | ||
|
||
private string ObtemPrimeiroDigito() | ||
{ | ||
var primeiraParte = _tituloEleitorTratado.Substring(0, TamanhoTituloEleitor - 4); | ||
|
||
return new DigitoVerificador(primeiraParte) | ||
.Modulo(11) | ||
.SemComplementarDoModulo() | ||
.InvertendoNumero() | ||
.HabilitaLimiteModulo(10) | ||
.CalculaDigito(); | ||
} | ||
|
||
private string ObtemSegundoDigito(string primeiroDigito) | ||
{ | ||
var segundaParte = string.Concat(_tituloEleitorTratado.Substring(8, 2), primeiroDigito); | ||
|
||
return new DigitoVerificador(segundaParte) | ||
.Modulo(11) | ||
.SemComplementarDoModulo() | ||
.InvertendoNumero() | ||
.HabilitaLimiteModulo(10) | ||
.ComMultiplicadoresDeAte(7, 9) | ||
.CalculaDigito(); | ||
} | ||
|
||
|
||
private bool DigitosCalculadosSaoIguaisAosDigitosInformados(string primeiroDigito, string segundoDigito) | ||
{ | ||
return string.Concat(primeiroDigito, segundoDigito) == _tituloEleitorTratado.Substring(TamanhoTituloEleitor - 2, 2); | ||
} | ||
} | ||
} |
62 changes: 62 additions & 0 deletions
62
tests/NetDevPack.Brasil.Tests/Documentos/TituloEleitorValidadorTest.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
using FluentAssertions; | ||
using NetDevPack.Brasil.Documentos; | ||
using NetDevPack.Brasil.Documentos.Validacao; | ||
using NetDevPack.Domain; | ||
using System; | ||
using Xunit; | ||
|
||
namespace NetDevPack.Brasil.Tests | ||
{ | ||
public class TituloEleitorValidadorTest | ||
{ | ||
[Theory(DisplayName = "TituloEleitor ReturnDomainException")] | ||
[InlineData("000000000000")] | ||
[InlineData("1111 1111 1111")] | ||
[InlineData("2222 2222 2222")] | ||
[InlineData("3333 3333 3333")] | ||
[InlineData("4444 4444 4444")] | ||
[InlineData("5555 5555 5555")] | ||
[InlineData("6666 6666 6666")] | ||
[InlineData("7777 7777 7777")] | ||
[InlineData("8888 8888 8888")] | ||
[InlineData("9999 9999 9999")] | ||
[InlineData("456123456789")] | ||
[InlineData("456123456789022")] | ||
[InlineData("258365200125")] | ||
[InlineData("002365896322")] | ||
[InlineData("147258369789")] | ||
[Trait("Category", "TituloEleitor Tests")] | ||
public void TituloEleitor_PossuiDigitosRepetidos_ShouldReturnDomainException(string value) | ||
{ | ||
// Arrange & Act | ||
Action act = () => new TituloEleitor(value); | ||
|
||
// Assert | ||
act.Should().ThrowExactly<DomainException>().WithMessage("TituloEleitor Invalido"); | ||
} | ||
|
||
[Theory(DisplayName = "TituloEleitor ReturnTrue")] | ||
[InlineData("007378060183")] | ||
[InlineData("304083450132")] | ||
[InlineData("223644070124")] | ||
[InlineData("8018 6038 0159")] | ||
[InlineData("7542 4177 0175")] | ||
[InlineData("8720 0766 0191")] | ||
[InlineData("6311 6330 1414")] | ||
[InlineData("874726180620")] | ||
[InlineData("067106681546")] | ||
[InlineData("313246081040")] | ||
[Trait("Category", "TituloEleitor Tests")] | ||
public void TituloEleitor_NewTituloEleitor_ShouldReturnTrue(string value) | ||
{ | ||
// Arrange | ||
var tituloEleitor = new TituloEleitor(value); | ||
|
||
// Act | ||
var result = new TituloEleitorValidator(tituloEleitor.Numero).EstaValido(); | ||
|
||
// Assert | ||
result.Should().BeTrue(); | ||
} | ||
} | ||
} |