/** * range.spec.js * (c) 2013~ Alan Hong * summernote may be freely distributed under the MIT license./ */ import chai from 'chai'; import chaidom from '../../../chaidom'; import $ from 'jquery'; import dom from '../../../../src/js/base/core/dom'; import range from '../../../../src/js/base/core/range'; var expect = chai.expect; chai.use(chaidom); describe('base:core.range', () => { describe('nodes', () => { describe('1 depth', () => { var $para; before(() => { var $cont = $('

para1

para2

'); $para = $cont.find('p'); }); it('should return array of two paragraphs', () => { var rng = range.create($para[0].firstChild, 0, $para[1].firstChild, 1); expect(rng.nodes(dom.isPara, { includeAncestor: true })).to.have.length(2); }); it('should return array of a paragraph', () => { var rng = range.create($para[0].firstChild, 0, $para[0].firstChild, 0); expect(rng.nodes(dom.isPara, { includeAncestor: true })).to.have.length(1); }); }); describe('multi depth', () => { it('should return array of a paragraph', () => { var $cont = $('

para1

para2

'); var $b = $cont.find('b'); var rng = range.create($b[0].firstChild, 0, $b[0].firstChild, 0); expect(rng.nodes(dom.isPara, { includeAncestor: true })).to.have.length(1); }); }); describe('on list, on heading', () => { it('should return array of list paragraphs', () => { var $cont = $('
'); var $li = $cont.find('li'); var rng = range.create($li[0].firstChild, 0, $li[1].firstChild, 1); expect(rng.nodes(dom.isPara, { includeAncestor: true })).to.have.length(2); }); it('should return array of list paragraphs', () => { var $cont = $('

heading1

heading2

'); var $h1 = $cont.find('h1'); var $h2 = $cont.find('h2'); var rng = range.create($h1[0].firstChild, 0, $h2[0].firstChild, 1); expect(rng.nodes(dom.isPara, { includeAncestor: true })).to.have.length(2); }); }); }); describe('commonAncestor', () => { var $cont; before(() => { $cont = $('
bu
'); }); it('should return for |b and u|', () => { var $span = $cont.find('span'); var $b = $cont.find('b'); var $u = $cont.find('u'); var rng = range.create($b[0].firstChild, 0, $u[0].firstChild, 1); expect(rng.commonAncestor()).to.deep.equal($span[0]); }); it('should return b(#textNode) for |b|', () => { var $b = $cont.find('b'); var rng = range.create($b[0].firstChild, 0, $b[0].firstChild, 1); expect(rng.commonAncestor()).to.deep.equal($b[0].firstChild); }); }); describe('expand', () => { it('should return |b ~ u| for |b with isAnchor', () => { var $cont = $('
bu
'); var $anchor = $cont.find('a'); var $b = $cont.find('b'); var rng = range.create($b[0].firstChild, 0, $b[0].firstChild, 0).expand(dom.isAnchor); expect(rng.sc).to.deep.equal($anchor[0]); expect(rng.so).to.equal(0); expect(rng.ec).to.deep.equal($anchor[0]); expect(rng.eo).to.equal(2); }); }); describe('collapse', () => { it('should return u| for |b ~ u|', () => { var $cont = $('
bu
'); var $b = $cont.find('b'); var $u = $cont.find('u'); var rng = range.create($b[0].firstChild, 0, $u[0].firstChild, 1).collapse(); expect(rng.sc).to.deep.equal($u[0].firstChild); expect(rng.so).to.equal(1); expect(rng.ec).to.deep.equal($u[0].firstChild); expect(rng.eo).to.equal(1); }); }); describe('normalize', () => { var $cont; before(() => { $cont = $('

bus

'); }); it('should return |b ~ u| for |b ~ u|', () => { var $p = $cont.find('p'); var $b = $cont.find('b'); var $u = $cont.find('u'); var rng = range.create($p[0], 0, $p[0], 2).normalize(); expect(rng.sc).to.deep.equal($b[0].firstChild); expect(rng.so).to.equal(0); expect(rng.ec).to.deep.equal($u[0].firstChild); expect(rng.eo).to.equal(1); }); it('should return b|u for b|u', () => { var $p = $cont.find('p'); var $b = $cont.find('b'); var rng = range.create($p[0], 1, $p[0], 1).normalize(); expect(rng.sc).to.deep.equal($b[0].firstChild); expect(rng.so).to.equal(1); expect(rng.ec).to.deep.equal($b[0].firstChild); expect(rng.eo).to.equal(1); }); it('should return b|u|s for b|u|s', () => { var $b = $cont.find('b'); var $u = $cont.find('u'); var $s = $cont.find('s'); var rng = range.create($b[0].firstChild, 1, $s[0].firstChild, 0).normalize(); expect(rng.sc).to.deep.equal($u[0].firstChild); expect(rng.so).to.equal(0); expect(rng.ec).to.deep.equal($u[0].firstChild); expect(rng.eo).to.equal(1); }); it('should return b|us for b|us', () => { var $b = $cont.find('b'); var rng = range.create($b[0].firstChild, 1, $b[0].firstChild, 1).normalize(); expect(rng.sc).to.deep.equal($b[0].firstChild); expect(rng.so).to.equal(1); expect(rng.ec).to.deep.equal($b[0].firstChild); expect(rng.eo).to.equal(1); }); }); describe('normalize (block mode)', () => { it('should return

text

|

for

text

|

', () => { var $cont = $('

text


'); var $p = $cont.find('p'); var rng = range.create($p[1], 0, $p[1], 0).normalize(); expect(rng.sc).to.deep.equal($p[1]); expect(rng.so).to.equal(0); expect(rng.ec).to.deep.equal($p[1]); expect(rng.eo).to.equal(0); }); it('should return

text

|text

for

text

|text

', () => { var $cont = $('

text

text

'); var $p = $cont.find('p'); var rng = range.create($p[1], 0, $p[1], 0).normalize(); expect(rng.sc).to.deep.equal($p[1].firstChild); expect(rng.so).to.equal(0); expect(rng.ec).to.deep.equal($p[1].firstChild); expect(rng.eo).to.equal(0); }); it('should return

|text

text|

for |

text

text

|', () => { var $cont = $('

text

text

'); var $p = $cont.find('p'); var rng = range.create($cont[0], 0, $cont[0], 2).normalize(); expect(rng.sc).to.deep.equal($p[0].firstChild); expect(rng.so).to.equal(0); expect(rng.ec).to.deep.equal($p[1].firstChild); expect(rng.eo).to.equal(4); }); }); describe('normalize (void element)', () => { it('should return

|bold

for

|bold

', () => { var $cont = $('

bold

'); var $p = $cont.find('p'); var $b = $cont.find('b'); var rng = range.create($p[0], 1, $p[0], 1).normalize(); expect(rng.sc).to.deep.equal($b[0].firstChild); expect(rng.so).to.equal(0); expect(rng.ec).to.deep.equal($b[0].firstChild); expect(rng.eo).to.equal(0); }); }); describe('insertNode', () => { it('should split paragraph when inserting a block element', () => { var $cont = $('

bold

'); var $b = $cont.find('b'); var $p2 = $('

p

'); var rng = range.create($b[0].firstChild, 2, $b[0].firstChild, 2); rng.insertNode($p2[0]); expect($cont.html()).to.equalsIgnoreCase('

bo

p

ld

'); }); it('should not split paragraph when inserting an inline element', () => { var $cont = $('

text

'); var $p = $cont.find('p'); var $u = $('u'); var rng = range.create($p[0].firstChild, 2, $p[0].firstChild, 2); rng.insertNode($u[0]); expect($cont.html()).to.equalsIgnoreCase('

teuxt

'); }); it('should not split paragraph when inserting an inline element case 2', () => { var $cont = $('

bold

'); var $b = $cont.find('b'); var $u = $('u'); var rng = range.create($b[0].firstChild, 2, $b[0].firstChild, 2); rng.insertNode($u[0]); expect($cont.html()).to.equalsIgnoreCase('

bould

'); }); }); describe('pasteHTML', () => { it('should not split a block element when inserting inline elements into it', () => { var $cont = $('

text

'); var $p = $cont.find('p'); var markup = 'spanitalic'; var rng = range.create($p[0].firstChild, 2); rng.pasteHTML(markup); expect($cont.html()).to.equalsIgnoreCase('

tespanitalicxt

'); }); it('should split an inline element when pasting inline elements into it', () => { var $cont = $('

bold

'); var $b = $cont.find('b'); var markup = 'spanitalic'; var rng = range.create($b[0].firstChild, 2); rng.pasteHTML(markup); expect($cont.html()).to.equalsIgnoreCase('

bospanitalicld

'); }); it('should split inline node when pasting an inline node and a block node into it', () => { var $cont = $('

bold

'); var $b = $cont.find('b'); var markup = 'span

italic

'; var rng = range.create($b[0].firstChild, 2); rng.pasteHTML(markup); expect($cont.html()).to.equalsIgnoreCase('

bospan

italic

ld

'); }); }); describe('deleteContents', () => { var $cont, $b; beforeEach(() => { $cont = $('

boldu

'); $b = $cont.find('b'); }); it('should remove text only for partial text', () => { var rng = range.create($b[0].firstChild, 1, $b[0].firstChild, 3); rng.deleteContents(); expect($cont.html()).to.equalsIgnoreCase('

bdu

'); }); it('should remove text for entire text', () => { var rng = range.create($b[0].firstChild, 0, $b[0].firstChild, 4); rng.deleteContents(); expect($cont.html()).to.equalsIgnoreCase('

u

'); }); }); describe('wrapBodyInlineWithPara', () => { it('should insert an empty paragraph when there is no contents', () => { var $cont = $('
'); var rng = range.create($cont[0], 0); rng.wrapBodyInlineWithPara(); expect($cont.html()).to.equalsIgnoreCase('


'); }); it('should wrap text with paragraph for text', () => { var $cont = $('
text
'); var rng = range.create($cont[0].firstChild, 2); rng.wrapBodyInlineWithPara(); expect($cont.html()).to.equalsIgnoreCase('

text

'); }); it('should wrap an inline node with paragraph when selecting text in the inline node', () => { var $cont = $('
bold
'); var $b = $cont.find('b'); var rng = range.create($b[0].firstChild, 2); rng.wrapBodyInlineWithPara(); expect($cont.html()).to.equalsIgnoreCase('

bold

'); }); it('should wrap inline nodes with paragraph when selecting text in the inline nodes', () => { var $cont = $('
bi
'); var rng = range.create($cont[0], 0); rng.wrapBodyInlineWithPara(); expect($cont.html()).to.equalsIgnoreCase('

bi

'); }); it('should wrap inline nodes with paragraph when selection some of text in the inline nodes #1', () => { var $cont = $('
bi
'); var rng = range.create($cont[0], 1); rng.wrapBodyInlineWithPara(); expect($cont.html()).to.equalsIgnoreCase('

bi

'); }); it('should wrap inline nodes with paragraph when selection some of text in the inline nodes #2', () => { var $cont = $('
bi
'); var rng = range.create($cont[0], 2); rng.wrapBodyInlineWithPara(); expect($cont.html()).to.equalsIgnoreCase('

bi

'); }); }); describe('getWordRange', () => { var $cont; before(() => { $cont = $('
super simple wysiwyg editor
'); }); it('should return the range itself when there is no word before cursor', () => { var rng = range.create($cont[0].firstChild, 0).getWordRange(); expect(rng.sc).to.deep.equal($cont[0].firstChild); expect(rng.so).to.equal(0); expect(rng.ec).to.deep.equal($cont[0].firstChild); expect(rng.eo).to.equal(0); }); it('should return expanded range when there is a word before cursor', () => { var rng = range.create($cont[0].firstChild, 5).getWordRange(); expect(rng.sc).to.deep.equal($cont[0].firstChild); expect(rng.so).to.equal(0); expect(rng.ec).to.deep.equal($cont[0].firstChild); expect(rng.eo).to.equal(5); }); it('should return expanded range when there is a half word before cursor', () => { var rng = range.create($cont[0].firstChild, 3).getWordRange(); expect(rng.sc).to.deep.equal($cont[0].firstChild); expect(rng.so).to.equal(0); expect(rng.ec).to.deep.equal($cont[0].firstChild); expect(rng.eo).to.equal(3); }); it('should return expanded range when there are words before cursor', () => { var rng = range.create($cont[0].firstChild, 12).getWordRange(); expect(rng.sc).to.deep.equal($cont[0].firstChild); expect(rng.so).to.equal(6); expect(rng.ec).to.deep.equal($cont[0].firstChild); expect(rng.eo).to.equal(12); }); }); });