import { autolink } from '../autolink';
import { some } from '../../../combinator';
import { input } from '../../context';
import { inspect } from '../../../debug.test';
describe('Unit: parser/inline/autolink/url', () => {
describe('url', () => {
const parser: typeof autolink = (input, output) => some(autolink)((++input.position, input), output);
it('invalid', () => {
//assert.deepStrictEqual(inspect(parser, input('')), undefined);
assert.deepStrictEqual(inspect(parser, input(' ')), undefined);
assert.deepStrictEqual(inspect(parser, input(' http')), undefined);
assert.deepStrictEqual(inspect(parser, input(' http://')), undefined);
assert.deepStrictEqual(inspect(parser, input(' http://[')), undefined);
assert.deepStrictEqual(inspect(parser, input(' http://]')), undefined);
assert.deepStrictEqual(inspect(parser, input(' Http://host')), undefined);
assert.deepStrictEqual(inspect(parser, input(' http://[::ffff:0:0%1]')), [['http://[::ffff:0:0%1]'], '']);
assert.deepStrictEqual(inspect(parser, input(' http://[::ffff:0:0/96]')), [['http://[::ffff:0:0/96]'], '']);
});
it('basic', () => {
assert.deepStrictEqual(inspect(parser, input(' http://a')), [['http://a'], '']);
assert.deepStrictEqual(inspect(parser, input(' http://a/')), [['http://a/'], '']);
assert.deepStrictEqual(inspect(parser, input(' http://a:80')), [['http://a:80'], '']);
assert.deepStrictEqual(inspect(parser, input(' http://a.b')), [['http://a.b'], '']);
assert.deepStrictEqual(inspect(parser, input(` http://a?#${encodeURIComponent(':/[]()<>?#=& ')}`)), [['http://a?#%3A%2F[]()<>%3F%23%3D%26%20'], '']);
assert.deepStrictEqual(inspect(parser, input(' http://a#()')), [['http://a#()'], '']);
assert.deepStrictEqual(inspect(parser, input(' http://a#( )')), [['http://a#'], '( )']);
assert.deepStrictEqual(inspect(parser, input(' http://a#(\n)')), [['http://a#'], '(\n)']);
assert.deepStrictEqual(inspect(parser, input(' http://[::]')), [['http://[::]'], '']);
assert.deepStrictEqual(inspect(parser, input('\rhttp://a#\\')), [['http://a#\\'], '']);
assert.deepStrictEqual(inspect(parser, input('\nhttp://a#\\')), [['http://a#\\'], '']);
});
it('trailing symbols', () => {
assert.deepStrictEqual(inspect(parser, input(' http://host ')), [['http://host'], ' ']);
assert.deepStrictEqual(inspect(parser, input(' http://host\n')), [['http://host'], '\n']);
assert.deepStrictEqual(inspect(parser, input(' http://host\\')), [['http://host'], '\\']);
assert.deepStrictEqual(inspect(parser, input(' http://host\\a')), [['http://host'], '\\a']);
assert.deepStrictEqual(inspect(parser, input(' http://host\\ ')), [['http://host'], '\\ ']);
assert.deepStrictEqual(inspect(parser, input(' http://host\\\n')), [['http://host'], '\\\n']);
assert.deepStrictEqual(inspect(parser, input(' http://host. ')), [['http://host'], '. ']);
assert.deepStrictEqual(inspect(parser, input(' http://host.\n')), [['http://host'], '.\n']);
assert.deepStrictEqual(inspect(parser, input(' http://host.\\')), [['http://host'], '.\\']);
assert.deepStrictEqual(inspect(parser, input(' http://host.\\ ')), [['http://host'], '.\\ ']);
assert.deepStrictEqual(inspect(parser, input(' http://host.\\\n')), [['http://host'], '.\\\n']);
assert.deepStrictEqual(inspect(parser, input(' http://host,')), [['http://host'], ',']);
assert.deepStrictEqual(inspect(parser, input(' http://host;')), [['http://host'], ';']);
assert.deepStrictEqual(inspect(parser, input(' http://host.')), [['http://host'], '.']);
assert.deepStrictEqual(inspect(parser, input(' http://host:')), [['http://host'], ':']);
assert.deepStrictEqual(inspect(parser, input(' http://host!')), [['http://host'], '!']);
assert.deepStrictEqual(inspect(parser, input(' http://host?')), [['http://host'], '?']);
assert.deepStrictEqual(inspect(parser, input(' http://host+')), [['http://host'], '+']);
assert.deepStrictEqual(inspect(parser, input(' http://host-')), [['http://host'], '-']);
assert.deepStrictEqual(inspect(parser, input(' http://host*')), [['http://host'], '*']);
assert.deepStrictEqual(inspect(parser, input(' http://host=')), [['http://host'], '=']);
assert.deepStrictEqual(inspect(parser, input(' http://host~')), [['http://host'], '~']);
assert.deepStrictEqual(inspect(parser, input(' http://host^')), [['http://host'], '^']);
assert.deepStrictEqual(inspect(parser, input(' http://host_')), [['http://host'], '_']);
assert.deepStrictEqual(inspect(parser, input(' http://host/')), [['http://host/'], '']);
assert.deepStrictEqual(inspect(parser, input(' http://host//')), [['http://host//'], '']);
assert.deepStrictEqual(inspect(parser, input(' http://host///')), [['http://host'], '///']);
assert.deepStrictEqual(inspect(parser, input(` http://host'`)), [[`http://host'`], '']);
assert.deepStrictEqual(inspect(parser, input(' http://host"')), [['http://host'], '"']);
assert.deepStrictEqual(inspect(parser, input(' http://host`')), [['http://host'], '`']);
assert.deepStrictEqual(inspect(parser, input(' http://host|')), [['http://host'], '|']);
assert.deepStrictEqual(inspect(parser, input(' http://host&')), [['http://host&'], '']);
assert.deepStrictEqual(inspect(parser, input(' http://host$')), [['http://host'], '$']);
assert.deepStrictEqual(inspect(parser, input(' http://host#"$"')), [['http://host#'], '"$"']);
assert.deepStrictEqual(inspect(parser, input(' http://host#($)')), [['http://host#'], '($)']);
assert.deepStrictEqual(inspect(parser, input(' http://host#(($))')), [['http://host#'], '(($))']);
assert.deepStrictEqual(inspect(parser, input(' http://user@host')), [['http://user@host'], '']);
assert.deepStrictEqual(inspect(parser, input(' http://host#@')), [['http://host#@'], '']);
assert.deepStrictEqual(inspect(parser, input(' http://host[')), [['http://host'], '[']);
assert.deepStrictEqual(inspect(parser, input(' http://host]')), [['http://host'], ']']);
assert.deepStrictEqual(inspect(parser, input(' http://host(')), [['http://host'], '(']);
assert.deepStrictEqual(inspect(parser, input(' http://host)')), [['http://host'], ')']);
assert.deepStrictEqual(inspect(parser, input(' http://host{')), [['http://host'], '{']);
assert.deepStrictEqual(inspect(parser, input(' http://host}')), [['http://host'], '}']);
assert.deepStrictEqual(inspect(parser, input(' http://host<')), [['http://host'], '<']);
assert.deepStrictEqual(inspect(parser, input(' http://host>')), [['http://host'], '>']);
assert.deepStrictEqual(inspect(parser, input(' http://host(')), [['http://host'], '(']);
assert.deepStrictEqual(inspect(parser, input(' http://host)')), [['http://host'], ')']);
assert.deepStrictEqual(inspect(parser, input(` http://host${'+'.repeat(5e5)}`)), [['http://host'], '+'.repeat(5e5)]);
});
it('trailing entities', () => {
assert.deepStrictEqual(inspect(parser, input(' http://host?&hl;')), [['http://host?&hl'], ';']);
assert.deepStrictEqual(inspect(parser, input(' http://host?&hl;&hl;')), [['http://host?&hl;&hl'], ';']);
});
it('protocol', () => {
assert.deepStrictEqual(inspect(parser, input(' http://host')), [['http://host'], '']);
assert.deepStrictEqual(inspect(parser, input(' https://host')), [['https://host'], '']);
});
});
});