X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/cf8479951262da902ce027205a48ee420c63d6b8..3c7a0345c83f8377152afc99ea773ccdf573e051:/modules/documentCanvas/canvas/canvas.test3.js diff --git a/modules/documentCanvas/canvas/canvas.test3.js b/modules/documentCanvas/canvas/canvas.test3.js index 34c372d..147da86 100644 --- a/modules/documentCanvas/canvas/canvas.test3.js +++ b/modules/documentCanvas/canvas/canvas.test3.js @@ -1,8 +1,9 @@ define([ 'libs/chai', +'libs/sinon', 'modules/documentCanvas/canvas/canvas', 'modules/documentCanvas/canvas/documentElement' -], function(chai, canvas, documentElement) { +], function(chai, sinon, canvas, documentElement) { 'use strict'; @@ -107,6 +108,22 @@ describe('Canvas', function() { expect(section.getWlxmlClass()).to.be.undefined; }); }); + + it('returns DocumentNodeElement instance from HTMLElement', function() { + var c = canvas.fromXML('
'), + htmlElement = c.doc().dom().get(0), + element = c.getDocumentElement(htmlElement); + expect(element).to.be.instanceOf(documentElement.DocumentNodeElement); + expect(element.sameNode(c.doc())); + }); + + it('returns DocumentTextElement instance from Text Node', function() { + var c = canvas.fromXML('
Alice
'), + textNode = c.doc().children(0)[0].dom().get(0), + element = c.getDocumentElement(textNode); + expect(element).to.be.instanceOf(documentElement.DocumentTextElement); + expect(element.sameNode(c.doc().children()[0])); + }); }); @@ -375,26 +392,42 @@ describe('Canvas', function() { expect(returned.getWlxmlClass()).to.equal('some.class'); }); - it('wraps part of DocumentTextElement', function() { - var c = canvas.fromXML('
Alice has a cat
'), - text = c.doc().children()[0]; - - var returned = text.wrapWithNodeElement({tag: 'header', klass: 'some.class', start: 5, end: 12}), - children = c.doc().children(); - - expect(children.length).to.equal(3); - - expect(children[0]).to.be.instanceOf(documentElement.DocumentTextElement); - expect(children[0].getText()).to.equal('Alice'); + describe('wrapping part of DocumentTextElement', function() { + [{start: 5, end: 12}, {start: 12, end: 5}].forEach(function(offsets) { + it('wraps in the middle ' + offsets.start + '/' + offsets.end, function() { + var c = canvas.fromXML('
Alice has a cat
'), + text = c.doc().children()[0]; + + var returned = text.wrapWithNodeElement({tag: 'header', klass: 'some.class', start: offsets.start, end: offsets.end}), + children = c.doc().children(); + + expect(children.length).to.equal(3); + + expect(children[0]).to.be.instanceOf(documentElement.DocumentTextElement); + expect(children[0].getText()).to.equal('Alice'); + + expect(children[1].sameNode(returned)).to.be.true; + expect(returned.getWlxmlTag()).to.equal('header'); + expect(returned.getWlxmlClass()).to.equal('some.class'); + expect(children[1].children().length).to.equal(1); + expect(children[1].children()[0].getText()).to.equal(' has a '); + + expect(children[2]).to.be.instanceOf(documentElement.DocumentTextElement); + expect(children[2].getText()).to.equal('cat'); + }); + }); - expect(children[1].sameNode(returned)).to.be.true; - expect(returned.getWlxmlTag()).to.equal('header'); - expect(returned.getWlxmlClass()).to.equal('some.class'); - expect(children[1].children().length).to.equal(1); - expect(children[1].children()[0].getText()).to.equal(' has a '); + it('wraps whole text inside DocumentTextElement if offsets span entire content', function() { + var c = canvas.fromXML('
Alice has a cat
'), + text = c.doc().children()[0]; + + var returned = text.wrapWithNodeElement({tag: 'header', klass: 'some.class', start: 0, end: 15}), + children = c.doc().children(); - expect(children[2]).to.be.instanceOf(documentElement.DocumentTextElement); - expect(children[2].getText()).to.equal('cat'); + expect(children.length).to.equal(1); + expect(children[0]).to.be.instanceOf(documentElement.DocumentNodeElement); + expect(children[0].children()[0].getText()).to.equal('Alice has a cat'); + }); }); it('wraps text spanning multiple sibling DocumentTextNodes', function() { @@ -832,6 +865,106 @@ describe('Canvas', function() { }); }); + + describe('Cursor', function() { + + var getSelection; + + beforeEach(function() { + getSelection = sinon.stub(window, 'getSelection'); + }); + + afterEach(function() { + getSelection.restore(); + }); + + it('returns position when browser selection collapsed', function() { + var c = canvas.fromXML('
Alice has a cat
'), + dom = c.doc().dom(), + text = dom.contents(0); + + expect(text.text()).to.equal('Alice has a cat'); + + getSelection.returns({ + anchorNode: text[0], + focusNode: text[0], + anchorOffset: 5, + focusOffset: 5, + isCollapsed: true + }); + var cursor = c.getCursor(), + position = cursor.getPosition(); + + expect(cursor.isSelecting()).to.equal(false, 'cursor is not selecting anything'); + expect(position.element.getText()).to.equal('Alice has a cat'); + expect(position.offset).to.equal(5); + }); + + it('returns boundries of selection when browser selection not collapsed', function() { + var c = canvas.fromXML('
Alice has a big cat
'), + dom = c.doc().dom(), + text = { + alice: dom.contents()[0], + has: $(dom.contents()[1]).contents()[0], + cat: dom.contents()[4] + }, + cursor = c.getCursor(), + aliceElement = c.getDocumentElement(text.alice), + catElement = c.getDocumentElement(text.cat); + + + [ + {focus: text.alice, focusOffset: 1, anchor: text.cat, anchorOffset: 2, selectionAnchor: catElement}, + {focus: text.cat, focusOffset: 2, anchor: text.alice, anchorOffset: 1, selectionAnchor: aliceElement} + ].forEach(function(s, idx) { + getSelection.returns({isColapsed: false, anchorNode: s.anchor, anchorOffset: s.anchorOffset, focusNode: s.focus, focusOffset: s.focusOffset}); + + var selectionStart = cursor.getSelectionStart(), + selectionEnd = cursor.getSelectionEnd(), + selectionAnchor = cursor.getSelectionAnchor(); + + expect(cursor.isSelecting()).to.equal(true, 'cursor is selecting'); + expect(selectionStart.element.sameNode(aliceElement)).to.equal(true, '"Alice" is the start of the selection ' + idx); + expect(selectionStart.offset).to.equal(1, '"Alice" offset ok' + idx); + expect(selectionEnd.element.sameNode(catElement)).to.equal(true, '"Cat" is the start of the selection ' + idx); + expect(selectionEnd.offset).to.equal(2, '"Cat" offset ok' + idx); + expect(selectionAnchor.element.sameNode(s.selectionAnchor)).to.equal(true, 'anchor ok'); + expect(selectionAnchor.offset).to.equal(s.anchorOffset, 'anchor offset ok'); + }); + }); + + it('recognizes when browser selection boundries lies in sibling DocumentTextElements', function() { + var c = canvas.fromXML('
Alice has a big cat
'), + dom = c.doc().dom(), + text = { + alice: dom.contents()[0], + has: $(dom.contents()[1]).contents()[0], + a: dom.contents()[2], + big: $(dom.contents()[3]).contents()[0], + cat: dom.contents()[4] + }, + cursor = c.getCursor(); + + expect($(text.alice).text()).to.equal('Alice '); + expect($(text.has).text()).to.equal('has'); + expect($(text.a).text()).to.equal(' a '); + expect($(text.big).text()).to.equal('big'); + expect($(text.cat).text()).to.equal(' cat'); + + getSelection.returns({anchorNode: text.alice, focusNode: text.a}); + expect(cursor.isSelectingSiblings()).to.equal(true, '"Alice" and "a" are children'); + + getSelection.returns({anchorNode: text.alice, focusNode: text.cat}); + expect(cursor.isSelectingSiblings()).to.equal(true, '"Alice" and "cat" are children'); + + getSelection.returns({anchorNode: text.alice, focusNode: text.has}); + expect(cursor.isSelectingSiblings()).to.equal(false, '"Alice" and "has" are not children'); + + getSelection.returns({anchorNode: text.has, focusNode: text.big}); + expect(cursor.isSelectingSiblings()).to.equal(false, '"has" and "big" are not children'); + + }) + }); });