185 lines
3.8 KiB
TypeScript
185 lines
3.8 KiB
TypeScript
|
import descriptionTokenizer from '../../src/parser/tokenizers/description.js';
|
||
|
import nameTokenizer from '../../src/parser/tokenizers/name.js';
|
||
|
import tagTokenizer from '../../src/parser/tokenizers/tag.js';
|
||
|
import typeTokenizer from '../../src/parser/tokenizers/type.js';
|
||
|
import getParser from '../../src/parser/spec-parser.js';
|
||
|
import { seedTokens, seedSpec } from '../../src/util.js';
|
||
|
import { Spec, Problem } from '../../src/primitives.js';
|
||
|
|
||
|
const parse = getParser({
|
||
|
tokenizers: [
|
||
|
tagTokenizer(),
|
||
|
typeTokenizer(),
|
||
|
nameTokenizer(),
|
||
|
descriptionTokenizer(),
|
||
|
],
|
||
|
});
|
||
|
|
||
|
const tokenizer = (message: string, critical = false) => {
|
||
|
const problem: Problem = {
|
||
|
code: 'custom',
|
||
|
line: 1,
|
||
|
message,
|
||
|
critical,
|
||
|
};
|
||
|
return (spec: Spec) => ({
|
||
|
...spec,
|
||
|
problems: [...spec.problems, problem],
|
||
|
});
|
||
|
};
|
||
|
|
||
|
test('all tokens', () => {
|
||
|
const parsed = parse([
|
||
|
{
|
||
|
number: 1,
|
||
|
source: '...',
|
||
|
tokens: seedTokens({
|
||
|
description: '@param {type} [name=value] description',
|
||
|
}),
|
||
|
},
|
||
|
]);
|
||
|
expect(parsed).toEqual(
|
||
|
seedSpec({
|
||
|
tag: 'param',
|
||
|
type: 'type',
|
||
|
name: 'name',
|
||
|
default: 'value',
|
||
|
optional: true,
|
||
|
description: 'description',
|
||
|
source: [
|
||
|
{
|
||
|
number: 1,
|
||
|
source: '...',
|
||
|
tokens: seedTokens({
|
||
|
tag: '@param',
|
||
|
postTag: ' ',
|
||
|
type: '{type}',
|
||
|
postType: ' ',
|
||
|
name: '[name=value]',
|
||
|
postName: ' ',
|
||
|
description: 'description',
|
||
|
}),
|
||
|
},
|
||
|
],
|
||
|
})
|
||
|
);
|
||
|
});
|
||
|
|
||
|
test('quotes in description', () => {
|
||
|
const parsed = parse([
|
||
|
{
|
||
|
number: 1,
|
||
|
source: '...',
|
||
|
tokens: seedTokens({
|
||
|
description:
|
||
|
'@param {type} [name=value] description with "quoted" word',
|
||
|
}),
|
||
|
},
|
||
|
]);
|
||
|
expect(parsed).toEqual(
|
||
|
seedSpec({
|
||
|
tag: 'param',
|
||
|
type: 'type',
|
||
|
name: 'name',
|
||
|
default: 'value',
|
||
|
optional: true,
|
||
|
description: 'description with "quoted" word',
|
||
|
source: [
|
||
|
{
|
||
|
number: 1,
|
||
|
source: '...',
|
||
|
tokens: seedTokens({
|
||
|
tag: '@param',
|
||
|
postTag: ' ',
|
||
|
type: '{type}',
|
||
|
postType: ' ',
|
||
|
name: '[name=value]',
|
||
|
postName: ' ',
|
||
|
description: 'description with "quoted" word',
|
||
|
}),
|
||
|
},
|
||
|
],
|
||
|
})
|
||
|
);
|
||
|
});
|
||
|
|
||
|
test('collect non-critical errors', () => {
|
||
|
const parse = getParser({
|
||
|
tokenizers: [tokenizer('warning 1'), tokenizer('warning 2')],
|
||
|
});
|
||
|
|
||
|
const parsed = parse([
|
||
|
{
|
||
|
number: 1,
|
||
|
source: '...',
|
||
|
tokens: seedTokens({ description: 'description' }),
|
||
|
},
|
||
|
]);
|
||
|
|
||
|
expect(parsed).toEqual({
|
||
|
tag: '',
|
||
|
name: '',
|
||
|
optional: false,
|
||
|
type: '',
|
||
|
description: '',
|
||
|
problems: [
|
||
|
{
|
||
|
code: 'custom',
|
||
|
line: 1,
|
||
|
message: 'warning 1',
|
||
|
critical: false,
|
||
|
},
|
||
|
{
|
||
|
code: 'custom',
|
||
|
line: 1,
|
||
|
message: 'warning 2',
|
||
|
critical: false,
|
||
|
},
|
||
|
],
|
||
|
source: [
|
||
|
{
|
||
|
number: 1,
|
||
|
source: '...',
|
||
|
tokens: seedTokens({ description: 'description' }),
|
||
|
},
|
||
|
],
|
||
|
});
|
||
|
});
|
||
|
|
||
|
test('stop on critical error', () => {
|
||
|
const parse = getParser({
|
||
|
tokenizers: [tokenizer('error 1', true), tokenizer('warning 2')],
|
||
|
});
|
||
|
|
||
|
const parsed = parse([
|
||
|
{
|
||
|
number: 1,
|
||
|
source: '...',
|
||
|
tokens: seedTokens({ description: 'description' }),
|
||
|
},
|
||
|
]);
|
||
|
|
||
|
expect(parsed).toEqual({
|
||
|
tag: '',
|
||
|
name: '',
|
||
|
optional: false,
|
||
|
type: '',
|
||
|
description: '',
|
||
|
problems: [
|
||
|
{
|
||
|
code: 'custom',
|
||
|
line: 1,
|
||
|
message: 'error 1',
|
||
|
critical: true,
|
||
|
},
|
||
|
],
|
||
|
source: [
|
||
|
{
|
||
|
number: 1,
|
||
|
source: '...',
|
||
|
tokens: seedTokens({ description: 'description' }),
|
||
|
},
|
||
|
],
|
||
|
});
|
||
|
});
|