X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/512fcabb2a882e26649612efb2b91f25cfc02ec3..58425daa1aa7e717e92eaec170262de31ed47bc0:/src/smartxml/smartxml.test.js diff --git a/src/smartxml/smartxml.test.js b/src/smartxml/smartxml.test.js index d997aa7..58156c2 100644 --- a/src/smartxml/smartxml.test.js +++ b/src/smartxml/smartxml.test.js @@ -1,7 +1,8 @@ define([ 'libs/chai', + 'libs/sinon', './smartxml.js' -], function(chai, smartxml) { +], function(chai, sinon, smartxml) { 'use strict'; /*jshint expr:true */ @@ -30,6 +31,15 @@ describe('smartxml', function() { var doc = getDocumentFromXML('
'); expect(doc.root.getTagName()).to.equal('div'); }); + + it('can resets its content entirely', function() { + var doc = getDocumentFromXML('
'); + + expect(doc.root.getTagName()).to.equal('div'); + + doc.loadXML('
'); + expect(doc.root.getTagName()).to.equal('header'); + }); }); describe('Basic ElementNode properties', function() { @@ -68,16 +78,123 @@ describe('smartxml', function() { }); describe('Changing node tag', function() { - it('keeps custom data', function() { + + it('can change tag name', function() { var node = elementNodeFromXML('
'); + node.setTag('span'); + expect(node.getTagName()).to.equal('span'); + }); - node.setData('key', 'value'); - node.setTag('header'); + it('emits nodeTagChange event', function() { + var node = elementNodeFromXML('
'), + spy = sinon.spy(); + + node.document.on('change', spy); + node.setTag('span'); + var event = spy.args[0][0]; + + expect(event.type).to.equal('nodeTagChange'); + expect(event.meta.node.sameNode(node)).to.be.true; + expect(event.meta.oldTagName).to.equal('div'); + }); + + describe('Implementation specific expectations', function() { + // DOM specifies ElementNode tag as a read-only property, so + // changing it in a seamless way is a little bit tricky. For this reason + // the folowing expectations are required, despite the fact that they actually are + // motivated by implemetation details. + + it('keeps node in the document', function() { + var doc = getDocumentFromXML('
'), + header = doc.root.contents()[0]; + header.setTag('span'); + expect(header.parent().sameNode(doc.root)).to.be.true; + }); + it('keeps custom data', function() { + var node = elementNodeFromXML('
'); + + node.setData('key', 'value'); + node.setTag('header'); + + expect(node.getTagName()).to.equal('header'); + expect(node.getData()).to.eql({key: 'value'}); + }); + + it('can change document root tag name', function() { + var doc = getDocumentFromXML('
'); + doc.root.setTag('span'); + expect(doc.root.getTagName()).to.equal('span'); + }); + + it('keeps contents', function() { + var node = elementNodeFromXML('
'); + node.setTag('header'); + expect(node.contents()).to.have.length(1); + }); + }); + + describe('Setting node attributes', function() { + it('can set node attribute', function() { + var node = elementNodeFromXML('
'); + + node.setAttr('key', 'value'); + expect(node.getAttr('key')).to.equal('value'); + }); + it('emits nodeAttrChange event', function() { + var node = elementNodeFromXML('
'), + spy = sinon.spy(); + + node.document.on('change', spy); + node.setAttr('key', 'value2'); + var event = spy.args[0][0]; + + expect(event.type).to.equal('nodeAttrChange'); + expect(event.meta.node.sameNode(node)).to.be.true; + expect(event.meta.attr).to.equal('key'); + expect(event.meta.oldVal).to.equal('value1'); + }); + }); + + }); + }); + + describe('Basic TextNode properties', function() { + it('can have its text set', function() { + var node = elementNodeFromXML('
Alice
'), + textNode = node.contents()[0]; + + textNode.setText('Cat'); + expect(textNode.getText()).to.equal('Cat'); + }); + + it('emits nodeTextChange', function() { + var node = elementNodeFromXML('
Alice
'), + textNode = node.contents()[0], + spy = sinon.spy(); + + textNode.document.on('change', spy); + textNode.setText('Cat'); + + var event = spy.args[0][0]; + expect(event.type).to.equal('nodeTextChange'); + }); + + describe('Wrapping TextNode contents', function() { + + it('wraps DocumentTextElement', function() { + var node = elementNodeFromXML('
Alice
'), + textNode = node.contents()[0]; - expect(node.getTagName()).to.equal('header'); - expect(node.getData()).to.eql({key: 'value'}); + var returned = textNode.wrapWith({tagName: 'header'}), + parent = textNode.parent(), + parent2 = node.contents()[0]; + + expect(returned.sameNode(parent)).to.be.equal(true, 'wrapper is a parent'); + expect(returned.sameNode(parent2)).to.be.equal(true, 'wrapper has a correct parent'); + expect(returned.getTagName()).to.equal('header'); }); }); + }); describe('Manipulations', function() { @@ -97,16 +214,6 @@ describe('smartxml', function() { expect(node.parent().sameNode(wrapper)).to.be.true; }); - it('wraps text node with element node', function() { - var node = elementNodeFromXML('
Alice
'), - textNode = node.contents()[0], - wrapper = elementNodeFromXML(''); - - textNode.wrapWith(wrapper); - expect(textNode.parent().sameNode(wrapper)).to.be.true; - expect(node.contents()).to.have.length(1); - }); - it('unwraps element node contents', function() { var node = elementNodeFromXML('
Alice
has propably a cat
!
'), outerDiv = node.contents()[1]; @@ -133,6 +240,19 @@ describe('smartxml', function() { expect(input.isEqualNode(output)).to.be.true; }); + + it('keeps entities intact', function() { + var xmlIn = '
< >
', + doc = getDocumentFromXML(xmlIn), + xmlOut = doc.toXML(); + expect(xmlOut).to.equal(xmlIn); + }); + it('keeps entities intact when they form html/xml', function() { + var xmlIn = '
<abc>
', + doc = getDocumentFromXML(xmlIn), + xmlOut = doc.toXML(); + expect(xmlOut).to.equal(xmlIn); + }); }); });