intergration wip: unwrapping DocumentTextNode from its parent if it's its parent...
[fnpeditor.git] / modules / documentCanvas / canvas / canvas.test3.js
index 609a36b..9aab247 100644 (file)
@@ -107,6 +107,22 @@ describe('Canvas', function() {
                 expect(section.getWlxmlClass()).to.be.undefined;
             });
         });
+
+        it('returns DocumentNodeElement instance from HTMLElement', function() {
+            var c = canvas.fromXML('<section></section>'),
+                htmlElement = c.doc().dom().get(0),
+                element = c.getDocumentElement(htmlElement);
+            expect(element).to.be.instanceOf(documentElement.DocumentNodeElement);
+            expect(element.sameNode(c.doc()));
+        });
+        
+        it('returns DocumentTextElement instance from Text Node', function() {
+            var c = canvas.fromXML('<section>Alice</section>'),
+                textNode = c.doc().children(0)[0].dom().get(0),
+                element = c.getDocumentElement(textNode);
+            expect(element).to.be.instanceOf(documentElement.DocumentTextElement);
+            expect(element.sameNode(c.doc().children()[0]));
+        });
     });
 
 
@@ -375,26 +391,42 @@ describe('Canvas', function() {
                     expect(returned.getWlxmlClass()).to.equal('some.class');
                 });
                 
-                it('wraps part of DocumentTextElement', function() {
-                    var c = canvas.fromXML('<section>Alice has a cat</section>'),
-                        text = c.doc().children()[0];
-                    
-                    var returned = text.wrapWithNodeElement({tag: 'header', klass: 'some.class', start: 5, end: 12}),
-                        children = c.doc().children();
-
-                    expect(children.length).to.equal(3);
-                    
-                    expect(children[0]).to.be.instanceOf(documentElement.DocumentTextElement);
-                    expect(children[0].getText()).to.equal('Alice');
+                describe('wrapping part of DocumentTextElement', function() {
+                    [{start: 5, end: 12}, {start: 12, end: 5}].forEach(function(offsets) {
+                        it('wraps in the middle ' + offsets.start + '/' + offsets.end, function() {
+                            var c = canvas.fromXML('<section>Alice has a cat</section>'),
+                                text = c.doc().children()[0];
+                            
+                            var returned = text.wrapWithNodeElement({tag: 'header', klass: 'some.class', start: offsets.start, end: offsets.end}),
+                                children = c.doc().children();
+
+                            expect(children.length).to.equal(3);
+                            
+                            expect(children[0]).to.be.instanceOf(documentElement.DocumentTextElement);
+                            expect(children[0].getText()).to.equal('Alice');
+
+                            expect(children[1].sameNode(returned)).to.be.true;
+                            expect(returned.getWlxmlTag()).to.equal('header');
+                            expect(returned.getWlxmlClass()).to.equal('some.class');
+                            expect(children[1].children().length).to.equal(1);
+                            expect(children[1].children()[0].getText()).to.equal(' has a ');
+
+                            expect(children[2]).to.be.instanceOf(documentElement.DocumentTextElement);
+                            expect(children[2].getText()).to.equal('cat');
+                        });
+                    });
 
-                    expect(children[1].sameNode(returned)).to.be.true;
-                    expect(returned.getWlxmlTag()).to.equal('header');
-                    expect(returned.getWlxmlClass()).to.equal('some.class');
-                    expect(children[1].children().length).to.equal(1);
-                    expect(children[1].children()[0].getText()).to.equal(' has a ');
+                    it('wraps whole text inside DocumentTextElement if offsets span entire content', function() {
+                         var c = canvas.fromXML('<section>Alice has a cat</section>'),
+                             text = c.doc().children()[0];
+                         
+                         var returned = text.wrapWithNodeElement({tag: 'header', klass: 'some.class', start: 0, end: 15}),
+                             children = c.doc().children();
 
-                    expect(children[2]).to.be.instanceOf(documentElement.DocumentTextElement);
-                    expect(children[2].getText()).to.equal('cat');
+                         expect(children.length).to.equal(1);
+                         expect(children[0]).to.be.instanceOf(documentElement.DocumentNodeElement);
+                         expect(children[0].children()[0].getText()).to.equal('Alice has a cat');
+                    });
                 });
 
                 it('wraps text spanning multiple sibling DocumentTextNodes', function() {
@@ -442,33 +474,70 @@ describe('Canvas', function() {
         });
 
         describe('Lists api', function() {
-            it('allows creation of a list from existing sibling DocumentElements', function() {
-                var c = canvas.fromXML('\
-                    <section>\
-                        Alice\
-                        <div>has</div>\
-                        a\
-                        <div>cat</div>\
-                    </section>'),
-                    section = c.doc(),
-                    textHas = section.children()[1],
-                    divA = section.children()[2]
+            describe('creating lists', function() {
+                it('allows creation of a list from existing sibling DocumentElements', function() {
+                    var c = canvas.fromXML('\
+                        <section>\
+                            Alice\
+                            <div>has</div>\
+                            a\
+                            <div>cat</div>\
+                        </section>'),
+                        section = c.doc(),
+                        textHas = section.children()[1],
+                        divA = section.children()[2]
+                    
+                    c.list.create({element1: textHas, element2: divA});
+
+                    expect(section.children().length).to.equal(3, 'section has three child elements');
+
+                    var child1 = section.children()[0],
+                        list = section.children()[1],
+                        child3 = section.children()[2];
+
+                    expect(child1.getText()).to.equal('Alice');
+                    expect(list.is('list')).to.equal(true, 'second child is a list');
+                    expect(list.children().length).to.equal(2, 'list contains two elements');
+                    list.children().forEach(function(child) {
+                        expect(child.getWlxmlClass()).to.equal('item', 'list childs have wlxml class of item');
+                    });
+                    expect(child3.children()[0].getText()).to.equal('cat');
+                });
                 
-                c.list.create({element1: textHas, element2: divA});
+                it('allows creating nested list from existing sibling list items', function() {
+                    var c = canvas.fromXML('\
+                        <section>\
+                            <div class="list-items">\
+                                <div class="item">A</div>\
+                                <div class="item">B</div>\
+                                <div class="item">C</div>\
+                                <div class="item">D</div>\
+                            </div>\
+                        </section>'),
+                        outerList = c.doc().children()[0],
+                        itemB = outerList.children()[1],
+                        itemC = outerList.children()[2];
+
+
+                        c.list.create({element1: itemB, element2: itemC});
+
+                    var outerListItems = outerList.children(),
+                        innerList = outerListItems[1].children()[0],
+                        innerListItems = innerList.children();
 
-                expect(section.children().length).to.equal(3, 'section has three child elements');
+                    expect(outerListItems.length).to.equal(3, 'outer list has three items');
+                    expect(outerListItems[0].children()[0].getText()).to.equal('A', 'first outer item ok');
+                    expect(outerListItems[1].getWlxmlClass()).to.equal('item', 'inner list is wrapped by item element');
 
-                var child1 = section.children()[0],
-                    list = section.children()[1],
-                    child3 = section.children()[2];
+                    expect(innerList.is('list')).to.equal(true, 'inner list created');
+                    expect(innerListItems.length).to.equal(2, 'inner list has two items');
+                    expect(innerListItems[0].children()[0].getText()).to.equal('B', 'first inner item ok');
+                    expect(innerListItems[1].children()[0].getText()).to.equal('C', 'second inner item ok');
+
+                    expect(outerListItems[2].children()[0].getText()).to.equal('D', 'last outer item ok');
 
-                expect(child1.getText()).to.equal('Alice');
-                expect(list.is('list')).to.equal(true, 'second child is a list');
-                expect(list.children().length).to.equal(2, 'list contains two elements');
-                list.children().forEach(function(child) {
-                    expect(child.getWlxmlClass()).to.equal('item', 'list childs have wlxml class of item');
                 });
-                expect(child3.children()[0].getText()).to.equal('cat');
+
             });
 
             describe('extracting list items', function() {
@@ -610,7 +679,7 @@ describe('Canvas', function() {
                         nestedList = list.children()[1].children()[0],
                         nestedListItem = nestedList.children()[1];
 
-                    c.list.extractItems({element1: nestedListItem, element2: nestedListItem, merge: true});
+                    c.list.extractItems({element1: nestedListItem, element2: nestedListItem});
 
                     var section = c.doc(),
                         list = section.children()[0],
@@ -659,7 +728,7 @@ describe('Canvas', function() {
                         nestedListItem1 = nestedList.children()[1],
                         nestedListItem2 = nestedList.children()[2];
 
-                    c.list.extractItems({element1: nestedListItem1, element2: nestedListItem2, merge: true});
+                    c.list.extractItems({element1: nestedListItem1, element2: nestedListItem2});
 
                     var section = c.doc(),
                         list = section.children()[0],
@@ -700,7 +769,7 @@ describe('Canvas', function() {
                         nestedListItem1 = nestedList.children()[0],
                         nestedListItem2 = nestedList.children()[1];
 
-                    c.list.extractItems({element1: nestedListItem1, element2: nestedListItem2, merge: true});
+                    c.list.extractItems({element1: nestedListItem1, element2: nestedListItem2});
 
                     var section = c.doc(),
                         list = section.children()[0],
@@ -741,7 +810,7 @@ describe('Canvas', function() {
                         nestedListItem1 = nestedList.children()[0],
                         nestedListItem2 = nestedList.children()[1];
 
-                    c.list.extractItems({element1: nestedListItem1, element2: nestedListItem2, merge: true});
+                    c.list.extractItems({element1: nestedListItem1, element2: nestedListItem2});
 
                     var section = c.doc(),
                         list = section.children()[0],
@@ -756,6 +825,41 @@ describe('Canvas', function() {
                     expect(item3.children()[0].getText()).to.equal('1.2', 'third item ok');
                     expect(item4.children()[0].getText()).to.equal('2', 'fourth item ok');
                 });
+
+                it('extracts items out of outer most list when merge flag is set to false', function() {
+                    var c = canvas.fromXML('\
+                        <section>\
+                            <div class="list.items">\
+                                <div class="item">0</div>\
+                                <div class="item">\
+                                    <div class="list.items">\
+                                        <div class="item">1.1</div>\
+                                        <div class="item">1.2</div>\
+                                    </div>\
+                                </div>\
+                                <div class="item">2</div>\
+                            </div>\
+                        </section>'),
+                        section = c.doc(),
+                        list = section.children()[0],
+                        nestedList = list.children()[1].children()[0],
+                        nestedListItem = nestedList.children()[0];
+
+                    var test = c.list.extractItems({element1: nestedListItem, element2: nestedListItem, merge: false});
+
+                    expect(test).to.equal(true, 'extraction status ok');
+
+                    var sectionChildren = section.children(),
+                        extractedItem = sectionChildren[1];
+
+                    expect(sectionChildren.length).to.equal(3, 'section has three children');
+                    expect(sectionChildren[0].is('list')).to.equal(true, 'first child is a list');
+
+                    expect(extractedItem.getWlxmlTag()).to.equal('div', 'extracted item is a wlxml div');
+                    expect(extractedItem.getWlxmlClass()).to.equal(undefined, 'extracted item has no wlxml class');
+                    expect(extractedItem.children()[0].getText()).to.equal('1.1', 'extracted item ok');
+                    expect(sectionChildren[2].is('list')).to.equal(true, 'second child is a list');
+                });
             });
         });