166 lines
4.2 KiB
TypeScript

import align from '../../src/transforms/align.js';
import getParser, { Parser } from '../../src/parser/index.js';
import getStringifier, { Stringifier } from '../../src/stringifier/index.js';
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);
});