X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/0ee14b1c718895bbc4034df7f6f35c0eabf06838..898f8bf5c4bf5e553994ee7d7cf320fcc0d1bc12:/src/smartxml/smartxml.test.js
diff --git a/src/smartxml/smartxml.test.js b/src/smartxml/smartxml.test.js
index 542237a..7b42580 100644
--- a/src/smartxml/smartxml.test.js
+++ b/src/smartxml/smartxml.test.js
@@ -644,6 +644,176 @@ describe('smartxml', function() {
});
+ var getTextNodes = function(text, doc) {
+ /* globals Node */
+ var toret = [];
+ var search = function(node) {
+ node.contents().forEach(function(node) {
+ if(node.nodeType === Node.TEXT_NODE) {
+ if(node.getText() === text) {
+ toret.push(node);
+ }
+ } else {
+ search(node);
+ }
+ });
+ };
+ search(doc.root);
+ return toret;
+ };
+
+ var getTextNode = function(text, doc) {
+ var nodes = getTextNodes(text, doc),
+ error;
+ if(nodes.length === 0) {
+ error = 'Text not found';
+ } else if(nodes.length > 1) {
+ error = 'Text not unique';
+ } else if(nodes[0].getText() !== text) {
+ error = 'I was trying to cheat your test :(';
+ }
+ if(error) {
+ throw new Error(error);
+ }
+ return nodes[0];
+ };
+
+ describe('Removing arbitrary text', function() {
+ it('removes within single text element', function() {
+ var doc = getDocumentFromXML('
Alice
'),
+ text = getTextNode('Alice', doc);
+ doc.deleteText({
+ from: {
+ node: text,
+ offset: 1
+ },
+ to: {
+ node: text,
+ offset: 4
+ }
+ });
+ expect(doc.root.contents().length).to.equal(1);
+ expect(doc.root.contents()[0].getText()).to.equal('Ae');
+ });
+ it('removes across elements - 1', function() {
+ var doc = getDocumentFromXML('');
+
+ doc.deleteText({
+ from: {
+ node: getTextNode('aaa', doc),
+ offset: 2
+ },
+ to: {
+ node: getTextNode('bbb', doc),
+ offset: 2
+ }
+ });
+
+ var contents = doc.root.contents();
+ expect(contents.length).to.equal(2);
+ expect(contents[0].contents()[0].getText()).to.equal('aa');
+ expect(contents[1].contents()[0].getText()).to.equal('b');
+ });
+ it('removes across elements - 2', function() {
+ var doc = getDocumentFromXML('cccxxx');
+ doc.deleteText({
+ from: {
+ node: getTextNode('ccc', doc),
+ offset: 2
+ },
+ to: {
+ node: getTextNode('xxx', doc),
+ offset: 2
+ }
+ });
+
+ var contents = doc.root.contents();
+ expect(contents.length).to.equal(2);
+ expect(contents[0].getTagName()).to.equal('b');
+ expect(contents[1].getText()).to.equal('x');
+
+ var bContents = contents[0].contents();
+ expect(bContents.length).to.equal(1);
+ expect(bContents[0].getTagName()).to.equal('c');
+ expect(bContents[0].contents().length).to.equal(1);
+ expect(bContents[0].contents()[0].getText()).to.equal('cc');
+ });
+ it('remove across elements - 3 (merged text nodes)', function() {
+ var doc = getDocumentFromXML('Alice has a cat
');
+ doc.deleteText({
+ from: {
+ node: getTextNode('Alice ', doc),
+ offset: 1
+ },
+ to: {
+ node: getTextNode(' a cat', doc),
+ offset: 3
+ }
+ });
+ var contents = doc.root.contents();
+ expect(contents.length).to.equal(1);
+ expect(contents[0].getText()).to.equal('Acat');
+ });
+ it('remove across elements - 4', function() {
+ var doc = getDocumentFromXML('');
+ doc.deleteText({
+ from: {
+ node: getTextNode('Alice ', doc),
+ offset: 1
+ },
+ to: {
+ node: getTextNode(' cat', doc),
+ offset: 1
+ }
+ });
+ var contents = doc.root.contents();
+ expect(contents.length).to.equal(2);
+ expect(contents[0].getText()).to.equal('A');
+ expect(contents[1].getTagName()).to.equal('div');
+ expect(contents[1].contents().length).to.equal(1);
+ expect(contents[1].contents()[0].getText()).to.equal('cat');
+ });
+ it('removes across elements - 5 (whole document)', function() {
+ var doc = getDocumentFromXML('');
+ doc.deleteText({
+ from: {
+ node: getTextNode('Alice ', doc),
+ offset: 0
+ },
+ to: {
+ node: getTextNode('!!!', doc),
+ offset: 3
+ }
+ });
+
+ expect(doc.root.getTagName()).to.equal('div');
+ expect(doc.root.contents().length).to.equal(1);
+ expect(doc.root.contents()[0].getText()).to.equal('');
+ });
+ it('removes nodes in between', function() {
+ var doc = getDocumentFromXML('');
+ doc.deleteText({
+ from: {
+ node: getTextNode('aaa', doc),
+ offset: 2
+ },
+ to: {
+ node: getTextNode('bbb', doc),
+ offset: 2
+ }
+ });
+
+ var contents = doc.root.contents();
+ expect(contents.length).to.equal(2, 'two nodes survived');
+ expect(contents[0].getTagName()).to.equal('a');
+ expect(contents[1].getTagName()).to.equal('b');
+ expect(contents[0].contents().length).to.equal(1);
+ expect(contents[0].contents()[0].getText()).to.equal('aa');
+ expect(contents[1].contents().length).to.equal(1);
+ expect(contents[1].contents()[0].getText()).to.equal('b');
+ });
+ });
+
describe('Splitting text', function() {
it('splits TextNode\'s parent into two ElementNodes', function() {
@@ -1422,6 +1592,34 @@ describe('smartxml', function() {
expect(doc.root.getAttr('unaware')).to.equal('1');
});
});
+
+ describe('Regression tests', function() {
+ it('redos correctly after running its own undo followed by unaware transformation undo', function() {
+ var doc = getDocumentFromXML('');
+
+ doc.registerExtension({elementNode: {transformations: {
+ unaware: function() {
+ this.triggerChangeEvent();
+ },
+ test: {
+ impl: function() {
+ this._$.attr('t', 1);
+ this.triggerChangeEvent();
+ },
+ undo: function() {
+ this._$.attr('t', 0);
+ }
+ }
+ }}});
+ doc.root.unaware();
+ doc.root.test();
+ doc.undo();
+ doc.undo();
+ doc.redo();
+ doc.redo();
+ expect(doc.root.getAttr('t')).to.equal('1');
+ });
+ });
});
});