From e21ba7f921e6ae51f30065c9f4179ad92b2ac177 Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 15:36:26 +0100 Subject: [PATCH 01/22] test: remove todos from tests --- test/name.spec.ts | 45 ++++++++++++++++++--------------------------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/test/name.spec.ts b/test/name.spec.ts index 2b8e9f0a304..c1fc9bf1a4b 100644 --- a/test/name.spec.ts +++ b/test/name.spec.ts @@ -217,18 +217,14 @@ describe('name', () => { expect(faker.definitions.name.female_last_name).toContain(name); }); - // TODO @Shinigami92 2022-01-30: There is a bug: https://github.com/faker-js/faker/issues/373 - it.todo( - 'should return a gender-specific last name when passed a string', - () => { - faker.locale = 'az'; - - let name = faker.name.lastName('male'); - expect(faker.definitions.name.male_last_name).toContain(name); - name = faker.name.lastName('female'); - expect(faker.definitions.name.female_last_name).toContain(name); - } - ); + it('should return a gender-specific last name when passed a string', () => { + faker.locale = 'az'; + + let name = faker.name.lastName('male'); + expect(faker.definitions.name.male_last_name).toContain(name); + name = faker.name.lastName('female'); + expect(faker.definitions.name.female_last_name).toContain(name); + }); }); describe('middleName()', () => { @@ -243,7 +239,7 @@ describe('name', () => { expect(middle_name.length).greaterThan(0); }); - it.todo('should return a middle name when passed en locale', () => { + it('should return a middle name when passed en locale', () => { faker.locale = 'en'; let name = faker.name.middleName(); @@ -263,17 +259,14 @@ describe('name', () => { expect(faker.definitions.name.female_middle_name).toContain(name); }); - it.todo( - 'should return a gender-specific middle name when passed a string', - () => { - faker.locale = 'uk'; + it('should return a gender-specific middle name when passed a string', () => { + faker.locale = 'uk'; - let name = faker.name.middleName('male'); - expect(faker.definitions.name.male_middle_name).toContain(name); - name = faker.name.middleName('female'); - expect(faker.definitions.name.female_middle_name).toContain(name); - } - ); + let name = faker.name.middleName('male'); + expect(faker.definitions.name.male_middle_name).toContain(name); + name = faker.name.middleName('female'); + expect(faker.definitions.name.female_middle_name).toContain(name); + }); }); describe('findName()', () => { @@ -420,8 +413,7 @@ describe('name', () => { expect(faker.definitions.name.male_prefix).toContain(prefix); }); - // TODO @Shinigami92 2022-01-31: There is a bug: https://github.com/faker-js/faker/issues/373 - it.todo('should return a male prefix with given string', () => { + it('should return a male prefix with given string', () => { faker.locale = 'mk'; const prefix = faker.name.prefix('male'); @@ -439,8 +431,7 @@ describe('name', () => { expect(faker.definitions.name.female_prefix).toContain(prefix); }); - // TODO @Shinigami92 2022-01-31: There is a bug: https://github.com/faker-js/faker/issues/373 - it.todo('should return a female prefix with given string', () => { + it('should return a female prefix with given string', () => { faker.locale = 'mk'; const prefix = faker.name.prefix('female'); From e1e170a06d97c981a324e1fd93de4d33c84af376 Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 15:42:32 +0100 Subject: [PATCH 02/22] chore: define type Gender --- src/name.ts | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/name.ts b/src/name.ts index 6b7275692eb..abdc1772e03 100644 --- a/src/name.ts +++ b/src/name.ts @@ -1,5 +1,7 @@ import type { Faker } from '.'; +export type Gender = 'female' | 'male' | 0 | 1; + /** * Module to generate people's names and titles. */ @@ -27,7 +29,7 @@ export class Name { * faker.name.firstName("male") // 'Tom' * faker.name.firstName(0) // 'Ismael' */ - firstName(gender?: string | number): string { + firstName(gender?: Gender): string { if ( typeof this.faker.definitions.name.male_first_name !== 'undefined' && typeof this.faker.definitions.name.female_first_name !== 'undefined' @@ -82,7 +84,7 @@ export class Name { * faker.name.lastName("male") // 'Barton' * faker.name.lastName(0) // 'Lockman' */ - lastName(gender?: string | number): string { + lastName(gender?: Gender): string { if ( typeof this.faker.definitions.name.male_last_name !== 'undefined' && typeof this.faker.definitions.name.female_last_name !== 'undefined' @@ -121,7 +123,7 @@ export class Name { * faker.name.middleName("male") // 'Вікторович' * faker.name.middleName(0) // 'Стефанович' */ - middleName(gender?: string | number): string { + middleName(gender?: Gender): string { if ( typeof this.faker.definitions.name.male_middle_name !== 'undefined' && typeof this.faker.definitions.name.female_middle_name !== 'undefined' @@ -160,11 +162,7 @@ export class Name { * faker.name.findName(undefined, 'Beer') // 'Mr. Alfonso Beer' * faker.name.findName(undefined, undefined, 0) // 'Fernando Schaefer' */ - findName( - firstName?: string, - lastName?: string, - gender?: string | number - ): string { + findName(firstName?: string, lastName?: string, gender?: Gender): string { const r = this.faker.datatype.number(8); let prefix = ''; let suffix = ''; @@ -245,7 +243,7 @@ export class Name { * faker.name.prefix('male') // 'Mr.' * faker.name.prefix(0) // 'Mr.' */ - prefix(gender?: string | number): string { + prefix(gender?: Gender): string { if ( typeof this.faker.definitions.name.male_prefix !== 'undefined' && typeof this.faker.definitions.name.female_prefix !== 'undefined' From b68f514b13de0aaa462325299f17aafeb430488f Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 15:46:24 +0100 Subject: [PATCH 03/22] docs: rework JSDocs --- src/name.ts | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/src/name.ts b/src/name.ts index abdc1772e03..c558bec8d51 100644 --- a/src/name.ts +++ b/src/name.ts @@ -20,14 +20,12 @@ export class Name { * Returns a random first name. * * @param gender The optional gender to use. - * Can be either `'male'` (or `0`) or `'female'` (or `1`). + * Can be either `'female'` or `'male'`. * * @example * faker.name.firstName() // 'Antwan' * faker.name.firstName("female") // 'Victoria' - * faker.name.firstName(1) // 'Ashley' * faker.name.firstName("male") // 'Tom' - * faker.name.firstName(0) // 'Ismael' */ firstName(gender?: Gender): string { if ( @@ -75,14 +73,12 @@ export class Name { * Returns a random last name. * * @param gender The optional gender to use. - * Can be either `'male'` (or `0`) or `'female'` (or `1`). + * Can be either `'female'` or `'male'`. * * @example * faker.name.lastName() // 'Hauck' * faker.name.lastName("female") // 'Grady' - * faker.name.lastName(1) // 'Kshlerin' * faker.name.lastName("male") // 'Barton' - * faker.name.lastName(0) // 'Lockman' */ lastName(gender?: Gender): string { if ( @@ -114,14 +110,12 @@ export class Name { * Returns a random middle name. * * @param gender The optional gender to use. - * Can be either `'male'` (or `0`) or `'female'` (or `1`). + * Can be either `'female'` or `'male'`. * * @example * faker.name.middleName() // 'Доброславівна' * faker.name.middleName("female") // 'Анастасівна' - * faker.name.middleName(1) // 'Анатоліївна' * faker.name.middleName("male") // 'Вікторович' - * faker.name.middleName(0) // 'Стефанович' */ middleName(gender?: Gender): string { if ( @@ -153,14 +147,14 @@ export class Name { * @param firstName The optional first name to use. If not specified a random one will be chosen. * @param lastName The optional last name to use. If not specified a random one will be chosen. * @param gender The optional gender to use. - * Can be either `'male'` (or `0`) or `'female'` (or `1`). + * Can be either `'female'` or `'male'`. * * @example * faker.name.findName() // 'Allen Brown' * faker.name.findName('Joann') // 'Joann Osinski' - * faker.name.findName('Marcella', '', 1) // 'Mrs. Marcella Huels' + * faker.name.findName('Marcella', '', 'female') // 'Mrs. Marcella Huels' * faker.name.findName(undefined, 'Beer') // 'Mr. Alfonso Beer' - * faker.name.findName(undefined, undefined, 0) // 'Fernando Schaefer' + * faker.name.findName(undefined, undefined, 'male') // 'Fernando Schaefer' */ findName(firstName?: string, lastName?: string, gender?: Gender): string { const r = this.faker.datatype.number(8); @@ -234,14 +228,12 @@ export class Name { * Returns a random name prefix. * * @param gender The optional gender to use. - * Can be either `'male'` (or `0`) or `'female'` (or `1`). + * Can be either `'female'` or `'male'`. * * @example * faker.name.prefix() // 'Miss' * faker.name.prefix('female') // 'Ms.' - * faker.name.prefix(1) // 'Dr.' * faker.name.prefix('male') // 'Mr.' - * faker.name.prefix(0) // 'Mr.' */ prefix(gender?: Gender): string { if ( From 9fd0c69ab60c9fcf34095a4a3c22c32380f3d9f3 Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 15:50:31 +0100 Subject: [PATCH 04/22] chore: add enum Gender --- src/index.ts | 1 + src/name.ts | 17 +++++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/index.ts b/src/index.ts index 0f4b71ba591..5e6e21f25af 100644 --- a/src/index.ts +++ b/src/index.ts @@ -27,6 +27,7 @@ export type { WordDefinitions, } from './definitions'; export type { FakerOptions, UsableLocale, UsedLocales } from './faker'; +export type { Gender, GenderType } from './name'; export { Faker }; // since we are requiring the top level of faker, load all locales by default diff --git a/src/name.ts b/src/name.ts index c558bec8d51..ba578131442 100644 --- a/src/name.ts +++ b/src/name.ts @@ -1,6 +1,11 @@ import type { Faker } from '.'; -export type Gender = 'female' | 'male' | 0 | 1; +export enum Gender { + female = 'female', + male = 'male', +} + +export type GenderType = 'female' | 'male' | 0 | 1; /** * Module to generate people's names and titles. @@ -27,7 +32,7 @@ export class Name { * faker.name.firstName("female") // 'Victoria' * faker.name.firstName("male") // 'Tom' */ - firstName(gender?: Gender): string { + firstName(gender?: GenderType): string { if ( typeof this.faker.definitions.name.male_first_name !== 'undefined' && typeof this.faker.definitions.name.female_first_name !== 'undefined' @@ -80,7 +85,7 @@ export class Name { * faker.name.lastName("female") // 'Grady' * faker.name.lastName("male") // 'Barton' */ - lastName(gender?: Gender): string { + lastName(gender?: GenderType): string { if ( typeof this.faker.definitions.name.male_last_name !== 'undefined' && typeof this.faker.definitions.name.female_last_name !== 'undefined' @@ -117,7 +122,7 @@ export class Name { * faker.name.middleName("female") // 'Анастасівна' * faker.name.middleName("male") // 'Вікторович' */ - middleName(gender?: Gender): string { + middleName(gender?: GenderType): string { if ( typeof this.faker.definitions.name.male_middle_name !== 'undefined' && typeof this.faker.definitions.name.female_middle_name !== 'undefined' @@ -156,7 +161,7 @@ export class Name { * faker.name.findName(undefined, 'Beer') // 'Mr. Alfonso Beer' * faker.name.findName(undefined, undefined, 'male') // 'Fernando Schaefer' */ - findName(firstName?: string, lastName?: string, gender?: Gender): string { + findName(firstName?: string, lastName?: string, gender?: GenderType): string { const r = this.faker.datatype.number(8); let prefix = ''; let suffix = ''; @@ -235,7 +240,7 @@ export class Name { * faker.name.prefix('female') // 'Ms.' * faker.name.prefix('male') // 'Mr.' */ - prefix(gender?: Gender): string { + prefix(gender?: GenderType): string { if ( typeof this.faker.definitions.name.male_prefix !== 'undefined' && typeof this.faker.definitions.name.female_prefix !== 'undefined' From 78e698f502f91552bd850e81732f5febbaf7a3c2 Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 15:51:39 +0100 Subject: [PATCH 05/22] chore: enum needs to be real exported --- src/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 5e6e21f25af..d1c2cb1d63f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -27,7 +27,8 @@ export type { WordDefinitions, } from './definitions'; export type { FakerOptions, UsableLocale, UsedLocales } from './faker'; -export type { Gender, GenderType } from './name'; +export { Gender } from './name'; +export type { GenderType } from './name'; export { Faker }; // since we are requiring the top level of faker, load all locales by default From 1f71ade36c4b00da6d2701f9f458b5cd01e4bc63 Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 16:26:56 +0100 Subject: [PATCH 06/22] refactor: rewrite name.firstName --- src/name.ts | 73 ++++++++++++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/src/name.ts b/src/name.ts index ba578131442..90b8d20ad54 100644 --- a/src/name.ts +++ b/src/name.ts @@ -21,6 +21,20 @@ export class Name { } } + private normalizeGender(gender?: GenderType): Omit { + if (gender == null || typeof gender === 'string') { + return gender; + } + + const normalizedGender = gender === 0 ? 'male' : 'female'; + + console.warn( + `Deprecation Warning: Please use ${normalizedGender} for gender instead of ${gender}` + ); + + return normalizedGender; + } + /** * Returns a random first name. * @@ -33,45 +47,36 @@ export class Name { * faker.name.firstName("male") // 'Tom' */ firstName(gender?: GenderType): string { - if ( - typeof this.faker.definitions.name.male_first_name !== 'undefined' && - typeof this.faker.definitions.name.female_first_name !== 'undefined' - ) { - // some locale datasets ( like ru ) have first_name split by gender. since the name.first_name field does not exist in these datasets, - // we must randomly pick a name from either gender array so faker.name.firstName will return the correct locale data ( and not fallback ) - - if (typeof gender === 'string') { - if (gender.toLowerCase() === 'male') { - gender = 0; - } else if (gender.toLowerCase() === 'female') { - gender = 1; - } - } + const normalizedGender = this.normalizeGender(gender); - if (typeof gender !== 'number') { - if (typeof this.faker.definitions.name.first_name === 'undefined') { - gender = this.faker.datatype.number(1); - } else { - // Fall back to non-gendered names if they exist and gender wasn't specified - return this.faker.random.arrayElement( - this.faker.definitions.name.first_name - ); - } - } - if (gender === 0) { - return this.faker.random.arrayElement( - this.faker.definitions.name.male_first_name - ); + const { first_name, female_first_name, male_first_name } = + this.faker.definitions.name; + + let firstNames: string[] | undefined; + switch (normalizedGender) { + case 'female': + firstNames = female_first_name; + break; + case 'male': + firstNames = male_first_name; + break; + default: + firstNames = first_name; + break; + } + + if (firstNames == null) { + if (female_first_name != null && male_first_name != null) { + firstNames = this.faker.random.arrayElement([ + female_first_name, + male_first_name, + ]); } else { - return this.faker.random.arrayElement( - this.faker.definitions.name.female_first_name - ); + firstNames = first_name; } } - return this.faker.random.arrayElement( - this.faker.definitions.name.first_name - ); + return this.faker.random.arrayElement(firstNames); } /** From f4a27f9a5a9b4627d0ccfe816a1a88816af2a6ef Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 16:38:51 +0100 Subject: [PATCH 07/22] chore: generalize firstName, lastName and middleName --- src/name.ts | 122 +++++++++++++++++++++++----------------------------- 1 file changed, 53 insertions(+), 69 deletions(-) diff --git a/src/name.ts b/src/name.ts index 90b8d20ad54..1866f30e02a 100644 --- a/src/name.ts +++ b/src/name.ts @@ -35,48 +35,60 @@ export class Name { return normalizedGender; } - /** - * Returns a random first name. - * - * @param gender The optional gender to use. - * Can be either `'female'` or `'male'`. - * - * @example - * faker.name.firstName() // 'Antwan' - * faker.name.firstName("female") // 'Victoria' - * faker.name.firstName("male") // 'Tom' - */ - firstName(gender?: GenderType): string { + private selectDefinition( + gender: GenderType | undefined, + { + generic, + female, + male, + }: { generic: string[]; female?: string[]; male?: string[] } + ) { const normalizedGender = this.normalizeGender(gender); - const { first_name, female_first_name, male_first_name } = - this.faker.definitions.name; - - let firstNames: string[] | undefined; + let values: string[] | undefined; switch (normalizedGender) { case 'female': - firstNames = female_first_name; + values = female; break; case 'male': - firstNames = male_first_name; + values = male; break; default: - firstNames = first_name; + values = generic; break; } - if (firstNames == null) { - if (female_first_name != null && male_first_name != null) { - firstNames = this.faker.random.arrayElement([ - female_first_name, - male_first_name, - ]); + if (values == null) { + if (female != null && male != null) { + values = this.faker.random.arrayElement([female, male]); } else { - firstNames = first_name; + values = generic; } } - return this.faker.random.arrayElement(firstNames); + return this.faker.random.arrayElement(values); + } + + /** + * Returns a random first name. + * + * @param gender The optional gender to use. + * Can be either `'female'` or `'male'`. + * + * @example + * faker.name.firstName() // 'Antwan' + * faker.name.firstName("female") // 'Victoria' + * faker.name.firstName("male") // 'Tom' + */ + firstName(gender?: GenderType): string { + const { first_name, female_first_name, male_first_name } = + this.faker.definitions.name; + + return this.selectDefinition(gender, { + generic: first_name, + female: female_first_name, + male: male_first_name, + }); } /** @@ -91,29 +103,14 @@ export class Name { * faker.name.lastName("male") // 'Barton' */ lastName(gender?: GenderType): string { - if ( - typeof this.faker.definitions.name.male_last_name !== 'undefined' && - typeof this.faker.definitions.name.female_last_name !== 'undefined' - ) { - // some locale datasets ( like ru ) have last_name split by gender. i have no idea how last names can have genders, but also i do not speak russian - // see above comment of firstName method - if (typeof gender !== 'number') { - gender = this.faker.datatype.number(1); - } - if (gender === 0) { - return this.faker.random.arrayElement( - this.faker.locales[this.faker.locale].name.male_last_name - ); - } else { - return this.faker.random.arrayElement( - this.faker.locales[this.faker.locale].name.female_last_name - ); - } - } + const { last_name, female_last_name, male_last_name } = + this.faker.definitions.name; - return this.faker.random.arrayElement( - this.faker.definitions.name.last_name - ); + return this.selectDefinition(gender, { + generic: last_name, + female: female_last_name, + male: male_last_name, + }); } /** @@ -128,27 +125,14 @@ export class Name { * faker.name.middleName("male") // 'Вікторович' */ middleName(gender?: GenderType): string { - if ( - typeof this.faker.definitions.name.male_middle_name !== 'undefined' && - typeof this.faker.definitions.name.female_middle_name !== 'undefined' - ) { - if (typeof gender !== 'number') { - gender = this.faker.datatype.number(1); - } - if (gender === 0) { - return this.faker.random.arrayElement( - this.faker.definitions.name.male_middle_name - ); - } else { - return this.faker.random.arrayElement( - this.faker.definitions.name.female_middle_name - ); - } - } + const { middle_name, female_middle_name, male_middle_name } = + this.faker.definitions.name; - return this.faker.random.arrayElement( - this.faker.definitions.name.middle_name - ); + return this.selectDefinition(gender, { + generic: middle_name, + female: female_middle_name, + male: male_middle_name, + }); } /** From 5ca02fa6ccf8cb26b96d3c33401fac77d25c1b4c Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 16:40:51 +0100 Subject: [PATCH 08/22] chore: add todo --- src/name.ts | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/src/name.ts b/src/name.ts index 1866f30e02a..2171b661ba0 100644 --- a/src/name.ts +++ b/src/name.ts @@ -230,25 +230,13 @@ export class Name { * faker.name.prefix('male') // 'Mr.' */ prefix(gender?: GenderType): string { - if ( - typeof this.faker.definitions.name.male_prefix !== 'undefined' && - typeof this.faker.definitions.name.female_prefix !== 'undefined' - ) { - if (typeof gender !== 'number') { - gender = this.faker.datatype.number(1); - } - if (gender === 0) { - return this.faker.random.arrayElement( - this.faker.locales[this.faker.locale].name.male_prefix - ); - } else { - return this.faker.random.arrayElement( - this.faker.locales[this.faker.locale].name.female_prefix - ); - } - } + const { prefix, female_prefix, male_prefix } = this.faker.definitions.name; - return this.faker.random.arrayElement(this.faker.definitions.name.prefix); + return this.selectDefinition(gender, { + generic: prefix, + female: female_prefix, + male: male_prefix, + }); } /** @@ -258,6 +246,7 @@ export class Name { * faker.name.suffix() // 'DDS' */ suffix(): string { + // TODO christopher 21-03-2022: Add female_suffix and male_suffix return this.faker.random.arrayElement(this.faker.definitions.name.suffix); } From 8c569b4a616f5bf9e41f51aebb1afdcdde4e4352 Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 16:44:53 +0100 Subject: [PATCH 09/22] chore: simplify code --- src/name.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/name.ts b/src/name.ts index 2171b661ba0..be6b19609b4 100644 --- a/src/name.ts +++ b/src/name.ts @@ -213,9 +213,9 @@ export class Name { return this.faker.random.arrayElement( this.faker.definitions.name.binary_gender ); - } else { - return this.faker.random.arrayElement(this.faker.definitions.name.gender); } + + return this.faker.random.arrayElement(this.faker.definitions.name.gender); } /** From 1e1c0c85571ee618263f66256cb13f303c442fd1 Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 16:45:30 +0100 Subject: [PATCH 10/22] chore: move function --- src/name.ts | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/name.ts b/src/name.ts index be6b19609b4..1d58e79ffe0 100644 --- a/src/name.ts +++ b/src/name.ts @@ -183,22 +183,6 @@ export class Name { return firstName + ' ' + lastName; } - /** - * Generates a random job title. - * - * @example - * faker.name.jobTitle() // 'Global Accounts Engineer' - */ - jobTitle(): string { - return ( - this.faker.name.jobDescriptor() + - ' ' + - this.faker.name.jobArea() + - ' ' + - this.faker.name.jobType() - ); - } - /** * Return a random gender. * @@ -270,6 +254,22 @@ export class Name { return descriptor + ' ' + level + ' ' + job; } + /** + * Generates a random job title. + * + * @example + * faker.name.jobTitle() // 'Global Accounts Engineer' + */ + jobTitle(): string { + return ( + this.faker.name.jobDescriptor() + + ' ' + + this.faker.name.jobArea() + + ' ' + + this.faker.name.jobType() + ); + } + /** * Generates a random job descriptor. * From fb29b8a16899271d37a2120ca41c539debe617fa Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 17:00:47 +0100 Subject: [PATCH 11/22] chore: rework findName --- src/name.ts | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/name.ts b/src/name.ts index 1d58e79ffe0..3f6059232e2 100644 --- a/src/name.ts +++ b/src/name.ts @@ -5,6 +5,7 @@ export enum Gender { male = 'male', } +// TODO christopher 21-03-2022: Remove 0 and 1 in v7 export type GenderType = 'female' | 'male' | 0 | 1; /** @@ -21,7 +22,9 @@ export class Name { } } - private normalizeGender(gender?: GenderType): Omit { + private normalizeGender( + gender?: GenderType + ): Exclude | undefined { if (gender == null || typeof gender === 'string') { return gender; } @@ -151,21 +154,19 @@ export class Name { * faker.name.findName(undefined, undefined, 'male') // 'Fernando Schaefer' */ findName(firstName?: string, lastName?: string, gender?: GenderType): string { - const r = this.faker.datatype.number(8); + const variant = this.faker.datatype.number(8); let prefix = ''; let suffix = ''; - // in particular locales first and last names split by gender, - // thus we keep consistency by passing 0 as male and 1 as female + const normalizedGender: Exclude = + this.normalizeGender(gender) ?? + this.faker.random.arrayElement(['female', 'male']); - if (typeof gender !== 'number') { - gender = this.faker.datatype.number(1); - } - - firstName = firstName || this.faker.name.firstName(gender); - lastName = lastName || this.faker.name.lastName(gender); + firstName = firstName || this.faker.name.firstName(normalizedGender); + lastName = lastName || this.faker.name.lastName(normalizedGender); - switch (r) { + switch (variant) { + // TODO christopher 21-03-2022: Add possibility to have a prefix together with a suffix case 0: prefix = this.faker.name.prefix(gender); if (prefix) { From 193cf406eaefc527d3f26b99722d2c8b064e4c21 Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 17:05:27 +0100 Subject: [PATCH 12/22] chore: add typecast --- src/name.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/name.ts b/src/name.ts index 3f6059232e2..b0869fe4e67 100644 --- a/src/name.ts +++ b/src/name.ts @@ -26,7 +26,8 @@ export class Name { gender?: GenderType ): Exclude | undefined { if (gender == null || typeof gender === 'string') { - return gender; + // TODO christopher 21-03-2022: Cast can be removed when we set `strict: true` + return gender as Exclude; } const normalizedGender = gender === 0 ? 'male' : 'female'; From 39dd689678807479c6fb580144883c720a9eb697 Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 17:09:19 +0100 Subject: [PATCH 13/22] test: adjust seeded values --- test/helpers.spec.ts | 12 ++++++------ test/name.spec.ts | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/test/helpers.spec.ts b/test/helpers.spec.ts index 64c12df5d7d..cbb541c169e 100644 --- a/test/helpers.spec.ts +++ b/test/helpers.spec.ts @@ -63,7 +63,7 @@ const seededRuns = [ name: 'Weissnat, Wintheiser and MacGyver', }, email: 'Isabel5@gmail.com', - name: 'Lorene Deckow', + name: 'Darnell Deckow', phone: '559.640.8661', posts: [ { @@ -138,7 +138,7 @@ const seededRuns = [ name: 'Langworth - Wyman', }, email: 'Isabel5@gmail.com', - name: 'Lorene Deckow', + name: 'Darnell Deckow', phone: '225-631-0293 x240', username: 'Moses_Satterfield', website: 'sparse-ottoman.biz', @@ -213,7 +213,7 @@ const seededRuns = [ name: 'Armstrong, Smitham and Renner', }, email: 'Darron.Larson@gmail.com', - name: 'Marilyn Effertz', + name: 'Eugene Effertz', phone: '818-698-6199 x848', posts: [ { @@ -287,7 +287,7 @@ const seededRuns = [ name: 'Daugherty - Connelly', }, email: 'Darron.Larson@gmail.com', - name: 'Marilyn Effertz', + name: 'Eugene Effertz', phone: '803.543.5573 x1428', username: 'Dudley.Littel', website: 'queasy-guide.info', @@ -362,7 +362,7 @@ const seededRuns = [ name: 'Jacobi and Sons', }, email: 'Marlen.Effertz35@gmail.com', - name: 'Darrel Sanford', + name: 'Henrietta Sanford', phone: '621-735-9398', posts: [ { @@ -436,7 +436,7 @@ const seededRuns = [ name: 'Fahey LLC', }, email: 'Marlen.Effertz35@gmail.com', - name: 'Darrel Sanford', + name: 'Henrietta Sanford', phone: '469.570.3390', username: 'Dangelo.Christiansen67', website: 'mild-hearth.org', diff --git a/test/name.spec.ts b/test/name.spec.ts index c1fc9bf1a4b..93cc7bc696e 100644 --- a/test/name.spec.ts +++ b/test/name.spec.ts @@ -12,10 +12,10 @@ const seededRuns = [ noArgs: 'Hintz', }, middleName: { - noArgs: 'Owen', + noArgs: 'Greer', }, findName: { - noArgs: 'Lorene Deckow', + noArgs: 'Darnell Deckow', }, jobTitle: { noArgs: 'Regional Data Representative', @@ -53,10 +53,10 @@ const seededRuns = [ noArgs: 'Gibson', }, middleName: { - noArgs: 'Kenji', + noArgs: 'Dakota', }, findName: { - noArgs: 'Marilyn Effertz', + noArgs: 'Eugene Effertz', }, jobTitle: { noArgs: 'Future Infrastructure Liaison', @@ -94,10 +94,10 @@ const seededRuns = [ noArgs: 'Ward', }, middleName: { - noArgs: 'Isla', + noArgs: 'Sawyer', }, findName: { - noArgs: 'Darrel Sanford', + noArgs: 'Henrietta Sanford', }, jobTitle: { noArgs: 'Chief Division Agent', From 79ddaf4aad1112aac8173e670f447f3521340b7c Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 17:10:14 +0100 Subject: [PATCH 14/22] chore: add quotes to warning --- src/name.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/name.ts b/src/name.ts index b0869fe4e67..220bedf2e55 100644 --- a/src/name.ts +++ b/src/name.ts @@ -33,7 +33,7 @@ export class Name { const normalizedGender = gender === 0 ? 'male' : 'female'; console.warn( - `Deprecation Warning: Please use ${normalizedGender} for gender instead of ${gender}` + `Deprecation Warning: Please use '${normalizedGender}' for gender instead of ${gender}` ); return normalizedGender; From 9c41a06ea1afdec35244cec276c93e4c8d0e4186 Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 17:16:52 +0100 Subject: [PATCH 15/22] chore: add empty object fallback --- src/name.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/name.ts b/src/name.ts index 220bedf2e55..0a4937a1fa1 100644 --- a/src/name.ts +++ b/src/name.ts @@ -41,11 +41,12 @@ export class Name { private selectDefinition( gender: GenderType | undefined, + // TODO christopher 21-03-2022: Remove fallback empty object when `strict: true` { generic, female, male, - }: { generic: string[]; female?: string[]; male?: string[] } + }: { generic?: string[]; female?: string[]; male?: string[] } = {} ) { const normalizedGender = this.normalizeGender(gender); From a7f4443aa47271111ea980cd8cd44e815c967910 Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 17:30:54 +0100 Subject: [PATCH 16/22] chore: move private functions out of module --- src/name.ts | 115 ++++++++++++++++++++++++++-------------------------- 1 file changed, 58 insertions(+), 57 deletions(-) diff --git a/src/name.ts b/src/name.ts index 0a4937a1fa1..6d68f419963 100644 --- a/src/name.ts +++ b/src/name.ts @@ -8,6 +8,59 @@ export enum Gender { // TODO christopher 21-03-2022: Remove 0 and 1 in v7 export type GenderType = 'female' | 'male' | 0 | 1; +function normalizeGender( + gender?: GenderType +): Exclude | undefined { + if (gender == null || typeof gender === 'string') { + // TODO christopher 21-03-2022: Cast can be removed when we set `strict: true` + return gender as Exclude; + } + + const normalizedGender = gender === 0 ? 'male' : 'female'; + + console.warn( + `Deprecation Warning: Please use '${normalizedGender}' for gender instead of ${gender}` + ); + + return normalizedGender; +} + +function selectDefinition( + faker: Faker, + gender: GenderType | undefined, + // TODO christopher 21-03-2022: Remove fallback empty object when `strict: true` + { + generic, + female, + male, + }: { generic?: string[]; female?: string[]; male?: string[] } = {} +) { + const normalizedGender = this.normalizeGender(gender); + + let values: string[] | undefined; + switch (normalizedGender) { + case 'female': + values = female; + break; + case 'male': + values = male; + break; + default: + values = generic; + break; + } + + if (values == null) { + if (female != null && male != null) { + values = faker.random.arrayElement([female, male]); + } else { + values = generic; + } + } + + return faker.random.arrayElement(values); +} + /** * Module to generate people's names and titles. */ @@ -22,58 +75,6 @@ export class Name { } } - private normalizeGender( - gender?: GenderType - ): Exclude | undefined { - if (gender == null || typeof gender === 'string') { - // TODO christopher 21-03-2022: Cast can be removed when we set `strict: true` - return gender as Exclude; - } - - const normalizedGender = gender === 0 ? 'male' : 'female'; - - console.warn( - `Deprecation Warning: Please use '${normalizedGender}' for gender instead of ${gender}` - ); - - return normalizedGender; - } - - private selectDefinition( - gender: GenderType | undefined, - // TODO christopher 21-03-2022: Remove fallback empty object when `strict: true` - { - generic, - female, - male, - }: { generic?: string[]; female?: string[]; male?: string[] } = {} - ) { - const normalizedGender = this.normalizeGender(gender); - - let values: string[] | undefined; - switch (normalizedGender) { - case 'female': - values = female; - break; - case 'male': - values = male; - break; - default: - values = generic; - break; - } - - if (values == null) { - if (female != null && male != null) { - values = this.faker.random.arrayElement([female, male]); - } else { - values = generic; - } - } - - return this.faker.random.arrayElement(values); - } - /** * Returns a random first name. * @@ -89,7 +90,7 @@ export class Name { const { first_name, female_first_name, male_first_name } = this.faker.definitions.name; - return this.selectDefinition(gender, { + return selectDefinition(this.faker, gender, { generic: first_name, female: female_first_name, male: male_first_name, @@ -111,7 +112,7 @@ export class Name { const { last_name, female_last_name, male_last_name } = this.faker.definitions.name; - return this.selectDefinition(gender, { + return selectDefinition(this.faker, gender, { generic: last_name, female: female_last_name, male: male_last_name, @@ -133,7 +134,7 @@ export class Name { const { middle_name, female_middle_name, male_middle_name } = this.faker.definitions.name; - return this.selectDefinition(gender, { + return selectDefinition(this.faker, gender, { generic: middle_name, female: female_middle_name, male: male_middle_name, @@ -161,7 +162,7 @@ export class Name { let suffix = ''; const normalizedGender: Exclude = - this.normalizeGender(gender) ?? + normalizeGender(gender) ?? this.faker.random.arrayElement(['female', 'male']); firstName = firstName || this.faker.name.firstName(normalizedGender); @@ -219,7 +220,7 @@ export class Name { prefix(gender?: GenderType): string { const { prefix, female_prefix, male_prefix } = this.faker.definitions.name; - return this.selectDefinition(gender, { + return selectDefinition(this.faker, gender, { generic: prefix, female: female_prefix, male: male_prefix, From 4bfeb3612c005e134f4a0524962b3f680cc6db04 Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 17:35:34 +0100 Subject: [PATCH 17/22] docs: add JSDoc --- src/name.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/name.ts b/src/name.ts index 6d68f419963..5a783fa6cd9 100644 --- a/src/name.ts +++ b/src/name.ts @@ -8,6 +8,12 @@ export enum Gender { // TODO christopher 21-03-2022: Remove 0 and 1 in v7 export type GenderType = 'female' | 'male' | 0 | 1; +/** + * Normalize gender. + * + * @param gender Gender. + * @returns Normalized gender. + */ function normalizeGender( gender?: GenderType ): Exclude | undefined { @@ -25,6 +31,17 @@ function normalizeGender( return normalizedGender; } +/** + * Select a definition based on given gender. + * + * @param faker Faker instance. + * @param gender Gender. + * @param param2 Definitions. + * @param param2.generic Non-gender definitions. + * @param param2.female Female definitions. + * @param param2.male Male definitions. + * @returns Definition based on given gender. + */ function selectDefinition( faker: Faker, gender: GenderType | undefined, From 3638573fa9f32aa6fe31c7cd800e328984ff3384 Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 17:36:26 +0100 Subject: [PATCH 18/22] fix: remove this. --- src/name.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/name.ts b/src/name.ts index 5a783fa6cd9..831115aff90 100644 --- a/src/name.ts +++ b/src/name.ts @@ -52,7 +52,7 @@ function selectDefinition( male, }: { generic?: string[]; female?: string[]; male?: string[] } = {} ) { - const normalizedGender = this.normalizeGender(gender); + const normalizedGender = normalizeGender(gender); let values: string[] | undefined; switch (normalizedGender) { From b3c548b5fd5bb3a664c683462b024ce10137b7de Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 17:47:55 +0100 Subject: [PATCH 19/22] test: update name test --- test/name.spec.ts | 174 ++++++++++++++++++++++++++++++---------------- 1 file changed, 116 insertions(+), 58 deletions(-) diff --git a/test/name.spec.ts b/test/name.spec.ts index 93cc7bc696e..b46acbecd02 100644 --- a/test/name.spec.ts +++ b/test/name.spec.ts @@ -1,4 +1,4 @@ -import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { faker } from '../src'; const seededRuns = [ @@ -182,17 +182,29 @@ describe('name', () => { }); it('should return a gender-specific first name when passed a number', () => { + const spy = vi.spyOn(console, 'warn'); + let name = faker.name.firstName(0); expect(faker.definitions.name.male_first_name).toContain(name); + expect(spy).toHaveBeenCalledWith( + `Deprecation Warning: Please use 'male' for gender instead of 0` + ); + name = faker.name.firstName(1); expect(faker.definitions.name.female_first_name).toContain(name); + expect(spy).toHaveBeenCalledWith( + `Deprecation Warning: Please use 'female' for gender instead of 1` + ); + + spy.mockRestore(); }); it('should return a gender-specific first name when passed a string', () => { - let name = faker.name.firstName('male'); - expect(faker.definitions.name.male_first_name).toContain(name); - name = faker.name.firstName('female'); + let name = faker.name.firstName('female'); expect(faker.definitions.name.female_first_name).toContain(name); + + name = faker.name.firstName('male'); + expect(faker.definitions.name.male_first_name).toContain(name); }); }); @@ -211,19 +223,31 @@ describe('name', () => { it('should return a gender-specific last name when passed a number', () => { faker.locale = 'az'; + const spy = vi.spyOn(console, 'warn'); + let name = faker.name.lastName(0); expect(faker.definitions.name.male_last_name).toContain(name); + expect(spy).toHaveBeenCalledWith( + `Deprecation Warning: Please use 'male' for gender instead of 0` + ); + name = faker.name.lastName(1); expect(faker.definitions.name.female_last_name).toContain(name); + expect(spy).toHaveBeenCalledWith( + `Deprecation Warning: Please use 'female' for gender instead of 1` + ); + + spy.mockRestore(); }); it('should return a gender-specific last name when passed a string', () => { faker.locale = 'az'; - let name = faker.name.lastName('male'); - expect(faker.definitions.name.male_last_name).toContain(name); - name = faker.name.lastName('female'); + let name = faker.name.lastName('female'); expect(faker.definitions.name.female_last_name).toContain(name); + + name = faker.name.lastName('male'); + expect(faker.definitions.name.male_last_name).toContain(name); }); }); @@ -244,28 +268,42 @@ describe('name', () => { let name = faker.name.middleName(); expect(faker.definitions.name.middle_name).toContain(name); - name = faker.name.middleName(0); - expect(faker.definitions.name.male_middle_name).toContain(name); - name = faker.name.middleName(1); + + name = faker.name.middleName('female'); expect(faker.definitions.name.female_middle_name).toContain(name); + + name = faker.name.middleName('male'); + expect(faker.definitions.name.male_middle_name).toContain(name); }); it('should return a gender-specific middle name when passed a number', () => { + const spy = vi.spyOn(console, 'warn'); + faker.locale = 'uk'; let name = faker.name.middleName(0); expect(faker.definitions.name.male_middle_name).toContain(name); + expect(spy).toHaveBeenCalledWith( + `Deprecation Warning: Please use 'male' for gender instead of 0` + ); + name = faker.name.middleName(1); expect(faker.definitions.name.female_middle_name).toContain(name); + expect(spy).toHaveBeenCalledWith( + `Deprecation Warning: Please use 'female' for gender instead of 1` + ); + + spy.mockRestore(); }); it('should return a gender-specific middle name when passed a string', () => { faker.locale = 'uk'; - let name = faker.name.middleName('male'); - expect(faker.definitions.name.male_middle_name).toContain(name); - name = faker.name.middleName('female'); + let name = faker.name.middleName('female'); expect(faker.definitions.name.female_middle_name).toContain(name); + + name = faker.name.middleName('male'); + expect(faker.definitions.name.male_middle_name).toContain(name); }); }); @@ -281,24 +319,6 @@ describe('name', () => { expect(fullName).toContain(' '); }); - it('should return a male gender-specific name with firstName and lastName', () => { - faker.locale = 'mk'; - - const male_specific = [ - ...faker.definitions.name.male_prefix, - ...faker.definitions.name.male_first_name, - ...faker.definitions.name.male_last_name, - ...faker.definitions.name.suffix, - ]; - - const fullName = faker.name.findName(undefined, undefined, 0); - - const parts = fullName.split(' '); - for (const part of parts) { - expect(male_specific).toContain(part); - } - }); - it('should return a female gender-specific name with firstName and lastName', () => { faker.locale = 'mk'; @@ -309,7 +329,7 @@ describe('name', () => { ...faker.definitions.name.suffix, ]; - const fullName = faker.name.findName(undefined, undefined, 1); + const fullName = faker.name.findName(undefined, undefined, 'female'); const parts = fullName.split(' '); for (const part of parts) { @@ -317,17 +337,17 @@ describe('name', () => { } }); - it('should return a male gender-specific name with given firstName and lastName', () => { + it('should return a male gender-specific name with firstName and lastName', () => { faker.locale = 'mk'; const male_specific = [ ...faker.definitions.name.male_prefix, - 'firstName', - 'lastName', + ...faker.definitions.name.male_first_name, + ...faker.definitions.name.male_last_name, ...faker.definitions.name.suffix, ]; - const fullName = faker.name.findName('firstName', 'lastName', 0); + const fullName = faker.name.findName(undefined, undefined, 'male'); const parts = fullName.split(' '); for (const part of parts) { @@ -345,30 +365,34 @@ describe('name', () => { ...faker.definitions.name.suffix, ]; - const fullName = faker.name.findName('firstName', 'lastName', 1); + const fullName = faker.name.findName( + 'firstName', + 'lastName', + 'female' + ); const parts = fullName.split(' '); for (const part of parts) { expect(male_specific).toContain(part); } }); - }); - - describe('jobTitle()', () => { - beforeEach(() => { - faker.locale = 'en'; - }); - it('should return a job title consisting of a descriptor, area, and type', () => { - const jobTitle = faker.name.jobTitle(); + it('should return a male gender-specific name with given firstName and lastName', () => { + faker.locale = 'mk'; - expect(jobTitle).toBeTypeOf('string'); + const male_specific = [ + ...faker.definitions.name.male_prefix, + 'firstName', + 'lastName', + ...faker.definitions.name.suffix, + ]; - const [descriptor, level, job] = jobTitle.split(' '); + const fullName = faker.name.findName('firstName', 'lastName', 'male'); - expect(faker.definitions.name.title.descriptor).toContain(descriptor); - expect(faker.definitions.name.title.level).toContain(level); - expect(faker.definitions.name.title.job).toContain(job); + const parts = fullName.split(' '); + for (const part of parts) { + expect(male_specific).toContain(part); + } }); }); @@ -404,13 +428,13 @@ describe('name', () => { expect(faker.definitions.name.prefix).toContain(prefix); }); - it('should return a male prefix', () => { + it('should return a female prefix with given string', () => { faker.locale = 'mk'; - const prefix = faker.name.prefix(0); + const prefix = faker.name.prefix('female'); expect(prefix).toBeTypeOf('string'); - expect(faker.definitions.name.male_prefix).toContain(prefix); + expect(faker.definitions.name.female_prefix).toContain(prefix); }); it('should return a male prefix with given string', () => { @@ -422,22 +446,38 @@ describe('name', () => { expect(faker.definitions.name.male_prefix).toContain(prefix); }); - it('should return a female prefix', () => { + it('should return a male prefix with given number', () => { + const spy = vi.spyOn(console, 'warn'); + faker.locale = 'mk'; - const prefix = faker.name.prefix(1); + const prefix = faker.name.prefix(0); expect(prefix).toBeTypeOf('string'); - expect(faker.definitions.name.female_prefix).toContain(prefix); + expect(faker.definitions.name.male_prefix).toContain(prefix); + + expect(spy).toHaveBeenCalledWith( + `Deprecation Warning: Please use 'male' for gender instead of 0` + ); + + spy.mockRestore(); }); - it('should return a female prefix with given string', () => { + it('should return a female prefix with given number', () => { + const spy = vi.spyOn(console, 'warn'); + faker.locale = 'mk'; - const prefix = faker.name.prefix('female'); + const prefix = faker.name.prefix(1); expect(prefix).toBeTypeOf('string'); expect(faker.definitions.name.female_prefix).toContain(prefix); + + expect(spy).toHaveBeenCalledWith( + `Deprecation Warning: Please use 'female' for gender instead of 1` + ); + + spy.mockRestore(); }); }); @@ -473,6 +513,24 @@ describe('name', () => { }); }); + describe('jobTitle()', () => { + beforeEach(() => { + faker.locale = 'en'; + }); + + it('should return a job title consisting of a descriptor, area, and type', () => { + const jobTitle = faker.name.jobTitle(); + + expect(jobTitle).toBeTypeOf('string'); + + const [descriptor, level, job] = jobTitle.split(' '); + + expect(faker.definitions.name.title.descriptor).toContain(descriptor); + expect(faker.definitions.name.title.level).toContain(level); + expect(faker.definitions.name.title.job).toContain(job); + }); + }); + describe('jobDescriptor()', () => { beforeEach(() => { faker.locale = 'en'; From 43d09c74e74285b30e59ae8e2bf61c0139ad33f5 Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 19:25:52 +0100 Subject: [PATCH 20/22] test: add test case --- test/name.spec.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/name.spec.ts b/test/name.spec.ts index b46acbecd02..cf384df2380 100644 --- a/test/name.spec.ts +++ b/test/name.spec.ts @@ -147,6 +147,7 @@ const functionNames = [ describe('name', () => { afterEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); for (const { seed, expectations } of seededRuns) { @@ -172,6 +173,7 @@ describe('name', () => { describe('firstName()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a random first name', () => { @@ -206,11 +208,23 @@ describe('name', () => { name = faker.name.firstName('male'); expect(faker.definitions.name.male_first_name).toContain(name); }); + + it('should return a generic first name when no gender-specific first name was defined', () => { + faker.locale = 'en_BORK'; + faker.localeFallback = 'ge'; + + let name = faker.name.firstName('female'); + expect(faker.definitions.name.first_name).toContain(name); + + name = faker.name.firstName('male'); + expect(faker.definitions.name.first_name).toContain(name); + }); }); describe('lastName()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a random last name', () => { @@ -254,6 +268,7 @@ describe('name', () => { describe('middleName()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a random middle name', () => { @@ -310,6 +325,7 @@ describe('name', () => { describe('findName()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a name with firstName and lastName', () => { @@ -399,6 +415,7 @@ describe('name', () => { describe('gender()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a default gender', () => { @@ -419,6 +436,7 @@ describe('name', () => { describe('prefix()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a prefix', () => { @@ -484,6 +502,7 @@ describe('name', () => { describe('suffix()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a suffix', () => { @@ -497,6 +516,7 @@ describe('name', () => { describe('title()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a title consisting of a descriptor, area, and type', () => { @@ -516,6 +536,7 @@ describe('name', () => { describe('jobTitle()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a job title consisting of a descriptor, area, and type', () => { @@ -534,6 +555,7 @@ describe('name', () => { describe('jobDescriptor()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a descriptor', () => { @@ -548,6 +570,7 @@ describe('name', () => { describe('jobArea()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a level', () => { @@ -562,6 +585,7 @@ describe('name', () => { describe('jobType()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a job', () => { From c6258f342e700ef399e8f671613b32c78269af6e Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Mon, 21 Mar 2022 19:36:51 +0100 Subject: [PATCH 21/22] test: rewrite test --- test/name.spec.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/name.spec.ts b/test/name.spec.ts index cf384df2380..7572b3d6ab1 100644 --- a/test/name.spec.ts +++ b/test/name.spec.ts @@ -209,15 +209,15 @@ describe('name', () => { expect(faker.definitions.name.male_first_name).toContain(name); }); - it('should return a generic first name when no gender-specific first name was defined', () => { - faker.locale = 'en_BORK'; - faker.localeFallback = 'ge'; - - let name = faker.name.firstName('female'); - expect(faker.definitions.name.first_name).toContain(name); + it('should return a gender-specific first name when no gender-specific first name was defined', () => { + faker.locale = 'az'; + faker.localeFallback = 'az'; - name = faker.name.firstName('male'); - expect(faker.definitions.name.first_name).toContain(name); + const name = faker.name.firstName(); + expect([ + ...faker.definitions.name.female_first_name, + ...faker.definitions.name.male_first_name, + ]).toContain(name); }); }); From d5cdb3b49a28d76b5d288052c65647e0d8cdf426 Mon Sep 17 00:00:00 2001 From: Shinigami Date: Wed, 23 Mar 2022 14:24:53 +0100 Subject: [PATCH 22/22] chore: fix todo author --- src/name.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/name.ts b/src/name.ts index 831115aff90..8fac27c4462 100644 --- a/src/name.ts +++ b/src/name.ts @@ -5,7 +5,7 @@ export enum Gender { male = 'male', } -// TODO christopher 21-03-2022: Remove 0 and 1 in v7 +// TODO @Shinigami92 21-03-2022: Remove 0 and 1 in v7 export type GenderType = 'female' | 'male' | 0 | 1; /** @@ -18,7 +18,7 @@ function normalizeGender( gender?: GenderType ): Exclude | undefined { if (gender == null || typeof gender === 'string') { - // TODO christopher 21-03-2022: Cast can be removed when we set `strict: true` + // TODO @Shinigami92 21-03-2022: Cast can be removed when we set `strict: true` return gender as Exclude; }