X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/7427515e04e110e91793887b873f5853751c271a..4ab522037ab350b3f0257130bc6e4dbc6f183021:/src/smartxml/smartxml.test.js
diff --git a/src/smartxml/smartxml.test.js b/src/smartxml/smartxml.test.js
index cc2b3cf..5d1ca3e 100644
--- a/src/smartxml/smartxml.test.js
+++ b/src/smartxml/smartxml.test.js
@@ -169,40 +169,16 @@ describe('smartxml', function() {
it('can change tag name', function() {
var node = elementNodeFromXML('
');
- node.setTag('span');
+ node = node.setTag('span');
expect(node.getTagName()).to.equal('span');
});
- it('emits nodeTagChange event', function() {
- var node = elementNodeFromXML(''),
- spy = sinon.spy();
-
- node.document.on('change', spy);
- node.setTag('span');
- var event = spy.args[0][0];
-
- expect(event.type).to.equal('nodeTagChange');
- expect(event.meta.node.sameNode(node)).to.be.true;
- expect(event.meta.oldTagName).to.equal('div');
- });
-
describe('Implementation specific expectations', function() {
- // 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 details.
-
- it('keeps node in the document', function() {
- var doc = getDocumentFromXML(''),
- header = doc.root.contents()[0];
- header.setTag('span');
- expect(header.parent().sameNode(doc.root)).to.be.true;
- });
it('keeps custom data', function() {
var node = elementNodeFromXML('');
node.setData('key', 'value');
- node.setTag('header');
+ node = node.setTag('header');
expect(node.getTagName()).to.equal('header');
expect(node.getData()).to.eql({key: 'value'});
@@ -214,12 +190,13 @@ describe('smartxml', function() {
expect(doc.root.getTagName()).to.equal('span');
});
- it('keeps contents', function() {
+ it('keeps node contents', function() {
var node = elementNodeFromXML('');
- node.setTag('header');
+ node = node.setTag('header');
expect(node.contents()).to.have.length(1);
});
});
+ });
describe('Setting node attributes', function() {
it('can set node attribute', function() {
@@ -242,8 +219,6 @@ describe('smartxml', function() {
expect(event.meta.oldVal).to.equal('value1');
});
});
-
- });
});
describe('Basic TextNode properties', function() {
@@ -1650,6 +1625,32 @@ describe('smartxml', function() {
var transaction = doc.undoStack[0];
expect(transaction.metadata).to.equal(metadata);
});
+
+ it('can be rolled back', function() {
+ var doc = getDocumentFromXML('');
+
+ doc.startTransaction();
+ doc.root.append({tagName: 'div'});
+ doc.rollbackTransaction();
+
+ expect(doc.undoStack.length).to.equal(0, 'nothing to undo');
+ expect(doc.root.contents().length).to.equal(0);
+ });
+
+ it('rollbacks and calls error handleor if error gets thrown', function() {
+ var doc = getDocumentFromXML(''),
+ err = new Error(),
+ spy = sinon.spy();
+
+ doc.transaction(function() {
+ doc.root.append({tagName: 'div'});
+ throw err;
+ }, {error: spy});
+
+ expect(spy.args[0][0]).to.equal(err);
+ expect(doc.root.contents().length).to.equal(0);
+ expect(doc.undoStack.length).to.equal(0);
+ });
});
describe('Regression tests', function() {
@@ -1678,6 +1679,29 @@ describe('smartxml', function() {
doc.redo();
expect(doc.root.getAttr('t')).to.equal('1');
});
+ it('can perform undo of an operation performed after automatic transaction rollback', function() {
+ var doc = getDocumentFromXML(''),
+ extension = {document: {transformations: {
+ throwingTransformation: function() { throw new Error(); }
+ }}};
+
+ doc.registerExtension(extension);
+
+ doc.throwingTransformation();
+
+ doc.transaction(function() {
+ doc.root.setAttr('x', '2');
+ });
+
+ expect(doc.undoStack.length).to.equal(1);
+ expect(doc.root.getAttr('x')).to.equal('2');
+
+ doc.undo();
+
+ expect(doc.undoStack.length).to.equal(0);
+ expect(doc.root.getAttr('x')).to.be.undefined;
+
+ });
});
});