diff --git a/render/tests/test-onbeforeremove.js b/render/tests/test-onbeforeremove.js index a6797c66..15e6a511 100644 --- a/render/tests/test-onbeforeremove.js +++ b/render/tests/test-onbeforeremove.js @@ -188,4 +188,34 @@ o.spec("onbeforeremove", function() { o(root.childNodes.length).equals(1) o(root.firstChild.firstChild.nodeValue).equals("2") }) + o("finalizes the remove phase only once when `done()` is called synchronously from both attrs- and tag.onbeforeremove", function() { + var onremove = o.spy() + var component = { + view: function(){return {tag:'br'}}, + onbeforeremove: function(vnode, done){done()}, + onremove: onremove + } + render(root, [{tag: component, attrs: component}]) + render(root, []) + o(onremove.callCount).equals(2) // once for `tag`, once for `attrs` + }) + o("doesn't finalize prematurely if `done` is called twice in the `tag` hook", function(done) { + var async = false + var component = { + view: function(){return {tag:'br'}}, + onbeforeremove: function(vnode, doneRemoving){ + doneRemoving() + doneRemoving() + }, + onremove: function(){ + o(async).equals(true)("onremove should be called asynchronously") + done() + } + } + render(root, [{tag:component, attrs: {onbeforeremove: function(vnode, doneRemoving){ + callAsync(doneRemoving) + }}}]) + render(root, []) + async = true + }) }) diff --git a/render/tests/test-onremove.js b/render/tests/test-onremove.js index d3f423fc..43ed200d 100644 --- a/render/tests/test-onremove.js +++ b/render/tests/test-onremove.js @@ -145,4 +145,15 @@ o.spec("onremove", function() { o(vnode.dom).notEquals(updated.dom) }) + o("The remove phase is finalized only once when `done()` is called synchronously from both attrs- and tag.onbeforeremove", function () { + var onremove = o.spy() + var component = { + view: function(){return m('br')}, + onbeforeremove: function(vnode, done){done()}, + onremove: onremove + } + render(root, [{tag: component, attrs: component}]) + render(root, []) + o(onremove.callCount).equals(2) + }) })