@fgv/ts-random 5.1.0-19 → 5.1.0-20

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.
Files changed (273) hide show
  1. package/package.json +6 -6
  2. package/.rush/temp/chunked-rush-logs/ts-random.build.chunks.jsonl +0 -6
  3. package/.rush/temp/fba88d771243a88edd09f745ba7194831032f604.tar.log +0 -121
  4. package/.rush/temp/operation/build/all.log +0 -6
  5. package/.rush/temp/operation/build/log-chunks.jsonl +0 -6
  6. package/.rush/temp/operation/build/state.json +0 -3
  7. package/.rush/temp/shrinkwrap-deps.json +0 -614
  8. package/config/jest.config.json +0 -13
  9. package/config/rig.json +0 -4
  10. package/config/typedoc.json +0 -7
  11. package/dist/test/unit/generators.test.js +0 -596
  12. package/dist/test/unit/generators.test.js.map +0 -1
  13. package/dist/test/unit/randomSource.test.js +0 -452
  14. package/dist/test/unit/randomSource.test.js.map +0 -1
  15. package/docs/Chars/README.md +0 -152
  16. package/docs/Chars/variables/all.md +0 -9
  17. package/docs/Chars/variables/alphanumeric.md +0 -9
  18. package/docs/Chars/variables/base64.md +0 -9
  19. package/docs/Chars/variables/base64Url.md +0 -9
  20. package/docs/Chars/variables/base64UrlNoPadding.md +0 -9
  21. package/docs/Chars/variables/digits.md +0 -9
  22. package/docs/Chars/variables/hex.md +0 -9
  23. package/docs/Chars/variables/hexDigits.md +0 -9
  24. package/docs/Chars/variables/hexDigitsUpper.md +0 -9
  25. package/docs/Chars/variables/letters.md +0 -9
  26. package/docs/Chars/variables/lowerCase.md +0 -9
  27. package/docs/Chars/variables/printable.md +0 -9
  28. package/docs/Chars/variables/symbols.md +0 -9
  29. package/docs/Chars/variables/upperCase.md +0 -9
  30. package/docs/Chars/variables/whitespace.md +0 -9
  31. package/docs/Generator/README.md +0 -144
  32. package/docs/Generator/classes/PseudoRandomGenerator.clone.md +0 -17
  33. package/docs/Generator/classes/PseudoRandomGenerator.create.md +0 -24
  34. package/docs/Generator/classes/PseudoRandomGenerator.createChild.md +0 -24
  35. package/docs/Generator/classes/PseudoRandomGenerator.ensureRng.md +0 -25
  36. package/docs/Generator/classes/PseudoRandomGenerator.getGlobalRng.md +0 -17
  37. package/docs/Generator/classes/PseudoRandomGenerator.md +0 -258
  38. package/docs/Generator/classes/PseudoRandomGenerator.nextBoolean.md +0 -24
  39. package/docs/Generator/classes/PseudoRandomGenerator.nextFloat.md +0 -17
  40. package/docs/Generator/classes/PseudoRandomGenerator.nextInRange.md +0 -25
  41. package/docs/Generator/classes/PseudoRandomGenerator.nextInt.md +0 -24
  42. package/docs/Generator/classes/PseudoRandomGenerator.nextString.md +0 -25
  43. package/docs/Generator/classes/PseudoRandomGenerator.pickNext.md +0 -24
  44. package/docs/Generator/classes/PseudoRandomGenerator.pickRandom.md +0 -25
  45. package/docs/Generator/classes/PseudoRandomGenerator.pickSequence.md +0 -24
  46. package/docs/Generator/classes/PseudoRandomGenerator.pickSequential.md +0 -25
  47. package/docs/Generator/classes/PseudoRandomGenerator.rng.md +0 -11
  48. package/docs/Generator/classes/PseudoRandomGenerator.setGlobalRng.md +0 -24
  49. package/docs/Generator/classes/SeededRandomSource.clone.md +0 -17
  50. package/docs/Generator/classes/SeededRandomSource.counter.md +0 -11
  51. package/docs/Generator/classes/SeededRandomSource.create.md +0 -24
  52. package/docs/Generator/classes/SeededRandomSource.createChild.md +0 -24
  53. package/docs/Generator/classes/SeededRandomSource.hashSeed.md +0 -24
  54. package/docs/Generator/classes/SeededRandomSource.hashStateAndLabel.md +0 -25
  55. package/docs/Generator/classes/SeededRandomSource.lineage.md +0 -9
  56. package/docs/Generator/classes/SeededRandomSource.md +0 -187
  57. package/docs/Generator/classes/SeededRandomSource.mulberryStep.md +0 -24
  58. package/docs/Generator/classes/SeededRandomSource.next.md +0 -17
  59. package/docs/Generator/classes/SeededRandomSource.seed.md +0 -9
  60. package/docs/Generator/interfaces/INextResult.md +0 -61
  61. package/docs/Generator/interfaces/INextResult.nextState.md +0 -9
  62. package/docs/Generator/interfaces/INextResult.value.md +0 -9
  63. package/docs/Generator/interfaces/IPseudoRandomGeneratorCreateParams.global.md +0 -9
  64. package/docs/Generator/interfaces/IPseudoRandomGeneratorCreateParams.md +0 -78
  65. package/docs/Generator/interfaces/IPseudoRandomGeneratorCreateParams.seed.md +0 -9
  66. package/docs/Generator/interfaces/IPseudoRandomGeneratorCreateParams.step.md +0 -9
  67. package/docs/Generator/interfaces/IRandomSequencePickParams.candidates.md +0 -9
  68. package/docs/Generator/interfaces/IRandomSequencePickParams.count.md +0 -9
  69. package/docs/Generator/interfaces/IRandomSequencePickParams.how.md +0 -9
  70. package/docs/Generator/interfaces/IRandomSequencePickParams.md +0 -79
  71. package/docs/Generator/interfaces/ISeedPair.md +0 -61
  72. package/docs/Generator/interfaces/ISeedPair.seed.md +0 -9
  73. package/docs/Generator/interfaces/ISeedPair.state.md +0 -9
  74. package/docs/Generator/interfaces/ISeededRandomSourceConstructorParams.counter.md +0 -9
  75. package/docs/Generator/interfaces/ISeededRandomSourceConstructorParams.lineage.md +0 -9
  76. package/docs/Generator/interfaces/ISeededRandomSourceConstructorParams.md +0 -112
  77. package/docs/Generator/interfaces/ISeededRandomSourceConstructorParams.seed.md +0 -9
  78. package/docs/Generator/interfaces/ISeededRandomSourceConstructorParams.state.md +0 -9
  79. package/docs/Generator/interfaces/ISeededRandomSourceConstructorParams.step.md +0 -9
  80. package/docs/Generator/interfaces/ISeededRandomSourceCreateParams.md +0 -61
  81. package/docs/Generator/interfaces/ISeededRandomSourceCreateParams.seed.md +0 -9
  82. package/docs/Generator/interfaces/ISeededRandomSourceCreateParams.step.md +0 -9
  83. package/docs/Generator/interfaces/ISequentialPickParams.candidates.md +0 -9
  84. package/docs/Generator/interfaces/ISequentialPickParams.count.md +0 -9
  85. package/docs/Generator/interfaces/ISequentialPickParams.how.md +0 -9
  86. package/docs/Generator/interfaces/ISequentialPickParams.md +0 -79
  87. package/docs/Generator/type-aliases/RandomStepFunction.md +0 -11
  88. package/docs/Generator/type-aliases/SequencePickParams.md +0 -11
  89. package/docs/GeneratorData/Chars/README.md +0 -152
  90. package/docs/GeneratorData/Chars/variables/all.md +0 -9
  91. package/docs/GeneratorData/Chars/variables/alphanumeric.md +0 -9
  92. package/docs/GeneratorData/Chars/variables/base64.md +0 -9
  93. package/docs/GeneratorData/Chars/variables/base64Url.md +0 -9
  94. package/docs/GeneratorData/Chars/variables/base64UrlNoPadding.md +0 -9
  95. package/docs/GeneratorData/Chars/variables/digits.md +0 -9
  96. package/docs/GeneratorData/Chars/variables/hex.md +0 -9
  97. package/docs/GeneratorData/Chars/variables/hexDigits.md +0 -9
  98. package/docs/GeneratorData/Chars/variables/hexDigitsUpper.md +0 -9
  99. package/docs/GeneratorData/Chars/variables/letters.md +0 -9
  100. package/docs/GeneratorData/Chars/variables/lowerCase.md +0 -9
  101. package/docs/GeneratorData/Chars/variables/printable.md +0 -9
  102. package/docs/GeneratorData/Chars/variables/symbols.md +0 -9
  103. package/docs/GeneratorData/Chars/variables/upperCase.md +0 -9
  104. package/docs/GeneratorData/Chars/variables/whitespace.md +0 -9
  105. package/docs/GeneratorData/README.md +0 -35
  106. package/docs/GeneratorData/Words/README.md +0 -125
  107. package/docs/GeneratorData/Words/variables/Adjectives.md +0 -7
  108. package/docs/GeneratorData/Words/variables/Animals.md +0 -7
  109. package/docs/GeneratorData/Words/variables/Cities.md +0 -7
  110. package/docs/GeneratorData/Words/variables/Colors.md +0 -7
  111. package/docs/GeneratorData/Words/variables/Countries.md +0 -7
  112. package/docs/GeneratorData/Words/variables/Domains.md +0 -7
  113. package/docs/GeneratorData/Words/variables/FamilyNames.md +0 -9
  114. package/docs/GeneratorData/Words/variables/FirstNames.md +0 -9
  115. package/docs/GeneratorData/Words/variables/FirstNamesFemale.md +0 -9
  116. package/docs/GeneratorData/Words/variables/FirstNamesMale.md +0 -9
  117. package/docs/GeneratorData/Words/variables/Gerunds.md +0 -7
  118. package/docs/GeneratorData/Words/variables/jobs.md +0 -7
  119. package/docs/GeneratorData/variables/Adjectives.md +0 -7
  120. package/docs/GeneratorData/variables/Animals.md +0 -7
  121. package/docs/GeneratorData/variables/Cities.md +0 -7
  122. package/docs/GeneratorData/variables/Colors.md +0 -7
  123. package/docs/GeneratorData/variables/Countries.md +0 -7
  124. package/docs/GeneratorData/variables/Domains.md +0 -7
  125. package/docs/GeneratorData/variables/FamilyNames.md +0 -9
  126. package/docs/GeneratorData/variables/FirstNames.md +0 -9
  127. package/docs/GeneratorData/variables/FirstNamesFemale.md +0 -9
  128. package/docs/GeneratorData/variables/FirstNamesMale.md +0 -9
  129. package/docs/GeneratorData/variables/Gerunds.md +0 -7
  130. package/docs/GeneratorData/variables/all.md +0 -9
  131. package/docs/GeneratorData/variables/alphanumeric.md +0 -9
  132. package/docs/GeneratorData/variables/base64.md +0 -9
  133. package/docs/GeneratorData/variables/base64Url.md +0 -9
  134. package/docs/GeneratorData/variables/base64UrlNoPadding.md +0 -9
  135. package/docs/GeneratorData/variables/digits.md +0 -9
  136. package/docs/GeneratorData/variables/hex.md +0 -9
  137. package/docs/GeneratorData/variables/hexDigits.md +0 -9
  138. package/docs/GeneratorData/variables/hexDigitsUpper.md +0 -9
  139. package/docs/GeneratorData/variables/jobs.md +0 -7
  140. package/docs/GeneratorData/variables/letters.md +0 -9
  141. package/docs/GeneratorData/variables/lowerCase.md +0 -9
  142. package/docs/GeneratorData/variables/printable.md +0 -9
  143. package/docs/GeneratorData/variables/symbols.md +0 -9
  144. package/docs/GeneratorData/variables/upperCase.md +0 -9
  145. package/docs/GeneratorData/variables/whitespace.md +0 -9
  146. package/docs/README.md +0 -35
  147. package/docs/Words/README.md +0 -125
  148. package/docs/Words/variables/Adjectives.md +0 -7
  149. package/docs/Words/variables/Animals.md +0 -7
  150. package/docs/Words/variables/Cities.md +0 -7
  151. package/docs/Words/variables/Colors.md +0 -7
  152. package/docs/Words/variables/Countries.md +0 -7
  153. package/docs/Words/variables/Domains.md +0 -7
  154. package/docs/Words/variables/FamilyNames.md +0 -9
  155. package/docs/Words/variables/FirstNames.md +0 -9
  156. package/docs/Words/variables/FirstNamesFemale.md +0 -9
  157. package/docs/Words/variables/FirstNamesMale.md +0 -9
  158. package/docs/Words/variables/Gerunds.md +0 -7
  159. package/docs/Words/variables/jobs.md +0 -7
  160. package/docs/classes/PseudoRandomGenerator.clone.md +0 -17
  161. package/docs/classes/PseudoRandomGenerator.create.md +0 -24
  162. package/docs/classes/PseudoRandomGenerator.createChild.md +0 -24
  163. package/docs/classes/PseudoRandomGenerator.ensureRng.md +0 -25
  164. package/docs/classes/PseudoRandomGenerator.getGlobalRng.md +0 -17
  165. package/docs/classes/PseudoRandomGenerator.md +0 -258
  166. package/docs/classes/PseudoRandomGenerator.nextBoolean.md +0 -24
  167. package/docs/classes/PseudoRandomGenerator.nextFloat.md +0 -17
  168. package/docs/classes/PseudoRandomGenerator.nextInRange.md +0 -25
  169. package/docs/classes/PseudoRandomGenerator.nextInt.md +0 -24
  170. package/docs/classes/PseudoRandomGenerator.nextString.md +0 -25
  171. package/docs/classes/PseudoRandomGenerator.pickNext.md +0 -24
  172. package/docs/classes/PseudoRandomGenerator.pickRandom.md +0 -25
  173. package/docs/classes/PseudoRandomGenerator.pickSequence.md +0 -24
  174. package/docs/classes/PseudoRandomGenerator.pickSequential.md +0 -25
  175. package/docs/classes/PseudoRandomGenerator.rng.md +0 -11
  176. package/docs/classes/PseudoRandomGenerator.setGlobalRng.md +0 -24
  177. package/docs/classes/SeededRandomSource.clone.md +0 -17
  178. package/docs/classes/SeededRandomSource.counter.md +0 -11
  179. package/docs/classes/SeededRandomSource.create.md +0 -24
  180. package/docs/classes/SeededRandomSource.createChild.md +0 -24
  181. package/docs/classes/SeededRandomSource.hashSeed.md +0 -24
  182. package/docs/classes/SeededRandomSource.hashStateAndLabel.md +0 -25
  183. package/docs/classes/SeededRandomSource.lineage.md +0 -9
  184. package/docs/classes/SeededRandomSource.md +0 -187
  185. package/docs/classes/SeededRandomSource.mulberryStep.md +0 -24
  186. package/docs/classes/SeededRandomSource.next.md +0 -17
  187. package/docs/classes/SeededRandomSource.seed.md +0 -9
  188. package/docs/interfaces/INextResult.md +0 -61
  189. package/docs/interfaces/INextResult.nextState.md +0 -9
  190. package/docs/interfaces/INextResult.value.md +0 -9
  191. package/docs/interfaces/IPseudoRandomGeneratorCreateParams.global.md +0 -9
  192. package/docs/interfaces/IPseudoRandomGeneratorCreateParams.md +0 -78
  193. package/docs/interfaces/IPseudoRandomGeneratorCreateParams.seed.md +0 -9
  194. package/docs/interfaces/IPseudoRandomGeneratorCreateParams.step.md +0 -9
  195. package/docs/interfaces/IRandomSequencePickParams.candidates.md +0 -9
  196. package/docs/interfaces/IRandomSequencePickParams.count.md +0 -9
  197. package/docs/interfaces/IRandomSequencePickParams.how.md +0 -9
  198. package/docs/interfaces/IRandomSequencePickParams.md +0 -79
  199. package/docs/interfaces/ISeedPair.md +0 -61
  200. package/docs/interfaces/ISeedPair.seed.md +0 -9
  201. package/docs/interfaces/ISeedPair.state.md +0 -9
  202. package/docs/interfaces/ISeededRandomSourceConstructorParams.counter.md +0 -9
  203. package/docs/interfaces/ISeededRandomSourceConstructorParams.lineage.md +0 -9
  204. package/docs/interfaces/ISeededRandomSourceConstructorParams.md +0 -112
  205. package/docs/interfaces/ISeededRandomSourceConstructorParams.seed.md +0 -9
  206. package/docs/interfaces/ISeededRandomSourceConstructorParams.state.md +0 -9
  207. package/docs/interfaces/ISeededRandomSourceConstructorParams.step.md +0 -9
  208. package/docs/interfaces/ISeededRandomSourceCreateParams.md +0 -61
  209. package/docs/interfaces/ISeededRandomSourceCreateParams.seed.md +0 -9
  210. package/docs/interfaces/ISeededRandomSourceCreateParams.step.md +0 -9
  211. package/docs/interfaces/ISequentialPickParams.candidates.md +0 -9
  212. package/docs/interfaces/ISequentialPickParams.count.md +0 -9
  213. package/docs/interfaces/ISequentialPickParams.how.md +0 -9
  214. package/docs/interfaces/ISequentialPickParams.md +0 -79
  215. package/docs/type-aliases/RandomStepFunction.md +0 -11
  216. package/docs/type-aliases/SequencePickParams.md +0 -11
  217. package/docs/variables/Adjectives.md +0 -7
  218. package/docs/variables/Animals.md +0 -7
  219. package/docs/variables/Cities.md +0 -7
  220. package/docs/variables/Colors.md +0 -7
  221. package/docs/variables/Countries.md +0 -7
  222. package/docs/variables/Domains.md +0 -7
  223. package/docs/variables/FamilyNames.md +0 -9
  224. package/docs/variables/FirstNames.md +0 -9
  225. package/docs/variables/FirstNamesFemale.md +0 -9
  226. package/docs/variables/FirstNamesMale.md +0 -9
  227. package/docs/variables/Gerunds.md +0 -7
  228. package/docs/variables/all.md +0 -9
  229. package/docs/variables/alphanumeric.md +0 -9
  230. package/docs/variables/base64.md +0 -9
  231. package/docs/variables/base64Url.md +0 -9
  232. package/docs/variables/base64UrlNoPadding.md +0 -9
  233. package/docs/variables/digits.md +0 -9
  234. package/docs/variables/hex.md +0 -9
  235. package/docs/variables/hexDigits.md +0 -9
  236. package/docs/variables/hexDigitsUpper.md +0 -9
  237. package/docs/variables/jobs.md +0 -7
  238. package/docs/variables/letters.md +0 -9
  239. package/docs/variables/lowerCase.md +0 -9
  240. package/docs/variables/printable.md +0 -9
  241. package/docs/variables/symbols.md +0 -9
  242. package/docs/variables/upperCase.md +0 -9
  243. package/docs/variables/whitespace.md +0 -9
  244. package/lib/test/unit/generators.test.d.ts +0 -2
  245. package/lib/test/unit/generators.test.d.ts.map +0 -1
  246. package/lib/test/unit/generators.test.js +0 -598
  247. package/lib/test/unit/generators.test.js.map +0 -1
  248. package/lib/test/unit/randomSource.test.d.ts +0 -2
  249. package/lib/test/unit/randomSource.test.d.ts.map +0 -1
  250. package/lib/test/unit/randomSource.test.js +0 -454
  251. package/lib/test/unit/randomSource.test.js.map +0 -1
  252. package/rush-logs/ts-random.build.cache.log +0 -3
  253. package/rush-logs/ts-random.build.log +0 -6
  254. package/src/generator/generators.ts +0 -273
  255. package/src/generator/index.ts +0 -22
  256. package/src/generator/randomSource.ts +0 -224
  257. package/src/generator-data/charClasses.ts +0 -95
  258. package/src/generator-data/index.ts +0 -22
  259. package/src/generator-data/words/adjectives.ts +0 -247
  260. package/src/generator-data/words/animals.ts +0 -75
  261. package/src/generator-data/words/cities.ts +0 -229
  262. package/src/generator-data/words/colors.ts +0 -56
  263. package/src/generator-data/words/countries.ts +0 -217
  264. package/src/generator-data/words/domains.ts +0 -47
  265. package/src/generator-data/words/gerunds.ts +0 -126
  266. package/src/generator-data/words/index.ts +0 -29
  267. package/src/generator-data/words/jobs.ts +0 -175
  268. package/src/generator-data/words/names.ts +0 -717
  269. package/src/index.ts +0 -7
  270. package/src/test/unit/generators.test.ts +0 -697
  271. package/src/test/unit/randomSource.test.ts +0 -526
  272. package/temp/build/typescript/ts_8nwakTlr.json +0 -1
  273. package/tsconfig.json +0 -7
@@ -1 +0,0 @@
1
- {"version":3,"file":"generators.test.js","sourceRoot":"","sources":["../../../src/test/unit/generators.test.ts"],"names":[],"mappings":"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","sourcesContent":["import '@fgv/ts-utils-jest';\n\nimport { IRandomSequencePickParams, ISequentialPickParams, PseudoRandomGenerator } from '../../generator';\n\nfunction createGenerator(seed: number | string = 42): PseudoRandomGenerator {\n return PseudoRandomGenerator.create({ seed }).orThrow();\n}\n\ndescribe('PseudoRandomGenerator', () => {\n // Clean up global state between tests\n afterEach(() => {\n PseudoRandomGenerator.setGlobalRng(undefined);\n });\n\n describe('create', () => {\n test('succeeds with no params', () => {\n expect(PseudoRandomGenerator.create()).toSucceedAndSatisfy((gen) => {\n expect(gen.rng).toBeDefined();\n expect(gen.rng.counter).toBe(0);\n });\n });\n\n test('succeeds with a seed', () => {\n expect(PseudoRandomGenerator.create({ seed: 123 })).toSucceedAndSatisfy((gen) => {\n expect(gen.rng.seed).toBe('123');\n });\n });\n\n test('succeeds with a string seed', () => {\n expect(PseudoRandomGenerator.create({ seed: 'hello' })).toSucceedAndSatisfy((gen) => {\n expect(gen.rng.seed).toBe('hello');\n });\n });\n\n test('same seed produces identical sequences', () => {\n const gen1 = createGenerator('deterministic');\n const gen2 = createGenerator('deterministic');\n const values1 = Array.from({ length: 10 }, () => gen1.nextFloat());\n const values2 = Array.from({ length: 10 }, () => gen2.nextFloat());\n expect(values1).toEqual(values2);\n });\n\n test('different seeds produce different sequences', () => {\n const gen1 = createGenerator('alpha');\n const gen2 = createGenerator('beta');\n const values1 = Array.from({ length: 4 }, () => gen1.nextFloat());\n const values2 = Array.from({ length: 4 }, () => gen2.nextFloat());\n expect(values1).not.toEqual(values2);\n });\n\n test('sets global rng when global is true', () => {\n expect(PseudoRandomGenerator.getGlobalRng()).toBeUndefined();\n expect(PseudoRandomGenerator.create({ seed: 1, global: true })).toSucceedAndSatisfy((gen) => {\n expect(PseudoRandomGenerator.getGlobalRng()).toBe(gen);\n });\n });\n\n test('does not set global rng when global is false', () => {\n PseudoRandomGenerator.create({ seed: 1, global: false }).orThrow();\n expect(PseudoRandomGenerator.getGlobalRng()).toBeUndefined();\n });\n\n test('does not set global rng when global is omitted', () => {\n PseudoRandomGenerator.create({ seed: 1 }).orThrow();\n expect(PseudoRandomGenerator.getGlobalRng()).toBeUndefined();\n });\n });\n\n describe('clone', () => {\n test('produces identical sequence from clone point', () => {\n const gen = createGenerator(7);\n gen.nextFloat();\n gen.nextFloat();\n\n const clone = gen.clone();\n const original = Array.from({ length: 5 }, () => gen.nextFloat());\n const cloned = Array.from({ length: 5 }, () => clone.nextFloat());\n expect(original).toEqual(cloned);\n });\n\n test('clone is independent of parent', () => {\n const gen = createGenerator(7);\n const clone = gen.clone();\n\n gen.nextFloat();\n gen.nextFloat();\n gen.nextFloat();\n\n expect(gen.rng.counter).toBe(3);\n expect(clone.rng.counter).toBe(0);\n });\n });\n\n describe('createChild', () => {\n test('child has independent state from parent', () => {\n const gen = createGenerator(7);\n gen.nextFloat();\n\n const child = gen.createChild('branch');\n expect(child.rng.counter).toBe(0);\n expect(child.rng.lineage).toEqual(['1:branch']);\n });\n\n test('same label from same parent state produces identical child', () => {\n const gen1 = createGenerator(7);\n const gen2 = createGenerator(7);\n gen1.nextFloat();\n gen2.nextFloat();\n\n const child1 = gen1.createChild('x');\n const child2 = gen2.createChild('x');\n const values1 = Array.from({ length: 5 }, () => child1.nextFloat());\n const values2 = Array.from({ length: 5 }, () => child2.nextFloat());\n expect(values1).toEqual(values2);\n });\n\n test('different labels produce different children', () => {\n const gen = createGenerator(7);\n gen.nextFloat();\n\n const childA = gen.createChild('a');\n const childB = gen.createChild('b');\n const valuesA = Array.from({ length: 4 }, () => childA.nextFloat());\n const valuesB = Array.from({ length: 4 }, () => childB.nextFloat());\n expect(valuesA).not.toEqual(valuesB);\n });\n });\n\n describe('nextFloat', () => {\n test('returns values in [0, 1)', () => {\n const gen = createGenerator(42);\n for (let i = 0; i < 500; i++) {\n const value = gen.nextFloat();\n expect(value).toBeGreaterThanOrEqual(0);\n expect(value).toBeLessThan(1);\n }\n });\n\n test('advances the rng counter', () => {\n const gen = createGenerator(1);\n expect(gen.rng.counter).toBe(0);\n gen.nextFloat();\n expect(gen.rng.counter).toBe(1);\n gen.nextFloat();\n gen.nextFloat();\n expect(gen.rng.counter).toBe(3);\n });\n });\n\n describe('nextInt', () => {\n test('returns non-negative integers less than extent', () => {\n const gen = createGenerator(42);\n for (let i = 0; i < 500; i++) {\n const value = gen.nextInt(100);\n expect(value).toBeGreaterThanOrEqual(0);\n expect(value).toBeLessThan(100);\n expect(Number.isInteger(value)).toBe(true);\n }\n });\n\n test('returns large non-negative integer when extent is omitted', () => {\n const gen = createGenerator(42);\n const value = gen.nextInt();\n expect(value).toBeGreaterThanOrEqual(0);\n expect(value).toBeLessThan(Number.MAX_SAFE_INTEGER);\n expect(Number.isInteger(value)).toBe(true);\n });\n\n test('returns 0 when extent is 0', () => {\n const gen = createGenerator(42);\n expect(gen.nextInt(0)).toBe(0);\n });\n\n test('extent of 0 still advances the rng', () => {\n const gen1 = createGenerator(42);\n const gen2 = createGenerator(42);\n\n gen1.nextInt(0);\n gen2.nextInt(10);\n\n // Both advanced one step, so next values should match\n expect(gen1.nextFloat()).toBe(gen2.nextFloat());\n });\n\n test('returns 0 when extent is 1', () => {\n const gen = createGenerator(42);\n for (let i = 0; i < 50; i++) {\n expect(gen.nextInt(1)).toBe(0);\n }\n });\n\n test('handles negative extent', () => {\n const gen = createGenerator(42);\n for (let i = 0; i < 500; i++) {\n const value = gen.nextInt(-100);\n expect(value).toBeLessThanOrEqual(0);\n expect(value).toBeGreaterThan(-100);\n expect(Number.isInteger(value)).toBe(true);\n }\n });\n\n test('falls back to large range for Infinity extent', () => {\n const gen = createGenerator(42);\n const value = gen.nextInt(Infinity);\n expect(value).toBeGreaterThanOrEqual(0);\n expect(Number.isInteger(value)).toBe(true);\n });\n\n test('falls back to large range for NaN extent', () => {\n const gen = createGenerator(42);\n const value = gen.nextInt(NaN);\n expect(value).toBeGreaterThanOrEqual(0);\n expect(Number.isInteger(value)).toBe(true);\n });\n\n test('falls back to large range for -Infinity extent', () => {\n const gen = createGenerator(42);\n const value = gen.nextInt(-Infinity);\n expect(value).toBeGreaterThanOrEqual(0);\n expect(Number.isInteger(value)).toBe(true);\n });\n });\n\n describe('nextInRange', () => {\n test('returns values in [min, max] range', () => {\n const gen = createGenerator(42);\n for (let i = 0; i < 500; i++) {\n const value = gen.nextInRange(10, 20);\n expect(value).toBeGreaterThanOrEqual(10);\n expect(value).toBeLessThanOrEqual(20);\n expect(Number.isInteger(value)).toBe(true);\n }\n });\n\n test('returns min when min equals max', () => {\n const gen = createGenerator(42);\n for (let i = 0; i < 20; i++) {\n expect(gen.nextInRange(5, 5)).toBe(5);\n }\n });\n\n test('handles swapped min and max', () => {\n const gen = createGenerator(42);\n for (let i = 0; i < 500; i++) {\n const value = gen.nextInRange(20, 10);\n expect(value).toBeGreaterThanOrEqual(10);\n expect(value).toBeLessThanOrEqual(20);\n expect(Number.isInteger(value)).toBe(true);\n }\n });\n\n test('defaults min to 0 when undefined', () => {\n const gen = createGenerator(42);\n for (let i = 0; i < 200; i++) {\n const value = gen.nextInRange(undefined, 10);\n expect(value).toBeGreaterThanOrEqual(0);\n expect(value).toBeLessThanOrEqual(10);\n }\n });\n\n test('defaults max to MAX_SAFE_INTEGER when undefined', () => {\n const gen = createGenerator(42);\n const value = gen.nextInRange(0, undefined);\n expect(value).toBeGreaterThanOrEqual(0);\n expect(Number.isInteger(value)).toBe(true);\n });\n\n test('both min and max undefined gives full non-negative range', () => {\n const gen = createGenerator(42);\n const value = gen.nextInRange(undefined, undefined);\n expect(value).toBeGreaterThanOrEqual(0);\n expect(Number.isInteger(value)).toBe(true);\n });\n\n test('handles negative ranges', () => {\n const gen = createGenerator(42);\n for (let i = 0; i < 500; i++) {\n const value = gen.nextInRange(-20, -10);\n expect(value).toBeGreaterThanOrEqual(-20);\n expect(value).toBeLessThanOrEqual(-10);\n expect(Number.isInteger(value)).toBe(true);\n }\n });\n\n test('handles range crossing zero', () => {\n const gen = createGenerator(42);\n for (let i = 0; i < 500; i++) {\n const value = gen.nextInRange(-5, 5);\n expect(value).toBeGreaterThanOrEqual(-5);\n expect(value).toBeLessThanOrEqual(5);\n expect(Number.isInteger(value)).toBe(true);\n }\n });\n });\n\n describe('nextBoolean', () => {\n test('returns boolean values with default probability', () => {\n const gen = createGenerator(42);\n let trueCount = 0;\n const trials = 1000;\n\n for (let i = 0; i < trials; i++) {\n if (gen.nextBoolean()) {\n trueCount++;\n }\n }\n\n // With 0.5 probability over 1000 trials, should be roughly balanced\n expect(trueCount).toBeGreaterThan(350);\n expect(trueCount).toBeLessThan(650);\n });\n\n test('returns mostly true with high probability', () => {\n const gen = createGenerator(42);\n let trueCount = 0;\n const trials = 1000;\n\n for (let i = 0; i < trials; i++) {\n if (gen.nextBoolean(0.95)) {\n trueCount++;\n }\n }\n\n expect(trueCount).toBeGreaterThan(900);\n });\n\n test('returns mostly false with low probability', () => {\n const gen = createGenerator(42);\n let trueCount = 0;\n const trials = 1000;\n\n for (let i = 0; i < trials; i++) {\n if (gen.nextBoolean(0.05)) {\n trueCount++;\n }\n }\n\n expect(trueCount).toBeLessThan(100);\n });\n\n test('always returns false with probability 0', () => {\n const gen = createGenerator(42);\n for (let i = 0; i < 100; i++) {\n expect(gen.nextBoolean(0)).toBe(false);\n }\n });\n\n test('always returns true with probability 1', () => {\n const gen = createGenerator(42);\n for (let i = 0; i < 100; i++) {\n expect(gen.nextBoolean(1)).toBe(true);\n }\n });\n });\n\n describe('nextString', () => {\n test('returns string of requested length', () => {\n const gen = createGenerator(42);\n expect(gen.nextString(10)).toHaveLength(10);\n expect(gen.nextString(0)).toHaveLength(0);\n expect(gen.nextString(100)).toHaveLength(100);\n });\n\n test('uses default alphanumeric character set', () => {\n const gen = createGenerator(42);\n const str = gen.nextString(200);\n expect(str).toMatch(/^[A-Za-z0-9]+$/);\n });\n\n test('uses custom character set', () => {\n const gen = createGenerator(42);\n const str = gen.nextString(100, 'abc');\n expect(str).toMatch(/^[abc]+$/);\n });\n\n test('single character set produces uniform string', () => {\n const gen = createGenerator(42);\n const str = gen.nextString(20, 'X');\n expect(str).toBe('X'.repeat(20));\n });\n\n test('same seed produces same string', () => {\n const gen1 = createGenerator(42);\n const gen2 = createGenerator(42);\n expect(gen1.nextString(50)).toBe(gen2.nextString(50));\n });\n\n test('empty string length returns empty string', () => {\n const gen = createGenerator(42);\n expect(gen.nextString(0)).toBe('');\n });\n });\n\n describe('pickNext', () => {\n test('returns an item from the array', () => {\n const gen = createGenerator(42);\n const items = ['a', 'b', 'c', 'd', 'e'];\n for (let i = 0; i < 100; i++) {\n expect(items).toContain(gen.pickNext(items));\n }\n });\n\n test('returns undefined for empty array', () => {\n const gen = createGenerator(42);\n expect(gen.pickNext([])).toBeUndefined();\n });\n\n test('returns undefined for undefined input', () => {\n const gen = createGenerator(42);\n expect(gen.pickNext(undefined)).toBeUndefined();\n });\n\n test('returns the only item for single-element array', () => {\n const gen = createGenerator(42);\n for (let i = 0; i < 20; i++) {\n expect(gen.pickNext(['only'])).toBe('only');\n }\n });\n\n test('is deterministic with same seed', () => {\n const gen1 = createGenerator(42);\n const gen2 = createGenerator(42);\n const items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n const picks1 = Array.from({ length: 20 }, () => gen1.pickNext(items));\n const picks2 = Array.from({ length: 20 }, () => gen2.pickNext(items));\n expect(picks1).toEqual(picks2);\n });\n\n test('works with typed arrays', () => {\n const gen = createGenerator(42);\n const numbers = [10, 20, 30];\n const picked = gen.pickNext(numbers);\n expect(picked).toBeDefined();\n expect(numbers).toContain(picked);\n });\n });\n\n describe('pickSequential', () => {\n const dictA = ['a1', 'a2', 'a3'];\n const dictB = ['b1', 'b2', 'b3'];\n const dictC = ['c1', 'c2', 'c3'];\n\n test('picks one item from each candidate dictionary in order', () => {\n const gen = createGenerator(42);\n const result = gen.pickSequential({\n how: 'sequence',\n candidates: [dictA, dictB, dictC]\n });\n\n expect(result).toHaveLength(3);\n expect(dictA).toContain(result[0]);\n expect(dictB).toContain(result[1]);\n expect(dictC).toContain(result[2]);\n });\n\n test('defaults count to number of candidate dictionaries', () => {\n const gen = createGenerator(42);\n const result = gen.pickSequential({\n how: 'sequence',\n candidates: [dictA, dictB]\n });\n expect(result).toHaveLength(2);\n });\n\n test('wraps around dictionaries when count exceeds candidates', () => {\n const gen = createGenerator(42);\n const result = gen.pickSequential({\n how: 'sequence',\n count: 7,\n candidates: [dictA, dictB, dictC]\n });\n\n expect(result).toHaveLength(7);\n // Items 0, 3, 6 come from dictA; 1, 4 from dictB; 2, 5 from dictC\n expect(dictA).toContain(result[0]);\n expect(dictB).toContain(result[1]);\n expect(dictC).toContain(result[2]);\n expect(dictA).toContain(result[3]);\n expect(dictB).toContain(result[4]);\n expect(dictC).toContain(result[5]);\n expect(dictA).toContain(result[6]);\n });\n\n test('count of 0 returns empty array', () => {\n const gen = createGenerator(42);\n const result = gen.pickSequential({\n how: 'sequence',\n count: 0,\n candidates: [dictA, dictB]\n });\n expect(result).toEqual([]);\n });\n\n test('skips undefined picks from empty candidate dictionaries', () => {\n const gen = createGenerator(42);\n const result = gen.pickSequential({\n how: 'sequence',\n candidates: [dictA, [], dictC]\n });\n\n // The empty dictionary yields undefined which is skipped\n expect(result).toHaveLength(2);\n expect(dictA).toContain(result[0]);\n expect(dictC).toContain(result[1]);\n });\n\n test('is deterministic with same seed', () => {\n const gen1 = createGenerator(42);\n const gen2 = createGenerator(42);\n const params: ISequentialPickParams<string> = {\n how: 'sequence',\n count: 10,\n candidates: [dictA, dictB, dictC]\n };\n expect(gen1.pickSequential(params)).toEqual(gen2.pickSequential(params));\n });\n });\n\n describe('pickRandom', () => {\n const dictA = ['a1', 'a2', 'a3'];\n const dictB = ['b1', 'b2', 'b3'];\n const dictC = ['c1', 'c2', 'c3'];\n\n test('picks count items from randomly selected dictionaries', () => {\n const gen = createGenerator(42);\n const result = gen.pickRandom({\n how: 'random',\n count: 10,\n candidates: [dictA, dictB, dictC]\n });\n\n expect(result).toHaveLength(10);\n const allItems = [...dictA, ...dictB, ...dictC];\n for (const item of result) {\n expect(allItems).toContain(item);\n }\n });\n\n test('count of 0 returns empty array', () => {\n const gen = createGenerator(42);\n const result = gen.pickRandom({\n how: 'random',\n count: 0,\n candidates: [dictA, dictB]\n });\n expect(result).toEqual([]);\n });\n\n test('single candidate dictionary picks only from that dictionary', () => {\n const gen = createGenerator(42);\n const result = gen.pickRandom({\n how: 'random',\n count: 20,\n candidates: [dictA]\n });\n\n expect(result).toHaveLength(20);\n for (const item of result) {\n expect(dictA).toContain(item);\n }\n });\n\n test('is deterministic with same seed', () => {\n const gen1 = createGenerator(42);\n const gen2 = createGenerator(42);\n const params: IRandomSequencePickParams<string> = {\n how: 'random',\n count: 10,\n candidates: [dictA, dictB, dictC]\n };\n expect(gen1.pickRandom(params)).toEqual(gen2.pickRandom(params));\n });\n\n test('skips undefined picks from empty candidate dictionaries', () => {\n const gen = createGenerator(42);\n const result = gen.pickRandom({\n how: 'random',\n count: 20,\n candidates: [dictA, [], dictC]\n });\n\n // Some picks land on the empty dictionary and are skipped\n expect(result.length).toBeLessThanOrEqual(20);\n expect(result.length).toBeGreaterThan(0);\n const allItems = [...dictA, ...dictC];\n for (const item of result) {\n expect(allItems).toContain(item);\n }\n });\n });\n\n describe('pickSequence', () => {\n const dictA = ['a1', 'a2'];\n const dictB = ['b1', 'b2'];\n\n test('dispatches to pickSequential for sequence mode', () => {\n const gen = createGenerator(42);\n const result = gen.pickSequence({\n how: 'sequence',\n candidates: [dictA, dictB]\n });\n\n expect(result).toHaveLength(2);\n expect(dictA).toContain(result[0]);\n expect(dictB).toContain(result[1]);\n });\n\n test('dispatches to pickRandom for random mode', () => {\n const gen = createGenerator(42);\n const result = gen.pickSequence({\n how: 'random',\n count: 5,\n candidates: [dictA, dictB]\n });\n\n expect(result).toHaveLength(5);\n const allItems = [...dictA, ...dictB];\n for (const item of result) {\n expect(allItems).toContain(item);\n }\n });\n\n test('produces identical results to direct method calls', () => {\n const gen1 = createGenerator(42);\n const gen2 = createGenerator(42);\n\n const seqResult = gen1.pickSequence({\n how: 'sequence',\n count: 4,\n candidates: [dictA, dictB]\n });\n const directResult = gen2.pickSequential({\n how: 'sequence',\n count: 4,\n candidates: [dictA, dictB]\n });\n expect(seqResult).toEqual(directResult);\n });\n });\n\n describe('global RNG', () => {\n test('setGlobalRng sets and returns the generator', () => {\n const gen = createGenerator(42);\n const result = PseudoRandomGenerator.setGlobalRng(gen);\n expect(result).toBe(gen);\n expect(PseudoRandomGenerator.getGlobalRng()).toBe(gen);\n });\n\n test('setGlobalRng with undefined clears the global', () => {\n const gen = createGenerator(42);\n PseudoRandomGenerator.setGlobalRng(gen);\n expect(PseudoRandomGenerator.getGlobalRng()).toBe(gen);\n\n PseudoRandomGenerator.setGlobalRng(undefined);\n expect(PseudoRandomGenerator.getGlobalRng()).toBeUndefined();\n });\n\n test('getGlobalRng returns undefined when not set', () => {\n expect(PseudoRandomGenerator.getGlobalRng()).toBeUndefined();\n });\n });\n\n describe('ensureRng', () => {\n test('returns the provided rng if given', () => {\n const gen = createGenerator(42);\n expect(PseudoRandomGenerator.ensureRng(gen)).toSucceedAndSatisfy((result) => {\n expect(result).toBe(gen);\n });\n });\n\n test('returns global rng when no rng is provided and global is set', () => {\n const global = createGenerator(99);\n PseudoRandomGenerator.setGlobalRng(global);\n\n expect(PseudoRandomGenerator.ensureRng()).toSucceedAndSatisfy((result) => {\n expect(result).toBe(global);\n });\n });\n\n test('creates a new rng when none provided and no global is set', () => {\n expect(PseudoRandomGenerator.ensureRng()).toSucceedAndSatisfy((result) => {\n expect(result).toBeDefined();\n expect(result.rng.counter).toBe(0);\n });\n });\n\n test('prefers provided rng over global', () => {\n const global = createGenerator(99);\n const local = createGenerator(42);\n PseudoRandomGenerator.setGlobalRng(global);\n\n expect(PseudoRandomGenerator.ensureRng(local)).toSucceedAndSatisfy((result) => {\n expect(result).toBe(local);\n });\n });\n });\n});\n"]}
@@ -1,452 +0,0 @@
1
- import '@fgv/ts-utils-jest';
2
- import { SeededRandomSource } from '../../generator';
3
- /**
4
- * A passthrough step function useful for testing: returns the state as the value
5
- * and increments the state by 1 each step, making sequences predictable.
6
- */
7
- const passthroughStep = (state) => {
8
- return {
9
- value: state,
10
- nextState: state + 1
11
- };
12
- };
13
- function createSource(seed) {
14
- return SeededRandomSource.create(seed).orThrow();
15
- }
16
- function readValues(source, count) {
17
- const values = [];
18
- for (let index = 0; index < count; index += 1) {
19
- values.push(source.next());
20
- }
21
- return values;
22
- }
23
- describe('SeededRandomSource', () => {
24
- describe('create', () => {
25
- test('succeeds with a numeric seed', () => {
26
- expect(SeededRandomSource.create(42)).toSucceedAndSatisfy((source) => {
27
- expect(source.seed).toBe('42');
28
- expect(source.counter).toBe(0);
29
- expect(source.lineage).toEqual([]);
30
- });
31
- });
32
- test('succeeds with a string seed', () => {
33
- expect(SeededRandomSource.create('hello')).toSucceedAndSatisfy((source) => {
34
- expect(source.seed).toBe('hello');
35
- expect(source.counter).toBe(0);
36
- expect(source.lineage).toEqual([]);
37
- });
38
- });
39
- test('succeeds with no seed using Date.now as fallback', () => {
40
- const nowSpy = jest.spyOn(Date, 'now').mockReturnValue(999);
41
- try {
42
- expect(SeededRandomSource.create()).toSucceedAndSatisfy((source) => {
43
- expect(source.seed).toBe('999');
44
- expect(source.counter).toBe(0);
45
- });
46
- }
47
- finally {
48
- nowSpy.mockRestore();
49
- }
50
- });
51
- test('unseeded sources created at different times produce different sequences', () => {
52
- const nowSpy = jest.spyOn(Date, 'now');
53
- nowSpy.mockReturnValueOnce(100);
54
- nowSpy.mockReturnValueOnce(200);
55
- try {
56
- const first = SeededRandomSource.create().orThrow();
57
- const second = SeededRandomSource.create().orThrow();
58
- expect(readValues(first, 4)).not.toEqual(readValues(second, 4));
59
- }
60
- finally {
61
- nowSpy.mockRestore();
62
- }
63
- });
64
- test('object-form initialization behaves like primitive initialization', () => {
65
- const primitive = createSource(12345);
66
- const object = SeededRandomSource.create({ seed: 12345 }).orThrow();
67
- expect(readValues(primitive, 4)).toEqual(readValues(object, 4));
68
- });
69
- test('object-form with custom step function uses that step', () => {
70
- expect(SeededRandomSource.create({ seed: 10, step: passthroughStep })).toSucceedAndSatisfy((source) => {
71
- expect(source.next()).toBe(10);
72
- expect(source.next()).toBe(11);
73
- expect(source.next()).toBe(12);
74
- });
75
- });
76
- test('object-form without seed falls back to Date.now', () => {
77
- const nowSpy = jest.spyOn(Date, 'now').mockReturnValue(555);
78
- try {
79
- expect(SeededRandomSource.create({ step: passthroughStep })).toSucceedAndSatisfy((source) => {
80
- expect(source.seed).toBe('555');
81
- expect(source.next()).toBe(555);
82
- });
83
- }
84
- finally {
85
- nowSpy.mockRestore();
86
- }
87
- });
88
- });
89
- describe('deterministic sequences', () => {
90
- test('same seed always produces the same sequence', () => {
91
- const first = createSource('deterministic');
92
- const second = createSource('deterministic');
93
- expect(readValues(first, 10)).toEqual(readValues(second, 10));
94
- });
95
- test('numeric and string forms of the same seed produce identical sequences', () => {
96
- const numeric = createSource(12345);
97
- const stringForm = createSource('12345');
98
- expect(readValues(numeric, 10)).toEqual(readValues(stringForm, 10));
99
- });
100
- test('different seeds produce different sequences', () => {
101
- const first = createSource('alpha');
102
- const second = createSource('beta');
103
- expect(readValues(first, 4)).not.toEqual(readValues(second, 4));
104
- });
105
- });
106
- describe('next', () => {
107
- test('counter increments with each call', () => {
108
- const source = createSource(1);
109
- expect(source.counter).toBe(0);
110
- source.next();
111
- expect(source.counter).toBe(1);
112
- source.next();
113
- source.next();
114
- expect(source.counter).toBe(3);
115
- });
116
- test('returns values in [0, 1) range over many iterations', () => {
117
- const source = createSource(42);
118
- for (let i = 0; i < 1000; i++) {
119
- const value = source.next();
120
- expect(value).toBeGreaterThanOrEqual(0);
121
- expect(value).toBeLessThan(1);
122
- }
123
- });
124
- test('sequence does not degenerate to constant values', () => {
125
- const source = createSource(42);
126
- const values = readValues(source, 100);
127
- const unique = new Set(values);
128
- // With 100 values from a proper PRNG, we expect many unique values
129
- expect(unique.size).toBeGreaterThan(90);
130
- });
131
- });
132
- describe('clone', () => {
133
- test('clone produces identical sequence from clone point', () => {
134
- const parent = createSource(7);
135
- parent.next();
136
- parent.next();
137
- const clone = parent.clone();
138
- expect(readValues(parent, 4)).toEqual(readValues(clone, 4));
139
- });
140
- test('clone preserves counter and lineage', () => {
141
- const parent = createSource(7);
142
- parent.next();
143
- parent.next();
144
- parent.next();
145
- const clone = parent.clone();
146
- expect(clone.counter).toBe(3);
147
- expect(clone.seed).toBe(parent.seed);
148
- expect(clone.lineage).toEqual(parent.lineage);
149
- });
150
- test('advancing clone does not affect parent', () => {
151
- const parent = createSource(7);
152
- parent.next();
153
- const clone = parent.clone();
154
- clone.next();
155
- clone.next();
156
- clone.next();
157
- // Parent should still be at counter 1 and produce its own next value
158
- expect(parent.counter).toBe(1);
159
- expect(clone.counter).toBe(4);
160
- // Parent's next value should differ from clone's (different positions)
161
- parent.next();
162
- clone.next();
163
- expect(parent.counter).toBe(2);
164
- expect(clone.counter).toBe(5);
165
- });
166
- test('clone of a child preserves child lineage', () => {
167
- const parent = createSource(7);
168
- parent.next();
169
- const child = parent.createChild('branch');
170
- child.next();
171
- child.next();
172
- const clone = child.clone();
173
- expect(clone.lineage).toEqual(['1:branch']);
174
- expect(clone.counter).toBe(2);
175
- expect(readValues(child, 4)).toEqual(readValues(clone, 4));
176
- });
177
- });
178
- describe('createChild', () => {
179
- test('child starts with counter at 0', () => {
180
- const parent = createSource(7);
181
- parent.next();
182
- parent.next();
183
- const child = parent.createChild('test');
184
- expect(child.counter).toBe(0);
185
- });
186
- test('child records lineage as counter:label', () => {
187
- const parent = createSource(7);
188
- parent.next();
189
- parent.next();
190
- parent.next();
191
- const child = parent.createChild('myLabel');
192
- expect(child.lineage).toEqual(['3:myLabel']);
193
- });
194
- test('grandchild accumulates lineage', () => {
195
- const parent = createSource(7);
196
- parent.next();
197
- parent.next();
198
- const child = parent.createChild('branch');
199
- child.next();
200
- const grandchild = child.createChild('leaf');
201
- expect(grandchild.lineage).toEqual(['2:branch', '1:leaf']);
202
- expect(grandchild.counter).toBe(0);
203
- });
204
- test('children with same label from same parent state are identical', () => {
205
- const parent1 = createSource(7);
206
- const parent2 = createSource(7);
207
- parent1.next();
208
- parent1.next();
209
- parent2.next();
210
- parent2.next();
211
- const child1 = parent1.createChild('same');
212
- const child2 = parent2.createChild('same');
213
- expect(readValues(child1, 10)).toEqual(readValues(child2, 10));
214
- });
215
- test('children with different labels produce different sequences', () => {
216
- const parent = createSource(7);
217
- parent.next();
218
- parent.next();
219
- const childA = parent.createChild('alpha');
220
- const childB = parent.createChild('beta');
221
- expect(readValues(childA, 4)).not.toEqual(readValues(childB, 4));
222
- });
223
- test('same label but different parent positions produce different children', () => {
224
- const early = createSource(7);
225
- const later = createSource(7);
226
- early.next();
227
- later.next();
228
- later.next();
229
- const earlyChild = early.createChild('shared');
230
- const laterChild = later.createChild('shared');
231
- expect(readValues(earlyChild, 4)).not.toEqual(readValues(laterChild, 4));
232
- });
233
- test('advancing child does not affect parent', () => {
234
- const parent = createSource(7);
235
- parent.next();
236
- parent.next();
237
- const child = parent.createChild('test');
238
- child.next();
239
- child.next();
240
- child.next();
241
- expect(parent.counter).toBe(2);
242
- expect(child.counter).toBe(3);
243
- });
244
- test('child uses same step function as parent', () => {
245
- const parent = SeededRandomSource.create({ seed: 10, step: passthroughStep }).orThrow();
246
- parent.next(); // advances state to 11
247
- const child = parent.createChild('x');
248
- // Child should use passthroughStep too. Its initial state comes from hashStateAndLabel
249
- // so value = hashed state, next call returns hashed state + 1
250
- const first = child.next();
251
- const second = child.next();
252
- expect(second - first).toBe(1); // passthroughStep increments by 1
253
- });
254
- test('child with empty label produces a valid source', () => {
255
- const parent = createSource(7);
256
- parent.next();
257
- const child = parent.createChild('');
258
- expect(child.lineage).toEqual(['1:']);
259
- expect(child.counter).toBe(0);
260
- // Should still produce valid numbers
261
- const value = child.next();
262
- expect(value).toBeGreaterThanOrEqual(0);
263
- expect(value).toBeLessThan(1);
264
- });
265
- });
266
- describe('hashSeed', () => {
267
- test('numeric input returns number as string seed and number as state', () => {
268
- const result = SeededRandomSource.hashSeed(42);
269
- expect(result).toEqual({ seed: '42', state: 42 });
270
- });
271
- test('numeric zero is handled correctly', () => {
272
- const result = SeededRandomSource.hashSeed(0);
273
- expect(result).toEqual({ seed: '0', state: 0 });
274
- });
275
- test('negative number is handled correctly', () => {
276
- const result = SeededRandomSource.hashSeed(-5);
277
- expect(result).toEqual({ seed: '-5', state: -5 });
278
- });
279
- test('string that parses as number uses numeric state', () => {
280
- const result = SeededRandomSource.hashSeed('123');
281
- expect(result).toEqual({ seed: '123', state: 123 });
282
- });
283
- test('string "0" parses as numeric zero', () => {
284
- const result = SeededRandomSource.hashSeed('0');
285
- expect(result).toEqual({ seed: '0', state: 0 });
286
- });
287
- test('non-numeric string is hashed to a state', () => {
288
- const result = SeededRandomSource.hashSeed('hello');
289
- expect(result.seed).toBe('hello');
290
- expect(typeof result.state).toBe('number');
291
- expect(result.state).toBeGreaterThanOrEqual(0);
292
- });
293
- test('same non-numeric string always produces same hash', () => {
294
- const first = SeededRandomSource.hashSeed('test-seed');
295
- const second = SeededRandomSource.hashSeed('test-seed');
296
- expect(first).toEqual(second);
297
- });
298
- test('different non-numeric strings produce different hashes', () => {
299
- const a = SeededRandomSource.hashSeed('alpha');
300
- const b = SeededRandomSource.hashSeed('beta');
301
- expect(a.state).not.toBe(b.state);
302
- });
303
- test('empty string is hashed (not treated as numeric)', () => {
304
- const result = SeededRandomSource.hashSeed('');
305
- expect(result.seed).toBe('');
306
- // Empty string: Number('') is 0, isFinite(0) is true, so state should be 0
307
- expect(result.state).toBe(0);
308
- });
309
- test('string "Infinity" is hashed as non-numeric', () => {
310
- const result = SeededRandomSource.hashSeed('Infinity');
311
- expect(result.seed).toBe('Infinity');
312
- // Number('Infinity') is Infinity, isFinite(Infinity) is false → hashed
313
- expect(typeof result.state).toBe('number');
314
- expect(result.state).not.toBe(Infinity);
315
- });
316
- test('string "NaN" is hashed as non-numeric', () => {
317
- const result = SeededRandomSource.hashSeed('NaN');
318
- expect(result.seed).toBe('NaN');
319
- // Number('NaN') is NaN, isNaN(NaN) is true → hashed
320
- expect(typeof result.state).toBe('number');
321
- expect(isNaN(result.state)).toBe(false);
322
- });
323
- test('floating point string is treated as numeric', () => {
324
- const result = SeededRandomSource.hashSeed('3.14');
325
- expect(result).toEqual({ seed: '3.14', state: 3.14 });
326
- });
327
- test('negative numeric string is treated as numeric', () => {
328
- const result = SeededRandomSource.hashSeed('-42');
329
- expect(result).toEqual({ seed: '-42', state: -42 });
330
- });
331
- });
332
- describe('hashStateAndLabel', () => {
333
- test('produces a seed string in "state:label" format', () => {
334
- const result = SeededRandomSource.hashStateAndLabel(100, 'test');
335
- expect(result.seed).toBe('100:test');
336
- });
337
- test('state is treated as unsigned 32-bit integer in seed string', () => {
338
- // -1 >>> 0 = 4294967295
339
- const result = SeededRandomSource.hashStateAndLabel(-1, 'label');
340
- expect(result.seed).toBe('4294967295:label');
341
- });
342
- test('same inputs produce same output', () => {
343
- const first = SeededRandomSource.hashStateAndLabel(42, 'branch');
344
- const second = SeededRandomSource.hashStateAndLabel(42, 'branch');
345
- expect(first).toEqual(second);
346
- });
347
- test('different states produce different results', () => {
348
- const a = SeededRandomSource.hashStateAndLabel(1, 'same');
349
- const b = SeededRandomSource.hashStateAndLabel(2, 'same');
350
- expect(a.state).not.toBe(b.state);
351
- });
352
- test('different labels produce different results', () => {
353
- const a = SeededRandomSource.hashStateAndLabel(42, 'alpha');
354
- const b = SeededRandomSource.hashStateAndLabel(42, 'beta');
355
- expect(a.state).not.toBe(b.state);
356
- });
357
- test('state value is a non-negative number from hash', () => {
358
- const result = SeededRandomSource.hashStateAndLabel(999, 'test');
359
- expect(result.state).toBeGreaterThanOrEqual(0);
360
- });
361
- });
362
- describe('mulberryStep', () => {
363
- test('returns value in [0, 1) range', () => {
364
- const result = SeededRandomSource.mulberryStep(42);
365
- expect(result.value).toBeGreaterThanOrEqual(0);
366
- expect(result.value).toBeLessThan(1);
367
- });
368
- test('advances state deterministically', () => {
369
- const first = SeededRandomSource.mulberryStep(42);
370
- const second = SeededRandomSource.mulberryStep(42);
371
- expect(first).toEqual(second);
372
- });
373
- test('different states produce different results', () => {
374
- const a = SeededRandomSource.mulberryStep(1);
375
- const b = SeededRandomSource.mulberryStep(2);
376
- expect(a.value).not.toBe(b.value);
377
- expect(a.nextState).not.toBe(b.nextState);
378
- });
379
- test('nextState is an unsigned 32-bit integer', () => {
380
- const result = SeededRandomSource.mulberryStep(0);
381
- expect(result.nextState).toBeGreaterThanOrEqual(0);
382
- expect(result.nextState).toBeLessThanOrEqual(0xffffffff);
383
- expect(Number.isInteger(result.nextState)).toBe(true);
384
- });
385
- test('state 0 produces valid output', () => {
386
- const result = SeededRandomSource.mulberryStep(0);
387
- expect(result.value).toBeGreaterThanOrEqual(0);
388
- expect(result.value).toBeLessThan(1);
389
- // nextState should be 0x6D2B79F5 (the constant added)
390
- expect(result.nextState).toBe(0x6d2b79f5);
391
- });
392
- test('produces [0,1) values across many states', () => {
393
- let state = 12345;
394
- for (let i = 0; i < 1000; i++) {
395
- const result = SeededRandomSource.mulberryStep(state);
396
- expect(result.value).toBeGreaterThanOrEqual(0);
397
- expect(result.value).toBeLessThan(1);
398
- state = result.nextState;
399
- }
400
- });
401
- });
402
- describe('seed edge cases', () => {
403
- test('seed 0 produces a valid source', () => {
404
- expect(SeededRandomSource.create(0)).toSucceedAndSatisfy((source) => {
405
- expect(source.seed).toBe('0');
406
- const value = source.next();
407
- expect(value).toBeGreaterThanOrEqual(0);
408
- expect(value).toBeLessThan(1);
409
- });
410
- });
411
- test('negative seed produces a valid source', () => {
412
- expect(SeededRandomSource.create(-1)).toSucceedAndSatisfy((source) => {
413
- expect(source.seed).toBe('-1');
414
- const value = source.next();
415
- expect(value).toBeGreaterThanOrEqual(0);
416
- expect(value).toBeLessThan(1);
417
- });
418
- });
419
- test('very large numeric seed produces a valid source', () => {
420
- expect(SeededRandomSource.create(Number.MAX_SAFE_INTEGER)).toSucceedAndSatisfy((source) => {
421
- const value = source.next();
422
- expect(value).toBeGreaterThanOrEqual(0);
423
- expect(value).toBeLessThan(1);
424
- });
425
- });
426
- test('empty string seed produces a valid source', () => {
427
- expect(SeededRandomSource.create('')).toSucceedAndSatisfy((source) => {
428
- expect(source.seed).toBe('');
429
- const value = source.next();
430
- expect(value).toBeGreaterThanOrEqual(0);
431
- expect(value).toBeLessThan(1);
432
- });
433
- });
434
- test('whitespace string seed produces a valid source', () => {
435
- expect(SeededRandomSource.create(' ')).toSucceedAndSatisfy((source) => {
436
- expect(source.seed).toBe(' ');
437
- const value = source.next();
438
- expect(value).toBeGreaterThanOrEqual(0);
439
- expect(value).toBeLessThan(1);
440
- });
441
- });
442
- test('unicode string seed produces a valid source', () => {
443
- expect(SeededRandomSource.create('🎲🎰')).toSucceedAndSatisfy((source) => {
444
- expect(source.seed).toBe('🎲🎰');
445
- const value = source.next();
446
- expect(value).toBeGreaterThanOrEqual(0);
447
- expect(value).toBeLessThan(1);
448
- });
449
- });
450
- });
451
- });
452
- //# sourceMappingURL=randomSource.test.js.map