439 lines
8.5 KiB
TypeScript
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]);
|
|
});
|