Test.Modules.LAYER = { 'beforeDraw and afterDraw': function(containerId) { var stage = new Kinetic.Stage({ container: containerId, width: 578, height: 200 }); var layer = new Kinetic.Layer(); var circle = new Kinetic.Circle({ x: 100, y: stage.getHeight() / 2, radius: 70, fill: 'green', stroke: 'black', strokeWidth: 4 }); layer.add(circle); stage.add(layer); var counter = 0; layer.beforeDraw(function() { counter++; test(counter === 1, 'counter should be 1'); }); layer.afterDraw(function() { counter++; test(counter === 2, 'counter should be 2'); }); layer.draw(); }, 'set clearBeforeDraw to false, and test toDataURL for stage, layer, group, and shape': function(containerId) { var stage = new Kinetic.Stage({ container: containerId, width: 578, height: 200 }); var layer = new Kinetic.Layer({ clearBeforeDraw: false, throttle: 999 }); var group = new Kinetic.Group(); var circle = new Kinetic.Circle({ x: 100, y: stage.getHeight() / 2, radius: 70, fill: 'green', stroke: 'black', strokeWidth: 4 }); group.add(circle); layer.add(group); stage.add(layer); for(var n = 0; n < 20; n++) { circle.move(10, 0); layer.draw(); } //console.log(layer.toDataURL()); stage.toDataURL({ callback: function(dataUrl) { warn(dataUrls['stacked green circles'] === dataUrl, 'stacked green circles stage data url is incorrect'); } }); warn(dataUrls['stacked green circles'] === layer.toDataURL(), 'stacked green circles layer data url is incorrect'); } };