439 lines
8.5 KiB
TypeScript

import getParser, { Parser } from '../../src/parser/source-parser.js';
import { Line } from '../../src/primitives.js';
import { splitLines, seedBlock, seedTokens } from '../../src/util.js';
let _parse: Parser;
const nulls = (n: number): null[] => Array(n).fill(null);
const parse = (source: string): Array<Line[] | null> =>
splitLines(source).map(_parse);
beforeEach(() => {
_parse = getParser();
});
test('multi-line block', () => {
const parsed = parse(`
/**
* description 0
*
* description 1
*
* @param {string} value value description 0
\`\`\`
@sample code
\`\`\`
* description 1
*/`);
const block = [
{
number: 1,
source: ' /**',
tokens: seedTokens({
start: ' ',
delimiter: '/**',
postDelimiter: '',
description: '',
end: '',
}),
},
{
number: 2,
source: ' * description 0',
tokens: seedTokens({
start: ' ',
delimiter: '*',
postDelimiter: ' ',
description: 'description 0',
end: '',
}),
},
{
number: 3,
source: ' *',
tokens: seedTokens({
start: ' ',
delimiter: '*',
postDelimiter: '',
description: '',
end: '',
}),
},
{
number: 4,
source: ' * description 1',
tokens: seedTokens({
start: ' ',
delimiter: '*',
postDelimiter: ' ',
description: 'description 1',
end: '',
}),
},
{
number: 5,
source: ' *',
tokens: seedTokens({
start: ' ',
delimiter: '*',
postDelimiter: '',
description: '',
end: '',
}),
},
{
number: 6,
source: ' * @param {string} value value description 0',
tokens: seedTokens({
start: ' ',
delimiter: '*',
postDelimiter: ' ',
description: '@param {string} value value description 0',
end: '',
}),
},
{
number: 7,
source: ' ```',
tokens: seedTokens({
start: ' ',
delimiter: '',
postDelimiter: '',
description: '```',
end: '',
}),
},
{
number: 8,
source: ' @sample code',
tokens: seedTokens({
start: ' ',
delimiter: '',
postDelimiter: '',
description: '@sample code',
end: '',
}),
},
{
number: 9,
source: ' ```',
tokens: seedTokens({
start: ' ',
delimiter: '',
postDelimiter: '',
description: '```',
end: '',
}),
},
{
number: 10,
source: ' * description 1',
tokens: seedTokens({
start: ' ',
delimiter: '*',
postDelimiter: ' ',
description: 'description 1',
end: '',
}),
},
{
number: 11,
source: ' */',
tokens: seedTokens({
start: ' ',
delimiter: '',
postDelimiter: '',
description: '',
end: '*/',
}),
},
];
expect(parsed).toEqual([...nulls(11), block]);
});
test('one-line block', () => {
const parsed = parse(`
/** description */
`);
const block = [
{
number: 1,
source: ' /** description */',
tokens: seedTokens({
start: ' ',
delimiter: '/**',
postDelimiter: ' ',
description: 'description ',
end: '*/',
}),
},
];
expect(parsed).toEqual([null, block, null]);
});
test('multiple blocks', () => {
const parsed = parse(`
/** description 0 */
/** description 1 */
`);
const block0 = [
{
number: 1,
source: ' /** description 0 */',
tokens: seedTokens({
start: ' ',
delimiter: '/**',
postDelimiter: ' ',
description: 'description 0 ',
end: '*/',
}),
},
];
const block1 = [
{
number: 3,
source: ' /** description 1 */',
tokens: seedTokens({
start: ' ',
delimiter: '/**',
postDelimiter: ' ',
description: 'description 1 ',
end: '*/',
}),
},
];
expect(parsed).toEqual([null, block0, null, block1, null]);
});
test('start line number', () => {
const source = splitLines(`
/** description */`);
const parsed = source.map(getParser({ startLine: 5 }));
const block = [
{
number: 6,
source: ' /** description */',
tokens: seedTokens({
start: ' ',
delimiter: '/**',
postDelimiter: ' ',
description: 'description ',
end: '*/',
}),
},
];
expect(parsed).toEqual([null, block]);
});
test('carriage returns', () => {
const source = splitLines(
['/**', ' * description', ' *', ' */', ''].join('\r\n')
);
const parse = getParser();
const parsed = source.map(parse);
const block = [
{
number: 0,
source: '/**\r',
tokens: seedTokens({
delimiter: '/**',
lineEnd: '\r',
}),
},
{
number: 1,
source: ' * description\r',
tokens: seedTokens({
start: ' ',
delimiter: '*',
postDelimiter: ' ',
description: 'description',
lineEnd: '\r',
}),
},
{
number: 2,
source: ' *\r',
tokens: seedTokens({
start: ' ',
delimiter: '*',
lineEnd: '\r',
}),
},
{
number: 3,
source: ' */\r',
tokens: seedTokens({
start: ' ',
end: '*/',
lineEnd: '\r',
}),
},
];
expect(parsed).toEqual([...nulls(3), block, null]);
});
test('custom markers', () => {
_parse = getParser({
markers: {
start: '////',
nostart: '// ',
delim: '///',
end: '////',
},
});
const parsed = parse(`
////
/// description 0
///
/// description 1
///
/// @param {string} value value description 0
\`\`\`
@sample code
\`\`\`
/// description 1
////`);
const block = [
{
number: 1,
source: ' ////',
tokens: seedTokens({
start: ' ',
delimiter: '////',
postDelimiter: '',
description: '',
end: '',
}),
},
{
number: 2,
source: ' /// description 0',
tokens: seedTokens({
start: ' ',
delimiter: '///',
postDelimiter: ' ',
description: 'description 0',
end: '',
}),
},
{
number: 3,
source: ' ///',
tokens: seedTokens({
start: ' ',
delimiter: '///',
postDelimiter: '',
description: '',
end: '',
}),
},
{
number: 4,
source: ' /// description 1',
tokens: seedTokens({
start: ' ',
delimiter: '///',
postDelimiter: ' ',
description: 'description 1',
end: '',
}),
},
{
number: 5,
source: ' ///',
tokens: seedTokens({
start: ' ',
delimiter: '///',
postDelimiter: '',
description: '',
end: '',
}),
},
{
number: 6,
source: ' /// @param {string} value value description 0',
tokens: seedTokens({
start: ' ',
delimiter: '///',
postDelimiter: ' ',
description: '@param {string} value value description 0',
end: '',
}),
},
{
number: 7,
source: ' ```',
tokens: seedTokens({
start: ' ',
delimiter: '',
postDelimiter: '',
description: '```',
end: '',
}),
},
{
number: 8,
source: ' @sample code',
tokens: seedTokens({
start: ' ',
delimiter: '',
postDelimiter: '',
description: '@sample code',
end: '',
}),
},
{
number: 9,
source: ' ```',
tokens: seedTokens({
start: ' ',
delimiter: '',
postDelimiter: '',
description: '```',
end: '',
}),
},
{
number: 10,
source: ' /// description 1',
tokens: seedTokens({
start: ' ',
delimiter: '///',
postDelimiter: ' ',
description: 'description 1',
end: '',
}),
},
{
number: 11,
source: ' ////',
tokens: seedTokens({
start: ' ',
delimiter: '',
postDelimiter: '',
description: '',
end: '////',
}),
},
];
expect(parsed).toEqual([...nulls(11), block]);
});