X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/27aad148fb13a6705a8fd91ea693bd8ea46da396..b53df8a58d8dafedf5daf3275243acb8ae3c99f0:/modules/documentCanvas/canvas/canvas.test3.js diff --git a/modules/documentCanvas/canvas/canvas.test3.js b/modules/documentCanvas/canvas/canvas.test3.js index 10f8348..f96e0ff 100644 --- a/modules/documentCanvas/canvas/canvas.test3.js +++ b/modules/documentCanvas/canvas/canvas.test3.js @@ -13,6 +13,58 @@ var expect = chai.expect; describe('Canvas', function() { + + + describe('ZWS', function() { + var view, section, textElement; + + beforeEach(function() { + var c = canvas.fromXML('
'); + + section = c.doc(); + textElement = section.children()[0]; + view = c.view()[0]; + document.getElementsByTagName('body')[0].appendChild(view); + }); + + afterEach(function() { + view.parentNode.removeChild(view); + }); + + var getTextContainerNode = function(textElement) { + return textElement.dom().contents()[0]; + } + + it('is set automatically on all empty DocumentTextElements', function() { + expect(getTextContainerNode(textElement).data).to.equal(utils.unicode.ZWS); + + var header = section.append({tag: 'header'}), + newText = header.append({text: ''}), + textNode = getTextContainerNode(textElement); + + expect(textNode.data).to.equal(utils.unicode.ZWS); + }); + + it('is added automatically when whole text gets deleted', function() { + getTextContainerNode(textElement).data = ''; + + window.setTimeout(function() { + expect(getTextContainerNode(textElement).data).to.equal(utils.unicode.ZWS); + }, 0) + + var header = section.append({tag: 'header'}), + newText = header.append({text: 'Alice'}), + textNode = getTextContainerNode(newText); + + expect(textNode.data).to.have.length('Alice'.length); + textNode.data = ''; + + window.setTimeout(function() { + expect(textNode.data).to.equal(utils.unicode.ZWS); + }, 0) + }); + }); + describe('Internal HTML representation of a DocumentNodeElement', function() { it('is always a div tag', function() { ['section', 'header', 'span', 'aside', 'figure'].forEach(function(tagName) { @@ -250,12 +302,24 @@ describe('Canvas', function() { expect(children[2]).to.be.instanceOf(documentElement.DocumentTextElement); }); }); - - describe('white characters handling', function() { - it('says empty element node has no children', function() { + + describe('empty nodes handling', function() { + it('says empty element node from XML source has one empty DocumentTextElement', function() { var c = canvas.fromXML('
'); - expect(c.doc().children().length).to.equal(0); + expect(c.doc().children()).to.have.length(1); + expect(c.doc().children()[0].getText()).to.equal(''); }); + + it('allows creation of an empty element node', function() { + var c = canvas.fromXML('
'), + section = c.doc(), + header = section.append({tag: 'header'}); + expect(header.children()).to.have.length(0); + }); + }); + + describe('white characters handling', function() { + it('says element node with one space has one DocumentTextElement', function() { var c = canvas.fromXML('
'); expect(c.doc().children().length).to.equal(1); @@ -330,22 +394,22 @@ describe('Canvas', function() { describe('Basic Element inserting', function() { it('can put new NodeElement at the end', function() { - var c = canvas.fromXML('
'), + var c = canvas.fromXML('
'), appended = c.doc().append({tag: 'header', klass: 'some.class'}), children = c.doc().children(); - expect(children.length).to.equal(1); - expect(children[0].sameNode(appended)).to.be.true; + expect(children.length).to.equal(2); + expect(children[1].sameNode(appended)).to.be.true; }); it('can put new TextElement at the end', function() { - var c = canvas.fromXML('
'), + var c = canvas.fromXML('
'), appended = c.doc().append({text: 'Alice'}), children = c.doc().children(); - expect(children.length).to.equal(1); - expect(children[0].sameNode(appended)).to.be.true; - expect(children[0].getText()).to.equal('Alice'); + expect(children.length).to.equal(2); + expect(children[1].sameNode(appended)).to.be.true; + expect(children[1].getText()).to.equal('Alice'); }); it('can put new NodeElement at the beginning', function() { @@ -458,6 +522,22 @@ describe('Canvas', function() { }); }); + describe('Removing elements', function() { + it('merges left and right DocumentTextElement sibling of a detached DocumentNodeElement', function() { + var c = canvas.fromXML('
Alice
has
a cat
'), + section = c.doc(), + div = section.children()[1]; + + div.detach(); + + var sectionChildren = section.children(), + textElement = sectionChildren[0]; + + expect(sectionChildren).to.have.length(1); + expect(textElement.getText()).to.equal('Alicea cat'); + }); + }); + describe('Splitting text', function() { it('splits DocumentTextElement\'s parent into two DocumentNodeElements of the same type', function() { @@ -716,6 +796,19 @@ describe('Canvas', function() { expect(section.children()[0].getText()).to.equal('Alice has a cat'); expect(newTextContainer.sameNode(c.doc())).to.equal(true, 'unwrap returns new text parent DocumentNodeElement'); }); + + it('unwraps text element from its parent - first child case', function() { + var c = canvas.fromXML('
Sometext
'), + section = c.doc(), + span = section.children()[0]; + + span.children()[0].unwrap(); + + var sectionChildren = section.children(); + + expect(sectionChildren).to.have.length(1); + expect(sectionChildren[0].getText()).to.equal('Sometext'); + }); }); }); @@ -1230,25 +1323,6 @@ describe('Canvas', function() { expect(cursor.isSelectingSiblings()).to.equal(false, '"has" and "big" are not children'); }) - - describe('zero width space handling', function() { - it('position range includes ZWS at the boundries of text in case when native selection api doesn\'t', function() { - var c = canvas.fromXML("
Alice
"), - dom = c.doc().dom(), - textNode = findTextNode(dom, 'Alice'), - cursor = c.getCursor(); - - textNode.data = utils.unicode.ZWS + 'Alice'; - getSelection.returns({anchorNode: textNode, anchorOffset: 1, focusNode: textNode, focusOffset: 1}); - expect(cursor.getPosition().offset).to.equal(0); - expect(cursor.getPosition().offsetAtBeginning).to.equal(true, 'offset at beginning'); - - textNode.data = 'Alice' + utils.unicode.ZWS; - getSelection.returns({anchorNode: textNode, anchorOffset: 5, focusNode: textNode, focusOffset: 5}); - expect(cursor.getPosition().offset).to.equal(6); - expect(cursor.getPosition().offsetAtEnd).to.equal(true, 'offset at end'); - }); - }); }); describe('Serializing document to WLXML', function() { @@ -1321,8 +1395,9 @@ describe('Canvas', function() { it('keeps white space between XML nodes - inline case', function() { var xmlIn = '
\n\n\n\n\n\n\n\n\n
', - c = canvas.fromXML(xmlIn), - xmlOut = c.toXML(); + c = canvas.fromXML(xmlIn); + + var xmlOut = c.toXML(); var partsIn = xmlIn.split('\n\n\n'), partsOut = xmlOut.split('\n\n\n');