1 |
(function( $ ) { |
2 |
|
3 |
module( "draggable: options" ); |
4 |
|
5 |
// TODO: This doesn't actually test whether append happened, possibly remove |
6 |
test( "{ appendTo: 'parent' }, default, no clone", function() { |
7 |
expect( 2 ); |
8 |
var element = $( "#draggable2" ).draggable({ appendTo: "parent" }); |
9 |
TestHelpers.draggable.shouldMove( element ); |
10 |
|
11 |
element = $( "#draggable1" ).draggable({ appendTo: "parent" }); |
12 |
TestHelpers.draggable.shouldMove( element ); |
13 |
}); |
14 |
|
15 |
// TODO: This doesn't actually test whether append happened, possibly remove |
16 |
test( "{ appendTo: Element }, no clone", function() { |
17 |
expect( 2 ); |
18 |
var element = $( "#draggable2" ).draggable({ appendTo: $( "#draggable2" ).parent()[ 0 ] }); |
19 |
|
20 |
TestHelpers.draggable.shouldMove( element ); |
21 |
|
22 |
element = $( "#draggable1" ).draggable({ appendTo: $( "#draggable2" ).parent()[ 0 ] }); |
23 |
TestHelpers.draggable.shouldMove( element ); |
24 |
}); |
25 |
|
26 |
// TODO: This doesn't actually test whether append happened, possibly remove |
27 |
test( "{ appendTo: Selector }, no clone", function() { |
28 |
expect( 2 ); |
29 |
var element = $( "#draggable2" ).draggable({ appendTo: "#main" }); |
30 |
TestHelpers.draggable.shouldMove( element ); |
31 |
|
32 |
element = $( "#draggable1" ).draggable({ appendTo: "#main" }); |
33 |
TestHelpers.draggable.shouldMove( element ); |
34 |
}); |
35 |
|
36 |
test( "{ appendTo: 'parent' }, default", function() { |
37 |
expect( 2 ); |
38 |
|
39 |
var element = $( "#draggable1" ).draggable(); |
40 |
|
41 |
TestHelpers.draggable.trackAppendedParent( element ); |
42 |
|
43 |
equal( element.draggable( "option", "appendTo" ), "parent" ); |
44 |
|
45 |
TestHelpers.draggable.move( element, 1, 1 ); |
46 |
equal( element.data( "last_dragged_parent" ), $( "#qunit-fixture" )[ 0 ] ); |
47 |
}); |
48 |
|
49 |
test( "{ appendTo: Element }", function() { |
50 |
expect( 1 ); |
51 |
|
52 |
var appendTo = $( "#draggable2" ).parent()[ 0 ], |
53 |
element = $( "#draggable1" ).draggable({ appendTo: appendTo }); |
54 |
|
55 |
TestHelpers.draggable.trackAppendedParent( element ); |
56 |
|
57 |
TestHelpers.draggable.move( element, 1, 1 ); |
58 |
equal( element.data( "last_dragged_parent" ), appendTo ); |
59 |
}); |
60 |
|
61 |
test( "{ appendTo: jQuery }", function() { |
62 |
expect( 1 ); |
63 |
|
64 |
var appendTo = $( "#draggable2" ).parent(), |
65 |
element = $( "#draggable1" ).draggable({ appendTo: appendTo }); |
66 |
|
67 |
TestHelpers.draggable.trackAppendedParent( element ); |
68 |
|
69 |
TestHelpers.draggable.move( element, 1, 1 ); |
70 |
equal( element.data( "last_dragged_parent" ), appendTo[ 0 ] ); |
71 |
}); |
72 |
|
73 |
test( "{ appendTo: Selector }", function() { |
74 |
expect( 1 ); |
75 |
|
76 |
var appendTo = "#main", |
77 |
element = $( "#draggable1" ).draggable({ appendTo: appendTo }); |
78 |
|
79 |
TestHelpers.draggable.trackAppendedParent( element ); |
80 |
|
81 |
TestHelpers.draggable.move( element, 1, 1 ); |
82 |
equal( element.data( "last_dragged_parent" ), $(appendTo)[ 0 ] ); |
83 |
}); |
84 |
|
85 |
test( "appendTo, default, switching after initialization", function() { |
86 |
expect( 2 ); |
87 |
|
88 |
var element = $( "#draggable1" ).draggable({ helper : "clone" }); |
89 |
|
90 |
TestHelpers.draggable.trackAppendedParent( element ); |
91 |
|
92 |
// Move and make sure element was appended to fixture |
93 |
TestHelpers.draggable.move( element, 1, 1 ); |
94 |
equal( element.data( "last_dragged_parent" ), $( "#qunit-fixture" )[ 0 ] ); |
95 |
|
96 |
// Move and make sure element was appended to main |
97 |
element.draggable( "option", "appendTo", $( "#main" ) ); |
98 |
TestHelpers.draggable.move( element, 2, 2 ); |
99 |
equal( element.data( "last_dragged_parent" ), $( "#main" )[ 0 ] ); |
100 |
}); |
101 |
|
102 |
test( "{ axis: false }, default", function() { |
103 |
expect( 1 ); |
104 |
var element = $( "#draggable2" ).draggable({ axis: false }); |
105 |
TestHelpers.draggable.shouldMove( element ); |
106 |
}); |
107 |
|
108 |
test( "{ axis: 'x' }", function() { |
109 |
expect( 1 ); |
110 |
var element = $( "#draggable2" ).draggable({ axis: "x" }); |
111 |
TestHelpers.draggable.testDrag( element, element, 50, 50, 50, 0 ); |
112 |
}); |
113 |
|
114 |
test( "{ axis: 'y' }", function() { |
115 |
expect( 1 ); |
116 |
var element = $( "#draggable2" ).draggable({ axis: "y" }); |
117 |
TestHelpers.draggable.testDrag( element, element, 50, 50, 0, 50 ); |
118 |
}); |
119 |
|
120 |
test( "{ axis: ? }, unexpected", function() { |
121 |
var element, |
122 |
unexpected = { |
123 |
"true": true, |
124 |
"{}": {}, |
125 |
"[]": [], |
126 |
"null": null, |
127 |
"undefined": undefined, |
128 |
"function() {}": function() {} |
129 |
}; |
130 |
|
131 |
expect( 6 ); |
132 |
|
133 |
$.each(unexpected, function(key, val) { |
134 |
element = $( "#draggable2" ).draggable({ axis: val }); |
135 |
TestHelpers.draggable.testDrag( element, element, 50, 50, 50, 50, "axis: " + key ); |
136 |
element.draggable( "destroy" ); |
137 |
}); |
138 |
}); |
139 |
|
140 |
test( "axis, default, switching after initialization", function() { |
141 |
expect( 3 ); |
142 |
|
143 |
var element = $( "#draggable1" ).draggable({ axis : false }); |
144 |
|
145 |
// Any Direction |
146 |
TestHelpers.draggable.testDrag( element, element, 50, 50, 50, 50 ); |
147 |
|
148 |
// Only horizontal |
149 |
element.draggable( "option", "axis", "x" ); |
150 |
TestHelpers.draggable.testDrag( element, element, 50, 50, 50, 0 ); |
151 |
|
152 |
// Vertical only |
153 |
element.draggable( "option", "axis", "y" ); |
154 |
TestHelpers.draggable.testDrag( element, element, 50, 50, 0, 50 ); |
155 |
|
156 |
}); |
157 |
|
158 |
test( "{ cancel: 'input,textarea,button,select,option' }, default", function() { |
159 |
expect( 2 ); |
160 |
|
161 |
$( "<div id='draggable-option-cancel-default'><input type='text'></div>" ).appendTo( "#main" ); |
162 |
|
163 |
var element = $( "#draggable-option-cancel-default" ).draggable({ cancel: "input,textarea,button,select,option" }); |
164 |
TestHelpers.draggable.shouldMove( element ); |
165 |
|
166 |
element.draggable( "destroy" ); |
167 |
|
168 |
element = $( "#draggable-option-cancel-default" ).draggable({ cancel: "input,textarea,button,select,option" }); |
169 |
TestHelpers.draggable.testDrag( element, "#draggable-option-cancel-default input", 50, 50, 0, 0 ); |
170 |
element.draggable( "destroy" ); |
171 |
}); |
172 |
|
173 |
test( "{ cancel: 'span' }", function() { |
174 |
expect( 2 ); |
175 |
|
176 |
var element = $( "#draggable2" ).draggable(); |
177 |
TestHelpers.draggable.testDrag( element, "#draggable2 span", 50, 50, 50, 50 ); |
178 |
|
179 |
element.draggable( "destroy" ); |
180 |
|
181 |
element = $( "#draggable2" ).draggable({ cancel: "span" }); |
182 |
TestHelpers.draggable.testDrag( element, "#draggable2 span", 50, 50, 0, 0 ); |
183 |
}); |
184 |
|
185 |
test( "{ cancel: ? }, unexpected", function() { |
186 |
expect( 6 ); |
187 |
|
188 |
var element, |
189 |
unexpected = { |
190 |
"true": true, |
191 |
"false": false, |
192 |
"{}": {}, |
193 |
"[]": [], |
194 |
"null": null, |
195 |
"undefined": undefined |
196 |
}; |
197 |
|
198 |
$.each( unexpected, function( key, val ) { |
199 |
element = $( "#draggable2" ).draggable({ cancel: val }); |
200 |
TestHelpers.draggable.shouldMove( element, "cancel: " + key ); |
201 |
element.draggable( "destroy" ); |
202 |
}); |
203 |
}); |
204 |
|
205 |
/** |
206 |
test( "{ cancel: Selectors }, matching parent selector", function() { |
207 |
|
208 |
expect( 5 ); |
209 |
|
210 |
var element = $( "#draggable2" ).draggable({ cancel: "span a" }); |
211 |
|
212 |
$( "#qunit-fixture" ).append( "<span id='wrapping'><a></a></span>" ); |
213 |
|
214 |
element.find( "span" ).append( "<a>" ); |
215 |
|
216 |
$( "#wrapping a" ).append( element ); |
217 |
|
218 |
TestHelpers.draggable.testDrag( element, "#draggable2 span", 50, 50, 50, 50, "drag span child" ); |
219 |
TestHelpers.draggable.shouldNotMove( $( "#draggable2 span a" ) ); |
220 |
TestHelpers.draggable.shouldNotMove( $( "#wrapping a" ) ); |
221 |
|
222 |
$( "#draggable2" ).draggable( "option", "cancel", "span > a" ); |
223 |
$( "#draggable2" ).find( "a" ).append( "<a>" ); |
224 |
|
225 |
|
226 |
TestHelpers.draggable.testDrag( element, $( "#draggable2 span a" ).last(), 50, 50, 50, 50, "drag span child" ); |
227 |
TestHelpers.draggable.shouldNotMove( $( "#draggable2 span a" ).first() ); |
228 |
|
229 |
}); |
230 |
*/ |
231 |
|
232 |
test( "cancelement, default, switching after initialization", function() { |
233 |
expect( 3 ); |
234 |
|
235 |
$( "<div id='draggable-option-cancel-default'><input type='text'></div>" ).appendTo( "#main" ); |
236 |
|
237 |
var input = $( "#draggable-option-cancel-default input" ), |
238 |
element = $( "#draggable-option-cancel-default" ).draggable(); |
239 |
|
240 |
TestHelpers.draggable.testDrag( element, input, 50, 50, 0, 0 ); |
241 |
|
242 |
element.draggable( "option", "cancel", "textarea" ); |
243 |
TestHelpers.draggable.testDrag( element, input, 50, 50, 50, 50 ); |
244 |
|
245 |
element.draggable( "option", "cancel", "input" ); |
246 |
TestHelpers.draggable.testDrag( element, input, 50, 50, 0, 0 ); |
247 |
}); |
248 |
|
249 |
/* |
250 |
|
251 |
test( "{ connectToSortable: selector }, default", function() { |
252 |
expect( 1 ); |
253 |
|
254 |
ok(false, "missing test - untested code is broken code" ); |
255 |
}); |
256 |
*/ |
257 |
|
258 |
test( "{ containment: Element }", function() { |
259 |
expect( 1 ); |
260 |
|
261 |
var offsetAfter, |
262 |
element = $( "#draggable1" ).draggable({ containment: $( "#draggable1" ).parent()[ 0 ] }), |
263 |
p = element.parent(), |
264 |
po = p.offset(), |
265 |
expected = { |
266 |
left: po.left + TestHelpers.draggable.border( p, "left" ) + TestHelpers.draggable.margin( element, "left" ), |
267 |
top: po.top + TestHelpers.draggable.border( p, "top" ) + TestHelpers.draggable.margin( element, "top" ) |
268 |
}; |
269 |
|
270 |
element.simulate( "drag", { |
271 |
dx: -100, |
272 |
dy: -100 |
273 |
}); |
274 |
offsetAfter = element.offset(); |
275 |
deepEqual( offsetAfter, expected, "compare offset to parent" ); |
276 |
}); |
277 |
|
278 |
test( "{ containment: Selector }", function() { |
279 |
expect( 1 ); |
280 |
|
281 |
var offsetAfter, |
282 |
element = $( "#draggable1" ).draggable({ containment: $( "#qunit-fixture" ) }), |
283 |
p = element.parent(), |
284 |
po = p.offset(), |
285 |
expected = { |
286 |
left: po.left + TestHelpers.draggable.border( p, "left" ) + TestHelpers.draggable.margin( element, "left" ), |
287 |
top: po.top + TestHelpers.draggable.border( p, "top" ) + TestHelpers.draggable.margin( element, "top" ) |
288 |
}; |
289 |
|
290 |
element.simulate( "drag", { |
291 |
dx: -100, |
292 |
dy: -100 |
293 |
}); |
294 |
offsetAfter = element.offset(); |
295 |
deepEqual( offsetAfter, expected, "compare offset to parent" ); |
296 |
}); |
297 |
|
298 |
test( "{ containment: [x1, y1, x2, y2] }", function() { |
299 |
expect( 1 ); |
300 |
|
301 |
var element = $( "#draggable1" ).draggable(), |
302 |
eo = element.offset(); |
303 |
|
304 |
element.draggable( "option", "containment", [ eo.left, eo.top, eo.left + element.width() + 5, eo.top + element.height() + 5 ] ); |
305 |
|
306 |
TestHelpers.draggable.testDrag( element, element, -100, -100, 0, 0 ); |
307 |
}); |
308 |
|
309 |
test( "{ containment: 'parent' }, relative", function() { |
310 |
expect( 1 ); |
311 |
|
312 |
var offsetAfter, |
313 |
element = $( "#draggable1" ).draggable({ containment: "parent" }), |
314 |
p = element.parent(), |
315 |
po = p.offset(), |
316 |
expected = { |
317 |
left: po.left + TestHelpers.draggable.border( p, "left" ) + TestHelpers.draggable.margin( element, "left" ), |
318 |
top: po.top + TestHelpers.draggable.border( p, "top" ) + TestHelpers.draggable.margin( element, "top" ) |
319 |
}; |
320 |
|
321 |
element.simulate( "drag", { |
322 |
dx: -100, |
323 |
dy: -100 |
324 |
}); |
325 |
offsetAfter = element.offset(); |
326 |
deepEqual( offsetAfter, expected, "compare offset to parent" ); |
327 |
}); |
328 |
|
329 |
test( "{ containment: 'parent' }, absolute", function() { |
330 |
expect( 1 ); |
331 |
|
332 |
var offsetAfter, |
333 |
element = $( "#draggable2" ).draggable({ containment: "parent" }), |
334 |
p = element.parent(), |
335 |
po = p.offset(), |
336 |
expected = { |
337 |
left: po.left + TestHelpers.draggable.border( p, "left" ) + TestHelpers.draggable.margin( element, "left" ), |
338 |
top: po.top + TestHelpers.draggable.border( p, "top" ) + TestHelpers.draggable.margin( element, "top" ) |
339 |
}; |
340 |
|
341 |
element.simulate( "drag", { |
342 |
dx: -100, |
343 |
dy: -100 |
344 |
}); |
345 |
offsetAfter = element.offset(); |
346 |
deepEqual( offsetAfter, expected, "compare offset to parent" ); |
347 |
}); |
348 |
|
349 |
test( "containment, account for border", function() { |
350 |
expect( 2 ); |
351 |
|
352 |
var el = $("#draggable1").appendTo("#main"), |
353 |
parent = el.parent().css({ |
354 |
height: "100px", |
355 |
width: "100px", |
356 |
borderStyle: "solid", |
357 |
borderWidth: "5px 10px 15px 20px" |
358 |
}), |
359 |
parentBottom = parent.offset().top + parent.outerHeight(), |
360 |
parentRight = parent.offset().left + parent.outerWidth(), |
361 |
parentBorderBottom = TestHelpers.draggable.border( parent, "bottom" ), |
362 |
parentBorderRight = TestHelpers.draggable.border( parent, "right" ); |
363 |
|
364 |
el.css({ |
365 |
height: "5px", |
366 |
width: "5px" |
367 |
}).draggable({ containment: "parent" }); |
368 |
|
369 |
el.simulate( "drag", { |
370 |
dx: 100, |
371 |
dy: 100 |
372 |
}); |
373 |
|
374 |
equal( el.offset().top, parentBottom - parentBorderBottom - el.height(), |
375 |
"The draggable should be on top of its parent's bottom border" ); |
376 |
equal( el.offset().left, parentRight - parentBorderRight - el.width(), |
377 |
"The draggable should be to the right of its parent's right border" ); |
378 |
}); |
379 |
|
380 |
test( "containment, default, switching after initialization", function() { |
381 |
expect( 3 ); |
382 |
|
383 |
var element = $( "#draggable1" ).draggable({ containment: false }); |
384 |
|
385 |
TestHelpers.draggable.testDrag( element, element, -100, -100, -100, -100 ); |
386 |
|
387 |
element.draggable( "option", "containment", "parent" ) |
388 |
.css({ |
389 |
top: 0, |
390 |
left: 0 |
391 |
}) |
392 |
.appendTo( $( "#main" ) ); |
393 |
|
394 |
TestHelpers.draggable.testDrag( element, element, -100, -100, 0, 0 ); |
395 |
|
396 |
element.draggable( "option", "containment", false ); |
397 |
TestHelpers.draggable.testDrag( element, element, -100, -100, -100, -100 ); |
398 |
}); |
399 |
|
400 |
test( "{ cursor: 'auto' }, default", function() { |
401 |
function getCursor() { |
402 |
return $( "#draggable2" ).css( "cursor" ); |
403 |
} |
404 |
|
405 |
expect( 2 ); |
406 |
|
407 |
var actual, after, |
408 |
expected = "auto", |
409 |
element = $( "#draggable2" ).draggable({ |
410 |
cursor: expected, |
411 |
start: function() { |
412 |
actual = getCursor(); |
413 |
} |
414 |
}), |
415 |
before = getCursor(); |
416 |
|
417 |
element.simulate( "drag", { |
418 |
dx: -1, |
419 |
dy: -1 |
420 |
}); |
421 |
after = getCursor(); |
422 |
|
423 |
equal( actual, expected, "start callback: cursor '" + expected + "'" ); |
424 |
equal( after, before, "after drag: cursor restored" ); |
425 |
}); |
426 |
|
427 |
test( "{ cursor: 'move' }", function() { |
428 |
function getCursor() { |
429 |
return $( "body" ).css( "cursor" ); |
430 |
} |
431 |
|
432 |
expect( 2 ); |
433 |
|
434 |
var actual, after, |
435 |
expected = "move", |
436 |
element = $( "#draggable2" ).draggable({ |
437 |
cursor: expected, |
438 |
start: function() { |
439 |
actual = getCursor(); |
440 |
} |
441 |
}), |
442 |
before = getCursor(); |
443 |
|
444 |
element.simulate( "drag", { |
445 |
dx: -1, |
446 |
dy: -1 |
447 |
}); |
448 |
after = getCursor(); |
449 |
|
450 |
equal( actual, expected, "start callback: cursor '" + expected + "'" ); |
451 |
equal( after, before, "after drag: cursor restored" ); |
452 |
}); |
453 |
|
454 |
test( "cursor, default, switching after initialization", function() { |
455 |
expect( 3 ); |
456 |
|
457 |
var element = $( "#draggable1" ).draggable(); |
458 |
|
459 |
TestHelpers.draggable.trackMouseCss( element ); |
460 |
|
461 |
TestHelpers.draggable.move( element, 1, 1 ); |
462 |
equal( element.data( "last_dragged_cursor" ), "auto" ); |
463 |
|
464 |
element.draggable( "option", "cursor", "move" ); |
465 |
TestHelpers.draggable.move( element, 1, 1 ); |
466 |
equal( element.data( "last_dragged_cursor" ), "move" ); |
467 |
|
468 |
element.draggable( "option", "cursor", "ns-resize" ); |
469 |
TestHelpers.draggable.move( element, 1, 1 ); |
470 |
equal( element.data( "last_dragged_cursor" ), "ns-resize" ); |
471 |
}); |
472 |
|
473 |
test( "cursorAt", function() { |
474 |
expect( 24 ); |
475 |
|
476 |
var deltaX = -3, |
477 |
deltaY = -3, |
478 |
tests = { |
479 |
"false": { cursorAt : false }, |
480 |
"{ left: -5, top: -5 }": { x: -5, y: -5, cursorAt : { left: -5, top: -5 } }, |
481 |
"[ 10, 20 ]": { x: 10, y: 20, cursorAt : [ 10, 20 ] }, |
482 |
"'10 20'": { x: 10, y: 20, cursorAt : "10 20" }, |
483 |
"{ left: 20, top: 40 }": { x: 20, y: 40, cursorAt : { left: 20, top: 40 } }, |
484 |
"{ right: 10, bottom: 20 }": { x: 10, y: 20, cursorAt : { right: 10, bottom: 20 } } |
485 |
}; |
486 |
|
487 |
$.each( tests, function( testName, testData ) { |
488 |
$.each( [ "relative", "absolute" ], function( i, position ) { |
489 |
var element = $( "#draggable" + ( i + 1 ) ).draggable({ |
490 |
cursorAt: testData.cursorAt, |
491 |
drag: function( event, ui ) { |
492 |
if( !testData.cursorAt ) { |
493 |
equal( ui.position.left - ui.originalPosition.left, deltaX, testName + " " + position + " left" ); |
494 |
equal( ui.position.top - ui.originalPosition.top, deltaY, testName + " " + position + " top" ); |
495 |
} else if( testData.cursorAt.right ) { |
496 |
equal( ui.helper.width() - ( event.clientX - ui.offset.left ), testData.x - TestHelpers.draggable.unreliableOffset, testName + " " + position + " left" ); |
497 |
equal( ui.helper.height() - ( event.clientY - ui.offset.top ), testData.y - TestHelpers.draggable.unreliableOffset, testName + " " +position + " top" ); |
498 |
} else { |
499 |
equal( event.clientX - ui.offset.left, testData.x + TestHelpers.draggable.unreliableOffset, testName + " " + position + " left" ); |
500 |
equal( event.clientY - ui.offset.top, testData.y + TestHelpers.draggable.unreliableOffset, testName + " " + position + " top" ); |
501 |
} |
502 |
} |
503 |
}); |
504 |
|
505 |
element.simulate( "drag", { |
506 |
moves: 1, |
507 |
dx: deltaX, |
508 |
dy: deltaY |
509 |
}); |
510 |
}); |
511 |
}); |
512 |
}); |
513 |
|
514 |
test( "cursorAt, switching after initialization", function() { |
515 |
expect( 24 ); |
516 |
|
517 |
var deltaX = -3, |
518 |
deltaY = -3, |
519 |
tests = { |
520 |
"false": { cursorAt : false }, |
521 |
"{ left: -5, top: -5 }": { x: -5, y: -5, cursorAt : { left: -5, top: -5 } }, |
522 |
"[ 10, 20 ]": { x: 10, y: 20, cursorAt : [ 10, 20 ] }, |
523 |
"'10 20'": { x: 10, y: 20, cursorAt : "10 20" }, |
524 |
"{ left: 20, top: 40 }": { x: 20, y: 40, cursorAt : { left: 20, top: 40 } }, |
525 |
"{ right: 10, bottom: 20 }": { x: 10, y: 20, cursorAt : { right: 10, bottom: 20 } } |
526 |
}; |
527 |
|
528 |
$.each( tests, function( testName, testData ) { |
529 |
$.each( [ "relative", "absolute" ], function( i, position ) { |
530 |
var element = $( "#draggable" + ( i + 1 ) ); |
531 |
|
532 |
element.draggable({ |
533 |
drag: function( event, ui ) { |
534 |
if( !testData.cursorAt ) { |
535 |
equal( ui.position.left - ui.originalPosition.left, deltaX, testName + " " + position + " left" ); |
536 |
equal( ui.position.top - ui.originalPosition.top, deltaY, testName + " " + position + " top" ); |
537 |
} else if( testData.cursorAt.right ) { |
538 |
equal( ui.helper.width() - ( event.clientX - ui.offset.left ), testData.x - TestHelpers.draggable.unreliableOffset, testName + " " + position + " left" ); |
539 |
equal( ui.helper.height() - ( event.clientY - ui.offset.top ), testData.y - TestHelpers.draggable.unreliableOffset, testName + " " +position + " top" ); |
540 |
} else { |
541 |
equal( event.clientX - ui.offset.left, testData.x + TestHelpers.draggable.unreliableOffset, testName + " " + position + " left" ); |
542 |
equal( event.clientY - ui.offset.top, testData.y + TestHelpers.draggable.unreliableOffset, testName + " " + position + " top" ); |
543 |
} |
544 |
} |
545 |
}); |
546 |
|
547 |
element.draggable( "option", "cursorAt", false ); |
548 |
element.draggable( "option", "cursorAt", testData.cursorAt ); |
549 |
|
550 |
element.simulate( "drag", { |
551 |
moves: 1, |
552 |
dx: deltaX, |
553 |
dy: deltaY |
554 |
}); |
555 |
}); |
556 |
}); |
557 |
}); |
558 |
|
559 |
test( "disabled", function() { |
560 |
expect( 3 ); |
561 |
|
562 |
var element = $( "#draggable1" ).draggable(); |
563 |
|
564 |
TestHelpers.draggable.shouldMove( element ); |
565 |
|
566 |
element.draggable( "option", "disabled", true ); |
567 |
TestHelpers.draggable.shouldNotMove( element ); |
568 |
|
569 |
element.draggable( "option", "disabled", false ); |
570 |
TestHelpers.draggable.shouldMove( element ); |
571 |
}); |
572 |
|
573 |
test( "{ grid: [50, 50] }, relative", function() { |
574 |
expect( 2 ); |
575 |
|
576 |
var element = $( "#draggable1" ).draggable({ grid: [ 50, 50 ] }); |
577 |
TestHelpers.draggable.testDrag( element, element, 24, 24, 0, 0 ); |
578 |
TestHelpers.draggable.testDrag( element, element, 26, 25, 50, 50 ); |
579 |
}); |
580 |
|
581 |
test( "{ grid: [50, 50] }, absolute", function() { |
582 |
expect( 2 ); |
583 |
|
584 |
var element = $( "#draggable2" ).draggable({ grid: [ 50, 50 ] }); |
585 |
TestHelpers.draggable.testDrag( element, element, 24, 24, 0, 0 ); |
586 |
TestHelpers.draggable.testDrag( element, element, 26, 25, 50, 50 ); |
587 |
}); |
588 |
|
589 |
test( "grid, switching after initialization", function() { |
590 |
expect( 4 ); |
591 |
|
592 |
var element = $( "#draggable1" ).draggable(); |
593 |
|
594 |
// Forward |
595 |
TestHelpers.draggable.testDrag( element, element, 24, 24, 24, 24 ); |
596 |
TestHelpers.draggable.testDrag( element, element, 0, 0, 0, 0 ); |
597 |
|
598 |
element.draggable( "option", "grid", [ 50,50 ] ); |
599 |
|
600 |
TestHelpers.draggable.testDrag( element, element, 24, 24, 0, 0 ); |
601 |
TestHelpers.draggable.testDrag( element, element, 26, 25, 50, 50 ); |
602 |
}); |
603 |
|
604 |
test( "{ handle: 'span' }", function() { |
605 |
expect( 3 ); |
606 |
|
607 |
var element = $( "#draggable2" ).draggable({ handle: "span" }); |
608 |
|
609 |
TestHelpers.draggable.testDrag( element, "#draggable2 span", 50, 50, 50, 50, "drag span" ); |
610 |
TestHelpers.draggable.testDrag( element, "#draggable2 span em", 50, 50, 50, 50, "drag span child" ); |
611 |
TestHelpers.draggable.shouldNotMove( element, "drag element" ); |
612 |
}); |
613 |
|
614 |
test( "handle, default, switching after initialization", function() { |
615 |
expect( 6 ); |
616 |
|
617 |
var element = $( "#draggable2" ).draggable(); |
618 |
|
619 |
TestHelpers.draggable.testDrag( element, element, 50, 50, 50, 50 ); |
620 |
TestHelpers.draggable.testDrag( element, "#draggable2 span", 100, 100, 100, 100 ); |
621 |
|
622 |
// Switch |
623 |
element.draggable( "option", "handle", "span" ); |
624 |
TestHelpers.draggable.testDrag( element, element, 50, 50, 0, 0 ); |
625 |
TestHelpers.draggable.testDrag( element, "#draggable2 span", 100, 100, 100, 100 ); |
626 |
|
627 |
// And back |
628 |
element.draggable( "option", "handle", false ); |
629 |
TestHelpers.draggable.testDrag( element, element, 50, 50, 50, 50 ); |
630 |
TestHelpers.draggable.testDrag( element, "#draggable2 span", 100, 100, 100, 100 ); |
631 |
}); |
632 |
|
633 |
test( "helper, default, switching after initialization", function() { |
634 |
expect( 3 ); |
635 |
|
636 |
var element = $( "#draggable1" ).draggable(); |
637 |
TestHelpers.draggable.shouldMove( element ); |
638 |
|
639 |
element.draggable( "option", "helper", "clone" ); |
640 |
TestHelpers.draggable.shouldNotMove( element ); |
641 |
|
642 |
element.draggable( "option", "helper", "original" ); |
643 |
TestHelpers.draggable.shouldMove( element ); |
644 |
}); |
645 |
|
646 |
test( "{ helper: 'clone' }, relative", function() { |
647 |
expect( 1 ); |
648 |
|
649 |
var element = $( "#draggable1" ).draggable({ helper: "clone" }); |
650 |
TestHelpers.draggable.shouldNotMove( element ); |
651 |
}); |
652 |
|
653 |
test( "{ helper: 'clone' }, absolute", function() { |
654 |
expect( 1 ); |
655 |
|
656 |
var element = $( "#draggable2" ).draggable({ helper: "clone" }); |
657 |
TestHelpers.draggable.shouldNotMove( element ); |
658 |
}); |
659 |
|
660 |
test( "{ helper: 'original' }, relative, with scroll offset on parent", function() { |
661 |
expect( 3 ); |
662 |
|
663 |
var element = $( "#draggable1" ).draggable({ helper: "original" }); |
664 |
|
665 |
TestHelpers.draggable.setScroll(); |
666 |
TestHelpers.draggable.testScroll( element, "relative" ); |
667 |
|
668 |
TestHelpers.draggable.setScroll(); |
669 |
TestHelpers.draggable.testScroll( element, "static" ); |
670 |
|
671 |
TestHelpers.draggable.setScroll(); |
672 |
TestHelpers.draggable.testScroll( element, "absolute" ); |
673 |
|
674 |
TestHelpers.draggable.restoreScroll(); |
675 |
}); |
676 |
|
677 |
test( "{ helper: 'original' }, relative, with scroll offset on root", function() { |
678 |
expect( 3 ); |
679 |
|
680 |
var element = $( "#draggable1" ).draggable({ helper: "original" }); |
681 |
|
682 |
TestHelpers.draggable.setScroll( "root" ); |
683 |
TestHelpers.draggable.testScroll( element, "relative" ); |
684 |
|
685 |
TestHelpers.draggable.setScroll( "root" ); |
686 |
TestHelpers.draggable.testScroll( element, "static" ); |
687 |
|
688 |
TestHelpers.draggable.setScroll( "root" ); |
689 |
TestHelpers.draggable.testScroll( element, "absolute" ); |
690 |
|
691 |
TestHelpers.draggable.restoreScroll( "root" ); |
692 |
}); |
693 |
|
694 |
test( "{ helper: 'original' }, relative, with scroll offset on root and parent", function() { |
695 |
expect( 3 ); |
696 |
|
697 |
var element = $( "#draggable1" ).draggable({ helper: "original" }); |
698 |
|
699 |
TestHelpers.draggable.setScroll(); |
700 |
TestHelpers.draggable.setScroll( "root" ); |
701 |
TestHelpers.draggable.testScroll( element, "relative" ); |
702 |
|
703 |
TestHelpers.draggable.setScroll(); |
704 |
TestHelpers.draggable.setScroll( "root" ); |
705 |
TestHelpers.draggable.testScroll( element, "static" ); |
706 |
|
707 |
TestHelpers.draggable.setScroll(); |
708 |
TestHelpers.draggable.setScroll( "root" ); |
709 |
TestHelpers.draggable.testScroll( element, "absolute" ); |
710 |
|
711 |
TestHelpers.draggable.restoreScroll(); |
712 |
TestHelpers.draggable.restoreScroll( "root" ); |
713 |
}); |
714 |
|
715 |
test( "{ helper: 'original' }, absolute, with scroll offset on parent", function() { |
716 |
expect( 3 ); |
717 |
|
718 |
var element = $( "#draggable1" ).css({ position: "absolute", top: 0, left: 0 }).draggable({ helper: "original" }); |
719 |
|
720 |
TestHelpers.draggable.setScroll(); |
721 |
TestHelpers.draggable.testScroll( element, "relative" ); |
722 |
|
723 |
TestHelpers.draggable.setScroll(); |
724 |
TestHelpers.draggable.testScroll( element, "static" ); |
725 |
|
726 |
TestHelpers.draggable.setScroll(); |
727 |
TestHelpers.draggable.testScroll( element, "absolute" ); |
728 |
|
729 |
TestHelpers.draggable.restoreScroll(); |
730 |
}); |
731 |
|
732 |
test( "{ helper: 'original' }, absolute, with scroll offset on root", function() { |
733 |
expect( 3 ); |
734 |
|
735 |
var element = $( "#draggable1" ).css({ position: "absolute", top: 0, left: 0 }).draggable({ helper: "original" }); |
736 |
|
737 |
TestHelpers.draggable.setScroll( "root" ); |
738 |
TestHelpers.draggable.testScroll( element, "relative" ); |
739 |
|
740 |
TestHelpers.draggable.setScroll( "root" ); |
741 |
TestHelpers.draggable.testScroll( element, "static" ); |
742 |
|
743 |
TestHelpers.draggable.setScroll( "root" ); |
744 |
TestHelpers.draggable.testScroll( element, "absolute" ); |
745 |
|
746 |
TestHelpers.draggable.restoreScroll( "root" ); |
747 |
}); |
748 |
|
749 |
test( "{ helper: 'original' }, absolute, with scroll offset on root and parent", function() { |
750 |
expect( 3 ); |
751 |
|
752 |
var element = $( "#draggable1" ).css({ position: "absolute", top: 0, left: 0 }).draggable({ helper: "original" }); |
753 |
|
754 |
TestHelpers.draggable.setScroll(); |
755 |
TestHelpers.draggable.setScroll( "root" ); |
756 |
TestHelpers.draggable.testScroll( element, "relative" ); |
757 |
|
758 |
TestHelpers.draggable.setScroll(); |
759 |
TestHelpers.draggable.setScroll( "root" ); |
760 |
TestHelpers.draggable.testScroll( element, "static" ); |
761 |
|
762 |
TestHelpers.draggable.setScroll(); |
763 |
TestHelpers.draggable.setScroll( "root" ); |
764 |
TestHelpers.draggable.testScroll( element, "absolute" ); |
765 |
|
766 |
TestHelpers.draggable.restoreScroll(); |
767 |
TestHelpers.draggable.restoreScroll( "root" ); |
768 |
}); |
769 |
|
770 |
test( "{ helper: 'original' }, fixed, with scroll offset on parent", function() { |
771 |
expect( 3 ); |
772 |
|
773 |
var element = $( "#draggable1" ).css({ position: "fixed", top: 0, left: 0 }).draggable({ helper: "original" }); |
774 |
|
775 |
TestHelpers.draggable.setScroll(); |
776 |
TestHelpers.draggable.testScroll( element, "relative" ); |
777 |
|
778 |
TestHelpers.draggable.setScroll(); |
779 |
TestHelpers.draggable.testScroll( element, "static" ); |
780 |
|
781 |
TestHelpers.draggable.setScroll(); |
782 |
TestHelpers.draggable.testScroll( element, "absolute" ); |
783 |
|
784 |
TestHelpers.draggable.restoreScroll(); |
785 |
}); |
786 |
|
787 |
test( "{ helper: 'original' }, fixed, with scroll offset on root", function() { |
788 |
expect( 3 ); |
789 |
|
790 |
var element = $( "#draggable1" ).css({ position: "fixed", top: 0, left: 0 }).draggable({ helper: "original" }); |
791 |
|
792 |
TestHelpers.draggable.setScroll( "root" ); |
793 |
TestHelpers.draggable.testScroll( element, "relative" ); |
794 |
|
795 |
TestHelpers.draggable.setScroll( "root" ); |
796 |
TestHelpers.draggable.testScroll( element, "static" ); |
797 |
|
798 |
TestHelpers.draggable.setScroll( "root" ); |
799 |
TestHelpers.draggable.testScroll( element, "absolute" ); |
800 |
|
801 |
TestHelpers.draggable.restoreScroll( "root" ); |
802 |
}); |
803 |
|
804 |
test( "{ helper: 'original' }, fixed, with scroll offset on root and parent", function() { |
805 |
expect( 3 ); |
806 |
|
807 |
var element = $( "#draggable1" ).css({ position: "fixed", top: 0, left: 0 }).draggable({ helper: "original" }); |
808 |
|
809 |
TestHelpers.draggable.setScroll(); |
810 |
TestHelpers.draggable.setScroll( "root" ); |
811 |
TestHelpers.draggable.testScroll( element, "relative" ); |
812 |
|
813 |
TestHelpers.draggable.setScroll(); |
814 |
TestHelpers.draggable.setScroll( "root" ); |
815 |
TestHelpers.draggable.testScroll( element, "static" ); |
816 |
|
817 |
TestHelpers.draggable.setScroll(); |
818 |
TestHelpers.draggable.setScroll( "root" ); |
819 |
TestHelpers.draggable.testScroll( element, "absolute" ); |
820 |
|
821 |
TestHelpers.draggable.restoreScroll(); |
822 |
TestHelpers.draggable.restoreScroll( "root" ); |
823 |
}); |
824 |
|
825 |
test( "{ helper: 'clone' }, absolute", function() { |
826 |
expect( 1 ); |
827 |
|
828 |
var helperOffset = null, |
829 |
origOffset = $( "#draggable1" ).offset(), |
830 |
element = $( "#draggable1" ).draggable({ helper: "clone", drag: function( event, ui) { |
831 |
helperOffset = ui.helper.offset(); |
832 |
} }); |
833 |
|
834 |
element.simulate( "drag", { |
835 |
dx: 1, |
836 |
dy: 1 |
837 |
}); |
838 |
deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); |
839 |
}); |
840 |
|
841 |
test( "{ helper: 'clone' }, absolute with scroll offset on parent", function() { |
842 |
expect( 3 ); |
843 |
|
844 |
TestHelpers.draggable.setScroll(); |
845 |
var helperOffset = null, |
846 |
origOffset = null, |
847 |
element = $( "#draggable1" ).draggable({ |
848 |
helper: "clone", |
849 |
drag: function( event, ui) { |
850 |
helperOffset = ui.helper.offset(); |
851 |
} |
852 |
}); |
853 |
|
854 |
$( "#main" ).css( "position", "relative" ); |
855 |
origOffset = $( "#draggable1" ).offset(); |
856 |
element.simulate( "drag", { |
857 |
dx: 1, |
858 |
dy: 1 |
859 |
}); |
860 |
deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); |
861 |
|
862 |
$( "#main" ).css( "position", "static" ); |
863 |
origOffset = $( "#draggable1" ).offset(); |
864 |
element.simulate( "drag", { |
865 |
dx: 1, |
866 |
dy: 1 |
867 |
}); |
868 |
deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); |
869 |
|
870 |
$( "#main" ).css( "position", "absolute" ); |
871 |
origOffset = $( "#draggable1" ).offset(); |
872 |
element.simulate( "drag", { |
873 |
dx: 1, |
874 |
dy: 1 |
875 |
}); |
876 |
deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); |
877 |
|
878 |
TestHelpers.draggable.restoreScroll(); |
879 |
}); |
880 |
|
881 |
test( "{ helper: 'clone' }, absolute with scroll offset on root", function() { |
882 |
expect( 3 ); |
883 |
|
884 |
TestHelpers.draggable.setScroll( "root" ); |
885 |
var helperOffset = null, |
886 |
origOffset = null, |
887 |
element = $( "#draggable1" ).draggable({ |
888 |
helper: "clone", |
889 |
drag: function( event, ui) { |
890 |
helperOffset = ui.helper.offset(); |
891 |
} |
892 |
}); |
893 |
|
894 |
$( "#main" ).css( "position", "relative" ); |
895 |
origOffset = $( "#draggable1" ).offset(); |
896 |
element.simulate( "drag", { |
897 |
dx: 1, |
898 |
dy: 1 |
899 |
}); |
900 |
deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); |
901 |
|
902 |
$( "#main" ).css( "position", "static" ); |
903 |
origOffset = $( "#draggable1" ).offset(); |
904 |
element.simulate( "drag", { |
905 |
dx: 1, |
906 |
dy: 1 |
907 |
}); |
908 |
deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); |
909 |
|
910 |
$( "#main" ).css( "position", "absolute" ); |
911 |
origOffset = $( "#draggable1" ).offset(); |
912 |
element.simulate( "drag", { |
913 |
dx: 1, |
914 |
dy: 1 |
915 |
}); |
916 |
deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); |
917 |
|
918 |
TestHelpers.draggable.restoreScroll( "root" ); |
919 |
}); |
920 |
|
921 |
test( "{ helper: 'clone' }, absolute with scroll offset on root and parent", function() { |
922 |
expect( 3 ); |
923 |
|
924 |
TestHelpers.draggable.setScroll( "root" ); |
925 |
TestHelpers.draggable.setScroll(); |
926 |
|
927 |
var helperOffset = null, |
928 |
origOffset = null, |
929 |
element = $( "#draggable1" ).draggable({ |
930 |
helper: "clone", |
931 |
drag: function( event, ui) { |
932 |
helperOffset = ui.helper.offset(); |
933 |
} |
934 |
}); |
935 |
|
936 |
$( "#main" ).css( "position", "relative" ); |
937 |
origOffset = $( "#draggable1" ).offset(); |
938 |
element.simulate( "drag", { |
939 |
dx: 1, |
940 |
dy: 1 |
941 |
}); |
942 |
deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); |
943 |
|
944 |
$( "#main" ).css( "position", "static" ); |
945 |
origOffset = $( "#draggable1" ).offset(); |
946 |
element.simulate( "drag", { |
947 |
dx: 1, |
948 |
dy: 1 |
949 |
}); |
950 |
deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); |
951 |
|
952 |
$( "#main" ).css( "position", "absolute" ); |
953 |
origOffset = $( "#draggable1" ).offset(); |
954 |
element.simulate( "drag", { |
955 |
dx: 1, |
956 |
dy: 1 |
957 |
}); |
958 |
deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); |
959 |
|
960 |
TestHelpers.draggable.restoreScroll( "root" ); |
961 |
TestHelpers.draggable.restoreScroll(); |
962 |
}); |
963 |
|
964 |
test( "{ opacity: 0.5 }", function() { |
965 |
expect( 1 ); |
966 |
|
967 |
var opacity = null, |
968 |
element = $( "#draggable2" ).draggable({ |
969 |
opacity: 0.5, |
970 |
start: function() { |
971 |
opacity = $(this).css( "opacity" ); |
972 |
} |
973 |
}); |
974 |
|
975 |
element.simulate( "drag", { |
976 |
dx: -1, |
977 |
dy: -1 |
978 |
}); |
979 |
|
980 |
equal( opacity, 0.5, "start callback: opacity is" ); |
981 |
}); |
982 |
|
983 |
test( "opacity, default, switching after initialization", function() { |
984 |
expect( 3 ); |
985 |
|
986 |
var opacity = null, |
987 |
element = $( "#draggable2" ).draggable({ |
988 |
start: function() { |
989 |
opacity = $(this).css( "opacity" ); |
990 |
} |
991 |
}); |
992 |
|
993 |
TestHelpers.draggable.move( element, 1, 1 ); |
994 |
equal( opacity, 1 ); |
995 |
|
996 |
element.draggable( "option", "opacity", 0.5 ); |
997 |
TestHelpers.draggable.move( element, 2, 1 ); |
998 |
equal( opacity, 0.5 ); |
999 |
|
1000 |
element.draggable( "option", "opacity", false ); |
1001 |
TestHelpers.draggable.move( element, 3, 1 ); |
1002 |
equal( opacity, 1 ); |
1003 |
}); |
1004 |
|
1005 |
asyncTest( "revert and revertDuration", function() { |
1006 |
expect( 4 ); |
1007 |
|
1008 |
var element = $( "#draggable2" ).draggable({ |
1009 |
revert: true, |
1010 |
revertDuration: 0 |
1011 |
}); |
1012 |
TestHelpers.draggable.shouldNotMove( element, "revert: true, revertDuration: 0 should revert immediately" ); |
1013 |
|
1014 |
$( "#draggable2" ).draggable( "option", "revert", "invalid" ); |
1015 |
TestHelpers.draggable.shouldNotMove( element, "revert: invalid, revertDuration: 0 should revert immediately" ); |
1016 |
|
1017 |
$( "#draggable2" ).draggable( "option", "revert", false ); |
1018 |
TestHelpers.draggable.shouldMove( element, "revert: false should allow movement" ); |
1019 |
|
1020 |
$( "#draggable2" ).draggable( "option", { |
1021 |
revert: true, |
1022 |
revertDuration: 200, |
1023 |
stop: function() { |
1024 |
start(); |
1025 |
} |
1026 |
}); |
1027 |
|
1028 |
// animation are async, so test for it asynchronously |
1029 |
TestHelpers.draggable.move( element, 50, 50 ); |
1030 |
setTimeout( function() { |
1031 |
ok( $( "#draggable2" ).is( ":animated" ), "revert: true with revertDuration should animate" ); |
1032 |
}); |
1033 |
}); |
1034 |
|
1035 |
test( "revert: valid", function() { |
1036 |
expect( 1 ); |
1037 |
|
1038 |
var element = $( "#draggable2" ).draggable({ |
1039 |
revert: "valid", |
1040 |
revertDuration: 0 |
1041 |
}); |
1042 |
|
1043 |
$( "#droppable" ).droppable(); |
1044 |
|
1045 |
TestHelpers.draggable.testDrag( element, element, 100, 100, 0, 0, "revert: valid reverts when dropped on a droppable" ); |
1046 |
}); |
1047 |
|
1048 |
test( "scope", function() { |
1049 |
expect( 2 ); |
1050 |
|
1051 |
var element = $( "#draggable2" ).draggable({ |
1052 |
scope: "tasks", |
1053 |
revert: "valid", |
1054 |
revertDuration: 0 |
1055 |
}); |
1056 |
|
1057 |
$( "#droppable" ).droppable({ scope: "tasks" }); |
1058 |
|
1059 |
TestHelpers.draggable.testDrag( element, element, 100, 100, 0, 0, "revert: valid reverts when dropped on a droppable in scope" ); |
1060 |
|
1061 |
$( "#droppable" ).droppable( "destroy" ).droppable({ scope: "nottasks" }); |
1062 |
|
1063 |
TestHelpers.draggable.testDrag( element, element, 100, 100, 100, 100, "revert: valid reverts when dropped on a droppable out of scope" ); |
1064 |
}); |
1065 |
|
1066 |
test( "scroll, scrollSensitivity, and scrollSpeed", function() { |
1067 |
expect( 2 ); |
1068 |
|
1069 |
var viewportHeight = $( window ).height(), |
1070 |
element = $( "#draggable1" ).draggable({ scroll: true }), |
1071 |
scrollSensitivity = element.draggable( "option", "scrollSensitivity" ), |
1072 |
scrollSpeed = element.draggable( "option", "scrollSpeed" ); |
1073 |
|
1074 |
element.offset({ |
1075 |
top: viewportHeight - scrollSensitivity - 1, |
1076 |
left: 1 |
1077 |
}); |
1078 |
|
1079 |
element.simulate( "drag", { |
1080 |
dx: 1, |
1081 |
y: viewportHeight - scrollSensitivity - 1, |
1082 |
moves: 1 |
1083 |
}); |
1084 |
|
1085 |
ok( $( window ).scrollTop() === 0, "scroll: true doesn't scroll when the element is dragged outside of scrollSensitivity" ); |
1086 |
|
1087 |
element.draggable( "option", "scrollSensitivity", scrollSensitivity + 10 ); |
1088 |
|
1089 |
element.offset({ |
1090 |
top: viewportHeight - scrollSensitivity - 1, |
1091 |
left: 1 |
1092 |
}); |
1093 |
|
1094 |
element.simulate( "drag", { |
1095 |
dx: 1, |
1096 |
y: viewportHeight - scrollSensitivity - 1, |
1097 |
moves: 1 |
1098 |
}); |
1099 |
|
1100 |
ok( $( window ).scrollTop() === scrollSpeed, "scroll: true scrolls when the element is dragged within scrollSensitivity" ); |
1101 |
|
1102 |
TestHelpers.draggable.restoreScroll( document ); |
1103 |
}); |
1104 |
|
1105 |
test( "#6817: auto scroll goes double distance when dragging", function() { |
1106 |
expect( 2 ); |
1107 |
|
1108 |
var offsetBefore, |
1109 |
distance = 10, |
1110 |
viewportHeight = $( window ).height(), |
1111 |
element = $( "#draggable1" ).draggable({ |
1112 |
scroll: true, |
1113 |
stop: function( e, ui ) { |
1114 |
equal( ui.offset.top, newY, "offset of item matches pointer position after scroll" ); |
1115 |
// TODO: fix IE8 testswarm IFRAME positioning bug so closeEnough can be turned back to equal |
1116 |
closeEnough( ui.offset.top - offsetBefore.top, distance, 1, "offset of item only moves expected distance after scroll" ); |
1117 |
} |
1118 |
}), |
1119 |
scrollSensitivity = element.draggable( "option", "scrollSensitivity" ), |
1120 |
oldY = viewportHeight - scrollSensitivity, |
1121 |
newY = oldY + distance; |
1122 |
|
1123 |
element.offset({ |
1124 |
top: oldY, |
1125 |
left: 1 |
1126 |
}); |
1127 |
|
1128 |
offsetBefore = element.offset(); |
1129 |
|
1130 |
element.simulate( "drag", { |
1131 |
handle: "corner", |
1132 |
dx: 1, |
1133 |
y: newY, |
1134 |
moves: 1 |
1135 |
}); |
1136 |
|
1137 |
TestHelpers.draggable.restoreScroll( document ); |
1138 |
}); |
1139 |
|
1140 |
test( "snap, snapMode, and snapTolerance", function() { |
1141 |
expect( 10 ); |
1142 |
|
1143 |
var newX, newY, |
1144 |
snapTolerance = 15, |
1145 |
element = $( "#draggable1" ).draggable({ |
1146 |
snap: true, |
1147 |
snapMode: "both", |
1148 |
snapTolerance: snapTolerance |
1149 |
}), |
1150 |
element2 = $( "#draggable2" ).draggable(); |
1151 |
|
1152 |
element.offset({ |
1153 |
top: 1, |
1154 |
left: 1 |
1155 |
}); |
1156 |
|
1157 |
newX = element2.offset().left - element.outerWidth() - snapTolerance - 2; |
1158 |
newY = element2.offset().top; |
1159 |
|
1160 |
element.simulate( "drag", { |
1161 |
handle: "corner", |
1162 |
x: newX, |
1163 |
y: newY, |
1164 |
moves: 1 |
1165 |
}); |
1166 |
|
1167 |
// TODO: fix IE8 testswarm IFRAME positioning bug so closeEnough can be turned back to equal |
1168 |
closeEnough( element.offset().left, newX, 1, "doesn't snap outside the snapTolerance" ); |
1169 |
closeEnough( element.offset().top, newY, 1, "doesn't snap outside the snapTolerance" ); |
1170 |
|
1171 |
newX += 3; |
1172 |
|
1173 |
element.simulate( "drag", { |
1174 |
handle: "corner", |
1175 |
x: newX, |
1176 |
y: newY, |
1177 |
moves: 1 |
1178 |
}); |
1179 |
|
1180 |
notDeepEqual( element.offset(), { top: newY, left: newX }, "snaps inside the snapTolerance" ); |
1181 |
|
1182 |
element.draggable( "option", "snap", "#draggable2" ); |
1183 |
|
1184 |
element.simulate( "drag", { |
1185 |
handle: "corner", |
1186 |
x: newX, |
1187 |
y: newY, |
1188 |
moves: 1 |
1189 |
}); |
1190 |
|
1191 |
notDeepEqual( element.offset(), { top: newY, left: newX }, "snaps based on selector" ); |
1192 |
|
1193 |
element.draggable( "option", "snap", "#draggable3" ); |
1194 |
|
1195 |
element.simulate( "drag", { |
1196 |
handle: "corner", |
1197 |
x: newX, |
1198 |
y: newY, |
1199 |
moves: 1 |
1200 |
}); |
1201 |
|
1202 |
deepEqual( element.offset(), { top: newY, left: newX }, "doesn't snap based on invalid selector" ); |
1203 |
|
1204 |
element.draggable( "option", "snap", true ); |
1205 |
element.draggable( "option", "snapTolerance", snapTolerance - 2 ); |
1206 |
element.simulate( "drag", { |
1207 |
handle: "corner", |
1208 |
x: newX, |
1209 |
y: newY, |
1210 |
moves: 1 |
1211 |
}); |
1212 |
|
1213 |
deepEqual( element.offset(), { top: newY, left: newX }, "doesn't snap outside the modified snapTolerance" ); |
1214 |
|
1215 |
element.draggable( "option", "snapTolerance", snapTolerance ); |
1216 |
element.draggable( "option", "snapMode", "inner" ); |
1217 |
|
1218 |
element.simulate( "drag", { |
1219 |
handle: "corner", |
1220 |
x: newX, |
1221 |
y: newY, |
1222 |
moves: 1 |
1223 |
}); |
1224 |
|
1225 |
deepEqual( element.offset(), { top: newY, left: newX }, "doesn't snap inside the outer snapTolerance area when snapMode is inner" ); |
1226 |
|
1227 |
newX = element2.offset().left - snapTolerance - 1; |
1228 |
newY = element2.offset().top; |
1229 |
|
1230 |
element.simulate( "drag", { |
1231 |
handle: "corner", |
1232 |
x: newX, |
1233 |
y: newY, |
1234 |
moves: 1 |
1235 |
}); |
1236 |
|
1237 |
deepEqual( element.offset(), { top: newY, left: newX }, "doesn't snap inside the outer snapTolerance area when snapMode is inner" ); |
1238 |
|
1239 |
newX++; |
1240 |
|
1241 |
element.simulate( "drag", { |
1242 |
handle: "corner", |
1243 |
x: newX, |
1244 |
y: newY, |
1245 |
moves: 1 |
1246 |
}); |
1247 |
|
1248 |
notDeepEqual( element.offset(), { top: newY, left: newX }, "snaps inside the inner snapTolerance area when snapMode is inner" ); |
1249 |
|
1250 |
element.draggable( "option", "snapMode", "outer" ); |
1251 |
|
1252 |
element.simulate( "drag", { |
1253 |
handle: "corner", |
1254 |
x: newX, |
1255 |
y: newY, |
1256 |
moves: 1 |
1257 |
}); |
1258 |
|
1259 |
deepEqual( element.offset(), { top: newY, left: newX }, "doesn't snap on the inner snapTolerance area when snapMode is outer" ); |
1260 |
}); |
1261 |
|
1262 |
test( "#8459: element can snap to an element that was removed during drag", function() { |
1263 |
expect( 2 ); |
1264 |
|
1265 |
var newX, newY, |
1266 |
snapTolerance = 15, |
1267 |
element = $( "#draggable1" ).draggable({ |
1268 |
snap: true, |
1269 |
snapMode: "both", |
1270 |
snapTolerance: snapTolerance, |
1271 |
start: function() { |
1272 |
element2.remove(); |
1273 |
} |
1274 |
}), |
1275 |
element2 = $( "#draggable2" ).draggable(); |
1276 |
|
1277 |
element.offset({ |
1278 |
top: 1, |
1279 |
left: 1 |
1280 |
}); |
1281 |
|
1282 |
newX = element2.offset().left - element.outerWidth() - snapTolerance + 1; |
1283 |
newY = element2.offset().top; |
1284 |
|
1285 |
element.simulate( "drag", { |
1286 |
handle: "corner", |
1287 |
x: newX, |
1288 |
y: newY, |
1289 |
moves: 1 |
1290 |
}); |
1291 |
|
1292 |
// Support: Opera 12.10, Safari 5.1, jQuery <1.8 |
1293 |
if ( TestHelpers.draggable.unreliableContains ) { |
1294 |
ok( true, "Opera <12.14 and Safari <6.0 report wrong values for $.contains in jQuery < 1.8" ); |
1295 |
ok( true, "Opera <12.14 and Safari <6.0 report wrong values for $.contains in jQuery < 1.8" ); |
1296 |
} else { |
1297 |
// TODO: fix IE8 testswarm IFRAME positioning bug so closeEnough can be turned back to equal |
1298 |
closeEnough( element.offset().left, newX, 1, "doesn't snap to a removed element" ); |
1299 |
closeEnough( element.offset().top, newY, 1, "doesn't snap to a removed element" ); |
1300 |
} |
1301 |
}); |
1302 |
|
1303 |
test( "#8165: Snapping large rectangles to small rectangles doesn't snap properly", function() { |
1304 |
expect( 1 ); |
1305 |
|
1306 |
var snapTolerance = 20, |
1307 |
y = 1, |
1308 |
element = $( "#draggable1" ) |
1309 |
.css({ |
1310 |
width: "50px", |
1311 |
height: "200px" |
1312 |
}).offset({ |
1313 |
top: y, |
1314 |
left: 1 |
1315 |
}), |
1316 |
element2 = $( "#draggable2" ) |
1317 |
.css({ |
1318 |
width: "50px", |
1319 |
height: "50px" |
1320 |
}).offset({ |
1321 |
top: y + snapTolerance + 1, |
1322 |
left: 200 |
1323 |
}), |
1324 |
newX = element2.offset().left - element.outerWidth() - snapTolerance + 1; |
1325 |
|
1326 |
$( "#draggable1, #draggable2" ).draggable({ |
1327 |
snap: true, |
1328 |
snapTolerance: snapTolerance |
1329 |
}); |
1330 |
|
1331 |
element.simulate( "drag", { |
1332 |
handle: "corner", |
1333 |
x: newX, |
1334 |
moves: 1 |
1335 |
}); |
1336 |
|
1337 |
notDeepEqual( element.offset(), { top: y, left: newX }, "snaps even if only a side (not a corner) is inside the snapTolerance" ); |
1338 |
}); |
1339 |
|
1340 |
test( "stack", function() { |
1341 |
expect( 2 ); |
1342 |
|
1343 |
var element = $( "#draggable1" ).draggable({ |
1344 |
stack: "#draggable1, #draggable2" |
1345 |
}), |
1346 |
element2 = $( "#draggable2" ).draggable({ |
1347 |
stack: "#draggable1, #draggable2" |
1348 |
}); |
1349 |
|
1350 |
TestHelpers.draggable.move( element, 1, 1 ); |
1351 |
equal( element.css( "zIndex" ), "2", "stack increments zIndex correctly" ); |
1352 |
|
1353 |
TestHelpers.draggable.move( element2, 1, 1 ); |
1354 |
equal( element2.css( "zIndex" ), "3", "stack increments zIndex correctly" ); |
1355 |
}); |
1356 |
|
1357 |
test( "{ zIndex: 10 }", function() { |
1358 |
expect( 1 ); |
1359 |
|
1360 |
var actual, |
1361 |
expected = 10, |
1362 |
element = $( "#draggable2" ).draggable({ |
1363 |
zIndex: expected, |
1364 |
start: function() { |
1365 |
actual = $(this).css( "zIndex" ); |
1366 |
} |
1367 |
}); |
1368 |
|
1369 |
element.simulate( "drag", { |
1370 |
dx: -1, |
1371 |
dy: -1 |
1372 |
}); |
1373 |
|
1374 |
equal( actual, expected, "start callback: zIndex is" ); |
1375 |
|
1376 |
}); |
1377 |
|
1378 |
test( "zIndex, default, switching after initialization", function() { |
1379 |
|
1380 |
expect( 3 ); |
1381 |
|
1382 |
var zindex = null, |
1383 |
element = $( "#draggable2" ).draggable({ |
1384 |
start: function() { |
1385 |
zindex = $(this).css( "z-index" ); |
1386 |
} |
1387 |
}); |
1388 |
|
1389 |
element.css( "z-index", 1 ); |
1390 |
|
1391 |
TestHelpers.draggable.move( element, 1, 1 ); |
1392 |
equal( zindex, 1 ); |
1393 |
|
1394 |
element.draggable( "option", "zIndex", 5 ); |
1395 |
TestHelpers.draggable.move( element, 2, 1 ); |
1396 |
equal( zindex, 5 ); |
1397 |
|
1398 |
element.draggable( "option", "zIndex", false ); |
1399 |
TestHelpers.draggable.move( element, 3, 1 ); |
1400 |
equal( zindex, 1 ); |
1401 |
|
1402 |
}); |
1403 |
|
1404 |
})( jQuery ); |