X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/295c9ced8e77df8e0d83951159d3c3c416771753..a132113f20073907fd2907a93c75c9d699516ee6:/src/smartxml/smartxml.test.js diff --git a/src/smartxml/smartxml.test.js b/src/smartxml/smartxml.test.js index e6f0baa..cbef963 100644 --- a/src/smartxml/smartxml.test.js +++ b/src/smartxml/smartxml.test.js @@ -458,6 +458,68 @@ describe('smartxml', function() { expect(node1.contents()[1].sameNode(node2)).to.be.true; }); + describe('adding text nodes', function() { + it('merges text nodes on append', function() { + var doc = getDocumentFromXML('text1'), + returned; + returned = doc.root.append({text: 'text2'}); + expect(doc.root.contents().length).to.equal(1); + expect(returned.sameNode(doc.root.contents()[0])).to.equal(true, 'modified node returned'); + expect(doc.root.contents()[0].getText()).to.equal('text1text2'); + }); + + it('merges text nodes on prepend', function() { + var doc = getDocumentFromXML('text1'), + returned; + returned = doc.root.prepend({text: 'text2'}); + expect(doc.root.contents().length).to.equal(1); + expect(returned.sameNode(doc.root.contents()[0])).to.equal(true, 'modified node returned'); + expect(doc.root.contents()[0].getText()).to.equal('text2text1'); + }); + + it('merges text nodes on before text node', function() { + var doc = getDocumentFromXML('text1'), + textNode = doc.root.contents()[0], + returned; + returned = textNode.before({text: 'text2'}); + expect(doc.root.contents().length).to.equal(1); + expect(returned.sameNode(doc.root.contents()[0])).to.equal(true, 'modified node returned'); + expect(doc.root.contents()[0].getText()).to.equal('text2text1'); + }); + + it('merges text nodes on after text node', function() { + var doc = getDocumentFromXML('text1'), + textNode = doc.root.contents()[0], + returned; + returned = textNode.after({text: 'text2'}); + expect(doc.root.contents().length).to.equal(1); + expect(returned.sameNode(doc.root.contents()[0])).to.equal(true, 'modified node returned'); + expect(doc.root.contents()[0].getText()).to.equal('text1text2'); + }); + + it('merges text nodes on before element node', function() { + var doc = getDocumentFromXML('text1
'), + textNode = doc.root.contents()[0], + div = doc.root.contents()[1], + returned; + returned = div.before({text: 'text2'}); + expect(doc.root.contents().length).to.equal(2); + expect(returned.sameNode(doc.root.contents()[0])).to.equal(true, 'modified node returned'); + expect(textNode.getText()).to.equal('text1text2'); + }); + + it('merges text nodes on after element node', function() { + var doc = getDocumentFromXML('
text1
'), + textNode = doc.root.contents()[1], + div = doc.root.contents()[0], + returned; + returned = div.after({text: 'text2'}); + expect(doc.root.contents().length).to.equal(2); + expect(returned.sameNode(doc.root.contents()[1])).to.equal(true, 'modified node returned'); + expect(textNode.getText()).to.equal('text2text1'); + }); + }); + it('wraps element node with another element node', function() { var node = elementNodeFromXML('
'), wrapper = elementNodeFromXML(''); @@ -582,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() {