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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
import { left, right } from 'fp-ts/Either'
import {
digits,
whitespace,
whitespaces0,
delimited,
} from '../src/parser/utils'
import { parser } from '../src/parser'
import { none, some } from 'fp-ts/Option'
import { Expr, Literal } from '../src/types'
import { jlog } from '../src/utils'
const wrap = (l: any) => right([[none, l, none], ''])
describe('Parser', () => {
it('should do shit', () => {
expect(digits('12901')).toEqual(right(['12901', '']))
expect(digits('12901asas')).toEqual(right(['12901', 'asas']))
expect(whitespace(' ')).toEqual(right([' ', '']))
expect(whitespace('\n')).toEqual(right(['\n', '']))
expect(whitespace('a')).toEqual(left(['unable to match', 'a']))
expect(delimited(whitespaces0, digits, whitespaces0)(' 20 ')).toEqual(
right(['20', '']),
)
expect(delimited(whitespaces0, digits, whitespaces0)(' 2 0 ')).toEqual(
right(['2', '0 ']),
)
})
it('should maybeshut', () => {
expect(parser(/^ .\s(\n)\b \T $/.source)).toEqual(
right([
[
some(Expr.Start()),
[
Expr.AnyItem(),
Expr.AnyString(),
Expr.Group({ exprs: [Expr.AnyNumber()] }),
Expr.AnyBool(),
Expr.Truthy(),
],
some(Expr.End()),
],
'',
]),
)
expect(parser(/^ \s* \T? \n+ $/.source)).toEqual(
right([
[
some(Expr.Start()),
[
Expr.ZeroOrMore({ expr: Expr.AnyString() }),
Expr.Optional({ expr: Expr.Truthy() }),
Expr.OneOrMore({ expr: Expr.AnyNumber() }),
],
some(Expr.End()),
],
'',
]),
)
expect(parser(/ \s|\b\T|\n /.source)).toEqual(
right([
[
none,
[
Expr.Or({
left: Expr.AnyString(),
right: [
Expr.AnyBool(),
Expr.Or({
left: Expr.Truthy(),
right: [Expr.AnyNumber()],
}),
],
}),
],
none,
],
'',
]),
)
})
it('object proprtyu', () => {
expect(parser(/ [name \s\T] [age \n] /.source)).toEqual(
wrap([
Expr.PropertyMatch({
name: 'name',
exprs: [Expr.AnyString(), Expr.Truthy()],
}),
Expr.PropertyMatch({ name: 'age', exprs: [Expr.AnyNumber()] }),
]),
)
})
it('literals', () => {
// unsigned numbers
expect(parser(/ 0.105 /.source)).toEqual(
wrap([Expr.Literal(Literal.Number(0.105))]),
)
expect(parser(/ 9 /.source)).toEqual(
wrap([Expr.Literal(Literal.Number(9))]),
)
expect(parser(/ 23 /.source)).toEqual(
wrap([Expr.Literal(Literal.Number(23))]),
)
// signed numbers
expect(parser(/ +23.025 /.source)).toEqual(
wrap([Expr.Literal(Literal.Number(23.025))]),
)
expect(parser(/ -23.025 /.source)).toEqual(
wrap([Expr.Literal(Literal.Number(-23.025))]),
)
expect(parser(/ +23 /.source)).toEqual(
wrap([Expr.Literal(Literal.Number(23))]),
)
expect(parser(/ -23 /.source)).toEqual(
wrap([Expr.Literal(Literal.Number(-23))]),
)
// boolean
expect(parser(/ true /.source)).toEqual(
wrap([Expr.Literal(Literal.Boolean(true))]),
)
expect(parser(/ false /.source)).toEqual(
wrap([Expr.Literal(Literal.Boolean(false))]),
)
})
})
|