mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-10 21:28:31 +00:00
247 lines
6.9 KiB
JavaScript
247 lines
6.9 KiB
JavaScript
import { describe, expect, it } from 'vitest';
|
|
import { getMetadata } from '../website/src/metadata_parser';
|
|
|
|
describe.concurrent('Metadata parser', () => {
|
|
it('loads a tag from inline comment', async () => {
|
|
const tune = `// @title Awesome song`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
title: 'Awesome song',
|
|
});
|
|
});
|
|
|
|
it('loads many tags from inline comments', async () => {
|
|
const tune = `// @title Awesome song
|
|
// @by Sam`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
title: 'Awesome song',
|
|
by: ['Sam'],
|
|
});
|
|
});
|
|
|
|
it('loads many tags from one inline comment', async () => {
|
|
const tune = `// @title Awesome song @by Sam`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
title: 'Awesome song',
|
|
by: ['Sam'],
|
|
});
|
|
});
|
|
|
|
it('loads a tag from a block comment', async () => {
|
|
const tune = `/* @title Awesome song */`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
title: 'Awesome song',
|
|
});
|
|
});
|
|
|
|
it('loads many tags from a block comment', async () => {
|
|
const tune = `/*
|
|
@title Awesome song
|
|
@by Sam
|
|
*/`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
title: 'Awesome song',
|
|
by: ['Sam'],
|
|
});
|
|
});
|
|
|
|
it('loads many tags from many block comments', async () => {
|
|
const tune = `/* @title Awesome song */
|
|
/* @by Sam */`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
title: 'Awesome song',
|
|
by: ['Sam'],
|
|
});
|
|
});
|
|
|
|
it('loads many tags from mixed comments', async () => {
|
|
const tune = `/* @title Awesome song */
|
|
// @by Sam
|
|
`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
title: 'Awesome song',
|
|
by: ['Sam'],
|
|
});
|
|
});
|
|
|
|
it('loads a title tag with quotes syntax', async () => {
|
|
const tune = `// "Awesome song"`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
title: 'Awesome song',
|
|
});
|
|
});
|
|
|
|
it('loads a title tag with quotes syntax among other tags', async () => {
|
|
const tune = `// "Awesome song" made @by Sam`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
title: 'Awesome song',
|
|
by: ['Sam'],
|
|
});
|
|
});
|
|
|
|
it('loads a title tag with quotes syntax from block comment', async () => {
|
|
const tune = `/* "Awesome song"
|
|
@by Sam */`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
title: 'Awesome song',
|
|
by: ['Sam'],
|
|
});
|
|
});
|
|
|
|
it('does not load a title tag with quotes syntax after a prefix', async () => {
|
|
const tune = `// I don't care about those "metadata".`;
|
|
expect(getMetadata(tune)).toStrictEqual({});
|
|
});
|
|
|
|
it('does not load a title tag with quotes syntax after an other comment', async () => {
|
|
const tune = `// I don't care about those
|
|
// "metadata"`;
|
|
expect(getMetadata(tune)).toStrictEqual({});
|
|
});
|
|
|
|
it('does not load a title tag with quotes syntax after other tags', async () => {
|
|
const tune = `/*
|
|
@by Sam aka "Lady Strudel"
|
|
"Sandyyy"
|
|
*/`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
by: ['Sam aka "Lady Strudel"', '"Sandyyy"'],
|
|
});
|
|
});
|
|
|
|
it('loads a tag list with comma-separated values syntax', async () => {
|
|
const tune = `// @by Sam, Sandy`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
by: ['Sam', 'Sandy'],
|
|
});
|
|
});
|
|
|
|
it('loads a tag list with duplicate keys syntax', async () => {
|
|
const tune = `// @by Sam
|
|
// @by Sandy`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
by: ['Sam', 'Sandy'],
|
|
});
|
|
});
|
|
|
|
it('loads a tag list with duplicate keys syntax, with prefixes', async () => {
|
|
const tune = `// song @by Sam
|
|
// samples @by Sandy`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
by: ['Sam', 'Sandy'],
|
|
});
|
|
});
|
|
|
|
it('loads many tag lists with duplicate keys syntax, within code', async () => {
|
|
const tune = `note("a3 c#4 e4 a4") // @by Sam @license CC0
|
|
s("bd hh sd hh") // @by Sandy @license CC BY-NC-SA`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
by: ['Sam', 'Sandy'],
|
|
license: ['CC0', 'CC BY-NC-SA'],
|
|
});
|
|
});
|
|
|
|
it('loads a tag list with duplicate keys syntax from block comment', async () => {
|
|
const tune = `/* @by Sam
|
|
@by Sandy */`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
by: ['Sam', 'Sandy'],
|
|
});
|
|
});
|
|
|
|
it('loads a tag list with newline syntax', async () => {
|
|
const tune = `/*
|
|
@by Sam
|
|
Sandy */`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
by: ['Sam', 'Sandy'],
|
|
});
|
|
});
|
|
|
|
it('loads a multiline tag from block comment', async () => {
|
|
const tune = `/*
|
|
@details I wrote this song in February 19th, 2023.
|
|
It was around midnight and I was lying on
|
|
the sofa in the living room.
|
|
*/`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
details:
|
|
'I wrote this song in February 19th, 2023. ' +
|
|
'It was around midnight and I was lying on the sofa in the living room.',
|
|
});
|
|
});
|
|
|
|
it('loads a multiline tag from block comment with duplicate keys', async () => {
|
|
const tune = `/*
|
|
@details I wrote this song in February 19th, 2023.
|
|
@details It was around midnight and I was lying on
|
|
the sofa in the living room.
|
|
*/`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
details:
|
|
'I wrote this song in February 19th, 2023. ' +
|
|
'It was around midnight and I was lying on the sofa in the living room.',
|
|
});
|
|
});
|
|
|
|
it('loads a multiline tag from inline comments', async () => {
|
|
const tune = `// @details I wrote this song in February 19th, 2023.
|
|
// @details It was around midnight and I was lying on
|
|
// @details the sofa in the living room.
|
|
*/`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
details:
|
|
'I wrote this song in February 19th, 2023. ' +
|
|
'It was around midnight and I was lying on the sofa in the living room.',
|
|
});
|
|
});
|
|
|
|
it('loads empty tags from inline comments', async () => {
|
|
const tune = `// @title
|
|
// @by`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
title: '',
|
|
by: [],
|
|
});
|
|
});
|
|
|
|
it('loads tags with whitespaces from inline comments', async () => {
|
|
const tune = ` // @title Awesome song
|
|
// @by Sam Tagada `;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
title: 'Awesome song',
|
|
by: ['Sam Tagada'],
|
|
});
|
|
});
|
|
|
|
it('loads tags with whitespaces from block comment', async () => {
|
|
const tune = ` /* @title Awesome song
|
|
@by Sam Tagada */ `;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
title: 'Awesome song',
|
|
by: ['Sam Tagada'],
|
|
});
|
|
});
|
|
|
|
it('loads empty tags from block comment', async () => {
|
|
const tune = `/* @title
|
|
@by */`;
|
|
expect(getMetadata(tune)).toStrictEqual({
|
|
title: '',
|
|
by: [],
|
|
});
|
|
});
|
|
|
|
it('does not load tags if there is not', async () => {
|
|
const tune = `note("a3 c#4 e4 a4")`;
|
|
expect(getMetadata(tune)).toStrictEqual({});
|
|
});
|
|
|
|
it('does not load code that looks like a metadata tag', async () => {
|
|
const tune = `const str1 = '@title Awesome song'`;
|
|
// need a lexer to avoid this one, but it's a pretty rare use case:
|
|
// const tune = `const str1 = '// @title Awesome song'`;
|
|
|
|
expect(getMetadata(tune)).toStrictEqual({});
|
|
});
|
|
});
|