-
-
Notifications
You must be signed in to change notification settings - Fork 356
/
Copy pathparser.test.ts
85 lines (77 loc) · 2.63 KB
/
parser.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import { createParser } from '../src/parser'
import { traverse } from './helper'
import type { CompileError, ParserOptions } from '../src'
const cases = [
{ code: 'hello world', name: 'message' },
{ code: 'hello {name} !', name: 'named' },
{ code: 'hello {_name} !', name: 'named' },
{ code: 'hello {0} !', name: 'list' },
{ code: `hello {'kazupon'} !`, name: 'literal' },
{ code: '@:apples', name: 'linked' },
{ code: '@.lower:{0}', name: 'linked modifier list' },
{ code: 'no apples | one apple | too much apples ', name: 'plural' },
{
code: `@.lower:{'no apples'} | {1} apple | {count} apples`, // eslint-disable-line no-irregular-whitespace
name: 'plural complex'
},
{ code: `@.: a`, name: 'linked error' },
{ code: `@.:foo`, name: 'linked modifier error' },
{ code: `@:(foo)`, name: 'linked key paren error' },
{ code: `hi @._upper:{_name} !`, name: 'linked key with named and modifier' },
{ code: `@.lower:(foo)`, name: 'linked key paren error with modifier' },
{ code: `@.`, name: 'EOF in linked modifier' },
{ code: `|`, name: 'empty plural' }
]
test('parse', () => {
for (const { name, code } of cases) {
const errors: CompileError[] = []
const options: ParserOptions = {
onError: err => {
errors.push({ ...err, message: err.message })
}
}
const parser = createParser(options)
const ast = parser.parse(code)
const title = `${name}: ${JSON.stringify(code)}`
expect(ast).toMatchSnapshot(title)
if (errors.length) {
expect(errors).toMatchSnapshot(`${title} errors`)
}
}
})
describe('parser options', () => {
test('location disable', () => {
for (const { name, code } of cases) {
const errors: CompileError[] = []
const options: ParserOptions = {
location: false,
onError: err => {
errors.push({ ...err, message: err.message })
}
}
const parser = createParser(options)
const ast = parser.parse(code)
traverse(ast, node => {
expect(node.start).toBeUndefined()
expect(node.end).toBeUndefined()
expect(node.loc).toBeUndefined()
})
const title = `${name}: ${JSON.stringify(code)}`
expect(ast).toMatchSnapshot(title)
if (errors.length) {
expect(errors).toMatchSnapshot(`${title} errors`)
for (const error of errors) {
expect(error.location).toBeUndefined()
}
}
}
})
test('cache key', () => {
const options: ParserOptions = {
onCacheKey: source => source
}
const parser = createParser(options)
const ast = parser.parse('hello {name}!')
expect(ast.cacheKey).toBeDefined()
})
})