@fgv/ts-random 5.1.0-10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.rush/temp/c2ad0e42263413fe491d7e8bda8971b52b833952.tar.log +121 -0
- package/.rush/temp/chunked-rush-logs/ts-random.build.chunks.jsonl +6 -0
- package/.rush/temp/operation/build/all.log +6 -0
- package/.rush/temp/operation/build/log-chunks.jsonl +6 -0
- package/.rush/temp/operation/build/state.json +3 -0
- package/.rush/temp/shrinkwrap-deps.json +610 -0
- package/config/jest.config.json +13 -0
- package/config/rig.json +4 -0
- package/config/typedoc.json +7 -0
- package/dist/generator/generators.js +207 -0
- package/dist/generator/generators.js.map +1 -0
- package/dist/generator/index.js +22 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/randomSource.js +141 -0
- package/dist/generator/randomSource.js.map +1 -0
- package/dist/generator-data/charClasses.js +95 -0
- package/dist/generator-data/charClasses.js.map +1 -0
- package/dist/generator-data/index.js +22 -0
- package/dist/generator-data/index.js.map +1 -0
- package/dist/generator-data/words/adjectives.js +247 -0
- package/dist/generator-data/words/adjectives.js.map +1 -0
- package/dist/generator-data/words/animals.js +75 -0
- package/dist/generator-data/words/animals.js.map +1 -0
- package/dist/generator-data/words/cities.js +229 -0
- package/dist/generator-data/words/cities.js.map +1 -0
- package/dist/generator-data/words/colors.js +56 -0
- package/dist/generator-data/words/colors.js.map +1 -0
- package/dist/generator-data/words/countries.js +217 -0
- package/dist/generator-data/words/countries.js.map +1 -0
- package/dist/generator-data/words/domains.js +47 -0
- package/dist/generator-data/words/domains.js.map +1 -0
- package/dist/generator-data/words/gerunds.js +126 -0
- package/dist/generator-data/words/gerunds.js.map +1 -0
- package/dist/generator-data/words/index.js +29 -0
- package/dist/generator-data/words/index.js.map +1 -0
- package/dist/generator-data/words/jobs.js +175 -0
- package/dist/generator-data/words/jobs.js.map +1 -0
- package/dist/generator-data/words/names.js +714 -0
- package/dist/generator-data/words/names.js.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/test/unit/generators.test.js +596 -0
- package/dist/test/unit/generators.test.js.map +1 -0
- package/dist/test/unit/randomSource.test.js +452 -0
- package/dist/test/unit/randomSource.test.js.map +1 -0
- package/docs/Chars/README.md +152 -0
- package/docs/Chars/variables/all.md +9 -0
- package/docs/Chars/variables/alphanumeric.md +9 -0
- package/docs/Chars/variables/base64.md +9 -0
- package/docs/Chars/variables/base64Url.md +9 -0
- package/docs/Chars/variables/base64UrlNoPadding.md +9 -0
- package/docs/Chars/variables/digits.md +9 -0
- package/docs/Chars/variables/hex.md +9 -0
- package/docs/Chars/variables/hexDigits.md +9 -0
- package/docs/Chars/variables/hexDigitsUpper.md +9 -0
- package/docs/Chars/variables/letters.md +9 -0
- package/docs/Chars/variables/lowerCase.md +9 -0
- package/docs/Chars/variables/printable.md +9 -0
- package/docs/Chars/variables/symbols.md +9 -0
- package/docs/Chars/variables/upperCase.md +9 -0
- package/docs/Chars/variables/whitespace.md +9 -0
- package/docs/Generator/README.md +153 -0
- package/docs/Generator/classes/PseudoRandomGenerator.clone.md +17 -0
- package/docs/Generator/classes/PseudoRandomGenerator.create.md +24 -0
- package/docs/Generator/classes/PseudoRandomGenerator.createChild.md +24 -0
- package/docs/Generator/classes/PseudoRandomGenerator.ensureRng.md +25 -0
- package/docs/Generator/classes/PseudoRandomGenerator.getGlobalRng.md +17 -0
- package/docs/Generator/classes/PseudoRandomGenerator.md +258 -0
- package/docs/Generator/classes/PseudoRandomGenerator.nextBoolean.md +24 -0
- package/docs/Generator/classes/PseudoRandomGenerator.nextFloat.md +17 -0
- package/docs/Generator/classes/PseudoRandomGenerator.nextInRange.md +25 -0
- package/docs/Generator/classes/PseudoRandomGenerator.nextInt.md +24 -0
- package/docs/Generator/classes/PseudoRandomGenerator.nextString.md +25 -0
- package/docs/Generator/classes/PseudoRandomGenerator.pickNext.md +24 -0
- package/docs/Generator/classes/PseudoRandomGenerator.pickRandom.md +24 -0
- package/docs/Generator/classes/PseudoRandomGenerator.pickSequence.md +24 -0
- package/docs/Generator/classes/PseudoRandomGenerator.pickSequential.md +24 -0
- package/docs/Generator/classes/PseudoRandomGenerator.rng.md +11 -0
- package/docs/Generator/classes/PseudoRandomGenerator.setGlobalRng.md +24 -0
- package/docs/Generator/classes/SeededRandomSource.clone.md +17 -0
- package/docs/Generator/classes/SeededRandomSource.counter.md +11 -0
- package/docs/Generator/classes/SeededRandomSource.create.md +24 -0
- package/docs/Generator/classes/SeededRandomSource.createChild.md +24 -0
- package/docs/Generator/classes/SeededRandomSource.hashSeed.md +24 -0
- package/docs/Generator/classes/SeededRandomSource.hashStateAndLabel.md +25 -0
- package/docs/Generator/classes/SeededRandomSource.lineage.md +9 -0
- package/docs/Generator/classes/SeededRandomSource.md +187 -0
- package/docs/Generator/classes/SeededRandomSource.mulberryStep.md +24 -0
- package/docs/Generator/classes/SeededRandomSource.next.md +17 -0
- package/docs/Generator/classes/SeededRandomSource.seed.md +9 -0
- package/docs/Generator/interfaces/INextResult.md +61 -0
- package/docs/Generator/interfaces/INextResult.nextState.md +9 -0
- package/docs/Generator/interfaces/INextResult.value.md +9 -0
- package/docs/Generator/interfaces/IPseudoRandomGeneratorCreateParams.global.md +9 -0
- package/docs/Generator/interfaces/IPseudoRandomGeneratorCreateParams.md +78 -0
- package/docs/Generator/interfaces/IPseudoRandomGeneratorCreateParams.seed.md +9 -0
- package/docs/Generator/interfaces/IPseudoRandomGeneratorCreateParams.step.md +9 -0
- package/docs/Generator/interfaces/IRandomSequencePickParams.candidates.md +9 -0
- package/docs/Generator/interfaces/IRandomSequencePickParams.count.md +9 -0
- package/docs/Generator/interfaces/IRandomSequencePickParams.how.md +9 -0
- package/docs/Generator/interfaces/IRandomSequencePickParams.md +79 -0
- package/docs/Generator/interfaces/ISeedPair.md +61 -0
- package/docs/Generator/interfaces/ISeedPair.seed.md +9 -0
- package/docs/Generator/interfaces/ISeedPair.state.md +9 -0
- package/docs/Generator/interfaces/ISeededRandomSourceConstructorParams.counter.md +9 -0
- package/docs/Generator/interfaces/ISeededRandomSourceConstructorParams.lineage.md +9 -0
- package/docs/Generator/interfaces/ISeededRandomSourceConstructorParams.md +112 -0
- package/docs/Generator/interfaces/ISeededRandomSourceConstructorParams.seed.md +9 -0
- package/docs/Generator/interfaces/ISeededRandomSourceConstructorParams.state.md +9 -0
- package/docs/Generator/interfaces/ISeededRandomSourceConstructorParams.step.md +9 -0
- package/docs/Generator/interfaces/ISeededRandomSourceCreateParams.md +61 -0
- package/docs/Generator/interfaces/ISeededRandomSourceCreateParams.seed.md +9 -0
- package/docs/Generator/interfaces/ISeededRandomSourceCreateParams.step.md +9 -0
- package/docs/Generator/interfaces/ISequentialPickParams.candidates.md +9 -0
- package/docs/Generator/interfaces/ISequentialPickParams.count.md +9 -0
- package/docs/Generator/interfaces/ISequentialPickParams.how.md +9 -0
- package/docs/Generator/interfaces/ISequentialPickParams.md +79 -0
- package/docs/Generator/type-aliases/GeneratorGlobalThis.md +11 -0
- package/docs/Generator/type-aliases/RandomStepFunction.md +11 -0
- package/docs/Generator/type-aliases/SequencePickParams.md +11 -0
- package/docs/GeneratorData/Chars/README.md +152 -0
- package/docs/GeneratorData/Chars/variables/all.md +9 -0
- package/docs/GeneratorData/Chars/variables/alphanumeric.md +9 -0
- package/docs/GeneratorData/Chars/variables/base64.md +9 -0
- package/docs/GeneratorData/Chars/variables/base64Url.md +9 -0
- package/docs/GeneratorData/Chars/variables/base64UrlNoPadding.md +9 -0
- package/docs/GeneratorData/Chars/variables/digits.md +9 -0
- package/docs/GeneratorData/Chars/variables/hex.md +9 -0
- package/docs/GeneratorData/Chars/variables/hexDigits.md +9 -0
- package/docs/GeneratorData/Chars/variables/hexDigitsUpper.md +9 -0
- package/docs/GeneratorData/Chars/variables/letters.md +9 -0
- package/docs/GeneratorData/Chars/variables/lowerCase.md +9 -0
- package/docs/GeneratorData/Chars/variables/printable.md +9 -0
- package/docs/GeneratorData/Chars/variables/symbols.md +9 -0
- package/docs/GeneratorData/Chars/variables/upperCase.md +9 -0
- package/docs/GeneratorData/Chars/variables/whitespace.md +9 -0
- package/docs/GeneratorData/README.md +35 -0
- package/docs/GeneratorData/Words/README.md +125 -0
- package/docs/GeneratorData/Words/variables/Adjectives.md +7 -0
- package/docs/GeneratorData/Words/variables/Animals.md +7 -0
- package/docs/GeneratorData/Words/variables/Cities.md +7 -0
- package/docs/GeneratorData/Words/variables/Colors.md +7 -0
- package/docs/GeneratorData/Words/variables/Countries.md +7 -0
- package/docs/GeneratorData/Words/variables/Domains.md +7 -0
- package/docs/GeneratorData/Words/variables/FamilyNames.md +9 -0
- package/docs/GeneratorData/Words/variables/FirstNames.md +9 -0
- package/docs/GeneratorData/Words/variables/FirstNamesFemale.md +9 -0
- package/docs/GeneratorData/Words/variables/FirstNamesMale.md +9 -0
- package/docs/GeneratorData/Words/variables/Gerunds.md +7 -0
- package/docs/GeneratorData/Words/variables/jobs.md +7 -0
- package/docs/GeneratorData/variables/Adjectives.md +7 -0
- package/docs/GeneratorData/variables/Animals.md +7 -0
- package/docs/GeneratorData/variables/Cities.md +7 -0
- package/docs/GeneratorData/variables/Colors.md +7 -0
- package/docs/GeneratorData/variables/Countries.md +7 -0
- package/docs/GeneratorData/variables/Domains.md +7 -0
- package/docs/GeneratorData/variables/FamilyNames.md +9 -0
- package/docs/GeneratorData/variables/FirstNames.md +9 -0
- package/docs/GeneratorData/variables/FirstNamesFemale.md +9 -0
- package/docs/GeneratorData/variables/FirstNamesMale.md +9 -0
- package/docs/GeneratorData/variables/Gerunds.md +7 -0
- package/docs/GeneratorData/variables/all.md +9 -0
- package/docs/GeneratorData/variables/alphanumeric.md +9 -0
- package/docs/GeneratorData/variables/base64.md +9 -0
- package/docs/GeneratorData/variables/base64Url.md +9 -0
- package/docs/GeneratorData/variables/base64UrlNoPadding.md +9 -0
- package/docs/GeneratorData/variables/digits.md +9 -0
- package/docs/GeneratorData/variables/hex.md +9 -0
- package/docs/GeneratorData/variables/hexDigits.md +9 -0
- package/docs/GeneratorData/variables/hexDigitsUpper.md +9 -0
- package/docs/GeneratorData/variables/jobs.md +7 -0
- package/docs/GeneratorData/variables/letters.md +9 -0
- package/docs/GeneratorData/variables/lowerCase.md +9 -0
- package/docs/GeneratorData/variables/printable.md +9 -0
- package/docs/GeneratorData/variables/symbols.md +9 -0
- package/docs/GeneratorData/variables/upperCase.md +9 -0
- package/docs/GeneratorData/variables/whitespace.md +9 -0
- package/docs/README.md +35 -0
- package/docs/Words/README.md +125 -0
- package/docs/Words/variables/Adjectives.md +7 -0
- package/docs/Words/variables/Animals.md +7 -0
- package/docs/Words/variables/Cities.md +7 -0
- package/docs/Words/variables/Colors.md +7 -0
- package/docs/Words/variables/Countries.md +7 -0
- package/docs/Words/variables/Domains.md +7 -0
- package/docs/Words/variables/FamilyNames.md +9 -0
- package/docs/Words/variables/FirstNames.md +9 -0
- package/docs/Words/variables/FirstNamesFemale.md +9 -0
- package/docs/Words/variables/FirstNamesMale.md +9 -0
- package/docs/Words/variables/Gerunds.md +7 -0
- package/docs/Words/variables/jobs.md +7 -0
- package/docs/classes/PseudoRandomGenerator.clone.md +17 -0
- package/docs/classes/PseudoRandomGenerator.create.md +24 -0
- package/docs/classes/PseudoRandomGenerator.createChild.md +24 -0
- package/docs/classes/PseudoRandomGenerator.ensureRng.md +25 -0
- package/docs/classes/PseudoRandomGenerator.getGlobalRng.md +17 -0
- package/docs/classes/PseudoRandomGenerator.md +258 -0
- package/docs/classes/PseudoRandomGenerator.nextBoolean.md +24 -0
- package/docs/classes/PseudoRandomGenerator.nextFloat.md +17 -0
- package/docs/classes/PseudoRandomGenerator.nextInRange.md +25 -0
- package/docs/classes/PseudoRandomGenerator.nextInt.md +24 -0
- package/docs/classes/PseudoRandomGenerator.nextString.md +25 -0
- package/docs/classes/PseudoRandomGenerator.pickNext.md +24 -0
- package/docs/classes/PseudoRandomGenerator.pickRandom.md +24 -0
- package/docs/classes/PseudoRandomGenerator.pickSequence.md +24 -0
- package/docs/classes/PseudoRandomGenerator.pickSequential.md +24 -0
- package/docs/classes/PseudoRandomGenerator.rng.md +11 -0
- package/docs/classes/PseudoRandomGenerator.setGlobalRng.md +24 -0
- package/docs/classes/SeededRandomSource.clone.md +17 -0
- package/docs/classes/SeededRandomSource.counter.md +11 -0
- package/docs/classes/SeededRandomSource.create.md +24 -0
- package/docs/classes/SeededRandomSource.createChild.md +24 -0
- package/docs/classes/SeededRandomSource.hashSeed.md +24 -0
- package/docs/classes/SeededRandomSource.hashStateAndLabel.md +25 -0
- package/docs/classes/SeededRandomSource.lineage.md +9 -0
- package/docs/classes/SeededRandomSource.md +187 -0
- package/docs/classes/SeededRandomSource.mulberryStep.md +24 -0
- package/docs/classes/SeededRandomSource.next.md +17 -0
- package/docs/classes/SeededRandomSource.seed.md +9 -0
- package/docs/interfaces/INextResult.md +61 -0
- package/docs/interfaces/INextResult.nextState.md +9 -0
- package/docs/interfaces/INextResult.value.md +9 -0
- package/docs/interfaces/IPseudoRandomGeneratorCreateParams.global.md +9 -0
- package/docs/interfaces/IPseudoRandomGeneratorCreateParams.md +78 -0
- package/docs/interfaces/IPseudoRandomGeneratorCreateParams.seed.md +9 -0
- package/docs/interfaces/IPseudoRandomGeneratorCreateParams.step.md +9 -0
- package/docs/interfaces/IRandomSequencePickParams.candidates.md +9 -0
- package/docs/interfaces/IRandomSequencePickParams.count.md +9 -0
- package/docs/interfaces/IRandomSequencePickParams.how.md +9 -0
- package/docs/interfaces/IRandomSequencePickParams.md +79 -0
- package/docs/interfaces/ISeedPair.md +61 -0
- package/docs/interfaces/ISeedPair.seed.md +9 -0
- package/docs/interfaces/ISeedPair.state.md +9 -0
- package/docs/interfaces/ISeededRandomSourceConstructorParams.counter.md +9 -0
- package/docs/interfaces/ISeededRandomSourceConstructorParams.lineage.md +9 -0
- package/docs/interfaces/ISeededRandomSourceConstructorParams.md +112 -0
- package/docs/interfaces/ISeededRandomSourceConstructorParams.seed.md +9 -0
- package/docs/interfaces/ISeededRandomSourceConstructorParams.state.md +9 -0
- package/docs/interfaces/ISeededRandomSourceConstructorParams.step.md +9 -0
- package/docs/interfaces/ISeededRandomSourceCreateParams.md +61 -0
- package/docs/interfaces/ISeededRandomSourceCreateParams.seed.md +9 -0
- package/docs/interfaces/ISeededRandomSourceCreateParams.step.md +9 -0
- package/docs/interfaces/ISequentialPickParams.candidates.md +9 -0
- package/docs/interfaces/ISequentialPickParams.count.md +9 -0
- package/docs/interfaces/ISequentialPickParams.how.md +9 -0
- package/docs/interfaces/ISequentialPickParams.md +79 -0
- package/docs/type-aliases/GeneratorGlobalThis.md +11 -0
- package/docs/type-aliases/RandomStepFunction.md +11 -0
- package/docs/type-aliases/SequencePickParams.md +11 -0
- package/docs/variables/Adjectives.md +7 -0
- package/docs/variables/Animals.md +7 -0
- package/docs/variables/Cities.md +7 -0
- package/docs/variables/Colors.md +7 -0
- package/docs/variables/Countries.md +7 -0
- package/docs/variables/Domains.md +7 -0
- package/docs/variables/FamilyNames.md +9 -0
- package/docs/variables/FirstNames.md +9 -0
- package/docs/variables/FirstNamesFemale.md +9 -0
- package/docs/variables/FirstNamesMale.md +9 -0
- package/docs/variables/Gerunds.md +7 -0
- package/docs/variables/all.md +9 -0
- package/docs/variables/alphanumeric.md +9 -0
- package/docs/variables/base64.md +9 -0
- package/docs/variables/base64Url.md +9 -0
- package/docs/variables/base64UrlNoPadding.md +9 -0
- package/docs/variables/digits.md +9 -0
- package/docs/variables/hex.md +9 -0
- package/docs/variables/hexDigits.md +9 -0
- package/docs/variables/hexDigitsUpper.md +9 -0
- package/docs/variables/jobs.md +7 -0
- package/docs/variables/letters.md +9 -0
- package/docs/variables/lowerCase.md +9 -0
- package/docs/variables/printable.md +9 -0
- package/docs/variables/symbols.md +9 -0
- package/docs/variables/upperCase.md +9 -0
- package/docs/variables/whitespace.md +9 -0
- package/lib/generator/generators.d.ts +142 -0
- package/lib/generator/generators.d.ts.map +1 -0
- package/lib/generator/generators.js +211 -0
- package/lib/generator/generators.js.map +1 -0
- package/lib/generator/index.d.ts +3 -0
- package/lib/generator/index.d.ts.map +1 -0
- package/lib/generator/index.js +38 -0
- package/lib/generator/index.js.map +1 -0
- package/lib/generator/randomSource.d.ts +115 -0
- package/lib/generator/randomSource.d.ts.map +1 -0
- package/lib/generator/randomSource.js +145 -0
- package/lib/generator/randomSource.js.map +1 -0
- package/lib/generator-data/charClasses.d.ts +76 -0
- package/lib/generator-data/charClasses.d.ts.map +1 -0
- package/lib/generator-data/charClasses.js +98 -0
- package/lib/generator-data/charClasses.js.map +1 -0
- package/lib/generator-data/index.d.ts +3 -0
- package/lib/generator-data/index.d.ts.map +1 -0
- package/lib/generator-data/index.js +58 -0
- package/lib/generator-data/index.js.map +1 -0
- package/lib/generator-data/words/adjectives.d.ts +2 -0
- package/lib/generator-data/words/adjectives.d.ts.map +1 -0
- package/lib/generator-data/words/adjectives.js +250 -0
- package/lib/generator-data/words/adjectives.js.map +1 -0
- package/lib/generator-data/words/animals.d.ts +2 -0
- package/lib/generator-data/words/animals.d.ts.map +1 -0
- package/lib/generator-data/words/animals.js +78 -0
- package/lib/generator-data/words/animals.js.map +1 -0
- package/lib/generator-data/words/cities.d.ts +2 -0
- package/lib/generator-data/words/cities.d.ts.map +1 -0
- package/lib/generator-data/words/cities.js +232 -0
- package/lib/generator-data/words/cities.js.map +1 -0
- package/lib/generator-data/words/colors.d.ts +2 -0
- package/lib/generator-data/words/colors.d.ts.map +1 -0
- package/lib/generator-data/words/colors.js +59 -0
- package/lib/generator-data/words/colors.js.map +1 -0
- package/lib/generator-data/words/countries.d.ts +2 -0
- package/lib/generator-data/words/countries.d.ts.map +1 -0
- package/lib/generator-data/words/countries.js +220 -0
- package/lib/generator-data/words/countries.js.map +1 -0
- package/lib/generator-data/words/domains.d.ts +2 -0
- package/lib/generator-data/words/domains.d.ts.map +1 -0
- package/lib/generator-data/words/domains.js +50 -0
- package/lib/generator-data/words/domains.js.map +1 -0
- package/lib/generator-data/words/gerunds.d.ts +2 -0
- package/lib/generator-data/words/gerunds.d.ts.map +1 -0
- package/lib/generator-data/words/gerunds.js +129 -0
- package/lib/generator-data/words/gerunds.js.map +1 -0
- package/lib/generator-data/words/index.d.ts +10 -0
- package/lib/generator-data/words/index.d.ts.map +1 -0
- package/lib/generator-data/words/index.js +45 -0
- package/lib/generator-data/words/index.js.map +1 -0
- package/lib/generator-data/words/jobs.d.ts +2 -0
- package/lib/generator-data/words/jobs.d.ts.map +1 -0
- package/lib/generator-data/words/jobs.js +178 -0
- package/lib/generator-data/words/jobs.js.map +1 -0
- package/lib/generator-data/words/names.d.ts +21 -0
- package/lib/generator-data/words/names.d.ts.map +1 -0
- package/lib/generator-data/words/names.js +717 -0
- package/lib/generator-data/words/names.js.map +1 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +43 -0
- package/lib/index.js.map +1 -0
- package/lib/test/unit/generators.test.d.ts +2 -0
- package/lib/test/unit/generators.test.d.ts.map +1 -0
- package/lib/test/unit/generators.test.js +598 -0
- package/lib/test/unit/generators.test.js.map +1 -0
- package/lib/test/unit/randomSource.test.d.ts +2 -0
- package/lib/test/unit/randomSource.test.d.ts.map +1 -0
- package/lib/test/unit/randomSource.test.js +454 -0
- package/lib/test/unit/randomSource.test.js.map +1 -0
- package/package.json +49 -0
- package/rush-logs/ts-random.build.cache.log +3 -0
- package/rush-logs/ts-random.build.log +6 -0
- package/src/generator/generators.ts +273 -0
- package/src/generator/index.ts +22 -0
- package/src/generator/randomSource.ts +224 -0
- package/src/generator-data/charClasses.ts +95 -0
- package/src/generator-data/index.ts +22 -0
- package/src/generator-data/words/adjectives.ts +247 -0
- package/src/generator-data/words/animals.ts +75 -0
- package/src/generator-data/words/cities.ts +229 -0
- package/src/generator-data/words/colors.ts +56 -0
- package/src/generator-data/words/countries.ts +217 -0
- package/src/generator-data/words/domains.ts +47 -0
- package/src/generator-data/words/gerunds.ts +126 -0
- package/src/generator-data/words/index.ts +29 -0
- package/src/generator-data/words/jobs.ts +175 -0
- package/src/generator-data/words/names.ts +717 -0
- package/src/index.ts +7 -0
- package/src/test/unit/generators.test.ts +697 -0
- package/src/test/unit/randomSource.test.ts +526 -0
- package/temp/build/typescript/ts_8nwakTlr.json +1 -0
- package/tsconfig.json +7 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"names.js","sourceRoot":"","sources":["../../../src/generator-data/words/names.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Erik Fortune\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n/**\n * Male first names\n * @public\n */\nexport const FirstNamesMale: ReadonlyArray<string> = [\n // American/English\n 'James',\n 'John',\n 'Robert',\n 'Michael',\n 'William',\n 'David',\n 'Richard',\n 'Joseph',\n 'Thomas',\n 'Christopher',\n // Spanish/Latin American\n 'Carlos',\n 'Miguel',\n 'José',\n 'Juan',\n 'Luis',\n 'Antonio',\n 'Francisco',\n 'Diego',\n 'Alejandro',\n 'Pedro',\n // French\n 'Jean',\n 'Pierre',\n 'Louis',\n 'François',\n 'Jacques',\n 'Philippe',\n 'Michel',\n 'André',\n 'Henri',\n 'Nicolas',\n // German\n 'Hans',\n 'Klaus',\n 'Wolfgang',\n 'Dieter',\n 'Jürgen',\n 'Helmut',\n 'Günter',\n 'Manfred',\n 'Stefan',\n 'Matthias',\n // Italian\n 'Marco',\n 'Giuseppe',\n 'Giovanni',\n 'Luca',\n 'Francesco',\n 'Alessandro',\n 'Andrea',\n 'Matteo',\n 'Lorenzo',\n 'Stefano',\n // Russian\n 'Ivan',\n 'Dmitri',\n 'Alexei',\n 'Sergei',\n 'Nikolai',\n 'Mikhail',\n 'Vladimir',\n 'Andrei',\n 'Pavel',\n 'Viktor',\n // Chinese\n 'Wei',\n 'Fang',\n 'Lei',\n 'Ming',\n 'Jian',\n 'Hui',\n 'Tao',\n 'Chen',\n 'Jun',\n 'Hao',\n // Japanese\n 'Hiroshi',\n 'Takeshi',\n 'Kenji',\n 'Yuki',\n 'Haruki',\n 'Akira',\n 'Satoshi',\n 'Kazuki',\n 'Ryu',\n 'Daiki',\n // Korean\n 'Minho',\n 'Jungwoo',\n 'Seojun',\n 'Jihoon',\n 'Donghyun',\n 'Hyunwoo',\n 'Taehyung',\n 'Jimin',\n 'Seungho',\n 'Woojin',\n // Indian\n 'Raj',\n 'Amit',\n 'Vikram',\n 'Arjun',\n 'Rahul',\n 'Sanjay',\n 'Anil',\n 'Ravi',\n 'Suresh',\n 'Deepak',\n // Arabic/Middle Eastern\n 'Mohammed',\n 'Ahmed',\n 'Ali',\n 'Omar',\n 'Hassan',\n 'Yusuf',\n 'Ibrahim',\n 'Khalid',\n 'Tariq',\n 'Samir',\n // Greek\n 'Nikos',\n 'Dimitris',\n 'Kostas',\n 'Yannis',\n 'Giorgos',\n 'Stavros',\n 'Christos',\n 'Panagiotis',\n 'Alexandros',\n 'Vassilis',\n // Polish\n 'Piotr',\n 'Krzysztof',\n 'Andrzej',\n 'Tomasz',\n 'Marek',\n 'Pawel',\n 'Jakub',\n 'Stanislaw',\n 'Wojciech',\n 'Adam',\n // Irish\n 'Liam',\n 'Sean',\n 'Patrick',\n 'Connor',\n 'Cian',\n 'Oisin',\n 'Finn',\n 'Declan',\n 'Brendan',\n 'Eoin',\n // Scandinavian\n 'Erik',\n 'Lars',\n 'Olaf',\n 'Magnus',\n 'Sven',\n 'Bjorn',\n 'Anders',\n 'Henrik',\n 'Nils',\n 'Leif',\n // Portuguese/Brazilian\n 'João',\n 'Pedro',\n 'Paulo',\n 'Bruno',\n 'Lucas',\n 'Gustavo',\n 'Rafael',\n 'Thiago',\n 'Felipe',\n 'Matheus',\n // Dutch\n 'Jan',\n 'Pieter',\n 'Willem',\n 'Hendrik',\n 'Dirk',\n 'Cornelis',\n 'Johannes',\n 'Gerrit',\n 'Arjan',\n 'Bram',\n 'Thijs',\n // Turkish\n 'Mehmet',\n 'Mustafa',\n 'Ahmet',\n 'Emre',\n 'Burak',\n 'Osman',\n 'Hakan',\n 'Murat',\n 'Kemal',\n 'Serkan',\n // Hebrew/Israeli\n 'David',\n 'Moshe',\n 'Yosef',\n 'Avraham',\n 'Yaakov',\n 'Noam',\n 'Eitan',\n 'Oren',\n 'Avi',\n 'Eli',\n // African\n 'Kwame',\n 'Kofi',\n 'Amadi',\n 'Chidi',\n 'Oluwaseun',\n 'Jabari',\n 'Zuberi',\n 'Mandla',\n 'Thabo',\n 'Sipho'\n];\n\n/**\n * Female first names\n * @public\n */\nexport const FirstNamesFemale: ReadonlyArray<string> = [\n // American/English\n 'Mary',\n 'Patricia',\n 'Jennifer',\n 'Linda',\n 'Elizabeth',\n 'Barbara',\n 'Susan',\n 'Jessica',\n 'Sarah',\n 'Karen',\n 'Emily',\n 'Ashley',\n 'Amanda',\n 'Stephanie',\n 'Nicole',\n 'Melissa',\n 'Rebecca',\n 'Laura',\n 'Michelle',\n 'Kimberly',\n // Spanish/Latin American\n 'Maria',\n 'Carmen',\n 'Rosa',\n 'Ana',\n 'Isabel',\n 'Lucia',\n 'Elena',\n 'Sofia',\n 'Gabriela',\n 'Valentina',\n // French\n 'Marie',\n 'Jeanne',\n 'Françoise',\n 'Monique',\n 'Catherine',\n 'Nathalie',\n 'Isabelle',\n 'Sylvie',\n 'Chantal',\n 'Céline',\n // German\n 'Anna',\n 'Ursula',\n 'Ingrid',\n 'Monika',\n 'Karin',\n 'Sabine',\n 'Petra',\n 'Birgit',\n 'Claudia',\n 'Thea',\n // Italian\n 'Giulia',\n 'Francesca',\n 'Chiara',\n 'Sara',\n 'Valentina',\n 'Alessia',\n 'Federica',\n 'Elisa',\n 'Martina',\n 'Giorgia',\n // Russian\n 'Natasha',\n 'Olga',\n 'Tatiana',\n 'Svetlana',\n 'Irina',\n 'Ekaterina',\n 'Marina',\n 'Anastasia',\n 'Yelena',\n 'Ludmila',\n // Chinese\n 'Mei',\n 'Ling',\n 'Xiu',\n 'Yan',\n 'Jing',\n 'Li',\n 'Fang',\n 'Hui',\n 'Xia',\n 'Yue',\n // Japanese\n 'Yuki',\n 'Sakura',\n 'Hana',\n 'Aiko',\n 'Keiko',\n 'Yumi',\n 'Haruka',\n 'Emi',\n 'Akiko',\n 'Naomi',\n // Korean\n 'Minji',\n 'Soyeon',\n 'Jihye',\n 'Yuna',\n 'Eunji',\n 'Seoyeon',\n 'Haeun',\n 'Jiwoo',\n 'Chaeyoung',\n 'Soojin',\n // Indian\n 'Priya',\n 'Ananya',\n 'Deepna',\n 'Lakshmi',\n 'Sunita',\n 'Kavita',\n 'Meera',\n 'Pooja',\n 'Neha',\n 'Anjali',\n // Arabic/Middle Eastern\n 'Fatima',\n 'Aisha',\n 'Layla',\n 'Noor',\n 'Yasmin',\n 'Amira',\n 'Hana',\n 'Zara',\n 'Mariam',\n 'Leila',\n // Greek\n 'Eleni',\n 'Maria',\n 'Katerina',\n 'Sofia',\n 'Dimitra',\n 'Anastasia',\n 'Georgia',\n 'Ioanna',\n 'Athena',\n 'Despina',\n // Polish\n 'Anna',\n 'Maria',\n 'Katarzyna',\n 'Malgorzata',\n 'Agnieszka',\n 'Barbara',\n 'Ewa',\n 'Krystyna',\n 'Zofia',\n 'Jadwiga',\n // Irish\n 'Siobhan',\n 'Aoife',\n 'Ciara',\n 'Niamh',\n 'Saoirse',\n 'Aisling',\n 'Roisin',\n 'Maeve',\n 'Orla',\n 'Fiona',\n // Scandinavian\n 'Ingrid',\n 'Astrid',\n 'Freya',\n 'Sigrid',\n 'Helga',\n 'Greta',\n 'Liv',\n 'Elin',\n 'Maja',\n 'Saga',\n // Portuguese/Brazilian\n 'Ana',\n 'Beatriz',\n 'Carla',\n 'Fernanda',\n 'Juliana',\n 'Larissa',\n 'Mariana',\n 'Patricia',\n 'Renata',\n 'Vanessa',\n // Dutch\n 'Emma',\n 'Sophie',\n 'Lotte',\n 'Eva',\n 'Fleur',\n 'Femke',\n 'Sanne',\n 'Marieke',\n 'Anneke',\n 'Danique',\n // Turkish\n 'Ayse',\n 'Fatma',\n 'Zeynep',\n 'Elif',\n 'Merve',\n 'Esra',\n 'Selin',\n 'Derya',\n 'Tugba',\n 'Ebru',\n // Hebrew/Israeli\n 'Miriam',\n 'Ruth',\n 'Esther',\n 'Rivka',\n 'Tamar',\n 'Yael',\n 'Noa',\n 'Maya',\n 'Shira',\n 'Talia',\n // African\n 'Amara',\n 'Zuri',\n 'Nia',\n 'Imani',\n 'Adaeze',\n 'Chiamaka',\n 'Thandiwe',\n 'Naledi',\n 'Ayana',\n 'Makena'\n];\n\n/**\n * All first names\n * @public\n */\nexport const FirstNames: ReadonlyArray<string> = [...FirstNamesMale, ...FirstNamesFemale];\n\n/**\n * Family names / surnames\n * @public\n */\nexport const FamilyNames: ReadonlyArray<string> = [\n // American/English\n 'Smith',\n 'Johnson',\n 'Williams',\n 'Brown',\n 'Jones',\n 'Miller',\n 'Davis',\n 'Wilson',\n 'Anderson',\n 'Taylor',\n // Spanish/Latin American\n 'García',\n 'Rodríguez',\n 'Martínez',\n 'López',\n 'González',\n 'Hernández',\n 'Pérez',\n 'Sánchez',\n 'Ramírez',\n 'Torres',\n // French\n 'Martin',\n 'Bernard',\n 'Dubois',\n 'Thomas',\n 'Robert',\n 'Richard',\n 'Petit',\n 'Durand',\n 'Leroy',\n 'Moreau',\n // German\n 'Müller',\n 'Schmidt',\n 'Schneider',\n 'Fischer',\n 'Weber',\n 'Meyer',\n 'Wagner',\n 'Becker',\n 'Schulz',\n 'Hoffmann',\n // Italian\n 'Rossi',\n 'Russo',\n 'Ferrari',\n 'Esposito',\n 'Bianchi',\n 'Romano',\n 'Colombo',\n 'Ricci',\n 'Marino',\n 'Greco',\n // Russian\n 'Ivanov',\n 'Smirnov',\n 'Kuznetsov',\n 'Popov',\n 'Sokolov',\n 'Lebedev',\n 'Kozlov',\n 'Novikov',\n 'Morozov',\n 'Petrov',\n // Chinese\n 'Wang',\n 'Li',\n 'Zhang',\n 'Liu',\n 'Chen',\n 'Yang',\n 'Huang',\n 'Zhao',\n 'Wu',\n 'Zhou',\n // Japanese\n 'Sato',\n 'Suzuki',\n 'Takahashi',\n 'Tanaka',\n 'Watanabe',\n 'Ito',\n 'Yamamoto',\n 'Nakamura',\n 'Kobayashi',\n 'Kato',\n // Korean\n 'Kim',\n 'Lee',\n 'Park',\n 'Choi',\n 'Jung',\n 'Kang',\n 'Cho',\n 'Yoon',\n 'Jang',\n 'Lim',\n // Indian\n 'Patel',\n 'Sharma',\n 'Singh',\n 'Kumar',\n 'Gupta',\n 'Reddy',\n 'Nair',\n 'Rao',\n 'Mehta',\n 'Joshi',\n // Arabic/Middle Eastern\n 'Al-Farsi',\n 'Al-Rashid',\n 'Hassan',\n 'Hussein',\n 'Khan',\n 'Malik',\n 'Nasser',\n 'Qureshi',\n 'Rahman',\n 'Sharif',\n // Greek\n 'Papadopoulos',\n 'Pappas',\n 'Karagiannis',\n 'Vlahos',\n 'Nikolaou',\n 'Georgiou',\n 'Konstantinou',\n 'Alexiou',\n 'Dimitriou',\n 'Christodoulou',\n // Polish\n 'Nowak',\n 'Kowalski',\n 'Wiśniewski',\n 'Wójcik',\n 'Kowalczyk',\n 'Kamiński',\n 'Lewandowski',\n 'Zieliński',\n 'Szymański',\n 'Woźniak',\n // Irish\n 'Murphy',\n 'Kelly',\n 'Sullivan',\n 'Walsh',\n 'Smith',\n \"O'Brien\",\n 'Byrne',\n 'Ryan',\n \"O'Connor\",\n \"O'Neill\",\n // Scandinavian\n 'Johansson',\n 'Andersson',\n 'Karlsson',\n 'Nilsson',\n 'Eriksson',\n 'Larsson',\n 'Olsson',\n 'Persson',\n 'Svensson',\n 'Gustafsson',\n // Portuguese/Brazilian\n 'Silva',\n 'Santos',\n 'Oliveira',\n 'Souza',\n 'Rodrigues',\n 'Ferreira',\n 'Alves',\n 'Pereira',\n 'Lima',\n 'Gomes',\n // Dutch\n 'De Jong',\n 'Jansen',\n 'De Vries',\n 'Van den Berg',\n 'Van Dijk',\n 'Bakker',\n 'Janssen',\n 'Visser',\n 'Smit',\n 'Meijer',\n // Turkish\n 'Yılmaz',\n 'Kaya',\n 'Demir',\n 'Çelik',\n 'Şahin',\n 'Yıldız',\n 'Yıldırım',\n 'Öztürk',\n 'Aydın',\n 'Özdemir',\n // Hebrew/Israeli\n 'Cohen',\n 'Levi',\n 'Mizrahi',\n 'Peretz',\n 'Biton',\n 'Dahan',\n 'Friedman',\n 'Goldberg',\n 'Rosenberg',\n 'Shapiro',\n // African\n 'Okonkwo',\n 'Mensah',\n 'Nkosi',\n 'Diallo',\n 'Traore',\n 'Osei',\n 'Mbeki',\n 'Kamau',\n 'Mwangi',\n 'Ndlovu'\n];\n"]}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,aAAa,MAAM,kBAAkB,CAAC","sourcesContent":["/**\n * @packageDocumentation\n *\n */\n\nexport * as Generator from './generator';\nexport * as GeneratorData from './generator-data';\n"]}
|
|
@@ -0,0 +1,596 @@
|
|
|
1
|
+
import '@fgv/ts-utils-jest';
|
|
2
|
+
import { PseudoRandomGenerator } from '../../generator';
|
|
3
|
+
function createGenerator(seed = 42) {
|
|
4
|
+
return PseudoRandomGenerator.create({ seed }).orThrow();
|
|
5
|
+
}
|
|
6
|
+
describe('PseudoRandomGenerator', () => {
|
|
7
|
+
// Clean up global state between tests
|
|
8
|
+
afterEach(() => {
|
|
9
|
+
PseudoRandomGenerator.setGlobalRng(undefined);
|
|
10
|
+
});
|
|
11
|
+
describe('create', () => {
|
|
12
|
+
test('succeeds with no params', () => {
|
|
13
|
+
expect(PseudoRandomGenerator.create()).toSucceedAndSatisfy((gen) => {
|
|
14
|
+
expect(gen.rng).toBeDefined();
|
|
15
|
+
expect(gen.rng.counter).toBe(0);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
test('succeeds with a seed', () => {
|
|
19
|
+
expect(PseudoRandomGenerator.create({ seed: 123 })).toSucceedAndSatisfy((gen) => {
|
|
20
|
+
expect(gen.rng.seed).toBe('123');
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
test('succeeds with a string seed', () => {
|
|
24
|
+
expect(PseudoRandomGenerator.create({ seed: 'hello' })).toSucceedAndSatisfy((gen) => {
|
|
25
|
+
expect(gen.rng.seed).toBe('hello');
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
test('same seed produces identical sequences', () => {
|
|
29
|
+
const gen1 = createGenerator('deterministic');
|
|
30
|
+
const gen2 = createGenerator('deterministic');
|
|
31
|
+
const values1 = Array.from({ length: 10 }, () => gen1.nextFloat());
|
|
32
|
+
const values2 = Array.from({ length: 10 }, () => gen2.nextFloat());
|
|
33
|
+
expect(values1).toEqual(values2);
|
|
34
|
+
});
|
|
35
|
+
test('different seeds produce different sequences', () => {
|
|
36
|
+
const gen1 = createGenerator('alpha');
|
|
37
|
+
const gen2 = createGenerator('beta');
|
|
38
|
+
const values1 = Array.from({ length: 4 }, () => gen1.nextFloat());
|
|
39
|
+
const values2 = Array.from({ length: 4 }, () => gen2.nextFloat());
|
|
40
|
+
expect(values1).not.toEqual(values2);
|
|
41
|
+
});
|
|
42
|
+
test('sets global rng when global is true', () => {
|
|
43
|
+
expect(PseudoRandomGenerator.getGlobalRng()).toBeUndefined();
|
|
44
|
+
expect(PseudoRandomGenerator.create({ seed: 1, global: true })).toSucceedAndSatisfy((gen) => {
|
|
45
|
+
expect(PseudoRandomGenerator.getGlobalRng()).toBe(gen);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
test('does not set global rng when global is false', () => {
|
|
49
|
+
PseudoRandomGenerator.create({ seed: 1, global: false }).orThrow();
|
|
50
|
+
expect(PseudoRandomGenerator.getGlobalRng()).toBeUndefined();
|
|
51
|
+
});
|
|
52
|
+
test('does not set global rng when global is omitted', () => {
|
|
53
|
+
PseudoRandomGenerator.create({ seed: 1 }).orThrow();
|
|
54
|
+
expect(PseudoRandomGenerator.getGlobalRng()).toBeUndefined();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe('clone', () => {
|
|
58
|
+
test('produces identical sequence from clone point', () => {
|
|
59
|
+
const gen = createGenerator(7);
|
|
60
|
+
gen.nextFloat();
|
|
61
|
+
gen.nextFloat();
|
|
62
|
+
const clone = gen.clone();
|
|
63
|
+
const original = Array.from({ length: 5 }, () => gen.nextFloat());
|
|
64
|
+
const cloned = Array.from({ length: 5 }, () => clone.nextFloat());
|
|
65
|
+
expect(original).toEqual(cloned);
|
|
66
|
+
});
|
|
67
|
+
test('clone is independent of parent', () => {
|
|
68
|
+
const gen = createGenerator(7);
|
|
69
|
+
const clone = gen.clone();
|
|
70
|
+
gen.nextFloat();
|
|
71
|
+
gen.nextFloat();
|
|
72
|
+
gen.nextFloat();
|
|
73
|
+
expect(gen.rng.counter).toBe(3);
|
|
74
|
+
expect(clone.rng.counter).toBe(0);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe('createChild', () => {
|
|
78
|
+
test('child has independent state from parent', () => {
|
|
79
|
+
const gen = createGenerator(7);
|
|
80
|
+
gen.nextFloat();
|
|
81
|
+
const child = gen.createChild('branch');
|
|
82
|
+
expect(child.rng.counter).toBe(0);
|
|
83
|
+
expect(child.rng.lineage).toEqual(['1:branch']);
|
|
84
|
+
});
|
|
85
|
+
test('same label from same parent state produces identical child', () => {
|
|
86
|
+
const gen1 = createGenerator(7);
|
|
87
|
+
const gen2 = createGenerator(7);
|
|
88
|
+
gen1.nextFloat();
|
|
89
|
+
gen2.nextFloat();
|
|
90
|
+
const child1 = gen1.createChild('x');
|
|
91
|
+
const child2 = gen2.createChild('x');
|
|
92
|
+
const values1 = Array.from({ length: 5 }, () => child1.nextFloat());
|
|
93
|
+
const values2 = Array.from({ length: 5 }, () => child2.nextFloat());
|
|
94
|
+
expect(values1).toEqual(values2);
|
|
95
|
+
});
|
|
96
|
+
test('different labels produce different children', () => {
|
|
97
|
+
const gen = createGenerator(7);
|
|
98
|
+
gen.nextFloat();
|
|
99
|
+
const childA = gen.createChild('a');
|
|
100
|
+
const childB = gen.createChild('b');
|
|
101
|
+
const valuesA = Array.from({ length: 4 }, () => childA.nextFloat());
|
|
102
|
+
const valuesB = Array.from({ length: 4 }, () => childB.nextFloat());
|
|
103
|
+
expect(valuesA).not.toEqual(valuesB);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe('nextFloat', () => {
|
|
107
|
+
test('returns values in [0, 1)', () => {
|
|
108
|
+
const gen = createGenerator(42);
|
|
109
|
+
for (let i = 0; i < 500; i++) {
|
|
110
|
+
const value = gen.nextFloat();
|
|
111
|
+
expect(value).toBeGreaterThanOrEqual(0);
|
|
112
|
+
expect(value).toBeLessThan(1);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
test('advances the rng counter', () => {
|
|
116
|
+
const gen = createGenerator(1);
|
|
117
|
+
expect(gen.rng.counter).toBe(0);
|
|
118
|
+
gen.nextFloat();
|
|
119
|
+
expect(gen.rng.counter).toBe(1);
|
|
120
|
+
gen.nextFloat();
|
|
121
|
+
gen.nextFloat();
|
|
122
|
+
expect(gen.rng.counter).toBe(3);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
describe('nextInt', () => {
|
|
126
|
+
test('returns non-negative integers less than extent', () => {
|
|
127
|
+
const gen = createGenerator(42);
|
|
128
|
+
for (let i = 0; i < 500; i++) {
|
|
129
|
+
const value = gen.nextInt(100);
|
|
130
|
+
expect(value).toBeGreaterThanOrEqual(0);
|
|
131
|
+
expect(value).toBeLessThan(100);
|
|
132
|
+
expect(Number.isInteger(value)).toBe(true);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
test('returns large non-negative integer when extent is omitted', () => {
|
|
136
|
+
const gen = createGenerator(42);
|
|
137
|
+
const value = gen.nextInt();
|
|
138
|
+
expect(value).toBeGreaterThanOrEqual(0);
|
|
139
|
+
expect(value).toBeLessThan(Number.MAX_SAFE_INTEGER);
|
|
140
|
+
expect(Number.isInteger(value)).toBe(true);
|
|
141
|
+
});
|
|
142
|
+
test('returns 0 when extent is 0', () => {
|
|
143
|
+
const gen = createGenerator(42);
|
|
144
|
+
expect(gen.nextInt(0)).toBe(0);
|
|
145
|
+
});
|
|
146
|
+
test('extent of 0 still advances the rng', () => {
|
|
147
|
+
const gen1 = createGenerator(42);
|
|
148
|
+
const gen2 = createGenerator(42);
|
|
149
|
+
gen1.nextInt(0);
|
|
150
|
+
gen2.nextInt(10);
|
|
151
|
+
// Both advanced one step, so next values should match
|
|
152
|
+
expect(gen1.nextFloat()).toBe(gen2.nextFloat());
|
|
153
|
+
});
|
|
154
|
+
test('returns 0 when extent is 1', () => {
|
|
155
|
+
const gen = createGenerator(42);
|
|
156
|
+
for (let i = 0; i < 50; i++) {
|
|
157
|
+
expect(gen.nextInt(1)).toBe(0);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
test('handles negative extent', () => {
|
|
161
|
+
const gen = createGenerator(42);
|
|
162
|
+
for (let i = 0; i < 500; i++) {
|
|
163
|
+
const value = gen.nextInt(-100);
|
|
164
|
+
expect(value).toBeLessThanOrEqual(0);
|
|
165
|
+
expect(value).toBeGreaterThan(-100);
|
|
166
|
+
expect(Number.isInteger(value)).toBe(true);
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
test('falls back to large range for Infinity extent', () => {
|
|
170
|
+
const gen = createGenerator(42);
|
|
171
|
+
const value = gen.nextInt(Infinity);
|
|
172
|
+
expect(value).toBeGreaterThanOrEqual(0);
|
|
173
|
+
expect(Number.isInteger(value)).toBe(true);
|
|
174
|
+
});
|
|
175
|
+
test('falls back to large range for NaN extent', () => {
|
|
176
|
+
const gen = createGenerator(42);
|
|
177
|
+
const value = gen.nextInt(NaN);
|
|
178
|
+
expect(value).toBeGreaterThanOrEqual(0);
|
|
179
|
+
expect(Number.isInteger(value)).toBe(true);
|
|
180
|
+
});
|
|
181
|
+
test('falls back to large range for -Infinity extent', () => {
|
|
182
|
+
const gen = createGenerator(42);
|
|
183
|
+
const value = gen.nextInt(-Infinity);
|
|
184
|
+
expect(value).toBeGreaterThanOrEqual(0);
|
|
185
|
+
expect(Number.isInteger(value)).toBe(true);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
describe('nextInRange', () => {
|
|
189
|
+
test('returns values in [min, max] range', () => {
|
|
190
|
+
const gen = createGenerator(42);
|
|
191
|
+
for (let i = 0; i < 500; i++) {
|
|
192
|
+
const value = gen.nextInRange(10, 20);
|
|
193
|
+
expect(value).toBeGreaterThanOrEqual(10);
|
|
194
|
+
expect(value).toBeLessThanOrEqual(20);
|
|
195
|
+
expect(Number.isInteger(value)).toBe(true);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
test('returns min when min equals max', () => {
|
|
199
|
+
const gen = createGenerator(42);
|
|
200
|
+
for (let i = 0; i < 20; i++) {
|
|
201
|
+
expect(gen.nextInRange(5, 5)).toBe(5);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
test('handles swapped min and max', () => {
|
|
205
|
+
const gen = createGenerator(42);
|
|
206
|
+
for (let i = 0; i < 500; i++) {
|
|
207
|
+
const value = gen.nextInRange(20, 10);
|
|
208
|
+
expect(value).toBeGreaterThanOrEqual(10);
|
|
209
|
+
expect(value).toBeLessThanOrEqual(20);
|
|
210
|
+
expect(Number.isInteger(value)).toBe(true);
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
test('defaults min to 0 when undefined', () => {
|
|
214
|
+
const gen = createGenerator(42);
|
|
215
|
+
for (let i = 0; i < 200; i++) {
|
|
216
|
+
const value = gen.nextInRange(undefined, 10);
|
|
217
|
+
expect(value).toBeGreaterThanOrEqual(0);
|
|
218
|
+
expect(value).toBeLessThanOrEqual(10);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
test('defaults max to MAX_SAFE_INTEGER when undefined', () => {
|
|
222
|
+
const gen = createGenerator(42);
|
|
223
|
+
const value = gen.nextInRange(0, undefined);
|
|
224
|
+
expect(value).toBeGreaterThanOrEqual(0);
|
|
225
|
+
expect(Number.isInteger(value)).toBe(true);
|
|
226
|
+
});
|
|
227
|
+
test('both min and max undefined gives full non-negative range', () => {
|
|
228
|
+
const gen = createGenerator(42);
|
|
229
|
+
const value = gen.nextInRange(undefined, undefined);
|
|
230
|
+
expect(value).toBeGreaterThanOrEqual(0);
|
|
231
|
+
expect(Number.isInteger(value)).toBe(true);
|
|
232
|
+
});
|
|
233
|
+
test('handles negative ranges', () => {
|
|
234
|
+
const gen = createGenerator(42);
|
|
235
|
+
for (let i = 0; i < 500; i++) {
|
|
236
|
+
const value = gen.nextInRange(-20, -10);
|
|
237
|
+
expect(value).toBeGreaterThanOrEqual(-20);
|
|
238
|
+
expect(value).toBeLessThanOrEqual(-10);
|
|
239
|
+
expect(Number.isInteger(value)).toBe(true);
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
test('handles range crossing zero', () => {
|
|
243
|
+
const gen = createGenerator(42);
|
|
244
|
+
for (let i = 0; i < 500; i++) {
|
|
245
|
+
const value = gen.nextInRange(-5, 5);
|
|
246
|
+
expect(value).toBeGreaterThanOrEqual(-5);
|
|
247
|
+
expect(value).toBeLessThanOrEqual(5);
|
|
248
|
+
expect(Number.isInteger(value)).toBe(true);
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
describe('nextBoolean', () => {
|
|
253
|
+
test('returns boolean values with default probability', () => {
|
|
254
|
+
const gen = createGenerator(42);
|
|
255
|
+
let trueCount = 0;
|
|
256
|
+
const trials = 1000;
|
|
257
|
+
for (let i = 0; i < trials; i++) {
|
|
258
|
+
if (gen.nextBoolean()) {
|
|
259
|
+
trueCount++;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// With 0.5 probability over 1000 trials, should be roughly balanced
|
|
263
|
+
expect(trueCount).toBeGreaterThan(350);
|
|
264
|
+
expect(trueCount).toBeLessThan(650);
|
|
265
|
+
});
|
|
266
|
+
test('returns mostly true with high probability', () => {
|
|
267
|
+
const gen = createGenerator(42);
|
|
268
|
+
let trueCount = 0;
|
|
269
|
+
const trials = 1000;
|
|
270
|
+
for (let i = 0; i < trials; i++) {
|
|
271
|
+
if (gen.nextBoolean(0.95)) {
|
|
272
|
+
trueCount++;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
expect(trueCount).toBeGreaterThan(900);
|
|
276
|
+
});
|
|
277
|
+
test('returns mostly false with low probability', () => {
|
|
278
|
+
const gen = createGenerator(42);
|
|
279
|
+
let trueCount = 0;
|
|
280
|
+
const trials = 1000;
|
|
281
|
+
for (let i = 0; i < trials; i++) {
|
|
282
|
+
if (gen.nextBoolean(0.05)) {
|
|
283
|
+
trueCount++;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
expect(trueCount).toBeLessThan(100);
|
|
287
|
+
});
|
|
288
|
+
test('always returns false with probability 0', () => {
|
|
289
|
+
const gen = createGenerator(42);
|
|
290
|
+
for (let i = 0; i < 100; i++) {
|
|
291
|
+
expect(gen.nextBoolean(0)).toBe(false);
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
test('always returns true with probability 1', () => {
|
|
295
|
+
const gen = createGenerator(42);
|
|
296
|
+
for (let i = 0; i < 100; i++) {
|
|
297
|
+
expect(gen.nextBoolean(1)).toBe(true);
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
describe('nextString', () => {
|
|
302
|
+
test('returns string of requested length', () => {
|
|
303
|
+
const gen = createGenerator(42);
|
|
304
|
+
expect(gen.nextString(10)).toHaveLength(10);
|
|
305
|
+
expect(gen.nextString(0)).toHaveLength(0);
|
|
306
|
+
expect(gen.nextString(100)).toHaveLength(100);
|
|
307
|
+
});
|
|
308
|
+
test('uses default alphanumeric character set', () => {
|
|
309
|
+
const gen = createGenerator(42);
|
|
310
|
+
const str = gen.nextString(200);
|
|
311
|
+
expect(str).toMatch(/^[A-Za-z0-9]+$/);
|
|
312
|
+
});
|
|
313
|
+
test('uses custom character set', () => {
|
|
314
|
+
const gen = createGenerator(42);
|
|
315
|
+
const str = gen.nextString(100, 'abc');
|
|
316
|
+
expect(str).toMatch(/^[abc]+$/);
|
|
317
|
+
});
|
|
318
|
+
test('single character set produces uniform string', () => {
|
|
319
|
+
const gen = createGenerator(42);
|
|
320
|
+
const str = gen.nextString(20, 'X');
|
|
321
|
+
expect(str).toBe('X'.repeat(20));
|
|
322
|
+
});
|
|
323
|
+
test('same seed produces same string', () => {
|
|
324
|
+
const gen1 = createGenerator(42);
|
|
325
|
+
const gen2 = createGenerator(42);
|
|
326
|
+
expect(gen1.nextString(50)).toBe(gen2.nextString(50));
|
|
327
|
+
});
|
|
328
|
+
test('empty string length returns empty string', () => {
|
|
329
|
+
const gen = createGenerator(42);
|
|
330
|
+
expect(gen.nextString(0)).toBe('');
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
describe('pickNext', () => {
|
|
334
|
+
test('returns an item from the array', () => {
|
|
335
|
+
const gen = createGenerator(42);
|
|
336
|
+
const items = ['a', 'b', 'c', 'd', 'e'];
|
|
337
|
+
for (let i = 0; i < 100; i++) {
|
|
338
|
+
expect(items).toContain(gen.pickNext(items));
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
test('returns undefined for empty array', () => {
|
|
342
|
+
const gen = createGenerator(42);
|
|
343
|
+
expect(gen.pickNext([])).toBeUndefined();
|
|
344
|
+
});
|
|
345
|
+
test('returns undefined for undefined input', () => {
|
|
346
|
+
const gen = createGenerator(42);
|
|
347
|
+
expect(gen.pickNext(undefined)).toBeUndefined();
|
|
348
|
+
});
|
|
349
|
+
test('returns the only item for single-element array', () => {
|
|
350
|
+
const gen = createGenerator(42);
|
|
351
|
+
for (let i = 0; i < 20; i++) {
|
|
352
|
+
expect(gen.pickNext(['only'])).toBe('only');
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
test('is deterministic with same seed', () => {
|
|
356
|
+
const gen1 = createGenerator(42);
|
|
357
|
+
const gen2 = createGenerator(42);
|
|
358
|
+
const items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
|
|
359
|
+
const picks1 = Array.from({ length: 20 }, () => gen1.pickNext(items));
|
|
360
|
+
const picks2 = Array.from({ length: 20 }, () => gen2.pickNext(items));
|
|
361
|
+
expect(picks1).toEqual(picks2);
|
|
362
|
+
});
|
|
363
|
+
test('works with typed arrays', () => {
|
|
364
|
+
const gen = createGenerator(42);
|
|
365
|
+
const numbers = [10, 20, 30];
|
|
366
|
+
const picked = gen.pickNext(numbers);
|
|
367
|
+
expect(picked).toBeDefined();
|
|
368
|
+
expect(numbers).toContain(picked);
|
|
369
|
+
});
|
|
370
|
+
});
|
|
371
|
+
describe('pickSequential', () => {
|
|
372
|
+
const dictA = ['a1', 'a2', 'a3'];
|
|
373
|
+
const dictB = ['b1', 'b2', 'b3'];
|
|
374
|
+
const dictC = ['c1', 'c2', 'c3'];
|
|
375
|
+
test('picks one item from each candidate dictionary in order', () => {
|
|
376
|
+
const gen = createGenerator(42);
|
|
377
|
+
const result = gen.pickSequential({
|
|
378
|
+
how: 'sequence',
|
|
379
|
+
candidates: [dictA, dictB, dictC]
|
|
380
|
+
});
|
|
381
|
+
expect(result).toHaveLength(3);
|
|
382
|
+
expect(dictA).toContain(result[0]);
|
|
383
|
+
expect(dictB).toContain(result[1]);
|
|
384
|
+
expect(dictC).toContain(result[2]);
|
|
385
|
+
});
|
|
386
|
+
test('defaults count to number of candidate dictionaries', () => {
|
|
387
|
+
const gen = createGenerator(42);
|
|
388
|
+
const result = gen.pickSequential({
|
|
389
|
+
how: 'sequence',
|
|
390
|
+
candidates: [dictA, dictB]
|
|
391
|
+
});
|
|
392
|
+
expect(result).toHaveLength(2);
|
|
393
|
+
});
|
|
394
|
+
test('wraps around dictionaries when count exceeds candidates', () => {
|
|
395
|
+
const gen = createGenerator(42);
|
|
396
|
+
const result = gen.pickSequential({
|
|
397
|
+
how: 'sequence',
|
|
398
|
+
count: 7,
|
|
399
|
+
candidates: [dictA, dictB, dictC]
|
|
400
|
+
});
|
|
401
|
+
expect(result).toHaveLength(7);
|
|
402
|
+
// Items 0, 3, 6 come from dictA; 1, 4 from dictB; 2, 5 from dictC
|
|
403
|
+
expect(dictA).toContain(result[0]);
|
|
404
|
+
expect(dictB).toContain(result[1]);
|
|
405
|
+
expect(dictC).toContain(result[2]);
|
|
406
|
+
expect(dictA).toContain(result[3]);
|
|
407
|
+
expect(dictB).toContain(result[4]);
|
|
408
|
+
expect(dictC).toContain(result[5]);
|
|
409
|
+
expect(dictA).toContain(result[6]);
|
|
410
|
+
});
|
|
411
|
+
test('count of 0 returns empty array', () => {
|
|
412
|
+
const gen = createGenerator(42);
|
|
413
|
+
const result = gen.pickSequential({
|
|
414
|
+
how: 'sequence',
|
|
415
|
+
count: 0,
|
|
416
|
+
candidates: [dictA, dictB]
|
|
417
|
+
});
|
|
418
|
+
expect(result).toEqual([]);
|
|
419
|
+
});
|
|
420
|
+
test('skips undefined picks from empty candidate dictionaries', () => {
|
|
421
|
+
const gen = createGenerator(42);
|
|
422
|
+
const result = gen.pickSequential({
|
|
423
|
+
how: 'sequence',
|
|
424
|
+
candidates: [dictA, [], dictC]
|
|
425
|
+
});
|
|
426
|
+
// The empty dictionary yields undefined which is skipped
|
|
427
|
+
expect(result).toHaveLength(2);
|
|
428
|
+
expect(dictA).toContain(result[0]);
|
|
429
|
+
expect(dictC).toContain(result[1]);
|
|
430
|
+
});
|
|
431
|
+
test('is deterministic with same seed', () => {
|
|
432
|
+
const gen1 = createGenerator(42);
|
|
433
|
+
const gen2 = createGenerator(42);
|
|
434
|
+
const params = {
|
|
435
|
+
how: 'sequence',
|
|
436
|
+
count: 10,
|
|
437
|
+
candidates: [dictA, dictB, dictC]
|
|
438
|
+
};
|
|
439
|
+
expect(gen1.pickSequential(params)).toEqual(gen2.pickSequential(params));
|
|
440
|
+
});
|
|
441
|
+
});
|
|
442
|
+
describe('pickRandom', () => {
|
|
443
|
+
const dictA = ['a1', 'a2', 'a3'];
|
|
444
|
+
const dictB = ['b1', 'b2', 'b3'];
|
|
445
|
+
const dictC = ['c1', 'c2', 'c3'];
|
|
446
|
+
test('picks count items from randomly selected dictionaries', () => {
|
|
447
|
+
const gen = createGenerator(42);
|
|
448
|
+
const result = gen.pickRandom({
|
|
449
|
+
how: 'random',
|
|
450
|
+
count: 10,
|
|
451
|
+
candidates: [dictA, dictB, dictC]
|
|
452
|
+
});
|
|
453
|
+
expect(result).toHaveLength(10);
|
|
454
|
+
const allItems = [...dictA, ...dictB, ...dictC];
|
|
455
|
+
for (const item of result) {
|
|
456
|
+
expect(allItems).toContain(item);
|
|
457
|
+
}
|
|
458
|
+
});
|
|
459
|
+
test('count of 0 returns empty array', () => {
|
|
460
|
+
const gen = createGenerator(42);
|
|
461
|
+
const result = gen.pickRandom({
|
|
462
|
+
how: 'random',
|
|
463
|
+
count: 0,
|
|
464
|
+
candidates: [dictA, dictB]
|
|
465
|
+
});
|
|
466
|
+
expect(result).toEqual([]);
|
|
467
|
+
});
|
|
468
|
+
test('single candidate dictionary picks only from that dictionary', () => {
|
|
469
|
+
const gen = createGenerator(42);
|
|
470
|
+
const result = gen.pickRandom({
|
|
471
|
+
how: 'random',
|
|
472
|
+
count: 20,
|
|
473
|
+
candidates: [dictA]
|
|
474
|
+
});
|
|
475
|
+
expect(result).toHaveLength(20);
|
|
476
|
+
for (const item of result) {
|
|
477
|
+
expect(dictA).toContain(item);
|
|
478
|
+
}
|
|
479
|
+
});
|
|
480
|
+
test('is deterministic with same seed', () => {
|
|
481
|
+
const gen1 = createGenerator(42);
|
|
482
|
+
const gen2 = createGenerator(42);
|
|
483
|
+
const params = {
|
|
484
|
+
how: 'random',
|
|
485
|
+
count: 10,
|
|
486
|
+
candidates: [dictA, dictB, dictC]
|
|
487
|
+
};
|
|
488
|
+
expect(gen1.pickRandom(params)).toEqual(gen2.pickRandom(params));
|
|
489
|
+
});
|
|
490
|
+
test('skips undefined picks from empty candidate dictionaries', () => {
|
|
491
|
+
const gen = createGenerator(42);
|
|
492
|
+
const result = gen.pickRandom({
|
|
493
|
+
how: 'random',
|
|
494
|
+
count: 20,
|
|
495
|
+
candidates: [dictA, [], dictC]
|
|
496
|
+
});
|
|
497
|
+
// Some picks land on the empty dictionary and are skipped
|
|
498
|
+
expect(result.length).toBeLessThanOrEqual(20);
|
|
499
|
+
expect(result.length).toBeGreaterThan(0);
|
|
500
|
+
const allItems = [...dictA, ...dictC];
|
|
501
|
+
for (const item of result) {
|
|
502
|
+
expect(allItems).toContain(item);
|
|
503
|
+
}
|
|
504
|
+
});
|
|
505
|
+
});
|
|
506
|
+
describe('pickSequence', () => {
|
|
507
|
+
const dictA = ['a1', 'a2'];
|
|
508
|
+
const dictB = ['b1', 'b2'];
|
|
509
|
+
test('dispatches to pickSequential for sequence mode', () => {
|
|
510
|
+
const gen = createGenerator(42);
|
|
511
|
+
const result = gen.pickSequence({
|
|
512
|
+
how: 'sequence',
|
|
513
|
+
candidates: [dictA, dictB]
|
|
514
|
+
});
|
|
515
|
+
expect(result).toHaveLength(2);
|
|
516
|
+
expect(dictA).toContain(result[0]);
|
|
517
|
+
expect(dictB).toContain(result[1]);
|
|
518
|
+
});
|
|
519
|
+
test('dispatches to pickRandom for random mode', () => {
|
|
520
|
+
const gen = createGenerator(42);
|
|
521
|
+
const result = gen.pickSequence({
|
|
522
|
+
how: 'random',
|
|
523
|
+
count: 5,
|
|
524
|
+
candidates: [dictA, dictB]
|
|
525
|
+
});
|
|
526
|
+
expect(result).toHaveLength(5);
|
|
527
|
+
const allItems = [...dictA, ...dictB];
|
|
528
|
+
for (const item of result) {
|
|
529
|
+
expect(allItems).toContain(item);
|
|
530
|
+
}
|
|
531
|
+
});
|
|
532
|
+
test('produces identical results to direct method calls', () => {
|
|
533
|
+
const gen1 = createGenerator(42);
|
|
534
|
+
const gen2 = createGenerator(42);
|
|
535
|
+
const seqResult = gen1.pickSequence({
|
|
536
|
+
how: 'sequence',
|
|
537
|
+
count: 4,
|
|
538
|
+
candidates: [dictA, dictB]
|
|
539
|
+
});
|
|
540
|
+
const directResult = gen2.pickSequential({
|
|
541
|
+
how: 'sequence',
|
|
542
|
+
count: 4,
|
|
543
|
+
candidates: [dictA, dictB]
|
|
544
|
+
});
|
|
545
|
+
expect(seqResult).toEqual(directResult);
|
|
546
|
+
});
|
|
547
|
+
});
|
|
548
|
+
describe('global RNG', () => {
|
|
549
|
+
test('setGlobalRng sets and returns the generator', () => {
|
|
550
|
+
const gen = createGenerator(42);
|
|
551
|
+
const result = PseudoRandomGenerator.setGlobalRng(gen);
|
|
552
|
+
expect(result).toBe(gen);
|
|
553
|
+
expect(PseudoRandomGenerator.getGlobalRng()).toBe(gen);
|
|
554
|
+
});
|
|
555
|
+
test('setGlobalRng with undefined clears the global', () => {
|
|
556
|
+
const gen = createGenerator(42);
|
|
557
|
+
PseudoRandomGenerator.setGlobalRng(gen);
|
|
558
|
+
expect(PseudoRandomGenerator.getGlobalRng()).toBe(gen);
|
|
559
|
+
PseudoRandomGenerator.setGlobalRng(undefined);
|
|
560
|
+
expect(PseudoRandomGenerator.getGlobalRng()).toBeUndefined();
|
|
561
|
+
});
|
|
562
|
+
test('getGlobalRng returns undefined when not set', () => {
|
|
563
|
+
expect(PseudoRandomGenerator.getGlobalRng()).toBeUndefined();
|
|
564
|
+
});
|
|
565
|
+
});
|
|
566
|
+
describe('ensureRng', () => {
|
|
567
|
+
test('returns the provided rng if given', () => {
|
|
568
|
+
const gen = createGenerator(42);
|
|
569
|
+
expect(PseudoRandomGenerator.ensureRng(gen)).toSucceedAndSatisfy((result) => {
|
|
570
|
+
expect(result).toBe(gen);
|
|
571
|
+
});
|
|
572
|
+
});
|
|
573
|
+
test('returns global rng when no rng is provided and global is set', () => {
|
|
574
|
+
const global = createGenerator(99);
|
|
575
|
+
PseudoRandomGenerator.setGlobalRng(global);
|
|
576
|
+
expect(PseudoRandomGenerator.ensureRng()).toSucceedAndSatisfy((result) => {
|
|
577
|
+
expect(result).toBe(global);
|
|
578
|
+
});
|
|
579
|
+
});
|
|
580
|
+
test('creates a new rng when none provided and no global is set', () => {
|
|
581
|
+
expect(PseudoRandomGenerator.ensureRng()).toSucceedAndSatisfy((result) => {
|
|
582
|
+
expect(result).toBeDefined();
|
|
583
|
+
expect(result.rng.counter).toBe(0);
|
|
584
|
+
});
|
|
585
|
+
});
|
|
586
|
+
test('prefers provided rng over global', () => {
|
|
587
|
+
const global = createGenerator(99);
|
|
588
|
+
const local = createGenerator(42);
|
|
589
|
+
PseudoRandomGenerator.setGlobalRng(global);
|
|
590
|
+
expect(PseudoRandomGenerator.ensureRng(local)).toSucceedAndSatisfy((result) => {
|
|
591
|
+
expect(result).toBe(local);
|
|
592
|
+
});
|
|
593
|
+
});
|
|
594
|
+
});
|
|
595
|
+
});
|
|
596
|
+
//# sourceMappingURL=generators.test.js.map
|