{"version":3,"file":"spyErrorReporting.cjs","sources":["../../../src/matchers/spyErrorReporting.js"],"sourcesContent":["/**\n * Specialized error reporting for spy matchers and .not cases\n * This provides better error messages specifically for spy/mock function assertions\n */\n\nimport util from 'util';\nimport { isSpy, isMockFunction } from './spy.js';\n\n/**\n * Extracts meaningful data from spy/mock functions for error reporting\n * @param {Function} fn - The spy or mock function\n * @returns {Object} - Object with call data, return data, and error data\n */\nfunction extractSpyData(fn) {\n  if (!isSpy(fn) && !isMockFunction(fn)) {\n    return { calls: [], returns: [], errors: [] };\n  }\n\n  let calls = [];\n  let results = [];\n\n  if (isMockFunction(fn)) {\n    calls = fn.mock.calls || [];\n    results = fn.mock.results || [];\n  } else if (isSpy(fn)) {\n    calls = fn.calls || [];\n    results = fn.results || [];\n  }\n\n  const returns = results\n    .filter(result => result.type === 'return')\n    .map(result => result.value);\n\n  const errors = results\n    .filter(result => result.type === 'throw')\n    .map(result => result.value);\n\n  return { calls, returns, errors };\n}\n\n/**\n * Formats spy/mock function data for error messages\n * @param {Function} fn - The spy or mock function\n * @returns {string} - Formatted string representation\n */\nfunction formatSpyData(fn) {\n  const { calls, returns, errors } = extractSpyData(fn);\n  \n  let parts = [];\n  \n  if (calls.length > 0) {\n    parts.push(`calls: ${calls.length} (${calls.map(call => util.inspect(call, { depth: 3, colors: false })).join(', ')})`);\n  } else {\n    parts.push('calls: 0');\n  }\n  \n  if (returns.length > 0) {\n    parts.push(`returns: ${returns.map(ret => util.inspect(ret, { depth: 3, colors: false })).join(', ')}`);\n  }\n  \n  if (errors.length > 0) {\n    parts.push(`errors: ${errors.map(err => util.inspect(err, { depth: 3, colors: false })).join(', ')}`);\n  }\n  \n  return `{ ${parts.join(', ')} }`;\n}\n\n/**\n * Creates a specialized error for spy matcher failures\n * @param {string} matcherName - The name of the matcher\n * @param {Function} received - The spy/mock function\n * @param {*} expected - The expected value\n * @param {boolean} isNot - Whether this is a .not assertion\n * @returns {Error} - The formatted error\n */\nexport function createSpyMatcherError(matcherName, received, expected, isNot = false) {\n  const spyData = formatSpyData(received);\n  const notText = isNot ? 'not.' : '';\n  \n  let message = `Assertion failed: ${notText}${matcherName}`;\n  \n  if (typeof expected !== 'undefined') {\n    message += `\\n\\nDifference:`;\n    message += `\\n- Expected: ${util.inspect(expected, { depth: 5, colors: false })}`;\n    message += `\\n+ Received: ${spyData}`;\n  } else {\n    message += `\\n\\nDifference:`;\n    message += `\\n- Expected: ${notText}${matcherName}`;\n    message += `\\n+ Received: ${spyData}`;\n  }\n  \n  const error = new Error(message);\n  error.actual = extractSpyData(received);\n  error.expected = expected;\n  error.matcherName = matcherName;\n  error.isNot = isNot;\n  \n  return error;\n}\n\n/**\n * Specialized getMatcherResult for spy matchers\n * @param {boolean} result - Whether the assertion passed\n * @param {string} matcherName - The name of the matcher\n * @param {Function} received - The spy/mock function\n * @param {*} expected - The expected value\n * @param {boolean} isNot - Whether this is a .not assertion\n * @returns {boolean|Error} - Returns true if passed, throws error if failed\n */\nexport function getSpyMatcherResult(result, matcherName, received, expected, isNot = false) {\n  if (result) {\n    return true;\n  }\n  \n  throw createSpyMatcherError(matcherName, received, expected, isNot);\n}\n\n/**\n * Specialized error for .not spy matcher failures\n * @param {string} matcherName - The name of the matcher\n * @param {Function} received - The spy/mock function\n * @param {*} expected - The expected value\n * @returns {Error} - The formatted error\n */\nexport function createNotSpyMatcherError(matcherName, received, expected) {\n  return createSpyMatcherError(matcherName, received, expected, true);\n} "],"names":["isSpy","isMockFunction"],"mappings":"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"}