From 5aa24e1076f64e68b13b1b6fdaa554a212e98016 Mon Sep 17 00:00:00 2001 From: Piotr Kuczynski Date: Wed, 23 Mar 2022 22:15:12 +0100 Subject: [PATCH 01/11] fix: datatype.number does not produce random number when min = max + precision --- src/datatype.ts | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/src/datatype.ts b/src/datatype.ts index 706ed60e906..02ae70b0c55 100644 --- a/src/datatype.ts +++ b/src/datatype.ts @@ -41,25 +41,14 @@ export class Datatype { number( options?: number | { min?: number; max?: number; precision?: number } ): number { - if (typeof options === 'number') { - options = { max: options }; - } - - options = options ?? {}; + const opts = typeof options === 'number' ? { max: options } : options ?? {}; - let max = 99999; - let min = 0; - let precision = 1; - if (typeof options.min === 'number') { - min = options.min; - } - - if (typeof options.max === 'number') { - max = options.max; - } + const precision = typeof opts.precision === 'number' ? opts.precision : 1; + const min = typeof opts.min === 'number' ? opts.min : 0; + let max = typeof opts.max === 'number' ? opts.max : min + 99999; - if (typeof options.precision === 'number') { - precision = options.precision; + if (max <= min) { + throw new Error(`Max should be larger then min: ${max} > ${min}`); } // Make the range inclusive of the max value @@ -67,13 +56,12 @@ export class Datatype { max += precision; } - let randomNumber = Math.floor( + const randomNumber = Math.floor( this.faker.mersenne.rand(max / precision, min / precision) ); - // Workaround problem in Float point arithmetics for e.g. 6681493 / 0.01 - randomNumber = randomNumber / (1 / precision); - return randomNumber; + // Workaround problem in float point arithmetics for e.g. 6681493 / 0.01 + return randomNumber / (1 / precision); } /** From 2f6f6418d2e84ac0bccd742c56cee1e9ec6af51c Mon Sep 17 00:00:00 2001 From: Piotr Kuczynski Date: Wed, 23 Mar 2022 23:01:20 +0100 Subject: [PATCH 02/11] fix: random array element for single item array --- src/random.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/random.ts b/src/random.ts index dd58c3ce821..701e9237a04 100644 --- a/src/random.ts +++ b/src/random.ts @@ -107,8 +107,12 @@ export class Random { arrayElement( array: ReadonlyArray = ['a', 'b', 'c'] as unknown as ReadonlyArray ): T { - const r = this.faker.datatype.number({ max: array.length - 1 }); - return array[r]; + const index = + array.length > 1 + ? this.faker.datatype.number({ max: array.length - 1 }) + : 0; + + return array[index]; } /** From 305989aaebce07b2224eb2f044ca13be085a9c3c Mon Sep 17 00:00:00 2001 From: Piotr Kuczynski Date: Thu, 24 Mar 2022 13:48:58 +0100 Subject: [PATCH 03/11] fix: tests --- test/word.spec.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/test/word.spec.ts b/test/word.spec.ts index ac40c8a5e01..03720774769 100644 --- a/test/word.spec.ts +++ b/test/word.spec.ts @@ -88,35 +88,35 @@ const seededRuns = [ adjective: { noArgs: 'verifiable', length10: 'unfinished', - length20: 'joyous', + length20: 'verifiable', }, adverb: { noArgs: 'viciously', length10: 'unbearably', - length20: 'loudly', + length20: 'viciously', }, conjunction: { noArgs: 'whereas', length10: 'as soon as', - length20: 'in addition', + length20: 'whereas', }, interjection: { noArgs: 'er', - length10: 'gah', - length20: 'gah', + length10: 'er', + length20: 'er', }, noun: { - noArgs: 'trick', + noArgs: 'intercode', length10: 'trafficker', - length20: 'infection', + length20: 'trick', }, preposition: { noArgs: 'upon', length10: 'underneath', - length20: 'for', + length20: 'upon', }, verb: { - noArgs: 'trick', + noArgs: 'intercode', length10: 'trampoline', length20: 'intercede', }, From ccdfdef375748838350d2c7993d749566c28d068 Mon Sep 17 00:00:00 2001 From: Piotr Kuczynski Date: Tue, 29 Mar 2022 17:35:00 +0200 Subject: [PATCH 04/11] docs: update docs --- src/datatype.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/datatype.ts b/src/datatype.ts index ce8021363f8..fa724221eb7 100644 --- a/src/datatype.ts +++ b/src/datatype.ts @@ -20,7 +20,7 @@ export class Datatype { * * @param options Maximum value or options object. * @param options.min Lower bound for generated number. Defaults to `0`. - * @param options.max Upper bound for generated number. Defaults to `99999`. + * @param options.max Upper bound for generated number. Defaults to `min + 99999`. * @param options.precision Precision of the generated number. Defaults to `1`. * * @example From fcb05dbe4cac6b1405cbe5d2c4d058e70933a6f4 Mon Sep 17 00:00:00 2001 From: Piotr Kuczynski Date: Tue, 29 Mar 2022 17:36:43 +0200 Subject: [PATCH 05/11] apply feedback --- src/datatype.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/datatype.ts b/src/datatype.ts index fa724221eb7..536bbde2a32 100644 --- a/src/datatype.ts +++ b/src/datatype.ts @@ -40,10 +40,14 @@ export class Datatype { const min = typeof opts.min === 'number' ? opts.min : 0; let max = typeof opts.max === 'number' ? opts.max : min + 99999; - if (max <= min) { + if (max < min) { throw new Error(`Max should be larger then min: ${max} > ${min}`); } + if (max === min) { + return max; + } + // Make the range inclusive of the max value if (max >= 0) { max += precision; From ee7359d6ed84667e6d902ed9dd6f5b34a2de107b Mon Sep 17 00:00:00 2001 From: Piotr Kuczynski Date: Tue, 29 Mar 2022 17:38:45 +0200 Subject: [PATCH 06/11] chore: Update src/datatype.ts Co-authored-by: Shinigami --- src/datatype.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/datatype.ts b/src/datatype.ts index 536bbde2a32..4927ee472a6 100644 --- a/src/datatype.ts +++ b/src/datatype.ts @@ -36,9 +36,9 @@ export class Datatype { ): number { const opts = typeof options === 'number' ? { max: options } : options ?? {}; - const precision = typeof opts.precision === 'number' ? opts.precision : 1; const min = typeof opts.min === 'number' ? opts.min : 0; let max = typeof opts.max === 'number' ? opts.max : min + 99999; + const precision = typeof opts.precision === 'number' ? opts.precision : 1; if (max < min) { throw new Error(`Max should be larger then min: ${max} > ${min}`); From d56e4c754714c2dd059d648ecb28a98866d9f414 Mon Sep 17 00:00:00 2001 From: Piotr Kuczynski Date: Tue, 29 Mar 2022 21:59:10 +0200 Subject: [PATCH 07/11] test: fixes --- test/datatype.spec.ts | 8 ++++++++ test/system.spec.ts | 20 +++++++++++--------- test/word.spec.ts | 38 +++++++++++++++++++------------------- 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/test/datatype.spec.ts b/test/datatype.spec.ts index 902cf9ba706..b2ec88f13e5 100644 --- a/test/datatype.spec.ts +++ b/test/datatype.spec.ts @@ -288,6 +288,14 @@ describe('datatype', () => { }); expect(actual).toEqual(expectations.number.withMinAndMaxAndPrecision); }); + + it('should throw when min > max', () => { + faker.seed(seed); + + expect(() => { + faker.datatype.number({ min: 10, max: 9 }); + }).toThrowError(`Max should be larger then min: 9 > 10`); + }); }); describe('float', () => { diff --git a/test/system.spec.ts b/test/system.spec.ts index e9eee5060ec..6906eac3f13 100644 --- a/test/system.spec.ts +++ b/test/system.spec.ts @@ -7,45 +7,45 @@ const seededRuns = [ { seed: 42, expectations: { - fileName: 'mobile_application.wad', - commonFileName: 'mobile_application.gif', + fileName: 'mobile_fish.gif', + commonFileName: 'mobile_fish.mpe', mimeType: 'application/vnd.marlin.drm.license+xml', commonFileType: 'audio', commonFileExt: 'png', fileType: 'image', fileExt: 'chm', directoryPath: '/opt/bin', - filePath: '/opt/bin/directives_savings_computer.qwd', + filePath: '/opt/bin/directives_application_home.paw', semver: '3.7.9', }, }, { seed: 1337, expectations: { - fileName: 'delaware.vcg', - commonFileName: 'delaware.wav', + fileName: 'delaware.uvvt', + commonFileName: 'delaware.mp2', mimeType: 'application/vnd.dxr', commonFileType: 'audio', commonFileExt: 'wav', fileType: 'font', fileExt: 'gxt', directoryPath: '/Library', - filePath: '/Library/bike_kiribati.kpr', + filePath: '/Library/bike_interactive.qwt', semver: '2.5.1', }, }, { seed: 1211, expectations: { - fileName: 'turnpike_supervisor_chicken.mka', - commonFileName: 'turnpike_supervisor_chicken.mp4v', + fileName: 'turnpike_frozen_handcrafted.mka', + commonFileName: 'turnpike_frozen_handcrafted.mka', mimeType: 'text/vnd.fmi.flexstor', commonFileType: 'application', commonFileExt: 'htm', fileType: 'x-shader', fileExt: 'opml', directoryPath: '/var/log', - filePath: '/var/log/forward_frozen.swf', + filePath: '/var/log/forward_supervisor.swf', semver: '9.4.8', }, }, @@ -101,6 +101,8 @@ describe('system', () => { 'jpeg', 'm2a', 'm2v', + 'mp2', + 'mp3', 'mp4', 'mp4v', 'mpeg', diff --git a/test/word.spec.ts b/test/word.spec.ts index 03720774769..d236f564a0c 100644 --- a/test/word.spec.ts +++ b/test/word.spec.ts @@ -8,37 +8,37 @@ const seededRuns = [ adjective: { noArgs: 'harmonious', length10: 'gregarious', - length20: 'stable', + length20: 'harmonious', }, adverb: { noArgs: 'jealously', length10: 'generously', - length20: 'swiftly', + length20: 'jealously', }, conjunction: { noArgs: 'however', length10: 'as much as', - length20: 'since', + length20: 'however', }, interjection: { noArgs: 'yahoo', - length10: 'ack', - length20: 'ack', + length10: 'yahoo', + length20: 'yahoo', }, noun: { noArgs: 'gale', length10: 'exposition', - length20: 'shift', + length20: 'gale', }, preposition: { noArgs: 'concerning', length10: 'throughout', - length20: 'than', + length20: 'concerning', }, verb: { noArgs: 'function', length10: 'exasperate', - length20: 'shred', + length20: 'function', }, }, }, @@ -48,37 +48,37 @@ const seededRuns = [ adjective: { noArgs: 'fabulous', length10: 'enchanting', - length20: 'neat', + length20: 'fabulous', }, adverb: { noArgs: 'frankly', length10: 'enormously', - length20: 'overconfidently', + length20: 'frankly', }, conjunction: { noArgs: 'even if', length10: 'as long as', - length20: 'instead', + length20: 'even if', }, interjection: { noArgs: 'ew', - length10: 'yippee', - length20: 'yippee', + length10: 'ew', + length20: 'ew', }, noun: { noArgs: 'digit', length10: 'depressive', - length20: 'might', + length20: 'digit', }, preposition: { noArgs: 'barring', length10: 'concerning', - length20: 'midst', + length20: 'barring', }, verb: { noArgs: 'dispense', length10: 'demoralize', - length20: 'nearest', + length20: 'dispense', }, }, }, @@ -106,7 +106,7 @@ const seededRuns = [ length20: 'er', }, noun: { - noArgs: 'intercode', + noArgs: 'trick', length10: 'trafficker', length20: 'trick', }, @@ -116,9 +116,9 @@ const seededRuns = [ length20: 'upon', }, verb: { - noArgs: 'intercode', + noArgs: 'trick', length10: 'trampoline', - length20: 'intercede', + length20: 'trick', }, }, }, From 89851e79b7ec0956dd2b171fe280cd657c945c7a Mon Sep 17 00:00:00 2001 From: Piotr Kuczynski Date: Tue, 29 Mar 2022 22:48:22 +0200 Subject: [PATCH 08/11] test: fixes --- src/address.ts | 4 ++-- src/datatype.ts | 6 +----- src/locales/ro/address/index.ts | 2 +- test/address.spec.ts | 2 +- test/datatype.spec.ts | 19 +++++++++++-------- test/system.spec.ts | 2 +- 6 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/address.ts b/src/address.ts index 5a130cb20a2..84a57ce1af0 100644 --- a/src/address.ts +++ b/src/address.ts @@ -407,8 +407,8 @@ export class Address { latitude(max: number = 90, min: number = -90, precision: number = 4): string { return this.faker.datatype .number({ - max: max, - min: min, + max, + min, precision: parseFloat((0.0).toPrecision(precision) + '1'), }) .toFixed(precision); diff --git a/src/datatype.ts b/src/datatype.ts index 6484b4ad8b7..6a8f2db6cc6 100644 --- a/src/datatype.ts +++ b/src/datatype.ts @@ -41,11 +41,7 @@ export class Datatype { const precision = typeof opts.precision === 'number' ? opts.precision : 1; if (max < min) { - throw new Error(`Max should be larger then min: ${max} > ${min}`); - } - - if (max === min) { - return max; + throw new Error(`Max ${max} should be larger then min ${min}`); } // Make the range inclusive of the max value diff --git a/src/locales/ro/address/index.ts b/src/locales/ro/address/index.ts index 9b4199f6e12..015977a22b5 100644 --- a/src/locales/ro/address/index.ts +++ b/src/locales/ro/address/index.ts @@ -25,10 +25,10 @@ const address = { secondary_address, state, state_abbr, - streets, street_address, street_name, street_suffix, + streets, } as Partial; export default address; diff --git a/test/address.spec.ts b/test/address.spec.ts index 729d9190b0f..5929f4628cb 100644 --- a/test/address.spec.ts +++ b/test/address.spec.ts @@ -411,7 +411,7 @@ describe('address', () => { it('returns latitude with min and max and default precision', () => { for (let i = 0; i < 100; i++) { - const latitude = faker.address.latitude(-5, 5); + const latitude = faker.address.latitude(5, -5); expect(latitude).toBeTypeOf('string'); expect( diff --git a/test/datatype.spec.ts b/test/datatype.spec.ts index b2ec88f13e5..e4d69fe69b2 100644 --- a/test/datatype.spec.ts +++ b/test/datatype.spec.ts @@ -8,7 +8,7 @@ const seededRuns = [ number: { noArgs: 37454, numbers: [2, 5, 6, 1, 5], - withMin: 37427, + withMin: 37412, withMinAndMax: -1, withMax: 26, withMinAndMaxAndPrecision: -0.43, @@ -16,7 +16,7 @@ const seededRuns = [ float: { noArgs: 37453.64, numbers: [37452, 79656, 95076, 18342, 73200], - withMin: 37427.37, + withMin: 37411.64, withMinAndMax: -0.43, withMax: 25.84, withMinAndMaxAndPrecision: -0.4261, @@ -80,7 +80,7 @@ const seededRuns = [ number: { noArgs: 26202, numbers: [1, 3, 1, 1, 1], - withMin: 26171, + withMin: 26160, withMinAndMax: -13, withMax: 18, withMinAndMaxAndPrecision: -12.92, @@ -88,7 +88,7 @@ const seededRuns = [ float: { noArgs: 26202.2, numbers: [26202, 56052, 15864, 21258, 27810], - withMin: 26171.21, + withMin: 26160.2, withMinAndMax: -12.92, withMax: 18.08, withMinAndMaxAndPrecision: -12.9153, @@ -152,7 +152,7 @@ const seededRuns = [ number: { noArgs: 92852, numbers: [6, 3, 6, 5, 1], - withMin: 92849, + withMin: 92810, withMinAndMax: 61, withMax: 64, withMinAndMaxAndPrecision: 61.07, @@ -160,7 +160,7 @@ const seededRuns = [ float: { noArgs: 92851.09, numbers: [92856, 45900, 89346, 77826, 22554], - withMin: 92848.09, + withMin: 92809.09, withMinAndMax: 61.07, withMax: 64.07, withMinAndMaxAndPrecision: 61.0658, @@ -290,11 +290,14 @@ describe('datatype', () => { }); it('should throw when min > max', () => { + const min = 10; + const max = 9; + faker.seed(seed); expect(() => { - faker.datatype.number({ min: 10, max: 9 }); - }).toThrowError(`Max should be larger then min: 9 > 10`); + faker.datatype.number({ min, max }); + }).toThrowError(`Max ${max} should be larger then min ${min}`); }); }); diff --git a/test/system.spec.ts b/test/system.spec.ts index 6906eac3f13..e3e7f692adf 100644 --- a/test/system.spec.ts +++ b/test/system.spec.ts @@ -38,7 +38,7 @@ const seededRuns = [ seed: 1211, expectations: { fileName: 'turnpike_frozen_handcrafted.mka', - commonFileName: 'turnpike_frozen_handcrafted.mka', + commonFileName: 'turnpike_frozen_handcrafted.mp4v', mimeType: 'text/vnd.fmi.flexstor', commonFileType: 'application', commonFileExt: 'htm', From 9c312fcc57872a59c1166468d345c3f7600b1281 Mon Sep 17 00:00:00 2001 From: Piotr Kuczynski Date: Wed, 30 Mar 2022 01:17:58 +0200 Subject: [PATCH 09/11] Update index.ts --- src/locales/ro/address/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/ro/address/index.ts b/src/locales/ro/address/index.ts index 015977a22b5..9b4199f6e12 100644 --- a/src/locales/ro/address/index.ts +++ b/src/locales/ro/address/index.ts @@ -25,10 +25,10 @@ const address = { secondary_address, state, state_abbr, + streets, street_address, street_name, street_suffix, - streets, } as Partial; export default address; From ee6382e9ca52adfdbee70e2623e904228a685ac5 Mon Sep 17 00:00:00 2001 From: Piotr Kuczynski Date: Wed, 30 Mar 2022 01:18:48 +0200 Subject: [PATCH 10/11] Update src/address.ts Co-authored-by: ST-DDT --- src/address.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/address.ts b/src/address.ts index 84a57ce1af0..264b02817fc 100644 --- a/src/address.ts +++ b/src/address.ts @@ -407,8 +407,8 @@ export class Address { latitude(max: number = 90, min: number = -90, precision: number = 4): string { return this.faker.datatype .number({ - max, min, + max, precision: parseFloat((0.0).toPrecision(precision) + '1'), }) .toFixed(precision); From 815f431044fccb1c87507d02bc8aa1d1b61d7217 Mon Sep 17 00:00:00 2001 From: Piotr Kuczynski Date: Thu, 31 Mar 2022 11:25:37 +0200 Subject: [PATCH 11/11] doc: add @throws --- src/datatype.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/datatype.ts b/src/datatype.ts index 6a8f2db6cc6..79b0b61c1c1 100644 --- a/src/datatype.ts +++ b/src/datatype.ts @@ -23,6 +23,8 @@ export class Datatype { * @param options.max Upper bound for generated number. Defaults to `min + 99999`. * @param options.precision Precision of the generated number. Defaults to `1`. * + * @throws When options define `max < min` + * * @example * faker.datatype.number() // 55422 * faker.datatype.number(100) // 52