Skip to content

Commit cc75fab

Browse files
authored
Merge pull request #161 from cemdrman/feat/add-turkish-locale
feat: add Turkish (TR) locale support
2 parents fcc8104 + df59a76 commit cc75fab

12 files changed

Lines changed: 300 additions & 2 deletions

File tree

src/main/java/com/devskiller/jfairy/LocaleSpecificProvidersFactory.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import com.devskiller.jfairy.producer.company.locale.pl.PlVATIdentificationNumberProvider;
1818
import com.devskiller.jfairy.producer.company.locale.sk.SkVATIdentificationNumberProvider;
1919
import com.devskiller.jfairy.producer.company.locale.sv.SvVATIdentificationNumberProvider;
20+
import com.devskiller.jfairy.producer.company.locale.tr.TrVATIdentificationNumberProvider;
2021
import com.devskiller.jfairy.producer.company.locale.zh.ZhVATIdentificationNumberProvider;
2122
import com.devskiller.jfairy.producer.person.NationalIdentificationNumberFactory;
2223
import com.devskiller.jfairy.producer.person.locale.NoNationalIdentificationNumberFactory;
@@ -50,6 +51,9 @@
5051
import com.devskiller.jfairy.producer.person.locale.sv.SvNationalIdentificationNumberFactory;
5152
import com.devskiller.jfairy.producer.person.locale.sv.SvNationalIdentityCardNumberProvider;
5253
import com.devskiller.jfairy.producer.person.locale.sv.SvPassportNumberProvider;
54+
import com.devskiller.jfairy.producer.person.locale.tr.TrAddressProvider;
55+
import com.devskiller.jfairy.producer.person.locale.tr.TrNationalIdentityCardNumberProvider;
56+
import com.devskiller.jfairy.producer.person.locale.tr.TrPassportNumberProvider;
5357
import com.devskiller.jfairy.producer.person.locale.zh.ZhAddressProvider;
5458
import com.devskiller.jfairy.producer.person.locale.zh.ZhNationalIdentityCardNumberProvider;
5559
import com.devskiller.jfairy.producer.person.locale.zh.ZhPassportNumberProvider;
@@ -89,6 +93,7 @@ static LocaleSpecificProviders createProvidersForLocale(Locale locale,
8993
case DE -> createDeProviders(dataMaster, baseProducer);
9094
case KA -> createKaProviders(dataMaster, baseProducer);
9195
case BR -> createBrProviders(dataMaster, baseProducer);
96+
case TR -> createTrProviders(dataMaster, baseProducer);
9297
};
9398
}
9499

@@ -232,4 +237,15 @@ private static LocaleSpecificProviders createBrProviders(DataMaster dataMaster,
232237
new BrPassportNumberProvider()
233238
);
234239
}
240+
241+
private static LocaleSpecificProviders createTrProviders(DataMaster dataMaster,
242+
BaseProducer baseProducer) {
243+
return new LocaleSpecificProviders(
244+
new NoNationalIdentificationNumberFactory(),
245+
new TrNationalIdentityCardNumberProvider(baseProducer),
246+
new TrVATIdentificationNumberProvider(baseProducer),
247+
new TrAddressProvider(dataMaster, baseProducer),
248+
new TrPassportNumberProvider(baseProducer)
249+
);
250+
}
235251
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.devskiller.jfairy.producer.company.locale.tr;
2+
3+
import com.devskiller.jfairy.producer.BaseProducer;
4+
import com.devskiller.jfairy.producer.VATIdentificationNumberProvider;
5+
6+
/**
7+
* Turkish VKN (Vergi Kimlik Numarası) generator.
8+
* 10 digits.
9+
* Last digit is a check digit.
10+
*/
11+
public class TrVATIdentificationNumberProvider implements VATIdentificationNumberProvider {
12+
13+
private final BaseProducer baseProducer;
14+
15+
public TrVATIdentificationNumberProvider(BaseProducer baseProducer) {
16+
this.baseProducer = baseProducer;
17+
}
18+
19+
@Override
20+
public String get() {
21+
int[] digits = new int[10];
22+
23+
for (int i = 0; i < 9; i++) {
24+
digits[i] = baseProducer.randomBetween(0, 9);
25+
}
26+
27+
int sum = 0;
28+
for (int i = 0; i < 9; i++) {
29+
int p = (digits[i] + 10 - (i + 1)) % 10;
30+
if (p == 9) {
31+
sum += 9;
32+
} else {
33+
int q = (int) (p * Math.pow(2, 9 - i)) % 9;
34+
sum += q;
35+
}
36+
}
37+
38+
int c1 = (10 - (sum % 10)) % 10;
39+
digits[9] = c1;
40+
41+
StringBuilder sb = new StringBuilder();
42+
for (int digit : digits) {
43+
sb.append(digit);
44+
}
45+
return sb.toString();
46+
}
47+
}

src/main/java/com/devskiller/jfairy/producer/person/Country.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ public enum Country {
2121
Sweden("SE", LanguageCode.SV),
2222
China("CN", LanguageCode.ZH),
2323
Brazil("BR", LanguageCode.BR),
24-
Slovakia("SK", LanguageCode.SK);
24+
Slovakia("SK", LanguageCode.SK),
25+
Turkey("TR", LanguageCode.TR);
2526

2627
// ISO 3166 code
2728
private final String code;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.devskiller.jfairy.producer.person.locale.tr;
2+
3+
import com.devskiller.jfairy.producer.person.locale.ContinentalAddress;
4+
5+
public class TrAddress extends ContinentalAddress {
6+
7+
public TrAddress(String streetNumber, String street, String apartmentNumber, String postalCode, String city) {
8+
super(street, streetNumber, apartmentNumber, postalCode, city);
9+
}
10+
11+
@Override
12+
protected String getStreetNumberSeparator() {
13+
return " No: ";
14+
}
15+
16+
@Override
17+
protected String getApartmentMark() {
18+
return " Daire: ";
19+
}
20+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.devskiller.jfairy.producer.person.locale.tr;
2+
3+
import com.devskiller.jfairy.data.DataMaster;
4+
import com.devskiller.jfairy.producer.BaseProducer;
5+
import com.devskiller.jfairy.producer.person.AbstractAddressProvider;
6+
7+
public class TrAddressProvider extends AbstractAddressProvider {
8+
9+
public TrAddressProvider(DataMaster dataMaster, BaseProducer baseProducer) {
10+
super(dataMaster, baseProducer);
11+
}
12+
13+
@Override
14+
public TrAddress get() {
15+
return new TrAddress(getStreetNumber(), getStreet(), getApartmentNumber(),
16+
getPostalCode(), getCity());
17+
}
18+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.devskiller.jfairy.producer.person.locale.tr;
2+
3+
import com.devskiller.jfairy.producer.BaseProducer;
4+
import com.devskiller.jfairy.producer.person.NationalIdentityCardNumberProvider;
5+
6+
/**
7+
* Turkish T.C. Kimlik No generator.
8+
* 11 digits.
9+
* 1st digit cannot be 0.
10+
* 10th digit = ((sum(1,3,5,7,9) * 7) - sum(2,4,6,8)) % 10.
11+
* 11th digit = (sum(1..10)) % 10.
12+
*/
13+
public class TrNationalIdentityCardNumberProvider implements NationalIdentityCardNumberProvider {
14+
15+
private final BaseProducer baseProducer;
16+
17+
public TrNationalIdentityCardNumberProvider(BaseProducer baseProducer) {
18+
this.baseProducer = baseProducer;
19+
}
20+
21+
@Override
22+
public String get() {
23+
int[] digits = new int[11];
24+
25+
digits[0] = baseProducer.randomBetween(1, 9);
26+
for (int i = 1; i < 9; i++) {
27+
digits[i] = baseProducer.randomBetween(0, 9);
28+
}
29+
30+
int oddSum = digits[0] + digits[2] + digits[4] + digits[6] + digits[8];
31+
int evenSum = digits[1] + digits[3] + digits[5] + digits[7];
32+
33+
int d10 = ((oddSum * 7) - evenSum) % 10;
34+
if (d10 < 0) {
35+
d10 += 10;
36+
}
37+
digits[9] = d10;
38+
39+
int totalSum = 0;
40+
for (int i = 0; i < 10; i++) {
41+
totalSum += digits[i];
42+
}
43+
digits[10] = totalSum % 10;
44+
45+
StringBuilder sb = new StringBuilder();
46+
for (int digit : digits) {
47+
sb.append(digit);
48+
}
49+
return sb.toString();
50+
}
51+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.devskiller.jfairy.producer.person.locale.tr;
2+
3+
import com.devskiller.jfairy.producer.BaseProducer;
4+
import com.devskiller.jfairy.producer.person.PassportNumberProvider;
5+
6+
public class TrPassportNumberProvider implements PassportNumberProvider {
7+
8+
private final BaseProducer baseProducer;
9+
10+
public TrPassportNumberProvider(BaseProducer baseProducer) {
11+
this.baseProducer = baseProducer;
12+
}
13+
14+
@Override
15+
public String get() {
16+
return "U" + String.format("%08d", baseProducer.randomBetween(1, 99999999));
17+
}
18+
}

src/main/java/com/devskiller/jfairy/producer/util/LanguageCode.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,6 @@ public enum LanguageCode {
2020
SV,
2121
ZH,
2222
BR,
23-
SK
23+
SK,
24+
TR
2425
}

src/main/resources/jfairy_tr.yml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
alphabet: abcçdefgğhıijklmnoöprsştuüvyz
2+
domains: [ com.tr, org.tr, net.tr, edu.tr, gov.tr, k12.tr, av.tr, dr.tr, bel.tr, tsk.tr ]
3+
firstNames: {
4+
male: [ Ahmet, Mehmet, Mustafa, Ali, Hüseyin, Hasan, İbrahim, İsmail, Osman, Murat, Ömer, Ramazan, Halil, Süleyman, Abdullah, Mahmut, Recep, Salih, Fatih, Kadir, Emre, Gökhan, Hakan, Serkan, Metin, Burak, Volkan, Bülent, Kenan, Selçuk, Yavuz, Sinan, Can, Kerem, Deniz, Onur, Umut, Eren, Arda, Mert, Yiğit, Berk, Tolga, Kaan, Doruk, Batuhan, Görkem, Furkan, Enes, Yunus, Bilal ],
5+
female: [ Fatma, Ayşe, Emine, Hatice, Zeynep, Özlem, Elif, Meryem, Gamze, Şerife, Hanife, Sultan, Zehra, Havva, Hayriye, Cemile, Güllü, Leyla, Saliha, Melek, Arzu, Yasemin, Esra, Dilek, Pınar, Tuğba, Seda, Ebru, Gizem, Büşra, Kübra, Feyza, Beyza, İrem, Merve, Nursel, Selin, Pelin, Damla, Yağmur, Ece, Duru, Defne, Azra, Derin, Bade, Nehir, Eylül, Melis ],
6+
}
7+
lastNames: {
8+
male: [ Yılmaz, Kaya, Demir, Çelik, Şahin, Yıldız, Yıldırım, Öztürk, Aydın, Özdemir, Arslan, Doğan, Kılıç, Aslan, Çetin, Kara, Koç, Kurt, Özkan, Şimşek, Polat, Özcan, Korkmaz, Çakır, Erdoğan, Yavuz, Can, Aksoy, Köse, Güler, Aktaş, Avcı, Akın, Özer, Ünal, Kaplan, Bulut, Yiğit, Sarı, Taş, Kaymak, Önal, Güneş, Ay, Karaman, Çavuş, Yalçın, Uzun, Karakaş, Tekin ],
9+
female: [ Yılmaz, Kaya, Demir, Çelik, Şahin, Yıldız, Yıldırım, Öztürk, Aydın, Özdemir, Arslan, Doğan, Kılıç, Aslan, Çetin, Kara, Koç, Kurt, Özkan, Şimşek, Polat, Özcan, Korkmaz, Çakır, Erdoğan, Yavuz, Can, Aksoy, Köse, Güler, Aktaş, Avcı, Akın, Özer, Ünal, Kaplan, Bulut, Yiğit, Sarı, Taş, Kaymak, Önal, Güneş, Ay, Karaman, Çavuş, Yalçın, Uzun, Karakaş, Tekin ]
10+
}
11+
personalEmails: [ gmail.com, hotmail.com, yahoo.com, outlook.com, icloud.com ]
12+
companyNames: [ Holding, Şirket, Ticaret, Sanayi, Limited, Anonim, Bilişim, Otomotiv, Gıda, İnşaat, Tekstil, Lojistik, Turizm, Enerji, Medya, Sağlık, Eğitim, Banka, Sigorta, Mağaza, Market, Restoran, Kafe ]
13+
companySuffixes: [ 'A.Ş.', 'Ltd. Şti.', 'Hizmetleri', 'Grubu', 'Dış Ticaret' ]
14+
companyEmails: [ info, destek, satis, hello, merhaba ]
15+
16+
text: Bu bir deneme metnidir. Türkçe dil desteği için oluşturulmuştur. Bu sistem sayesinde rastgele Türkçe veriler üretebilirsiniz. Adresler, isimler, telefon numaraları ve daha fazlası artık jfairy ile mümkün. Teknolojinin getirdiği bu kolaylıklar sayesinde test süreçleriniz daha hızlı ve verimli hale gelecek.
17+
18+
telephone_number_formats: [ '+90 5## ### ## ##' ]
19+
20+
postal_code: [ '#####' ]
21+
22+
city: [ İstanbul, Ankara, İzmir, Bursa, Antalya, Adana, Konya, Gaziantep, Şanlıurfa, Mersin, Kocaeli, Diyarbakır, Hatay, Manisa, Kayseri, Samsun, Balıkesir, Kahramanmaraş, Van, Aydın ]
23+
24+
street: [ İstiklal Caddesi, Bağdat Caddesi, Cumhuriyet Caddesi, Atatürk Bulvarı, Vatan Caddesi, Ordu Caddesi, Halaskargazi Caddesi, Abdi İpekçi Caddesi, Nispetiye Caddesi, Barbaros Bulvarı, Turgut Özal Bulvarı, Mevlana Caddesi, Fevzi Çakmak Caddesi, Ziya Gökalp Caddesi, Mithatpaşa Caddesi, Tunalı Hilmi Caddesi, Bahçelievler 7. Cadde, Kenan Evren Bulvarı, Gazipaşa Bulvarı, Talatpaşa Bulvarı ]
25+
26+
country: [ 'Türkiye' ]
27+
28+
language: 'TR'
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.devskiller.jfairy.producer.company.locale.tr
2+
3+
import com.devskiller.jfairy.producer.BaseProducer
4+
import com.devskiller.jfairy.producer.RandomGenerator
5+
import spock.lang.Specification
6+
7+
class TrVATIdentificationNumberProviderSpec extends Specification {
8+
9+
def "should generate valid VKN"() {
10+
given:
11+
BaseProducer baseProducer = new BaseProducer(new RandomGenerator())
12+
TrVATIdentificationNumberProvider provider = new TrVATIdentificationNumberProvider(baseProducer)
13+
14+
expect:
15+
(1..100).each {
16+
String vkn = provider.get()
17+
assert vkn.length() == 10
18+
int[] digits = vkn.chars().collect { Character.getNumericValue((char) it) }
19+
int sum = 0
20+
for (int i = 0; i < 9; i++) {
21+
int p = (digits[i] + 10 - (i + 1)) % 10
22+
if (p == 9) {
23+
sum += 9
24+
} else {
25+
int q = (int) (p * Math.pow(2, 9 - i)) % 9
26+
sum += q
27+
}
28+
}
29+
int c1 = (10 - (sum % 10)) % 10
30+
assert digits[9] == c1
31+
}
32+
}
33+
}

0 commit comments

Comments
 (0)