aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/index.ts2
-rw-r--r--src/name.ts294
-rw-r--r--test/helpers.spec.ts12
-rw-r--r--test/name.spec.ts239
4 files changed, 308 insertions, 239 deletions
diff --git a/src/index.ts b/src/index.ts
index 0f4b71ba..d1c2cb1d 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -27,6 +27,8 @@ export type {
WordDefinitions,
} from './definitions';
export type { FakerOptions, UsableLocale, UsedLocales } from './faker';
+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
diff --git a/src/name.ts b/src/name.ts
index 6b727569..8fac27c4 100644
--- a/src/name.ts
+++ b/src/name.ts
@@ -1,5 +1,83 @@
import type { Faker } from '.';
+export enum Gender {
+ female = 'female',
+ male = 'male',
+}
+
+// TODO @Shinigami92 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<GenderType, number> | undefined {
+ if (gender == null || typeof gender === 'string') {
+ // TODO @Shinigami92 21-03-2022: Cast can be removed when we set `strict: true`
+ return gender as Exclude<GenderType, number>;
+ }
+
+ const normalizedGender = gender === 0 ? 'male' : 'female';
+
+ console.warn(
+ `Deprecation Warning: Please use '${normalizedGender}' for gender instead of ${gender}`
+ );
+
+ 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,
+ // TODO christopher 21-03-2022: Remove fallback empty object when `strict: true`
+ {
+ generic,
+ female,
+ male,
+ }: { generic?: string[]; female?: string[]; male?: string[] } = {}
+) {
+ const normalizedGender = 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.
*/
@@ -18,131 +96,66 @@ 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?: string | number): 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;
- }
- }
-
- 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
- );
- } else {
- return this.faker.random.arrayElement(
- this.faker.definitions.name.female_first_name
- );
- }
- }
+ firstName(gender?: GenderType): string {
+ const { first_name, female_first_name, male_first_name } =
+ this.faker.definitions.name;
- return this.faker.random.arrayElement(
- this.faker.definitions.name.first_name
- );
+ return selectDefinition(this.faker, gender, {
+ generic: first_name,
+ female: female_first_name,
+ male: male_first_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?: string | number): 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
- );
- }
- }
+ lastName(gender?: GenderType): string {
+ 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 selectDefinition(this.faker, gender, {
+ generic: last_name,
+ female: female_last_name,
+ male: male_last_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?: string | number): 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
- );
- }
- }
+ middleName(gender?: GenderType): string {
+ 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 selectDefinition(this.faker, gender, {
+ generic: middle_name,
+ female: female_middle_name,
+ male: male_middle_name,
+ });
}
/**
@@ -151,35 +164,29 @@ 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?: string | number
- ): string {
- const r = this.faker.datatype.number(8);
+ findName(firstName?: string, lastName?: string, gender?: GenderType): string {
+ 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
-
- if (typeof gender !== 'number') {
- gender = this.faker.datatype.number(1);
- }
+ const normalizedGender: Exclude<GenderType, number> =
+ normalizeGender(gender) ??
+ this.faker.random.arrayElement(['female', 'male']);
- 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) {
@@ -198,22 +205,6 @@ export class Name {
}
/**
- * 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.
*
* @param binary Whether to return only binary gender names. Defaults to `false`.
@@ -227,44 +218,30 @@ 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);
}
/**
* 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?: string | number): 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
- );
- }
- }
+ prefix(gender?: GenderType): string {
+ const { prefix, female_prefix, male_prefix } = this.faker.definitions.name;
- return this.faker.random.arrayElement(this.faker.definitions.name.prefix);
+ return selectDefinition(this.faker, gender, {
+ generic: prefix,
+ female: female_prefix,
+ male: male_prefix,
+ });
}
/**
@@ -274,6 +251,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);
}
@@ -298,6 +276,22 @@ export class Name {
}
/**
+ * 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.
*
* @example
diff --git a/test/helpers.spec.ts b/test/helpers.spec.ts
index 64c12df5..cbb541c1 100644
--- a/test/helpers.spec.ts
+++ b/test/helpers.spec.ts
@@ -63,7 +63,7 @@ const seededRuns = [
name: 'Weissnat, Wintheiser and MacGyver',
},
- name: 'Lorene Deckow',
+ name: 'Darnell Deckow',
phone: '559.640.8661',
posts: [
{
@@ -138,7 +138,7 @@ const seededRuns = [
name: 'Langworth - Wyman',
},
- 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',
},
- name: 'Marilyn Effertz',
+ name: 'Eugene Effertz',
phone: '818-698-6199 x848',
posts: [
{
@@ -287,7 +287,7 @@ const seededRuns = [
name: 'Daugherty - Connelly',
},
- 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',
},
- name: 'Darrel Sanford',
+ name: 'Henrietta Sanford',
phone: '621-735-9398',
posts: [
{
@@ -436,7 +436,7 @@ const seededRuns = [
name: 'Fahey LLC',
},
- 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 2b8e9f0a..7572b3d6 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 = [
@@ -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',
@@ -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', () => {
@@ -182,23 +184,47 @@ 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);
+ });
+
+ it('should return a gender-specific first name when no gender-specific first name was defined', () => {
+ faker.locale = 'az';
+ faker.localeFallback = 'az';
+
+ const name = faker.name.firstName();
+ expect([
+ ...faker.definitions.name.female_first_name,
+ ...faker.definitions.name.male_first_name,
+ ]).toContain(name);
});
});
describe('lastName()', () => {
beforeEach(() => {
faker.locale = 'en';
+ faker.localeFallback = 'en';
});
it('should return a random last name', () => {
@@ -211,29 +237,38 @@ 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();
});
- // 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';
+ 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);
- }
- );
+ 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);
+ });
});
describe('middleName()', () => {
beforeEach(() => {
faker.locale = 'en';
+ faker.localeFallback = 'en';
});
it('should return a random middle name', () => {
@@ -243,42 +278,54 @@ 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();
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.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('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);
- }
- );
+ name = faker.name.middleName('male');
+ expect(faker.definitions.name.male_middle_name).toContain(name);
+ });
});
describe('findName()', () => {
beforeEach(() => {
faker.locale = 'en';
+ faker.localeFallback = 'en';
});
it('should return a name with firstName and lastName', () => {
@@ -288,24 +335,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';
@@ -316,7 +345,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) {
@@ -324,17 +353,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) {
@@ -352,36 +381,41 @@ 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);
+ }
});
});
describe('gender()', () => {
beforeEach(() => {
faker.locale = 'en';
+ faker.localeFallback = 'en';
});
it('should return a default gender', () => {
@@ -402,6 +436,7 @@ describe('name', () => {
describe('prefix()', () => {
beforeEach(() => {
faker.locale = 'en';
+ faker.localeFallback = 'en';
});
it('should return a prefix', () => {
@@ -411,17 +446,16 @@ 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);
});
- // 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');
@@ -430,29 +464,45 @@ 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();
});
- // 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 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();
});
});
describe('suffix()', () => {
beforeEach(() => {
faker.locale = 'en';
+ faker.localeFallback = 'en';
});
it('should return a suffix', () => {
@@ -466,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', () => {
@@ -482,9 +533,29 @@ describe('name', () => {
});
});
+ describe('jobTitle()', () => {
+ beforeEach(() => {
+ faker.locale = 'en';
+ faker.localeFallback = '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';
+ faker.localeFallback = 'en';
});
it('should return a descriptor', () => {
@@ -499,6 +570,7 @@ describe('name', () => {
describe('jobArea()', () => {
beforeEach(() => {
faker.locale = 'en';
+ faker.localeFallback = 'en';
});
it('should return a level', () => {
@@ -513,6 +585,7 @@ describe('name', () => {
describe('jobType()', () => {
beforeEach(() => {
faker.locale = 'en';
+ faker.localeFallback = 'en';
});
it('should return a job', () => {