| import align from '../../src/transforms/align'; |
| import getParser, { Parser } from '../../src/parser/index'; |
| import getStringifier, { Stringifier } from '../../src/stringifier/index'; |
| |
| let parse: Parser; |
| let stringify: Stringifier; |
| |
| beforeEach(() => { |
| parse = getParser(); |
| stringify = getStringifier(); |
| }); |
| |
| test('multiline', () => { |
| const source = ` |
| /** |
| * Description may go |
| * over multiple lines followed by @tags |
| * |
| * @some-tag {some-type} some-name description line 1 |
| * @another-tag {another-type} another-name description line 1 |
| description line 2 |
| * description line 3 |
| */`; |
| |
| const expected = ` |
| /** |
| * Description may go |
| * over multiple lines followed by @tags |
| * |
| * @some-tag {some-type} some-name description line 1 |
| * @another-tag {another-type} another-name description line 1 |
| description line 2 |
| * description line 3 |
| */`.slice(1); |
| |
| const parsed = parse(source); |
| const aligned = align()(parsed[0]); |
| const out = stringify(aligned); |
| |
| // console.log(inspect(aligned)); |
| expect(out).toBe(expected); |
| }); |
| |
| test('one-liner', () => { |
| const source = ` /** @tag {type} name description */`; |
| const parsed = parse(source); |
| const out = stringify(align()(parsed[0])); |
| |
| expect(out).toBe(source); |
| }); |
| |
| test('same line open', () => { |
| const source = ` |
| /** @tag {type} name description |
| */`.slice(1); |
| const parsed = parse(source); |
| const out = stringify(align()(parsed[0])); |
| |
| expect(out).toBe(source); |
| }); |
| |
| test('same line close', () => { |
| const source = ` |
| /** |
| * @tag {type} name description */`; |
| |
| const expected = ` |
| /** |
| * @tag {type} name description */`.slice(1); |
| |
| const parsed = parse(source); |
| const aligned = align()(parsed[0]); |
| const out = stringify(aligned); |
| |
| expect(out).toBe(expected); |
| }); |
| |
| test('spec source referencing', () => { |
| const parsed = parse(`/** @tag {type} name Description */`); |
| const block = align()(parsed[0]); |
| expect(block.tags[0].source[0] === block.source[0]).toBe(true); |
| }); |
| |
| test('block source clonning', () => { |
| const parsed = parse(`/** @tag {type} name Description */`); |
| const block = align()(parsed[0]); |
| parsed[0].source[0].tokens.description = 'test'; |
| expect(block.source[0].tokens.description).toBe('Description '); |
| }); |
| |
| test('ignore right whitespace', () => { |
| const source = ` |
| /** |
| * Description may go |
| * over multiple lines followed by @tags |
| * @private |
| * @param {string} name |
| * @param {any} value the value parameter |
| * |
| */`.slice(1); |
| |
| const expected = ` |
| /** |
| * Description may go |
| * over multiple lines followed by @tags |
| * @private |
| * @param {string} name |
| * @param {any} value the value parameter |
| * |
| */`.slice(1); |
| |
| const parsed = parse(source); |
| const aligned = align()(parsed[0]); |
| const stringified = stringify(aligned); |
| |
| expect(stringified).toEqual(expected); |
| }); |
| |
| test('collapse postDelimiter', () => { |
| const source = ` |
| /** |
| * Description may go |
| * over multiple lines followed by @tags |
| * @param {string} name the name parameter |
| * @param {any} value the value parameter |
| */`.slice(1); |
| |
| const expected = ` |
| /** |
| * Description may go |
| * over multiple lines followed by @tags |
| * @param {string} name the name parameter |
| * @param {any} value the value parameter |
| */`.slice(1); |
| |
| const parsed = parse(source); |
| const aligned = align()(parsed[0]); |
| const stringified = stringify(aligned); |
| |
| expect(stringified).toEqual(expected); |
| }); |
| |
| test('keep carriage returns', () => { |
| const source = ` |
| /**\r\r |
| * Description may go\r |
| * over multiple lines followed by @tags\r |
| * @param {string} name the name parameter\r |
| * @param {any} value\r |
| */\r`.slice(1); |
| |
| const expected = ` |
| /**\r\r |
| * Description may go\r |
| * over multiple lines followed by @tags\r |
| * @param {string} name the name parameter\r |
| * @param {any} value\r |
| */\r`.slice(1); |
| |
| const parsed = parse(source); |
| const aligned = align()(parsed[0]); |
| const stringified = stringify(aligned); |
| |
| expect(stringified).toEqual(expected); |
| }); |