Bugfix: thunk function called two times

PR #273

* Separate test blocks with newlines
* Add a 🔴 failing test that highlights the bug, and some other more detailed tests on thunk renderings
* Fix the bug 
* Correctly gitignore files in base directory
The existing configuration was ignoring the same filenames in subdirectories, for example `test/thunk.js`
* Remove newlines between test blocks
* Make tests titles more explicative
pull/292/head
cesare soldini 8 years ago committed by André Staltz
parent c5d513dfd9
commit 1826bcd3c6

58
.gitignore vendored

@ -30,34 +30,34 @@ node_modules
*.swp
# Generated JavaScript
test/browserified.js
browserified.js
h.d.ts
h.js
h.js.map
hooks.d.ts
hooks.js
hooks.js.map
htmldomapi.d.ts
htmldomapi.js
htmldomapi.js.map
is.d.ts
is.js
is.js.map
snabbdom.bundle.d.ts
snabbdom.bundle.js
snabbdom.bundle.js.map
snabbdom.d.ts
snabbdom.js
snabbdom.js.map
thunk.d.ts
thunk.js
thunk.js.map
tovnode.d.ts
tovnode.js
tovnode.js.map
vnode.d.ts
vnode.js
vnode.js.map
/test/browserified.js
/browserified.js
/h.d.ts
/h.js
/h.js.map
/hooks.d.ts
/hooks.js
/hooks.js.map
/htmldomapi.d.ts
/htmldomapi.js
/htmldomapi.js.map
/is.d.ts
/is.js
/is.js.map
/snabbdom.bundle.d.ts
/snabbdom.bundle.js
/snabbdom.bundle.js.map
/snabbdom.d.ts
/snabbdom.js
/snabbdom.js.map
/thunk.d.ts
/thunk.js
/thunk.js.map
/tovnode.d.ts
/tovnode.js
/tovnode.js.map
/vnode.d.ts
/vnode.js
/vnode.js.map
/modules
/helpers

@ -36,6 +36,7 @@ function prepatch(oldVnode: VNode, thunk: VNode): void {
const oldArgs = old.args, args = cur.args;
if (old.fn !== cur.fn || (oldArgs as any).length !== (args as any).length) {
copyToThunk((cur.fn as any).apply(undefined, args), thunk);
return;
}
for (i = 0; i < (args as any).length; ++i) {
if ((oldArgs as any)[i] !== (args as any)[i]) {

@ -20,7 +20,7 @@ describe('thunk', function() {
assert.deepEqual(vnode.data.key, 'num');
assert.deepEqual(vnode.data.args, [22]);
});
it('only calls render function on data change', function() {
it('calls render function once on data change', function() {
var called = 0;
function numberInSpan(n) {
called++;
@ -30,14 +30,66 @@ describe('thunk', function() {
thunk('span', 'num', numberInSpan, [1])
]);
var vnode2 = h('div', [
thunk('span', 'num', numberInSpan, [2])
]);
patch(vnode0, vnode1);
assert.equal(called, 1);
patch(vnode1, vnode2);
assert.equal(called, 2);
});
it('does not call render function on data unchanged', function() {
var called = 0;
function numberInSpan(n) {
called++;
return h('span', {key: 'num'}, 'Number is ' + n);
}
var vnode1 = h('div', [
thunk('span', 'num', numberInSpan, [1])
]);
var vnode3 = h('div', [
thunk('span', 'num', numberInSpan, [2])
var vnode2 = h('div', [
thunk('span', 'num', numberInSpan, [1])
]);
patch(vnode0, vnode1);
assert.equal(called, 1);
patch(vnode1, vnode2);
assert.equal(called, 1);
});
it('calls render function once on data-length change', function() {
var called = 0;
function numberInSpan(n) {
called++;
return h('span', {key: 'num'}, 'Number is ' + n);
}
var vnode1 = h('div', [
thunk('span', 'num', numberInSpan, [1])
]);
var vnode2 = h('div', [
thunk('span', 'num', numberInSpan, [1, 2])
]);
patch(vnode0, vnode1);
assert.equal(called, 1);
patch(vnode1, vnode2);
assert.equal(called, 2);
});
it('calls render function once on function change', function() {
var called = 0;
function numberInSpan(n) {
called++;
return h('span', {key: 'num'}, 'Number is ' + n);
}
function numberInSpan2(n) {
called++;
return h('span', {key: 'num'}, 'Number really is ' + n);
}
var vnode1 = h('div', [
thunk('span', 'num', numberInSpan, [1])
]);
var vnode2 = h('div', [
thunk('span', 'num', numberInSpan2, [1])
]);
patch(vnode0, vnode1);
assert.equal(called, 1);
patch(vnode1, vnode2);
patch(vnode2, vnode3);
assert.equal(called, 2);
});
it('renders correctly', function() {

Loading…
Cancel
Save