| 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' }), | |
| }, | |
| ], | |
| }); | |
| }); |