import { LegacyUnit } from '@ephox/mcagar';
import { Pipeline } from '@ephox/agar';
import SaxParser from 'tinymce/core/api/html/SaxParser';
import Writer from 'tinymce/core/api/html/Writer';
import Schema from 'tinymce/core/api/html/Schema';
import Tools from 'tinymce/core/api/util/Tools';
import { UnitTest } from '@ephox/bedrock';
UnitTest.asynctest('browser.tinymce.core.html.SaxParserTest', function () {
const success = arguments[arguments.length - 2];
const failure = arguments[arguments.length - 1];
const suite = LegacyUnit.createSuite();
const writer = Writer(), schema = Schema();
const createCounter = function (writer) {
const counts: any = {};
return {
counts,
comment (text) {
if ('comment' in counts) {
counts.comment++;
} else {
counts.comment = 1;
}
writer.comment(text);
},
cdata (text) {
if ('cdata' in counts) {
counts.cdata++;
} else {
counts.cdata = 1;
}
writer.cdata(text);
},
text (text, raw) {
if ('text' in counts) {
counts.text++;
} else {
counts.text = 1;
}
writer.text(text, raw);
},
start (name, attrs, empty) {
if ('start' in counts) {
counts.start++;
} else {
counts.start = 1;
}
writer.start(name, attrs, empty);
},
end (name) {
if ('end' in counts) {
counts.end++;
} else {
counts.end = 1;
}
writer.end(name);
},
pi (name, text) {
if ('pi' in counts) {
counts.pi++;
} else {
counts.pi = 1;
}
writer.pi(name, text);
},
doctype (text) {
if ('doctype:' in counts) {
counts.doctype++;
} else {
counts.doctype = 1;
}
writer.doctype(text);
}
};
};
suite.test('Parse elements', function () {
let counter, parser;
counter = createCounter(writer);
parser = SaxParser(counter, schema);
writer.reset();
parser.parse(
''
);
LegacyUnit.equal(
writer.getContent(),
'',
'Parse attribute formats.'
);
LegacyUnit.deepEqual(counter.counts, { start: 1, end: 1 }, 'Parse attribute formats counts.');
counter = createCounter(writer);
parser = SaxParser(counter, schema);
writer.reset();
parser.parse('\'>');
LegacyUnit.equal(writer.getContent(), '', 'Parse attributes with <> in them.');
LegacyUnit.deepEqual(counter.counts, { start: 1, end: 1 }, 'Parse attributes with <> in them (count).');
counter = createCounter(writer);
parser = SaxParser(counter, schema);
writer.reset();
parser.parse('');
LegacyUnit.equal(writer.getContent(), '', 'Parse compressed attributes.');
LegacyUnit.deepEqual(counter.counts, { start: 1, end: 1 }, 'Parse compressed attributes (count).');
counter = createCounter(writer);
parser = SaxParser(counter, schema);
writer.reset();
parser.parse('');
LegacyUnit.equal(writer.getContent(), '', 'Single empty attribute.');
LegacyUnit.deepEqual(counter.counts, { start: 1, end: 1 }, 'Single empty attributes (count).');
counter = createCounter(writer);
parser = SaxParser(counter, schema);
writer.reset();
parser.parse('');
LegacyUnit.equal(writer.getContent(), '', 'Empty attribute at end.');
LegacyUnit.deepEqual(counter.counts, { start: 1, end: 1 }, 'Empty attribute at end (count).');
counter = createCounter(writer);
parser = SaxParser(counter, schema);
writer.reset();
parser.parse('');
LegacyUnit.equal(writer.getContent(), '', 'Empty attribute at start.');
LegacyUnit.deepEqual(counter.counts, { start: 1, end: 1 }, 'Empty attribute at start (count).');
counter = createCounter(writer);
parser = SaxParser(counter, schema);
writer.reset();
parser.parse('');
LegacyUnit.equal(writer.getContent(), '
', 'Parse empty element.');
LegacyUnit.deepEqual(counter.counts, { start: 1 }, 'Parse empty element counts.');
counter = createCounter(writer);
parser = SaxParser(counter, schema);
writer.reset();
parser.parse('
');
LegacyUnit.equal(writer.getContent(), '
', 'Parse attributes with linebreak.');
LegacyUnit.deepEqual(counter.counts, { start: 1 }, 'Parse attributes with linebreak counts.');
counter = createCounter(writer);
parser = SaxParser(counter, schema);
writer.reset();
parser.parse('
');
LegacyUnit.equal(writer.getContent(), '
', 'Parse attributes with whitespace.');
LegacyUnit.deepEqual(counter.counts, { start: 1 }, 'Parse attributes with whitespace counts.');
counter = createCounter(writer);
parser = SaxParser(counter, schema);
writer.reset();
parser.parse('
text2text3
text4text5'); LegacyUnit.equal(writer.getContent(), 'text1text2text3
text4text5', 'Parse tag soup 1.'); LegacyUnit.deepEqual(counter.counts, { text: 5, start: 2, end: 2 }, 'Parse tag soup 1 counts.'); counter = createCounter(writer); parser = SaxParser(counter, schema); writer.reset(); parser.parse('text1text2text3
text4text5'); LegacyUnit.equal(writer.getContent(), 'text1text2text3
text4text5', 'Parse tag soup 2.'); LegacyUnit.deepEqual(counter.counts, { text: 5, start: 2, end: 2 }, 'Parse tag soup 2 counts.'); counter = createCounter(writer); parser = SaxParser(counter, schema); writer.reset(); parser.parse('text1text2tex
text2tex<t3
te>xt4text5', 'Parse tag soup 3.'); LegacyUnit.deepEqual(counter.counts, { text: 5, start: 2, end: 2 }, 'Parse tag soup 3 counts.'); counter = createCounter(writer); parser = SaxParser(counter, schema); writer.reset(); parser.parse('text1text2text3'); LegacyUnit.equal(writer.getContent(), 'text1
text2text3
', 'Parse tag soup 4.'); LegacyUnit.deepEqual(counter.counts, { text: 3, start: 2, end: 2 }, 'Parse tag soup 4 counts.'); counter = createCounter(writer); parser = SaxParser(counter, schema); writer.reset(); parser.parse('text1' + '