X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/0ee14b1c718895bbc4034df7f6f35c0eabf06838..95c5dcadaaa2aabdeb0bfa3d0987450c0e63dae3:/src/smartxml/smartxml.test.js?ds=sidebyside diff --git a/src/smartxml/smartxml.test.js b/src/smartxml/smartxml.test.js index 542237a..cbef963 100644 --- a/src/smartxml/smartxml.test.js +++ b/src/smartxml/smartxml.test.js @@ -644,6 +644,176 @@ describe('smartxml', function() { }); + var getTextNodes = function(text, doc) { + /* globals Node */ + var toret = []; + var search = function(node) { + node.contents().forEach(function(node) { + if(node.nodeType === Node.TEXT_NODE) { + if(node.getText() === text) { + toret.push(node); + } + } else { + search(node); + } + }); + }; + search(doc.root); + return toret; + }; + + var getTextNode = function(text, doc) { + var nodes = getTextNodes(text, doc), + error; + if(nodes.length === 0) { + error = 'Text not found'; + } else if(nodes.length > 1) { + error = 'Text not unique'; + } else if(nodes[0].getText() !== text) { + error = 'I was trying to cheat your test :('; + } + if(error) { + throw new Error(error); + } + return nodes[0]; + }; + + describe('Removing arbitrary text', function() { + it('removes within single text element', function() { + var doc = getDocumentFromXML('
Alice
'), + text = getTextNode('Alice', doc); + doc.deleteText({ + from: { + node: text, + offset: 1 + }, + to: { + node: text, + offset: 4 + } + }); + expect(doc.root.contents().length).to.equal(1); + expect(doc.root.contents()[0].getText()).to.equal('Ae'); + }); + it('removes across elements - 1', function() { + var doc = getDocumentFromXML('
aaabbb
'); + + doc.deleteText({ + from: { + node: getTextNode('aaa', doc), + offset: 2 + }, + to: { + node: getTextNode('bbb', doc), + offset: 2 + } + }); + + var contents = doc.root.contents(); + expect(contents.length).to.equal(2); + expect(contents[0].contents()[0].getText()).to.equal('aa'); + expect(contents[1].contents()[0].getText()).to.equal('b'); + }); + it('removes across elements - 2', function() { + var doc = getDocumentFromXML('cccxxx'); + doc.deleteText({ + from: { + node: getTextNode('ccc', doc), + offset: 2 + }, + to: { + node: getTextNode('xxx', doc), + offset: 2 + } + }); + + var contents = doc.root.contents(); + expect(contents.length).to.equal(2); + expect(contents[0].getTagName()).to.equal('b'); + expect(contents[1].getText()).to.equal('x'); + + var bContents = contents[0].contents(); + expect(bContents.length).to.equal(1); + expect(bContents[0].getTagName()).to.equal('c'); + expect(bContents[0].contents().length).to.equal(1); + expect(bContents[0].contents()[0].getText()).to.equal('cc'); + }); + it('remove across elements - 3 (merged text nodes)', function() { + var doc = getDocumentFromXML('
Alice has a cat
'); + doc.deleteText({ + from: { + node: getTextNode('Alice ', doc), + offset: 1 + }, + to: { + node: getTextNode(' a cat', doc), + offset: 3 + } + }); + var contents = doc.root.contents(); + expect(contents.length).to.equal(1); + expect(contents[0].getText()).to.equal('Acat'); + }); + it('remove across elements - 4', function() { + var doc = getDocumentFromXML('
Alice
has a cat
'); + doc.deleteText({ + from: { + node: getTextNode('Alice ', doc), + offset: 1 + }, + to: { + node: getTextNode(' cat', doc), + offset: 1 + } + }); + var contents = doc.root.contents(); + expect(contents.length).to.equal(2); + expect(contents[0].getText()).to.equal('A'); + expect(contents[1].getTagName()).to.equal('div'); + expect(contents[1].contents().length).to.equal(1); + expect(contents[1].contents()[0].getText()).to.equal('cat'); + }); + it('removes across elements - 5 (whole document)', function() { + var doc = getDocumentFromXML('
Alice
has a cat
!!!
'); + doc.deleteText({ + from: { + node: getTextNode('Alice ', doc), + offset: 0 + }, + to: { + node: getTextNode('!!!', doc), + offset: 3 + } + }); + + expect(doc.root.getTagName()).to.equal('div'); + expect(doc.root.contents().length).to.equal(1); + expect(doc.root.contents()[0].getText()).to.equal(''); + }); + it('removes nodes in between', function() { + var doc = getDocumentFromXML('
aaa!xxx!bbb
'); + doc.deleteText({ + from: { + node: getTextNode('aaa', doc), + offset: 2 + }, + to: { + node: getTextNode('bbb', doc), + offset: 2 + } + }); + + var contents = doc.root.contents(); + expect(contents.length).to.equal(2, 'two nodes survived'); + expect(contents[0].getTagName()).to.equal('a'); + expect(contents[1].getTagName()).to.equal('b'); + expect(contents[0].contents().length).to.equal(1); + expect(contents[0].contents()[0].getText()).to.equal('aa'); + expect(contents[1].contents().length).to.equal(1); + expect(contents[1].contents()[0].getText()).to.equal('b'); + }); + }); + describe('Splitting text', function() { it('splits TextNode\'s parent into two ElementNodes', function() {