737 lines
14 KiB
TypeScript

import nameTokenizer from '../../src/parser/tokenizers/name.js';
import { seedTokens, seedSpec } from '../../src/util.js';
const tokenize = nameTokenizer();
test('single word', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({ description: 'param param description 0' }),
},
],
})
)
).toEqual(
seedSpec({
name: 'param',
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
name: 'param',
postName: ' ',
description: 'param description 0',
}),
},
],
})
);
});
test('dash-delimitered', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({ description: 'param-param description 0' }),
},
],
})
)
).toEqual(
seedSpec({
name: 'param-param',
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
name: 'param-param',
postName: ' ',
description: 'description 0',
}),
},
],
})
);
});
test('quoted', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({ description: '"param param" description 0' }),
},
],
})
)
).toEqual(
seedSpec({
name: 'param param',
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
name: '"param param"',
postName: ' ',
description: 'description 0',
}),
},
],
})
);
});
test('inconsistent quotes', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({ description: '"param param description 0' }),
},
],
})
)
).toEqual(
seedSpec({
name: '"param',
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
name: '"param',
postName: ' ',
description: 'param description 0',
}),
},
],
})
);
});
test('optional', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({ description: '[param] param description' }),
},
],
})
)
).toEqual(
seedSpec({
name: 'param',
optional: true,
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
name: '[param]',
postName: ' ',
description: 'param description',
}),
},
],
})
);
});
test('optional with default', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '[param=value] param description',
}),
},
],
})
)
).toEqual(
seedSpec({
name: 'param',
optional: true,
default: 'value',
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
name: '[param=value]',
postName: ' ',
description: 'param description',
}),
},
],
})
);
});
test('quoted default', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '[param="value"] param description',
}),
},
],
})
)
).toEqual(
seedSpec({
name: 'param',
optional: true,
default: '"value"',
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
name: '[param="value"]',
postName: ' ',
description: 'param description',
}),
},
],
})
);
});
test('loosely quoted default', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '[param="value] param description',
}),
},
],
})
)
).toEqual(
seedSpec({
name: 'param',
optional: true,
default: '"value',
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
name: '[param="value]',
postName: ' ',
description: 'param description',
}),
},
],
})
);
});
test('quoted default with =', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '[param="value=1"] param description',
}),
},
],
})
)
).toEqual(
seedSpec({
name: 'param',
optional: true,
default: '"value=1"',
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
name: '[param="value=1"]',
postName: ' ',
description: 'param description',
}),
},
],
})
);
});
test('non-alphanumeric', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '$param description',
}),
},
],
})
)
).toEqual(
seedSpec({
name: '$param',
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
name: '$param',
postName: ' ',
description: 'description',
}),
},
],
})
);
});
test('spread notation', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '...params description',
}),
},
],
})
)
).toEqual(
seedSpec({
name: '...params',
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
name: '...params',
postName: ' ',
description: 'description',
}),
},
],
})
);
});
test('optionsl spread notation', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '[...params] description',
}),
},
],
})
)
).toEqual(
seedSpec({
name: '...params',
optional: true,
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
name: '[...params]',
postName: ' ',
description: 'description',
}),
},
],
})
);
});
test('optional multiple words', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '[param name] param description',
}),
},
],
})
)
).toEqual(
seedSpec({
name: 'param name',
optional: true,
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
name: '[param name]',
postName: ' ',
description: 'param description',
}),
},
],
})
);
});
test('name spacing', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '[ param = value ] param description',
}),
},
],
})
)
).toEqual(
seedSpec({
name: 'param',
optional: true,
default: 'value',
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
name: '[ param = value ]',
postName: ' ',
description: 'param description',
}),
},
],
})
);
});
test('inconsistent brackets', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '[param param description',
}),
},
],
})
)
).toEqual(
seedSpec({
problems: [
{
code: 'spec:name:unpaired-brackets',
line: 1,
critical: true,
message: 'unpaired brackets',
},
],
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '[param param description',
}),
},
],
})
);
});
test('empty name', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '[=value] param description',
}),
},
],
})
)
).toEqual(
seedSpec({
problems: [
{
code: 'spec:name:empty-name',
line: 1,
critical: true,
message: 'empty name',
},
],
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '[=value] param description',
}),
},
],
})
);
});
test('empty default value', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '[param=] param description',
}),
},
],
})
)
).toEqual(
seedSpec({
problems: [
{
code: 'spec:name:empty-default',
line: 1,
critical: true,
message: 'empty default value',
},
],
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '[param=] param description',
}),
},
],
})
);
});
test('empty', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '[] param description',
}),
},
],
})
)
).toEqual(
seedSpec({
problems: [
{
code: 'spec:name:empty-name',
line: 1,
critical: true,
message: 'empty name',
},
],
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '[] param description',
}),
},
],
})
);
});
test('default value syntax', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '[param=value=value] param description',
}),
},
],
})
)
).toEqual(
seedSpec({
problems: [
{
code: 'spec:name:invalid-default',
line: 1,
critical: true,
message: 'invalid default value syntax',
},
],
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '[param=value=value] param description',
}),
},
],
})
);
});
test('default with arrow', () => {
expect(
tokenize(
seedSpec({
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
description: '[param = value => value] param description',
}),
},
],
})
)
).toEqual(
seedSpec({
name: 'param',
optional: true,
default: 'value => value',
source: [
{
number: 1,
source: '...',
tokens: seedTokens({
name: '[param = value => value]',
postName: ' ',
description: 'param description',
}),
},
],
})
);
});
test('after multiline {type}', () => {
const sourceIn = [
{
number: 0,
source: '...',
tokens: seedTokens({
tag: '@aram',
postTag: ' ',
type: '{function(',
}),
},
{
number: 1,
source: '...',
tokens: seedTokens({ type: ' number' }),
},
{
number: 2,
source: '...',
tokens: seedTokens({
type: ')}',
postType: ' ',
description: 'paramname description text',
}),
},
];
const sourceOut = JSON.parse(JSON.stringify(sourceIn));
Object.assign(sourceOut[2].tokens, {
name: 'paramname',
postName: ' ',
description: 'description text',
});
expect(tokenize(seedSpec({ source: sourceIn }))).toEqual(
seedSpec({
name: 'paramname',
source: sourceOut,
})
);
});