@gitwand/core 2.0.1 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -0
- package/dist/__tests__/bench.bench.js +39 -0
- package/dist/__tests__/bench.bench.js.map +1 -1
- package/dist/__tests__/corpus.d.ts.map +1 -1
- package/dist/__tests__/corpus.js +363 -0
- package/dist/__tests__/corpus.js.map +1 -1
- package/dist/__tests__/diff/block-move.test.d.ts +5 -0
- package/dist/__tests__/diff/block-move.test.d.ts.map +1 -0
- package/dist/__tests__/diff/block-move.test.js +132 -0
- package/dist/__tests__/diff/block-move.test.js.map +1 -0
- package/dist/__tests__/diff/histogram.test.d.ts +8 -0
- package/dist/__tests__/diff/histogram.test.d.ts.map +1 -0
- package/dist/__tests__/diff/histogram.test.js +150 -0
- package/dist/__tests__/diff/histogram.test.js.map +1 -0
- package/dist/__tests__/diff/parity.test.d.ts +17 -0
- package/dist/__tests__/diff/parity.test.d.ts.map +1 -0
- package/dist/__tests__/diff/parity.test.js +149 -0
- package/dist/__tests__/diff/parity.test.js.map +1 -0
- package/dist/__tests__/diff.test.js +6 -2
- package/dist/__tests__/diff.test.js.map +1 -1
- package/dist/__tests__/format-profiles/integration.test.d.ts +7 -0
- package/dist/__tests__/format-profiles/integration.test.d.ts.map +1 -0
- package/dist/__tests__/format-profiles/integration.test.js +193 -0
- package/dist/__tests__/format-profiles/integration.test.js.map +1 -0
- package/dist/__tests__/format-profiles/json-patch.test.d.ts +12 -0
- package/dist/__tests__/format-profiles/json-patch.test.d.ts.map +1 -0
- package/dist/__tests__/format-profiles/json-patch.test.js +222 -0
- package/dist/__tests__/format-profiles/json-patch.test.js.map +1 -0
- package/dist/__tests__/format-profiles/registry.test.d.ts +5 -0
- package/dist/__tests__/format-profiles/registry.test.d.ts.map +1 -0
- package/dist/__tests__/format-profiles/registry.test.js +124 -0
- package/dist/__tests__/format-profiles/registry.test.js.map +1 -0
- package/dist/__tests__/patterns/make-score.test.d.ts +9 -0
- package/dist/__tests__/patterns/make-score.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/make-score.test.js +49 -0
- package/dist/__tests__/patterns/make-score.test.js.map +1 -0
- package/dist/diff/block-move.d.ts +53 -0
- package/dist/diff/block-move.d.ts.map +1 -0
- package/dist/diff/block-move.js +192 -0
- package/dist/diff/block-move.js.map +1 -0
- package/dist/diff/histogram.d.ts +45 -0
- package/dist/diff/histogram.d.ts.map +1 -0
- package/dist/diff/histogram.js +172 -0
- package/dist/diff/histogram.js.map +1 -0
- package/dist/diff/index.d.ts +30 -0
- package/dist/diff/index.d.ts.map +1 -0
- package/dist/diff/index.js +47 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/diff/lcs.d.ts +34 -0
- package/dist/diff/lcs.d.ts.map +1 -0
- package/dist/diff/lcs.js +184 -0
- package/dist/diff/lcs.js.map +1 -0
- package/dist/diff/shared.d.ts +54 -0
- package/dist/diff/shared.d.ts.map +1 -0
- package/dist/diff/shared.js +164 -0
- package/dist/diff/shared.js.map +1 -0
- package/dist/diff.d.ts +6 -65
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +6 -324
- package/dist/diff.js.map +1 -1
- package/dist/format-profiles/index.d.ts +34 -0
- package/dist/format-profiles/index.d.ts.map +1 -0
- package/dist/format-profiles/index.js +86 -0
- package/dist/format-profiles/index.js.map +1 -0
- package/dist/format-profiles/json-patch.d.ts +61 -0
- package/dist/format-profiles/json-patch.d.ts.map +1 -0
- package/dist/format-profiles/json-patch.js +269 -0
- package/dist/format-profiles/json-patch.js.map +1 -0
- package/dist/format-profiles/merge-strategies.d.ts +54 -0
- package/dist/format-profiles/merge-strategies.d.ts.map +1 -0
- package/dist/format-profiles/merge-strategies.js +156 -0
- package/dist/format-profiles/merge-strategies.js.map +1 -0
- package/dist/format-profiles/profiles/composer.d.ts +18 -0
- package/dist/format-profiles/profiles/composer.d.ts.map +1 -0
- package/dist/format-profiles/profiles/composer.js +45 -0
- package/dist/format-profiles/profiles/composer.js.map +1 -0
- package/dist/format-profiles/profiles/helm-values.d.ts +21 -0
- package/dist/format-profiles/profiles/helm-values.d.ts.map +1 -0
- package/dist/format-profiles/profiles/helm-values.js +40 -0
- package/dist/format-profiles/profiles/helm-values.js.map +1 -0
- package/dist/format-profiles/profiles/kubernetes.d.ts +22 -0
- package/dist/format-profiles/profiles/kubernetes.d.ts.map +1 -0
- package/dist/format-profiles/profiles/kubernetes.js +60 -0
- package/dist/format-profiles/profiles/kubernetes.js.map +1 -0
- package/dist/format-profiles/profiles/package-json.d.ts +18 -0
- package/dist/format-profiles/profiles/package-json.d.ts.map +1 -0
- package/dist/format-profiles/profiles/package-json.js +36 -0
- package/dist/format-profiles/profiles/package-json.js.map +1 -0
- package/dist/format-profiles/profiles/tsconfig.d.ts +21 -0
- package/dist/format-profiles/profiles/tsconfig.d.ts.map +1 -0
- package/dist/format-profiles/profiles/tsconfig.js +47 -0
- package/dist/format-profiles/profiles/tsconfig.js.map +1 -0
- package/dist/format-profiles/types.d.ts +67 -0
- package/dist/format-profiles/types.d.ts.map +1 -0
- package/dist/format-profiles/types.js +9 -0
- package/dist/format-profiles/types.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/patterns/insertion-at-boundary.d.ts.map +1 -1
- package/dist/patterns/insertion-at-boundary.js +15 -33
- package/dist/patterns/insertion-at-boundary.js.map +1 -1
- package/dist/patterns/utils.d.ts +11 -8
- package/dist/patterns/utils.d.ts.map +1 -1
- package/dist/patterns/utils.js +28 -10
- package/dist/patterns/utils.js.map +1 -1
- package/dist/resolver/format-dispatch.d.ts.map +1 -1
- package/dist/resolver/format-dispatch.js +3 -1
- package/dist/resolver/format-dispatch.js.map +1 -1
- package/dist/resolver/policy.d.ts.map +1 -1
- package/dist/resolver/policy.js +2 -0
- package/dist/resolver/policy.js.map +1 -1
- package/dist/resolvers/dispatcher.d.ts +5 -1
- package/dist/resolvers/dispatcher.d.ts.map +1 -1
- package/dist/resolvers/dispatcher.js +8 -3
- package/dist/resolvers/dispatcher.js.map +1 -1
- package/dist/resolvers/json.d.ts +11 -2
- package/dist/resolvers/json.d.ts.map +1 -1
- package/dist/resolvers/json.js +55 -7
- package/dist/resolvers/json.js.map +1 -1
- package/dist/resolvers/yaml.d.ts +8 -2
- package/dist/resolvers/yaml.d.ts.map +1 -1
- package/dist/resolvers/yaml.js +156 -2
- package/dist/resolvers/yaml.js.map +1 -1
- package/dist/types.d.ts +25 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests de `detectBlockMove` (v2.1).
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from "vitest";
|
|
5
|
+
import { detectBlockMove } from "../../diff/block-move.js";
|
|
6
|
+
describe("detectBlockMove — cas trivial", () => {
|
|
7
|
+
it("aucun déplacement → []", () => {
|
|
8
|
+
const base = ["a", "b", "c", "d", "e", "f", "g"];
|
|
9
|
+
const ours = ["a", "b", "c", "d", "e", "f", "g"];
|
|
10
|
+
const theirs = ["a", "b", "c", "d", "e", "f", "g"];
|
|
11
|
+
expect(detectBlockMove(base, ours, theirs)).toEqual([]);
|
|
12
|
+
});
|
|
13
|
+
it("entrées trop courtes (< windowSize) → []", () => {
|
|
14
|
+
const base = ["a", "b"];
|
|
15
|
+
const ours = ["a", "b"];
|
|
16
|
+
const theirs = ["a", "b"];
|
|
17
|
+
expect(detectBlockMove(base, ours, theirs)).toEqual([]);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
describe("detectBlockMove — bloc déplacé identique des deux côtés", () => {
|
|
21
|
+
it("détecte un bloc unique inséré dans ours et theirs aux mêmes lignes", () => {
|
|
22
|
+
const base = [
|
|
23
|
+
`import { a } from "./a";`,
|
|
24
|
+
`import { b } from "./b";`,
|
|
25
|
+
``,
|
|
26
|
+
`function main() { return a() + b(); }`,
|
|
27
|
+
];
|
|
28
|
+
const newBlock = [
|
|
29
|
+
`function helper(x: number): number {`,
|
|
30
|
+
` if (x < 0) throw new Error("negative");`,
|
|
31
|
+
` return Math.floor(x * 1.5);`,
|
|
32
|
+
`}`,
|
|
33
|
+
``,
|
|
34
|
+
];
|
|
35
|
+
const ours = [...base.slice(0, 2), ``, ...newBlock, ...base.slice(2)];
|
|
36
|
+
const theirs = [...base.slice(0, 2), ``, ...newBlock, ...base.slice(2)];
|
|
37
|
+
const moves = detectBlockMove(base, ours, theirs);
|
|
38
|
+
expect(moves.length).toBeGreaterThanOrEqual(1);
|
|
39
|
+
// Le bloc retrouvé doit contenir au moins une ligne caractéristique.
|
|
40
|
+
const flattened = moves.flatMap((m) => m.block).join("\n");
|
|
41
|
+
expect(flattened).toContain("function helper");
|
|
42
|
+
expect(flattened).toContain("Math.floor");
|
|
43
|
+
// basePos doit être null (le bloc n'existe pas dans base).
|
|
44
|
+
expect(moves.every((m) => m.basePos === null)).toBe(true);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe("detectBlockMove — anti-faux-positifs", () => {
|
|
48
|
+
it("ignore les blocs à très faible diversité de tokens", () => {
|
|
49
|
+
// Un bloc de 5 lignes de '}' (cas dégénéré, 1 seul token distinct).
|
|
50
|
+
// minTokenDiversity=4 doit le rejeter.
|
|
51
|
+
const trivialBlock = [`}`, `}`, `}`, `}`, `}`];
|
|
52
|
+
const base = [`const a = 1;`];
|
|
53
|
+
const ours = [...base, ...trivialBlock];
|
|
54
|
+
const theirs = [...base, ...trivialBlock];
|
|
55
|
+
const moves = detectBlockMove(base, ours, theirs);
|
|
56
|
+
expect(moves).toEqual([]);
|
|
57
|
+
});
|
|
58
|
+
it("résiste aux collisions de hash via confirmation littérale", () => {
|
|
59
|
+
// On ne peut pas garantir une collision, mais on peut vérifier que des
|
|
60
|
+
// contenus différents ne sont pas mergés.
|
|
61
|
+
const base = ["unrelated"];
|
|
62
|
+
const ours = ["aaa", "bbb", "ccc", "ddd", "eee"];
|
|
63
|
+
const theirs = ["xxx", "yyy", "zzz", "www", "vvv"];
|
|
64
|
+
expect(detectBlockMove(base, ours, theirs)).toEqual([]);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe("detectBlockMove — compaction des blocs adjacents", () => {
|
|
68
|
+
it("fusionne les fenêtres qui forment un bloc unique de longueur > W", () => {
|
|
69
|
+
// Bloc de 8 lignes commun à ours et theirs, mais avec un préambule
|
|
70
|
+
// *différent* de chaque côté pour ne pas contaminer le candidat avec des
|
|
71
|
+
// matches incidentels. Avec W=5 le bloc fait 4 fenêtres qui se
|
|
72
|
+
// chevauchent ; on attend la compaction en 1 seul MovedBlock de 8 lignes.
|
|
73
|
+
const newBlock = [
|
|
74
|
+
`class Cache<T> {`,
|
|
75
|
+
` private store: Map<string, T> = new Map();`,
|
|
76
|
+
` get(key: string): T | undefined { return this.store.get(key); }`,
|
|
77
|
+
` set(key: string, value: T): void { this.store.set(key, value); }`,
|
|
78
|
+
` delete(key: string): boolean { return this.store.delete(key); }`,
|
|
79
|
+
` clear(): void { this.store.clear(); }`,
|
|
80
|
+
` size(): number { return this.store.size; }`,
|
|
81
|
+
`}`,
|
|
82
|
+
];
|
|
83
|
+
const base = [`const cache = new Map();`, `// existing comment`];
|
|
84
|
+
// Préambules de longueur ≥ W et différents des deux côtés → aucun match
|
|
85
|
+
// avant le bloc.
|
|
86
|
+
const oursPrefix = [`// ours-only-1`, `// ours-only-2`, `// ours-only-3`, `// ours-only-4`, `// ours-only-5`];
|
|
87
|
+
const theirsPrefix = [`// theirs-only-1`, `// theirs-only-2`, `// theirs-only-3`, `// theirs-only-4`, `// theirs-only-5`];
|
|
88
|
+
const ours = [...oursPrefix, ...newBlock];
|
|
89
|
+
const theirs = [...theirsPrefix, ...newBlock];
|
|
90
|
+
const moves = detectBlockMove(base, ours, theirs);
|
|
91
|
+
expect(moves.length).toBe(1);
|
|
92
|
+
expect(moves[0].block.length).toBe(newBlock.length);
|
|
93
|
+
expect(moves[0].block[0]).toBe(`class Cache<T> {`);
|
|
94
|
+
expect(moves[0].block[moves[0].block.length - 1]).toBe(`}`);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe("detectBlockMove — bloc qui existait dans base et qu'on déplace", () => {
|
|
98
|
+
it("le bloc présent à un autre endroit de base est repéré comme déplacé", () => {
|
|
99
|
+
const block = [
|
|
100
|
+
`export interface Logger {`,
|
|
101
|
+
` info(msg: string): void;`,
|
|
102
|
+
` warn(msg: string): void;`,
|
|
103
|
+
` error(msg: string): void;`,
|
|
104
|
+
`}`,
|
|
105
|
+
];
|
|
106
|
+
// base : bloc en début, suivi d'autres lignes différentes des préambules
|
|
107
|
+
const base = [
|
|
108
|
+
...block,
|
|
109
|
+
``,
|
|
110
|
+
`const baseOnlyA = 1;`,
|
|
111
|
+
`const baseOnlyB = 2;`,
|
|
112
|
+
`const baseOnlyC = 3;`,
|
|
113
|
+
`const baseOnlyD = 4;`,
|
|
114
|
+
`const baseOnlyE = 5;`,
|
|
115
|
+
];
|
|
116
|
+
// ours : bloc déplacé en fin, préambule unique
|
|
117
|
+
const oursPrefix = [`// ours-1`, `// ours-2`, `// ours-3`, `// ours-4`, `// ours-5`];
|
|
118
|
+
const ours = [...oursPrefix, ``, ...block];
|
|
119
|
+
// theirs : préambule différent + même bloc déplacé
|
|
120
|
+
const theirsPrefix = [`// theirs-1`, `// theirs-2`, `// theirs-3`, `// theirs-4`, `// theirs-5`];
|
|
121
|
+
const theirs = [...theirsPrefix, ``, ...block];
|
|
122
|
+
const moves = detectBlockMove(base, ours, theirs);
|
|
123
|
+
expect(moves.length).toBeGreaterThanOrEqual(1);
|
|
124
|
+
// basePos doit être renseigné (le bloc existe aussi dans base) et
|
|
125
|
+
// distinct de oursPos / theirsPos.
|
|
126
|
+
const found = moves.find((m) => m.block.includes(`export interface Logger {`));
|
|
127
|
+
expect(found).toBeDefined();
|
|
128
|
+
expect(found.basePos).toBe(0);
|
|
129
|
+
expect(found.oursPos).toBeGreaterThan(0);
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
//# sourceMappingURL=block-move.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-move.test.js","sourceRoot":"","sources":["../../../src/__tests__/diff/block-move.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests directs de l'algorithme Histogram diff (v2.1).
|
|
3
|
+
*
|
|
4
|
+
* Vérifie le contrat de longueur (parité avec lcsLegacy), la validité des paires
|
|
5
|
+
* retournées, et les cas limites (récursion profonde, petits inputs, pas d'ancre).
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=histogram.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"histogram.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/diff/histogram.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests directs de l'algorithme Histogram diff (v2.1).
|
|
3
|
+
*
|
|
4
|
+
* Vérifie le contrat de longueur (parité avec lcsLegacy), la validité des paires
|
|
5
|
+
* retournées, et les cas limites (récursion profonde, petits inputs, pas d'ancre).
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect } from "vitest";
|
|
8
|
+
import { histogramDiff } from "../../diff/histogram.js";
|
|
9
|
+
import { lcsLegacy } from "../../diff/lcs.js";
|
|
10
|
+
/** Vérifie que les paires retournées sont valides et strictement croissantes. */
|
|
11
|
+
function expectValidLcsPairs(result, a, b) {
|
|
12
|
+
for (const [i, j] of result) {
|
|
13
|
+
expect(a[i]).toBe(b[j]);
|
|
14
|
+
}
|
|
15
|
+
for (let k = 1; k < result.length; k++) {
|
|
16
|
+
expect(result[k][0]).toBeGreaterThan(result[k - 1][0]);
|
|
17
|
+
expect(result[k][1]).toBeGreaterThan(result[k - 1][1]);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
describe("histogramDiff — cas triviaux", () => {
|
|
21
|
+
it("deux tableaux vides", () => {
|
|
22
|
+
expect(histogramDiff([], [])).toEqual([]);
|
|
23
|
+
});
|
|
24
|
+
it("un tableau vide", () => {
|
|
25
|
+
expect(histogramDiff(["a"], [])).toEqual([]);
|
|
26
|
+
expect(histogramDiff([], ["a"])).toEqual([]);
|
|
27
|
+
});
|
|
28
|
+
it("séquences identiques — toutes les lignes communes", () => {
|
|
29
|
+
const a = ["a", "b", "c"];
|
|
30
|
+
const result = histogramDiff(a, a);
|
|
31
|
+
expect(result.length).toBe(3);
|
|
32
|
+
expectValidLcsPairs(result, a, a);
|
|
33
|
+
});
|
|
34
|
+
it("aucune ligne commune", () => {
|
|
35
|
+
expect(histogramDiff(["a", "b"], ["c", "d"])).toEqual([]);
|
|
36
|
+
});
|
|
37
|
+
it("une seule ligne commune", () => {
|
|
38
|
+
const a = ["a", "b"];
|
|
39
|
+
const b = ["b"];
|
|
40
|
+
const result = histogramDiff(a, b);
|
|
41
|
+
expect(result.length).toBe(1);
|
|
42
|
+
expect(result[0]).toEqual([1, 0]);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe("histogramDiff — ancres rares", () => {
|
|
46
|
+
it("préfère l'ancre unique sur l'ancre fréquente", () => {
|
|
47
|
+
// 'unique' apparaît une seule fois des deux côtés ; 'common' apparaît 3×3.
|
|
48
|
+
// Histogram doit ancrer sur 'unique' en premier.
|
|
49
|
+
const a = ["common", "common", "unique", "common"];
|
|
50
|
+
const b = ["common", "unique", "common", "common"];
|
|
51
|
+
const result = histogramDiff(a, b);
|
|
52
|
+
// Doit contenir la paire [2, 1] (les deux 'unique')
|
|
53
|
+
expect(result.some(([i, j]) => i === 2 && j === 1)).toBe(true);
|
|
54
|
+
expectValidLcsPairs(result, a, b);
|
|
55
|
+
});
|
|
56
|
+
it("ABCBDAB vs BDCAB — longueur LCS = 4", () => {
|
|
57
|
+
const a = ["A", "B", "C", "B", "D", "A", "B"];
|
|
58
|
+
const b = ["B", "D", "C", "A", "B"];
|
|
59
|
+
const result = histogramDiff(a, b);
|
|
60
|
+
expect(result.length).toBe(4);
|
|
61
|
+
expectValidLcsPairs(result, a, b);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
describe("histogramDiff — fallback no-anchor", () => {
|
|
65
|
+
it("aucune ligne commune sur la sous-fenêtre → []", () => {
|
|
66
|
+
// Force à entrer dans diffWindow avec n>1, m>1 et 0 ancre.
|
|
67
|
+
const a = ["a1", "a2", "a3", "a4", "a5"];
|
|
68
|
+
const b = ["b1", "b2", "b3", "b4", "b5"];
|
|
69
|
+
expect(histogramDiff(a, b)).toEqual([]);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe("histogramDiff — petits inputs (court-circuit DP)", () => {
|
|
73
|
+
it("respecte le seuil smallInputThreshold (200 par défaut)", () => {
|
|
74
|
+
// 5×5 = 25 ≤ 200 → court-circuit sur lcsLegacy. Comportement observable
|
|
75
|
+
// identique au LCS legacy.
|
|
76
|
+
const a = ["a", "b", "c", "d", "e"];
|
|
77
|
+
const b = ["a", "x", "c", "y", "e"];
|
|
78
|
+
const histogram = histogramDiff(a, b);
|
|
79
|
+
const legacy = lcsLegacy(a, b);
|
|
80
|
+
expect(histogram).toEqual(legacy);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe("histogramDiff — récursion profonde", () => {
|
|
84
|
+
it("alternance dense de 200 lignes converge sans stack overflow", () => {
|
|
85
|
+
// 200 lignes alternées : tout le travail est dans la récursion.
|
|
86
|
+
const a = [];
|
|
87
|
+
const b = [];
|
|
88
|
+
for (let i = 0; i < 200; i++) {
|
|
89
|
+
a.push(`L${i}`);
|
|
90
|
+
b.push(i % 2 === 0 ? `L${i}` : `X${i}`);
|
|
91
|
+
}
|
|
92
|
+
const result = histogramDiff(a, b);
|
|
93
|
+
// Les 100 lignes paires sont communes
|
|
94
|
+
expect(result.length).toBe(100);
|
|
95
|
+
expectValidLcsPairs(result, a, b);
|
|
96
|
+
});
|
|
97
|
+
it("garde-fou maxDepth → fallback DP", () => {
|
|
98
|
+
const a = ["x", "a", "b", "c", "d", "y"];
|
|
99
|
+
const b = ["y", "a", "b", "c", "d", "x"];
|
|
100
|
+
// Avec maxDepth=0, on retombe immédiatement sur lcsLegacy.
|
|
101
|
+
const result = histogramDiff(a, b, { maxDepth: 0 });
|
|
102
|
+
const legacy = lcsLegacy(a, b);
|
|
103
|
+
expect(result.length).toBe(legacy.length);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe("histogramDiff — code source réaliste", () => {
|
|
107
|
+
it("imports + fonctions — typique TS", () => {
|
|
108
|
+
const a = [
|
|
109
|
+
`import { foo } from "./foo";`,
|
|
110
|
+
`import { bar } from "./bar";`,
|
|
111
|
+
``,
|
|
112
|
+
`export function handler(req: Request) {`,
|
|
113
|
+
` return foo(req);`,
|
|
114
|
+
`}`,
|
|
115
|
+
];
|
|
116
|
+
const b = [
|
|
117
|
+
`import { foo } from "./foo";`,
|
|
118
|
+
`import { baz } from "./baz";`,
|
|
119
|
+
`import { bar } from "./bar";`,
|
|
120
|
+
``,
|
|
121
|
+
`export function handler(req: Request) {`,
|
|
122
|
+
` return foo(req);`,
|
|
123
|
+
`}`,
|
|
124
|
+
];
|
|
125
|
+
const result = histogramDiff(a, b);
|
|
126
|
+
expect(result.length).toBe(6); // toutes sauf le nouvel import baz
|
|
127
|
+
expectValidLcsPairs(result, a, b);
|
|
128
|
+
});
|
|
129
|
+
it("réordonnancement de fonctions — parité LCS sur cas hostile", () => {
|
|
130
|
+
// Permutation pure : [alpha, '', beta] vs [beta, '', alpha]. Aucune
|
|
131
|
+
// sous-séquence commune de longueur > 1 ne respecte l'ordre des deux côtés
|
|
132
|
+
// (tout match étend forcément un début et un fin qui s'excluent). Histogram
|
|
133
|
+
// doit retourner exactement la même longueur que le LCS legacy — c'est le
|
|
134
|
+
// contrat de parité v2.1.
|
|
135
|
+
const a = [
|
|
136
|
+
`function alpha() { return 1; }`,
|
|
137
|
+
``,
|
|
138
|
+
`function beta() { return 2; }`,
|
|
139
|
+
];
|
|
140
|
+
const b = [
|
|
141
|
+
`function beta() { return 2; }`,
|
|
142
|
+
``,
|
|
143
|
+
`function alpha() { return 1; }`,
|
|
144
|
+
];
|
|
145
|
+
const result = histogramDiff(a, b);
|
|
146
|
+
expect(result.length).toBe(lcsLegacy(a, b).length);
|
|
147
|
+
expectValidLcsPairs(result, a, b);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
//# sourceMappingURL=histogram.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"histogram.test.js","sourceRoot":"","sources":["../../../src/__tests__/diff/histogram.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests de parité Histogram ↔ legacy (v2.1).
|
|
3
|
+
*
|
|
4
|
+
* Histogram est une **heuristique** : elle ne garantit pas la longueur de LCS
|
|
5
|
+
* optimale sur de l'input aléatoire avec un alphabet réduit (les ancres rares
|
|
6
|
+
* peuvent y être mal placées). En revanche, sur les patterns du code source
|
|
7
|
+
* (lignes uniques fréquentes), Histogram doit matcher la longueur du LCS legacy.
|
|
8
|
+
*
|
|
9
|
+
* Ce fichier vérifie :
|
|
10
|
+
* 1. Parité **stricte** sur les patterns réalistes (identité, insertion pure,
|
|
11
|
+
* suppression pure, refactor d'imports).
|
|
12
|
+
* 2. Parité **soft** sur l'aléatoire : Histogram peut être plus court que
|
|
13
|
+
* legacy, mais les paires retournées doivent rester valides et
|
|
14
|
+
* strictement croissantes (contrat de correctness, pas d'optimalité).
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=parity.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parity.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/diff/parity.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests de parité Histogram ↔ legacy (v2.1).
|
|
3
|
+
*
|
|
4
|
+
* Histogram est une **heuristique** : elle ne garantit pas la longueur de LCS
|
|
5
|
+
* optimale sur de l'input aléatoire avec un alphabet réduit (les ancres rares
|
|
6
|
+
* peuvent y être mal placées). En revanche, sur les patterns du code source
|
|
7
|
+
* (lignes uniques fréquentes), Histogram doit matcher la longueur du LCS legacy.
|
|
8
|
+
*
|
|
9
|
+
* Ce fichier vérifie :
|
|
10
|
+
* 1. Parité **stricte** sur les patterns réalistes (identité, insertion pure,
|
|
11
|
+
* suppression pure, refactor d'imports).
|
|
12
|
+
* 2. Parité **soft** sur l'aléatoire : Histogram peut être plus court que
|
|
13
|
+
* legacy, mais les paires retournées doivent rester valides et
|
|
14
|
+
* strictement croissantes (contrat de correctness, pas d'optimalité).
|
|
15
|
+
*/
|
|
16
|
+
import { describe, it, expect } from "vitest";
|
|
17
|
+
import { histogramDiff } from "../../diff/histogram.js";
|
|
18
|
+
import { lcsLegacy } from "../../diff/lcs.js";
|
|
19
|
+
/** PRNG déterministe (mulberry32). */
|
|
20
|
+
function mulberry32(seed) {
|
|
21
|
+
let t = seed;
|
|
22
|
+
return () => {
|
|
23
|
+
t = (t + 0x6d2b79f5) | 0;
|
|
24
|
+
let x = t;
|
|
25
|
+
x = Math.imul(x ^ (x >>> 15), x | 1);
|
|
26
|
+
x ^= x + Math.imul(x ^ (x >>> 7), x | 61);
|
|
27
|
+
return ((x ^ (x >>> 14)) >>> 0) / 4294967296;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function expectValidLcs(result, a, b) {
|
|
31
|
+
for (const [i, j] of result) {
|
|
32
|
+
expect(a[i]).toBe(b[j]);
|
|
33
|
+
}
|
|
34
|
+
for (let k = 1; k < result.length; k++) {
|
|
35
|
+
expect(result[k][0]).toBeGreaterThan(result[k - 1][0]);
|
|
36
|
+
expect(result[k][1]).toBeGreaterThan(result[k - 1][1]);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
describe("Parité — patterns réalistes", () => {
|
|
40
|
+
it("séquences identiques — parité longueur stricte", () => {
|
|
41
|
+
// 50 lignes uniques (typique d'un fichier source). Toute paire d'ancrage
|
|
42
|
+
// est unique-unique, donc Histogram trouve l'alignement optimal.
|
|
43
|
+
const a = Array.from({ length: 50 }, (_, i) => `line_${i}`);
|
|
44
|
+
expect(histogramDiff(a, a).length).toBe(lcsLegacy(a, a).length);
|
|
45
|
+
});
|
|
46
|
+
it("insertion pure au milieu", () => {
|
|
47
|
+
const a = Array.from({ length: 30 }, (_, i) => `line_${i}`);
|
|
48
|
+
const b = [...a.slice(0, 15), "INSERTED_X", "INSERTED_Y", ...a.slice(15)];
|
|
49
|
+
expect(histogramDiff(a, b).length).toBe(lcsLegacy(a, b).length);
|
|
50
|
+
});
|
|
51
|
+
it("suppression pure au milieu", () => {
|
|
52
|
+
const a = Array.from({ length: 30 }, (_, i) => `line_${i}`);
|
|
53
|
+
const b = [...a.slice(0, 10), ...a.slice(15)];
|
|
54
|
+
expect(histogramDiff(a, b).length).toBe(lcsLegacy(a, b).length);
|
|
55
|
+
});
|
|
56
|
+
it("refactor d'imports — typique TS", () => {
|
|
57
|
+
const a = [
|
|
58
|
+
`import { foo } from "./foo";`,
|
|
59
|
+
`import { bar } from "./bar";`,
|
|
60
|
+
``,
|
|
61
|
+
`export function handler() {`,
|
|
62
|
+
` return foo() + bar();`,
|
|
63
|
+
`}`,
|
|
64
|
+
];
|
|
65
|
+
const b = [
|
|
66
|
+
`import { bar } from "./bar";`,
|
|
67
|
+
`import { foo } from "./foo";`,
|
|
68
|
+
`import { baz } from "./baz";`,
|
|
69
|
+
``,
|
|
70
|
+
`export function handler() {`,
|
|
71
|
+
` return foo() + bar() + baz();`,
|
|
72
|
+
`}`,
|
|
73
|
+
];
|
|
74
|
+
expect(histogramDiff(a, b).length).toBe(lcsLegacy(a, b).length);
|
|
75
|
+
});
|
|
76
|
+
it("ajout d'une fonction à la fin", () => {
|
|
77
|
+
const a = [
|
|
78
|
+
`export function alpha() { return 1; }`,
|
|
79
|
+
``,
|
|
80
|
+
`export function beta() { return 2; }`,
|
|
81
|
+
];
|
|
82
|
+
const b = [
|
|
83
|
+
`export function alpha() { return 1; }`,
|
|
84
|
+
``,
|
|
85
|
+
`export function beta() { return 2; }`,
|
|
86
|
+
``,
|
|
87
|
+
`export function gamma() { return 3; }`,
|
|
88
|
+
];
|
|
89
|
+
expect(histogramDiff(a, b).length).toBe(lcsLegacy(a, b).length);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
describe("Parité — propriétés de correctness sur input aléatoire", () => {
|
|
93
|
+
it("200 paires — paires retournées toujours valides et croissantes", () => {
|
|
94
|
+
// Ne teste pas l'optimalité (Histogram est heuristique sur du bruit),
|
|
95
|
+
// mais la *correctness* : le résultat doit être un LCS valide même s'il
|
|
96
|
+
// n'est pas le plus long.
|
|
97
|
+
const rng = mulberry32(2026);
|
|
98
|
+
const alphabet = ["a", "b", "c", "d", "e", "f", "g", "h"];
|
|
99
|
+
for (let run = 0; run < 200; run++) {
|
|
100
|
+
const n = 3 + Math.floor(rng() * 30);
|
|
101
|
+
const m = 3 + Math.floor(rng() * 30);
|
|
102
|
+
const a = Array.from({ length: n }, () => alphabet[Math.floor(rng() * alphabet.length)]);
|
|
103
|
+
const b = Array.from({ length: m }, () => alphabet[Math.floor(rng() * alphabet.length)]);
|
|
104
|
+
const result = histogramDiff(a, b);
|
|
105
|
+
expectValidLcs(result, a, b);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
it("simulation de merge réaliste — parité stricte", () => {
|
|
109
|
+
// Modèle plus fidèle au cas "merge Git" : on part d'une base de lignes
|
|
110
|
+
// uniques, puis chaque branche applique des edits ponctuels (insertions,
|
|
111
|
+
// suppressions). C'est le régime où Histogram doit matcher LCS — l'analyse
|
|
112
|
+
// ConGra montre que le gain visible vs LCS est ailleurs (qualité du diff,
|
|
113
|
+
// pas longueur), mais la longueur reste préservée.
|
|
114
|
+
const rng = mulberry32(7);
|
|
115
|
+
let mismatches = 0;
|
|
116
|
+
for (let run = 0; run < 50; run++) {
|
|
117
|
+
const baseLen = 30 + Math.floor(rng() * 30);
|
|
118
|
+
const base = Array.from({ length: baseLen }, (_, i) => `base_line_${i}`);
|
|
119
|
+
// ours : 90 % de lignes de base + quelques insertions/edits
|
|
120
|
+
const ours = [];
|
|
121
|
+
for (let i = 0; i < base.length; i++) {
|
|
122
|
+
if (rng() < 0.1)
|
|
123
|
+
continue; // skip (suppression)
|
|
124
|
+
ours.push(base[i]);
|
|
125
|
+
if (rng() < 0.05)
|
|
126
|
+
ours.push(`ours_added_${i}`); // insertion
|
|
127
|
+
}
|
|
128
|
+
// theirs : 90 % de lignes de base + d'autres edits
|
|
129
|
+
const theirs = [];
|
|
130
|
+
for (let i = 0; i < base.length; i++) {
|
|
131
|
+
if (rng() < 0.1)
|
|
132
|
+
continue;
|
|
133
|
+
theirs.push(base[i]);
|
|
134
|
+
if (rng() < 0.05)
|
|
135
|
+
theirs.push(`theirs_added_${i}`);
|
|
136
|
+
}
|
|
137
|
+
const histo = histogramDiff(ours, theirs);
|
|
138
|
+
const legacy = lcsLegacy(ours, theirs);
|
|
139
|
+
if (histo.length !== legacy.length)
|
|
140
|
+
mismatches++;
|
|
141
|
+
expectValidLcs(histo, ours, theirs);
|
|
142
|
+
}
|
|
143
|
+
// Tolérance : 0 mismatch attendu — sur du « code-like » réaliste avec des
|
|
144
|
+
// lignes uniques de chaque côté, Histogram doit toujours retrouver le LCS
|
|
145
|
+
// optimal grâce à l'extension forward/backward des ancres.
|
|
146
|
+
expect(mismatches).toBe(0);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=parity.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parity.test.js","sourceRoot":"","sources":["../../../src/__tests__/diff/parity.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* qui reposent indirectement sur l'ordre des edits dérivés.
|
|
8
8
|
*/
|
|
9
9
|
import { describe, it, expect } from "vitest";
|
|
10
|
-
import { lcs, computeDiff, _lcsHirschberg } from "../diff.js";
|
|
10
|
+
import { lcs, computeDiff, _lcsHirschberg, lcsLegacy } from "../diff.js";
|
|
11
11
|
describe("lcs — cas triviaux", () => {
|
|
12
12
|
it("deux tableaux vides", () => {
|
|
13
13
|
expect(lcs([], [])).toEqual([]);
|
|
@@ -147,6 +147,10 @@ describe("lcs — Hirschberg (P2.1)", () => {
|
|
|
147
147
|
});
|
|
148
148
|
it("Hirschberg et DP plein produisent la même longueur sur des inputs aléatoires", () => {
|
|
149
149
|
// Stress test : 20 runs sur des inputs pseudo-aléatoires reproductibles.
|
|
150
|
+
// v2.1 : on compare `lcsLegacy` (DP plein) à `_lcsHirschberg` directement —
|
|
151
|
+
// `lcs()` route désormais vers Histogram, qui est une heuristique et
|
|
152
|
+
// n'est pas garantie produire un LCS de longueur optimale sur de l'input
|
|
153
|
+
// aléatoire (la parité tient sur le code source, pas sur du bruit).
|
|
150
154
|
const rng = mulberry32(42);
|
|
151
155
|
for (let run = 0; run < 20; run++) {
|
|
152
156
|
const n = 5 + Math.floor(rng() * 20);
|
|
@@ -154,7 +158,7 @@ describe("lcs — Hirschberg (P2.1)", () => {
|
|
|
154
158
|
const alphabet = ["a", "b", "c", "d", "e"];
|
|
155
159
|
const a = Array.from({ length: n }, () => alphabet[Math.floor(rng() * alphabet.length)]);
|
|
156
160
|
const b = Array.from({ length: m }, () => alphabet[Math.floor(rng() * alphabet.length)]);
|
|
157
|
-
const dense =
|
|
161
|
+
const dense = lcsLegacy(a, b);
|
|
158
162
|
const hirsch = _lcsHirschberg(a, b);
|
|
159
163
|
expect(hirsch.length).toBe(dense.length);
|
|
160
164
|
// Validité des paires
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.test.js","sourceRoot":"","sources":["../../src/__tests__/diff.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"diff.test.js","sourceRoot":"","sources":["../../src/__tests__/diff.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/format-profiles/integration.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|