X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/bc95fc1358ca35ecbd410d50b3c8c40e1afe0fa9..ac797224a67319e07d3f6e8f52e9b39a3949640a:/src/smartxml/smartxml.test.js?ds=sidebyside diff --git a/src/smartxml/smartxml.test.js b/src/smartxml/smartxml.test.js index 822243d..289b982 100644 --- a/src/smartxml/smartxml.test.js +++ b/src/smartxml/smartxml.test.js @@ -61,6 +61,40 @@ describe('smartxml', function() { }); }); + describe('DocumentNode', function() { + it('can be cloned', function() { + var doc = getDocumentFromXML('
Alice
'), + text = doc.root.contents()[0], + clone, suffix; + + [doc.root, text].forEach(function(node) { + suffix = ' (' + (node.nodeType === Node.TEXT_NODE ? 'text' : 'element') + ')'; + clone = node.clone(); + expect(doc.containsNode(clone)).to.equal(false, 'clone is not contained in a document' + suffix); + expect(node.sameNode(clone)).to.equal(false, 'clone is not same node as its originator' + suffix); + expect(node.nativeNode.isEqualNode(clone.nativeNode)).to.equal(true, 'clone is identical as its originator' + suffix); + }); + }); + + it('knows its path in the document tree', function() { + var doc = getDocumentFromXML('text'), + root = doc.root, + a = root.contents()[0], + b = a.contents()[0], + text = b.contents()[1]; + + expect(root.getPath()).to.eql([], 'path of the root element is empty'); + expect(a.getPath()).to.eql([0]); + expect(b.getPath()).to.eql([0, 0]); + expect(text.getPath()).to.eql([0,0,1]); + + /* Paths relative to a given ancestor */ + expect(text.getPath(root)).to.eql([0,0,1]); + expect(text.getPath(a)).to.eql([0,1]); + expect(text.getPath(b)).to.eql([1]); + }); + }); + describe('Basic ElementNode properties', function() { it('exposes node contents', function() { var node = elementNodeFromXML('Sometextis here'), @@ -270,6 +304,27 @@ describe('smartxml', function() { describe('Manipulations', function() { + describe('replacing node with another one', function() { + it('replaces node with another one', function() { + var doc = getDocumentFromXML('
'), + a = doc.root.contents()[0]; + + var c = a.replaceWith({tagName: 'b', attrs: {b:'1'}}); + + expect(doc.root.contents()[0].sameNode(c)); + expect(c.getTagName()).to.equal('b'); + expect(c.getAttr('b')).to.equal('1'); + }); + it('can replace document root', function() { + var doc = getDocumentFromXML('
'); + + var header = doc.root.replaceWith({tagName: 'header'}); + + expect(doc.root.sameNode(header)).to.be.true; + expect(doc.containsNode(header)).to.be.true; + }); + }); + it('merges adjacent text nodes resulting from detaching an element node in between', function() { var doc = getDocumentFromXML('
Alice hasa cat
'), span = doc.root.contents()[1]; @@ -383,8 +438,8 @@ describe('smartxml', function() { lastDiv = section.contents()[section.contents().length -1]; var returned = section.document.wrapNodes({ - element1: aliceText, - element2: lastDiv, + node1: aliceText, + node2: lastDiv, _with: {tagName: 'header'} }); @@ -407,8 +462,8 @@ describe('smartxml', function() { div3 = section.contents()[2]; section.document.wrapNodes({ - element1: div2, - element2: div3, + node1: div2, + node2: div3, _with: {tagName: 'header'} }); @@ -619,6 +674,26 @@ describe('smartxml', function() { expect(event.type).to.equal('nodeMoved'); expect(event.meta.node.sameNode(inserted)).to.be.true; }); + + it('emits nodeDetached and nodeAdded when replacing root node with another', function() { + var doc = getDocumentFromXML(''), + oldRoot = doc.root, + spy = sinon.spy(); + + doc.on('change', spy); + + doc.root.replaceWith({tagName: 'b'}); + + expect(spy.callCount).to.equal(2); + + var event1 = spy.args[0][0], + event2 = spy.args[1][0]; + + expect(event1.type).to.equal('nodeDetached'); + expect(event1.meta.node.sameNode(oldRoot)).to.equal(true, 'root node in nodeDetached event metadata'); + expect(event2.type).to.equal('nodeAdded'); + expect(event2.meta.node.sameNode(doc.root)).to.equal(true, 'new root node in nodelAdded event meta'); + }); }); describe('Traversing', function() {