sfm-js/test/main.ts

472 lines
9.4 KiB
TypeScript
Raw Normal View History

2021-03-20 15:37:59 +00:00
import assert from 'assert';
2021-03-26 16:39:54 +00:00
import { inspect, parse, parsePlain, toString } from '../built/index';
2021-03-20 15:37:59 +00:00
import { createNode } from '../built/util';
import {
2021-03-27 10:51:39 +00:00
TEXT, CENTER, FN, UNI_EMOJI, MENTION, CUSTOM_EMOJI, HASHTAG, N_URL, BOLD, SMALL, ITALIC, STRIKE, QUOTE, MATH_BLOCK, SEARCH, CODE_BLOCK
2021-03-20 15:37:59 +00:00
} from './node';
describe('text', () => {
it('basic', () => {
const input = 'abc';
const output = [TEXT('abc')];
assert.deepStrictEqual(parse(input), output);
});
});
2021-03-21 16:43:52 +00:00
2021-03-22 13:41:49 +00:00
describe('quote', () => {
it('single', () => {
const input = '> abc';
const output = [
QUOTE([
TEXT('abc')
])
];
assert.deepStrictEqual(parse(input), output);
});
it('multiple', () => {
const input = `
> abc
> 123
`;
const output = [
QUOTE([
TEXT('abc\n123')
2021-03-27 10:51:39 +00:00
])
2021-03-22 13:41:49 +00:00
];
assert.deepStrictEqual(parse(input), output);
});
it('with block (center)', () => {
const input = `
> <center>
> a
> </center>
`;
const output = [
QUOTE([
CENTER([
2021-03-27 10:51:39 +00:00
TEXT('a')
2021-03-22 13:41:49 +00:00
])
2021-03-27 10:51:39 +00:00
])
2021-03-22 13:41:49 +00:00
];
assert.deepStrictEqual(parse(input), output);
});
it('with block (center, mention)', () => {
const input = `
> <center>
> I'm @ai, An bot of misskey!
> </center>
`;
const output = [
QUOTE([
CENTER([
2021-03-27 10:51:39 +00:00
TEXT('I\'m '),
2021-03-22 13:41:49 +00:00
MENTION('ai', null, '@ai'),
2021-03-27 10:51:39 +00:00
TEXT(', An bot of misskey!'),
2021-03-22 13:41:49 +00:00
])
2021-03-27 10:51:39 +00:00
])
2021-03-22 13:41:49 +00:00
];
assert.deepStrictEqual(parse(input), output);
});
});
2021-03-27 10:51:39 +00:00
describe('search', () => {
describe('basic', () => {
it('Search', () => {
const input = 'MFM 書き方 123 Search';
const output = [
createNode('search', {
query: 'MFM 書き方 123',
content: input
})
];
assert.deepStrictEqual(parse(input), output);
});
it('[Search]', () => {
const input = 'MFM 書き方 123 [Search]';
const output = [
createNode('search', {
query: 'MFM 書き方 123',
content: input
})
];
assert.deepStrictEqual(parse(input), output);
});
it('search', () => {
const input = 'MFM 書き方 123 search';
const output = [
createNode('search', {
query: 'MFM 書き方 123',
content: input
})
];
assert.deepStrictEqual(parse(input), output);
});
it('[search]', () => {
const input = 'MFM 書き方 123 [search]';
const output = [
createNode('search', {
query: 'MFM 書き方 123',
content: input
})
];
assert.deepStrictEqual(parse(input), output);
});
it('検索', () => {
const input = 'MFM 書き方 123 検索';
const output = [
createNode('search', {
query: 'MFM 書き方 123',
content: input
})
];
assert.deepStrictEqual(parse(input), output);
});
it('[検索]', () => {
const input = 'MFM 書き方 123 [検索]';
const output = [
createNode('search', {
query: 'MFM 書き方 123',
content: input
})
];
assert.deepStrictEqual(parse(input), output);
});
});
it('with text', () => {
const input = 'abc\nhoge piyo bebeyo 検索\n123';
const output = [
TEXT('abc'),
SEARCH('hoge piyo bebeyo', 'hoge piyo bebeyo 検索'),
TEXT('123')
];
assert.deepStrictEqual(parse(input), output);
});
});
describe('code block', () => {
2021-03-21 16:43:52 +00:00
it('basic', () => {
2021-03-27 10:51:39 +00:00
const input = '```\nabc\n```';
const output = [CODE_BLOCK('abc', null)];
assert.deepStrictEqual(parse(input), output);
});
2021-03-27 11:34:53 +00:00
it('basic (lang)', () => {
const input = '```js\nconst a = 1;\n```';
const output = [CODE_BLOCK('const a = 1;', 'js')];
assert.deepStrictEqual(parse(input), output);
});
2021-03-27 10:51:39 +00:00
it('with text', () => {
const input = 'abc\n```\nconst abc = 1;\n```\n123';
2021-03-21 16:43:52 +00:00
const output = [
2021-03-27 10:51:39 +00:00
TEXT('abc'),
CODE_BLOCK('const abc = 1;', null),
TEXT('123')
];
assert.deepStrictEqual(parse(input), output);
});
});
describe('mathBlock', () => {
it('basic', () => {
const input = '123\n\\[math1\\]\nabc\n\\[math2\\]';
const output = [
TEXT('123'),
MATH_BLOCK('math1'),
TEXT('abc'),
MATH_BLOCK('math2')
];
assert.deepStrictEqual(parse(input), output);
});
it('case of no matched', () => {
const input = '\\[aaa\\]\\[bbb\\]';
const output = [
TEXT('\\[aaa\\]\\[bbb\\]')
];
assert.deepStrictEqual(parse(input), output);
});
});
describe('center', () => {
it('single text', () => {
const input = '<center>abc</center>';
const output = [
CENTER([
2021-03-21 16:43:52 +00:00
TEXT('abc')
])
];
assert.deepStrictEqual(parse(input), output);
});
2021-03-27 10:51:39 +00:00
it('multiple text', () => {
2021-03-27 11:34:53 +00:00
const input = 'before\n<center>\nabc\n123\n\npiyo\n</center>\nafter';
2021-03-27 10:51:39 +00:00
const output = [
2021-03-27 11:34:53 +00:00
TEXT('before'),
2021-03-27 10:51:39 +00:00
CENTER([
2021-03-27 11:34:53 +00:00
TEXT('abc\n123\n\npiyo')
]),
TEXT('after')
2021-03-27 10:51:39 +00:00
];
assert.deepStrictEqual(parse(input), output);
});
});
describe('custom emoji', () => {
it('basic', () => {
const input = ':abc:';
const output = [CUSTOM_EMOJI('abc')];
assert.deepStrictEqual(parse(input), output);
});
});
describe('unicode emoji', () => {
it('basic', () => {
const input = '今起きた😇';
const output = [TEXT('今起きた'), UNI_EMOJI('😇')];
assert.deepStrictEqual(parse(input), output);
});
2021-03-21 16:43:52 +00:00
});
describe('big', () => {
it('basic', () => {
const input = '***abc***';
const output = [
FN('tada', { }, [
TEXT('abc')
])
];
assert.deepStrictEqual(parse(input), output);
});
it('内容にはインライン構文を利用できる', () => {
const input = '***123**abc**123***';
const output = [
FN('tada', { }, [
TEXT('123'),
BOLD([
TEXT('abc')
]),
TEXT('123')
])
];
assert.deepStrictEqual(parse(input), output);
});
it('内容は改行できる', () => {
const input = '***123\n**abc**\n123***';
const output = [
FN('tada', { }, [
TEXT('123\n'),
BOLD([
TEXT('abc')
]),
TEXT('\n123')
])
];
assert.deepStrictEqual(parse(input), output);
});
});
describe('bold', () => {
it('basic', () => {
const input = '**abc**';
const output = [
BOLD([
TEXT('abc')
])
];
assert.deepStrictEqual(parse(input), output);
});
it('内容にはインライン構文を利用できる', () => {
const input = '**123~~abc~~123**';
const output = [
BOLD([
TEXT('123'),
STRIKE([
TEXT('abc')
]),
TEXT('123')
])
];
assert.deepStrictEqual(parse(input), output);
});
it('内容は改行できる', () => {
const input = '**123\n~~abc~~\n123**';
const output = [
BOLD([
TEXT('123\n'),
STRIKE([
TEXT('abc')
]),
TEXT('\n123')
])
];
assert.deepStrictEqual(parse(input), output);
});
});
describe('small', () => {
it('basic', () => {
const input = '<small>abc</small>';
const output = [
SMALL([
TEXT('abc')
])
];
assert.deepStrictEqual(parse(input), output);
});
it('内容にはインライン構文を利用できる', () => {
const input = '<small>abc**123**abc</small>';
const output = [
SMALL([
TEXT('abc'),
BOLD([
TEXT('123')
]),
TEXT('abc')
])
];
assert.deepStrictEqual(parse(input), output);
});
it('内容は改行できる', () => {
const input = '<small>abc\n**123**\nabc</small>';
const output = [
SMALL([
TEXT('abc\n'),
BOLD([
TEXT('123')
]),
TEXT('\nabc')
])
];
assert.deepStrictEqual(parse(input), output);
});
});
describe('italic 1', () => {
it('basic', () => {
const input = '<i>abc</i>';
const output = [
ITALIC([
TEXT('abc')
])
];
assert.deepStrictEqual(parse(input), output);
});
it('内容にはインライン構文を利用できる', () => {
const input = '<i>abc**123**abc</i>';
const output = [
ITALIC([
TEXT('abc'),
BOLD([
TEXT('123')
]),
TEXT('abc')
])
];
assert.deepStrictEqual(parse(input), output);
});
it('内容は改行できる', () => {
const input = '<i>abc\n**123**\nabc</i>';
const output = [
ITALIC([
TEXT('abc\n'),
BOLD([
TEXT('123')
]),
TEXT('\nabc')
])
];
assert.deepStrictEqual(parse(input), output);
});
});
describe('italic 2', () => {
it('basic', () => {
const input = '*abc*';
const output = [
ITALIC([
TEXT('abc')
])
];
assert.deepStrictEqual(parse(input), output);
});
});
2021-03-27 10:51:39 +00:00
// strike
2021-03-21 16:43:52 +00:00
2021-03-27 10:51:39 +00:00
// inlineCode
2021-03-20 15:37:59 +00:00
2021-03-27 10:51:39 +00:00
// mathInline
// mention
2021-03-20 15:37:59 +00:00
describe('hashtag', () => {
it('and unicode emoji', () => {
const input = '#⃣abc123#abc';
const output = [UNI_EMOJI('#️⃣'), TEXT('abc123'), HASHTAG('abc')];
assert.deepStrictEqual(parse(input), output);
});
});
describe('url', () => {
it('basic', () => {
const input = 'official instance: https://misskey.io/@ai.';
const output = [
TEXT('official instance: '),
N_URL('https://misskey.io/@ai'),
TEXT('.')
];
assert.deepStrictEqual(parse(input), output);
});
});
2021-03-27 10:51:39 +00:00
// link
2021-03-20 15:37:59 +00:00
2021-03-27 10:51:39 +00:00
describe('fn', () => {
it('basic', () => {
const input = '[tada abc]';
2021-03-20 15:37:59 +00:00
const output = [
2021-03-27 10:51:39 +00:00
FN('tada', { }, [
2021-03-20 15:37:59 +00:00
TEXT('abc')
])
];
assert.deepStrictEqual(parse(input), output);
});
});
it('composite', () => {
const input =
`<center>
Hello [tada everynyan! 🎉]
I'm @ai, A bot of misskey!
https://github.com/syuilo/ai
</center>`;
const output = [
CENTER([
2021-03-27 11:34:53 +00:00
TEXT('Hello '),
2021-03-20 15:37:59 +00:00
FN('tada', { }, [
TEXT('everynyan! '),
UNI_EMOJI('🎉')
]),
TEXT('\n\nI\'m '),
MENTION('ai', null, '@ai'),
TEXT(', A bot of misskey!\n\n'),
2021-03-27 11:34:53 +00:00
N_URL('https://github.com/syuilo/ai')
2021-03-20 15:37:59 +00:00
])
];
assert.deepStrictEqual(parse(input), output);
});
2021-03-26 16:39:54 +00:00
describe('inspect', () => {
it('replace text', () => {
const input = 'good morning [tada everynyan!]';
const result = parse(input);
inspect(result, node => {
if (node.type == 'text') {
node.props.text = node.props.text.replace(/good morning/g, 'hello');
}
});
assert.strictEqual(toString(result), 'hello [tada everynyan!]');
});
});