Joshua Bemenderfer 9b5ac14082 Initial commit.
2022-08-31 22:15:07 -04:00

204 lines
6.8 KiB
JavaScript

import { assert, describe, expect, it } from 'vitest'
import { LineData, parseLine } from './parser'
describe(`LineData`, () => {
it(`is an object`, () => {
const lineData = LineData()
expect(lineData).toBeTypeOf(`object`)
})
it(`has two properties`, () => {
const lineData = LineData()
expect(Object.keys(lineData).length).to.equal(2)
})
it(`'type' is an integer initialized to zero`, () => {
const lineData = LineData()
expect(lineData.level).to.equal(0)
})
it(`'level' is an integer initialized to zero`, () => {
const lineData = LineData()
expect(lineData.type).to.equal(0)
})
})
describe(`parseLine`, () => {
it(`Requres 'line' to be a string`, () => {
const lineData = LineData()
expect(() => parseLine(0, lineData)).toThrowError(`'line' must be a string`)
expect(() => parseLine([], lineData)).toThrowError(`'line' must be a string`)
expect(() => parseLine({}, lineData)).toThrowError(`'line' must be a string`)
expect(() => parseLine(null, lineData)).toThrowError(`'line' must be a string`)
expect(() => parseLine(true, lineData)).toThrowError(`'line' must be a string`)
expect(() => parseLine(() => {}, lineData)).toThrowError(`'line' must be a string`)
})
it(`Requres 'lineData' to be an object with a numeric level and type property`, () => {
const lineData = LineData()
expect(() => parseLine(``, 0)).toThrowError(`'lineData' must be an object with 'type' and 'level' integer properties`)
expect(() => parseLine(``, [])).toThrowError(`'lineData' must be an object with 'type' and 'level' integer properties`)
expect(() => parseLine(``, {})).toThrowError(`'lineData' must be an object with 'type' and 'level' integer properties`)
expect(() => parseLine(``, null)).toThrowError(`'lineData' must be an object with 'type' and 'level' integer properties`)
expect(() => parseLine(``, true)).toThrowError(`'lineData' must be an object with 'type' and 'level' integer properties`)
expect(() => parseLine(``, () => {})).toThrowError(`'lineData' must be an object with 'type' and 'level' integer properties`)
expect(() => parseLine(``, { level: '', type: 0 })).toThrowError(`'lineData' must be an object with 'type' and 'level' integer properties`)
expect(() => parseLine(``, { level: 0, type: null })).toThrowError(`'lineData' must be an object with 'type' and 'level' integer properties`)
})
it(`Requres 'indent' to be a single-character string`, () => {
const lineData = LineData()
expect(() => parseLine(``, lineData, 0)).toThrowError(`'indent' must be a single-character string`)
expect(() => parseLine(``, lineData, [])).toThrowError(`'indent' must be a single-character string`)
expect(() => parseLine(``, lineData, {})).toThrowError(`'indent' must be a single-character string`)
expect(() => parseLine(``, lineData, null)).toThrowError(`'indent' must be a single-character string`)
expect(() => parseLine(``, lineData, true)).toThrowError(`'indent' must be a single-character string`)
expect(() => parseLine(``, lineData, () => {})).toThrowError(`'indent' must be a single-character string`)
expect(() => parseLine(``, lineData, ` `)).toThrowError(`'indent' must be a single-character string`)
})
it(`Outputs { type: 0, level: 0} for a blank line at indent level 0`, () => {
const line = ``
const lineData = LineData()
parseLine(line, lineData)
expect(lineData.type).to.equal(0)
expect(lineData.level).to.equal(0)
})
it(`Outputs { type: 1, level: 1} for line with a single space at indent level 1`, () => {
const line = ` `
const lineData = LineData()
parseLine(line, lineData)
expect(lineData.type).to.equal(1)
expect(lineData.level).to.equal(1)
})
it(`Outputs { type: 1, level: 2} for line with two spaces`, () => {
const line = ` `
const lineData = LineData()
parseLine(line, lineData)
expect(lineData.type).to.equal(1)
expect(lineData.level).to.equal(2)
})
it(`Outputs { type: 1, level: 0} for a normal line at indent level 0`, () => {
const line = `line 1`
const lineData = LineData()
parseLine(line, lineData)
expect(lineData.type).to.equal(1)
expect(lineData.level).to.equal(0)
})
it(`Outputs { type: 1, level: 1} for a normal line at indent level 1`, () => {
const line = ` line 1`
const lineData = LineData()
parseLine(line, lineData)
expect(lineData.type).to.equal(1)
expect(lineData.level).to.equal(1)
})
it(`Outputs { type: 1, level: 1} for a normal line at indent level 1`, () => {
const line = ` line 1`
const lineData = LineData()
parseLine(line, lineData)
expect(lineData.type).to.equal(1)
expect(lineData.level).to.equal(2)
})
it(`Outputs { type: 1, level: 1} for a normal line at indent level 1 indented with tabs`, () => {
const line = `\tline 1`
const lineData = LineData()
parseLine(line, lineData, `\t`)
expect(lineData.type).to.equal(1)
expect(lineData.level).to.equal(1)
})
it(`Outputs { type: 1, level: 2} for a normal line at indent level 1 indented with tabs`, () => {
const line = `\t\tline 1`
const lineData = LineData()
parseLine(line, lineData, `\t`)
expect(lineData.type).to.equal(1)
expect(lineData.level).to.equal(2)
})
it(`Nests a normal line under a preceding normal line`, () => {
const lines = [
'line 1',
' line 2'
]
const lineData = LineData()
const results = lines.map(line => {
parseLine(line, lineData)
return {...lineData}
})
expect(results).to.deep.equal([
{ type: 1, level: 0 },
{ type: 1, level: 1 }
])
})
it(`Nests multiple normal line under a preceding normal line`, () => {
const lines = [
'line 1',
' line 2',
' line 3',
' line 4',
]
const lineData = LineData()
const results = lines.map(line => {
parseLine(line, lineData)
return {...lineData}
})
expect(results).to.deep.equal([
{ type: 1, level: 0 },
{ type: 1, level: 1 },
{ type: 1, level: 1 },
{ type: 1, level: 1 }
])
})
it(`Nests an empty line under a preceding normal line`, () => {
const lines = [
'line 1',
''
]
const lineData = LineData()
const results = lines.map(line => {
parseLine(line, lineData)
return {...lineData}
})
expect(results).to.deep.equal([
{ type: 1, level: 0 },
{ type: 0, level: 1 }
])
})
it(`Nests multiple empty lines under a preceding normal line`, () => {
const lines = [
'line 1',
'',
'',
'',
]
const lineData = LineData()
const results = lines.map(line => {
parseLine(line, lineData)
return {...lineData}
})
expect(results).to.deep.equal([
{ type: 1, level: 0 },
{ type: 0, level: 1 },
{ type: 0, level: 1 },
{ type: 0, level: 1 }
])
})
})