smartxml: fix changing node's tag
authorAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Wed, 23 Oct 2013 10:44:09 +0000 (12:44 +0200)
committerAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Wed, 23 Oct 2013 10:44:09 +0000 (12:44 +0200)
src/smartxml/smartxml.js
src/smartxml/smartxml.test.js

index 80ee43c..9a3ba26 100644 (file)
@@ -107,6 +107,7 @@ $.extend(ElementNode.prototype, DocumentNode.prototype, {
         });
         node.setData(this.getData());
 
         });
         node.setData(this.getData());
 
+        this._$.replaceWith(node._$);
         this._setNativeNode(node._$[0]);
         this.triggerChangeEvent('nodeTagChange', {oldTagName: oldTagName, newTagName: this.getTagName()});
     },
         this._setNativeNode(node._$[0]);
         this.triggerChangeEvent('nodeTagChange', {oldTagName: oldTagName, newTagName: this.getTagName()});
     },
index da1b335..7fd408e 100644 (file)
@@ -77,6 +77,19 @@ describe('smartxml', function() {
         });
 
         describe('Changing node tag', function() {
         });
 
         describe('Changing node tag', function() {
+            it('can change tag name', function() {
+                var doc = getDocumentFromXML('<div><header></header></div>'),
+                    header = doc.root.contents()[0];
+                header.setTag('span');
+                expect(header.getTagName()).to.equal('span');
+                
+                // DOM specifies ElementNode tag as a read-only property, so
+                // changing it in a seamless way is a little bit tricky. For this reason
+                // the folowing expectations are required, despite the fact that they actually are
+                // motivated by implemetation detail.
+                expect(header.parent().sameNode(doc.root)).to.equal(true, 'ensure we stayed in a document');
+            });
+
             it('keeps custom data', function() {
                 var node = elementNodeFromXML('<div></div>');
 
             it('keeps custom data', function() {
                 var node = elementNodeFromXML('<div></div>');