Skip to content

Commit f0d4eec

Browse files
committed
test: refactor vFor tests
1 parent b3b67b8 commit f0d4eec

File tree

1 file changed

+45
-171
lines changed

1 file changed

+45
-171
lines changed

packages/compiler-core/__tests__/transforms/vFor.spec.ts

Lines changed: 45 additions & 171 deletions
Original file line numberDiff line numberDiff line change
@@ -3,81 +3,60 @@ import { transform } from '../../src/transform'
33
import { transformFor } from '../../src/transforms/vFor'
44
import { ForNode, NodeTypes } from '../../src/ast'
55
import { ErrorCodes } from '../../src/errors'
6+
import { CompilerOptions } from '../../src'
7+
8+
function transformWithFor(
9+
template: string,
10+
options: CompilerOptions = {}
11+
): ForNode {
12+
const node = parse(template, options)
13+
transform(node, { nodeTransforms: [transformFor], ...options })
14+
if (!options.onError) {
15+
expect(node.children.length).toBe(1)
16+
expect(node.children[0].type).toBe(NodeTypes.FOR)
17+
}
18+
return node.children[0] as ForNode
19+
}
620

721
describe('compiler: transform v-for', () => {
822
test('number expression', () => {
9-
const node = parse('<span v-for="index in 5" />')
10-
11-
transform(node, { nodeTransforms: [transformFor] })
12-
13-
expect(node.children.length).toBe(1)
14-
15-
const forNode = node.children[0] as ForNode
16-
17-
expect(forNode.type).toBe(NodeTypes.FOR)
23+
const forNode = transformWithFor('<span v-for="index in 5" />')
1824
expect(forNode.keyAlias).toBeUndefined()
1925
expect(forNode.objectIndexAlias).toBeUndefined()
2026
expect(forNode.valueAlias!.content).toBe('index')
2127
expect(forNode.source.content).toBe('5')
2228
})
2329

2430
test('value', () => {
25-
const node = parse('<span v-for="(item) in items" />')
26-
27-
transform(node, { nodeTransforms: [transformFor] })
28-
29-
expect(node.children.length).toBe(1)
30-
31-
const forNode = node.children[0] as ForNode
32-
33-
expect(forNode.type).toBe(NodeTypes.FOR)
31+
const forNode = transformWithFor('<span v-for="(item) in items" />')
3432
expect(forNode.keyAlias).toBeUndefined()
3533
expect(forNode.objectIndexAlias).toBeUndefined()
3634
expect(forNode.valueAlias!.content).toBe('item')
3735
expect(forNode.source.content).toBe('items')
3836
})
3937

4038
test('object de-structured value', () => {
41-
const node = parse('<span v-for="({ id, value }) in items" />')
42-
43-
transform(node, { nodeTransforms: [transformFor] })
44-
45-
expect(node.children.length).toBe(1)
46-
47-
const forNode = node.children[0] as ForNode
48-
49-
expect(forNode.type).toBe(NodeTypes.FOR)
39+
const forNode = transformWithFor(
40+
'<span v-for="({ id, value }) in items" />'
41+
)
5042
expect(forNode.keyAlias).toBeUndefined()
5143
expect(forNode.objectIndexAlias).toBeUndefined()
5244
expect(forNode.valueAlias!.content).toBe('{ id, value }')
5345
expect(forNode.source.content).toBe('items')
5446
})
5547

5648
test('array de-structured value', () => {
57-
const node = parse('<span v-for="([ id, value ]) in items" />')
58-
59-
transform(node, { nodeTransforms: [transformFor] })
60-
61-
expect(node.children.length).toBe(1)
62-
63-
const forNode = node.children[0] as ForNode
64-
65-
expect(forNode.type).toBe(NodeTypes.FOR)
49+
const forNode = transformWithFor(
50+
'<span v-for="([ id, value ]) in items" />'
51+
)
6652
expect(forNode.keyAlias).toBeUndefined()
6753
expect(forNode.objectIndexAlias).toBeUndefined()
6854
expect(forNode.valueAlias!.content).toBe('[ id, value ]')
6955
expect(forNode.source.content).toBe('items')
7056
})
7157

7258
test('value and key', () => {
73-
const node = parse('<span v-for="(item, key) in items" />')
74-
75-
transform(node, { nodeTransforms: [transformFor] })
76-
77-
expect(node.children.length).toBe(1)
78-
79-
const forNode = node.children[0] as ForNode
80-
59+
const forNode = transformWithFor('<span v-for="(item, key) in items" />')
8160
expect(forNode.keyAlias).not.toBeUndefined()
8261
expect(forNode.keyAlias!.content).toBe('key')
8362
expect(forNode.objectIndexAlias).toBeUndefined()
@@ -86,15 +65,9 @@ describe('compiler: transform v-for', () => {
8665
})
8766

8867
test('value, key and index', () => {
89-
const node = parse('<span v-for="(value, key, index) in items" />')
90-
91-
transform(node, { nodeTransforms: [transformFor] })
92-
93-
expect(node.children.length).toBe(1)
94-
95-
const forNode = node.children[0] as ForNode
96-
97-
expect(forNode.type).toBe(NodeTypes.FOR)
68+
const forNode = transformWithFor(
69+
'<span v-for="(value, key, index) in items" />'
70+
)
9871
expect(forNode.keyAlias).not.toBeUndefined()
9972
expect(forNode.keyAlias!.content).toBe('key')
10073
expect(forNode.objectIndexAlias).not.toBeUndefined()
@@ -104,15 +77,7 @@ describe('compiler: transform v-for', () => {
10477
})
10578

10679
test('skipped key', () => {
107-
const node = parse('<span v-for="(value,,index) in items" />')
108-
109-
transform(node, { nodeTransforms: [transformFor] })
110-
111-
expect(node.children.length).toBe(1)
112-
113-
const forNode = node.children[0] as ForNode
114-
115-
expect(forNode.type).toBe(NodeTypes.FOR)
80+
const forNode = transformWithFor('<span v-for="(value,,index) in items" />')
11681
expect(forNode.keyAlias).toBeUndefined()
11782
expect(forNode.objectIndexAlias).not.toBeUndefined()
11883
expect(forNode.objectIndexAlias!.content).toBe('index')
@@ -121,15 +86,7 @@ describe('compiler: transform v-for', () => {
12186
})
12287

12388
test('skipped value and key', () => {
124-
const node = parse('<span v-for="(,,index) in items" />')
125-
126-
transform(node, { nodeTransforms: [transformFor] })
127-
128-
expect(node.children.length).toBe(1)
129-
130-
const forNode = node.children[0] as ForNode
131-
132-
expect(forNode.type).toBe(NodeTypes.FOR)
89+
const forNode = transformWithFor('<span v-for="(,,index) in items" />')
13390
expect(forNode.keyAlias).toBeUndefined()
13491
expect(forNode.objectIndexAlias).not.toBeUndefined()
13592
expect(forNode.objectIndexAlias!.content).toBe('index')
@@ -138,31 +95,15 @@ describe('compiler: transform v-for', () => {
13895
})
13996

14097
test('unbracketed value', () => {
141-
const node = parse('<span v-for="item in items" />')
142-
143-
transform(node, { nodeTransforms: [transformFor] })
144-
145-
expect(node.children.length).toBe(1)
146-
147-
const forNode = node.children[0] as ForNode
148-
149-
expect(forNode.type).toBe(NodeTypes.FOR)
98+
const forNode = transformWithFor('<span v-for="item in items" />')
15099
expect(forNode.keyAlias).toBeUndefined()
151100
expect(forNode.objectIndexAlias).toBeUndefined()
152101
expect(forNode.valueAlias!.content).toBe('item')
153102
expect(forNode.source.content).toBe('items')
154103
})
155104

156105
test('unbracketed value and key', () => {
157-
const node = parse('<span v-for="item, key in items" />')
158-
159-
transform(node, { nodeTransforms: [transformFor] })
160-
161-
expect(node.children.length).toBe(1)
162-
163-
const forNode = node.children[0] as ForNode
164-
165-
expect(forNode.type).toBe(NodeTypes.FOR)
106+
const forNode = transformWithFor('<span v-for="item, key in items" />')
166107
expect(forNode.keyAlias).not.toBeUndefined()
167108
expect(forNode.keyAlias!.content).toBe('key')
168109
expect(forNode.objectIndexAlias).toBeUndefined()
@@ -171,15 +112,9 @@ describe('compiler: transform v-for', () => {
171112
})
172113

173114
test('unbracketed value, key and index', () => {
174-
const node = parse('<span v-for="value, key, index in items" />')
175-
176-
transform(node, { nodeTransforms: [transformFor] })
177-
178-
expect(node.children.length).toBe(1)
179-
180-
const forNode = node.children[0] as ForNode
181-
182-
expect(forNode.type).toBe(NodeTypes.FOR)
115+
const forNode = transformWithFor(
116+
'<span v-for="value, key, index in items" />'
117+
)
183118
expect(forNode.keyAlias).not.toBeUndefined()
184119
expect(forNode.keyAlias!.content).toBe('key')
185120
expect(forNode.objectIndexAlias).not.toBeUndefined()
@@ -189,15 +124,7 @@ describe('compiler: transform v-for', () => {
189124
})
190125

191126
test('unbracketed skipped key', () => {
192-
const node = parse('<span v-for="value, , index in items" />')
193-
194-
transform(node, { nodeTransforms: [transformFor] })
195-
196-
expect(node.children.length).toBe(1)
197-
198-
const forNode = node.children[0] as ForNode
199-
200-
expect(forNode.type).toBe(NodeTypes.FOR)
127+
const forNode = transformWithFor('<span v-for="value, , index in items" />')
201128
expect(forNode.keyAlias).toBeUndefined()
202129
expect(forNode.objectIndexAlias).not.toBeUndefined()
203130
expect(forNode.objectIndexAlias!.content).toBe('index')
@@ -206,15 +133,7 @@ describe('compiler: transform v-for', () => {
206133
})
207134

208135
test('unbracketed skipped value and key', () => {
209-
const node = parse('<span v-for=", , index in items" />')
210-
211-
transform(node, { nodeTransforms: [transformFor] })
212-
213-
expect(node.children.length).toBe(1)
214-
215-
const forNode = node.children[0] as ForNode
216-
217-
expect(forNode.type).toBe(NodeTypes.FOR)
136+
const forNode = transformWithFor('<span v-for=", , index in items" />')
218137
expect(forNode.keyAlias).toBeUndefined()
219138
expect(forNode.objectIndexAlias).not.toBeUndefined()
220139
expect(forNode.objectIndexAlias!.content).toBe('index')
@@ -223,9 +142,8 @@ describe('compiler: transform v-for', () => {
223142
})
224143

225144
test('missing expression', () => {
226-
const node = parse('<span v-for />')
227145
const onError = jest.fn()
228-
transform(node, { nodeTransforms: [transformFor], onError })
146+
transformWithFor('<span v-for />', { onError })
229147

230148
expect(onError).toHaveBeenCalledTimes(1)
231149
expect(onError).toHaveBeenCalledWith(
@@ -236,9 +154,8 @@ describe('compiler: transform v-for', () => {
236154
})
237155

238156
test('empty expression', () => {
239-
const node = parse('<span v-for="" />')
240157
const onError = jest.fn()
241-
transform(node, { nodeTransforms: [transformFor], onError })
158+
transformWithFor('<span v-for="" />', { onError })
242159

243160
expect(onError).toHaveBeenCalledTimes(1)
244161
expect(onError).toHaveBeenCalledWith(
@@ -249,9 +166,8 @@ describe('compiler: transform v-for', () => {
249166
})
250167

251168
test('invalid expression', () => {
252-
const node = parse('<span v-for="items" />')
253169
const onError = jest.fn()
254-
transform(node, { nodeTransforms: [transformFor], onError })
170+
transformWithFor('<span v-for="items" />', { onError })
255171

256172
expect(onError).toHaveBeenCalledTimes(1)
257173
expect(onError).toHaveBeenCalledWith(
@@ -262,9 +178,8 @@ describe('compiler: transform v-for', () => {
262178
})
263179

264180
test('missing source', () => {
265-
const node = parse('<span v-for="item in" />')
266181
const onError = jest.fn()
267-
transform(node, { nodeTransforms: [transformFor], onError })
182+
transformWithFor('<span v-for="item in" />', { onError })
268183

269184
expect(onError).toHaveBeenCalledTimes(1)
270185
expect(onError).toHaveBeenCalledWith(
@@ -275,9 +190,8 @@ describe('compiler: transform v-for', () => {
275190
})
276191

277192
test('missing value', () => {
278-
const node = parse('<span v-for="in items" />')
279193
const onError = jest.fn()
280-
transform(node, { nodeTransforms: [transformFor], onError })
194+
transformWithFor('<span v-for="in items" />', { onError })
281195

282196
expect(onError).toHaveBeenCalledTimes(1)
283197
expect(onError).toHaveBeenCalledWith(
@@ -290,15 +204,7 @@ describe('compiler: transform v-for', () => {
290204
describe('source location', () => {
291205
test('value & source', () => {
292206
const source = '<span v-for="item in items" />'
293-
const node = parse(source)
294-
295-
transform(node, { nodeTransforms: [transformFor] })
296-
297-
expect(node.children.length).toBe(1)
298-
299-
const forNode = node.children[0] as ForNode
300-
301-
expect(forNode.type).toBe(NodeTypes.FOR)
207+
const forNode = transformWithFor(source)
302208

303209
expect(forNode.valueAlias!.content).toBe('item')
304210
expect(forNode.valueAlias!.loc.start.offset).toBe(
@@ -321,15 +227,7 @@ describe('compiler: transform v-for', () => {
321227

322228
test('bracketed value', () => {
323229
const source = '<span v-for="( item ) in items" />'
324-
const node = parse(source)
325-
326-
transform(node, { nodeTransforms: [transformFor] })
327-
328-
expect(node.children.length).toBe(1)
329-
330-
const forNode = node.children[0] as ForNode
331-
332-
expect(forNode.type).toBe(NodeTypes.FOR)
230+
const forNode = transformWithFor(source)
333231

334232
expect(forNode.valueAlias!.content).toBe('item')
335233
expect(forNode.valueAlias!.loc.start.offset).toBe(
@@ -352,15 +250,7 @@ describe('compiler: transform v-for', () => {
352250

353251
test('de-structured value', () => {
354252
const source = '<span v-for="( { id, key })in items" />'
355-
const node = parse(source)
356-
357-
transform(node, { nodeTransforms: [transformFor] })
358-
359-
expect(node.children.length).toBe(1)
360-
361-
const forNode = node.children[0] as ForNode
362-
363-
expect(forNode.type).toBe(NodeTypes.FOR)
253+
const forNode = transformWithFor(source)
364254

365255
expect(forNode.valueAlias!.content).toBe('{ id, key }')
366256
expect(forNode.valueAlias!.loc.start.offset).toBe(
@@ -385,15 +275,7 @@ describe('compiler: transform v-for', () => {
385275

386276
test('bracketed value, key, index', () => {
387277
const source = '<span v-for="( item, key, index ) in items" />'
388-
const node = parse(source)
389-
390-
transform(node, { nodeTransforms: [transformFor] })
391-
392-
expect(node.children.length).toBe(1)
393-
394-
const forNode = node.children[0] as ForNode
395-
396-
expect(forNode.type).toBe(NodeTypes.FOR)
278+
const forNode = transformWithFor(source)
397279

398280
expect(forNode.valueAlias!.content).toBe('item')
399281
expect(forNode.valueAlias!.loc.start.offset).toBe(
@@ -436,15 +318,7 @@ describe('compiler: transform v-for', () => {
436318

437319
test('skipped key', () => {
438320
const source = '<span v-for="( item,, index ) in items" />'
439-
const node = parse(source)
440-
441-
transform(node, { nodeTransforms: [transformFor] })
442-
443-
expect(node.children.length).toBe(1)
444-
445-
const forNode = node.children[0] as ForNode
446-
447-
expect(forNode.type).toBe(NodeTypes.FOR)
321+
const forNode = transformWithFor(source)
448322

449323
expect(forNode.valueAlias!.content).toBe('item')
450324
expect(forNode.valueAlias!.loc.start.offset).toBe(

0 commit comments

Comments
 (0)