X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/72dfc92f908add69b4d862e9b6c3107e2a8acd21..6535ed0c525f70c936a8e25ff38df5157b15c04c:/modules/documentCanvas/canvas/canvas.test3.js diff --git a/modules/documentCanvas/canvas/canvas.test3.js b/modules/documentCanvas/canvas/canvas.test3.js index 08e6e0f..9877bb6 100644 --- a/modules/documentCanvas/canvas/canvas.test3.js +++ b/modules/documentCanvas/canvas/canvas.test3.js @@ -27,10 +27,18 @@ describe('Canvas', function() { </section>\ '); var expected = '<div wlxml-tag="section">' - + 'This is some text without its own wrapping tag.' - + '<div wlxml-tag="div" wlxml-class="p-subclass">This is a paragraph.</div>' - + '<div wlxml-tag="div">This is text in a div <div wlxml-tag="span">with some inline text</div>.</div>' - + 'This is some text without its own wrapping tag.' + + '<div wlxml-text>This is some text without its own wrapping tag.</div>' + + '<div wlxml-tag="div" wlxml-class="p-subclass">' + + '<div wlxml-text>This is a paragraph.</div>' + + '</div>' + + '<div wlxml-tag="div">' + + '<div wlxml-text>This is text in a div </div>' + + '<div wlxml-tag="span">' + + '<div wlxml-text>with some inline text</div>' + + '</div>' + + '<div wlxml-text>.</div>' + + '</div>' + + '<div wlxml-text>This is some text without its own wrapping tag.</div>' + '</div>'; 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('<section>Alice</section>').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'); }); }); @@ -106,14 +118,43 @@ describe('Canvas', function() { }); it('knows WLXML class of a WLXML tag it renders', function(){ - var c = canvas.fromXML('<section class="some.class"></section>'), + var c = canvas.fromXML('<section class="some.class.A"></section>'), 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('<section><span class="uri" meta-uri="someuri"></span></section>'), + 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('<section><span class="uri" meta-uri="someuri"></span></section>'), + 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('<section><span class="uri" meta-uri="someuri"></span></section>'), + span = c.doc().children()[0]; + span.setWlxmlClass('uri.some.subclass'); + expect(span.getWlxmlMetaAttr('uri')).to.equal('someuri'); + }); + }); }); it('returns DocumentNodeElement instance from HTMLElement', function() { @@ -127,7 +168,7 @@ describe('Canvas', function() { it('returns DocumentTextElement instance from Text Node', function() { var c = canvas.fromXML('<section>Alice</section>'), aliceElement = c.doc().children()[0], - textNode = aliceElement.dom()[0], + textNode = aliceElement.dom().contents()[0], element = c.getDocumentElement(textNode); expect(textNode.nodeType).to.equal(Node.TEXT_NODE, 'text node selected'); @@ -255,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('<section><metadata><dc:author>author</dc:author></metadata>Alice<div>has</div>a cat</section>'), + 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('\ + <section>\ + <div>\ + <div>\ + Alice\ + </div>\ + </div>\ + Some text\ + </section>'), + 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() { @@ -266,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() { @@ -275,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'); }); @@ -285,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() { @@ -294,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() { @@ -330,7 +397,7 @@ 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]; @@ -342,6 +409,9 @@ describe('Canvas', function() { 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() { @@ -506,10 +576,11 @@ describe('Canvas', function() { section = c.doc(), text = section.children()[1].children()[0]; - text.unwrap(); + var newTextContainer = text.unwrap(); 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'); }) }); }); @@ -921,8 +992,9 @@ describe('Canvas', function() { it('returns position when browser selection collapsed', function() { var c = canvas.fromXML('<section>Alice has a cat</section>'), dom = c.doc().dom(), - text = dom.contents()[0]; + text = $(dom.contents()[0]).contents()[0]; + expect(text.nodeType).to.equal(Node.TEXT_NODE, 'correct node selected'); expect($(text).text()).to.equal('Alice has a cat'); getSelection.returns({ @@ -938,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() { @@ -1005,6 +1088,178 @@ describe('Canvas', function() { }) }); + + describe('Serializing document to WLXML', function() { + it('keeps document intact when no changes have been made', function() { + var xmlIn = '<section>Alice<div>has</div>a <span class="uri" meta-uri="http://cat.com">cat</span>!</section>', + c = canvas.fromXML(xmlIn), + xmlOut = c.toXML(); + + var parser = new DOMParser(), + input = parser.parseFromString(xmlIn, "application/xml").childNodes[0], + output = parser.parseFromString(xmlOut, "application/xml").childNodes[0]; + + expect(input.isEqualNode(output)).to.be.true; + }); + + it('keeps arbitrary node attributes intact', function() { + var xmlIn = '<section a="1" xmlns:dcterms="http://purl.org/dc/terms/"></section>', + $xmlOut = $(canvas.fromXML(xmlIn).toXML()); + + expect($xmlOut.attr('a')).to.equal('1'); + expect($xmlOut.attr('xmlns:dcterms')).to.equal('http://purl.org/dc/terms/'); + }); + + it('doesn\' serialize meta attribute if its empty', function() { + var c; + + c = canvas.fromXML('<section class="uri" meta-uri="some.uri"></section>'); + c.doc().setWlxmlMetaAttr('uri', ''); + expect($(c.toXML()).attr('meta-uri')).to.equal(undefined, 'overriding attribute with zero length string'); + + c = canvas.fromXML('<section class="uri"></section>'); + c.doc().setWlxmlMetaAttr('uri', ''); + expect($(c.toXML()).attr('meta-uri')).to.equal(undefined, 'setting attribute to zero length string'); + }); + + describe('output xml', function() { + it('keeps entities intact', function() { + var xmlIn = '<section>< ></section>', + c = canvas.fromXML(xmlIn), + xmlOut = c.toXML(); + expect(xmlOut).to.equal(xmlIn); + }); + it('keeps entities intact when they form html/xml', function() { + var xmlIn = '<section><abc></section>', + c = canvas.fromXML(xmlIn), + xmlOut = c.toXML(); + expect(xmlOut).to.equal(xmlIn); + }); + }); + + describe('formatting output xml', function() { + /*it('keeps white spaces at the edges of input xml', function() { + var xmlIn = ' <section></section> ', + c = canvas.fromXML(xmlIn), + xmlOut = c.toXML(); + + expect(xmlOut.substr(4)).to.equal(' <', 'start'); + expect(xmlOut.substr(-2)).to.equal('> ', 'end'); + });*/ + it('keeps white space between XML nodes', function() { + var xmlIn = '<section>\n\n\n<div></div>\n\n\n<div></div>\n\n\n</section>', + c = canvas.fromXML(xmlIn), + xmlOut = c.toXML(); + + var partsIn = xmlIn.split('\n\n\n'), + partsOut = xmlOut.split('\n\n\n'); + + expect(partsIn).to.deep.equal(partsOut); + }); + + it('keeps white space between XML nodes - inline case', function() { + var xmlIn = '<section>\n\n\n<span></span>\n\n\n<span></span>\n\n\n</section>', + c = canvas.fromXML(xmlIn), + xmlOut = c.toXML(); + + var partsIn = xmlIn.split('\n\n\n'), + partsOut = xmlOut.split('\n\n\n'); + + expect(partsIn).to.deep.equal(partsOut); + }); + + it('keeps white space at the beginning of text', function() { + var xmlIn = '<section> abc<div>some div</div> abc</section>', + c = canvas.fromXML(xmlIn), + xmlOut = c.toXML(); + + expect(xmlOut).to.equal(xmlIn); + }); + + it('nests new children block elements', function() { + var c = canvas.fromXML('<section></section>'); + + c.doc().append({tag: 'header'}); + + var xmlOut = c.toXML(); + expect(xmlOut.split('\n ')[0]).to.equal('<section>', 'nesting start ok'); + expect(xmlOut.split('\n').slice(-1)[0]).to.equal('</section>', 'nesting end ok'); + + }); + + it('doesn\'t nest new children inline elements', function() { + var c = canvas.fromXML('<section></section>'); + + c.doc().append({tag: 'span'}); + + var xmlOut = c.toXML(); + expect(xmlOut).to.equal('<section><span></span></section>'); + }); + + it('keeps original white space at the end of text', function() { + + var xmlIn = '<header> Some text ended with white space \ + \ + <span class="uri">Some text</span> some text\ + \ + </header>', + c = canvas.fromXML(xmlIn); + + var xmlOut = c.toXML(); + console.log(xmlOut); + expect(xmlOut).to.equal(xmlIn); + }); + + it('keeps white space around text node', function() { + var xmlIn = '<section>\ + <header>header1</header>\ + Some text surrounded by white space\ + <header>header2</header>\ + </section>', + c = canvas.fromXML(xmlIn); + + var xmlOut = c.toXML(); + expect(xmlOut).to.equal(xmlIn); + }); + + it('keeps white space around text node - last node case', function() { + var xmlIn = '<section>\ + <header>header</header>\ + \ + Some text surrounded by white space\ + \ + </section>', + c = canvas.fromXML(xmlIn); + + var xmlOut = c.toXML(); + expect(xmlOut).to.equal(xmlIn); + }); + + it('keeps white space after detaching text element', function() { + var xmlIn = '<section><header>header</header>\n\ + \n\ + text1\n\ + \n\ + </section>', + expectedXmlOut = '<section><header>header</header>\n\ + \n\ + \n\ + \n\ + </section>', + c = canvas.fromXML(xmlIn), + children = c.doc().children(), + text = children[children.length-1]; + + expect(text.getText()).to.equal('text1'); + + text.detach(); + + var xmlOut = c.toXML(); + expect(xmlOut).to.equal(expectedXmlOut); + }); + + }) + }) });