From 3d5041fb2f8964c30f0273615b4f039620eef0bf Mon Sep 17 00:00:00 2001 From: N0zoM1z0 <1705004398@qq.com> Date: Tue, 14 Jul 2026 21:32:23 +0000 Subject: [PATCH] test(reference): cover failure normalization --- src/application/ReferenceSourceImport.ts | 38 ++++++++++++++---------- tests/referenceSourceImport.test.ts | 26 +++++++++++++++- 2 files changed, 47 insertions(+), 17 deletions(-) diff --git a/src/application/ReferenceSourceImport.ts b/src/application/ReferenceSourceImport.ts index 5521767b12..c0048ae60b 100644 --- a/src/application/ReferenceSourceImport.ts +++ b/src/application/ReferenceSourceImport.ts @@ -67,6 +67,27 @@ const deduplicateRelationships = ( return result; }; +/** Sort parse failures deterministically while retaining distinct reasons. */ +export const normalizeHistoricalSourceParseFailures = ( + failures: HistoricalSourceGraphInput["parse_failures"], +): HistoricalSourceGraphInput["parse_failures"] => + [...failures] + .sort((left, right) => + byCodePoint( + historicalSourceParseFailureKey(left), + historicalSourceParseFailureKey(right), + ), + ) + .filter((value, index, array) => { + if (index === 0) return true; + const previous = array[index - 1]; + return ( + previous === undefined || + historicalSourceParseFailureKey(value) !== + historicalSourceParseFailureKey(previous) + ); + }); + const buildProvenance = ( options: ReferenceSourceImportOptions, ): HistoricalSourceGraphInput["provenance"] => ({ @@ -205,22 +226,7 @@ export const importReferenceSource = async ( if (isAborted(options.signal)) return err(cancelled()); const uniqueRelationships = deduplicateRelationships(relationships); - const uniqueFailures = [...parseFailures] - .sort((left, right) => - byCodePoint( - historicalSourceParseFailureKey(left), - historicalSourceParseFailureKey(right), - ), - ) - .filter((value, index, array) => { - if (index === 0) return true; - const previous = array[index - 1]; - if (previous === undefined) return true; - return ( - historicalSourceParseFailureKey(value) !== - historicalSourceParseFailureKey(previous) - ); - }); + const uniqueFailures = normalizeHistoricalSourceParseFailures(parseFailures); const sortedEntries = [...entries].sort((left, right) => byCodePoint(left.path, right.path), diff --git a/tests/referenceSourceImport.test.ts b/tests/referenceSourceImport.test.ts index 957387450a..ccba32cc47 100644 --- a/tests/referenceSourceImport.test.ts +++ b/tests/referenceSourceImport.test.ts @@ -6,7 +6,10 @@ import { join } from "node:path"; import { add, commit, init } from "isomorphic-git"; import { describe, expect, it } from "vitest"; -import { importReferenceSource } from "../src/application/ReferenceSourceImport.js"; +import { + importReferenceSource, + normalizeHistoricalSourceParseFailures, +} from "../src/application/ReferenceSourceImport.js"; import { projectReferenceSourceEntryFailure } from "../src/application/ReferenceSourceImportEntries.js"; import { projectReferenceSourceImportError, @@ -52,6 +55,27 @@ const importTree = ( }); describe("reference source import", () => { + it("deduplicates exact parse failures without collapsing distinct reasons", () => { + const malformed = { + path: "src/main.ts", + parser: "babel", + reason: "Malformed input", + }; + const unexpected = { + path: "src/main.ts", + parser: "babel", + reason: "Unexpected token", + }; + + expect( + normalizeHistoricalSourceParseFailures([ + unexpected, + malformed, + unexpected, + ]), + ).toEqual([malformed, unexpected]); + }); + it("projects entry failures without low-level reader diagnostics", () => { for (const [kind, code] of [ ["directory", "io"],