{"version":3,"file":"readTestCases.cjs","names":["fs","path"],"sources":["../../src/helpers/readTestCases.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nconst SHARED_TEST_CASE_NAME = '_shared';\n\nexport async function readTestCases(directory: string): Promise<\n  { id: string; input?: string; output?: string; fileInputPath?: string; fileOutputPath?: string }[] & {\n    shared?: { fileInputPath?: string };\n  }\n> {\n  if (!fs.existsSync(directory)) return [];\n\n  const idSet = new Set<string>();\n  const idToInput = new Map<string, string>();\n  const idToOutput = new Map<string, string>();\n  const idToFileInputPath = new Map<string, string>();\n  const idToFileOutputPath = new Map<string, string>();\n\n  for (const dirent of await fs.promises.readdir(directory, { withFileTypes: true })) {\n    if (dirent.isFile()) {\n      const { ext, name } = path.parse(dirent.name);\n      if (ext !== '.in' && ext !== '.out') continue;\n\n      const text = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name), 'utf8');\n\n      idSet.add(name);\n      if (ext === '.in') idToInput.set(name, text);\n      if (ext === '.out') idToOutput.set(name, text);\n    } else if (dirent.isDirectory()) {\n      const { ext, name } = path.parse(dirent.name);\n      if (ext !== '.fin' && ext !== '.fout') continue;\n\n      idSet.add(name);\n      if (ext === '.fin') idToFileInputPath.set(name, path.join(dirent.parentPath, dirent.name));\n      if (ext === '.fout') idToFileOutputPath.set(name, path.join(dirent.parentPath, dirent.name));\n    }\n  }\n\n  const testCases: Awaited<ReturnType<typeof readTestCases>> = [...idSet]\n    .filter((id) => id !== SHARED_TEST_CASE_NAME)\n    .toSorted()\n    .map((id) => ({\n      id,\n      input: idToInput.get(id),\n      output: idToOutput.get(id),\n      fileInputPath: idToFileInputPath.get(id),\n      fileOutputPath: idToFileOutputPath.get(id),\n    }));\n\n  if (idSet.has(SHARED_TEST_CASE_NAME)) {\n    testCases.shared = { fileInputPath: idToFileInputPath.get(SHARED_TEST_CASE_NAME) };\n  }\n\n  return testCases;\n}\n"],"mappings":"wJAGA,MAAM,EAAwB,UAE9B,eAAsB,EAAc,EAIlC,CACA,GAAI,CAACA,EAAAA,QAAG,WAAW,CAAS,EAAG,MAAO,CAAC,EAEvC,IAAM,EAAQ,IAAI,IACZ,EAAY,IAAI,IAChB,EAAa,IAAI,IACjB,EAAoB,IAAI,IACxB,EAAqB,IAAI,IAE/B,IAAK,IAAM,KAAU,MAAMA,EAAAA,QAAG,SAAS,QAAQ,EAAW,CAAE,cAAe,EAAK,CAAC,EAC/E,GAAI,EAAO,OAAO,EAAG,CACnB,GAAM,CAAE,MAAK,QAASC,EAAAA,QAAK,MAAM,EAAO,IAAI,EAC5C,GAAI,IAAQ,OAAS,IAAQ,OAAQ,SAErC,IAAM,EAAO,MAAMD,EAAAA,QAAG,SAAS,SAASC,EAAAA,QAAK,KAAK,EAAO,WAAY,EAAO,IAAI,EAAG,MAAM,EAEzF,EAAM,IAAI,CAAI,EACV,IAAQ,OAAO,EAAU,IAAI,EAAM,CAAI,EACvC,IAAQ,QAAQ,EAAW,IAAI,EAAM,CAAI,CAC/C,MAAO,GAAI,EAAO,YAAY,EAAG,CAC/B,GAAM,CAAE,MAAK,QAASA,EAAAA,QAAK,MAAM,EAAO,IAAI,EAC5C,GAAI,IAAQ,QAAU,IAAQ,QAAS,SAEvC,EAAM,IAAI,CAAI,EACV,IAAQ,QAAQ,EAAkB,IAAI,EAAMA,EAAAA,QAAK,KAAK,EAAO,WAAY,EAAO,IAAI,CAAC,EACrF,IAAQ,SAAS,EAAmB,IAAI,EAAMA,EAAAA,QAAK,KAAK,EAAO,WAAY,EAAO,IAAI,CAAC,CAC7F,CAGF,IAAM,EAAuD,CAAC,GAAG,CAAK,CAAC,CACpE,OAAQ,GAAO,IAAO,CAAqB,CAAC,CAC5C,SAAS,CAAC,CACV,IAAK,IAAQ,CACZ,KACA,MAAO,EAAU,IAAI,CAAE,EACvB,OAAQ,EAAW,IAAI,CAAE,EACzB,cAAe,EAAkB,IAAI,CAAE,EACvC,eAAgB,EAAmB,IAAI,CAAE,CAC3C,EAAE,EAMJ,OAJI,EAAM,IAAI,CAAqB,IACjC,EAAU,OAAS,CAAE,cAAe,EAAkB,IAAI,CAAqB,CAAE,GAG5E,CACT"}