diff --git a/src/main/java/net/datafaker/providers/base/BaseFaker.java b/src/main/java/net/datafaker/providers/base/BaseFaker.java index 34a00925b..0fe571500 100644 --- a/src/main/java/net/datafaker/providers/base/BaseFaker.java +++ b/src/main/java/net/datafaker/providers/base/BaseFaker.java @@ -334,26 +334,8 @@ public static > METHODS.putIfAbsent(newMappingClass, new ConcurrentHashMap<>(methods.length)); for (Method method: methods) { if (method.getParameterCount() > 0) continue; - StringBuilder sb = null; final String methodName = method.getName(); - final int length = methodName.length(); - int start = 0; - for (int i = 0; i < length; i++) { - char ch = methodName.charAt(i); - if (i > 0 && Character.isUpperCase(ch)) { - if (sb == null) { - sb = new StringBuilder(); - } - sb.append(methodName.toLowerCase(Locale.ROOT), start, i + 1).append('_'); - start = i + 1; - } - } - final String name; - if (start > 0) { - name = sb.append(methodName, start, methodName.length()).toString(); - } else { - name = methodName; - } + Map methodMap = METHODS.get(newMappingClass); if (methodMap == null) { synchronized (BaseFaker.class) { @@ -364,7 +346,7 @@ public static > } } } - methodMap.put(name, method); + methodMap.put(methodName, method); } map.putIfAbsent(faker.getContext(), newMapping); CLASSES.get(simpleName).put(faker.getContext(), newMapping); diff --git a/src/main/java/net/datafaker/service/FakeValues.java b/src/main/java/net/datafaker/service/FakeValues.java index c4c2864fe..6992b1061 100644 --- a/src/main/java/net/datafaker/service/FakeValues.java +++ b/src/main/java/net/datafaker/service/FakeValues.java @@ -9,6 +9,7 @@ import java.util.Locale; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.logging.Level; @@ -32,7 +33,7 @@ private FakeValues(FakeValuesContext fakeValuesContext) { } finally { lock.unlock(); } - fakeValuesContext.setPath(values == null || values.isEmpty() ? null : values.keySet().iterator().next()); + fakeValuesContext.setPath(values == null || values.isEmpty() ? null : values.keySet()); } } @@ -186,10 +187,10 @@ private Map readFromStream(InputStream stream) { } boolean supportsPath(String path) { - return fakeValuesContext.getPath().equals(path); + return fakeValuesContext.getPath().contains(path); } - String getPath() { + Set getPathes() { return fakeValuesContext.getPath(); } diff --git a/src/main/java/net/datafaker/service/FakeValuesContext.java b/src/main/java/net/datafaker/service/FakeValuesContext.java index d03bee750..0abff7f23 100644 --- a/src/main/java/net/datafaker/service/FakeValuesContext.java +++ b/src/main/java/net/datafaker/service/FakeValuesContext.java @@ -6,12 +6,13 @@ import java.net.URL; import java.util.Locale; import java.util.Objects; +import java.util.Set; class FakeValuesContext { private final SingletonLocale sLocale; private final String filename; private final int filenameHashCode; - private String path; + private Set pathes; private final URL url; private final int urlHashCode; @@ -30,7 +31,7 @@ private FakeValuesContext(Locale locale, String filename, String path) { private FakeValuesContext(Locale locale, String filename, String path, URL url) { this.sLocale = SingletonLocale.get(locale); this.filename = filename; - this.path = path; + this.pathes = path == null ? null : Set.of(path); this.url = url; this.filenameHashCode = filename == null ? 0 : filename.hashCode(); try { @@ -69,8 +70,10 @@ private static String getFilename(Locale locale) { * This addresses that unfortunate condition. */ private static String language(Locale l) { - if ("iw".equals(l.getLanguage())) { - return "he"; + switch (l.getLanguage()) { + case "iw": return "he"; + case "in": return "id"; + case "ji": return "yi"; } return l.getLanguage(); } @@ -83,12 +86,12 @@ public String getFilename() { return filename; } - public String getPath() { - return path; + public Set getPath() { + return pathes; } - public void setPath(String path) { - this.path = path; + public void setPath(Set pathes) { + this.pathes = pathes; } public URL getUrl() { @@ -104,7 +107,7 @@ public boolean equals(Object o) { if (!Objects.equals(sLocale, that.sLocale)) return false; if (!Objects.equals(filename, that.filename)) return false; - if (!Objects.equals(path, that.path)) return false; + if (!Objects.equals(pathes, that.pathes)) return false; return Objects.equals(url, that.url); } @@ -112,7 +115,7 @@ public boolean equals(Object o) { public int hashCode() { int result = sLocale == null ? 0 : sLocale.hashCode(); result = 31 * result + filenameHashCode; - result = 31 * result + (path == null ? 0 : path.hashCode()); + result = 31 * result + (pathes == null ? 0 : pathes.hashCode()); result = 31 * result + urlHashCode; return result; } @@ -122,7 +125,7 @@ public String toString() { return "FakeValuesContext{" + "sLocale=" + sLocale + ", filename='" + filename + '\'' + - ", path='" + path + '\'' + + ", path='" + pathes + '\'' + ", url=" + url + '}'; } diff --git a/src/main/java/net/datafaker/service/FakeValuesGrouping.java b/src/main/java/net/datafaker/service/FakeValuesGrouping.java index 619a2f05b..2d70da919 100644 --- a/src/main/java/net/datafaker/service/FakeValuesGrouping.java +++ b/src/main/java/net/datafaker/service/FakeValuesGrouping.java @@ -21,8 +21,9 @@ public class FakeValuesGrouping implements FakeValuesInterface { public void add(FakeValuesInterface fakeValue) { if (fakeValue instanceof FakeValues) { - fakeValues.computeIfAbsent(((FakeValues) fakeValue).getPath(), key -> new HashSet<>()) - .add(fakeValue); + ((FakeValues) fakeValue).getPathes().forEach(p -> + fakeValues.computeIfAbsent(p, key -> new HashSet<>()) + .add(fakeValue)); } else if (fakeValue instanceof FakeValuesGrouping) { fakeValues.putAll(((FakeValuesGrouping) fakeValue).fakeValues); } else { diff --git a/src/main/java/net/datafaker/service/FakeValuesService.java b/src/main/java/net/datafaker/service/FakeValuesService.java index daafc8dd2..23310e4ab 100644 --- a/src/main/java/net/datafaker/service/FakeValuesService.java +++ b/src/main/java/net/datafaker/service/FakeValuesService.java @@ -2,6 +2,7 @@ import net.datafaker.internal.helper.COWMap; import net.datafaker.internal.helper.SingletonLocale; +import net.datafaker.internal.helper.WordUtils; import net.datafaker.providers.base.AbstractProvider; import net.datafaker.providers.base.Address; import net.datafaker.providers.base.BaseFaker; @@ -221,6 +222,7 @@ public Object fetchObject(String key, FakerContext context) { String[] path = split(key); SingletonLocale local2Add = null; + path[0] = path[0].toLowerCase(Locale.ROOT); for (SingletonLocale sLocale : localeChain) { Object currentValue = fakeValuesInterfaceMap.get(sLocale); for (int p = 0; currentValue != null && p < path.length; p++) { @@ -240,9 +242,83 @@ public Object fetchObject(String key, FakerContext context) { if (local2Add != null) { key2fetchedObject.updateNestedValue(local2Add, MAP_STRING_OBJECT_SUPPLIER, key, result); } + if (path.length > 0 && result instanceof List) { + List list = (List) result; + for (int i = 0; i < list.size(); i++) { + Object item = list.get(i); + if (!(item instanceof String)) { + break; + } + String itemStr = (String) item; + final int itemStrLength = itemStr.length(); + if (itemStrLength < 2) { + break; + } + int j = 0; + StringBuilder sb = null; + int start = 0; + while (j < itemStrLength) { + char c; + while (j < itemStrLength - 2 && ((c = itemStr.charAt(j)) != '#' || itemStr.charAt(j + 1) != '{')) j++; + int startWord = j + 2; + boolean letterOrDigitOnly = true; + j = startWord; + while (j < itemStrLength && (c = itemStr.charAt(j)) != '}') { + letterOrDigitOnly &= Character.isLetter(c) || Character.isDigit(c) || c == '_'; + j++; + } + if (start < itemStrLength&& startWord < itemStrLength && letterOrDigitOnly) { + if (sb == null) { + sb = new StringBuilder(); + } + sb.append(itemStr, start, startWord); + sb.append(WordUtils.capitalize(path[0]) + "." + toJavaNames(itemStr.substring(startWord, j), true) + "}"); + start = j + 1; + } + } + if (sb != null) { + if (start < itemStrLength) { + sb.append(itemStr, start, itemStrLength); + } + list.set(i, sb.toString()); + } + } + } return result; } + + private static String toJavaNames(String string, boolean isMethod) { + final int length; + if (string == null || (length = string.length()) == 0) { + return string; + } + int cnt = 0; + for (int i = 0; i < length; i++) { + if (string.charAt(i) == '_') { + cnt++; + } + } + if (cnt == 0 && (Character.isUpperCase(string.charAt(0)) && !isMethod || isMethod && Character.isLowerCase(string.charAt(0)))) return string; + final char[] res = new char[length - cnt]; + int pos = 0; + for (int i = 0; i < length; i++) { + char c = string.charAt(i); + if (i == 0 && Character.isLetter(c)) { + res[pos++] = isMethod ? Character.toLowerCase(c) : Character.toUpperCase(c); + } else if (c == '_') { + final char next = string.charAt(i + 1); + if (i < length - 1 && Character.isLetter(next)) { + res[pos++] = Character.toUpperCase(next); + i++; + } + } else { + res[pos++] = c; + } + } + return new String(res); + } + private String[] split(String string) { String[] result = KEY_2_SPLITTED_KEY.get(string); if (result != null) { diff --git a/src/main/resources/en/internet.yml b/src/main/resources/en/internet.yml index 474b41e53..4db9b8fbf 100644 --- a/src/main/resources/en/internet.yml +++ b/src/main/resources/en/internet.yml @@ -15,7 +15,7 @@ en: - "Visit #{Country.name}" - "Want to play a game?" - "Since we can’t all win the lottery..." - - "#{FamousLastWords}" + - "#{FamousLastWords.lastWords}" - "Happy Holidays From #{Company.name}" domain_suffix: - "com" diff --git a/src/main/resources/in-ID.yml b/src/main/resources/id-ID.yml similarity index 99% rename from src/main/resources/in-ID.yml rename to src/main/resources/id-ID.yml index d2b452921..598d9813f 100644 --- a/src/main/resources/in-ID.yml +++ b/src/main/resources/id-ID.yml @@ -1,9 +1,9 @@ -in-ID: +id-ID: faker: name: first_name: [Aan, Adi, Aditya, Agus, Ahmad, Aji, Andi, Anita, Anton, Arif, Arya, Aulia, Bagas, Bagus, Bambang, Bayu, Beni, Bima, Budi, Chandra, Choirul, Citra, Danang, David, Dea, Deni, Derry, Desi, Devi, Diah, Dimas, Dina, Dion, Edi, Edwin, Effendi, Endang, Erika, Ferdian, Fika, Galih, Gita, Gugun, Hamdan, Hengky, Heni, Heri, Heru, Imam, Iman, Indah, Indra, Iwan, Jaka, Jaya, Kartika, Kartini, Kemal, Khrisna, Kiki, Komar, Lely, Lia, Liana, Lidya, Lisa, Mahesa, Martin, Merry, Muhammad, Niko, Nina, Nisa, Noval, Oki, Okta, Olivia, Pandu, Popi, Pradipta, Prily, Prima, Putri, Qomar, Qorri, Raditya, Rahmat, Roni, Rosa, Rudi, Ruslan, Salim, Sandi, Setya, Sigit, Slamet, Tiara, Tito, Tomi, Toni, Topan, Tri, Udin, Umar, Unang, Valentinus, Vanya, Vicky, Victor, Vira, Vivi, Wahyu, Wawan, Wendy, Wira, Wisnu, Yahya, Yanuar, Yoga, Yossi, Yudha, Yudhistira, Yudi, Zaenal] last_name: [Abdullah, Adriansyah, Alamsyah, Andrianto, Ardianto, Aristianto, Armansyah, Atmadja, Basri, Bimantara, Bintara, Budiarto, Budiman, Budiono, Cahyadi, Cahyono, Candrawijaya, Ciputra, Daniawan, Darmadi, Darmawan, Dinata, Djunaedi, Dwiantoro, Dzulfikar, Erik, Erlangga, Fachri, Fachriawan, Fauzi, Febriansyah, Ferdian, Ferianto, Firmansyah, Gautama, Ginanjar, Ginting, Gondokusumo, Gozali, Gunajaya, Gunardi, Hadiwijaya, Handaru, Harjono, Hartanto, Hartono, Haryanto, Hendrawinata, Hermawan, Idris, Ikhsan, Ilham, Indragiri, Indrajaya, Ismail, Iswanto, Januar, Jayadi, Jayadinata, Jayakusuma, Junaedi, Kartawijaya, Komarudin, Kurniadi, Kurnianto, Kurniawan, Kusuma, Kusumawardhana, Lazuardi, Lesmana, Linggar, Listiyono, Listyawan, Madjid, Mahendra, Maheswara, Mardiansyah, Mardianto, Marzuki, Maulana, Nababan, Nainggolan, Nasrudin, Novianto, Nugraha, Nurdiansyah, Oktara, Oktavian, Ongky, Pahlevi, Pradhana, Pradipta, Pranata, Prawira, Pribadi, Qodir, Riansyah, Rianto, Riyadi, Rudianto, Rusli, Rusmana, Rustam, Sanjaya, Santoso, Sapta, Saputra, Saragih, Satria, Setiawan, Sugianto, Sugiarto, Suhendra, Suryatama, Taslim, Thamrin, Tjahjadi, Triwijaya, Umbara, Unggul, Utama, Virgiawan, Waluyo, Wardhana, Wicaksono, Wijanarko, Wijaya, Winardi, Winarta, Wirawan, Yudhanto, Yudhistira, Yudhiswara, Yulianto, Zaenal, Zaini, Zulfikara, Zulfikri, Zulkarnain] - name: "#{first_name} #{last_name}" + name: "#{Name.first_name} #{Name.last_name}" address: city_name: [Aceh Barat, Aceh Barat Daya, Aceh Besar, Aceh Jaya, Aceh Selatan, Aceh Singkil, Aceh Tamiang, Aceh Tengah, Aceh Tenggara, Aceh Timur, Aceh Utara, Agam, Alor, Ambon, Asahan, Asmat, Badung, Balangan, Balikpapan, Banda Aceh, Bandar Lampung, Bandung, Bandung Barat, Banggai, Banggai Kepulauan, Bangka, Bangka Barat, Bangka Selatan, Bangka Tengah, Bangkalan, Bangli, Banjar, Banjar Baru, Banjarmasin, Banjarnegara, Bantaeng, Bantul, Banyu Asin, Banyumas, Banyuwangi, Barito Kuala, Barito Selatan, Barito Timur, Barito Utara, Barru, Baru, Batam, Batang, Batang Hari, Batu, Batu Bara, Baubau, Bekasi, Belitung, Belitung Timur, Belu, Bener Meriah, Bengkalis, Bengkayang, Bengkulu, Bengkulu Selatan, Bengkulu Tengah, Bengkulu Utara, Berau, Biak Numfor, Bima, Binjai, Bintan, Bireuen, Bitung, Blitar, Blora, Boalemo, Bogor, Bojonegoro, Bolaang Mongondow, Bolaang Mongondow Selatan, Bolaang Mongondow Timur, Bolaang Mongondow Utara, Bombana, Bondowoso, Bone, Bone Bolango, Bontang, Boven Digoel, Boyolali, Brebes, Bukittinggi, Buleleng, Bulukumba, Bulungan, Bungo, Buol, Buru, Buru Selatan, Buton, Buton Utara, Ciamis, Cianjur, Cilacap, Cilegon, Cimahi, Cirebon, Dairi, Deiyai, Deli Serdang, Demak, Denpasar, Depok, Dharmasraya, Dogiyai, Dompu, Donggala, Dumai, Empat Lawang, Ende, Enrekang, Fakfak, Flores Timur, Garut, Gayo Lues, Gianyar, Gorontalo, Gorontalo Utara, Gowa, Gresik, Grobogan, Gunung Kidul, Gunung Mas, Gunungsitoli, Halmahera Barat, Halmahera Selatan, Halmahera Tengah, Halmahera Timur, Halmahera Utara, Hulu Sungai Selatan, Hulu Sungai Tengah, Hulu Sungai Utara, Humbang Hasundutan, Indragiri Hilir, Indragiri Hulu, Indramayu, Intan Jaya, Jakarta Barat, Jakarta Pusat, Jakarta Selatan, Jakarta Timur, Jakarta Utara, Jambi, Jayapura, Jayawijaya, Jember, Jembrana, Jeneponto, Jepara, Jombang, Kaimana, Kampar, Kapuas, Kapuas Hulu, Karang Asem, Karanganyar, Karawang, Karimun, Karo, Katingan, Kaur, Kayong Utara, Kebumen, Kediri, Keerom, Kendal, Kendari, Kepahiang, Kepulauan Anambas, Kepulauan Aru, Kepulauan Mentawai, Kepulauan Meranti, Kepulauan Sangihe, Kepulauan Selayar, Kepulauan Seribu, Kepulauan Sula, Kepulauan Talaud, Kepulauan Yapen, Kerinci, Ketapang, Klaten, Klungkung, Kolaka, Kolaka Utara, Konawe, Konawe Selatan, Konawe Utara, Kotamobagu, Kotawaringin Barat, Kotawaringin Timur, Kuantan Singingi, Kubu Raya, Kudus, Kulon Progo, Kuningan, Kupang, Kutai Barat, Kutai Kartanegara, Kutai Timur, Labuhan Batu, Labuhan Batu Selatan, Labuhan Batu Utara, Lahat, Lamandau, Lamongan, Lampung Barat, Lampung Selatan, Lampung Tengah, Lampung Timur, Lampung Utara, Landak, Langkat, Langsa, Lanny Jaya, Lebak, Lebong, Lembata, Lhokseumawe, Lima Puluh Kota, Lingga, Lombok Barat, Lombok Tengah, Lombok Timur, Lombok Utara, Lubuklinggau, Lumajang, Luwu, Luwu Timur, Luwu Utara, Madiun, Magelang, Magetan, Majalengka, Majene, Makassar, Malang, Malinau, Maluku Barat Daya, Maluku Tengah, Maluku Tenggara, Maluku Tenggara Barat, Mamasa, Mamberamo Raya, Mamberamo Tengah, Mamuju, Mamuju Utara, Manado, Mandailing Natal, Manggarai, Manggarai Barat, Manggarai Timur, Manokwari, Mappi, Maros, Mataram, Maybrat, Medan, Melawi, Merangin, Merauke, Mesuji, Metro, Mimika, Minahasa, Minahasa Selatan, Minahasa Tenggara, Minahasa Utara, Mojokerto, Morowali, Muara Enim, Muaro Jambi, Mukomuko, Muna, Murung Raya, Musi Banyuasin, Musi Rawas, Nabire, Nagan Raya, Nagekeo, Natuna, Nduga, Ngada, Nganjuk, Ngawi, Nias, Nias Barat, Nias Selatan, Nias Utara, Nunukan, Ogan Ilir, Ogan Komering Ilir, Ogan Komering Ulu, Ogan Komering Ulu Selatan, Ogan Komering Ulu Timur, Pacitan, Padang, Padang Lawas, Padang Lawas Utara, Padang Panjang, Padang Pariaman, Padangsidimpuan, Pagar Alam, Pakpak Bharat, Palangka Raya, Palembang, Palopo, Palu, Pamekasan, Pandeglang, Pangandaran, Pangkajene Dan Kepulauan, Pangkal Pinang, Paniai, Parepare, Pariaman, Parigi Moutong, Pasaman, Pasaman Barat, Paser, Pasuruan, Pati, Payakumbuh, Pegunungan Bintang, Pekalongan, Pekanbaru, Pelalawan, Pemalang, Pematang Siantar, Penajam Paser Utara, Pesawaran, Pesisir Barat, Pesisir Selatan, Pidie, Pidie Jaya, Pinrang, Pohuwato, Polewali Mandar, Ponorogo, Pontianak, Poso, Prabumulih, Pringsewu, Probolinggo, Pulang Pisau, Pulau Morotai, Puncak, Puncak Jaya, Purbalingga, Purwakarta, Purworejo, Raja Ampat, Rejang Lebong, Rembang, Rokan Hilir, Rokan Hulu, Rote Ndao, Sabang, Sabu Raijua, Salatiga, Samarinda, Sambas, Samosir, Sampang, Sanggau, Sarmi, Sarolangun, Sawah Lunto, Sekadau, Seluma, Semarang, Seram Bagian Barat, Seram Bagian Timur, Serang, Serdang Bedagai, Seruyan, Siak, Siau Tagulandang Biaro, Sibolga, Sidenreng Rappang, Sidoarjo, Sigi, Sijunjung, Sikka, Simalungun, Simeulue, Singkawang, Sinjai, Sintang, Situbondo, Sleman, Solok, Solok Selatan, Soppeng, Sorong, Sorong Selatan, Sragen, Subang, Subulussalam, Sukabumi, Sukamara, Sukoharjo, Sumba Barat, Sumba Barat Daya, Sumba Tengah, Sumba Timur, Sumbawa, Sumbawa Barat, Sumedang, Sumenep, Sungai Penuh, Supiori, Surabaya, Surakarta, Tabalong, Tabanan, Takalar, Tambrauw, Tana Tidung, Tana Toraja, Tanah Bumbu, Tanah Datar, Tanah Laut, Tangerang, Tangerang Selatan, Tanggamus, Tanjung Balai, Tanjung Jabung Barat, Tanjung Jabung Timur, Tanjung Pinang, Tapanuli Selatan, Tapanuli Tengah, Tapanuli Utara, Tapin, Tarakan, Tasikmalaya, Tebing Tinggi, Tebo, Tegal, Teluk Bintuni, Teluk Wondama, Temanggung, Ternate, Tidore Kepulauan, Timor Tengah Selatan, Timor Tengah Utara, Toba Samosir, Tojo Una-una, Toli-toli, Tolikara, Tomohon, Toraja Utara, Trenggalek, Tual, Tuban, Tulang Bawang Barat, Tulangbawang, Tulungagung, Wajo, Wakatobi, Waropen, Way Kanan, Wonogiri, Wonosobo, Yahukimo, Yalimo, Yogyakarta] city: diff --git a/src/main/resources/id.yml b/src/main/resources/id.yml index 1b1871d2a..2f91e8e2a 100644 --- a/src/main/resources/id.yml +++ b/src/main/resources/id.yml @@ -3,9 +3,9 @@ id: name: first_name: [Aan, Adi, Aditya, Agus, Ahmad, Aji, Andi, Anita, Anton, Arif, Arya, Aulia, Bagas, Bagus, Bambang, Bayu, Beni, Bima, Budi, Chandra, Choirul, Citra, Danang, David, Dea, Deni, Derry, Desi, Devi, Diah, Dimas, Dina, Dion, Edi, Edwin, Effendi, Endang, Erika, Ferdian, Fika, Galih, Gita, Gugun, Hamdan, Hengky, Heni, Heri, Heru, Imam, Iman, Indah, Indra, Iwan, Jaka, Jaya, Kartika, Kartini, Kemal, Khrisna, Kiki, Komar, Lely, Lia, Liana, Lidya, Lisa, Mahesa, Martin, Merry, Muhammad, Niko, Nina, Nisa, Noval, Oki, Okta, Olivia, Pandu, Popi, Pradipta, Prily, Prima, Putri, Qomar, Qorri, Raditya, Rahmat, Roni, Rosa, Rudi, Ruslan, Salim, Sandi, Setya, Sigit, Slamet, Tiara, Tito, Tomi, Toni, Topan, Tri, Udin, Umar, Unang, Valentinus, Vanya, Vicky, Victor, Vira, Vivi, Wahyu, Wawan, Wendy, Wira, Wisnu, Yahya, Yanuar, Yoga, Yossi, Yudha, Yudhistira, Yudi, Zaenal] last_name: [Abdullah, Adriansyah, Alamsyah, Andrianto, Ardianto, Aristianto, Armansyah, Atmadja, Basri, Bimantara, Bintara, Budiarto, Budiman, Budiono, Cahyadi, Cahyono, Candrawijaya, Ciputra, Daniawan, Darmadi, Darmawan, Dinata, Djunaedi, Dwiantoro, Dzulfikar, Erik, Erlangga, Fachri, Fachriawan, Fauzi, Febriansyah, Ferdian, Ferianto, Firmansyah, Gautama, Ginanjar, Ginting, Gondokusumo, Gozali, Gunajaya, Gunardi, Hadiwijaya, Handaru, Harjono, Hartanto, Hartono, Haryanto, Hendrawinata, Hermawan, Idris, Ikhsan, Ilham, Indragiri, Indrajaya, Ismail, Iswanto, Januar, Jayadi, Jayadinata, Jayakusuma, Junaedi, Kartawijaya, Komarudin, Kurniadi, Kurnianto, Kurniawan, Kusuma, Kusumawardhana, Lazuardi, Lesmana, Linggar, Listiyono, Listyawan, Madjid, Mahendra, Maheswara, Mardiansyah, Mardianto, Marzuki, Maulana, Nababan, Nainggolan, Nasrudin, Novianto, Nugraha, Nurdiansyah, Oktara, Oktavian, Ongky, Pahlevi, Pradhana, Pradipta, Pranata, Prawira, Pribadi, Qodir, Riansyah, Rianto, Riyadi, Rudianto, Rusli, Rusmana, Rustam, Sanjaya, Santoso, Sapta, Saputra, Saragih, Satria, Setiawan, Sugianto, Sugiarto, Suhendra, Suryatama, Taslim, Thamrin, Tjahjadi, Triwijaya, Umbara, Unggul, Utama, Virgiawan, Waluyo, Wardhana, Wicaksono, Wijanarko, Wijaya, Winardi, Winarta, Wirawan, Yudhanto, Yudhistira, Yudhiswara, Yulianto, Zaenal, Zaini, Zulfikara, Zulfikri, Zulkarnain] - name: "#{first_name} #{last_name}" + name: "#{Name.first_name} #{Name.last_name}" name_with_middle: - - "#{first_name} #{last_name} #{last_name}" + - "#{Name.first_name} #{Name.last_name} #{Name.last_name}" address: city_name: [Aceh Barat, Aceh Barat Daya, Aceh Besar, Aceh Jaya, Aceh Selatan, Aceh Singkil, Aceh Tamiang, Aceh Tengah, Aceh Tenggara, Aceh Timur, Aceh Utara, Agam, Alor, Ambon, Asahan, Asmat, Badung, Balangan, Balikpapan, Banda Aceh, Bandar Lampung, Bandung, Bandung Barat, Banggai, Banggai Kepulauan, Bangka, Bangka Barat, Bangka Selatan, Bangka Tengah, Bangkalan, Bangli, Banjar, Banjar Baru, Banjarmasin, Banjarnegara, Bantaeng, Bantul, Banyu Asin, Banyumas, Banyuwangi, Barito Kuala, Barito Selatan, Barito Timur, Barito Utara, Barru, Baru, Batam, Batang, Batang Hari, Batu, Batu Bara, Baubau, Bekasi, Belitung, Belitung Timur, Belu, Bener Meriah, Bengkalis, Bengkayang, Bengkulu, Bengkulu Selatan, Bengkulu Tengah, Bengkulu Utara, Berau, Biak Numfor, Bima, Binjai, Bintan, Bireuen, Bitung, Blitar, Blora, Boalemo, Bogor, Bojonegoro, Bolaang Mongondow, Bolaang Mongondow Selatan, Bolaang Mongondow Timur, Bolaang Mongondow Utara, Bombana, Bondowoso, Bone, Bone Bolango, Bontang, Boven Digoel, Boyolali, Brebes, Bukittinggi, Buleleng, Bulukumba, Bulungan, Bungo, Buol, Buru, Buru Selatan, Buton, Buton Utara, Ciamis, Cianjur, Cilacap, Cilegon, Cimahi, Cirebon, Dairi, Deiyai, Deli Serdang, Demak, Denpasar, Depok, Dharmasraya, Dogiyai, Dompu, Donggala, Dumai, Empat Lawang, Ende, Enrekang, Fakfak, Flores Timur, Garut, Gayo Lues, Gianyar, Gorontalo, Gorontalo Utara, Gowa, Gresik, Grobogan, Gunung Kidul, Gunung Mas, Gunungsitoli, Halmahera Barat, Halmahera Selatan, Halmahera Tengah, Halmahera Timur, Halmahera Utara, Hulu Sungai Selatan, Hulu Sungai Tengah, Hulu Sungai Utara, Humbang Hasundutan, Indragiri Hilir, Indragiri Hulu, Indramayu, Intan Jaya, Jakarta Barat, Jakarta Pusat, Jakarta Selatan, Jakarta Timur, Jakarta Utara, Jambi, Jayapura, Jayawijaya, Jember, Jembrana, Jeneponto, Jepara, Jombang, Kaimana, Kampar, Kapuas, Kapuas Hulu, Karang Asem, Karanganyar, Karawang, Karimun, Karo, Katingan, Kaur, Kayong Utara, Kebumen, Kediri, Keerom, Kendal, Kendari, Kepahiang, Kepulauan Anambas, Kepulauan Aru, Kepulauan Mentawai, Kepulauan Meranti, Kepulauan Sangihe, Kepulauan Selayar, Kepulauan Seribu, Kepulauan Sula, Kepulauan Talaud, Kepulauan Yapen, Kerinci, Ketapang, Klaten, Klungkung, Kolaka, Kolaka Utara, Konawe, Konawe Selatan, Konawe Utara, Kotamobagu, Kotawaringin Barat, Kotawaringin Timur, Kuantan Singingi, Kubu Raya, Kudus, Kulon Progo, Kuningan, Kupang, Kutai Barat, Kutai Kartanegara, Kutai Timur, Labuhan Batu, Labuhan Batu Selatan, Labuhan Batu Utara, Lahat, Lamandau, Lamongan, Lampung Barat, Lampung Selatan, Lampung Tengah, Lampung Timur, Lampung Utara, Landak, Langkat, Langsa, Lanny Jaya, Lebak, Lebong, Lembata, Lhokseumawe, Lima Puluh Kota, Lingga, Lombok Barat, Lombok Tengah, Lombok Timur, Lombok Utara, Lubuklinggau, Lumajang, Luwu, Luwu Timur, Luwu Utara, Madiun, Magelang, Magetan, Majalengka, Majene, Makassar, Malang, Malinau, Maluku Barat Daya, Maluku Tengah, Maluku Tenggara, Maluku Tenggara Barat, Mamasa, Mamberamo Raya, Mamberamo Tengah, Mamuju, Mamuju Utara, Manado, Mandailing Natal, Manggarai, Manggarai Barat, Manggarai Timur, Manokwari, Mappi, Maros, Mataram, Maybrat, Medan, Melawi, Merangin, Merauke, Mesuji, Metro, Mimika, Minahasa, Minahasa Selatan, Minahasa Tenggara, Minahasa Utara, Mojokerto, Morowali, Muara Enim, Muaro Jambi, Mukomuko, Muna, Murung Raya, Musi Banyuasin, Musi Rawas, Nabire, Nagan Raya, Nagekeo, Natuna, Nduga, Ngada, Nganjuk, Ngawi, Nias, Nias Barat, Nias Selatan, Nias Utara, Nunukan, Ogan Ilir, Ogan Komering Ilir, Ogan Komering Ulu, Ogan Komering Ulu Selatan, Ogan Komering Ulu Timur, Pacitan, Padang, Padang Lawas, Padang Lawas Utara, Padang Panjang, Padang Pariaman, Padangsidimpuan, Pagar Alam, Pakpak Bharat, Palangka Raya, Palembang, Palopo, Palu, Pamekasan, Pandeglang, Pangandaran, Pangkajene Dan Kepulauan, Pangkal Pinang, Paniai, Parepare, Pariaman, Parigi Moutong, Pasaman, Pasaman Barat, Paser, Pasuruan, Pati, Payakumbuh, Pegunungan Bintang, Pekalongan, Pekanbaru, Pelalawan, Pemalang, Pematang Siantar, Penajam Paser Utara, Pesawaran, Pesisir Barat, Pesisir Selatan, Pidie, Pidie Jaya, Pinrang, Pohuwato, Polewali Mandar, Ponorogo, Pontianak, Poso, Prabumulih, Pringsewu, Probolinggo, Pulang Pisau, Pulau Morotai, Puncak, Puncak Jaya, Purbalingga, Purwakarta, Purworejo, Raja Ampat, Rejang Lebong, Rembang, Rokan Hilir, Rokan Hulu, Rote Ndao, Sabang, Sabu Raijua, Salatiga, Samarinda, Sambas, Samosir, Sampang, Sanggau, Sarmi, Sarolangun, Sawah Lunto, Sekadau, Seluma, Semarang, Seram Bagian Barat, Seram Bagian Timur, Serang, Serdang Bedagai, Seruyan, Siak, Siau Tagulandang Biaro, Sibolga, Sidenreng Rappang, Sidoarjo, Sigi, Sijunjung, Sikka, Simalungun, Simeulue, Singkawang, Sinjai, Sintang, Situbondo, Sleman, Solok, Solok Selatan, Soppeng, Sorong, Sorong Selatan, Sragen, Subang, Subulussalam, Sukabumi, Sukamara, Sukoharjo, Sumba Barat, Sumba Barat Daya, Sumba Tengah, Sumba Timur, Sumbawa, Sumbawa Barat, Sumedang, Sumenep, Sungai Penuh, Supiori, Surabaya, Surakarta, Tabalong, Tabanan, Takalar, Tambrauw, Tana Tidung, Tana Toraja, Tanah Bumbu, Tanah Datar, Tanah Laut, Tangerang, Tangerang Selatan, Tanggamus, Tanjung Balai, Tanjung Jabung Barat, Tanjung Jabung Timur, Tanjung Pinang, Tapanuli Selatan, Tapanuli Tengah, Tapanuli Utara, Tapin, Tarakan, Tasikmalaya, Tebing Tinggi, Tebo, Tegal, Teluk Bintuni, Teluk Wondama, Temanggung, Ternate, Tidore Kepulauan, Timor Tengah Selatan, Timor Tengah Utara, Toba Samosir, Tojo Una-una, Toli-toli, Tolikara, Tomohon, Toraja Utara, Trenggalek, Tual, Tuban, Tulang Bawang Barat, Tulangbawang, Tulungagung, Wajo, Wakatobi, Waropen, Way Kanan, Wonogiri, Wonosobo, Yahukimo, Yalimo, Yogyakarta] city: diff --git a/src/test/java/net/datafaker/Issue1178Test.java b/src/test/java/net/datafaker/Issue1178Test.java new file mode 100644 index 000000000..4879d28dd --- /dev/null +++ b/src/test/java/net/datafaker/Issue1178Test.java @@ -0,0 +1,59 @@ +package net.datafaker; + +import org.junit.jupiter.api.Test; + +import java.util.Locale; + +import static org.assertj.core.api.Assertions.assertThat; + +public class Issue1178Test { + + @Test + void testExpressionEnglishFails() { + Faker faker = new Faker(Locale.ENGLISH); + assertThat(faker.expression("#{name.first_name}")).isNotBlank(); + } + + @Test + void testExpressionFails() { + Faker faker = new Faker(); + assertThat(faker.expression("#{name.first_name}")).isNotBlank(); + } + + @Test + void testExpressionUsFails() { + Faker faker = new Faker(new Locale("en", "US")); + assertThat(faker.expression("#{name.first_name}")).isNotBlank(); + } + + @Test + void testExpressionAUWorks() { + Faker faker = new Faker(new Locale("en", "AU")); + assertThat(faker.expression("#{name.first_name}")).isNotBlank(); + } + + @Test + void testExpressionNLWorks() { + Faker faker = new Faker(new Locale("nl", "nl")); + assertThat(faker.expression("#{name.first_name}")).isNotBlank(); + } + + + @Test + void testExpressionNLWithMiddleWorks() { + Faker faker = new Faker(new Locale("nl", "nl")); + assertThat(faker.expression("#{name.name_with_middle}")).isNotBlank(); + } + + @Test + void testExpressionNLWithCity() { + Faker faker = new Faker(); + assertThat(faker.expression("#{address.city}")).isNotBlank(); + } + + @Test + void testExpressionNLWithFullAddress() { + Faker faker = new Faker(new Locale("nl", "nl")); + assertThat(faker.expression("#{address.full_address}")).isNotBlank(); + } +} diff --git a/src/test/java/net/datafaker/integration/FakerIntegrationTest.java b/src/test/java/net/datafaker/integration/FakerIntegrationTest.java index 1b0622477..106ddbc04 100644 --- a/src/test/java/net/datafaker/integration/FakerIntegrationTest.java +++ b/src/test/java/net/datafaker/integration/FakerIntegrationTest.java @@ -2,6 +2,7 @@ import net.datafaker.providers.base.AbstractProvider; import net.datafaker.providers.base.Address; +import net.datafaker.providers.base.App; import net.datafaker.providers.base.BaseFaker; import net.datafaker.Faker; import net.datafaker.providers.base.Name; @@ -50,6 +51,8 @@ class FakerIntegrationTest { exceptions.put(new Locale("es", "mx"), SkippedMethods.of(Address.class, "cityPrefix", "citySuffix")); exceptions.put(new Locale("pt"), SkippedMethods.of(Address.class, "cityPrefix", "citySuffix")); exceptions.put(new Locale("uk"), SkippedMethods.of(Address.class, "cityPrefix", "citySuffix", "stateAbbr", "streetSuffix")); + exceptions.put(new Locale("id"), SkippedMethods.of(App.class, "author")); + exceptions.put(new Locale("id", "ID"), SkippedMethods.of(App.class, "author")); exceptions.put(new Locale("pt-BR"), SkippedMethods.of(Address.class, "cityPrefix", "citySuffix")); exceptions.put(new Locale("pt-br"), SkippedMethods.of(Address.class, "cityPrefix", "citySuffix")); exceptions.put(new Locale("Pt_br"), SkippedMethods.of(Address.class, "cityPrefix", "citySuffix")); @@ -112,7 +115,12 @@ private void testAllMethodsThatReturnStringsActuallyReturnStrings(Object object) if (isExcepted(object, method, locale)) { continue; } - final Object returnValue = method.invoke(object); + final Object returnValue; + try { + returnValue = method.invoke(object); + } catch (Exception e) { + throw new RuntimeException("Test for method " + method + " and object " + object + " was failed for locale " + locale, e); + } assertThat(returnValue).as("For method " + object.getClass() + "#" + method.getName() + "value is '" + returnValue + "'").isInstanceOf(String.class); final String returnValueAsString = (String) returnValue; assertThat(returnValueAsString).as("For method " + object.getClass() + "#" + method.getName()).isNotEmpty(); diff --git a/src/test/java/net/datafaker/providers/base/NameTest.java b/src/test/java/net/datafaker/providers/base/NameTest.java index 5d6759253..80120150c 100644 --- a/src/test/java/net/datafaker/providers/base/NameTest.java +++ b/src/test/java/net/datafaker/providers/base/NameTest.java @@ -84,4 +84,9 @@ void testTitle() { assertThat(name.title()).matches("(\\w+\\.?( )?){3}"); } + @Test + void test() { + var faker = new BaseFaker(new Locale("id")); + System.out.println(faker.name().name()); + } } diff --git a/src/test/java/net/datafaker/providers/base/PhoneNumberTest.java b/src/test/java/net/datafaker/providers/base/PhoneNumberTest.java index 07309544c..f1d35f69d 100644 --- a/src/test/java/net/datafaker/providers/base/PhoneNumberTest.java +++ b/src/test/java/net/datafaker/providers/base/PhoneNumberTest.java @@ -141,7 +141,6 @@ private static Stream generateLanguageAndRegionOfLocales() { Arguments.of(new Locale("hr"), "HR"), Arguments.of(new Locale("hy"), "AM"), Arguments.of(new Locale("id"), "ID"), - Arguments.of(new Locale("in", "ID"), "ID"), Arguments.of(Locale.ENGLISH, "US"), Arguments.of(new Locale("nb", "NO"), "NO"), Arguments.of(new Locale("no", "NO"), "NO"), diff --git a/src/test/java/net/datafaker/service/FakeValuesServiceTest.java b/src/test/java/net/datafaker/service/FakeValuesServiceTest.java index 2a869684d..18080d313 100644 --- a/src/test/java/net/datafaker/service/FakeValuesServiceTest.java +++ b/src/test/java/net/datafaker/service/FakeValuesServiceTest.java @@ -2,8 +2,9 @@ import net.datafaker.AbstractFakerTest; import net.datafaker.internal.helper.SingletonLocale; +import net.datafaker.providers.base.AbstractProvider; import net.datafaker.providers.base.BaseFaker; -import net.datafaker.providers.base.Superhero; +import net.datafaker.providers.base.BaseProviders; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.Test; @@ -16,6 +17,7 @@ import org.mockito.Spy; import java.io.IOException; +import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -149,60 +151,33 @@ void resolveKeyToPropertyWithAPropertyWithoutAnObject() { verify(dummy).hello(); } - @Test - void resolveKeyToPropertyWithAPropertyWithAnObject() { - // given - final Superhero person = mock(Superhero.class); - final DummyService dummy = mock(DummyService.class); - doReturn(person).when(mockedFaker).superhero(); - doReturn("Luke Cage").when(person).name(); - - // when - final String actual = fakeValuesService.resolve("property.advancedResolution", dummy, mockedFaker, mockedFaker.getContext()); - - // then - assertThat(actual).isEqualTo("Luke Cage"); - verify(mockedFaker).superhero(); - verify(person).name(); - } - @Test void resolveKeyToPropertyWithAList() { // property.resolutionWithList -> #{hello} // #{hello} -> DummyService.hello - - // given - final DummyService dummy = mock(DummyService.class); - doReturn(0).when(randomService).nextInt(Mockito.anyInt()); - doReturn("Yo!").when(dummy).hello(); - - // when - final String actual = fakeValuesService.resolve("property.resolutionWithList", dummy, mockedFaker, mockedFaker.getContext()); - - // then - assertThat(actual).isEqualTo("Yo!"); - verify(dummy).hello(); - } - - @Test - void resolveKeyWithMultiplePropertiesShouldJoinResults() { - // given - final Superhero person = mock(Superhero.class); - final DummyService dummy = mock(DummyService.class); - doReturn(person).when(mockedFaker).superhero(); - - doReturn("Yo Superman!").when(dummy).hello(); - doReturn("up up and away").when(person).descriptor(); - - // when - String actual = fakeValuesService.resolve("property.multipleResolution", dummy, mockedFaker, mockedFaker.getContext()); - - // then - assertThat(actual).isEqualTo("Yo Superman! up up and away"); - - verify(mockedFaker).superhero(); - verify(person).descriptor(); - verify(dummy).hello(); + class Property extends AbstractProvider { + protected Property(BaseProviders faker) { + super(faker); + ClassLoader classLoader = getClass().getClassLoader(); + URL resource = classLoader.getResource("test.yml"); + faker.addUrl(new Locale("test"), resource); + } + + public String hello() { + return "Yo!"; + } + + public String hello2() { + return "Yo2!"; + } + + public String resolutionWithList() { + return resolve("property.resolutionWithList"); + } + } + var testFaker = new BaseFaker(new Locale("test")); + assertThat(BaseFaker.getProvider(Property.class, Property::new, testFaker).resolutionWithList()) + .startsWith("Yo"); } @Test diff --git a/src/test/java/net/datafaker/service/FakeValuesTest.java b/src/test/java/net/datafaker/service/FakeValuesTest.java index f53416b02..6879c9bd5 100644 --- a/src/test/java/net/datafaker/service/FakeValuesTest.java +++ b/src/test/java/net/datafaker/service/FakeValuesTest.java @@ -97,13 +97,13 @@ void getAValueForHebrewLocale() { @Test void correctPathForHebrewLanguage() { FakeValues hebrew = FakeValues.of(FakeValuesContext.of(new Locale("iw"))); - assertThat(hebrew.getPath()).isEqualTo("he"); + assertThat(hebrew.getPathes()).containsExactly("he"); } @Test void incorrectPathForHebrewLanguage() { FakeValues hebrew = FakeValues.of(FakeValuesContext.of(new Locale("iw"))); - assertThat(hebrew.getPath()).isNotEqualTo("iw"); + assertThat(hebrew.getPathes()).doesNotContain("iw"); } @Test