Skip to content

Commit 5fec77f

Browse files
committed
Refactor the clipboard parser into dedicated modules to correctly parse text blocks interspersed with code and diff snippets
1 parent 57788a9 commit 5fec77f

36 files changed

Lines changed: 1003 additions & 803 deletions

File tree

‎packages/vscode/src/commands/apply-chat-response-command/utils/clipboard-parser/clipboard-parser.spec.ts‎

Lines changed: 112 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
1-
import {
2-
parse_multiple_files,
3-
parse_file_content_only,
4-
parse_response
5-
} from './clipboard-parser'
1+
import { parse_response, FileItem } from './clipboard-parser'
62
import * as fs from 'fs'
73
import * as path from 'path'
4+
import { parse_file_content_only, parse_multiple_files } from './parsers'
85

96
describe('clipboard-parser', () => {
107
const load_test_case_file = (test_case: string, filename: string): string => {
@@ -24,11 +21,11 @@ describe('clipboard-parser', () => {
2421
})
2522

2623
expect(result).toHaveLength(2)
27-
expect(result[0].file_path).toBe('src/index.ts')
24+
expect((result[0] as FileItem).file_path).toBe('src/index.ts')
2825
expect(result[0].content).toBe(
2926
load_test_case_file(test_case, '1-file.txt')
3027
)
31-
expect(result[1].file_path).toBe('src/utils.py')
28+
expect((result[1] as FileItem).file_path).toBe('src/utils.py')
3229
expect(result[1].content).toBe(
3330
load_test_case_file(test_case, '2-file.txt')
3431
)
@@ -43,7 +40,7 @@ describe('clipboard-parser', () => {
4340
})
4441

4542
expect(result).toHaveLength(1)
46-
expect(result[0].file_path).toBe('src/index.ts')
43+
expect((result[0] as FileItem).file_path).toBe('src/index.ts')
4744
expect(result[0].content).toBe(
4845
load_test_case_file(test_case, '1-file.txt')
4946
)
@@ -58,7 +55,7 @@ describe('clipboard-parser', () => {
5855
})
5956

6057
expect(result).toHaveLength(1)
61-
expect(result[0].file_path).toBe('src/index.ts')
58+
expect((result[0] as FileItem).file_path).toBe('src/index.ts')
6259
expect(result[0].content).toBe(
6360
load_test_case_file(test_case, '1-file.txt')
6461
)
@@ -73,7 +70,7 @@ describe('clipboard-parser', () => {
7370
})
7471

7572
expect(result).toHaveLength(1)
76-
expect(result[0].file_path).toBe('src/index.ts')
73+
expect((result[0] as FileItem).file_path).toBe('src/index.ts')
7774
expect(result[0].content).toBe(
7875
load_test_case_file(test_case, '1-file.txt')
7976
)
@@ -88,7 +85,7 @@ describe('clipboard-parser', () => {
8885
})
8986

9087
expect(result).toHaveLength(1)
91-
expect(result[0].file_path).toBe('src/index.ts')
88+
expect((result[0] as FileItem).file_path).toBe('src/index.ts')
9289
expect(result[0].content).toBe(
9390
load_test_case_file(test_case, '1-file.txt')
9491
)
@@ -103,7 +100,7 @@ describe('clipboard-parser', () => {
103100
})
104101

105102
expect(result).toHaveLength(1)
106-
expect(result[0].file_path).toBe('src/index.ts')
103+
expect((result[0] as FileItem).file_path).toBe('src/index.ts')
107104
expect(result[0].content).toBe(
108105
load_test_case_file(test_case, '1-file.txt')
109106
)
@@ -118,7 +115,7 @@ describe('clipboard-parser', () => {
118115
})
119116

120117
expect(result).toHaveLength(1)
121-
expect(result[0].file_path).toBe('README.md')
118+
expect((result[0] as FileItem).file_path).toBe('README.md')
122119
expect(result[0].content).toBe(
123120
load_test_case_file(test_case, '1-file.txt')
124121
)
@@ -133,11 +130,11 @@ describe('clipboard-parser', () => {
133130
})
134131

135132
expect(result).toHaveLength(2)
136-
expect(result[0].file_path).toBe('src/hello-world.html')
133+
expect((result[0] as FileItem).file_path).toBe('src/hello-world.html')
137134
expect(result[0].content).toBe(
138135
load_test_case_file(test_case, '1-file.txt')
139136
)
140-
expect(result[1].file_path).toBe('src/lorem.css')
137+
expect((result[1] as FileItem).file_path).toBe('src/lorem.css')
141138
expect(result[1].content).toBe(
142139
load_test_case_file(test_case, '2-file.txt')
143140
)
@@ -152,8 +149,8 @@ describe('clipboard-parser', () => {
152149
})
153150

154151
expect(result).toHaveLength(1)
155-
expect(result[0].file_path).toBe('src/index.ts')
156-
expect(result[0].workspace_name).toBe('frontend')
152+
expect((result[0] as FileItem).file_path).toBe('src/index.ts')
153+
expect((result[0] as FileItem).workspace_name).toBe('frontend')
157154
expect(result[0].content).toBe(
158155
load_test_case_file(test_case, '1-file.txt')
159156
)
@@ -168,8 +165,8 @@ describe('clipboard-parser', () => {
168165
})
169166

170167
expect(result).toHaveLength(1)
171-
expect(result[0].file_path).toBe('frontend/src/index.ts')
172-
expect(result[0].workspace_name).toBeUndefined()
168+
expect((result[0] as FileItem).file_path).toBe('frontend/src/index.ts')
169+
expect((result[0] as FileItem).workspace_name).toBeUndefined()
173170
})
174171

175172
it('merges content when the same file path appears in multiple code blocks', () => {
@@ -181,7 +178,7 @@ describe('clipboard-parser', () => {
181178
})
182179

183180
expect(result).toHaveLength(1)
184-
expect(result[0].file_path).toBe('src/index.ts')
181+
expect((result[0] as FileItem).file_path).toBe('src/index.ts')
185182
expect(result[0].content).toBe(
186183
load_test_case_file(test_case, '1-file.txt')
187184
)
@@ -196,11 +193,11 @@ describe('clipboard-parser', () => {
196193
})
197194

198195
expect(result).toHaveLength(2)
199-
expect(result[0].file_path).toBe('src/index.ts')
196+
expect((result[0] as FileItem).file_path).toBe('src/index.ts')
200197
expect(result[0].content).toBe(
201198
load_test_case_file(test_case, '1-file.txt')
202199
)
203-
expect(result[1].file_path).toBe('src/utils.py')
200+
expect((result[1] as FileItem).file_path).toBe('src/utils.py')
204201
expect(result[1].content).toBe(
205202
load_test_case_file(test_case, '2-file.txt')
206203
)
@@ -215,11 +212,11 @@ describe('clipboard-parser', () => {
215212
})
216213

217214
expect(result).toHaveLength(2)
218-
expect(result[0].file_path).toBe('src/index.ts')
215+
expect((result[0] as FileItem).file_path).toBe('src/index.ts')
219216
expect(result[0].content).toBe(
220217
load_test_case_file(test_case, '1-file.txt')
221218
)
222-
expect(result[1].file_path).toBe('src/utils.py')
219+
expect((result[1] as FileItem).file_path).toBe('src/utils.py')
223220
expect(result[1].content).toBe(
224221
load_test_case_file(test_case, '2-file.txt')
225222
)
@@ -234,7 +231,7 @@ describe('clipboard-parser', () => {
234231
})
235232

236233
expect(result).toHaveLength(1)
237-
expect(result[0].file_path).toBe('src/utils.py')
234+
expect((result[0] as FileItem).file_path).toBe('src/utils.py')
238235
expect(result[0].content).toBe(
239236
load_test_case_file(test_case, '1-file.txt')
240237
)
@@ -249,7 +246,7 @@ describe('clipboard-parser', () => {
249246
})
250247

251248
expect(result).toHaveLength(1)
252-
expect(result[0].file_path).toBe('src/index.js')
249+
expect((result[0] as FileItem).file_path).toBe('src/index.js')
253250
expect(result[0].content).toBe(
254251
load_test_case_file(test_case, '1-file.txt')
255252
)
@@ -264,7 +261,7 @@ describe('clipboard-parser', () => {
264261
})
265262

266263
expect(result).toHaveLength(1)
267-
expect(result[0].file_path).toBe('src/index.js')
264+
expect((result[0] as FileItem).file_path).toBe('src/index.js')
268265
expect(result[0].content).toBe(
269266
load_test_case_file(test_case, '1-file.txt')
270267
)
@@ -279,7 +276,7 @@ describe('clipboard-parser', () => {
279276
})
280277

281278
expect(result).toHaveLength(1)
282-
expect(result[0].file_path).toBe('src/test.md')
279+
expect((result[0] as FileItem).file_path).toBe('src/test.md')
283280
expect(result[0].content).toBe(
284281
load_test_case_file(test_case, '1-file.txt')
285282
)
@@ -294,7 +291,7 @@ describe('clipboard-parser', () => {
294291
})
295292

296293
expect(result).toHaveLength(1)
297-
expect(result[0].file_path).toBe('src/lorem.ts')
294+
expect((result[0] as FileItem).file_path).toBe('src/lorem.ts')
298295
expect(result[0].content).toBe(
299296
load_test_case_file(test_case, '1-file.txt')
300297
)
@@ -309,7 +306,7 @@ describe('clipboard-parser', () => {
309306
})
310307

311308
expect(result).toHaveLength(1)
312-
expect(result[0].file_path).toBe('src/main.js')
309+
expect((result[0] as FileItem).file_path).toBe('src/main.js')
313310
expect(result[0].content).toBe(
314311
load_test_case_file(test_case, '1-file.txt')
315312
)
@@ -324,11 +321,11 @@ describe('clipboard-parser', () => {
324321
})
325322

326323
expect(result).toHaveLength(2)
327-
expect(result[0].file_path).toBe('src/lorem.ts')
324+
expect((result[0] as FileItem).file_path).toBe('src/lorem.ts')
328325
expect(result[0].content).toBe(
329326
load_test_case_file(test_case, '1-file.txt')
330327
)
331-
expect(result[1].file_path).toBe('src/ipsum.ts')
328+
expect((result[1] as FileItem).file_path).toBe('src/ipsum.ts')
332329
expect(result[1].content).toBe(
333330
load_test_case_file(test_case, '2-file.txt')
334331
)
@@ -343,11 +340,11 @@ describe('clipboard-parser', () => {
343340
})
344341

345342
expect(result).toHaveLength(2)
346-
expect(result[0].file_path).toBe('src/lorem.ts')
343+
expect((result[0] as FileItem).file_path).toBe('src/lorem.ts')
347344
expect(result[0].content).toBe(
348345
load_test_case_file(test_case, '1-file.txt')
349346
)
350-
expect(result[1].file_path).toBe('src/ipsum.ts')
347+
expect((result[1] as FileItem).file_path).toBe('src/ipsum.ts')
351348
expect(result[1].content).toBe(
352349
load_test_case_file(test_case, '2-file.txt')
353350
)
@@ -362,7 +359,7 @@ describe('clipboard-parser', () => {
362359
})
363360

364361
expect(result).toHaveLength(1)
365-
expect(result[0].file_path).toBe('src/index.php')
362+
expect((result[0] as FileItem).file_path).toBe('src/index.php')
366363
expect(result[0].content).toBe(
367364
load_test_case_file(test_case, '1-file.txt')
368365
)
@@ -377,7 +374,7 @@ describe('clipboard-parser', () => {
377374
})
378375

379376
expect(result).toHaveLength(1)
380-
expect(result[0].file_path).toBe('src/index.ts')
377+
expect((result[0] as FileItem).file_path).toBe('src/index.ts')
381378
expect(result[0].content).toBe(
382379
load_test_case_file(test_case, '1-file.txt')
383380
)
@@ -392,7 +389,7 @@ describe('clipboard-parser', () => {
392389
})
393390

394391
expect(result).toHaveLength(1)
395-
expect(result[0].file_path).toBe('src/index.js')
392+
expect((result[0] as FileItem).file_path).toBe('src/index.js')
396393
expect(result[0].content).toBe(
397394
load_test_case_file(test_case, '1-file.txt')
398395
)
@@ -407,7 +404,7 @@ describe('clipboard-parser', () => {
407404
})
408405

409406
expect(result).toHaveLength(1)
410-
expect(result[0].file_path).toBe('src/index.js')
407+
expect((result[0] as FileItem).file_path).toBe('src/index.js')
411408
expect(result[0].content).toBe(
412409
load_test_case_file(test_case, '1-file.txt')
413410
)
@@ -422,7 +419,7 @@ describe('clipboard-parser', () => {
422419
})
423420

424421
expect(result).toHaveLength(1)
425-
expect(result[0].file_path).toBe('src/hello-world.ts')
422+
expect((result[0] as FileItem).file_path).toBe('src/hello-world.ts')
426423
expect(result[0].content).toBe(
427424
load_test_case_file(test_case, '1-file.txt')
428425
)
@@ -437,7 +434,7 @@ describe('clipboard-parser', () => {
437434
})
438435

439436
expect(result).toHaveLength(1)
440-
expect(result[0].file_path).toBe('src/index.js')
437+
expect((result[0] as FileItem).file_path).toBe('src/index.js')
441438
expect(result[0].content).toBe(
442439
load_test_case_file(test_case, '1-file.txt')
443440
)
@@ -972,17 +969,90 @@ describe('clipboard-parser', () => {
972969
is_single_root_folder_workspace: true
973970
})
974971

975-
expect(result).toHaveLength(2)
972+
expect(result).toHaveLength(3)
976973
expect(result[0]).toMatchObject({
974+
type: 'text',
975+
content: load_test_case_file(test_case, '1-text.txt')
976+
})
977+
expect(result[1]).toMatchObject({
977978
type: 'diff',
978979
file_path: 'src/lorem.html',
979-
content: load_test_case_file(test_case, '1-file.txt')
980+
content: load_test_case_file(test_case, '2-file.txt')
981+
})
982+
expect(result[2]).toMatchObject({
983+
type: 'diff',
984+
file_path: 'src/ipsum.ts',
985+
content: load_test_case_file(test_case, '3-file.txt')
986+
})
987+
})
988+
989+
it('parses multiple files with text between the markdown code blocks', () => {
990+
const test_case = 'text-between'
991+
const text = load_test_case_file(test_case, `${test_case}.txt`)
992+
const result = parse_response({
993+
response: text,
994+
is_single_root_folder_workspace: true
995+
})
996+
997+
expect(result).toHaveLength(5)
998+
expect(result[0]).toMatchObject({
999+
type: 'text',
1000+
content: load_test_case_file(test_case, '1-text.txt')
9801001
})
9811002
expect(result[1]).toMatchObject({
1003+
type: 'diff',
1004+
file_path: 'src/lorem.ts',
1005+
content: load_test_case_file(test_case, '2-file.txt')
1006+
})
1007+
expect(result[2]).toMatchObject({
1008+
type: 'text',
1009+
content: load_test_case_file(test_case, '3-text.txt')
1010+
})
1011+
expect(result[3]).toMatchObject({
9821012
type: 'diff',
9831013
file_path: 'src/ipsum.ts',
1014+
content: load_test_case_file(test_case, '4-file.txt')
1015+
})
1016+
expect(result[4]).toMatchObject({
1017+
type: 'text',
1018+
content: load_test_case_file(test_case, '5-text.txt')
1019+
})
1020+
})
1021+
1022+
it('parses multiple diffs with text between the markdown code blocks', () => {
1023+
const test_case = 'diff-multiple-files-text-between'
1024+
const text = load_test_case_file(
1025+
test_case,
1026+
'diff-multiple-files-text-between.txt'
1027+
)
1028+
const result = parse_response({
1029+
response: text,
1030+
is_single_root_folder_workspace: true
1031+
})
1032+
1033+
expect(result).toHaveLength(5)
1034+
expect(result[0]).toMatchObject({
1035+
type: 'text',
1036+
content: load_test_case_file(test_case, '1-text.txt')
1037+
})
1038+
expect(result[1]).toMatchObject({
1039+
type: 'diff',
1040+
file_path: 'src/lorem.ts',
9841041
content: load_test_case_file(test_case, '2-file.txt')
9851042
})
1043+
expect(result[2]).toMatchObject({
1044+
type: 'text',
1045+
content: load_test_case_file(test_case, '3-text.txt')
1046+
})
1047+
expect(result[3]).toMatchObject({
1048+
type: 'diff',
1049+
file_path: 'src/ipsum.ts',
1050+
content: load_test_case_file(test_case, '4-file.txt')
1051+
})
1052+
expect(result[4]).toMatchObject({
1053+
type: 'text',
1054+
content: load_test_case_file(test_case, '5-text.txt')
1055+
})
9861056
})
9871057

9881058
it('merges a new file and a diff for the same file path into one patch', () => {

0 commit comments

Comments
 (0)