editor: canvas displays span node as block if it contains non span nodes
[fnpeditor.git] / src / editor / modules / documentCanvas / canvas / canvas.test.js
index 7a0380a..642438a 100644 (file)
@@ -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('<section><span>Alice</span></section>'),
+            spanElement = c.doc().children()[0];
+        expect(spanElement.isBlock()).to.equal(false);
+    });
+    it('renders non-span element as a block', function() {
+        var c = getCanvasFromXML('<section><span></span></section>'),
+            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('<section><span>Alice <div>has</div> a cat!</span></section>'),
+            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('<section><div><div></div></div></section>'),
+            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;