@gitwand/core 2.0.0 → 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.
Files changed (128) hide show
  1. package/README.md +58 -0
  2. package/dist/__tests__/bench.bench.js +39 -0
  3. package/dist/__tests__/bench.bench.js.map +1 -1
  4. package/dist/__tests__/corpus.d.ts.map +1 -1
  5. package/dist/__tests__/corpus.js +363 -0
  6. package/dist/__tests__/corpus.js.map +1 -1
  7. package/dist/__tests__/diff/block-move.test.d.ts +5 -0
  8. package/dist/__tests__/diff/block-move.test.d.ts.map +1 -0
  9. package/dist/__tests__/diff/block-move.test.js +132 -0
  10. package/dist/__tests__/diff/block-move.test.js.map +1 -0
  11. package/dist/__tests__/diff/histogram.test.d.ts +8 -0
  12. package/dist/__tests__/diff/histogram.test.d.ts.map +1 -0
  13. package/dist/__tests__/diff/histogram.test.js +150 -0
  14. package/dist/__tests__/diff/histogram.test.js.map +1 -0
  15. package/dist/__tests__/diff/parity.test.d.ts +17 -0
  16. package/dist/__tests__/diff/parity.test.d.ts.map +1 -0
  17. package/dist/__tests__/diff/parity.test.js +149 -0
  18. package/dist/__tests__/diff/parity.test.js.map +1 -0
  19. package/dist/__tests__/diff.test.js +6 -2
  20. package/dist/__tests__/diff.test.js.map +1 -1
  21. package/dist/__tests__/format-profiles/integration.test.d.ts +7 -0
  22. package/dist/__tests__/format-profiles/integration.test.d.ts.map +1 -0
  23. package/dist/__tests__/format-profiles/integration.test.js +193 -0
  24. package/dist/__tests__/format-profiles/integration.test.js.map +1 -0
  25. package/dist/__tests__/format-profiles/json-patch.test.d.ts +12 -0
  26. package/dist/__tests__/format-profiles/json-patch.test.d.ts.map +1 -0
  27. package/dist/__tests__/format-profiles/json-patch.test.js +222 -0
  28. package/dist/__tests__/format-profiles/json-patch.test.js.map +1 -0
  29. package/dist/__tests__/format-profiles/registry.test.d.ts +5 -0
  30. package/dist/__tests__/format-profiles/registry.test.d.ts.map +1 -0
  31. package/dist/__tests__/format-profiles/registry.test.js +124 -0
  32. package/dist/__tests__/format-profiles/registry.test.js.map +1 -0
  33. package/dist/__tests__/patterns/make-score.test.d.ts +9 -0
  34. package/dist/__tests__/patterns/make-score.test.d.ts.map +1 -0
  35. package/dist/__tests__/patterns/make-score.test.js +49 -0
  36. package/dist/__tests__/patterns/make-score.test.js.map +1 -0
  37. package/dist/diff/block-move.d.ts +53 -0
  38. package/dist/diff/block-move.d.ts.map +1 -0
  39. package/dist/diff/block-move.js +192 -0
  40. package/dist/diff/block-move.js.map +1 -0
  41. package/dist/diff/histogram.d.ts +45 -0
  42. package/dist/diff/histogram.d.ts.map +1 -0
  43. package/dist/diff/histogram.js +172 -0
  44. package/dist/diff/histogram.js.map +1 -0
  45. package/dist/diff/index.d.ts +30 -0
  46. package/dist/diff/index.d.ts.map +1 -0
  47. package/dist/diff/index.js +47 -0
  48. package/dist/diff/index.js.map +1 -0
  49. package/dist/diff/lcs.d.ts +34 -0
  50. package/dist/diff/lcs.d.ts.map +1 -0
  51. package/dist/diff/lcs.js +184 -0
  52. package/dist/diff/lcs.js.map +1 -0
  53. package/dist/diff/shared.d.ts +54 -0
  54. package/dist/diff/shared.d.ts.map +1 -0
  55. package/dist/diff/shared.js +164 -0
  56. package/dist/diff/shared.js.map +1 -0
  57. package/dist/diff.d.ts +6 -65
  58. package/dist/diff.d.ts.map +1 -1
  59. package/dist/diff.js +6 -324
  60. package/dist/diff.js.map +1 -1
  61. package/dist/format-profiles/index.d.ts +34 -0
  62. package/dist/format-profiles/index.d.ts.map +1 -0
  63. package/dist/format-profiles/index.js +86 -0
  64. package/dist/format-profiles/index.js.map +1 -0
  65. package/dist/format-profiles/json-patch.d.ts +61 -0
  66. package/dist/format-profiles/json-patch.d.ts.map +1 -0
  67. package/dist/format-profiles/json-patch.js +269 -0
  68. package/dist/format-profiles/json-patch.js.map +1 -0
  69. package/dist/format-profiles/merge-strategies.d.ts +54 -0
  70. package/dist/format-profiles/merge-strategies.d.ts.map +1 -0
  71. package/dist/format-profiles/merge-strategies.js +156 -0
  72. package/dist/format-profiles/merge-strategies.js.map +1 -0
  73. package/dist/format-profiles/profiles/composer.d.ts +18 -0
  74. package/dist/format-profiles/profiles/composer.d.ts.map +1 -0
  75. package/dist/format-profiles/profiles/composer.js +45 -0
  76. package/dist/format-profiles/profiles/composer.js.map +1 -0
  77. package/dist/format-profiles/profiles/helm-values.d.ts +21 -0
  78. package/dist/format-profiles/profiles/helm-values.d.ts.map +1 -0
  79. package/dist/format-profiles/profiles/helm-values.js +40 -0
  80. package/dist/format-profiles/profiles/helm-values.js.map +1 -0
  81. package/dist/format-profiles/profiles/kubernetes.d.ts +22 -0
  82. package/dist/format-profiles/profiles/kubernetes.d.ts.map +1 -0
  83. package/dist/format-profiles/profiles/kubernetes.js +60 -0
  84. package/dist/format-profiles/profiles/kubernetes.js.map +1 -0
  85. package/dist/format-profiles/profiles/package-json.d.ts +18 -0
  86. package/dist/format-profiles/profiles/package-json.d.ts.map +1 -0
  87. package/dist/format-profiles/profiles/package-json.js +36 -0
  88. package/dist/format-profiles/profiles/package-json.js.map +1 -0
  89. package/dist/format-profiles/profiles/tsconfig.d.ts +21 -0
  90. package/dist/format-profiles/profiles/tsconfig.d.ts.map +1 -0
  91. package/dist/format-profiles/profiles/tsconfig.js +47 -0
  92. package/dist/format-profiles/profiles/tsconfig.js.map +1 -0
  93. package/dist/format-profiles/types.d.ts +67 -0
  94. package/dist/format-profiles/types.d.ts.map +1 -0
  95. package/dist/format-profiles/types.js +9 -0
  96. package/dist/format-profiles/types.js.map +1 -0
  97. package/dist/index.d.ts +4 -0
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +5 -0
  100. package/dist/index.js.map +1 -1
  101. package/dist/patterns/insertion-at-boundary.d.ts.map +1 -1
  102. package/dist/patterns/insertion-at-boundary.js +15 -33
  103. package/dist/patterns/insertion-at-boundary.js.map +1 -1
  104. package/dist/patterns/utils.d.ts +11 -8
  105. package/dist/patterns/utils.d.ts.map +1 -1
  106. package/dist/patterns/utils.js +28 -10
  107. package/dist/patterns/utils.js.map +1 -1
  108. package/dist/resolver/format-dispatch.d.ts.map +1 -1
  109. package/dist/resolver/format-dispatch.js +3 -1
  110. package/dist/resolver/format-dispatch.js.map +1 -1
  111. package/dist/resolver/policy.d.ts.map +1 -1
  112. package/dist/resolver/policy.js +2 -0
  113. package/dist/resolver/policy.js.map +1 -1
  114. package/dist/resolvers/dispatcher.d.ts +5 -1
  115. package/dist/resolvers/dispatcher.d.ts.map +1 -1
  116. package/dist/resolvers/dispatcher.js +8 -3
  117. package/dist/resolvers/dispatcher.js.map +1 -1
  118. package/dist/resolvers/json.d.ts +11 -2
  119. package/dist/resolvers/json.d.ts.map +1 -1
  120. package/dist/resolvers/json.js +55 -7
  121. package/dist/resolvers/json.js.map +1 -1
  122. package/dist/resolvers/yaml.d.ts +8 -2
  123. package/dist/resolvers/yaml.d.ts.map +1 -1
  124. package/dist/resolvers/yaml.js +156 -2
  125. package/dist/resolvers/yaml.js.map +1 -1
  126. package/dist/types.d.ts +25 -0
  127. package/dist/types.d.ts.map +1 -1
  128. 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 = lcs(a, b);
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":"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"}
1
+ {"version":3,"file":"diff.test.js","sourceRoot":"","sources":["../../src/__tests__/diff.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Tests d'intégration v2.2 — vérifie que le hook profil dans
3
+ * `tryResolveJsonConflict` débloque les cas qui retombaient en fallback
4
+ * textuel en v2.1.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/format-profiles/integration.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}