0fb40aad46b9dd0975f5bbd82d8ecf76b5788359
[fnpeditor.git] / modules / documentCanvas / canvas / canvas.test3.js
1 define([
2 'libs/chai',
3 'modules/documentCanvas/canvas/canvas',
4 'modules/documentCanvas/canvas/documentElement'
5 ], function(chai, canvas, documentElement) {
6     
7 'use strict';
8
9 var expect = chai.expect;
10
11
12 describe('Canvas', function() {
13     describe('basic properties', function() {
14         it('renders empty document when canvas created from empty XML', function() {
15             var c = canvas.fromXML('');
16             expect(c.doc()).to.equal(null);
17         });
18
19         it('gives access to its document root node', function() {
20             var c = canvas.fromXML('<section></section>');
21             expect(c.doc().wlxmlTag).to.equal('section');
22         });
23
24         describe('DocumentElement', function() {
25             it('knows index of its child', function() {
26                 var c = canvas.fromXML('<section><div></div><header></header><span></span></section>'),
27                     root = c.doc(),
28                     child = root.children()[1];
29                 expect(root.childIndex(child)).to.equal(1);
30             });
31
32             describe('DocumentTextElement can have its content set', function() {
33                 var c = canvas.fromXML('<section>Alice</section>'),
34                     root = c.doc(),
35                     text = root.children()[0];
36                 
37                 text.setText('a cat');
38                 expect(root.children()[0].getText()).to.equal('a cat');
39             });
40         });
41     });
42
43     describe('document representation api', function() {
44         describe('document root element', function() {
45             var c = canvas.fromXML('<section></section>');
46             it('exists', function() {
47                 expect(c.doc()).to.be.instanceOf(documentElement.DocumentElement);
48             });
49             it('is of type DocumentNodeElement', function() {
50                 expect(c.doc()).to.be.instanceOf(documentElement.DocumentNodeElement);
51             });
52         });
53
54         describe('DocumentElements comparison', function() {
55             it('reports dwo DocumentElements to be the same when they represent the same wlxml document element', function() {
56                 var c = canvas.fromXML('<section><div></div><div></div></section>'),
57                     first_div1 = c.doc().children()[0],
58                     first_div2 = c.doc().children()[0],
59                     second_div = c.doc().children()[1];
60                 expect(first_div1.sameNode(first_div1)).to.be.true;
61                 expect(first_div1.sameNode(first_div2)).to.be.true;
62                 expect(first_div1.sameNode(second_div)).to.be.false;
63             });
64         });
65
66         describe('traversing', function() {
67             it('reports element nodes', function() {
68                 var c = canvas.fromXML('<section><div></div></section>'),
69                     children = c.doc().children();
70                 expect(children.length).to.equal(1);
71                 expect(children[0]).to.be.instanceOf(documentElement.DocumentNodeElement);
72
73                 c = canvas.fromXML('<section><div></div><div></div></section>'),
74                     children = c.doc().children();
75                 expect(children.length).to.equal(2);
76                 expect(children[0]).to.be.instanceOf(documentElement.DocumentNodeElement);
77                 expect(children[1]).to.be.instanceOf(documentElement.DocumentNodeElement);
78             });
79             
80             it('reports text nodes', function() {
81                 var c = canvas.fromXML('<section>Alice</section>'),
82                     children = c.doc().children();
83                 expect(children.length).to.equal(1);
84                 expect(children[0]).to.be.instanceOf(documentElement.DocumentTextElement);
85             });
86
87             describe('accessing parents', function() {
88                 it('returns DocumentNodeElement representing parent in wlxml document as DocumentNodeElement parent', function() {
89                     var c = canvas.fromXML('<section><div></div></section>'),
90                         div = c.doc().children()[0];
91                     expect(div.parent().sameNode(c.doc())).to.be.true;
92                 });
93                 it('returns DocumentNodeElement representing parent in wlxml document as DocumentTextElement parent', function() {
94                     var c = canvas.fromXML('<section>Alice</section>'),
95                         text = c.doc().children()[0];
96                     expect(text.parent().sameNode(c.doc())).to.be.true;
97                 });
98             });
99
100             describe('free text handling', function() {
101                     it('sees free text', function() {
102                         var c = canvas.fromXML('<section>Alice <span>has</span> a cat</section>'),
103                             children = c.doc().children();
104                         expect(children.length).to.equal(3);
105                         expect(children[0]).to.be.instanceOf(documentElement.DocumentTextElement);
106                         expect(children[1]).to.be.instanceOf(documentElement.DocumentNodeElement);
107                         expect(children[2]).to.be.instanceOf(documentElement.DocumentTextElement);
108                     });
109             });
110             
111             describe('white characters handling', function() {
112                 it('says empty element node has no children', function() {
113                     var c = canvas.fromXML('<section></section>');
114                     expect(c.doc().children().length).to.equal(0);
115                 });
116                 it('says element node with one space has one DocumentTextElement', function() {
117                     var c = canvas.fromXML('<section> </section>');
118                     expect(c.doc().children().length).to.equal(1);
119                     expect(c.doc().children()[0]).to.be.instanceOf(documentElement.DocumentTextElement);
120                 });
121                 it('ignores white space surrounding block elements', function() {
122                     var c = canvas.fromXML('<section> <div></div> </section>');
123                     var children = c.doc().children();
124                     expect(children.length).to.equal(1);
125                     expect(children[0]).to.be.instanceOf(documentElement.DocumentNodeElement);
126                 });
127                 it('ignores white space between block elements', function() {
128                     var c = canvas.fromXML('<section><div></div> <div></div></section>');
129                     var children = c.doc().children();
130                     expect(children.length === 2);
131                     [0,1].forEach(function(idx) {
132                         expect(children[idx]).to.be.instanceOf(documentElement.DocumentNodeElement);
133                     });
134                 });
135             });
136         });
137
138         describe('manipulation api', function() {
139
140             describe('Basic Element inserting', function() {
141                 it('can put new NodeElement at the end', function() {
142                     var c = canvas.fromXML('<section></section>'),
143                         appended = c.doc().append({tag: 'header', klass: 'some.class'}),
144                         children = c.doc().children();
145
146                     expect(children.length).to.equal(1);
147                     expect(children[0].sameNode(appended));
148                 });
149
150                 it('can put new NodeElement after another NodeElement', function() {
151                     var c = canvas.fromXML('<section><div></div></section>'),
152                         div = c.doc().children()[0],
153                         added = div.after({tag: 'header', klass: 'some.class'}),
154                         children = c.doc().children();
155                     expect(children.length).to.equal(2);
156                     expect(children[1].sameNode(added));
157                 });
158
159                 it('can put new Nodeelement before another element', function() {
160                     var c = canvas.fromXML('<section><div></div></section>'),
161                         div = c.doc().children()[0],
162                         added = div.before({tag: 'header', klass: 'some.class'}),
163                         children = c.doc().children();
164                     expect(children.length).to.equal(2);
165                     expect(children[0].sameNode(added));
166                 });
167             });
168
169             describe('wrapping', function() {
170                 it('wraps DocumentNodeElement', function() {
171                     var c = canvas.fromXML('<section><div></div></section>'),
172                         div = c.doc().children()[0];
173                     
174                     var returned = div.wrapWithNodeElement({tag: 'header', klass: 'some.class'}),
175                         parent = div.parent(),
176                         parent2 = c.doc().children()[0];
177
178                     expect(returned.sameNode(parent)).to.be.true;
179                     expect(returned.sameNode(parent2)).to.be.true;
180                 });
181                 it('wraps DocumentTextElement', function() {
182                     var c = canvas.fromXML('<section>Alice</section>'),
183                         text = c.doc().children()[0];
184                     
185                     var returned = text.wrapWithNodeElement({tag: 'header', klass: 'some.class'}),
186                         parent = text.parent(),
187                         parent2 = c.doc().children()[0];
188
189                     expect(returned.sameNode(parent)).to.be.true;
190                     expect(returned.sameNode(parent2)).to.be.true;
191                 });
192             });
193         });
194
195     });
196 });
197
198
199 });