X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/180cd85dd5dcdcb29eb1a4626e3c6412558caddb..ba0c4611f99a2ba9bb7af4b686924832703036e7:/src/smartxml/smartxml.test.js diff --git a/src/smartxml/smartxml.test.js b/src/smartxml/smartxml.test.js index 4f9a72a..ccaf0ef 100644 --- a/src/smartxml/smartxml.test.js +++ b/src/smartxml/smartxml.test.js @@ -40,6 +40,17 @@ describe('smartxml', function() { doc.loadXML('
'); expect(doc.root.getTagName()).to.equal('header'); }); + + it('knows if it contains an ElementNode in its tree', function() { + var doc = getDocumentFromXML('text'), + root = doc.root, + a = root.contents()[0], + text = root.contents()[1]; + + expect(doc.containsNode(root)).to.equal(true, 'contains its root'); + expect(doc.containsNode(a)).to.equal(true, 'contains Element Node'); + expect(doc.containsNode(text)).to.equal(true, 'contains Text Node'); + }); }); describe('Basic ElementNode properties', function() { @@ -251,6 +262,17 @@ describe('smartxml', function() { describe('Manipulations', function() { + 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]; + + span.detach(); + + var rootContents = doc.root.contents(); + expect(rootContents).to.have.length(1, 'one child left'); + expect(rootContents[0].getText()).to.equal('Alice a cat'); + }); + it('appends element node to another element node', function() { var node1 = elementNodeFromParams({tag: 'div'}), node2 = elementNodeFromParams({tag: 'a'}), @@ -291,11 +313,37 @@ describe('smartxml', function() { expect(node.contents()[2].getText()).to.equal(' a cat!'); }); + it('unwrap single element node from its parent', function() { + var doc = getDocumentFromXML('
'), + div = doc.root, + a = div.contents()[0], + b = a.contents()[0]; + + var parent = b.unwrap(); + + expect(parent.sameNode(div)).to.equal(true, 'returns new parent'); + expect(div.contents()).to.have.length(1, 'root contains only one node'); + expect(div.contents()[0].sameNode(b)).to.equal(true, 'node got unwrapped'); + }); + + it('unwrap single text node from its parent', function() { + var doc = getDocumentFromXML('
Some text!
'), + div = doc.root, + span = div.contents()[1], + text = span.contents()[0]; + + var parent = text.unwrap(); + + expect(parent.sameNode(div)).to.equal(true, 'returns new parent'); + expect(div.contents()).to.have.length(1, 'root contains only one node'); + expect(div.contents()[0].getText()).to.equal('Some text!'); + }); + describe('Wrapping text', function() { it('wraps text spanning multiple sibling TextNodes', function() { var section = elementNodeFromXML('
Alice has a small cat
'), wrapper = section.wrapText({ - _with: {tag: 'span', attrs: {'attr1': 'value1'}}, + _with: {tagName: 'span', attrs: {'attr1': 'value1'}}, offsetStart: 6, offsetEnd: 4, textNodeIdx: [0,2] @@ -307,6 +355,7 @@ describe('smartxml', function() { var wrapper2 = section.contents()[1]; expect(wrapper2.sameNode(wrapper)).to.be.true; + expect(wrapper.getTagName()).to.equal('span'); var wrapperContents = wrapper.contents(); expect(wrapperContents.length).to.equal(3); @@ -369,6 +418,20 @@ describe('smartxml', function() { }); describe('Events', function() { + it('emits nodeDetached event on node detach', function() { + var node = elementNodeFromXML('
'), + innerNode = node.contents()[0], + spy = sinon.spy(); + node.document.on('change', spy); + + var detached = innerNode.detach(), + event = spy.args[0][0]; + + expect(event.type).to.equal('nodeDetached'); + expect(event.meta.node.sameNode(detached, 'detached node in event meta')); + expect(event.meta.parent.sameNode(node), 'original parent node in event meta'); + }), + it('emits nodeAdded event when appending new node', function() { var node = elementNodeFromXML('
'), spy = sinon.spy(); @@ -380,14 +443,19 @@ describe('smartxml', function() { expect(event.meta.node.sameNode(appended)).to.be.true; }); - it('doesn\'t emit nodeAdded when appending aready existing node', function() { + it('emits nodeMoved when appending aready existing node', function() { var node = elementNodeFromXML('
'), a = node.contents()[0], b = node.contents()[1], spy = sinon.spy(); node.document.on('change', spy); - a.append(b); - expect(spy.callCount).to.equal(0); + + var appended = a.append(b), + event = spy.args[0][0]; + + expect(spy.callCount).to.equal(1); + expect(event.type).to.equal('nodeMoved'); + expect(event.meta.node.sameNode(appended)).to.be.true; }); it('emits nodeAdded event when prepending new node', function() { @@ -401,14 +469,18 @@ describe('smartxml', function() { expect(event.meta.node.sameNode(prepended)).to.be.true; }); - it('doesn\'t emit nodeAdded when prepending aready existing node', function() { + it('emits nodeMoved when prepending aready existing node', function() { var node = elementNodeFromXML('
'), a = node.contents()[0], b = node.contents()[1], spy = sinon.spy(); node.document.on('change', spy); - a.prepend(b); - expect(spy.callCount).to.equal(0); + + var prepended = a.prepend(b), + event = spy.args[0][0]; + expect(spy.callCount).to.equal(1); + expect(event.type).to.equal('nodeMoved'); + expect(event.meta.node.sameNode(prepended)).to.be.true; }); it('emits nodeAdded event when inserting node after another', function() { @@ -422,14 +494,18 @@ describe('smartxml', function() { expect(event.meta.node.sameNode(inserted)).to.be.true; }); - it('doesn\'t emit nodeAdded when inserting aready existing node after another', function() { + it('emits nodeMoved when inserting aready existing node after another', function() { var node = elementNodeFromXML('
'), a = node.contents()[0], b = node.contents()[1], spy = sinon.spy(); node.document.on('change', spy); - b.after(a); - expect(spy.callCount).to.equal(0); + var inserted = b.after(a), + event = spy.args[0][0]; + + expect(spy.callCount).to.equal(1); + expect(event.type).to.equal('nodeMoved'); + expect(event.meta.node.sameNode(inserted)).to.be.true; }); it('emits nodeAdded event when inserting node before another', function() { @@ -443,14 +519,66 @@ describe('smartxml', function() { expect(event.meta.node.sameNode(inserted)).to.be.true; }); - it('doesn\'t emit nodeAdded when inserting aready existing node before another', function() { + it('emits nodeAdded when inserting aready existing node before another', function() { var node = elementNodeFromXML('
'), a = node.contents()[0], b = node.contents()[1], spy = sinon.spy(); node.document.on('change', spy); - a.before(b); - expect(spy.callCount).to.equal(0); + var inserted = a.before(b), + event = spy.args[0][0]; + + expect(spy.callCount).to.equal(1); + expect(event.type).to.equal('nodeMoved'); + expect(event.meta.node.sameNode(inserted)).to.be.true; + }); + }); + + describe('Traversing', function() { + describe('Basic', function() { + it('can access node parent', function() { + var doc = getDocumentFromXML(''), + a = doc.root, + b = a.contents()[0]; + + expect(a.parent()).to.equal(null, 'parent of a root is null'); + expect(b.parent().sameNode(a)).to.be.true; + }); + it('can access node parents', function() { + var doc = getDocumentFromXML(''), + a = doc.root, + b = a.contents()[0], + c = b.contents()[0]; + + var parents = c.parents(); + expect(parents).to.eql([b,a]); + }); + }); + + describe('finding sibling parents of two elements', function() { + it('returns elements themself if they have direct common parent', function() { + var doc = getDocumentFromXML('
A
B
'), + wrappingDiv = doc.root.contents()[0], + divA = wrappingDiv.contents()[0], + divB = wrappingDiv.contents()[1]; + + var siblingParents = doc.getSiblingParents({node1: divA, node2: divB}); + + expect(siblingParents.node1.sameNode(divA)).to.equal(true, 'divA'); + expect(siblingParents.node2.sameNode(divB)).to.equal(true, 'divB'); + }); + + it('returns sibling parents - example 1', function() { + var doc = getDocumentFromXML('
Alice has a cat
'), + aliceText = doc.root.contents()[0], + span = doc.root.contents()[1], + spanText = span.contents()[0]; + + var siblingParents = doc.getSiblingParents({node1: aliceText, node2: spanText}); + + expect(siblingParents.node1.sameNode(aliceText)).to.equal(true, 'aliceText'); + expect(siblingParents.node2.sameNode(span)).to.equal(true, 'span'); + }); }); });