{"version":3,"file":"runner-core.cjs","sources":["../../../src/run-assertions/runner-core.js"],"sourcesContent":["// Core test runner logic for Fauji\nimport { rootSuite } from './suite.js';\nimport { Logger } from '../logger/logger-core.js';\nimport * as allMatchersModule from '../matchers/index.js';\n\nconst allMatchers = allMatchersModule.allMatchers || allMatchersModule.default || allMatchersModule;\n\n// Use a getter to always get the correct logger instance\nconst defaultLogger = new Logger();\nfunction getLogger() {\n  return (typeof global !== 'undefined' && global._testLogger) ? global._testLogger : defaultLogger;\n}\n\n/**\n * Recursively filters the suite tree to only include suites/tests marked as 'only'.\n * Modifies the suite tree in-place.\n * @param {Suite} suite\n */\nfunction filterOnlySuites(suite) {\n  const onlySuites = suite.suites.filter(s => s.mode === 'only' || hasOnly(s));\n  const onlyTests = suite.tests.filter(t => t.mode === 'only');\n  if (onlySuites.length || onlyTests.length) {\n    suite.suites = onlySuites;\n    suite.tests = onlyTests;\n    suite.suites.forEach(filterOnlySuites);\n  } else {\n    suite.suites.forEach(filterOnlySuites);\n  }\n}\n\n/**\n * Checks if a suite or any of its children are marked as 'only'.\n * @param {Suite} suite\n * @returns {boolean}\n */\nfunction hasOnly(suite) {\n  if (suite.mode === 'only') return true;\n  if (suite.tests.some(t => t.mode === 'only')) return true;\n  return suite.suites.some(hasOnly);\n}\n\nasync function resolveFixtures(test, suite) {\n  // Walk up the suite chain to collect all fixtures\n  const fixtures = {};\n  let current = suite;\n  while (current) {\n    Object.assign(fixtures, current.fixtures);\n    current = current.parent;\n  }\n  // Resolve requested fixtures\n  const resolved = [];\n  const teardowns = [];\n  for (const name of test.fixtures || []) {\n    if (!fixtures[name]) throw new Error(`Fixture not found: ${name}`);\n    const result = await fixtures[name]();\n    if (result && typeof result === 'object' && 'value' in result) {\n      resolved.push(result.value);\n      if (typeof result.teardown === 'function') teardowns.push(result.teardown);\n    } else {\n      resolved.push(result);\n    }\n  }\n  return { resolved, teardowns };\n}\n\n/**\n * Recursively runs a test suite, including hooks and child suites.\n * Handles skipped tests and logs results using Logger.\n * @param {Suite} suite\n */\nasync function runSuite(suite) {\n  if (suite.mode === 'skip') return;\n  getLogger().perceive('describe', suite.desc, suite.annotations);\n  \n  // Registry isolation is handled at module level\n  \n  for (const fn of suite.hooks.beforeAll) await fn();\n  \n  for (const test of suite.tests) {\n    if (test.mode === 'skip') {\n      getLogger().perceive('test', test.desc + ' (skipped)', test.annotations);\n      getLogger().status(true, null, true); // Mark as skipped\n      continue;\n    }\n    \n    for (const fn of suite.hooks.beforeEach) await fn();\n    let teardowns = [];\n    \n    try {\n      getLogger().perceive('test', test.desc, test.annotations);\n      const { resolved, teardowns: tds } = await resolveFixtures(test, suite);\n      teardowns = tds;\n      const maybePromise = test.fn(...resolved);\n      if (maybePromise && typeof maybePromise.then === 'function') {\n        await maybePromise;\n      }\n      // Test passed, mark as successful\n      getLogger().status(true);\n    } catch (e) {\n      // Test failed, mark as failed with error\n      getLogger().status(false, e);\n    }\n    \n    // Run teardowns after test\n    for (const td of teardowns) {\n      try {\n        const maybePromise = td();\n        if (maybePromise && typeof maybePromise.then === 'function') {\n          await maybePromise;\n        }\n      } catch (e) {\n        // Ignore teardown errors for now\n      }\n    }\n    for (const fn of suite.hooks.afterEach) await fn();\n  }\n  \n  for (const child of suite.suites) {\n    await runSuite(child);\n  }\n  \n  for (const fn of suite.hooks.afterAll) await fn();\n  getLogger().suiteStack.pop();\n}\n\n/**\n * Runs all root-level suites, applies 'only' filtering.\n * Summary printing is handled by test-execution.js\n */\nfunction run() {\n  getLogger().startTimer();\n  if (hasOnly(rootSuite)) {\n    filterOnlySuites(rootSuite);\n  }\n  return (async () => {\n    await runSuite(rootSuite);\n    // Summary and exit code are handled by test-execution.js\n  })();\n}\n\n/**\n * Returns all matchers for a received value, for use in test assertions.\n * @param {*} exp\n * @returns {Matchers}\n */\nfunction expect(exp) {\n  return allMatchers(exp);\n}\n\nexport { run, expect, runSuite, filterOnlySuites, hasOnly };\n"],"names":["Logger","rootSuite"],"mappings":"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"}