X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/0bd5926e9f6c5057d80e829ca5af83b19a58ecfc..75d2183aafd4b2d3e94c17f6c3c8ee0d8a4738e4:/src/smartxml/smartxml.test.js?ds=sidebyside diff --git a/src/smartxml/smartxml.test.js b/src/smartxml/smartxml.test.js index 64e633f..a15f833 100644 --- a/src/smartxml/smartxml.test.js +++ b/src/smartxml/smartxml.test.js @@ -734,6 +734,19 @@ describe('smartxml', function() { expect(event.type).to.equal('nodeDetached'); expect(event.meta.node.sameNode(a)); }); + + it('doesn\'t emit nodeDetached event for already out of document moved to out of document node: ' + insertionMethod, function() { + var doc = getDocumentFromXML('
'), + a = doc.root.contents()[0], + spy = sinon.spy(); + + doc.on('change', spy); + + var newNode = doc.createDocumentNode({tagName: 'b'}); + var newNodeInner = newNode.append({tagName:'c'}); + + expect(spy.callCount).to.equal(0); + }); }); @@ -814,31 +827,137 @@ describe('smartxml', function() { }); }); - describe('Undo/redo', function() { - it('does work', function() { - var doc = getDocumentFromXML('
Alice
'), - span = doc.root.contents()[0]; + describe('Extension API', function() { + var doc, extension, elementNode, textNode, testClassNode; - doc.transform('detach3', {node: span}); + beforeEach(function() { + doc = getDocumentFromXML('
Alice
'); + elementNode = doc.root; + textNode = doc.root.contents()[0]; + extension = {}; + + expect(function() { + elementNode.transform('testTransformation'); + }).to.throw(Error); + expect(function() { + textNode.transform('testTransformation'); + }).to.throw(Error); + expect(function() { + doc.transform('testTransformation'); + }).to.throw(Error); + expect(doc.testMethod).to.be.undefined; + expect(elementNode.testMethod).to.be.undefined; + expect(textNode.testMethod).to.be.undefined; + }); + it('allows adding method to a document', function() { + extension = {document: {methods: { + testMethod: function() { return this; } + }}}; - doc.undo(); + doc.registerExtension(extension); + expect(doc.testMethod()).to.equal(doc, 'context is set to a document instance'); + }); - expect(doc.root.contents()).to.have.length(1); - expect(doc.root.contents()[0].getTagName()).to.equal('span'); - expect(doc.root.contents()[0].contents()[0].getText()).to.equal('Alice'); + it('allows adding transformation to a document', function() { + extension = {document: {transformations: { + testTransformation: function() { return this; }, + testTransformation2: {impl: function() { return this;}} + }}}; + + doc.registerExtension(extension); + expect(doc.transform('testTransformation')).to.equal(doc, 'context is set to a document instance'); + expect(doc.transform('testTransformation2')).to.equal(doc, 'context is set to a document instance'); + }); - doc.redo(); - expect(doc.root.contents()).to.have.length(0); + it('allows adding method to a DocumentNode instance', function() { + extension = {documentNode: {methods: { + testMethod: function() { return this; } + }}}; + + doc.registerExtension(extension); + + /* refresh */ + elementNode = doc.root; + textNode = doc.root.contents()[0]; + + expect(elementNode.testMethod().sameNode(elementNode)).to.equal(true, 'context is set to a node instance'); + expect(textNode.testMethod().sameNode(textNode)).to.equal(true, 'context is set to a node instance'); + }); - doc.undo(); - expect(doc.root.contents()).to.have.length(1); - expect(doc.root.contents()[0].getTagName()).to.equal('span'); - expect(doc.root.contents()[0].contents()[0].getText()).to.equal('Alice'); + it('allows adding transformation to a DocumentNode', function() { + extension = {documentNode: {transformations: { + testTransformation: function() { return this; }, + testTransformation2: {impl: function() { return this;}} + }}}; + + doc.registerExtension(extension); + expect(elementNode.transform('testTransformation').sameNode(elementNode)).to.equal(true, '1'); + expect(elementNode.transform('testTransformation2').sameNode(elementNode)).to.equal(true, '2'); + expect(textNode.transform('testTransformation').sameNode(textNode)).to.equal(true, '3'); + expect(textNode.transform('testTransformation2').sameNode(textNode)).to.equal(true, '4'); }); }); + // describe('Undo/redo', function() { + + // it('does work', function() { + // var doc = getDocumentFromXML('
Alice
'), + // span = doc.root.contents()[0]; + + // span.transform('smartxml.detach'); + + + // doc.undo(); + + // expect(doc.root.contents()).to.have.length(1); + // expect(doc.root.contents()[0].getTagName()).to.equal('span'); + // expect(doc.root.contents()[0].contents()[0].getText()).to.equal('Alice'); + + // doc.redo(); + // expect(doc.root.contents()).to.have.length(0); + + // doc.undo(); + // expect(doc.root.contents()).to.have.length(1); + // expect(doc.root.contents()[0].getTagName()).to.equal('span'); + // expect(doc.root.contents()[0].contents()[0].getText()).to.equal('Alice'); + + // }); + // it('does work - merged text nodes case', function() { + // var doc = getDocumentFromXML('
Alice has a cat.
'), + // span = doc.root.contents()[1]; + + // span.transform('smartxml.detach'); + + + // doc.undo(); + + // expect(doc.root.contents().length).to.equal(3); + // //console.log(doc.toXML()); + // expect(doc.root.contents()[1].contents()[0].getText()).to.equal('has'); + + // }); + // it('dbg - don not store nodes in tranformation state!', function() { + // var doc = getDocumentFromXML('
'), + // a = doc.root.contents()[0], + // b = doc.root.contents()[1]; + + // a.transform('smartxml.detach'); + // b.transform('smartxml.detach'); + // doc.undo(); + // doc.undo(); + // expect(doc.root.contents().length).to.equal(2); + // expect(doc.root.contents()[0].getTagName()).to.equal('a'); + // expect(doc.root.contents()[1].getTagName()).to.equal('b'); + + // doc.redo(); + // doc.redo(); + // expect(doc.root.contents().length).to.equal(0); + + // }); + // }); + }); }); \ No newline at end of file