diff --git a/tests/Handler/Click.html b/tests/Handler/Click.html index eddfacbdd4..4f0d865141 100644 --- a/tests/Handler/Click.html +++ b/tests/Handler/Click.html @@ -99,140 +99,184 @@ handler.activate(); } - - function test_Handler_Click_callbacks(t) { - t.plan(13); - - var map = new OpenLayers.Map('map', {controls: []}); + + var callbackMap; + function callbackSetup(log, options) { + callbackMap = new OpenLayers.Map('map', {controls: []}); var control = { - map: map + map: callbackMap }; - var handler = new OpenLayers.Handler.Click(control, {}); + var callbacks = { + "click": function(evt) { + log.push({callback: "click", evt: evt}); + }, + "dblclick": function(evt) { + log.push({callback: "dblclick", evt: evt}); + } + }; + var handler = new OpenLayers.Handler.Click(control, callbacks, options); handler.activate(); - - // set up for single click - three tests here var timers = {}; - var sto = window.setTimeout; + window._setTimeout = window.setTimeout; window.setTimeout = function(func, delay) { - var key = Math.random(); + log.push({method: "setTimeout", func: func, delay: delay}); + var key = (new Date).getTime() + "-" + Math.random(); timers[key] = true; - t.ok(typeof func == "function", - "setTimeout called with a function"); - t.eq(delay, handler.delay, - "setTimeout called with proper delay"); // execute function that is supposed to be delayed func(); return key; } - var cto = window.clearTimeout; + window._clearTimeout = window.clearTimeout; window.clearTimeout = function(key) { - if(timers[key] === true) { - delete timers[key]; - } else { - t.fail("clearTimeout called with non-existent timerId"); - } + log.push({ + method: "clearTimeout", + keyExists: (key in timers) + }); + delete timers[key]; } - var testEvt = {id: Math.random()}; - handler.callbacks = { - "click": function(evt) { - t.eq(evt.id, testEvt.id, - "(click w/ single true) click callback called with correct evt"); - }, - "dblclick": function(evt) { - t.fail("(click w/ single true) dblclick should not be called here"); - } - }; - map.events.triggerEvent("click", testEvt); - - // set up for double click with double false - no tests here (only failures) - handler.callbacks = { - "click": function(evt) { - t.fail("(dblclick w/ double false) click should not be called here"); - }, - "dblclick": function(evt) { - t.fail("(dblclick w/ double false) dblclick should not be called here"); - } - }; - testEvt = Math.random(); - map.events.triggerEvent("dblclick", testEvt); + return handler; + } + + function callbackTeardown() { + window.setTimeout = window._setTimeout; + window.clearTimeout = window._clearTimeout; + callbackMap.destroy(); + callbackMap = null; + } - // set up for double click with double true - one test here - handler["double"] = true; - handler.callbacks = { - "click": function(evt) { - t.fail("(dblclick w/ double true) click should not be called here"); - }, - "dblclick": function(evt) { - t.eq(evt, testEvt, - "(dblclick w/ double true) dblclick called with correct evt"); - } - }; - testEvt = Math.random(); - map.events.triggerEvent("dblclick", testEvt); + function test_callbacks_click_default(t) { + t.plan(6); + + var log = []; + var handler = callbackSetup(log); - // set up for two clicks with double true - 6 tests here (with timeout ones from above) - handler["double"] = true; - handler.callbacks = { - "click": function(evt) { - t.ok(evt != null, "(two clicks w/ double true) click will not be called here if next three tests pass"); - }, - "dblclick": function(evt) { - t.eq(evt, testEvt, - "(two clicks w/ double true) dblclick called with correct evt"); - } - }; - testEvt = Math.random(); - map.events.triggerEvent("click", testEvt); - t.ok(handler.timerId != null, - "(two clicks w/ double true) timer is set to call click"); - map.events.triggerEvent("click", testEvt); - t.ok(handler.timerId == null, - "(two clicks w/ double true) timer is cleared to call click"); - map.events.triggerEvent("dblclick", testEvt); - handler.destroy(); + // set up for single click - three tests here + var testEvt = {id: Math.random()}; + handler.map.events.triggerEvent("click", testEvt); + t.eq(log.length, 2, "(click w/ single true) two items logged"); + + // first item logged is setTimeout call + t.eq(log[0].method, "setTimeout", "setTimeout called"); + t.eq(typeof log[0].func, "function", "setTimeout called with a function"); + t.eq(log[0].delay, handler.delay, "setTimeout called with proper delay"); - // set up to tests pixelTolerance - three tests here (2 from setTimeout above) - handler = new OpenLayers.Handler.Click(control, {}, { - pixelTolerance: 2 - }); - handler.activate(); - var downEvt = { + // second item logged is from click callback + t.eq(log[1].callback, "click", "click callback called"); + t.eq(log[1].evt.id, testEvt.id, "got correct event"); + + callbackTeardown(); + } + + function test_callbacks_dblclick_default(t) { + t.plan(1); + + var log = []; + var handler = callbackSetup(log); + var testEvt = {id: Math.random()}; + handler.map.events.triggerEvent("dblclick", testEvt); + + t.eq(log.length, 0, "nothing happens by default with dblclick (double is false)"); + + callbackTeardown(); + + } + + function test_callbacks_dblclick_double(t) { + t.plan(3); + + var log = []; + var handler = callbackSetup(log, {"double": true}); + var testEvt = {id: Math.random()}; + handler.map.events.triggerEvent("dblclick", testEvt); + + t.eq(log.length, 1, "one item logged"); + t.eq(log[0].callback, "dblclick", "dblclick callback called") + t.eq(log[0].evt.id, testEvt.id, "dblclick callback called with event"); + + callbackTeardown(); + + } + + function test_callbacks_dblclick_sequence(t) { + t.plan(8); + + var log = []; + var handler = callbackSetup(log, {"double": true}); + var testEvt = {id: Math.random()}; + + // first click - set timer for next + handler.map.events.triggerEvent("click", testEvt); + t.ok(handler.timerId != null, "timer is set"); + log.pop(); // because the test setTimeout is synchronous we get the click callback immediately + t.eq(log.length, 1, "one item logged (after pop due to synchronous setTimeout call in our tests"); + t.eq(log[0].method, "setTimeout", "setTimeout called first"); + + // second click - timer cleared + handler.map.events.triggerEvent("click", testEvt); + t.ok(handler.timerId == null, "timer is cleared"); + t.eq(log.length, 2, "two items logged after second click"); + t.eq(log[1].method, "clearTimeout", "clearTimeout called second"); + + // dblclick event - callback called + handler.map.events.triggerEvent("dblclick", testEvt); + t.eq(log.length, 3, "three items logged"); + t.eq(log[2].callback, "dblclick", "dblclick callback called third"); + + callbackTeardown(); + + } + + function test_callbacks_within_pixelTolerance(t) { + t.plan(1); + + var log = []; + var handler = callbackSetup(log, {"double": true, pixelTolerance: 2}); + var testEvt = {id: Math.random()}; + + var down = { xy: px(0, 0) }; - map.events.triggerEvent("mousedown", downEvt); - var clickEvt = { + var up = { xy: px(0, 1) }; - // mouse moves one pixel, click should be called - handler.callbacks = { - "click": function(evt) { - t.ok(evt.xy == clickEvt.xy, "(pixelTolerance met) click called"); - } - }; - map.events.triggerEvent("click", clickEvt); - handler.clearTimer(); - - // mouse moves 3x3 pixels, click should not be called - map.events.triggerEvent("mousedown", downEvt); - var clickEvt = { - xy: px(3, 3) - }; - // mouse moves one pixel, click should be called - handler.callbacks = { - "click": function(evt) { - t.fail("(pixelTolerance not met) click should not be called"); - } - }; - map.events.triggerEvent("click", clickEvt); // no test run - handler.clearTimer(); - - window.setTimeout = sto; - window.clearTimeout = cto; - + handler.map.events.triggerEvent("mousedown", down); + handler.map.events.triggerEvent("mouseup", up); + handler.map.events.triggerEvent("click", up); + + t.eq(log[log.length-1].callback, "click", "click callback called"); + + callbackTeardown(); + + } + + function test_callbacks_outside_pixelTolerance(t) { + t.plan(2); + + var log = []; + var handler = callbackSetup(log, {"double": true, pixelTolerance: 2}); + var testEvt = {id: Math.random()}; + + var down = { + xy: px(0, 0) + }; + var up = { + xy: px(2, 3) + }; + + handler.map.events.triggerEvent("mousedown", down); + t.ok(handler.down && handler.down.xy.equals(down.xy), "down position set"); + + handler.map.events.triggerEvent("mouseup", up); + handler.map.events.triggerEvent("click", up); + + t.eq(log.length, 0, "nothing logged - event outside tolerance"); + + callbackTeardown(); + } function test_Handler_Click_deactivate(t) {