kuebiko/tests/units/bytes.js

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([]))
})
]