X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/b31ffcb46eae55b9c66457e2330b16e8db84f1d6..e35e6b0ed784fadd45452af8750e23ace7c1fd40:/src/smartxml/smartxml.test.js diff --git a/src/smartxml/smartxml.test.js b/src/smartxml/smartxml.test.js index cc68cdd..e6f0baa 100644 --- a/src/smartxml/smartxml.test.js +++ b/src/smartxml/smartxml.test.js @@ -86,6 +86,31 @@ describe('smartxml', function() { }); }); + it('can be cloned with its contents and its contents data', function() { + var doc = getDocumentFromXML('
'), + root = doc.root, + div = root.contents()[0]; + + var ClonableObject = function(arg) { + this.arg = arg; + }; + ClonableObject.prototype.clone = function() { + return new ClonableObject(this.arg); + }; + + div.setData('key', 'value'); + div.setData('clonableObject', new ClonableObject('test')); + + var rootClone = root.clone(), + divClone = rootClone.contents()[0], + stringClone = divClone.getData('key'), + objClone = divClone.getData('clonableObject'); + + expect(stringClone).to.equal('value'); + expect(objClone.arg).to.equal('test', 'clonable object got copied'); + expect(objClone !== div.getData('clonableObject')).to.be.equal(true, 'copy of the clonable object is a new object'); + }); + it('knows its path in the document tree', function() { var doc = getDocumentFromXML('text'), root = doc.root, @@ -1114,6 +1139,7 @@ describe('smartxml', function() { var sampleMethod = function(val) { this._$.attr('x', val); + this.triggerChangeEvent(); }; var transformations = { @@ -1210,10 +1236,12 @@ describe('smartxml', function() { doc.registerExtension({elementNode: {transformations: { nested: function(v) { this._$.attr('innerAttr', v); + this.triggerChangeEvent(); }, outer: function(v) { this.nested(v); this._$.attr('outerAttr', v); + this.triggerChangeEvent(); } }}}); @@ -1245,6 +1273,20 @@ describe('smartxml', function() { }); + it('ignores transformation if document didn\'t emit change event', function() { + var doc = getDocumentFromXML('
'); + + doc.registerExtension({elementNode: {transformations: { + test: function() { + // empty + } + }}}); + + doc.root.test(); + expect(doc.undoStack.length).to.equal(0); + + }); + describe('Transactions', function() { it('allows to undo/redo series of transformations at once', function() { var doc = getDocumentFromXML('
'); @@ -1273,6 +1315,13 @@ describe('smartxml', function() { expect(doc.root.getAttr('test'), '3'); }); + it('ignores empty transactions', function() { + var doc = getDocumentFromXML('
'); + doc.startTransaction(); + doc.endTransaction(); + expect(doc.undoStack).to.have.length(0, 'empty transaction doesn\'t get pushed into undo stack'); + }); + it('doesn\'t break on optimizations', function() { // This is a smoke test checking if optimizations made to transaction undoing // doesnt't break anything. @@ -1282,14 +1331,17 @@ describe('smartxml', function() { elementNode: {transformations: { unaware: function(v) { this.setAttr('unware', v); + this.triggerChangeEvent(); }, smart: { impl: function(t, v) { t.oldVal = this.getAttr('smart'); this.setAttr('smart', v); + this.triggerChangeEvent(); }, undo: function(t) { this.setAttr('smart', t.oldVal); + this.triggerChangeEvent(); } } }}