X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/f2cfe219c603d0d912b5bd0484e22725026d85aa..c031ffaa79a223a05a4a58de2854c9855e94cc18:/src/editor/modules/documentCanvas/canvas/canvas.test.js diff --git a/src/editor/modules/documentCanvas/canvas/canvas.test.js b/src/editor/modules/documentCanvas/canvas/canvas.test.js index 6343d23..642438a 100644 --- a/src/editor/modules/documentCanvas/canvas/canvas.test.js +++ b/src/editor/modules/documentCanvas/canvas/canvas.test.js @@ -3,10 +3,9 @@ define([ 'libs/chai', 'libs/sinon', 'modules/documentCanvas/canvas/canvas', -'modules/documentCanvas/canvas/documentElement', 'modules/documentCanvas/canvas/utils', 'wlxml/wlxml' -], function($, chai, sinon, canvas, documentElement, utils, wlxml) { +], function($, chai, sinon, canvas, utils, wlxml) { 'use strict'; /* global describe, it, beforeEach, afterEach */ @@ -34,6 +33,7 @@ describe('new Canvas', function() { expect(c.doc().children()).to.have.length(3); expect(c.doc().children()[0].canvas).to.equal(c); + expect(c.doc().children()[0].wlxmlNode.sameNode(doc.root)); }); }); @@ -58,7 +58,7 @@ describe('Handling changes to the document', function() { c = canvas.fromXMLDocument(doc); var header = doc.root.replaceWith({tagName: 'header'}); - expect(c.doc().data('wlxmlNode').sameNode(header)).to.equal(true); + expect(c.doc().wlxmlNode.sameNode(header)).to.equal(true); }); }); @@ -104,7 +104,7 @@ describe('Listening to document changes', function() { /* Make sure we handle invalidation of reference to wlxmlNode after changing its tag */ expect(headerNode.getData('canvasElement').sameNode(headerElement)).to.equal(true, 'node->element'); - expect(headerElement.data('wlxmlNode').sameNode(headerNode)).to.equal(true, 'element->node'); + expect(headerElement.wlxmlNode.sameNode(headerNode)).to.equal(true, 'element->node'); }); it('Handles nodeDetached event for an empty text node', function(done) { @@ -120,7 +120,7 @@ describe('Listening to document changes', function() { wait(function() { var parent = aTextElement.parent(); expect(aTextElement.getText({raw:true})).to.equal(utils.unicode.ZWS, 'canvas represents this as empty node'); - aTextElement.data('wlxmlNode').detach(); + aTextElement.wlxmlNode.detach(); expect(parent.children().length).to.equal(1); expect(parent.children()[0].getWlxmlTag()).to.equal('span'); done(); @@ -128,6 +128,45 @@ describe('Listening to document changes', function() { }); }); +describe('Displaying span nodes', function() { + it('inlines a span element with a text', function() { + var c = getCanvasFromXML('
Alice
'), + spanElement = c.doc().children()[0]; + expect(spanElement.isBlock()).to.equal(false); + }); + it('renders non-span element as a block', function() { + var c = getCanvasFromXML('
'), + element = c.doc().children()[0], + node = element.wlxmlNode; + + expect(element.isBlock()).to.equal(false, 'initially inline'); + node = node.setTag('div'); + expect(node.getData('canvasElement').isBlock()).to.equal(true, 'block'); + }); + + it('inlines a span element if its block content gets removed', function() { + var c = getCanvasFromXML('
Alice
has
a cat!
'), + spanElement = c.doc().children()[0], + divNode = spanElement.wlxmlNode.contents()[1]; + + expect(spanElement.isBlock()).to.equal(true, 'initially a block'); + divNode.detach(); + expect(spanElement.isBlock()).to.equal(false, 'inlined after removing inner block'); + + spanElement.wlxmlNode.append({tagName: 'div'}); + + expect(spanElement.isBlock()).to.equal(true, 'block again after bringing back inner block'); + }); + + it('keeps showing element as a block after changing its node tag to span if it contains elements of non-span nodes', function() { + var c = getCanvasFromXML('
'), + outerDivElement = c.doc().children()[0], + outerDivNode = outerDivElement.wlxmlNode; + outerDivNode = outerDivNode.setTag('span'); + expect(c.doc().children()[0].isBlock()).to.equal(true); + }); +}); + describe('Cursor', function() { /* globals Node */ var getSelection; @@ -185,6 +224,107 @@ describe('Cursor', function() { expect(cursor.getPosition().offsetAtEnd).to.equal(true, 'offset at end'); }); + it('recognizes selection start and end on document order', function() { + var c = getCanvasFromXML('
Alicehas a cat
abc...cde
'), + dom = c.doc().dom(), + textFirst = findTextNode(dom, 'Alice'), + textSecond = findTextNode(dom, 'has a cat'), + textAbc = findTextNode(dom, 'abc'), + textCde = findTextNode(dom, 'cde'); + + var check = function(label, expected) { + var cursor = c.getCursor(); + label = label + ': '; + expect(cursor.getSelectionStart().element.getText()).to.equal(expected.start.text, label + 'start element ok'); + expect(cursor.getSelectionStart().offset).to.equal(expected.start.offset, label + 'start offset ok'); + expect(cursor.getSelectionEnd().element.getText()).to.equal(expected.end.text, label + 'end element ok'); + expect(cursor.getSelectionEnd().offset).to.equal(expected.end.offset, label + 'end offset ok'); + }; + + getSelection.returns({ + anchorNode: textFirst, + focusNode: textFirst, + anchorOffset: 1, + focusOffset: 3, + isCollapsed: false + }); + + check('same element, anchor first', { + start: {text: 'Alice', offset: 1}, + end: {text: 'Alice', offset:3} + }); + + + getSelection.returns({ + anchorNode: textFirst, + focusNode: textFirst, + anchorOffset: 3, + focusOffset: 1, + isCollapsed: false + }); + + check('same element, anchor second', { + start: {text: 'Alice', offset: 1}, + end: {text: 'Alice', offset:3} + }); + + + getSelection.returns({ + anchorNode: textAbc, + focusNode: textCde, + anchorOffset: 3, + focusOffset: 1, + isCollapsed: false + }); + + check('same parent, anchor first', { + start: {text: 'abc', offset: 3}, + end: {text: 'cde', offset:1} + }); + + + getSelection.returns({ + anchorNode: textCde, + focusNode: textAbc, + anchorOffset: 1, + focusOffset: 3, + isCollapsed: false + }); + + check('same parent, anchor second', { + start: {text: 'abc', offset: 3}, + end: {text: 'cde', offset:1} + }); + + + getSelection.returns({ + anchorNode: textFirst, + focusNode: textSecond, + anchorOffset: 1, + focusOffset: 3, + isCollapsed: false + }); + + check('different parents, anchor first', { + start: {text: 'Alice', offset: 1}, + end: {text: 'has a cat', offset:3} + }); + + + getSelection.returns({ + anchorNode: textSecond, + focusNode: textFirst, + anchorOffset: 3, + focusOffset: 1, + isCollapsed: false + }); + + check('different parents, anchor second', { + start: {text: 'Alice', offset: 1}, + end: {text: 'has a cat', offset:3} + }); + }); + it('returns boundries of selection when browser selection not collapsed', function() { var c = getCanvasFromXML('
Alice has a big cat
'), dom = c.doc().dom(),