You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
5.9 KiB
JavaScript
153 lines
5.9 KiB
JavaScript
var assert = require('assert');
|
|
var fakeRaf = require('fake-raf');
|
|
|
|
var snabbdom = require('../snabbdom');
|
|
fakeRaf.use();
|
|
var patch = snabbdom.init([
|
|
require('../modules/style').default,
|
|
]);
|
|
var h = require('../h').default;
|
|
var toVNode = require('../tovnode').default;
|
|
|
|
describe('style', function() {
|
|
var elm, vnode0;
|
|
beforeEach(function() {
|
|
elm = document.createElement('div');
|
|
vnode0 = elm;
|
|
});
|
|
it('is being styled', function() {
|
|
elm = patch(vnode0, h('div', {style: {fontSize: '12px'}})).elm;
|
|
assert.equal(elm.style.fontSize, '12px');
|
|
});
|
|
it('can be memoized', function() {
|
|
var cachedStyles = {fontSize: '14px', display: 'inline'};
|
|
var vnode1 = h('i', {style: cachedStyles});
|
|
var vnode2 = h('i', {style: cachedStyles});
|
|
elm = patch(vnode0, vnode1).elm;
|
|
assert.equal(elm.style.fontSize, '14px');
|
|
assert.equal(elm.style.display, 'inline');
|
|
elm = patch(vnode1, vnode2).elm;
|
|
assert.equal(elm.style.fontSize, '14px');
|
|
assert.equal(elm.style.display, 'inline');
|
|
});
|
|
it('updates styles', function() {
|
|
var vnode1 = h('i', {style: {fontSize: '14px', display: 'inline'}});
|
|
var vnode2 = h('i', {style: {fontSize: '12px', display: 'block'}});
|
|
var vnode3 = h('i', {style: {fontSize: '10px', display: 'block'}});
|
|
elm = patch(vnode0, vnode1).elm;
|
|
assert.equal(elm.style.fontSize, '14px');
|
|
assert.equal(elm.style.display, 'inline');
|
|
elm = patch(vnode1, vnode2).elm;
|
|
assert.equal(elm.style.fontSize, '12px');
|
|
assert.equal(elm.style.display, 'block');
|
|
elm = patch(vnode2, vnode3).elm;
|
|
assert.equal(elm.style.fontSize, '10px');
|
|
assert.equal(elm.style.display, 'block');
|
|
});
|
|
it('explicialy removes styles', function() {
|
|
var vnode1 = h('i', {style: {fontSize: '14px'}});
|
|
var vnode2 = h('i', {style: {fontSize: ''}});
|
|
var vnode3 = h('i', {style: {fontSize: '10px'}});
|
|
elm = patch(vnode0, vnode1).elm;
|
|
assert.equal(elm.style.fontSize, '14px');
|
|
patch(vnode1, vnode2);
|
|
assert.equal(elm.style.fontSize, '');
|
|
patch(vnode2, vnode3);
|
|
assert.equal(elm.style.fontSize, '10px');
|
|
});
|
|
it('implicially removes styles from element', function() {
|
|
var vnode1 = h('div', [h('i', {style: {fontSize: '14px'}})]);
|
|
var vnode2 = h('div', [h('i')]);
|
|
var vnode3 = h('div', [h('i', {style: {fontSize: '10px'}})]);
|
|
patch(vnode0, vnode1);
|
|
assert.equal(elm.firstChild.style.fontSize, '14px');
|
|
patch(vnode1, vnode2);
|
|
assert.equal(elm.firstChild.style.fontSize, '');
|
|
patch(vnode2, vnode3);
|
|
assert.equal(elm.firstChild.style.fontSize, '10px');
|
|
});
|
|
it('updates css variables', function() {
|
|
var vnode1 = h('div', {style: {'--myVar': 1}});
|
|
var vnode2 = h('div', {style: {'--myVar': 2}});
|
|
var vnode3 = h('div', {style: {'--myVar': 3}});
|
|
elm = patch(vnode0, vnode1).elm;
|
|
assert.equal(elm.style.getPropertyValue('--myVar'), 1);
|
|
elm = patch(vnode1, vnode2).elm;
|
|
assert.equal(elm.style.getPropertyValue('--myVar'), 2);
|
|
elm = patch(vnode2, vnode3).elm;
|
|
assert.equal(elm.style.getPropertyValue('--myVar'), 3);
|
|
});
|
|
it('explicialy removes css variables', function() {
|
|
var vnode1 = h('i', {style: {'--myVar': 1}});
|
|
var vnode2 = h('i', {style: {'--myVar': ''}});
|
|
var vnode3 = h('i', {style: {'--myVar': 2}});
|
|
elm = patch(vnode0, vnode1).elm;
|
|
assert.equal(elm.style.getPropertyValue('--myVar'), 1);
|
|
patch(vnode1, vnode2);
|
|
assert.equal(elm.style.getPropertyValue('--myVar'), '');
|
|
patch(vnode2, vnode3);
|
|
assert.equal(elm.style.getPropertyValue('--myVar'), 2);
|
|
});
|
|
it('implicially removes css variables from element', function() {
|
|
var vnode1 = h('div', [h('i', {style: {'--myVar': 1}})]);
|
|
var vnode2 = h('div', [h('i')]);
|
|
var vnode3 = h('div', [h('i', {style: {'--myVar': 2}})]);
|
|
patch(vnode0, vnode1);
|
|
assert.equal(elm.firstChild.style.getPropertyValue('--myVar'), 1);
|
|
patch(vnode1, vnode2);
|
|
assert.equal(elm.firstChild.style.getPropertyValue('--myVar'), '');
|
|
patch(vnode2, vnode3);
|
|
assert.equal(elm.firstChild.style.getPropertyValue('--myVar'), 2);
|
|
});
|
|
it('updates delayed styles in next frame', function() {
|
|
var patch = snabbdom.init([
|
|
require('../modules/style').default,
|
|
]);
|
|
var vnode1 = h('i', {style: {fontSize: '14px', delayed: {fontSize: '16px'}}});
|
|
var vnode2 = h('i', {style: {fontSize: '18px', delayed: {fontSize: '20px'}}});
|
|
elm = patch(vnode0, vnode1).elm;
|
|
assert.equal(elm.style.fontSize, '14px');
|
|
fakeRaf.step();
|
|
fakeRaf.step();
|
|
assert.equal(elm.style.fontSize, '16px');
|
|
elm = patch(vnode1, vnode2).elm;
|
|
assert.equal(elm.style.fontSize, '18px');
|
|
fakeRaf.step();
|
|
fakeRaf.step();
|
|
assert.equal(elm.style.fontSize, '20px');
|
|
});
|
|
it('applies tranform as transition on remove', function(done) {
|
|
var btn = h('button', { style: {
|
|
transition: 'transform 0.1s',
|
|
remove: { transform: 'translateY(100%)' }
|
|
}}, ['A button']);
|
|
var vnode1 = h('div.parent', {}, [btn]);
|
|
var vnode2 = h('div.parent', {}, [null]);
|
|
document.body.appendChild(vnode0);
|
|
patch(vnode0, vnode1);
|
|
patch(vnode1, vnode2);
|
|
const button = document.querySelector('button');
|
|
assert.notStrictEqual(button, null);
|
|
button.addEventListener('transitionend', function() {
|
|
assert.strictEqual(document.querySelector('button'), null);
|
|
done();
|
|
});
|
|
});
|
|
describe('using toVNode()', function () {
|
|
it('handles (ignoring) comment nodes', function() {
|
|
var comment = document.createComment('yolo');
|
|
var prevElm = document.createElement('div');
|
|
prevElm.appendChild(comment);
|
|
var nextVNode = h('div', [h('span', 'Hi')]);
|
|
elm = patch(toVNode(prevElm), nextVNode).elm;
|
|
assert.strictEqual(elm, prevElm);
|
|
assert.equal(elm.tagName, 'DIV');
|
|
assert.strictEqual(elm.childNodes.length, 1);
|
|
assert.strictEqual(elm.childNodes[0].tagName, 'SPAN');
|
|
assert.strictEqual(elm.childNodes[0].textContent, 'Hi');
|
|
});
|
|
});
|
|
});
|
|
|
|
fakeRaf.restore();
|