103 lines
2.2 KiB
Go
103 lines
2.2 KiB
Go
package cnpj
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestGenerate(t *testing.T) {
|
|
for range 100 {
|
|
cnpj := Generate()
|
|
if len(cnpj) != 14 {
|
|
t.Fatalf("expected 14 digits, got %d: %s", len(cnpj), cnpj)
|
|
}
|
|
for _, c := range cnpj {
|
|
if c < '0' || c > '9' {
|
|
t.Fatalf("non-digit character %c in %s", c, cnpj)
|
|
}
|
|
}
|
|
if isRepetitive(cnpj) {
|
|
t.Fatalf("repetitive CNPJ generated: %s", cnpj)
|
|
}
|
|
if !validateDV(cnpj, false) {
|
|
t.Fatalf("invalid check digits for %s", cnpj)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestGenerateAlpha(t *testing.T) {
|
|
for range 100 {
|
|
cnpj := GenerateAlpha()
|
|
if len(cnpj) != 14 {
|
|
t.Fatalf("expected 14 chars, got %d: %s", len(cnpj), cnpj)
|
|
}
|
|
for _, c := range cnpj[:12] {
|
|
if !isAlphaNumeric(byte(c)) {
|
|
t.Fatalf("non-alphanumeric character %c in base of %s", c, cnpj)
|
|
}
|
|
}
|
|
for _, c := range cnpj[12:] {
|
|
if c < '0' || c > '9' {
|
|
t.Fatalf("DV must be digit, got %c in %s", c, cnpj)
|
|
}
|
|
}
|
|
if isRepetitive(cnpj) {
|
|
t.Fatalf("repetitive CNPJ generated: %s", cnpj)
|
|
}
|
|
if !validateDV(cnpj, true) {
|
|
t.Fatalf("invalid check digits for %s", cnpj)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestUniqueness(t *testing.T) {
|
|
seen := make(map[string]bool)
|
|
for range 50 {
|
|
cnpj := Generate()
|
|
if seen[cnpj] {
|
|
t.Fatalf("duplicate CNPJ generated: %s", cnpj)
|
|
}
|
|
seen[cnpj] = true
|
|
}
|
|
for range 50 {
|
|
cnpj := GenerateAlpha()
|
|
if seen[cnpj] {
|
|
t.Fatalf("duplicate CNPJ generated: %s", cnpj)
|
|
}
|
|
seen[cnpj] = true
|
|
}
|
|
}
|
|
|
|
func TestFormat(t *testing.T) {
|
|
tests := []struct {
|
|
input string
|
|
want string
|
|
}{
|
|
{"12345678000195", "12.345.678/0001-95"},
|
|
{"11111111111111", "11.111.111/1111-11"},
|
|
{"", ""},
|
|
{"123", "123"},
|
|
{"ABCDEFGHIJKLMN", "AB.CDE.FGH/IJKL-MN"},
|
|
}
|
|
for _, tt := range tests {
|
|
got := Format(tt.input)
|
|
if got != tt.want {
|
|
t.Errorf("Format(%q) = %q; want %q", tt.input, got, tt.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func isAlphaNumeric(c byte) bool {
|
|
return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z')
|
|
}
|
|
|
|
func validateDV(s string, alpha bool) bool {
|
|
if len(s) != 14 {
|
|
return false
|
|
}
|
|
if isRepetitive(s) {
|
|
return false
|
|
}
|
|
dv1 := computeDV(s[:12], cnpjP1, alpha)
|
|
dv2 := computeDV(s[:12]+string(byte('0'+dv1)), cnpjP2, alpha)
|
|
return int(s[12]-'0') == dv1 && int(s[13]-'0') == dv2
|
|
}
|