Skip to content

Commit dbbf3a9

Browse files
committed
Draggable Tests: Ensure Draggable tests are correctly testing offset under scroll conditions.
1 parent df2c982 commit dbbf3a9

File tree

3 files changed

+108
-116
lines changed

3 files changed

+108
-116
lines changed

tests/unit/draggable/draggable.html

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,38 @@
88
<link rel="stylesheet" href="../../../external/qunit.css">
99

1010
<style>
11+
#main {
12+
width: 1000px;
13+
height: 1000px;
14+
overflow: scroll;
15+
overflow-x: scroll;
16+
overflow-y: scroll;
17+
position: relative;
18+
left: 0;
19+
top: 0;
20+
}
21+
#main-forceScrollable {
22+
width: 1100px;
23+
height: 1100px;
24+
}
25+
#scrollParent {
26+
width: 1200px;
27+
height: 1200px;
28+
position: relative;
29+
left: 0;
30+
top: 0;
31+
overflow: hidden;
32+
overflow-x: hidden;
33+
overflow-y: hidden;
34+
}
35+
#scrollParent-forceScrollable {
36+
width: 1300px;
37+
height: 1300px;
38+
}
1139
/* See #9077 */
12-
#draggable3, #draggable4 { z-index: 100; }
40+
#draggable3, #draggable4 {
41+
z-index: 100;
42+
}
1343
</style>
1444

1545
<script src="../../../external/qunit.js"></script>
@@ -46,10 +76,14 @@ <h2 id="qunit-banner"></h2>
4676
<h2 id="qunit-userAgent"></h2>
4777
<ol id="qunit-tests"></ol>
4878
<div id="qunit-fixture">
49-
<div id="main">
50-
<div id="draggable1" style="background: green; width: 200px; height: 100px;">Relative</div>
51-
<div id="draggable2" style="background: green; width: 200px; height: 100px; position: absolute; top: 10px; left: 10px;"><span><em>Absolute</em></span></div>
52-
<div id="droppable" style="background: green; width: 200px; height: 100px; position: absolute; top: 110px; left: 110px;"><span>Absolute</span></div>
79+
<div id="scrollParent">
80+
<div id="main">
81+
<div id="draggable1" style="background: green; width: 200px; height: 100px;">Relative</div>
82+
<div id="draggable2" style="background: green; width: 200px; height: 100px; position: absolute; top: 10px; left: 10px;"><span><em>Absolute</em></span></div>
83+
<div id="droppable" style="background: green; width: 200px; height: 100px; position: absolute; top: 110px; left: 110px;"><span>Absolute</span></div>
84+
<div id="main-forceScrollable"></div>
85+
</div>
86+
<div id="scrollParent-forceScrollable"></div>
5387
</div>
5488
<div style="width: 1px; height: 1000px;"></div>
5589
<div style="position: absolute; width: 1px; height: 2000px;"></div>

tests/unit/draggable/draggable_options.js

Lines changed: 62 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ test( "axis, default, switching after initialization", function() {
158158
test( "{ cancel: 'input,textarea,button,select,option' }, default", function() {
159159
expect( 2 );
160160

161-
$( "<div id='draggable-option-cancel-default'><input type='text'></div>" ).appendTo( "#main" );
161+
$( "<div id='draggable-option-cancel-default'><input type='text'></div>" ).appendTo( "#qunit-fixture" );
162162

163163
var element = $( "#draggable-option-cancel-default" ).draggable({ cancel: "input,textarea,button,select,option" });
164164
TestHelpers.draggable.shouldMove( element, "cancel: default, element dragged" );
@@ -230,7 +230,7 @@ test( "{ cancel: Selectors }, matching parent selector", function() {
230230
test( "cancelement, default, switching after initialization", function() {
231231
expect( 2 );
232232

233-
$( "<div id='draggable-option-cancel-default'><input type='text'></div>" ).appendTo( "#main" );
233+
$( "<div id='draggable-option-cancel-default'><input type='text'></div>" ).appendTo( "#qunit-fixture" );
234234

235235
var input = $( "#draggable-option-cancel-default input" ),
236236
element = $( "#draggable-option-cancel-default" ).draggable();
@@ -346,7 +346,7 @@ test( "{ containment: 'parent' }, absolute", function() {
346346
test( "containment, account for border", function() {
347347
expect( 2 );
348348

349-
var el = $("#draggable1").appendTo("#main"),
349+
var el = $( "#draggable1" ).appendTo( "#scrollParent" ),
350350
parent = el.parent().css({
351351
height: "100px",
352352
width: "100px",
@@ -368,9 +368,9 @@ test( "containment, account for border", function() {
368368
dy: 100
369369
});
370370

371-
equal( el.offset().top, parentBottom - parentBorderBottom - el.height(),
371+
closeEnough( el.offset().top, parentBottom - parentBorderBottom - el.height(), 1,
372372
"The draggable should be on top of its parent's bottom border" );
373-
equal( el.offset().left, parentRight - parentBorderRight - el.width(),
373+
closeEnough( el.offset().left, parentRight - parentBorderRight - el.width(), 1,
374374
"The draggable should be to the right of its parent's right border" );
375375
});
376376

@@ -381,13 +381,7 @@ test( "containment, default, switching after initialization", function() {
381381

382382
TestHelpers.draggable.testDrag( element, element, -100, -100, -100, -100, "containment: default" );
383383

384-
element.draggable( "option", "containment", "parent" )
385-
.css({
386-
top: 0,
387-
left: 0
388-
})
389-
.appendTo( $( "#main" ) );
390-
384+
element.draggable( "option", "containment", "parent" ).css({ top: 0, left: 0 });
391385
TestHelpers.draggable.testDrag( element, element, -100, -100, 0, 0, "containment: parent as option" );
392386

393387
element.draggable( "option", "containment", false );
@@ -666,7 +660,7 @@ test( "helper, default, switching after initialization", function() {
666660
TestHelpers.draggable.shouldMove( element, "helper: default" );
667661

668662
element.draggable( "option", "helper", "clone" );
669-
TestHelpers.draggable.shouldMovePositionButNotOffset( element, "helper: clone" );
663+
TestHelpers.draggable.shouldMove( element, "helper: clone" );
670664

671665
element.draggable( "option", "helper", "original" );
672666
TestHelpers.draggable.shouldMove( element, "helper: original" );
@@ -676,14 +670,14 @@ test( "{ helper: 'clone' }, relative", function() {
676670
expect( 2 );
677671

678672
var element = $( "#draggable1" ).draggable({ helper: "clone" });
679-
TestHelpers.draggable.shouldMovePositionButNotOffset( element, "helper: clone relative" );
673+
TestHelpers.draggable.shouldMove( element, "helper: clone relative" );
680674
});
681675

682676
test( "{ helper: 'clone' }, absolute", function() {
683677
expect( 2 );
684678

685679
var element = $( "#draggable2" ).draggable({ helper: "clone" });
686-
TestHelpers.draggable.shouldMovePositionButNotOffset( element, "helper: clone absolute" );
680+
TestHelpers.draggable.shouldMove( element, "helper: clone absolute" );
687681
});
688682

689683
test( "{ helper: 'original' }, relative, with scroll offset on parent", function() {
@@ -758,6 +752,26 @@ test( "{ helper: 'original' }, absolute, with scroll offset on parent", function
758752
TestHelpers.draggable.restoreScroll( "#main" );
759753
});
760754

755+
test( "{ helper: 'original' }, absolute, with scroll offset on grandparent", function() {
756+
expect( 6 );
757+
758+
var element = $( "#draggable1" ).css({ position: "absolute", top: 0, left: 0 }).draggable({ helper: "original" });
759+
760+
TestHelpers.draggable.setScrollable( "#main", false );
761+
TestHelpers.draggable.setScrollable( "#scrollParent", true );
762+
763+
TestHelpers.draggable.setScroll( "#scrollParent" );
764+
TestHelpers.draggable.testScroll( element, "relative" );
765+
766+
TestHelpers.draggable.setScroll( "#scrollParent" );
767+
TestHelpers.draggable.testScroll( element, "static" );
768+
769+
TestHelpers.draggable.setScroll( "#scrollParent" );
770+
TestHelpers.draggable.testScroll( element, "absolute" );
771+
772+
TestHelpers.draggable.restoreScroll( "#scrollParent" );
773+
});
774+
761775
test( "{ helper: 'original' }, absolute, with scroll offset on root", function() {
762776
expect( 6 );
763777

@@ -871,123 +885,61 @@ test( "{ helper: 'clone' }, absolute", function() {
871885
});
872886

873887
test( "{ helper: 'clone' }, absolute with scroll offset on parent", function() {
874-
expect( 3 );
888+
expect( 6 );
875889

876-
TestHelpers.draggable.setScroll( "#main" );
877-
var helperOffset = null,
878-
origOffset = null,
879-
element = $( "#draggable1" ).draggable({
880-
helper: "clone",
881-
drag: function( event, ui) {
882-
helperOffset = ui.helper.offset();
883-
}
890+
var element = $( "#draggable1" ).draggable({
891+
helper: "clone"
884892
});
885893

886-
$( "#main" ).css( "position", "relative" );
887-
origOffset = $( "#draggable1" ).offset();
888-
element.simulate( "drag", {
889-
dx: 1,
890-
dy: 1
891-
});
892-
deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" );
894+
TestHelpers.draggable.setScroll( "#main" );
895+
TestHelpers.draggable.testScroll( element, "relative" );
893896

894-
$( "#main" ).css( "position", "static" );
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]" );
897+
TestHelpers.draggable.setScroll( "#main" );
898+
TestHelpers.draggable.testScroll( element, "static" );
901899

902-
$( "#main" ).css( "position", "absolute" );
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]" );
900+
TestHelpers.draggable.setScroll( "#main" );
901+
TestHelpers.draggable.testScroll( element, "absolute" );
909902

910903
TestHelpers.draggable.restoreScroll( "#main" );
911904
});
912905

913906
test( "{ helper: 'clone' }, absolute with scroll offset on root", function() {
914-
expect( 3 );
907+
expect( 6 );
915908

916-
TestHelpers.draggable.setScroll( document );
917-
var helperOffset = null,
918-
origOffset = null,
919-
element = $( "#draggable1" ).draggable({
920-
helper: "clone",
921-
drag: function( event, ui) {
922-
helperOffset = ui.helper.offset();
923-
}
909+
var element = $( "#draggable1" ).draggable({
910+
helper: "clone"
924911
});
925912

926-
$( "#main" ).css( "position", "relative" );
927-
origOffset = $( "#draggable1" ).offset();
928-
element.simulate( "drag", {
929-
dx: 1,
930-
dy: 1
931-
});
932-
deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" );
913+
TestHelpers.draggable.setScroll( document );
914+
TestHelpers.draggable.testScroll( element, "relative" );
933915

934-
$( "#main" ).css( "position", "static" );
935-
origOffset = $( "#draggable1" ).offset();
936-
element.simulate( "drag", {
937-
dx: 1,
938-
dy: 1
939-
});
940-
deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" );
916+
TestHelpers.draggable.setScroll( document );
917+
TestHelpers.draggable.testScroll( element, "static" );
941918

942-
$( "#main" ).css( "position", "absolute" );
943-
origOffset = $( "#draggable1" ).offset();
944-
element.simulate( "drag", {
945-
dx: 1,
946-
dy: 1
947-
});
948-
deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" );
919+
TestHelpers.draggable.setScroll( document );
920+
TestHelpers.draggable.testScroll( element, "absolute" );
949921

950922
TestHelpers.draggable.restoreScroll( document );
951923
});
952924

953925
test( "{ helper: 'clone' }, absolute with scroll offset on root and parent", function() {
954-
expect( 3 );
955-
956-
TestHelpers.draggable.setScroll( document );
957-
TestHelpers.draggable.setScroll( "#main" );
926+
expect( 6 );
958927

959-
var helperOffset = null,
960-
origOffset = null,
961-
element = $( "#draggable1" ).draggable({
962-
helper: "clone",
963-
drag: function( event, ui) {
964-
helperOffset = ui.helper.offset();
965-
}
928+
var element = $( "#draggable1" ).draggable({
929+
helper: "clone"
966930
});
967931

968-
$( "#main" ).css( "position", "relative" );
969-
origOffset = $( "#draggable1" ).offset();
970-
element.simulate( "drag", {
971-
dx: 1,
972-
dy: 1
973-
});
974-
deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" );
932+
TestHelpers.draggable.setScroll( document );
933+
TestHelpers.draggable.setScroll( "#main" );
934+
TestHelpers.draggable.testScroll( element, "relative" );
975935

976-
$( "#main" ).css( "position", "static" );
977-
origOffset = $( "#draggable1" ).offset();
978-
element.simulate( "drag", {
979-
dx: 1,
980-
dy: 1
981-
});
982-
deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" );
936+
TestHelpers.draggable.setScroll( document );
937+
TestHelpers.draggable.setScroll( "#main" );
938+
TestHelpers.draggable.testScroll( element, "static" );
983939

984-
$( "#main" ).css( "position", "absolute" );
985-
origOffset = $( "#draggable1" ).offset();
986-
element.simulate( "drag", {
987-
dx: 1,
988-
dy: 1
989-
});
990-
deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" );
940+
TestHelpers.draggable.setScroll( document );
941+
TestHelpers.draggable.setScroll( "#main" );
942+
TestHelpers.draggable.testScroll( element, "absolute" );
991943

992944
TestHelpers.draggable.restoreScroll( document );
993945
TestHelpers.draggable.restoreScroll( "#main" );
@@ -1098,8 +1050,10 @@ test( "scope", function() {
10981050
test( "scroll, scrollSensitivity, and scrollSpeed", function() {
10991051
expect( 2 );
11001052

1053+
TestHelpers.draggable.setScrollable( "#main", false );
1054+
11011055
var viewportHeight = $( window ).height(),
1102-
element = $( "#draggable1" ).draggable({ scroll: true }),
1056+
element = $( "#draggable1" ).draggable({ scroll: true }).appendTo( "#qunit-fixture" ),
11031057
scrollSensitivity = element.draggable( "option", "scrollSensitivity" ),
11041058
scrollSpeed = element.draggable( "option", "scrollSpeed" );
11051059

tests/unit/draggable/draggable_test_helpers.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ TestHelpers.draggable = {
2020
var offsetBefore = el.offset(),
2121
offsetExpected = { left: offsetBefore.left + expectedDX, top: offsetBefore.top + expectedDY };
2222

23-
$( el ).one( "dragstop", function() {
24-
deepEqual( el.offset(), offsetExpected, "offset dragged[" + dx + ", " + dy + "] " + msg );
23+
$( el ).one( "dragstop", function( event, ui ) {
24+
deepEqual( ui.helper.offset(), offsetExpected, "offset dragged[" + dx + ", " + dy + "] " + msg );
2525
} );
2626
},
2727
testDrag: function( el, handle, dx, dy, expectedDX, expectedDY, msg ) {
@@ -68,9 +68,13 @@ TestHelpers.draggable = {
6868
});
6969
$( el ).unbind( "dragstop" );
7070
},
71+
setScrollable: function ( what, isScrollable ) {
72+
var overflow = isScrollable ? "scroll" : "hidden";
73+
$( what ).css({ overflow: overflow, overflowX: overflow, overflowY: overflow });
74+
},
7175
testScroll: function( el, position ) {
7276
var oldPosition = $( "#main" ).css( "position" );
73-
$( "#main" ).css( "position", position);
77+
$( "#main" ).css({ position: position, top: "0px", left: "0px" });
7478
TestHelpers.draggable.shouldMove( el, position + " parent" );
7579
$( "#main" ).css( "position", oldPosition );
7680
},

0 commit comments

Comments
 (0)