dom-layer
Version:
Virtual DOM implementation.
416 lines (251 loc) • 10.2 kB
JavaScript
var h = require('../helper/h');
var _ = require('../helper/util');
var patch = require('../../src/tree/patch');
describe(".patch()", function() {
function spanNum(n) {
if (typeof n === 'string') {
return h({ tagName: 'span' }, [n]);
} else {
return h({ tagName: 'span', key: n }, [n.toString()]);
}
}
describe("when using regular nodes", function() {
it("adds all nodes", function() {
var from = _.buildNodes([]);
var to = _.buildNodes(['#0', '#1', '#2', '#3']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot, rootNode);
expect(newRoot.textContent).toBe('#0#1#2#3');
});
it("sizes up", function() {
var from = _.buildNodes(['#0', '#1']);
var to = _.buildNodes(['#0', '#1', '#2', '#3']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot, rootNode);
expect(newRoot.textContent).toBe('#0#1#2#3');
});
it("sizes down", function() {
var from = _.buildNodes(['#0', '#1', '#2', '#3']);
var to = _.buildNodes(['#0', '#1']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot, rootNode);
expect(newRoot.textContent).toBe('#0#1');
});
it("clears all nodes", function() {
var from = _.buildNodes(['#0', '#1', '#2', '#3']);
var to = _.buildNodes([]);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot, rootNode);
expect(newRoot.textContent).toBe('');
});
});
describe("when using mixed nodes", function() {
it("removes a key", function() {
var from = _.buildNodes(['1', '#0', '#1', '#2']);
var to = _.buildNodes(['#0', '#1', '#2', '#3']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot, rootNode);
expect(newRoot.textContent).toBe('#0#1#2#3');
});
it("moves a key for start to end", function() {
var from = _.buildNodes(['a', '#0', '#1', '#2']);
var to = _.buildNodes(['#0', '#1', '#2', 'a']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot).toBe(rootNode);
expect(newRoot.textContent).toBe('#0#1#2a');
});
it("moves a key", function() {
var from = _.buildNodes(['#0', 'a', '#2', '#3']);
var to = _.buildNodes(['#0', '#1', 'a', '#3']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot).toBe(rootNode);
expect(newRoot.textContent).toBe('#0#1a#3');
});
it("moves a key with a size up", function() {
var from = _.buildNodes(['a', '#1', '#2', '#3']);
var to = _.buildNodes(['#0', '#1', '#2', '#3', 'a', '#5']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot).toBe(rootNode);
expect(newRoot.textContent).toBe('#0#1#2#3a#5');
});
it("moves a key with a size down", function() {
var from = _.buildNodes(['a', '#1', '#2', '#3']);
var to = _.buildNodes(['#0', 'a', '#2']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot).toBe(rootNode);
expect(newRoot.textContent).toBe('#0a#2');
});
it("avoids unnecessary reordering", function() {
var from = _.buildNodes(['#0', 'a', '#2']);
var to = _.buildNodes(['#0', 'a', '#2']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot).toBe(rootNode);
expect(newRoot.textContent).toBe('#0a#2');
});
it("adds and deletes and reorders", function() {
var from = _.buildNodes(['a', '#1', 'b', '#3', 'c', 'd', '#6']);
var to = _.buildNodes(['#0', 'e', 'd', 'c', '#4', 'a']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot).toBe(rootNode);
expect(newRoot.textContent).toBe('#0edc#4a');
});
});
describe("when using keyed nodes", function() {
it("supports zero number", function () {
var from = _.buildNodes([0, 1, 2, 3, 4]);
var to = _.buildNodes([1, 2, 3, 4, 0]);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot).toBe(rootNode);
expect(newRoot.textContent).toBe('12340');
});
it("gets keys reordered", function () {
var from = _.buildNodes(['1', '2', '3', '4', 'test', '6', 'good', '7']);
var to = _.buildNodes(['7', '4', '3', '2', '6', 'test', 'good', '1']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot).toBe(rootNode);
expect(newRoot.textContent).toBe('74326testgood1');
});
it("removes one key at the start", function() {
var from = _.buildNodes(['a', 'b', 'c']);
var to = _.buildNodes(['b', 'c']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot).toBe(rootNode);
expect(newRoot.textContent).toBe('bc');
});
it("removes two keys at the start", function() {
var from = _.buildNodes(['a', 'b', 'c']);
var to = _.buildNodes(['c']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot).toBe(rootNode);
expect(newRoot.textContent).toBe('c');
});
it("adds one key to start", function() {
var from = _.buildNodes(['b', 'c']);
var to = _.buildNodes(['a', 'b', 'c']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot).toBe(rootNode);
expect(newRoot.textContent).toBe('abc');
});
it("adds two key to start", function() {
var from = _.buildNodes(['c']);
var to = _.buildNodes(['a', 'b', 'c']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot).toBe(rootNode);
expect(newRoot.textContent).toBe('abc');
});
it("removes one key at the end", function() {
var from = _.buildNodes(['a', 'b', 'c']);
var to = _.buildNodes(['a', 'b']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot).toBe(rootNode);
expect(newRoot.textContent).toBe('ab');
});
it("removes two keys at the end", function() {
var from = _.buildNodes(['a', 'b', 'c']);
var to = _.buildNodes(['a']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot).toBe(rootNode);
expect(newRoot.textContent).toBe('a');
});
it("adds one key at the end", function() {
var from = _.buildNodes(['a', 'b']);
var to = _.buildNodes(['a', 'b', 'c']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot).toBe(rootNode);
expect(newRoot.textContent).toBe('abc');
});
it("adds two key at the end", function() {
var from = _.buildNodes(['a']);
var to = _.buildNodes(['a', 'b', 'c']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot).toBe(rootNode);
expect(newRoot.textContent).toBe('abc');
});
it("adds to end and deletes from center & reverses", function() {
var from = _.buildNodes(['a', 'b', 'c', 'd']);
var to = _.buildNodes(['e', 'd', 'c', 'a']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot).toBe(rootNode);
expect(newRoot.textContent).toBe('edca');
});
it("adds to front and removes", function() {
var from = _.buildNodes(['c', 'd']);
var to = _.buildNodes(['a', 'b', 'c', 'e']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot).toBe(rootNode);
expect(newRoot.textContent).toBe('abce');
});
it("clears all nodes", function() {
var from = _.buildNodes(['a', 'b', 'c', 'e']);
var to = _.buildNodes([]);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot, rootNode);
expect(newRoot.textContent).toBe('');
});
it("keeps a central pivot", function() {
var from = _.buildNodes(['1', '2', '3']);
var to = _.buildNodes(['4', '2', '5']);
var rootNode = from.render();
var childNodes = _.rewrap(rootNode.childNodes);
var newRoot = from.patch(to);
expect(newRoot, rootNode);
expect(newRoot.textContent).toBe('425');
});
it('updates one child with same key but different tagName', function() {
var from = h({ tagName: 'span', key: 'span' }, [1, 2, 3].map(spanNum));
var to = h({ tagName: 'span', key: 'span' }, [spanNum(1), h({ tagName: 'i', key: 2 }, ['2']), spanNum(3)]);
var rootNode = from.render();
var newRoot = from.patch(to);
expect(newRoot.textContent).toBe('123');
expect(newRoot.children[1].tagName).toBe('I');
});
});
});