X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/e5d6cddf0560271b56c4c4683d6194b067e8348c..1eebf7be27d533a4b8ca1dba2c64e574dee8e17d:/src/smartxml/smartxml.test.js
diff --git a/src/smartxml/smartxml.test.js b/src/smartxml/smartxml.test.js
index 2198795..86f16de 100644
--- a/src/smartxml/smartxml.test.js
+++ b/src/smartxml/smartxml.test.js
@@ -4,31 +4,41 @@ define([
], function(chai, smartxml) {
'use strict';
-
+/*jshint expr:true */
+/* global describe, it, beforeEach */
var expect = chai.expect;
var getDocumentFromXML = function(xml) {
return smartxml.documentFromXML(xml);
-}
+};
var elementNodeFromParams = function(params) {
return smartxml.elementNodeFromXML('<' + params.tag + '>' + params.tag + '>');
-}
+};
var elementNodeFromXML = function(xml) {
return smartxml.elementNodeFromXML(xml);
-}
+};
-describe.only('smartxml', function() {
+describe('smartxml', function() {
describe('Basic Document properties', function() {
it('exposes its root element', 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() {
@@ -41,7 +51,77 @@ describe.only('smartxml', function() {
expect(contents[1].nodeType).to.equal(Node.ELEMENT_NODE, 'element node 1');
expect(contents[2].nodeType).to.equal(Node.TEXT_NODE, 'text node 2');
});
- })
+
+ describe('Storing custom data', function() {
+ var node;
+
+ beforeEach(function() {
+ node = elementNodeFromXML('');
+ });
+
+ it('can append single value', function() {
+ node.setData('key', 'value');
+ expect(node.getData('key')).to.equal('value');
+ });
+
+ it('can overwrite the whole data', function() {
+ node.setData('key1', 'value1');
+ node.setData({key2: 'value2'});
+ expect(node.getData('key2')).to.equal('value2');
+ });
+
+ it('can fetch the whole data at once', function() {
+ node.setData({key1: 'value1', key2: 'value2'});
+ expect(node.getData()).to.eql({key1: 'value1', key2: 'value2'});
+ });
+ });
+
+ describe('Changing node tag', function() {
+
+ it('can change tag name', function() {
+ var node = elementNodeFromXML('');
+ node.setTag('span');
+ expect(node.getTagName()).to.equal('span');
+ });
+
+ 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('Manipulations', function() {
@@ -52,6 +132,24 @@ describe.only('smartxml', function() {
expect(node1.contents()[0].sameNode(node2)).to.be.true;
});
+ it('wraps element node with another element node', function() {
+ var node = elementNodeFromXML(''),
+ wrapper = elementNodeFromXML('');
+
+ node.wrapWith(wrapper);
+ 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];
@@ -66,6 +164,33 @@ describe.only('smartxml', function() {
});
+ describe('Serializing document to WLXML', function() {
+ it('keeps document intact when no changes have been made', function() {
+ var xmlIn = '',
+ doc = getDocumentFromXML(xmlIn),
+ xmlOut = doc.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 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 = '',
+ doc = getDocumentFromXML(xmlIn),
+ xmlOut = doc.toXML();
+ expect(xmlOut).to.equal(xmlIn);
+ });
+ });
+
});
});
\ No newline at end of file