{"version":3,"file":"constructTests.cjs","names":["buildIndex","tupleOf","buildInvite","fakeWaiter","vi","identity","sleep","_any","expect"],"sources":["../src/constructTests.ts"],"sourcesContent":["import { _any, tupleOf } from '@bemedev/app/bemedev';\nimport { identity, sleep } from '@bemedev/app/utils';\nimport { vi, expect, test } from 'vitest';\nimport type { ConstructTests_F } from './constructTests.types';\nimport { fakeWaiter } from './helpers';\nimport { buildIndex, buildInvite } from './invite';\nimport type { ConstructTestsResult2, RejectionHandler } from './types';\n\nexport { ConstructTests_F };\n\n/**\n * Constructs test suites and assertion utilities for an interpreter instance.\n *\n * @param vi - Vitest utility instance.\n * @param service - Interpreter service instance (sync or async).\n * @param helper - Optional helper builder callback function.\n * @param startIndex - Starting index for test step numbers (defaults to `0`).\n *\n * @returns Constructed test helpers object.\n *\n * @see -- type {@linkcode ConstructTests_F}, {@linkcode fakeWaiter}, {@linkcode buildIndex}, {@linkcode buildInvite}\n */\nexport const constructTests: ConstructTests_F = (\n  service,\n  helper,\n  startIndex = 0,\n) => {\n  let _index = startIndex;\n  const index = (__index?: number) => {\n    const num = __index ?? _index;\n    const out = buildIndex(num, Math.max(90, num + 5));\n    _index++;\n    return out;\n  };\n\n  const errorsOrWarnings = (type: '_errorsCollector' | '_warningsCollector') => {\n    const str = type === '_errorsCollector' ? 'errors' : 'warnings';\n    return (...warnings: string[]) => {\n      const invite = `#${index()} => Expect ${str} : ${warnings.join(', ')}`;\n      return tupleOf(invite, () => {\n        const cases = warnings.map(\n          (warning, index) =>\n            [\n              buildInvite(\n                `${warning} should be in service.${type}`,\n                index + 1,\n                Math.max(90, warnings.length + 5),\n              ),\n              warning,\n            ] as const,\n        );\n\n        test.each([...cases])('%s', (_, warning) => {\n          expect(service[type]).toContain(warning);\n        });\n      });\n    };\n  };\n\n  const out: ConstructTestsResult2 = {\n    ...helper?.({\n      tupleOf: (invite, assertion) => [invite, assertion],\n      waiter: (DELAY = 150) => {\n        return (times = 1, _index) => {\n          const invite = `#${index(_index)} => Wait ${times} times ${DELAY}ms`;\n\n          return tupleOf(invite, async () => {\n            try {\n              await fakeWaiter(vi, DELAY, times);\n            } catch {\n              // In case of fake timers, this can throw if the timers are not properly handled.\n            }\n          });\n        };\n      },\n\n      contexts: (selector, name) => (value, _index) => {\n        const isNo = value === undefined || value === null;\n        const _selector = selector ?? identity;\n\n        const _value = isNo ? 'undefined' : JSON.stringify(value).substring(0, 15);\n\n        const _name = name ?? 'context';\n        const invite = `#${index(_index)} => ${_name} equal : ${_value}`;\n\n        return tupleOf(invite, () => {\n          const received = _selector({\n            context: service.context,\n            pContext: service._pContext as any,\n          });\n\n          expect(received).toEqual(value);\n        });\n      },\n\n      getIndex: index,\n      service,\n\n      sender: type => {\n        return (...___payload: any[]) => {\n          const invite = `#${index()} => send ${type} event with payload`;\n\n          return tupleOf(invite, async () => {\n            const sender = service.sender(type);\n            sender(...(___payload as any));\n            await fakeWaiter(vi, 0);\n          });\n        };\n      },\n    }),\n\n    useWarnings: errorsOrWarnings('_warningsCollector'),\n    useErrors: errorsOrWarnings('_errorsCollector'),\n\n    useStateValue: (value, _index) => {\n      const _value = JSON.stringify(value);\n      const invite = `#${index(_index)} => current value is :${_value}`;\n\n      return tupleOf(invite, () => {\n        expect(service.state.value).toEqual(value);\n      });\n    },\n\n    changeIndex: fn => {\n      const value = fn(_index);\n      const invite = `#${index()} Change the current index to ${value}`;\n\n      return tupleOf(invite, () => {\n        _index = value;\n      });\n    },\n\n    unhandledRejection: (testFn, error, timeout = 100) => {\n      const invite = `#${index()} => Error : ${error} should be thrown`;\n\n      const handler: RejectionHandler = (_error: any) => {\n        const msg = _error instanceof Error ? _error.message : String(_error);\n        expect(msg).toEqual(error);\n      };\n\n      const fn = async () => {\n        process.on('unhandledRejection', handler);\n        process.on('uncaughtException', handler);\n\n        try {\n          testFn();\n          await sleep(timeout);\n        } catch (error) {\n          handler(error, Promise.resolve());\n        } finally {\n          process.off('unhandledRejection', handler);\n          process.off('uncaughtException', handler);\n        }\n      };\n\n      return tupleOf(invite, fn);\n    },\n\n    send: (_event, _index) => {\n      const event = JSON.stringify(_event);\n      const invite = `#${index(_index)} => send ${event}`;\n\n      return tupleOf(invite, async () => {\n        service.send(_any(_event));\n        await fakeWaiter(vi, 0);\n      });\n    },\n\n    start: _index => {\n      const invite = `#${index(_index)} => Start the service`;\n      return tupleOf(invite, async () => {\n        service.start();\n        await fakeWaiter(vi, 0);\n      });\n    },\n\n    stop: _index => {\n      const invite = `#${index(_index)} => Stop the service`;\n      return tupleOf(invite, service.stop);\n    },\n\n    dispose: _index => {\n      const invite = `#${index(_index)} => Dispose the service`;\n      return tupleOf(invite, service.stop);\n    },\n\n    pause: _index => {\n      const invite = `#${index(_index)} => Pause the service`;\n      return tupleOf(invite, service.pause);\n    },\n\n    resume: _index => {\n      const invite = `#${index(_index)} => Resume the service`;\n      return tupleOf(invite, service.resume);\n    },\n\n    useTags: (...tags) => {\n      const invite = `#${index()} => Tags are : ${tags.join(', ')}`;\n      return tupleOf(invite, () => {\n        expect(service.tags).toEqual(expect.arrayContaining(tags as any));\n      });\n    },\n  };\n\n  return _any(out);\n};\n"],"mappings":"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"}