Completed
Push — master ( a61ab1...5a5115 )
by Gabriel
732:32 queued 667:26
created

westOffset first non empty element with an offset ꞌ)   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
c 1
b 0
f 0
nc 1
dl 0
loc 16
rs 9.4285
nop 1
1
'use strict';
2
3
var test = require( 'tape' ),
4
	sinon = require( 'sinon' ),
5
	scrolling = require( '../lib/scrolling' )
6
;
7
8
test( 'calculateElementOffset returns the offset of the element', function ( t ) {
9
	var element = {
10
			css: sinon.stub(),
11
			offset: sinon.stub()
12
		},
13
		headerElements = {
14
			get: sinon.stub()
15
		}
16
	;
17
18
	headerElements.get.returns( [] );
19
20
	element.css.returns( '' );
21
	element.offset.returns( { top: 2000 } );
22
23
	global.$ = sinon.stub();
24
	global.$.returnsArg( 0 ); // pretend to extend the DOM element given to jQuery. We don't but have all methods stubbed
25
26
	t.equal( scrolling.calculateElementOffset( element, headerElements ), 2000 );
27
28
	delete global.$;
29
30
	t.end();
31
} );
32
33
34
test( 'calculateElementOffset subtracts the height of visible header elements', function ( t ) {
35
	var createElement = function () {
36
			return {
37
				is: sinon.stub(),
38
				height: sinon.stub()
39
			}
40
		},
41
		firstHeaderElement = createElement(),
42
		secondHeaderElement = createElement(),
43
		thirdHeaderElement = createElement(),
44
		element = {
45
			css: sinon.stub(),
46
			offset: sinon.stub()
47
		},
48
		headerElements = {
49
			get: sinon.stub()
50
		}
51
	;
52
53
	firstHeaderElement.height.returns( 50 );
54
	firstHeaderElement.is.withArgs( ':visible' ).returns( true );
55
	secondHeaderElement.height.returns( 20 );
56
	secondHeaderElement.is.withArgs( ':visible' ).returns( false );
57
	thirdHeaderElement.height.returns( 30 );
58
	thirdHeaderElement.is.withArgs( ':visible' ).returns( true );
59
	headerElements.get.returns( [ firstHeaderElement, secondHeaderElement, thirdHeaderElement ] );
60
61
	element.css.returns( '' );
62
	element.offset.returns( { top: 2000 } );
63
64
	global.$ = sinon.stub();
65
	global.$.returnsArg( 0 ); // pretend to extend the DOM element given to jQuery. We don't but have all methods stubbed
66
67
	t.equal( scrolling.calculateElementOffset( element, headerElements ), 1920	);
68
69
	delete global.$;
70
71
	t.end();
72
} );
73
74
test( 'calculateElementOffset can add the padding of the element to the offset', function ( t ) {
75
	var element = {
76
			css: sinon.stub(),
77
			offset: sinon.stub()
78
		},
79
		headerElements = {
80
			get: sinon.stub()
81
		}
82
	;
83
84
	headerElements.get.returns( [] );
85
86
	element.css.withArgs( 'padding-top' ).returns( '1px' );
87
	element.offset.returns( { top: 2000 } );
88
89
90
	global.$ = sinon.stub();
91
	global.$.returnsArg( 0 ); // pretend to extend the DOM element given to jQuery. We don't but have all methods stubbed
92
93
	t.equal( scrolling.calculateElementOffset( element, headerElements, { elementStart: scrolling.ElementStart.PADDDING } ), 2001 );
94
	t.equal( scrolling.calculateElementOffset( element, headerElements, { elementStart: scrolling.ElementStart.ELEMENT } ), 2000 );
95
96
	delete global.$;
97
98
	t.end();
99
} );
100
101
test( 'calculateElementOffset ignores element padding not given in pixels', function ( t ) {
102
	var element = {
103
			css: sinon.stub(),
104
			offset: sinon.stub()
105
		},
106
		headerElements = {
107
			get: sinon.stub()
108
		}
109
	;
110
111
	headerElements.get.returns( [] );
112
113
	element.css.withArgs( 'padding-top' ).returns( '1em' );
114
	element.offset.returns( { top: 2000 } );
115
116
117
	global.$ = sinon.stub();
118
	global.$.returnsArg( 0 ); // pretend to extend the DOM element given to jQuery. We don't but have all methods stubbed
119
120
	t.equal( scrolling.calculateElementOffset( element, headerElements, { elementStart: scrolling.ElementStart.PADDDING } ), 2000 );
121
122
	delete global.$;
123
124
	t.end();
125
} );
126
127
test( 'calculateElementOffset can subtract the margin of the element from the offset', function ( t ) {
128
	var element = {
129
			css: sinon.stub(),
130
			offset: sinon.stub()
131
		},
132
		headerElements = {
133
			get: sinon.stub()
134
		}
135
	;
136
137
	headerElements.get.returns( [] );
138
139
	element.css.withArgs( 'margin-top' ).returns( '1px' );
140
	element.offset.returns( { top: 2000 } );
141
142
143
	global.$ = sinon.stub();
144
	global.$.returnsArg( 0 ); // pretend to extend the DOM element given to jQuery. We don't but have all methods stubbed
145
146
	t.equal( scrolling.calculateElementOffset( element, headerElements, { elementStart: scrolling.ElementStart.MARGIN } ), 1999 );
147
	t.equal( scrolling.calculateElementOffset( element, headerElements, { elementStart: scrolling.ElementStart.ELEMENT } ), 2000 );
148
149
	delete global.$;
150
151
	t.end();
152
} );
153
154
test( 'calculateElementOffset ignores element margin not given in pixels', function ( t ) {
155
	var element = {
156
			css: sinon.stub(),
157
			offset: sinon.stub()
158
		},
159
		headerElements = {
160
			get: sinon.stub()
161
		}
162
	;
163
164
	headerElements.get.returns( [] );
165
166
	element.css.withArgs( 'margin-top' ).returns( '1em' );
167
	element.offset.returns( { top: 2000 } );
168
169
170
	global.$ = sinon.stub();
171
	global.$.returnsArg( 0 ); // pretend to extend the DOM element given to jQuery. We don't but have all methods stubbed
172
173
	t.equal( scrolling.calculateElementOffset( element, headerElements, { elementStart: scrolling.ElementStart.MARGIN } ), 2000 );
174
175
	delete global.$;
176
177
	t.end();
178
} );
179
180
181
test( 'findElementWithLowestOffset returns no elements if no elements are given', function ( t ) {
182
183
	t.equal( scrolling.findElementWithLowestOffset( [] ), null );
184
185
	t.end();
186
} );
187
188
test( 'findElementWithLowestOffset returns no elements if jquery objects conation no DOM nodes ', function ( t ) {
189
190
	var firstElement = {
191
			length: 0
192
		},
193
		secondElement = {
194
			length: 0
195
		};
196
197
	t.equal( scrolling.findElementWithLowestOffset( [ firstElement, secondElement ] ), null );
198
199
	t.end();
200
} );
201
202
test( 'findElementWithLowestOffset first non empty element with an offset ', function ( t ) {
203
204
	var firstElement = {
205
			length: 0
206
		},
207
		secondElement = {
208
			length: 1,
209
			offset: sinon.stub()
210
		};
211
212
	secondElement.offset.returns( { top: 400 } );
213
214
	t.equal( scrolling.findElementWithLowestOffset( [ firstElement, secondElement ] ), secondElement );
215
216
	t.end();
217
} );
218
219
test( 'findElementWithLowestOffset will return the element with the lowest offset ', function ( t ) {
220
221
	var firstElement = {
222
			length: 1,
223
			offset: sinon.stub()
224
		},
225
		secondElement = {
226
			length: 1,
227
			offset: sinon.stub()
228
		};
229
230
	firstElement.offset.returns( { top: 400 } );
231
	secondElement.offset.returns( { top: 200 } );
232
233
	t.equal( scrolling.findElementWithLowestOffset( [ firstElement, secondElement ] ), secondElement );
234
	t.equal( scrolling.findElementWithLowestOffset( [ secondElement, firstElement ] ), secondElement );
235
236
	t.end();
237
} );
238
239
240