aboutsummaryrefslogtreecommitdiff
path: root/tests/parser.spec.ts
blob: c935165ee90017b584242aaf7f39c72cb93d165e (plain) (blame)
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))]),
    )
  })
})