smartxml: fix in Document.getNodeByPath
authorAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Thu, 17 Jul 2014 12:57:33 +0000 (14:57 +0200)
committerAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Fri, 18 Jul 2014 09:20:27 +0000 (11:20 +0200)
src/smartxml/smartxml.js
src/smartxml/smartxml.test.js

index 1e3ae44..a5a1abc 100644 (file)
@@ -665,8 +665,11 @@ $.extend(Document.prototype, Backbone.Events, fragments, {
 
     getNodeByPath: function(path) {
         var toret = this.root;
 
     getNodeByPath: function(path) {
         var toret = this.root;
-        path.forEach(function(idx) {
+        path.some(function(idx) {
             toret = toret.contents()[idx];
             toret = toret.contents()[idx];
+            if(!toret) {
+                return true;
+            }
         });
         return toret;
     },
         });
         return toret;
     },
index ce0d98a..524c976 100644 (file)
@@ -69,6 +69,24 @@ describe('smartxml', function() {
             expect(node.contents()[0].getText()).to.equal('Alice');
             expect(node.contents()[1].getTagName()).to.equal('b');
         });
             expect(node.contents()[0].getText()).to.equal('Alice');
             expect(node.contents()[1].getTagName()).to.equal('b');
         });
+
+        describe('Retrieving node by path', function() {
+            it('passes smoke tests', function() {
+                var doc = getDocumentFromXML('<root><a><b>c</b></a>');
+                expect(doc.getNodeByPath([0]).sameNode(doc.root.contents()[0])).to.be.true;
+                expect(doc.getNodeByPath([0,0]).sameNode(doc.root.contents()[0].contents()[0])).to.be.true;
+            });
+            it('treats empty path as a root path', function() {
+                var doc = getDocumentFromXML('<root></root>');
+                expect(doc.getNodeByPath([]).sameNode(doc.root)).to.be.true;
+            });
+            it('returns undefined for non existing paths', function() {
+                var doc = getDocumentFromXML('<root><a></a></root>');
+                expect(doc.getNodeByPath([1])).to.be.undefined;
+                expect(doc.getNodeByPath([0,1])).to.be.undefined;
+                expect(doc.getNodeByPath([10,1])).to.be.undefined;
+            });
+        });
     });
 
     describe('DocumentNode', function() {
     });
 
     describe('DocumentNode', function() {