lining.js
Version:
An easy to use javascript plugin offers you complete DOWN-TO-THE-LINE control for radical web typography.
210 lines (181 loc) • 7.8 kB
JavaScript
describe('lining.js -- util', function() {
var util = lining.util;
var Lining = lining.Lining;
var root = document.createElement('div');
document.body.appendChild(root);
beforeEach(function() {
root.innerHTML = 'aaaaa'
+ '<span>bbb<b>ccc</b>ddd<i>hhh</i>iii</span>'
+ 'eeeee'
+ '<span>fffff</span>gggg';
});
afterEach(function () {
root.innerHTML = '';
});
it('util.removeChildren(start, 1)', function() {
var span = root.childNodes[1];
var count = span.childNodes.length;
var removed = util.removeChildren(span, 1);
expect(span.innerHTML).toBe('bbb');
expect(span.childNodes.length).toBe(1);
expect(removed.length).toBe(count - 1);
expect(removed[0].nodeValue).toBe('iii');
expect(removed[removed.length - 1].innerHTML).toBe('ccc');
});
it('util.removeChildren(start, 0)', function() {
util.removeChildren(root, 0);
expect(root.childNodes.length).toBe(0);
});
it('util.removeChildren(start, -1)', function() {
util.removeChildren(root, -1);
expect(root.childNodes.length).toBe(0);
});
it('util.removeChildren(start, lastIndex)', function() {
var oldHtml = root.innerHTML;
var count = root.childNodes.length;
util.removeChildren(root, count);
expect(root.childNodes.length).toBe(count);
util.removeChildren(root, count + 1);
expect(root.childNodes.length).toBe(count);
expect(root.innerHTML).toBe(oldHtml);
util.removeChildren(root, count - 1);
expect(root.childNodes.length).toBe(count - 1);
expect(root.lastChild.innerHTML).toBe('fffff');
});
it('util.removeChildren(start, 0, lastIndex)', function() {
util.removeChildren(root, 0, root.childNodes.length);
expect(root.childNodes.length).toBe(0);
});
it('util.removeChildren(start, 1, 3)', function() {
var removed = util.removeChildren(root, 1, 3);
expect(root.childNodes.length).toBe(3);
expect(removed.length).toBe(2);
expect(root.innerHTML).toBe('aaaaa<span>fffff</span>gggg');
});
it('util.removeChildren(start, 1, 1)', function() {
var removed = util.removeChildren(root, 1, 1);
expect(root.childNodes.length).toBe(5);
expect(removed).toEqual([]);
var removed = util.removeChildren(root, 4, 0);
expect(root.childNodes.length).toBe(5);
expect(removed).toEqual([]);
});
it('util.splitNode(span, offset)', function() {
var span = root.childNodes[1];
var re = util.splitNode(span, 2);
expect(span.childNodes.length).toBe(2);
expect(span.innerHTML).toBe('bbb<b>ccc</b>');
expect(span.nextSibling.nodeName).toBe('SPAN');
expect(span.nextSibling.childNodes.length).toBe(3);
expect(re).toBe(span.parentNode);
});
it('util.splitNode(span, 0)', function() {
var span = root.childNodes[1];
util.splitNode(span, 0);
expect(span.childNodes.length).toBe(0);
expect(span.innerHTML).toBe('');
expect(span.nextSibling.nodeName).toBe('SPAN');
expect(span.nextSibling.childNodes.length).toBe(5);
expect(span.nextSibling.innerHTML).toBe('bbb<b>ccc</b>ddd<i>hhh</i>iii');
});
it('util.getNodeOffset(node)', function () {
expect(util.getNodeOffset(root.firstChild)).toBe(0);
expect(util.getNodeOffset(root.lastChild)).toBe(root.childNodes.length - 1);
expect(util.getNodeOffset(root.childNodes[2])).toBe(2);
});
it('util.isEmptyNode(node)', function () {
var span = root.childNodes[1];
expect(util.isEmptyNode(span)).toBe(false);
var b = span.childNodes[1];
b.innerHTML = '';
expect(util.isEmptyNode(b)).toBe(true);
span.innerHTML = '<b><i>xxx</i></b>';
expect(util.isEmptyNode(span)).toBe(false);
span.innerHTML = '<b><i></i></b>';
expect(util.isEmptyNode(span)).toBe(true);
});
describe('util.getFirstContentNode(node)', function () {
beforeEach(function() {
root.innerHTML = '<span>111</span>'
+ '<span><b><i></i></b><b>222</b></span>'
+ '<span><b><i>333</i></b><b></b></span>'
+ '<span><b><i></i>444</b><b></b></span>'
+ '<span><b><i></i></b><b></b></span>'
+ '<span><b><i></i></b><b><i>555</i></b></span>'
+ '<span><b><i></i></b><b><i></i></b><span>666</span></span>'
+ '<span><b><i></i></b><b><i></i></b>777</span>';
});
it('1', function () {
expect(util.getFirstContentNode(root.childNodes[0])[0].nodeValue).toBe('111');
});
it('2', function () {
expect(util.getFirstContentNode(root.childNodes[1])[0].nodeValue).toBe('222');
});
it('3', function () {
expect(util.getFirstContentNode(root.childNodes[2])[0].nodeValue).toBe('333');
});
it('4', function () {
expect(util.getFirstContentNode(root.childNodes[3])[0].nodeValue).toBe('444');
});
it('5', function () {
expect(util.getFirstContentNode(root.childNodes[4])).toBe(null);
});
it('6', function () {
expect(util.getFirstContentNode(root.childNodes[5])[0].nodeValue).toBe('555');
});
it('7', function () {
expect(util.getFirstContentNode(root.childNodes[6])[0].nodeValue).toBe('666');
});
it('8', function () {
expect(util.getFirstContentNode(root.childNodes[7])[0].nodeValue).toBe('777');
});
});
describe('util.adjustOrSplitNode(ancestor, node, offset)', function () {
it('1', function () {
// <span>bbb<b>|ccc</b>ddd<i>hhh</i>iii</span>
var span = root.childNodes[1];
var b = span.childNodes[1];
var r = util.adjustOrSplitNode(root, b, 0);
expect(root.childNodes.length).toBe(6);
expect(r[0]).toBe(root);
expect(r[1]).toBe(2);
expect(span.innerHTML).toBe('bbb');
expect(span.nextSibling.nodeName).toBe('SPAN');
expect(span.nextSibling.innerHTML).toBe('<b>ccc</b>ddd<i>hhh</i>iii');
});
it('2', function () {
// <span>bbb<b>ccc</b>ddd<i>hhh</i>iii|</span>
var span = root.childNodes[1];
var r = util.adjustOrSplitNode(root, span, 5);
expect(root.childNodes.length).toBe(5);
expect(r[0]).toBe(root);
expect(r[1]).toBe(2);
});
it('3', function () {
// <span>|bbb<b>ccc</b>ddd<i>hhh</i>iii</span>
var span = root.childNodes[1];
var r = util.adjustOrSplitNode(root, span, 0);
expect(root.childNodes.length).toBe(5);
expect(r[0]).toBe(root);
expect(r[1]).toBe(1);
});
it('4', function () {
// <span>bbb<b>|ccc</b>ddd<i>hhh</i>iii</span>
var span = root.childNodes[1];
var b = span.childNodes[1];
var r = util.adjustOrSplitNode(root, b, 0);
expect(root.childNodes.length).toBe(6);
expect(r[0]).toBe(root);
expect(r[1]).toBe(2);
expect(span.innerHTML).toBe('bbb');
expect(span.nextSibling.nodeName).toBe('SPAN');
expect(span.nextSibling.innerHTML).toBe('<b>ccc</b>ddd<i>hhh</i>iii');
});
it('5', function () {
// node === ancestor
var r = util.adjustOrSplitNode(root, root, 0);
expect(r[0]).toBe(root);
expect(r[1]).toBe(0);
});
});
});