Skip to content

Commit 64d2e15

Browse files
committed
make Brazilian ID Number accessible via faker.idNumber()
CPF was already available via `faker.cpf().valid()`, but now it's also available via more generic `new Faker(new Locale("pt", "BR")).idNumber().valid()`.
1 parent b311a8c commit 64d2e15

File tree

8 files changed

+84
-14
lines changed

8 files changed

+84
-14
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package net.datafaker.idnumbers;
2+
3+
import net.datafaker.idnumbers.pt.br.IdNumberGeneratorPtBrUtil;
4+
import net.datafaker.providers.base.BaseProviders;
5+
import net.datafaker.providers.base.IdNumber.IdNumberRequest;
6+
import net.datafaker.providers.base.PersonIdNumber;
7+
8+
import static net.datafaker.idnumbers.Utils.birthday;
9+
import static net.datafaker.idnumbers.Utils.gender;
10+
11+
/**
12+
* Brazilian individual taxpayer number
13+
*/
14+
public class BrazilIdNumber implements IdNumberGenerator {
15+
@Override
16+
public String countryCode() {
17+
return "BR";
18+
}
19+
20+
@Override
21+
public String generateInvalid(final BaseProviders faker) {
22+
return IdNumberGeneratorPtBrUtil.cpf(faker, true, false);
23+
}
24+
25+
@Override
26+
public PersonIdNumber generateValid(BaseProviders faker, IdNumberRequest request) {
27+
String idNumber = IdNumberGeneratorPtBrUtil.cpf(faker, true, true);
28+
return new PersonIdNumber(idNumber,
29+
birthday(faker, request), gender(faker, request));
30+
}
31+
}

src/main/java/net/datafaker/idnumbers/pt/br/IdNumberGeneratorPtBrUtil.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ public static boolean isCNPJValid(final String cnpj) {
102102
int d1 = digit(calculateWeight(cnpjUnmask, 9, 4, cnpjPartialLength) + calculateWeight(cnpjUnmask, 5, 0, 4));
103103
int d2 = digit((d1 * 2) + calculateWeight(cnpjUnmask, 9, 5, cnpjPartialLength) + calculateWeight(cnpjUnmask, 6, 0, 5));
104104

105-
106105
final String other = d1 + "" + d2;
107106
return cnpjUnmask.regionMatches(cnpjPartialLength, other, 0, other.length());
108107
}
@@ -126,7 +125,7 @@ public static Boolean isCPFValid(final String cpf) {
126125
}
127126

128127

129-
public static int calculateWeight(final String num, final int weight, int start, int end) {
128+
private static int calculateWeight(final String num, final int weight, int start, int end) {
130129
int sum = 0;
131130
int weightAux = weight;
132131

@@ -136,12 +135,11 @@ public static int calculateWeight(final String num, final int weight, int start,
136135
return sum;
137136
}
138137

139-
public static int digit(int verifyingDigit) {
138+
private static int digit(int verifyingDigit) {
140139
int remainder = verifyingDigit % 11;
141140
if (remainder == 0 || remainder == 1)
142141
return 0;
143142
else
144143
return 11 - remainder;
145144
}
146-
147145
}

src/main/java/net/datafaker/providers/base/IdNumber.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ public String validZhCNSsn() {
147147
}
148148

149149
/**
150-
* Generate a valid Chinese id number
150+
* Generate a valid Portuguese ID number
151151
*
152152
* @deprecated Instead of calling this method directly, use faker with locale:
153153
* <pre>
@@ -203,6 +203,14 @@ public String invalidEsMXSsn() {
203203
* Generates a valid PESEL number for a person of random gender and age between
204204
* 0 and 100.
205205
*
206+
* @deprecated Instead of calling this method directly, use faker with locale:
207+
* <pre>
208+
* {@code
209+
* Faker faker = new Faker(new Locale("pl", "PL"));
210+
* String idNumber = faker.idNumber().valid();
211+
* }
212+
* </pre>
213+
*
206214
* @return A valid PESEL number
207215
*/
208216
public String peselNumber() {

src/main/resources/META-INF/services/net.datafaker.idnumbers.IdNumberGenerator

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
net.datafaker.idnumbers.AlbanianIdNumber
22
net.datafaker.idnumbers.AmericanIdNumber
33
net.datafaker.idnumbers.BulgarianIdNumber
4+
net.datafaker.idnumbers.BrazilIdNumber
45
net.datafaker.idnumbers.ChineseIdNumber
56
net.datafaker.idnumbers.EstonianIdNumber
67
net.datafaker.idnumbers.FrenchIdNumber

src/test/java/net/datafaker/helpers/IdNumberPatterns.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,7 @@ public class IdNumberPatterns {
1212
public static final Pattern POLISH = Pattern.compile("\\d{11}");
1313
public static final Pattern IRISH = Pattern.compile("\\d{7}[A-Z]{1,2}$");
1414
public static final Pattern HUNGARIAN = Pattern.compile("[1-4]\\d{9}");
15+
public static final Pattern ESTONIAN = Pattern.compile("[1-6][0-9]{10}");
16+
public static final Pattern BRAZILIAN = Pattern.compile("\\d{3}\\.\\d{3}\\.\\d{3}-\\d{2}");
1517

1618
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package net.datafaker.idnumbers.pt.br;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import static net.datafaker.idnumbers.pt.br.IdNumberGeneratorPtBrUtil.isCPFValid;
6+
import static org.assertj.core.api.Assertions.assertThat;
7+
8+
class IdNumberGeneratorPtBrUtilTest {
9+
@Test
10+
void samples() {
11+
assertThat(isCPFValid("529.982.247-25")).isTrue();
12+
assertThat(isCPFValid("168.995.350-09")).isTrue();
13+
assertThat(isCPFValid("862.883.667-57")).isTrue();
14+
assertThat(isCPFValid("746.971.314-01")).isTrue();
15+
}
16+
}

src/test/java/net/datafaker/providers/base/CPFTest.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,13 @@
33
import net.datafaker.Faker;
44
import org.junit.jupiter.api.RepeatedTest;
55

6-
import java.util.regex.Pattern;
7-
6+
import static net.datafaker.helpers.IdNumberPatterns.BRAZILIAN;
87
import static net.datafaker.idnumbers.pt.br.IdNumberGeneratorPtBrUtil.isCPFValid;
98
import static org.assertj.core.api.Assertions.assertThat;
109

1110

1211
class CPFTest {
1312

14-
public static final Pattern CPF_EXPRESSION = Pattern.compile("(^\\d{3}\\x2E\\d{3}\\x2E\\d{3}\\x2D\\d{2}$)");
1513
private final Faker faker = new Faker();
1614

1715
/**
@@ -36,9 +34,9 @@ void isInvalidCPF() {
3634
*/
3735
@RepeatedTest(100)
3836
void formattedCPF() {
39-
assertThat(faker.cpf().valid()).matches(CPF_EXPRESSION);
40-
assertThat(faker.cpf().valid(true)).matches(CPF_EXPRESSION);
41-
assertThat(faker.cpf().invalid()).matches(CPF_EXPRESSION);
42-
assertThat(faker.cpf().invalid(true)).matches(CPF_EXPRESSION);
37+
assertThat(faker.cpf().valid()).matches(BRAZILIAN);
38+
assertThat(faker.cpf().valid(true)).matches(BRAZILIAN);
39+
assertThat(faker.cpf().invalid()).matches(BRAZILIAN);
40+
assertThat(faker.cpf().invalid(true)).matches(BRAZILIAN);
4341
}
4442
}

src/test/java/net/datafaker/providers/base/IdNumberTest.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import static java.lang.Integer.parseInt;
1919
import static java.time.format.DateTimeFormatter.ofPattern;
20+
import static net.datafaker.idnumbers.pt.br.IdNumberGeneratorPtBrUtil.isCPFValid;
2021
import static net.datafaker.providers.base.IdNumber.GenderRequest.ANY;
2122
import static org.assertj.core.api.Assertions.assertThat;
2223
import static org.assertj.core.api.Assertions.assertThatCode;
@@ -39,6 +40,7 @@ class IdNumberTest {
3940
private static final Faker FRENCH = new Faker(new Locale("fr", "FR"));
4041
private static final Faker ITALIAN = new Faker(new Locale("it", "IT"));
4142
private static final Faker HUNGARIAN = new Faker(new Locale("hu", "HU"));
43+
private static final Faker BRAZILIAN = new Faker(new Locale("pt", "BR"));
4244

4345
@Test
4446
void testValid() {
@@ -117,12 +119,26 @@ void testPeselNumber() {
117119

118120
@RepeatedTest(100)
119121
void estonianPersonalCode_valid() {
120-
assertThatPin(ESTONIAN.idNumber().valid()).matches("[1-6][0-9]{10}");
122+
assertThatPin(ESTONIAN.idNumber().valid()).matches(IdNumberPatterns.ESTONIAN);
121123
}
122124

123125
@RepeatedTest(100)
124126
void estonianPersonalCode_invalid() {
125-
assertThatPin(ESTONIAN.idNumber().invalid()).matches("[1-6][0-9]{10}");
127+
assertThatPin(ESTONIAN.idNumber().invalid()).matches(IdNumberPatterns.ESTONIAN);
128+
}
129+
130+
@RepeatedTest(100)
131+
void brazilianPersonalCode_valid() {
132+
String actual = BRAZILIAN.idNumber().valid();
133+
assertThatPin(actual).matches(IdNumberPatterns.BRAZILIAN);
134+
assertThat(isCPFValid(actual)).describedAs(() -> "Current value " + actual).isTrue();
135+
}
136+
137+
@RepeatedTest(100)
138+
void brazilianPersonalCode_invalid() {
139+
String actual = BRAZILIAN.idNumber().invalid();
140+
assertThatPin(actual).matches(IdNumberPatterns.BRAZILIAN);
141+
assertThat(isCPFValid(actual)).describedAs(() -> "Current value " + actual).isFalse();
126142
}
127143

128144
@RepeatedTest(100)

0 commit comments

Comments
 (0)