From 961e2fb9079125be202b96619e804ed8756c2e55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Gon=C3=A7alves?= Date: Sun, 7 May 2023 00:23:03 -0300 Subject: [PATCH 1/5] =?UTF-8?q?docs:=20remo=C3=A7=C3=A3o=20da=20infos=20de?= =?UTF-8?q?=20telefone.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit O tipo telefone deixará de existir. A lib conterá apenas CPF e CNPJ. --- README.md | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/README.md b/README.md index d6d22e3..7e5d6b9 100644 --- a/README.md +++ b/README.md @@ -29,11 +29,6 @@ Cnpj cnpj = "02.055.097/0001-65"; Console.WriteLine(cnpj.EValido); // true ``` - -## Tipos já implementados - * CPF - * CNPJ - * Telefone ## Benchmark ``` bash @@ -65,17 +60,6 @@ AMD Ryzen 5 3400G with Radeon Vega Graphics, 1 CPU, 8 logical and 4 physical cor | CnpjMenorDoQue14Digitos | 265.31 ns | 5.343 ns | 7.132 ns | 5 | 0.0763 | - | - | 160 B | | CnpjValorNaoNumerico | 436.29 ns | 6.250 ns | 5.846 ns | 6 | 0.1526 | - | - | 320 B | -| Method | Mean | Error | StdDev | Rank | Gen 0 | Gen 1 | Gen 2 | Allocated | -|------------------------------------ |----------:|---------:|----------:|-----:|------:|------:|------:|----------:| -| NaoEhUmTelefoneValido | 20.48 ns | 0.413 ns | 0.386 ns | 1 | - | - | - | - | -| ObterTelefoneServicoPublicoValido | 33.18 ns | 0.687 ns | 0.609 ns | 2 | - | - | - | - | -| ObterTelefoneServicoPublicoInvalido | 48.77 ns | 0.717 ns | 0.636 ns | 3 | - | - | - | - | -| ObterTelefoneDDDInvalido | 82.00 ns | 1.186 ns | 1.109 ns | 4 | - | - | - | - | -| ObterTelefoneSemDDI | 96.33 ns | 1.874 ns | 1.661 ns | 5 | - | - | - | - | -| ObterTelefoneSemNonoDigito | 121.86 ns | 2.479 ns | 3.710 ns | 6 | - | - | - | - | -| ObterTelefoneCompleto | 137.91 ns | 3.916 ns | 11.361 ns | 7 | - | - | - | - | - - // * Legends * Mean : Arithmetic mean of all measurements Error : Half of 99.9% confidence interval From 0a9529d4fd7a5f29162a92788dbab6d384b5606d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Gon=C3=A7alves?= Date: Thu, 14 Nov 2024 19:35:42 -0300 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20remover=20classes=20que=20n=C3=A3o?= =?UTF-8?q?=20sejam=20CPF=20ou=20CNPJ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- benchmark/Jabuticaba.Benchmark/Program.cs | 2 - .../Jabuticaba.Benchmark/TelefoneBenchmark.cs | 34 ---- .../TelefoneBenchmarkDiagnoser.cs | 54 ------- .../Telefones/ServicosPublicosEmergencia.cs | 23 --- src/Jabuticaba/Telefones/Telefone.cs | 148 ------------------ test/JabuticabaTests/TelefoneTeste.cs | 108 ------------- 6 files changed, 369 deletions(-) delete mode 100644 benchmark/Jabuticaba.Benchmark/TelefoneBenchmark.cs delete mode 100644 benchmark/Jabuticaba.Benchmark/TelefoneBenchmarkDiagnoser.cs delete mode 100644 src/Jabuticaba/Telefones/ServicosPublicosEmergencia.cs delete mode 100644 src/Jabuticaba/Telefones/Telefone.cs delete mode 100644 test/JabuticabaTests/TelefoneTeste.cs diff --git a/benchmark/Jabuticaba.Benchmark/Program.cs b/benchmark/Jabuticaba.Benchmark/Program.cs index 4d2050a..735ad6a 100644 --- a/benchmark/Jabuticaba.Benchmark/Program.cs +++ b/benchmark/Jabuticaba.Benchmark/Program.cs @@ -18,8 +18,6 @@ static void Main(string[] args) { new CnpjBenchmark(), new CpfBenchmark(), - new CepBenchmark(), - new TelefoneBenchmark() }; benchmarks.ForEach( diff --git a/benchmark/Jabuticaba.Benchmark/TelefoneBenchmark.cs b/benchmark/Jabuticaba.Benchmark/TelefoneBenchmark.cs deleted file mode 100644 index 6bd9f04..0000000 --- a/benchmark/Jabuticaba.Benchmark/TelefoneBenchmark.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Diagnostics; -using Jabuticaba.Telefones; - -namespace Jabuticaba.Benchmark -{ - public class TelefoneBenchmark : IBenchmarkLocal - { - public void Executar(ulong numeroTentativas) - { - var stopWatch = new Stopwatch(); - var gcAntesGeracao2 = GC.CollectionCount(2); - var gcAntesGeracao1 = GC.CollectionCount(1); - var gcAntesGeracao0 = GC.CollectionCount(0); - - stopWatch.Start(); - for (ulong i = 0; i < numeroTentativas; i++) - { - - Telefone telefone = "+55 (31) 9 7500-0001"; - } - stopWatch.Stop(); - - Console.WriteLine($"{nameof(Telefone)}:"); - Console.WriteLine($"Quantidade de telefones {numeroTentativas}"); - Console.WriteLine($"Tempo execução: {stopWatch.ElapsedMilliseconds}ms"); - Console.WriteLine($"GC geração 2 - {GC.CollectionCount(2) - gcAntesGeracao2}"); - Console.WriteLine($"GC geração 1 - {GC.CollectionCount(1) - gcAntesGeracao1}"); - Console.WriteLine($"GC geração 0 - {GC.CollectionCount(0) - gcAntesGeracao0}"); - Console.WriteLine(DateTime.Now); - Console.WriteLine(); - } - } -} diff --git a/benchmark/Jabuticaba.Benchmark/TelefoneBenchmarkDiagnoser.cs b/benchmark/Jabuticaba.Benchmark/TelefoneBenchmarkDiagnoser.cs deleted file mode 100644 index 684dd3f..0000000 --- a/benchmark/Jabuticaba.Benchmark/TelefoneBenchmarkDiagnoser.cs +++ /dev/null @@ -1,54 +0,0 @@ -using BenchmarkDotNet.Attributes; -using BenchmarkDotNet.Order; -using Jabuticaba.Telefones; - -namespace Jabuticaba.Benchmark -{ - [RankColumn] - [Orderer(SummaryOrderPolicy.FastestToSlowest)] - [MemoryDiagnoser] - public class TelefoneBenchmarkDiagnoser - { - [Benchmark] - public void ObterTelefoneCompleto() - { - Telefone telefone = "+55 (31) 9 7500-0001"; - } - - [Benchmark] - public void ObterTelefoneSemDDI() - { - Telefone telefone = "(31) 9 7500-0001"; - } - - [Benchmark] - public void ObterTelefoneSemNonoDigito() - { - Telefone telefone = "+55 (31) 7500-0001"; - } - - [Benchmark] - public void ObterTelefoneDDDInvalido() - { - Telefone telefone = "55 (10) 7500-0001"; - } - - [Benchmark] - public void ObterTelefoneServicoPublicoInvalido() - { - Telefone telefone = "666"; - } - - [Benchmark] - public void ObterTelefoneServicoPublicoValido() - { - Telefone telefone = "190"; - } - - [Benchmark] - public void NaoEhUmTelefoneValido() - { - Telefone telefone = "telefone"; - } - } -} diff --git a/src/Jabuticaba/Telefones/ServicosPublicosEmergencia.cs b/src/Jabuticaba/Telefones/ServicosPublicosEmergencia.cs deleted file mode 100644 index 0ac2f73..0000000 --- a/src/Jabuticaba/Telefones/ServicosPublicosEmergencia.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace Jabuticaba.Telefones -{ - public enum ServicosPublicosEmergencia - { - SecretariaDosDireitosHumanos = 100, - ServicoDeEmergenciaDoMercosul = 128, - Procon = 151, - Ibama = 152, - GuardaMunicipal = 153, - CentralDeAtendimentoAMulher = 180, - DisqueDenuncia = 181, - CentroDeValorizacaoAVida = 188, - PoliciaMilitar = 190, - PoliciaRodoviariaFederal = 191, - SAMU = 192, - CorpoDeBombeiros = 193, - PoliciaFederal = 194, - PoliciaCivil = 197, - PoliciaRodoviariaEstadual = 198, - DefesaCivil = 199 - - } -} \ No newline at end of file diff --git a/src/Jabuticaba/Telefones/Telefone.cs b/src/Jabuticaba/Telefones/Telefone.cs deleted file mode 100644 index 66e8d7c..0000000 --- a/src/Jabuticaba/Telefones/Telefone.cs +++ /dev/null @@ -1,148 +0,0 @@ -using System; - -namespace Jabuticaba.Telefones -{ - public struct Telefone - { - private readonly string _telefone; - public bool EValido; - public bool DDDValido; - public bool EServicoPublicoDeEmergencia; - private Telefone(string telefone) - { - _telefone = telefone; - EValido = true; - DDDValido = true; - EServicoPublicoDeEmergencia = false; - Validar(); - } - - public static implicit operator Telefone(string telefone) - => new Telefone(telefone); - - public override string ToString() - => _telefone; - private void Validar() - { - if (_telefone.Length == 3 && EhServicoPublicoDeEmergencia()) - { - DDDValido = false; - EValido = true; - EServicoPublicoDeEmergencia = true; - return; - } - - Span telefone = stackalloc char[_telefone.Length]; - Span telefoneSemMascara = stackalloc char[13]; - - for (int i = 0; i < telefone.Length; i++) - telefone[i] = _telefone[i]; - - if (FormatoValido(telefone, telefoneSemMascara) == false - || EhDDDValido(telefoneSemMascara) == false - || ValidarNonoDigito(telefoneSemMascara) == false) - { - DDDValido = false; - EValido = false; - return; - } - } - - private bool EhServicoPublicoDeEmergencia() - { - Span telefone = stackalloc char[3]; - for (int i = 0; i < _telefone.Length; i++) - telefone[i] = _telefone[i]; - - return (ServicosPublicosEmergencia)int.Parse(telefone) switch - { - ServicosPublicosEmergencia.SecretariaDosDireitosHumanos - or ServicosPublicosEmergencia.ServicoDeEmergenciaDoMercosul - or ServicosPublicosEmergencia.Procon - or ServicosPublicosEmergencia.Ibama - or ServicosPublicosEmergencia.GuardaMunicipal - or ServicosPublicosEmergencia.CentralDeAtendimentoAMulher - or ServicosPublicosEmergencia.DisqueDenuncia - or ServicosPublicosEmergencia.CentroDeValorizacaoAVida - or ServicosPublicosEmergencia.PoliciaMilitar - or ServicosPublicosEmergencia.PoliciaRodoviariaFederal - or ServicosPublicosEmergencia.SAMU - or ServicosPublicosEmergencia.CorpoDeBombeiros - or ServicosPublicosEmergencia.PoliciaFederal - or ServicosPublicosEmergencia.PoliciaCivil - or ServicosPublicosEmergencia.PoliciaRodoviariaEstadual - or ServicosPublicosEmergencia.DefesaCivil - => true, - _ => false - }; - } - - private bool FormatoValido(Span telefone, Span semMascara) - { - if (telefone[0] == '+' && int.Parse(telefone[1..3]) != 55) - return false; - - int tamanho = telefone.Length; - int contadorSemMascara = 0; - for (int i = 0; i < telefone.Length; i++) - { - if (char.IsDigit(telefone[i]) == false) - { - tamanho--; - continue; - } - if (contadorSemMascara < semMascara.Length) - semMascara[contadorSemMascara++] = telefone[i]; - } - - if (tamanho > 17 || tamanho < 10) - return false; - - return true; - } - - private bool SomenteDigito(Span span) - { - foreach (char c in span) - { - if (c < '0' || c > '9') - return false; - } - return true; - } - - private bool ValidarNonoDigito(Span telefone) - { - int tamanhoTelefone = telefone.IndexOf('\0'); - - if (tamanhoTelefone == -1) - return telefone[4] == '9'; - if (tamanhoTelefone == 11) - return telefone[2] == '9'; - return true; - } - - private bool EhDDDValido(Span telefone) - { - int tamanhoTelefone = telefone.IndexOf('\0'); - int ddd = tamanhoTelefone <= 11 && tamanhoTelefone > 0 - ? int.Parse(telefone[0..2]) - : NaoCapturarDDI(telefone); - - if (ddd % 10 == 0) - return false; - - return ddd switch - { - < 11 => false, - 23 or 25 or 26 or 29 or 36 or 39 or 52 or 72 or 76 or 78 => false, - >= 56 and < 60 => false, - > 99 => false, - _ => true - }; - } - - private int NaoCapturarDDI(Span telefone) - => int.Parse(telefone[2..4]); - } -} \ No newline at end of file diff --git a/test/JabuticabaTests/TelefoneTeste.cs b/test/JabuticabaTests/TelefoneTeste.cs deleted file mode 100644 index 868f01c..0000000 --- a/test/JabuticabaTests/TelefoneTeste.cs +++ /dev/null @@ -1,108 +0,0 @@ -using FluentAssertions; -using Jabuticaba.Telefones; -using Xunit; - -namespace JabuticabaTests -{ - public class TelefoneTeste - { - [Theory] - [InlineData("telefone")] - [InlineData("123abc")] - public void DeveRetornarInvalidoQuandoNaoEhUmTelefone(string ntel) - { - Telefone telefone = ntel; - telefone.EValido.Should().BeFalse(); - } - - [Theory] - [InlineData("0533931020")] // ddd < 11 - [InlineData("5033331020")] // multiplo de 10 - [InlineData("5633331020")] - [InlineData("5933331020")] - [InlineData("2333331020")] - [InlineData("2533331020")] - [InlineData("2633331020")] - [InlineData("2933331020")] - [InlineData("3633331020")] - [InlineData("3933331020")] - [InlineData("5233331020")] - [InlineData("7233331020")] - [InlineData("7633331020")] - [InlineData("7833331020")] - [InlineData("5578994940001")] - [InlineData("+55 (10) 7500-0001")] - public void DeveRetornarDDDInvalido(string sTelefone) - { - Telefone telefone = sTelefone; - telefone.DDDValido.Should().BeFalse(); - } - - [Theory] - [InlineData("+55 (31) 9 7500-0001")] - [InlineData("55 (31) 9 7500-0001")] - [InlineData("55 31 9 7500-0001")] - [InlineData("55 31 9 7500 0001")] - public void DeveRetornarValidoQuandoComDDDECodigoBrasil(string tel) - { - Telefone telefone = tel; - telefone.EValido.Should().BeTrue(); - } - - [Theory] - [InlineData("7500-0001")] - [InlineData("7500 0001")] - public void DeveRetornarInvalidoQuandoSemDDD(string tel) - { - Telefone telefone = tel; - telefone.EValido.Should().BeFalse(); - } - - [Theory] - [InlineData("(31) 3393-0001")] - [InlineData("(31)3393-0001")] - [InlineData("31 3393 0001")] - [InlineData("3133930001")] - public void DeveRetornarValidoQuandoComDDD(string tel) - { - Telefone telefone = tel; - telefone.EValido.Should().BeTrue(); - } - - [Theory] - [InlineData("55 (31) 6 3393-0001")] - [InlineData("(31) 6 3393-0001")] - public void DeveSerInvalidoQuandoNaoConterNonoDigitoinvalido(string tel) - { - Telefone telefone = tel; - telefone.EValido.Should().BeFalse(); - } - - [Theory] - [InlineData("+55 (31) 7500-0001")] - public void DeveSerValidoQuandoNaoContiverNonoDigito(string tel) - { - Telefone telefone = tel; - telefone.EValido.Should().BeTrue(); - } - - [Theory] - [InlineData("190")] - [InlineData("181")] - public void DeveSerValidoQuandoForServicoPublicoDeEmergencia(string tel) - { - Telefone telefone = tel; - telefone.EValido.Should().BeTrue(); - telefone.EServicoPublicoDeEmergencia.Should().BeTrue(); - } - - [Theory] - [InlineData("666")] - public void DeveSerInvalidoQuandoNaoForServicoPublicoDeEmergencia(string tel) - { - Telefone telefone = tel; - telefone.EValido.Should().BeFalse(); - telefone.EServicoPublicoDeEmergencia.Should().BeFalse(); - } - } -} From 955399123ef22f1aef098fd7451e16a7ccc52275 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Gon=C3=A7alves?= Date: Thu, 14 Nov 2024 19:41:36 -0300 Subject: [PATCH 3/5] fix: Validar quando CPF ou CNPJ forem nulos --- src/Jabuticaba/Cnpj.cs | 16 ++++++++++++++-- src/Jabuticaba/Cpf.cs | 3 +++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Jabuticaba/Cnpj.cs b/src/Jabuticaba/Cnpj.cs index 0cd4a1e..28480d0 100644 --- a/src/Jabuticaba/Cnpj.cs +++ b/src/Jabuticaba/Cnpj.cs @@ -27,6 +27,9 @@ private void Validar() { Span stackCnpj = stackalloc int[14]; + ValidarSeNulo(); + if (EValido == false) return; + ValidarSeSomentDigito(); if (EValido == false) return; @@ -42,8 +45,17 @@ private void Validar() ValidarSegundoDigito(stackCnpj); if (EValido == false) return; - } - + } + + private void ValidarSeNulo() + { + if (_cnpj is null) + { + EValido = false; + Erro = "O CNPJ não pode ser nulo."; + } + } + private void ValidarSeSomentDigito() { for (int i = 0; i < _cnpj.Length; i++) diff --git a/src/Jabuticaba/Cpf.cs b/src/Jabuticaba/Cpf.cs index 840d4ee..be7d21e 100644 --- a/src/Jabuticaba/Cpf.cs +++ b/src/Jabuticaba/Cpf.cs @@ -29,6 +29,9 @@ private void Validar() { Span stackCpf = stackalloc int[11]; + ValidarSeNulo(); + if(EValido == false) return; + ValidarSeSomenteDigito(); if (EValido == false) return; From b0dcbdc20e38ad22b0409bf0071a1896889ffc35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Gon=C3=A7alves?= Date: Thu, 14 Nov 2024 19:41:59 -0300 Subject: [PATCH 4/5] =?UTF-8?q?test:=20validar=20se=20CNPJ=20=C3=A9=20nulo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/JabuticabaTests/CnpjTest.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/test/JabuticabaTests/CnpjTest.cs b/test/JabuticabaTests/CnpjTest.cs index fe2b467..355d9e8 100644 --- a/test/JabuticabaTests/CnpjTest.cs +++ b/test/JabuticabaTests/CnpjTest.cs @@ -89,9 +89,9 @@ public void DeveSerInvalidoQuandoPrimeiroDigitoEhInvalido() Cnpj cnpj = "02.055.097/0001-05"; - cnpj.EValido.Should().BeFalse(); - cnpj.Erro.Should() - .BeEquivalentTo("O CNPJ 02.055.097/0001-05 é inválido."); + cnpj.EValido.Should().BeFalse(); + cnpj.Erro.Should() + .BeEquivalentTo("O CNPJ 02.055.097/0001-05 é inválido."); } [Fact] @@ -104,5 +104,14 @@ public void DeveSerInvalidoQuandoSegundoDigitoEhInvalido() .BeEquivalentTo("O CNPJ 02.055.097/0001-60 é inválido."); } + + [Fact] + public void DeveSerInvalidoQuandoCnpjEhNulo() + { + Cnpj cnpj = null; + cnpj.EValido.Should().BeFalse(); + cnpj.Erro.Should() + .BeEquivalentTo("O CNPJ não pode ser nulo."); + } } } From d3df9f1cba18074a6b5b1ff7cdddb6ae7f2f4208 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Gon=C3=A7alves?= Date: Thu, 14 Nov 2024 19:42:06 -0300 Subject: [PATCH 5/5] =?UTF-8?q?test:=20validar=20se=20CPF=20=C3=A9=20nulo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/JabuticabaTests/CpfTest.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/JabuticabaTests/CpfTest.cs b/test/JabuticabaTests/CpfTest.cs index fd91388..13b544f 100644 --- a/test/JabuticabaTests/CpfTest.cs +++ b/test/JabuticabaTests/CpfTest.cs @@ -97,5 +97,15 @@ public void DeveSerInvalidoQuandoCpfConterValorNaoNumerico() cpf.Erro.Should() .BeEquivalentTo("Um CPF deve conter apenas números. O valor 'a' foi encontrado na posição '12'. Cpf informado: 149.764.610a"); } + + [Fact] + public void DeveSerInvalidoQuandoCpfENull() + { + Cpf cpf = null; + + cpf.EValido.Should().BeFalse(); + cpf.Erro.Should() + .BeEquivalentTo("O CPF não pode ser nulo"); + } } }