X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/c36df0c30a4fb6398823ab4b903054675953aba2..8a17c686a21178f73ea93a9d7f2c6ee3bf90aa72:/src/smartxml/smartxml.test.js
diff --git a/src/smartxml/smartxml.test.js b/src/smartxml/smartxml.test.js
index d82f823..e6f0baa 100644
--- a/src/smartxml/smartxml.test.js
+++ b/src/smartxml/smartxml.test.js
@@ -60,6 +60,15 @@ describe('smartxml', function() {
expect(emptyTextNode.getText()).to.equal('', 'empty ok');
expect(nonEmptyTextNode.getText()).to.equal('alice', 'non empty ok');
});
+
+ it('creates nodes from xml strings', function() {
+ var doc = getDocumentFromXML('
'),
+ node = doc.createDocumentNode('Alice');
+ expect(node.getTagName()).to.equal('a');
+ expect(node.contents().length).to.equal(2);
+ expect(node.contents()[0].getText()).to.equal('Alice');
+ expect(node.contents()[1].getTagName()).to.equal('b');
+ });
});
describe('DocumentNode', function() {
@@ -77,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,
@@ -1105,6 +1139,7 @@ describe('smartxml', function() {
var sampleMethod = function(val) {
this._$.attr('x', val);
+ this.triggerChangeEvent();
};
var transformations = {
@@ -1201,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();
}
}}});
@@ -1236,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('');
@@ -1264,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.
@@ -1273,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();
}
}
}}