@gitwand/core 1.6.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 (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +52 -0
  3. package/dist/__tests__/bench.bench.d.ts +14 -0
  4. package/dist/__tests__/bench.bench.d.ts.map +1 -0
  5. package/dist/__tests__/bench.bench.js +137 -0
  6. package/dist/__tests__/bench.bench.js.map +1 -0
  7. package/dist/__tests__/confidence-v14.test.d.ts +13 -0
  8. package/dist/__tests__/confidence-v14.test.d.ts.map +1 -0
  9. package/dist/__tests__/confidence-v14.test.js +284 -0
  10. package/dist/__tests__/confidence-v14.test.js.map +1 -0
  11. package/dist/__tests__/config.test.d.ts +2 -0
  12. package/dist/__tests__/config.test.d.ts.map +1 -0
  13. package/dist/__tests__/config.test.js +317 -0
  14. package/dist/__tests__/config.test.js.map +1 -0
  15. package/dist/__tests__/corpus.d.ts +36 -0
  16. package/dist/__tests__/corpus.d.ts.map +1 -0
  17. package/dist/__tests__/corpus.js +541 -0
  18. package/dist/__tests__/corpus.js.map +1 -0
  19. package/dist/__tests__/corpus.test.d.ts +17 -0
  20. package/dist/__tests__/corpus.test.d.ts.map +1 -0
  21. package/dist/__tests__/corpus.test.js +179 -0
  22. package/dist/__tests__/corpus.test.js.map +1 -0
  23. package/dist/__tests__/diff.test.d.ts +10 -0
  24. package/dist/__tests__/diff.test.d.ts.map +1 -0
  25. package/dist/__tests__/diff.test.js +178 -0
  26. package/dist/__tests__/diff.test.js.map +1 -0
  27. package/dist/__tests__/format-resolvers.test.d.ts +2 -0
  28. package/dist/__tests__/format-resolvers.test.d.ts.map +1 -0
  29. package/dist/__tests__/format-resolvers.test.js +577 -0
  30. package/dist/__tests__/format-resolvers.test.js.map +1 -0
  31. package/dist/__tests__/imports-extended.test.d.ts +2 -0
  32. package/dist/__tests__/imports-extended.test.d.ts.map +1 -0
  33. package/dist/__tests__/imports-extended.test.js +94 -0
  34. package/dist/__tests__/imports-extended.test.js.map +1 -0
  35. package/dist/__tests__/lockfile-resolvers.test.d.ts +2 -0
  36. package/dist/__tests__/lockfile-resolvers.test.d.ts.map +1 -0
  37. package/dist/__tests__/lockfile-resolvers.test.js +200 -0
  38. package/dist/__tests__/lockfile-resolvers.test.js.map +1 -0
  39. package/dist/__tests__/patterns/insertion-at-boundary.test.d.ts +10 -0
  40. package/dist/__tests__/patterns/insertion-at-boundary.test.d.ts.map +1 -0
  41. package/dist/__tests__/patterns/insertion-at-boundary.test.js +185 -0
  42. package/dist/__tests__/patterns/insertion-at-boundary.test.js.map +1 -0
  43. package/dist/__tests__/patterns/reorder-only.test.d.ts +10 -0
  44. package/dist/__tests__/patterns/reorder-only.test.d.ts.map +1 -0
  45. package/dist/__tests__/patterns/reorder-only.test.js +181 -0
  46. package/dist/__tests__/patterns/reorder-only.test.js.map +1 -0
  47. package/dist/__tests__/phase-7-2-3b.test.d.ts +6 -0
  48. package/dist/__tests__/phase-7-2-3b.test.d.ts.map +1 -0
  49. package/dist/__tests__/phase-7-2-3b.test.js +730 -0
  50. package/dist/__tests__/phase-7-2-3b.test.js.map +1 -0
  51. package/dist/__tests__/resolver.test.d.ts +2 -0
  52. package/dist/__tests__/resolver.test.d.ts.map +1 -0
  53. package/dist/__tests__/resolver.test.js +927 -0
  54. package/dist/__tests__/resolver.test.js.map +1 -0
  55. package/dist/__tests__/resolvers/cargo.test.d.ts +10 -0
  56. package/dist/__tests__/resolvers/cargo.test.d.ts.map +1 -0
  57. package/dist/__tests__/resolvers/cargo.test.js +158 -0
  58. package/dist/__tests__/resolvers/cargo.test.js.map +1 -0
  59. package/dist/__tests__/resolvers/dockerfile.test.d.ts +8 -0
  60. package/dist/__tests__/resolvers/dockerfile.test.d.ts.map +1 -0
  61. package/dist/__tests__/resolvers/dockerfile.test.js +120 -0
  62. package/dist/__tests__/resolvers/dockerfile.test.js.map +1 -0
  63. package/dist/__tests__/resolvers/dotenv.test.d.ts +9 -0
  64. package/dist/__tests__/resolvers/dotenv.test.d.ts.map +1 -0
  65. package/dist/__tests__/resolvers/dotenv.test.js +113 -0
  66. package/dist/__tests__/resolvers/dotenv.test.js.map +1 -0
  67. package/dist/__tests__/resolvers/improvements-v14.test.d.ts +8 -0
  68. package/dist/__tests__/resolvers/improvements-v14.test.d.ts.map +1 -0
  69. package/dist/__tests__/resolvers/improvements-v14.test.js +306 -0
  70. package/dist/__tests__/resolvers/improvements-v14.test.js.map +1 -0
  71. package/dist/__tests__/validation.test.d.ts +12 -0
  72. package/dist/__tests__/validation.test.d.ts.map +1 -0
  73. package/dist/__tests__/validation.test.js +136 -0
  74. package/dist/__tests__/validation.test.js.map +1 -0
  75. package/dist/classifier.d.ts +21 -0
  76. package/dist/classifier.d.ts.map +1 -0
  77. package/dist/classifier.js +127 -0
  78. package/dist/classifier.js.map +1 -0
  79. package/dist/config.d.ts +108 -0
  80. package/dist/config.d.ts.map +1 -0
  81. package/dist/config.js +200 -0
  82. package/dist/config.js.map +1 -0
  83. package/dist/diff.d.ts +69 -0
  84. package/dist/diff.d.ts.map +1 -0
  85. package/dist/diff.js +328 -0
  86. package/dist/diff.js.map +1 -0
  87. package/dist/index.d.ts +47 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +38 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/parser.d.ts +39 -0
  92. package/dist/parser.d.ts.map +1 -0
  93. package/dist/parser.js +164 -0
  94. package/dist/parser.js.map +1 -0
  95. package/dist/patterns/complex.d.ts +5 -0
  96. package/dist/patterns/complex.d.ts.map +1 -0
  97. package/dist/patterns/complex.js +27 -0
  98. package/dist/patterns/complex.js.map +1 -0
  99. package/dist/patterns/delete-no-change.d.ts +4 -0
  100. package/dist/patterns/delete-no-change.d.ts.map +1 -0
  101. package/dist/patterns/delete-no-change.js +75 -0
  102. package/dist/patterns/delete-no-change.js.map +1 -0
  103. package/dist/patterns/insertion-at-boundary.d.ts +22 -0
  104. package/dist/patterns/insertion-at-boundary.d.ts.map +1 -0
  105. package/dist/patterns/insertion-at-boundary.js +164 -0
  106. package/dist/patterns/insertion-at-boundary.js.map +1 -0
  107. package/dist/patterns/non-overlapping.d.ts +4 -0
  108. package/dist/patterns/non-overlapping.d.ts.map +1 -0
  109. package/dist/patterns/non-overlapping.js +28 -0
  110. package/dist/patterns/non-overlapping.js.map +1 -0
  111. package/dist/patterns/one-side-change.d.ts +4 -0
  112. package/dist/patterns/one-side-change.d.ts.map +1 -0
  113. package/dist/patterns/one-side-change.js +45 -0
  114. package/dist/patterns/one-side-change.js.map +1 -0
  115. package/dist/patterns/reorder-only.d.ts +14 -0
  116. package/dist/patterns/reorder-only.d.ts.map +1 -0
  117. package/dist/patterns/reorder-only.js +81 -0
  118. package/dist/patterns/reorder-only.js.map +1 -0
  119. package/dist/patterns/same-change.d.ts +4 -0
  120. package/dist/patterns/same-change.d.ts.map +1 -0
  121. package/dist/patterns/same-change.js +25 -0
  122. package/dist/patterns/same-change.js.map +1 -0
  123. package/dist/patterns/utils.d.ts +70 -0
  124. package/dist/patterns/utils.d.ts.map +1 -0
  125. package/dist/patterns/utils.js +206 -0
  126. package/dist/patterns/utils.js.map +1 -0
  127. package/dist/patterns/value-only-change.d.ts +4 -0
  128. package/dist/patterns/value-only-change.d.ts.map +1 -0
  129. package/dist/patterns/value-only-change.js +34 -0
  130. package/dist/patterns/value-only-change.js.map +1 -0
  131. package/dist/patterns/whitespace-only.d.ts +4 -0
  132. package/dist/patterns/whitespace-only.d.ts.map +1 -0
  133. package/dist/patterns/whitespace-only.js +32 -0
  134. package/dist/patterns/whitespace-only.js.map +1 -0
  135. package/dist/resolver/assemble.d.ts +25 -0
  136. package/dist/resolver/assemble.d.ts.map +1 -0
  137. package/dist/resolver/assemble.js +170 -0
  138. package/dist/resolver/assemble.js.map +1 -0
  139. package/dist/resolver/format-dispatch.d.ts +40 -0
  140. package/dist/resolver/format-dispatch.d.ts.map +1 -0
  141. package/dist/resolver/format-dispatch.js +51 -0
  142. package/dist/resolver/format-dispatch.js.map +1 -0
  143. package/dist/resolver/generated-detection.d.ts +48 -0
  144. package/dist/resolver/generated-detection.d.ts.map +1 -0
  145. package/dist/resolver/generated-detection.js +123 -0
  146. package/dist/resolver/generated-detection.js.map +1 -0
  147. package/dist/resolver/index.d.ts +26 -0
  148. package/dist/resolver/index.d.ts.map +1 -0
  149. package/dist/resolver/index.js +147 -0
  150. package/dist/resolver/index.js.map +1 -0
  151. package/dist/resolver/policy.d.ts +53 -0
  152. package/dist/resolver/policy.d.ts.map +1 -0
  153. package/dist/resolver/policy.js +99 -0
  154. package/dist/resolver/policy.js.map +1 -0
  155. package/dist/resolver/validation.d.ts +28 -0
  156. package/dist/resolver/validation.d.ts.map +1 -0
  157. package/dist/resolver/validation.js +96 -0
  158. package/dist/resolver/validation.js.map +1 -0
  159. package/dist/resolver.d.ts +18 -0
  160. package/dist/resolver.d.ts.map +1 -0
  161. package/dist/resolver.js +18 -0
  162. package/dist/resolver.js.map +1 -0
  163. package/dist/resolvers/cargo.d.ts +34 -0
  164. package/dist/resolvers/cargo.d.ts.map +1 -0
  165. package/dist/resolvers/cargo.js +262 -0
  166. package/dist/resolvers/cargo.js.map +1 -0
  167. package/dist/resolvers/css.d.ts +60 -0
  168. package/dist/resolvers/css.d.ts.map +1 -0
  169. package/dist/resolvers/css.js +531 -0
  170. package/dist/resolvers/css.js.map +1 -0
  171. package/dist/resolvers/dispatcher.d.ts +78 -0
  172. package/dist/resolvers/dispatcher.d.ts.map +1 -0
  173. package/dist/resolvers/dispatcher.js +290 -0
  174. package/dist/resolvers/dispatcher.js.map +1 -0
  175. package/dist/resolvers/dockerfile.d.ts +24 -0
  176. package/dist/resolvers/dockerfile.d.ts.map +1 -0
  177. package/dist/resolvers/dockerfile.js +221 -0
  178. package/dist/resolvers/dockerfile.js.map +1 -0
  179. package/dist/resolvers/dotenv.d.ts +27 -0
  180. package/dist/resolvers/dotenv.d.ts.map +1 -0
  181. package/dist/resolvers/dotenv.js +114 -0
  182. package/dist/resolvers/dotenv.js.map +1 -0
  183. package/dist/resolvers/imports.d.ts +63 -0
  184. package/dist/resolvers/imports.d.ts.map +1 -0
  185. package/dist/resolvers/imports.js +513 -0
  186. package/dist/resolvers/imports.js.map +1 -0
  187. package/dist/resolvers/json.d.ts +48 -0
  188. package/dist/resolvers/json.d.ts.map +1 -0
  189. package/dist/resolvers/json.js +363 -0
  190. package/dist/resolvers/json.js.map +1 -0
  191. package/dist/resolvers/lockfile-npm.d.ts +38 -0
  192. package/dist/resolvers/lockfile-npm.d.ts.map +1 -0
  193. package/dist/resolvers/lockfile-npm.js +267 -0
  194. package/dist/resolvers/lockfile-npm.js.map +1 -0
  195. package/dist/resolvers/lockfile-pnpm.d.ts +44 -0
  196. package/dist/resolvers/lockfile-pnpm.d.ts.map +1 -0
  197. package/dist/resolvers/lockfile-pnpm.js +277 -0
  198. package/dist/resolvers/lockfile-pnpm.js.map +1 -0
  199. package/dist/resolvers/lockfile-yarn.d.ts +40 -0
  200. package/dist/resolvers/lockfile-yarn.d.ts.map +1 -0
  201. package/dist/resolvers/lockfile-yarn.js +184 -0
  202. package/dist/resolvers/lockfile-yarn.js.map +1 -0
  203. package/dist/resolvers/markdown.d.ts +64 -0
  204. package/dist/resolvers/markdown.d.ts.map +1 -0
  205. package/dist/resolvers/markdown.js +335 -0
  206. package/dist/resolvers/markdown.js.map +1 -0
  207. package/dist/resolvers/vue.d.ts +65 -0
  208. package/dist/resolvers/vue.d.ts.map +1 -0
  209. package/dist/resolvers/vue.js +258 -0
  210. package/dist/resolvers/vue.js.map +1 -0
  211. package/dist/resolvers/yaml.d.ts +65 -0
  212. package/dist/resolvers/yaml.d.ts.map +1 -0
  213. package/dist/resolvers/yaml.js +405 -0
  214. package/dist/resolvers/yaml.js.map +1 -0
  215. package/dist/types.d.ts +256 -0
  216. package/dist/types.d.ts.map +1 -0
  217. package/dist/types.js +8 -0
  218. package/dist/types.js.map +1 -0
  219. package/package.json +57 -0
@@ -0,0 +1,179 @@
1
+ /**
2
+ * GitWand — Tests sur le corpus de référence (Phase 7.5)
3
+ *
4
+ * Ce fichier sert à la fois de suite de régression (chaque fixture doit
5
+ * continuer à produire le résultat attendu) et de générateur de métriques
6
+ * (taux de résolution par type, par catégorie, faux positifs / négatifs).
7
+ *
8
+ * ## Métriques produites
9
+ *
10
+ * - Taux global d'auto-résolution
11
+ * - Taux par ConflictType
12
+ * - Faux positifs : fixture avec expectedResolved=false mais résolue
13
+ * - Faux négatifs : fixture avec expectedResolved=true mais non résolue
14
+ * - Score de confiance moyen par type
15
+ */
16
+ import { describe, it, expect, afterAll } from "vitest";
17
+ import { resolve } from "../resolver.js";
18
+ import { CORPUS_CATEGORIES } from "./corpus.js";
19
+ function runFixture(f) {
20
+ const result = resolve(f.input, f.filePath, f.options ?? {});
21
+ const actualType = result.hunks[0]?.type;
22
+ const actualResolved = result.stats.autoResolved > 0;
23
+ const actualScore = result.hunks[0]?.confidence.score;
24
+ const typeMatch = actualType === f.expectedType;
25
+ const resolvedMatch = actualResolved === f.expectedResolved;
26
+ let outputMatch = null;
27
+ if (f.expectedOutput !== undefined && f.expectedOutput !== null) {
28
+ outputMatch = result.mergedContent === f.expectedOutput;
29
+ }
30
+ else if (f.expectedOutput === null) {
31
+ outputMatch = result.mergedContent === null;
32
+ }
33
+ const falsePositive = !f.expectedResolved && actualResolved;
34
+ const falseNegative = f.expectedResolved && !actualResolved;
35
+ return {
36
+ fixture: f,
37
+ actualType,
38
+ actualResolved,
39
+ actualScore,
40
+ typeMatch,
41
+ resolvedMatch,
42
+ outputMatch,
43
+ falsePositive,
44
+ falseNegative,
45
+ };
46
+ }
47
+ // ─── Collecte globale pour les métriques ──────────────────
48
+ const allResults = [];
49
+ // ─── Tests par fixture ────────────────────────────────────
50
+ describe("Corpus de référence — régression (Phase 7.5)", () => {
51
+ describe("Trivial", () => {
52
+ for (const fixture of CORPUS_CATEGORIES.trivial) {
53
+ it(`${fixture.id}: ${fixture.description}`, () => {
54
+ const r = runFixture(fixture);
55
+ allResults.push(r);
56
+ expect(r.actualType).toBe(fixture.expectedType);
57
+ expect(r.actualResolved).toBe(fixture.expectedResolved);
58
+ if (r.outputMatch !== null) {
59
+ expect(r.outputMatch).toBe(true);
60
+ }
61
+ // Pas de faux positif toléré dans les cas triviaux
62
+ expect(r.falsePositive).toBe(false);
63
+ });
64
+ }
65
+ });
66
+ describe("Structural", () => {
67
+ for (const fixture of CORPUS_CATEGORIES.structural) {
68
+ it(`${fixture.id}: ${fixture.description}`, () => {
69
+ const r = runFixture(fixture);
70
+ allResults.push(r);
71
+ expect(r.actualType).toBe(fixture.expectedType);
72
+ expect(r.actualResolved).toBe(fixture.expectedResolved);
73
+ if (r.outputMatch !== null) {
74
+ expect(r.outputMatch).toBe(true);
75
+ }
76
+ });
77
+ }
78
+ });
79
+ describe("Semantic", () => {
80
+ for (const fixture of CORPUS_CATEGORIES.semantic) {
81
+ it(`${fixture.id}: ${fixture.description}`, () => {
82
+ const r = runFixture(fixture);
83
+ allResults.push(r);
84
+ expect(r.actualType).toBe(fixture.expectedType);
85
+ expect(r.actualResolved).toBe(fixture.expectedResolved);
86
+ });
87
+ }
88
+ });
89
+ describe("Format-aware", () => {
90
+ for (const fixture of CORPUS_CATEGORIES["format-aware"]) {
91
+ it(`${fixture.id}: ${fixture.description}`, () => {
92
+ const r = runFixture(fixture);
93
+ allResults.push(r);
94
+ // Les résolveurs format-aware peuvent produire un type différent de la
95
+ // classification textuelle → on vérifie seulement la résolution
96
+ expect(r.actualResolved).toBe(fixture.expectedResolved);
97
+ });
98
+ }
99
+ });
100
+ describe("Complex", () => {
101
+ for (const fixture of CORPUS_CATEGORIES.complex) {
102
+ it(`${fixture.id}: ${fixture.description}`, () => {
103
+ const r = runFixture(fixture);
104
+ allResults.push(r);
105
+ // Les conflits complexes ne doivent PAS être résolus automatiquement
106
+ expect(r.actualResolved).toBe(false);
107
+ expect(r.falsePositive).toBe(false);
108
+ if (r.outputMatch !== null) {
109
+ expect(r.outputMatch).toBe(true);
110
+ }
111
+ });
112
+ }
113
+ });
114
+ });
115
+ // ─── Métriques globales ───────────────────────────────────
116
+ describe("Métriques du corpus (Phase 7.5)", () => {
117
+ it("taux global d'auto-résolution ≥ 60%", () => {
118
+ const resolved = allResults.filter(r => r.actualResolved).length;
119
+ const total = allResults.length;
120
+ const rate = resolved / total;
121
+ expect(rate).toBeGreaterThanOrEqual(0.6);
122
+ });
123
+ it("0 faux positif (complex non auto-résolu)", () => {
124
+ const falsePositives = allResults.filter(r => r.falsePositive);
125
+ expect(falsePositives).toHaveLength(0);
126
+ });
127
+ it("classification correcte ≥ 75% des fixtures", () => {
128
+ const typeMatches = allResults.filter(r => r.typeMatch).length;
129
+ const rate = typeMatches / allResults.length;
130
+ expect(rate).toBeGreaterThanOrEqual(0.75);
131
+ });
132
+ it("score de confiance certain/high pour les cas triviaux résolus", () => {
133
+ const trivialResolved = allResults.filter(r => r.fixture.category === "trivial" && r.actualResolved);
134
+ for (const r of trivialResolved) {
135
+ const label = resolve(r.fixture.input, r.fixture.filePath, r.fixture.options ?? {})
136
+ .hunks[0]?.confidence.label;
137
+ expect(["certain", "high"]).toContain(label);
138
+ }
139
+ });
140
+ // ─── Rapport console (affiché seulement si CORPUS_METRICS=1) ──
141
+ afterAll(() => {
142
+ if (process.env["CORPUS_METRICS"] !== "1")
143
+ return;
144
+ const total = allResults.length;
145
+ const resolved = allResults.filter(r => r.actualResolved).length;
146
+ const fps = allResults.filter(r => r.falsePositive).length;
147
+ const fns = allResults.filter(r => r.falseNegative).length;
148
+ // Par type
149
+ const byType = new Map();
150
+ for (const r of allResults) {
151
+ const key = r.fixture.expectedType;
152
+ if (!byType.has(key))
153
+ byType.set(key, { total: 0, resolved: 0, scores: [] });
154
+ const entry = byType.get(key);
155
+ entry.total++;
156
+ if (r.actualResolved)
157
+ entry.resolved++;
158
+ if (r.actualScore !== undefined)
159
+ entry.scores.push(r.actualScore);
160
+ }
161
+ console.log("\n┌─────────────────────────────────────────────────────────┐");
162
+ console.log(`│ GitWand Corpus Metrics — ${total} fixtures │`);
163
+ console.log("├─────────────────────────────────────────────────────────┤");
164
+ console.log(`│ Auto-résolution : ${resolved}/${total} (${Math.round(resolved / total * 100)}%) │`);
165
+ console.log(`│ Faux positifs : ${fps} │`);
166
+ console.log(`│ Faux négatifs : ${fns} │`);
167
+ console.log("├─────────────────────────────────────────────────────────┤");
168
+ console.log("│ Par type : │");
169
+ for (const [type, entry] of [...byType].sort((a, b) => b[1].total - a[1].total)) {
170
+ const rate = Math.round(entry.resolved / entry.total * 100);
171
+ const avgScore = entry.scores.length
172
+ ? Math.round(entry.scores.reduce((a, b) => a + b, 0) / entry.scores.length)
173
+ : 0;
174
+ console.log(`│ ${type.padEnd(22)} ${String(entry.resolved).padStart(2)}/${entry.total} (${String(rate).padStart(3)}%) avg score: ${avgScore} │`);
175
+ }
176
+ console.log("└─────────────────────────────────────────────────────────┘\n");
177
+ });
178
+ });
179
+ //# sourceMappingURL=corpus.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corpus.test.js","sourceRoot":"","sources":["../../src/__tests__/corpus.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Tests directs de l'algorithme LCS (P2.1).
3
+ *
4
+ * L'objectif est de figer le comportement observable (pairs d'indices retournées)
5
+ * avant et après l'optimisation mémoire (Hirschberg pour gros inputs). Les choix
6
+ * de tie-break doivent rester les mêmes pour ne pas casser les tests d'intégration
7
+ * qui reposent indirectement sur l'ordre des edits dérivés.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=diff.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/diff.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Tests directs de l'algorithme LCS (P2.1).
3
+ *
4
+ * L'objectif est de figer le comportement observable (pairs d'indices retournées)
5
+ * avant et après l'optimisation mémoire (Hirschberg pour gros inputs). Les choix
6
+ * de tie-break doivent rester les mêmes pour ne pas casser les tests d'intégration
7
+ * qui reposent indirectement sur l'ordre des edits dérivés.
8
+ */
9
+ import { describe, it, expect } from "vitest";
10
+ import { lcs, computeDiff, _lcsHirschberg } from "../diff.js";
11
+ describe("lcs — cas triviaux", () => {
12
+ it("deux tableaux vides", () => {
13
+ expect(lcs([], [])).toEqual([]);
14
+ });
15
+ it("un tableau vide", () => {
16
+ expect(lcs(["a"], [])).toEqual([]);
17
+ expect(lcs([], ["a"])).toEqual([]);
18
+ });
19
+ it("séquences identiques — toutes les paires", () => {
20
+ expect(lcs(["a", "b", "c"], ["a", "b", "c"])).toEqual([
21
+ [0, 0],
22
+ [1, 1],
23
+ [2, 2],
24
+ ]);
25
+ });
26
+ it("aucune ligne commune", () => {
27
+ expect(lcs(["a", "b"], ["c", "d"])).toEqual([]);
28
+ });
29
+ });
30
+ describe("lcs — cas classiques", () => {
31
+ it("ABCBDAB vs BDCAB (exemple canonique)", () => {
32
+ // LCS length = 4 (BCAB ou BDAB). Vérifier la longueur + validité des indices.
33
+ const result = lcs(["A", "B", "C", "B", "D", "A", "B"], ["B", "D", "C", "A", "B"]);
34
+ expect(result.length).toBe(4);
35
+ // Chaque paire [i, j] doit matcher a[i] === b[j]
36
+ const a = ["A", "B", "C", "B", "D", "A", "B"];
37
+ const b = ["B", "D", "C", "A", "B"];
38
+ for (const [i, j] of result) {
39
+ expect(a[i]).toBe(b[j]);
40
+ }
41
+ // Indices strictement croissants dans les deux tableaux
42
+ for (let k = 1; k < result.length; k++) {
43
+ expect(result[k][0]).toBeGreaterThan(result[k - 1][0]);
44
+ expect(result[k][1]).toBeGreaterThan(result[k - 1][1]);
45
+ }
46
+ });
47
+ it("insertion au milieu", () => {
48
+ const result = lcs(["a", "b", "c"], ["a", "x", "b", "c"]);
49
+ expect(result).toEqual([
50
+ [0, 0],
51
+ [1, 2],
52
+ [2, 3],
53
+ ]);
54
+ });
55
+ it("suppression au milieu", () => {
56
+ const result = lcs(["a", "b", "c", "d"], ["a", "c", "d"]);
57
+ expect(result).toEqual([
58
+ [0, 0],
59
+ [2, 1],
60
+ [3, 2],
61
+ ]);
62
+ });
63
+ });
64
+ describe("lcs — stress + intégration computeDiff", () => {
65
+ it("produit une LCS de longueur maximale (propriété)", () => {
66
+ // Test par propriété : la LCS calculée doit avoir la longueur théorique.
67
+ const a = ["a", "b", "c", "d", "e", "f"];
68
+ const b = ["x", "b", "y", "d", "z", "f"];
69
+ // LCS théorique : b, d, f (longueur 3)
70
+ const result = lcs(a, b);
71
+ expect(result.length).toBe(3);
72
+ });
73
+ it("fonctionne sur un input moyennement gros (50x50)", () => {
74
+ const a = Array.from({ length: 50 }, (_, i) => `line_${i}`);
75
+ const b = Array.from({ length: 50 }, (_, i) => `line_${i}`);
76
+ const result = lcs(a, b);
77
+ expect(result.length).toBe(50);
78
+ });
79
+ it("computeDiff reste cohérent après optimisations mémoire", () => {
80
+ // Test d'intégration : computeDiff dépend de lcs. Si lcs change
81
+ // silencieusement, les ops diff seront différentes.
82
+ const base = ["header", "a", "b", "c", "footer"];
83
+ const branch = ["header", "a", "X", "c", "footer"];
84
+ const ops = computeDiff(base, branch);
85
+ // Séquence attendue : keep header, keep a, remove b, add X, keep c, keep footer
86
+ const types = ops.map((op) => op.type);
87
+ expect(types).toEqual(["keep", "keep", "remove", "add", "keep", "keep"]);
88
+ });
89
+ it("gros input (200x200) avec beaucoup de différences — LCS valide", () => {
90
+ // Cible : l'input est assez gros pour exercer le chemin optimisé
91
+ // dans la future implémentation hybride, sans être lent en test.
92
+ const a = Array.from({ length: 200 }, (_, i) => (i % 2 === 0 ? `a_${i}` : `diff_${i}`));
93
+ const b = Array.from({ length: 200 }, (_, i) => (i % 2 === 0 ? `a_${i}` : `other_${i}`));
94
+ // LCS théorique : les 100 lignes paires identiques.
95
+ const result = lcs(a, b);
96
+ expect(result.length).toBe(100);
97
+ // Chaque match doit être valide
98
+ for (const [i, j] of result) {
99
+ expect(a[i]).toBe(b[j]);
100
+ }
101
+ });
102
+ });
103
+ // ─── P2.1 — Hirschberg (variante mémoire O(min(n,m))) ──────
104
+ describe("lcs — Hirschberg (P2.1)", () => {
105
+ // Propriété à vérifier : Hirschberg doit produire une LCS de longueur
106
+ // optimale et composée de paires valides. Les indices exacts peuvent
107
+ // différer du DP plein sur les ties, mais la longueur doit être la même.
108
+ it("Hirschberg produit la même longueur de LCS que le DP plein", () => {
109
+ const a = ["a", "b", "c", "d", "e", "f", "g"];
110
+ const b = ["x", "b", "y", "d", "z", "f", "w"];
111
+ const dense = lcs(a, b); // passe par DP plein (petit input)
112
+ const hirsch = _lcsHirschberg(a, b);
113
+ expect(hirsch.length).toBe(dense.length);
114
+ });
115
+ it("Hirschberg sur tableaux identiques → toutes les paires diagonales", () => {
116
+ const a = ["a", "b", "c", "d"];
117
+ const result = _lcsHirschberg(a, a);
118
+ expect(result).toEqual([
119
+ [0, 0],
120
+ [1, 1],
121
+ [2, 2],
122
+ [3, 3],
123
+ ]);
124
+ });
125
+ it("Hirschberg sur tableau vide à gauche ou à droite", () => {
126
+ expect(_lcsHirschberg([], ["a", "b"])).toEqual([]);
127
+ expect(_lcsHirschberg(["a", "b"], [])).toEqual([]);
128
+ });
129
+ it("Hirschberg sur une seule ligne à gauche — trouve la première occurrence", () => {
130
+ expect(_lcsHirschberg(["x"], ["a", "x", "x", "b"])).toEqual([[0, 1]]);
131
+ });
132
+ it("Hirschberg : paires valides (propriété)", () => {
133
+ const a = Array.from({ length: 30 }, (_, i) => (i % 3 === 0 ? `k_${i}` : `only_a_${i}`));
134
+ const b = Array.from({ length: 30 }, (_, i) => (i % 3 === 0 ? `k_${i}` : `only_b_${i}`));
135
+ const result = _lcsHirschberg(a, b);
136
+ // Chaque paire doit être une vraie correspondance
137
+ for (const [i, j] of result) {
138
+ expect(a[i]).toBe(b[j]);
139
+ }
140
+ // Indices strictement croissants dans les deux dimensions
141
+ for (let k = 1; k < result.length; k++) {
142
+ expect(result[k][0]).toBeGreaterThan(result[k - 1][0]);
143
+ expect(result[k][1]).toBeGreaterThan(result[k - 1][1]);
144
+ }
145
+ // Longueur théorique : 10 lignes k_0, k_3, k_6…
146
+ expect(result.length).toBe(10);
147
+ });
148
+ it("Hirschberg et DP plein produisent la même longueur sur des inputs aléatoires", () => {
149
+ // Stress test : 20 runs sur des inputs pseudo-aléatoires reproductibles.
150
+ const rng = mulberry32(42);
151
+ for (let run = 0; run < 20; run++) {
152
+ const n = 5 + Math.floor(rng() * 20);
153
+ const m = 5 + Math.floor(rng() * 20);
154
+ const alphabet = ["a", "b", "c", "d", "e"];
155
+ const a = Array.from({ length: n }, () => alphabet[Math.floor(rng() * alphabet.length)]);
156
+ const b = Array.from({ length: m }, () => alphabet[Math.floor(rng() * alphabet.length)]);
157
+ const dense = lcs(a, b);
158
+ const hirsch = _lcsHirschberg(a, b);
159
+ expect(hirsch.length).toBe(dense.length);
160
+ // Validité des paires
161
+ for (const [i, j] of hirsch) {
162
+ expect(a[i]).toBe(b[j]);
163
+ }
164
+ }
165
+ });
166
+ });
167
+ /** PRNG déterministe (mulberry32) — évite la flakiness des stress-tests. */
168
+ function mulberry32(seed) {
169
+ let t = seed;
170
+ return () => {
171
+ t = (t + 0x6d2b79f5) | 0;
172
+ let x = t;
173
+ x = Math.imul(x ^ (x >>> 15), x | 1);
174
+ x ^= x + Math.imul(x ^ (x >>> 7), x | 61);
175
+ return ((x ^ (x >>> 14)) >>> 0) / 4294967296;
176
+ };
177
+ }
178
+ //# sourceMappingURL=diff.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.test.js","sourceRoot":"","sources":["../../src/__tests__/diff.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=format-resolvers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-resolvers.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/format-resolvers.test.ts"],"names":[],"mappings":""}