smartxm: emitting nodeMoved when inserting existing node into different place
[fnpeditor.git] / src / smartxml / smartxml.test.js
index 29c4244..4c9b860 100644 (file)
@@ -253,9 +253,12 @@ describe('smartxml', function() {
 
         it('appends element node to another element node', function() {
             var node1 = elementNodeFromParams({tag: 'div'}),
-                node2 = elementNodeFromParams({tag: 'a'});
+                node2 = elementNodeFromParams({tag: 'a'}),
+                node3 = elementNodeFromParams({tag: 'p'});
             node1.append(node2);
+            node1.append(node3);
             expect(node1.contents()[0].sameNode(node2)).to.be.true;
+            expect(node1.contents()[1].sameNode(node3)).to.be.true;
         });
 
         it('prepends element node to another element node', function() {
@@ -314,6 +317,158 @@ describe('smartxml', function() {
                 expect(wrapperContents[1].contents()[0].getText()).to.equal('small');
             });
         });
+
+        describe('Wrapping Nodes', function() {
+            it('wraps multiple sibling nodes', function() {
+                var section = elementNodeFromXML('<section>Alice<div>has</div><div>a cat</div></section>'),
+                    aliceText = section.contents()[0],
+                    firstDiv = section.contents()[1],
+                    lastDiv = section.contents()[section.contents().length -1];
+
+                var returned = section.document.wrapNodes({
+                        element1: aliceText,
+                        element2: lastDiv,
+                        _with: {tagName: 'header'}
+                    });
+
+                var sectionContents = section.contents(),
+                    header = sectionContents[0],
+                    headerContents = header.contents();
+
+                expect(sectionContents).to.have.length(1);
+                expect(header.sameNode(returned)).to.equal(true, 'wrapper returned');
+                expect(header.parent().sameNode(section)).to.be.true;
+                expect(headerContents).to.have.length(3);
+                expect(headerContents[0].sameNode(aliceText)).to.equal(true, 'first node wrapped');
+                expect(headerContents[1].sameNode(firstDiv)).to.equal(true, 'second node wrapped');
+                expect(headerContents[2].sameNode(lastDiv)).to.equal(true, 'third node wrapped');
+            });
+
+            it('wraps multiple sibling Elements - middle case', function() {
+                var section = elementNodeFromXML('<section><div></div><div></div><div></div><div></div></section>'),
+                    div2 = section.contents()[1],
+                    div3 = section.contents()[2];
+
+                section.document.wrapNodes({
+                        element1: div2,
+                        element2: div3,
+                        _with: {tagName: 'header'}
+                    });
+
+                var sectionContents = section.contents(),
+                    header = sectionContents[1],
+                    headerChildren = header.contents();
+
+                expect(sectionContents).to.have.length(3);
+                expect(headerChildren).to.have.length(2);
+                expect(headerChildren[0].sameNode(div2)).to.equal(true, 'first node wrapped');
+                expect(headerChildren[1].sameNode(div3)).to.equal(true, 'second node wrapped');
+            });
+        });
+
+    });
+
+    describe('Events', function() {
+        it('emits nodeAdded event when appending new node', function() {
+            var node = elementNodeFromXML('<div></div>'),
+                spy = sinon.spy();
+            node.document.on('change', spy);
+            
+            var appended = node.append({tagName:'div'}),
+                event = spy.args[0][0];
+            expect(event.type).to.equal('nodeAdded');
+            expect(event.meta.node.sameNode(appended)).to.be.true;
+        });
+        
+        it('emits nodeMoved when appending aready existing node', function() {
+            var node = elementNodeFromXML('<div><a></a><b></b></div>'),
+                a = node.contents()[0],
+                b = node.contents()[1],
+                spy = sinon.spy();
+            node.document.on('change', spy);
+            
+            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() {
+            var node = elementNodeFromXML('<div></div>'),
+                spy = sinon.spy();
+            node.document.on('change', spy);
+            
+            var prepended = node.prepend({tagName:'div'}),
+                event = spy.args[0][0];
+            expect(event.type).to.equal('nodeAdded');
+            expect(event.meta.node.sameNode(prepended)).to.be.true;
+        });
+        
+        it('emits nodeMoved when prepending aready existing node', function() {
+            var node = elementNodeFromXML('<div><a></a><b></b></div>'),
+                a = node.contents()[0],
+                b = node.contents()[1],
+                spy = sinon.spy();
+            node.document.on('change', spy);
+            
+            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() {
+            var node = elementNodeFromXML('<div><a></a></div>').contents()[0],
+                spy = sinon.spy();
+            node.document.on('change', spy);
+            
+            var inserted = node.after({tagName:'div'}),
+                event = spy.args[0][0];
+            expect(event.type).to.equal('nodeAdded');
+            expect(event.meta.node.sameNode(inserted)).to.be.true;
+        });
+        
+        it('emits nodeMoved when inserting aready existing node after another', function() {
+            var node = elementNodeFromXML('<div><a></a><b></b></div>'),
+                a = node.contents()[0],
+                b = node.contents()[1],
+                spy = sinon.spy();
+            node.document.on('change', spy);
+            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() {
+            var node = elementNodeFromXML('<div><a></a></div>').contents()[0],
+                spy = sinon.spy();
+            node.document.on('change', spy);
+            
+            var inserted = node.before({tagName:'div'}),
+                event = spy.args[0][0];
+            expect(event.type).to.equal('nodeAdded');
+            expect(event.meta.node.sameNode(inserted)).to.be.true;
+        });
+        
+        it('emits nodeAdded when inserting aready existing node before another', function() {
+            var node = elementNodeFromXML('<div><a></a><b></b></div>'),
+                a = node.contents()[0],
+                b = node.contents()[1],
+                spy = sinon.spy();
+            node.document.on('change', spy);
+            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('Serializing document to WLXML', function() {