81 lines
2.5 KiB
JavaScript
81 lines
2.5 KiB
JavaScript
import { it, assert, assertEq } from 'folktest'
|
|
import { char, charNoCase, noneOf, oneOf, parse, tag, tagNoCase, take, takeWhile } from '../../src/index.js'
|
|
import { Alphanumeric } from '../../src/const.js'
|
|
import { chain, curry, map } from 'izuna'
|
|
|
|
const assertState = expected => state => {
|
|
assertEq(expected, state[0])
|
|
}
|
|
|
|
const parseEq = curry((parser, input, expected) =>
|
|
chain(assertState(expected), parse(parser, input))
|
|
)
|
|
|
|
const parseErr = curry((parser, input) =>
|
|
assert(parse(parser, input).isErr(), `expected an error but "${input}" parsed successfully`)
|
|
)
|
|
|
|
export const Byte = [
|
|
it('char', () => {
|
|
const parser = char('a')
|
|
|
|
parseEq(parser, 'abc', ['a'])
|
|
assert(parse(parser, ' abc').isErr())
|
|
assert(parse(parser, 'bc').isErr())
|
|
assert(parse(parser, '').isErr())
|
|
}),
|
|
|
|
it('oneOf', () => {
|
|
parse(oneOf('abc'), 'b').chain(assertState('b'))
|
|
assert(parse(oneOf('a'), 'bc').isErr())
|
|
assert(parse(oneOf('a'), '').isErr())
|
|
}),
|
|
|
|
it('noneOf', () => {
|
|
parse(noneOf('abc'), 'z').chain(assertState(['z']))
|
|
assert(parse(noneOf('ab'), 'a').isErr())
|
|
assert(parse(noneOf('ab'), '').isErr())
|
|
}),
|
|
|
|
it('tag', () => {
|
|
const parser = tag('Hello')
|
|
parse(parser, 'Hello, World!').chain(assertState(['Hello']))
|
|
assert(parse(parser, 'Something').isErr())
|
|
assert(parse(parser, '').isErr())
|
|
}),
|
|
|
|
it('charNoCase', () => {
|
|
const parser = charNoCase('a')
|
|
parse(parser, 'abc').chain(assertState(['a']))
|
|
parse(parser, 'Abc').chain(assertState(['A']))
|
|
assert(parse(parser, ' abc').isErr())
|
|
assert(parse(parser, 'bc').isErr())
|
|
assert(parse(parser, '').isErr())
|
|
}),
|
|
|
|
it('tagNoCase', () => {
|
|
const parser = tagNoCase('hello')
|
|
parse(parser, 'Hello, World!').chain(assertState(['Hello']))
|
|
parse(parser, 'hello, World!').chain(assertState(['hello']))
|
|
parse(parser, 'HeLlO, World!').chain(assertState(['HeLlO']))
|
|
assert(parse(parser, 'Something').isErr())
|
|
assert(parse(parser, '').isErr())
|
|
}),
|
|
|
|
it('take', () => {
|
|
const parser = take(6)
|
|
parse(parser, '1234567').chain(assertState('123456'.split('')))
|
|
parse(parser, 'things').chain(assertState('things'.split('')))
|
|
assert(parse(parser, 'short').isErr())
|
|
assert(parse(parser, '').isErr())
|
|
}),
|
|
|
|
it('takeWhile', () => {
|
|
const parser = takeWhile(x => Alphanumeric.includes(x))
|
|
parse(parser, 'latin123').chain(assertState(['latin']))
|
|
parse(parser, '123').chain(assertState([]))
|
|
parse(parser, 'latin').chain(assertState(['latin']))
|
|
parse(parser, '').chain(assertState([]))
|
|
})
|
|
]
|
|
|