From ed85d35117c0bc7f0a8cc68d3c82ad16c7b4684e Mon Sep 17 00:00:00 2001 From: FoxxMD Date: Fri, 20 Mar 2026 16:31:19 +0000 Subject: [PATCH] feat: Implement random object generator --- src/core/DataUtils.ts | 8 ++++- src/core/tests/utils/fixtures.ts | 58 +++++++++++++++++++++++++++++++- 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/src/core/DataUtils.ts b/src/core/DataUtils.ts index c901529c..b772ba71 100644 --- a/src/core/DataUtils.ts +++ b/src/core/DataUtils.ts @@ -8,7 +8,9 @@ export const jdiff = diffCreate({ }, cloneDiffValues: true //omitRemovedValues: true -});export const formatNumber = (val: number | string, options?: numberFormatOptions) => { +}); + +export const formatNumber = (val: number | string, options?: numberFormatOptions) => { const { toFixed = 2, defaultVal = null, prefix = '', suffix = '', round, } = options || {}; @@ -43,3 +45,7 @@ export const jdiff = diffCreate({ return `${prefixStr}${localeString}${suffix}`; }; +export const generateArray = (size: number, gen: (index: number) => any) => { + return Array.from(Array(size), (v,k) => gen(k)); +} + diff --git a/src/core/tests/utils/fixtures.ts b/src/core/tests/utils/fixtures.ts index 37e1beb8..a764122f 100644 --- a/src/core/tests/utils/fixtures.ts +++ b/src/core/tests/utils/fixtures.ts @@ -1,9 +1,11 @@ import { Traverse, TraverseContext } from 'neotraverse/modern'; +import { faker } from '@faker-js/faker'; import dayjs from 'dayjs'; -import { AmbPlayObject, JsonPlayObject, PlayObject, PlayProgressAmb, REGEX_ISO8601_LOOSE } from '../../Atomic.js'; +import { AmbPlayObject, JsonPlayObject, ObjectPlayData, PlayMeta, PlayObject, PlayProgressAmb, REGEX_ISO8601_LOOSE } from '../../Atomic.js'; import { ListenRange } from '../../../backend/sources/PlayerState/ListenRange.js'; import { ListenProgressPositional, ListenProgressTS } from '../../../backend/sources/PlayerState/ListenProgress.js'; import { clone } from 'jsondiffpatch'; +import { MarkOptional } from 'ts-essentials'; interface BlockPath { key: string, parent: string }; type BlockPaths = BlockPath[]; @@ -78,4 +80,58 @@ export const asPlay = (data: JsonPlayObject): PlayObject => { } }); return cloned as unknown as PlayObject; +} + +export interface GeneratePlayWithLifecycleOptions { + original: { + data?: ObjectPlayData, + meta?: MarkOptional + } +} +export const generatePlayWithLifecycle = (opts: GeneratePlayWithLifecycleOptions) => { + +} + +export interface RandomObjOptions { + maxObjSize?: number + maxKeyLength?: number + keyCount?: number + maxDepth?: number +} + +const generateRandomVal = (depth: number = 0, opt: RandomObjOptions = {}, typeId?: number) => { + const i = typeId ?? faker.number.int({ min: 1, max: depth > (opt.maxDepth ?? 3) ? 6 : 8 }); + switch (i) { + case 1: + return undefined; + case 2: + return faker.datatype.boolean(); + case 3: + return faker.date.recent().toISOString(); + case 4: + return faker.lorem.word(); + case 5: + return faker.lorem.sentences({ min: 0, max: 5 }); + case 6: + return faker.helpers.arrayElement([faker.number.int({ min: 1, max: 1000 }), faker.number.float()]); + case 7: + return generateRandomObj(depth + 1, opt); + case 8: + const typeId = faker.number.int({ min: 4, max: depth > (opt.maxDepth ?? 3) ? 6 : 7 }); + return faker.helpers.multiple(() => generateRandomVal(depth + 1, opt, typeId), { count: { min: 1, max: opt.maxObjSize ?? 7 } }) + } +} + +export const generateRandomObj = (depth: number = 0, opt: RandomObjOptions = {}) => { + const tgrt: any = {} + + const keyCount = opt.keyCount ?? faker.number.int({ min: 1, max: 13 }); + + for (let i = 0; i < keyCount; i++) { + const key = faker.lorem.slug({ min: 1, max: 3 }) + if (tgrt[key] === undefined) { + tgrt[key] = generateRandomVal(depth + 1, opt) + } + } + return tgrt } \ No newline at end of file -- 2.51.2