X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/3c7a0345c83f8377152afc99ea773ccdf573e051..1576b7c8102f5e5a5cd40512b5d22565e8f871d2:/modules/documentCanvas/canvas/canvas.test3.js?ds=inline diff --git a/modules/documentCanvas/canvas/canvas.test3.js b/modules/documentCanvas/canvas/canvas.test3.js index 147da86..23061d9 100644 --- a/modules/documentCanvas/canvas/canvas.test3.js +++ b/modules/documentCanvas/canvas/canvas.test3.js @@ -27,10 +27,18 @@ describe('Canvas', function() { \ '); var expected = '
' - + 'This is some text without its own wrapping tag.' - + '
This is a paragraph.
' - + '
This is text in a div
with some inline text
.
' - + 'This is some text without its own wrapping tag.' + + '
This is some text without its own wrapping tag.
' + + '
' + + '
This is a paragraph.
' + + '
' + + '
' + + '
This is text in a div
' + + '
' + + '
with some inline text
' + + '
' + + '
.
' + + '
' + + '
This is some text without its own wrapping tag.
' + '
'; expect(c.doc().dom()[0].isEqualNode($(expected)[0])).to.be.true; }); @@ -54,9 +62,13 @@ describe('Canvas', function() { }); describe('Internal HTML representation of a DocumentTextElement', function() { - it('is just a TextNode', function() { + it('is text node wrapped in a div with wlxml-text attribute set', function() { var dom = canvas.fromXML('
Alice
').doc().children()[0].dom(); - expect(dom[0].nodeType === Node.TEXT_NODE); + expect(dom.prop('tagName')).to.equal('DIV'); + expect(dom.attr('wlxml-text')).to.equal(''); + expect(dom.contents().length).to.equal(1); + expect(dom.contents()[0].nodeType).to.equal(Node.TEXT_NODE); + expect($(dom.contents()[0]).text()).to.equal('Alice'); }); }); @@ -68,7 +80,14 @@ describe('Canvas', function() { it('gives access to its document root node', function() { var c = canvas.fromXML('
'); - expect(c.doc().wlxmlTag).to.equal('section'); + expect(c.doc().getWlxmlTag()).to.equal('section'); + }); + + describe('root element', function() { + it('has no parent', function() { + var c = canvas.fromXML('
'); + expect(c.doc().parent()).to.be.null; + }); }); describe('DocumentTextElement', function() { @@ -99,14 +118,43 @@ describe('Canvas', function() { }); it('knows WLXML class of a WLXML tag it renders', function(){ - var c = canvas.fromXML('
'), + var c = canvas.fromXML('
'), section = c.doc(); - expect(section.getWlxmlClass()).to.equal('some.class'); - section.setWlxmlClass('some.other.class'); - expect(section.getWlxmlClass()).to.equal('some.other.class'); + expect(section.getWlxmlClass()).to.equal('some.class.A'); + section.setWlxmlClass('some.class.B'); + expect(section.getWlxmlClass()).to.equal('some.class.B'); section.setWlxmlClass(null); expect(section.getWlxmlClass()).to.be.undefined; }); + + + + describe('element has meta attributes', function() { + it('can change its meta attributes', function() { + var c = canvas.fromXML('
'), + span = c.doc().children()[0]; + + expect(span.getWlxmlMetaAttr('uri')).to.equal('someuri'); + span.setWlxmlMetaAttr('uri', 'otheruri'); + expect(span.getWlxmlMetaAttr('uri')).to.equal('otheruri'); + }); + + it('changes its meta attributes with class change', function() { + var c = canvas.fromXML('
'), + span = c.doc().children()[0]; + + expect(span.getWlxmlMetaAttr('uri')).to.equal('someuri'); + span.setWlxmlClass('author'); + expect(span.getWlxmlMetaAttr('uri')).to.be.undefined; + }); + + it('keeps meta attribute value on class change if a new class has this attribute', function() { + var c = canvas.fromXML('
'), + span = c.doc().children()[0]; + span.setWlxmlClass('uri.some.subclass'); + expect(span.getWlxmlMetaAttr('uri')).to.equal('someuri'); + }); + }); }); it('returns DocumentNodeElement instance from HTMLElement', function() { @@ -119,8 +167,13 @@ describe('Canvas', function() { it('returns DocumentTextElement instance from Text Node', function() { var c = canvas.fromXML('
Alice
'), - textNode = c.doc().children(0)[0].dom().get(0), + aliceElement = c.doc().children()[0], + textNode = aliceElement.dom().contents()[0], element = c.getDocumentElement(textNode); + + expect(textNode.nodeType).to.equal(Node.TEXT_NODE, 'text node selected'); + expect($(textNode).text()).to.equal('Alice'); + expect(element).to.be.instanceOf(documentElement.DocumentTextElement); expect(element.sameNode(c.doc().children()[0])); }); @@ -243,6 +296,32 @@ describe('Canvas', function() { expect(c.doc().children()[2].getText()).to.equal(' cat'); }); }); + + describe('getting vertically first text element', function() { + it('returns the first child if it\'s text element, ignores metadata', function() { + var c = canvas.fromXML('
authorAlice
has
a cat
'), + first = c.doc().getVerticallyFirstTextElement(); + + expect(first.sameNode(c.doc().children()[1])).to.be.true; + }); + + it('looks recursively inside node elements if they precede text element', function() { + var c = canvas.fromXML('\ +
\ +
\ +
\ + Alice\ +
\ +
\ + Some text\ +
'), + textAlice = c.doc().children()[0].children()[0].children()[0], + first = c.doc().getVerticallyFirstTextElement(); + + expect(textAlice).to.be.instanceOf(documentElement.DocumentTextElement); + expect(first.sameNode(textAlice)).to.be.true; + }); + }); }); describe('manipulation api', function() { @@ -254,7 +333,7 @@ describe('Canvas', function() { children = c.doc().children(); expect(children.length).to.equal(1); - expect(children[0].sameNode(appended)); + expect(children[0].sameNode(appended)).to.be.true; }); it('can put new TextElement at the end', function() { @@ -263,7 +342,7 @@ describe('Canvas', function() { children = c.doc().children(); expect(children.length).to.equal(1); - expect(children[0].sameNode(appended)); + expect(children[0].sameNode(appended)).to.be.true; expect(children[0].getText()).to.equal('Alice'); }); @@ -273,7 +352,7 @@ describe('Canvas', function() { added = div.after({tag: 'header', klass: 'some.class'}), children = c.doc().children(); expect(children.length).to.equal(2); - expect(children[1].sameNode(added)); + expect(children[1].sameNode(added)).to.be.true; }); it('can put new Nodeelement before another element', function() { @@ -282,7 +361,7 @@ describe('Canvas', function() { added = div.before({tag: 'header', klass: 'some.class'}), children = c.doc().children(); expect(children.length).to.equal(2); - expect(children[0].sameNode(added)); + expect(children[0].sameNode(added)).to.be.true; }); it('can put new DocumentNodeElement after DocumentTextElement', function() { @@ -318,18 +397,49 @@ describe('Canvas', function() { section = c.doc(), text = section.children()[0].children()[0]; - text.split({offset: 5}); + var returnedValue = text.split({offset: 5}); expect(section.children().length).to.equal(2, 'section has two children'); var header1 = section.children()[0]; var header2 = section.children()[1]; - expect(header1.wlxmlTag).to.equal('header', 'first section child represents wlxml header'); + expect(header1.getWlxmlTag()).to.equal('header', 'first section child represents wlxml header'); expect(header1.children().length).to.equal(1, 'first header has one text child'); expect(header1.children()[0].getText()).to.equal('Some ', 'first header has correct content'); - expect(header2.wlxmlTag).to.equal('header', 'second section child represents wlxml header'); + expect(header2.getWlxmlTag()).to.equal('header', 'second section child represents wlxml header'); expect(header2.children().length).to.equal(1, 'second header has one text child'); expect(header2.children()[0].getText()).to.equal('header', 'second header has correct content'); + + expect(returnedValue.first.sameNode(header1)).to.equal(true, 'first node returnde'); + expect(returnedValue.second.sameNode(header2)).to.equal(true, 'second node returned'); + }); + + it('leaves empty copy of DocumentNodeElement if splitting at the very beginning', function() { + var c = canvas.fromXML('
Some header
'), + section = c.doc(), + text = section.children()[0].children()[0]; + + text.split({offset: 0}); + + var header1 = section.children()[0]; + var header2 = section.children()[1]; + + expect(header1.children().length).to.equal(0); + expect(header2.children()[0].getText()).to.equal('Some header'); + }); + + it('leaves empty copy of DocumentNodeElement if splitting at the very end', function() { + var c = canvas.fromXML('
Some header
'), + section = c.doc(), + text = section.children()[0].children()[0]; + + text.split({offset: 11}); + + var header1 = section.children()[0]; + var header2 = section.children()[1]; + + expect(header1.children()[0].getText()).to.equal('Some header'); + expect(header2.children().length).to.equal(0); }); it('keeps DocumentTextElement\'s parent\'s children elements intact', function() { @@ -347,19 +457,19 @@ describe('Canvas', function() { var sectionChildren = section.children(); expect(sectionChildren.length).to.equal(2, 'Section has two children'); - expect(sectionChildren[0].wlxmlTag).to.equal('header', 'First section element is a wlxml header'); - expect(sectionChildren[1].wlxmlTag).to.equal('header', 'Second section element is a wlxml header'); + expect(sectionChildren[0].getWlxmlTag()).to.equal('header', 'First section element is a wlxml header'); + expect(sectionChildren[1].getWlxmlTag()).to.equal('header', 'Second section element is a wlxml header'); var firstHeaderChildren = sectionChildren[0].children(); expect(firstHeaderChildren.length).to.equal(3, 'First header has three children'); expect(firstHeaderChildren[0].getText()).to.equal('A ', 'First header starts with a text'); - expect(firstHeaderChildren[1].wlxmlTag).to.equal('span', 'First header has span in the middle'); + expect(firstHeaderChildren[1].getWlxmlTag()).to.equal('span', 'First header has span in the middle'); expect(firstHeaderChildren[2].getText()).to.equal(' a', 'First header ends with text'); var secondHeaderChildren = sectionChildren[1].children(); expect(secondHeaderChildren.length).to.equal(3, 'Second header has three children'); expect(secondHeaderChildren[0].getText()).to.equal('nd ', 'Second header starts with text'); - expect(secondHeaderChildren[1].wlxmlTag).to.equal('span', 'Second header has span in the middle'); + expect(secondHeaderChildren[1].getWlxmlTag()).to.equal('span', 'Second header has span in the middle'); expect(secondHeaderChildren[2].getText()).to.equal(' header', 'Second header ends with text'); }); }); @@ -462,14 +572,15 @@ describe('Canvas', function() { describe('unwrapping', function() { it('unwraps DocumentTextElement from its parent DocumentNodeElement if it\'s its only child', function() { - var c = canvas.fromXML('
Alice has a cat
'), + var c = canvas.fromXML('
Alice has a cat
'), section = c.doc(), - text = section.children()[0].children()[0]; + text = section.children()[1].children()[0]; - text.unwrap(); + var newTextContainer = text.unwrap(); - expect(section.children().length).to.equal(1); + expect(section.children().length).to.equal(1, 'section has one child'); 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'); }) }); }); @@ -881,13 +992,14 @@ describe('Canvas', function() { it('returns position when browser selection collapsed', function() { var c = canvas.fromXML('
Alice has a cat
'), dom = c.doc().dom(), - text = dom.contents(0); + text = $(dom.contents()[0]).contents()[0]; - expect(text.text()).to.equal('Alice has a cat'); + expect(text.nodeType).to.equal(Node.TEXT_NODE, 'correct node selected'); + expect($(text).text()).to.equal('Alice has a cat'); getSelection.returns({ - anchorNode: text[0], - focusNode: text[0], + anchorNode: text, + focusNode: text, anchorOffset: 5, focusOffset: 5, isCollapsed: true @@ -898,6 +1010,17 @@ describe('Canvas', function() { 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); + expect(position.offsetAtEnd).to.equal(false, 'offset is not at end'); + + getSelection.returns({ + anchorNode: text, + focusNode: text, + anchorOffset: 15, + focusOffset: 15, + isCollapsed: true + }); + + expect(cursor.getPosition().offsetAtEnd).to.equal(true, 'offset at end'); }); it('returns boundries of selection when browser selection not collapsed', function() {