tooltip.js 46.7 KB
Newer Older
Jacob Thornton's avatar
Jacob Thornton committed
1
$(function () {
XhmikosR's avatar
XhmikosR committed
2
  'use strict';
Jacob Thornton's avatar
Jacob Thornton committed
3

4
  QUnit.module('tooltip plugin')
XhmikosR's avatar
XhmikosR committed
5

6
  QUnit.test('should be defined on jquery object', function (assert) {
7
    assert.expect(1)
8
    assert.ok($(document.body).tooltip, 'tooltip method is defined')
XhmikosR's avatar
XhmikosR committed
9
10
  })

11
  QUnit.module('tooltip', {
12
    beforeEach: function () {
13
14
15
      // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
      $.fn.bootstrapTooltip = $.fn.tooltip.noConflict()
    },
16
    afterEach: function () {
17
18
19
20
21
      $.fn.tooltip = $.fn.bootstrapTooltip
      delete $.fn.bootstrapTooltip
    }
  })

22
  QUnit.test('should provide no conflict', function (assert) {
23
    assert.expect(1)
24
    assert.strictEqual($.fn.tooltip, undefined, 'tooltip was set back to undefined (org value)')
25
26
  })

27
  QUnit.test('should return jquery collection containing the element', function (assert) {
28
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
29
30
    var $el = $('<div/>')
    var $tooltip = $el.bootstrapTooltip()
31
32
    assert.ok($tooltip instanceof $, 'returns jquery collection')
    assert.strictEqual($tooltip[0], $el[0], 'collection contains element')
XhmikosR's avatar
XhmikosR committed
33
34
  })

35
  QUnit.test('should expose default settings', function (assert) {
36
    assert.expect(1)
37
    assert.ok($.fn.bootstrapTooltip.Constructor.DEFAULTS, 'defaults is defined')
XhmikosR's avatar
XhmikosR committed
38
39
  })

40
  QUnit.test('should empty title attribute', function (assert) {
41
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
42
    var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>').bootstrapTooltip()
43
    assert.strictEqual($trigger.attr('title'), '', 'title attribute was emptied')
XhmikosR's avatar
XhmikosR committed
44
45
  })

46
  QUnit.test('should add data attribute for referencing original title', function (assert) {
47
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
48
    var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>').bootstrapTooltip()
49
    assert.strictEqual($trigger.attr('data-original-title'), 'Another tooltip', 'original title preserved in data attribute')
XhmikosR's avatar
XhmikosR committed
50
51
  })

52
  QUnit.test('should add aria-describedby to the trigger on show', function (assert) {
53
    assert.expect(3)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
54
55
    var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
      .bootstrapTooltip()
56
57
      .appendTo('#qunit-fixture')
      .bootstrapTooltip('show')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
58

59
60
    var id = $('.tooltip').attr('id')

61
62
63
    assert.strictEqual($('#' + id).length, 1, 'has a unique id')
    assert.strictEqual($('.tooltip').attr('aria-describedby'), $trigger.attr('id'), 'tooltip id and aria-describedby on trigger match')
    assert.ok($trigger[0].hasAttribute('aria-describedby'), 'trigger has aria-describedby')
64
65
  })

66
  QUnit.test('should remove aria-describedby from trigger on hide', function (assert) {
67
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
68
69
    var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
      .bootstrapTooltip()
70
      .appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
71
72

    $trigger.bootstrapTooltip('show')
73
    assert.ok($trigger[0].hasAttribute('aria-describedby'), 'trigger has aria-describedby')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
74
75

    $trigger.bootstrapTooltip('hide')
76
    assert.ok(!$trigger[0].hasAttribute('aria-describedby'), 'trigger does not have aria-describedby')
77
78
  })

79
  QUnit.test('should assign a unique id tooltip element', function (assert) {
80
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
81
    $('<a href="#" rel="tooltip" title="Another tooltip"/>')
82
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
83
      .bootstrapTooltip('show')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
84

XhmikosR's avatar
XhmikosR committed
85
    var id = $('.tooltip').attr('id')
86

87
88
    assert.strictEqual($('#' + id).length, 1, 'tooltip has unique id')
    assert.strictEqual(id.indexOf('tooltip'), 0, 'tooltip id has prefix')
89
90
  })

91
  QUnit.test('should place tooltips relative to placement option', function (assert) {
92
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
93
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
XhmikosR's avatar
XhmikosR committed
94
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
95
      .bootstrapTooltip({ placement: 'bottom' })
XhmikosR's avatar
XhmikosR committed
96

Heinrich Fenkart's avatar
Heinrich Fenkart committed
97
    $tooltip.bootstrapTooltip('show')
98
    assert.ok($('.tooltip').is('.fade.bottom.in'), 'has correct classes applied')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
99
100

    $tooltip.bootstrapTooltip('hide')
101
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed')
XhmikosR's avatar
XhmikosR committed
102
103
  })

104
  QUnit.test('should allow html entities', function (assert) {
105
    assert.expect(2)
106
    var $tooltip = $('<a href="#" rel="tooltip" title="&lt;b&gt;@fat&lt;/b&gt;"/>')
XhmikosR's avatar
XhmikosR committed
107
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
108
      .bootstrapTooltip({ html: true })
XhmikosR's avatar
XhmikosR committed
109

Heinrich Fenkart's avatar
Heinrich Fenkart committed
110
    $tooltip.bootstrapTooltip('show')
111
    assert.notEqual($('.tooltip b').length, 0, 'b tag was inserted')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
112
113

    $tooltip.bootstrapTooltip('hide')
114
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed')
XhmikosR's avatar
XhmikosR committed
115
116
  })

117
  QUnit.test('should respect custom classes', function (assert) {
118
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
119
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
XhmikosR's avatar
XhmikosR committed
120
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
121
      .bootstrapTooltip({ template: '<div class="tooltip some-class"><div class="tooltip-arrow"/><div class="tooltip-inner"/></div>' })
XhmikosR's avatar
XhmikosR committed
122

Heinrich Fenkart's avatar
Heinrich Fenkart committed
123
    $tooltip.bootstrapTooltip('show')
124
    assert.ok($('.tooltip').hasClass('some-class'), 'custom class is present')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
125
126

    $tooltip.bootstrapTooltip('hide')
127
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed')
XhmikosR's avatar
XhmikosR committed
128
129
  })

130
  QUnit.test('should fire show event', function (assert) {
131
    assert.expect(1)
132
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
133
134

    $('<div title="tooltip title"/>')
XhmikosR's avatar
XhmikosR committed
135
      .on('show.bs.tooltip', function () {
136
        assert.ok(true, 'show event fired')
137
        done()
XhmikosR's avatar
XhmikosR committed
138
      })
139
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
140
141
  })

Johann-S's avatar
Johann-S committed
142
143
144
145
146
147
148
149
150
151
152
153
154
155
  QUnit.test('should fire inserted event', function (assert) {
    assert.expect(2)
    var done = assert.async()

    $('<div title="tooltip title"/>')
      .appendTo('#qunit-fixture')
      .on('inserted.bs.tooltip', function () {
        assert.notEqual($('.tooltip').length, 0, 'tooltip was inserted')
        assert.ok(true, 'inserted event fired')
        done()
      })
      .bootstrapTooltip('show')
  })

156
  QUnit.test('should fire shown event', function (assert) {
157
    assert.expect(1)
158
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
159
160
161

    $('<div title="tooltip title"></div>')
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
162
      .on('shown.bs.tooltip', function () {
163
        assert.ok(true, 'shown was called')
164
        done()
XhmikosR's avatar
XhmikosR committed
165
      })
166
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
167
168
  })

169
  QUnit.test('should not fire shown event when show was prevented', function (assert) {
170
    assert.expect(1)
171
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
172
173

    $('<div title="tooltip title"/>')
XhmikosR's avatar
XhmikosR committed
174
175
      .on('show.bs.tooltip', function (e) {
        e.preventDefault()
176
        assert.ok(true, 'show event fired')
177
        done()
XhmikosR's avatar
XhmikosR committed
178
179
      })
      .on('shown.bs.tooltip', function () {
180
        assert.ok(false, 'shown event fired')
XhmikosR's avatar
XhmikosR committed
181
      })
182
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
183
184
  })

185
  QUnit.test('should fire hide event', function (assert) {
186
    assert.expect(1)
187
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
188
189
190

    $('<div title="tooltip title"/>')
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
191
      .on('shown.bs.tooltip', function () {
192
        $(this).bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
193
194
      })
      .on('hide.bs.tooltip', function () {
195
        assert.ok(true, 'hide event fired')
196
        done()
XhmikosR's avatar
XhmikosR committed
197
      })
198
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
199
200
  })

201
  QUnit.test('should fire hidden event', function (assert) {
202
    assert.expect(1)
203
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
204
205
206

    $('<div title="tooltip title"/>')
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
207
      .on('shown.bs.tooltip', function () {
208
        $(this).bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
209
210
      })
      .on('hidden.bs.tooltip', function () {
211
        assert.ok(true, 'hidden event fired')
212
        done()
XhmikosR's avatar
XhmikosR committed
213
      })
214
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
215
216
  })

217
  QUnit.test('should not fire hidden event when hide was prevented', function (assert) {
218
    assert.expect(1)
219
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
220
221
222

    $('<div title="tooltip title"/>')
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
223
      .on('shown.bs.tooltip', function () {
224
        $(this).bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
225
226
227
      })
      .on('hide.bs.tooltip', function (e) {
        e.preventDefault()
228
        assert.ok(true, 'hide event fired')
229
        done()
XhmikosR's avatar
XhmikosR committed
230
231
      })
      .on('hidden.bs.tooltip', function () {
232
        assert.ok(false, 'hidden event fired')
XhmikosR's avatar
XhmikosR committed
233
      })
234
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
235
236
  })

237
  QUnit.test('should destroy tooltip', function (assert) {
238
    assert.expect(7)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
239
240
241
242
    var $tooltip = $('<div/>')
      .bootstrapTooltip()
      .on('click.foo', function () {})

243
244
    assert.ok($tooltip.data('bs.tooltip'), 'tooltip has data')
    assert.ok($._data($tooltip[0], 'events').mouseover && $._data($tooltip[0], 'events').mouseout, 'tooltip has hover events')
245
    assert.strictEqual($._data($tooltip[0], 'events').click[0].namespace, 'foo', 'tooltip has extra click.foo event')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
246
247
248
249

    $tooltip.bootstrapTooltip('show')
    $tooltip.bootstrapTooltip('destroy')

250
251
    assert.ok(!$tooltip.hasClass('in'), 'tooltip is hidden')
    assert.ok(!$._data($tooltip[0], 'bs.tooltip'), 'tooltip does not have data')
252
    assert.strictEqual($._data($tooltip[0], 'events').click[0].namespace, 'foo', 'tooltip still has click.foo')
253
    assert.ok(!$._data($tooltip[0], 'events').mouseover && !$._data($tooltip[0], 'events').mouseout, 'tooltip does not have hover events')
XhmikosR's avatar
XhmikosR committed
254
255
  })

256
  QUnit.test('should show tooltip with delegate selector on click', function (assert) {
257
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
258
259
260
261
262
263
264
    var $div = $('<div><a href="#" rel="tooltip" title="Another tooltip"/></div>')
      .appendTo('#qunit-fixture')
      .bootstrapTooltip({
        selector: 'a[rel="tooltip"]',
        trigger: 'click'
      })

265
    $div.find('a').trigger('click')
266
    assert.ok($('.tooltip').is('.fade.in'), 'tooltip is faded in')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
267

268
    $div.find('a').trigger('click')
269
    assert.strictEqual($('.tooltip').length, 0, 'tooltip was removed from dom')
XhmikosR's avatar
XhmikosR committed
270
271
  })

272
  QUnit.test('should show tooltip when toggle is called', function (assert) {
273
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
274
    $('<a href="#" rel="tooltip" title="tooltip on toggle"/>')
XhmikosR's avatar
XhmikosR committed
275
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
276
      .bootstrapTooltip({ trigger: 'manual' })
277
      .bootstrapTooltip('toggle')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
278

279
    assert.ok($('.tooltip').is('.fade.in'), 'tooltip is faded in')
XhmikosR's avatar
XhmikosR committed
280
281
  })

282
  QUnit.test('should hide previously shown tooltip when toggle is called on tooltip', function (assert) {
283
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
284
    $('<a href="#" rel="tooltip" title="tooltip on toggle">@ResentedHook</a>')
285
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
286
      .bootstrapTooltip({ trigger: 'manual' })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
287
288
289
      .bootstrapTooltip('show')

    $('.tooltip').bootstrapTooltip('toggle')
290
    assert.ok($('.tooltip').not('.fade.in'), 'tooltip was faded out')
291
292
  })

293
  QUnit.test('should place tooltips inside body when container is body', function (assert) {
294
    assert.expect(3)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
295
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
XhmikosR's avatar
XhmikosR committed
296
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
297
      .bootstrapTooltip({ container: 'body' })
298
      .bootstrapTooltip('show')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
299

300
    assert.notEqual($('body > .tooltip').length, 0, 'tooltip is direct descendant of body')
301
    assert.strictEqual($('#qunit-fixture > .tooltip').length, 0, 'tooltip is not in parent')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
302
303

    $tooltip.bootstrapTooltip('hide')
304
    assert.strictEqual($('body > .tooltip').length, 0, 'tooltip was removed from dom')
XhmikosR's avatar
XhmikosR committed
305
306
  })

307
  QUnit.test('should add position class before positioning so that position-specific styles are taken into account', function (assert) {
308
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
309
310
311
312
    var styles = '<style>'
        + '.tooltip.right { white-space: nowrap; }'
        + '.tooltip.right .tooltip-inner { max-width: none; }'
        + '</style>'
313
    var $styles = $(styles).appendTo('head')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
314

fat's avatar
fat committed
315
    var $container = $('<div/>').appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
316
317
318
319
320
321
322
323
    var $target = $('<a href="#" rel="tooltip" title="very very very very very very very very long tooltip in one line"/>')
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'right',
        viewport: null
      })
      .bootstrapTooltip('show')
    var $tooltip = $container.find('.tooltip')
XhmikosR's avatar
XhmikosR committed
324
325

    // this is some dumb hack shit because sub pixels in firefox
Heinrich Fenkart's avatar
Heinrich Fenkart committed
326
327
    var top = Math.round($target.offset().top + ($target[0].offsetHeight / 2) - ($tooltip[0].offsetHeight / 2))
    var top2 = Math.round($tooltip.offset().top)
XhmikosR's avatar
XhmikosR committed
328
    var topDiff = top - top2
329
    assert.ok(topDiff <= 1 && topDiff >= -1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
330
331
332
333
    $target.bootstrapTooltip('hide')

    $container.remove()
    $styles.remove()
XhmikosR's avatar
XhmikosR committed
334
335
  })

336
  QUnit.test('should use title attribute for tooltip text', function (assert) {
337
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
338
    var $tooltip = $('<a href="#" rel="tooltip" title="Simple tooltip"/>')
XhmikosR's avatar
XhmikosR committed
339
      .appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
340
341
342
      .bootstrapTooltip()

    $tooltip.bootstrapTooltip('show')
343
    assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title from title attribute is set')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
344
345

    $tooltip.bootstrapTooltip('hide')
346
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
XhmikosR's avatar
XhmikosR committed
347
348
  })

349
  QUnit.test('should prefer title attribute over title option', function (assert) {
350
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
351
    var $tooltip = $('<a href="#" rel="tooltip" title="Simple tooltip"/>')
XhmikosR's avatar
XhmikosR committed
352
      .appendTo('#qunit-fixture')
353
      .bootstrapTooltip({
XhmikosR's avatar
XhmikosR committed
354
355
        title: 'This is a tooltip with some content'
      })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
356
357

    $tooltip.bootstrapTooltip('show')
358
    assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title is set from title attribute while preferred over title option')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
359
360

    $tooltip.bootstrapTooltip('hide')
361
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
XhmikosR's avatar
XhmikosR committed
362
363
  })

364
  QUnit.test('should use title option', function (assert) {
365
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
366
    var $tooltip = $('<a href="#" rel="tooltip"/>')
XhmikosR's avatar
XhmikosR committed
367
      .appendTo('#qunit-fixture')
368
      .bootstrapTooltip({
XhmikosR's avatar
XhmikosR committed
369
370
        title: 'This is a tooltip with some content'
      })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
371
372

    $tooltip.bootstrapTooltip('show')
373
    assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'This is a tooltip with some content', 'title from title option is set')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
374
375

    $tooltip.bootstrapTooltip('hide')
376
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
377
378
  })

379
  QUnit.test('should be placed dynamically to viewport with the dynamic placement option', function (assert) {
380
    assert.expect(6)
Adrien Jarthon's avatar
Adrien Jarthon committed
381
    var $style = $('<style> div[rel="tooltip"] { position: absolute; } #qunit-fixture { top: inherit; left: inherit } </style>').appendTo('head')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
382
383
    var $container = $('<div/>')
      .css({
384
385
        position: 'relative',
        height: '100%'
Heinrich Fenkart's avatar
Heinrich Fenkart committed
386
      })
387
      .appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
388
389
390

    var $topTooltip = $('<div style="left: 0; top: 0;" rel="tooltip" title="Top tooltip">Top Dynamic Tooltip</div>')
      .appendTo($container)
391
      .bootstrapTooltip({ placement: 'auto', viewport: '#qunit-fixture' })
XhmikosR's avatar
XhmikosR committed
392

Heinrich Fenkart's avatar
Heinrich Fenkart committed
393
    $topTooltip.bootstrapTooltip('show')
394
    assert.ok($('.tooltip').is('.bottom'), 'top positioned tooltip is dynamically positioned to bottom')
XhmikosR's avatar
XhmikosR committed
395

Heinrich Fenkart's avatar
Heinrich Fenkart committed
396
    $topTooltip.bootstrapTooltip('hide')
397
    assert.strictEqual($('.tooltip').length, 0, 'top positioned tooltip removed from dom')
XhmikosR's avatar
XhmikosR committed
398

Heinrich Fenkart's avatar
Heinrich Fenkart committed
399
400
    var $rightTooltip = $('<div style="right: 0;" rel="tooltip" title="Right tooltip">Right Dynamic Tooltip</div>')
      .appendTo($container)
401
      .bootstrapTooltip({ placement: 'right auto', viewport: '#qunit-fixture' })
XhmikosR's avatar
XhmikosR committed
402

Heinrich Fenkart's avatar
Heinrich Fenkart committed
403
    $rightTooltip.bootstrapTooltip('show')
404
    assert.ok($('.tooltip').is('.left'), 'right positioned tooltip is dynamically positioned left')
XhmikosR's avatar
XhmikosR committed
405

Heinrich Fenkart's avatar
Heinrich Fenkart committed
406
    $rightTooltip.bootstrapTooltip('hide')
407
    assert.strictEqual($('.tooltip').length, 0, 'right positioned tooltip removed from dom')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
408
409
410

    var $leftTooltip = $('<div style="left: 0;" rel="tooltip" title="Left tooltip">Left Dynamic Tooltip</div>')
      .appendTo($container)
411
      .bootstrapTooltip({ placement: 'auto left', viewport: '#qunit-fixture' })
XhmikosR's avatar
XhmikosR committed
412

Heinrich Fenkart's avatar
Heinrich Fenkart committed
413
    $leftTooltip.bootstrapTooltip('show')
414
    assert.ok($('.tooltip').is('.right'), 'left positioned tooltip is dynamically positioned right')
XhmikosR's avatar
XhmikosR committed
415

Heinrich Fenkart's avatar
Heinrich Fenkart committed
416
    $leftTooltip.bootstrapTooltip('hide')
417
    assert.strictEqual($('.tooltip').length, 0, 'left positioned tooltip removed from dom')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
418
419
420

    $container.remove()
    $style.remove()
XhmikosR's avatar
XhmikosR committed
421
  })
422

423
  QUnit.test('should position tip on top if viewport has enough space and placement is "auto top"', function (assert) {
424
    assert.expect(2)
425
426
    var styles = '<style>'
        + 'body { padding-top: 100px; }'
427
        + '#section { height: 300px; border: 1px solid red; padding-top: 50px }'
428
429
430
431
        + 'div[rel="tooltip"] { width: 150px; border: 1px solid blue; }'
        + '</style>'
    var $styles = $(styles).appendTo('head')

432
    var $container = $('<div id="section"/>').appendTo('#qunit-fixture')
433
434
435
436
    var $target = $('<div rel="tooltip" title="tip"/>')
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'auto top',
437
        viewport: '#section'
438
439
440
      })

    $target.bootstrapTooltip('show')
441
    assert.ok($('.tooltip').is('.top'), 'top positioned tooltip is dynamically positioned to top')
442
443

    $target.bootstrapTooltip('hide')
444
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
445
446
447
448

    $styles.remove()
  })

449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
  QUnit.test('should position tip on top if viewport has enough space and is not parent', function (assert) {
    assert.expect(2)
    var styles = '<style>'
        + '#section { height: 300px; border: 1px solid red; margin-top: 100px; }'
        + 'div[rel="tooltip"] { width: 150px; border: 1px solid blue; }'
        + '</style>'
    var $styles = $(styles).appendTo('head')

    var $container = $('<div id="section"/>').appendTo('#qunit-fixture')
    var $target = $('<div rel="tooltip" title="tip"/>')
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'auto top',
        viewport: '#qunit-fixture'
      })

    $target.bootstrapTooltip('show')
    assert.ok($('.tooltip').is('.top'), 'top positioned tooltip is dynamically positioned to top')

    $target.bootstrapTooltip('hide')
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')

    $styles.remove()
  })

474
  QUnit.test('should position tip on bottom if the tip\'s dimension exceeds the viewport area and placement is "auto top"', function (assert) {
475
    assert.expect(2)
476
477
    var styles = '<style>'
        + 'body { padding-top: 100px; }'
478
        + '#section { height: 300px; border: 1px solid red; }'
479
480
481
482
        + 'div[rel="tooltip"] { width: 150px; border: 1px solid blue; }'
        + '</style>'
    var $styles = $(styles).appendTo('head')

483
    var $container = $('<div id="section"/>').appendTo('#qunit-fixture')
484
485
486
487
    var $target = $('<div rel="tooltip" title="tip"/>')
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'auto top',
488
        viewport: '#section'
489
490
491
      })

    $target.bootstrapTooltip('show')
492
    assert.ok($('.tooltip').is('.bottom'), 'top positioned tooltip is dynamically positioned to bottom')
493
494

    $target.bootstrapTooltip('hide')
495
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
496
497
498
499

    $styles.remove()
  })

500
  QUnit.test('should display the tip on top whenever scrollable viewport has enough room if the given placement is "auto top"', function (assert) {
501
    assert.expect(2)
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
    var styles = '<style>'
        + '#scrollable-div { height: 200px; overflow: auto; }'
        + '.tooltip-item { margin: 200px 0 400px; width: 150px; }'
        + '</style>'
    var $styles = $(styles).appendTo('head')

    var $container = $('<div id="scrollable-div"/>').appendTo('#qunit-fixture')
    var $target = $('<div rel="tooltip" title="tip" class="tooltip-item">Tooltip Item</div>')
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'top auto',
        viewport: '#scrollable-div'
      })

    $('#scrollable-div').scrollTop(100)

    $target.bootstrapTooltip('show')
519
    assert.ok($('.tooltip').is('.fade.top.in'), 'has correct classes applied')
520
521

    $target.bootstrapTooltip('hide')
522
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
523
524
525
526

    $styles.remove()
  })

527
  QUnit.test('should display the tip on bottom whenever scrollable viewport doesn\'t have enough room if the given placement is "auto top"', function (assert) {
528
    assert.expect(2)
529
530
    var styles = '<style>'
        + '#scrollable-div { height: 200px; overflow: auto; }'
531
        + '.tooltip-item { padding: 200px 0 400px; width: 150px; }'
532
533
534
535
536
537
538
539
540
541
542
543
544
545
        + '</style>'
    var $styles = $(styles).appendTo('head')

    var $container = $('<div id="scrollable-div"/>').appendTo('#qunit-fixture')
    var $target = $('<div rel="tooltip" title="tip" class="tooltip-item">Tooltip Item</div>')
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'top auto',
        viewport: '#scrollable-div'
      })

    $('#scrollable-div').scrollTop(200)

    $target.bootstrapTooltip('show')
546
    assert.ok($('.tooltip').is('.fade.bottom.in'), 'has correct classes applied')
547
548

    $target.bootstrapTooltip('hide')
549
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
550
551
552
553

    $styles.remove()
  })

554
  QUnit.test('should display the tip on bottom whenever scrollable viewport has enough room if the given placement is "auto bottom"', function (assert) {
555
    assert.expect(2)
556
557
    var styles = '<style>'
        + '#scrollable-div { height: 200px; overflow: auto; }'
558
559
560
        + '.spacer { height: 400px; }'
        + '.spacer:first-child { height: 200px; }'
        + '.tooltip-item { width: 150px; }'
561
562
563
564
565
566
        + '</style>'
    var $styles = $(styles).appendTo('head')

    var $container = $('<div id="scrollable-div"/>').appendTo('#qunit-fixture')
    var $target = $('<div rel="tooltip" title="tip" class="tooltip-item">Tooltip Item</div>')
      .appendTo($container)
567
568
      .before('<div class="spacer"/>')
      .after('<div class="spacer"/>')
569
570
571
572
573
574
575
576
      .bootstrapTooltip({
        placement: 'bottom auto',
        viewport: '#scrollable-div'
      })

    $('#scrollable-div').scrollTop(200)

    $target.bootstrapTooltip('show')
577
    assert.ok($('.tooltip').is('.fade.bottom.in'), 'has correct classes applied')
578
579

    $target.bootstrapTooltip('hide')
580
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
581
582
583
584

    $styles.remove()
  })

585
  QUnit.test('should display the tip on top whenever scrollable viewport doesn\'t have enough room if the given placement is "auto bottom"', function (assert) {
586
    assert.expect(2)
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
    var styles = '<style>'
        + '#scrollable-div { height: 200px; overflow: auto; }'
        + '.tooltip-item { margin-top: 400px; width: 150px; }'
        + '</style>'
    var $styles = $(styles).appendTo('head')

    var $container = $('<div id="scrollable-div"/>').appendTo('#qunit-fixture')
    var $target = $('<div rel="tooltip" title="tip" class="tooltip-item">Tooltip Item</div>')
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'bottom auto',
        viewport: '#scrollable-div'
      })

    $('#scrollable-div').scrollTop(400)

    $target.bootstrapTooltip('show')
604
    assert.ok($('.tooltip').is('.fade.top.in'), 'has correct classes applied')
605
606

    $target.bootstrapTooltip('hide')
607
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
608
609
610
611

    $styles.remove()
  })

612
  QUnit.test('should adjust the tip\'s top position when up against the top of the viewport', function (assert) {
613
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
614
615
616
617
    var styles = '<style>'
        + '.tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; }'
        + 'a[rel="tooltip"] { position: fixed; }'
        + '</style>'
618
    var $styles = $(styles).appendTo('head')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
619

fat's avatar
fat committed
620
    var $container = $('<div/>').appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
621
622
623
624
625
626
627
628
629
630
631
    var $target = $('<a href="#" rel="tooltip" title="tip" style="top: 0px; left: 0px;"/>')
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'right',
        viewport: {
          selector: 'body',
          padding: 12
        }
      })

    $target.bootstrapTooltip('show')
632
    assert.strictEqual(Math.round($container.find('.tooltip').offset().top), 12)
633

Heinrich Fenkart's avatar
Heinrich Fenkart committed
634
    $target.bootstrapTooltip('hide')
635
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
636

Heinrich Fenkart's avatar
Heinrich Fenkart committed
637
    $styles.remove()
638
639
  })

640
  QUnit.test('should adjust the tip\'s top position when up against the bottom of the viewport', function (assert) {
641
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
642
643
644
645
    var styles = '<style>'
        + '.tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; }'
        + 'a[rel="tooltip"] { position: fixed; }'
        + '</style>'
646
    var $styles = $(styles).appendTo('head')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
647

fat's avatar
fat committed
648
    var $container = $('<div/>').appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
649
650
651
652
653
654
655
656
657
    var $target = $('<a href="#" rel="tooltip" title="tip" style="bottom: 0px; left: 0px;"/>')
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'right',
        viewport: {
          selector: 'body',
          padding: 12
        }
      })
658

Heinrich Fenkart's avatar
Heinrich Fenkart committed
659
660
    $target.bootstrapTooltip('show')
    var $tooltip = $container.find('.tooltip')
661
    assert.strictEqual(Math.round($tooltip.offset().top), Math.round($(window).height() - 12 - $tooltip[0].offsetHeight))
662

Heinrich Fenkart's avatar
Heinrich Fenkart committed
663
    $target.bootstrapTooltip('hide')
664
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
665
666
667

    $container.remove()
    $styles.remove()
668
669
  })

670
  QUnit.test('should adjust the tip\'s left position when up against the left of the viewport', function (assert) {
671
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
672
673
674
675
    var styles = '<style>'
        + '.tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; }'
        + 'a[rel="tooltip"] { position: fixed; }'
        + '</style>'
676
    var $styles = $(styles).appendTo('head')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
677

fat's avatar
fat committed
678
    var $container = $('<div/>').appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
679
680
681
682
683
684
685
686
687
688
689
    var $target = $('<a href="#" rel="tooltip" title="tip" style="top: 0px; left: 0px;"/>')
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'bottom',
        viewport: {
          selector: 'body',
          padding: 12
        }
      })

    $target.bootstrapTooltip('show')
690
    assert.strictEqual(Math.round($container.find('.tooltip').offset().left), 12)
691

Heinrich Fenkart's avatar
Heinrich Fenkart committed
692
    $target.bootstrapTooltip('hide')
693
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
694

Heinrich Fenkart's avatar
Heinrich Fenkart committed
695
696
    $container.remove()
    $styles.remove()
697
698
  })

699
  QUnit.test('should adjust the tip\'s left position when up against the right of the viewport', function (assert) {
700
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
701
702
703
704
    var styles = '<style>'
        + '.tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; }'
        + 'a[rel="tooltip"] { position: fixed; }'
        + '</style>'
705
    var $styles = $(styles).appendTo('head')
706

Heinrich Fenkart's avatar
Heinrich Fenkart committed
707
708
709
710
711
712
713
714
715
716
717
718
719
    var $container = $('<div/>').appendTo('body')
    var $target = $('<a href="#" rel="tooltip" title="tip" style="top: 0px; right: 0px;"/>')
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'bottom',
        viewport: {
          selector: 'body',
          padding: 12
        }
      })

    $target.bootstrapTooltip('show')
    var $tooltip = $container.find('.tooltip')
720
    assert.strictEqual(Math.round($tooltip.offset().left), Math.round($(window).width() - 12 - $tooltip[0].offsetWidth))
721

Heinrich Fenkart's avatar
Heinrich Fenkart committed
722
    $target.bootstrapTooltip('hide')
723
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
724
725
726

    $container.remove()
    $styles.remove()
727
728
  })

729
  QUnit.test('should adjust the tip when up against the right of an arbitrary viewport', function (assert) {
730
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
731
732
733
734
735
    var styles = '<style>'
        + '.tooltip, .tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; }'
        + '.container-viewport { position: absolute; top: 50px; left: 60px; width: 300px; height: 300px; }'
        + 'a[rel="tooltip"] { position: fixed; }'
        + '</style>'
736
    var $styles = $(styles).appendTo('head')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
737
738
739
740
741
742
743
744
745
746
747

    var $container = $('<div class="container-viewport"/>').appendTo(document.body)
    var $target = $('<a href="#" rel="tooltip" title="tip" style="top: 50px; left: 350px;"/>')
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'bottom',
        viewport: '.container-viewport'
      })

    $target.bootstrapTooltip('show')
    var $tooltip = $container.find('.tooltip')
748
    assert.strictEqual(Math.round($tooltip.offset().left), Math.round(60 + $container.width() - $tooltip[0].offsetWidth))
749

Heinrich Fenkart's avatar
Heinrich Fenkart committed
750
    $target.bootstrapTooltip('hide')
751
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
752

Heinrich Fenkart's avatar
Heinrich Fenkart committed
753
754
    $container.remove()
    $styles.remove()
755
  })
Chris Rebert's avatar
Chris Rebert committed
756

757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
  QUnit.test('should get viewport element from function', function (assert) {
    assert.expect(3)
    var styles = '<style>'
        + '.tooltip, .tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; }'
        + '.container-viewport { position: absolute; top: 50px; left: 60px; width: 300px; height: 300px; }'
        + 'a[rel="tooltip"] { position: fixed; }'
        + '</style>'
    var $styles = $(styles).appendTo('head')

    var $container = $('<div class="container-viewport"/>').appendTo(document.body)
    var $target = $('<a href="#" rel="tooltip" title="tip" style="top: 50px; left: 350px;"/>').appendTo($container)
    $target
      .bootstrapTooltip({
        placement: 'bottom',
        viewport: function ($element) {
          assert.strictEqual($element[0], $target[0], 'viewport function was passed target as argument')
          return ($element.closest('.container-viewport'))
        }
      })

    $target.bootstrapTooltip('show')
    var $tooltip = $container.find('.tooltip')
    assert.strictEqual(Math.round($tooltip.offset().left), Math.round(60 + $container.width() - $tooltip[0].offsetWidth))

    $target.bootstrapTooltip('hide')
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')

    $container.remove()
    $styles.remove()
  })

788
789
790
791
  QUnit.test('should not misplace the tip when the right edge offset is greater or equal than the viewport width', function (assert) {
    assert.expect(2)
    var styles = '<style>'
        + '.tooltip, .tooltip *, .tooltip *:before, .tooltip *:after { box-sizing: border-box; }'
792
        + '.container-viewport, .container-viewport *, .container-viewport *:before, .container-viewport *:after { box-sizing: border-box; }'
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
        + '.tooltip, .tooltip .tooltip-inner { width: 50px; height: 50px; max-width: none; background: red; }'
        + '.container-viewport { padding: 100px; margin-left: 100px; width: 100px; }'
        + '</style>'
    var $styles = $(styles).appendTo('head')

    var $container = $('<div class="container-viewport"/>').appendTo(document.body)
    var $target = $('<a href="#" rel="tooltip" title="tip">foobar</a>')
      .appendTo($container)
      .bootstrapTooltip({
        viewport: '.container-viewport'
      })

    $target.bootstrapTooltip('show')
    var $tooltip = $container.find('.tooltip')
    assert.strictEqual(Math.round($tooltip.offset().left), Math.round($target.position().left + $target.width() / 2 - $tooltip[0].offsetWidth / 2))

    $target.bootstrapTooltip('hide')
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')

    $container.remove()
    $styles.remove()
  })

816
  QUnit.test('should not error when trying to show an auto-placed tooltip that has been removed from the dom', function (assert) {
817
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
818
819
820
    var passed = true
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
      .appendTo('#qunit-fixture')
Chris Rebert's avatar
Chris Rebert committed
821
      .one('show.bs.tooltip', function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
822
        $(this).remove()
Chris Rebert's avatar
Chris Rebert committed
823
824
825
826
      })
      .bootstrapTooltip({ placement: 'auto' })

    try {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
827
828
      $tooltip.bootstrapTooltip('show')
    } catch (err) {
Chris Rebert's avatar
Chris Rebert committed
829
830
831
832
      passed = false
      console.log(err)
    }

833
    assert.ok(passed, '.tooltip(\'show\') should not throw an error if element no longer is in dom')
Chris Rebert's avatar
Chris Rebert committed
834
  })
fat's avatar
fat committed
835

836
  QUnit.test('should place tooltip on top of element', function (assert) {
837
    assert.expect(1)
838
    var done = assert.async()
fat's avatar
fat committed
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868

    var containerHTML = '<div>'
        + '<p style="margin-top: 200px">'
        + '<a href="#" title="very very very very very very very long tooltip">Hover me</a>'
        + '</p>'
        + '</div>'

    var $container = $(containerHTML)
      .css({
        position: 'absolute',
        bottom: 0,
        left: 0,
        textAlign: 'right',
        width: 300,
        height: 300
      })
      .appendTo('#qunit-fixture')

    var $trigger = $container
      .find('a')
      .css('margin-top', 200)
      .bootstrapTooltip({
        placement: 'top',
        animate: false
      })
      .bootstrapTooltip('show')

    var $tooltip = $container.find('.tooltip')

    setTimeout(function () {
869
      assert.ok(Math.round($tooltip.offset().top + $tooltip.outerHeight()) <= Math.round($trigger.offset().top))
870
      done()
fat's avatar
fat committed
871
872
873
    }, 0)
  })

874
  QUnit.test('should place tooltip inside viewport', function (assert) {
875
    assert.expect(1)
876
    var done = assert.async()
fat's avatar
fat committed
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900

    var $container = $('<div/>')
      .css({
        position: 'absolute',
        width: 200,
        height: 200,
        bottom: 0,
        left: 0
      })
      .appendTo('#qunit-fixture')

    $('<a href="#" title="Very very very very very very very very long tooltip">Hover me</a>')
      .css({
        position: 'absolute',
        top: 0,
        left: 0
      })
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'top'
      })
      .bootstrapTooltip('show')

    setTimeout(function () {
901
      assert.ok($('.tooltip').offset().left >= 0)
902
      done()
fat's avatar
fat committed
903
904
905
    }, 0)
  })

906
  QUnit.test('should show tooltip if leave event hasn\'t occurred before delay expires', function (assert) {
907
    assert.expect(2)
908
    var done = assert.async()
fat's avatar
fat committed
909
910
911

    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
      .appendTo('#qunit-fixture')
912
      .bootstrapTooltip({ delay: 150 })
fat's avatar
fat committed
913
914

    setTimeout(function () {
915
      assert.ok(!$('.tooltip').is('.fade.in'), '100ms: tooltip is not faded in')
916
    }, 100)
fat's avatar
fat committed
917
918

    setTimeout(function () {
919
      assert.ok($('.tooltip').is('.fade.in'), '200ms: tooltip is faded in')
920
      done()
921
    }, 200)
fat's avatar
fat committed
922
923
924
925

    $tooltip.trigger('mouseenter')
  })

926
  QUnit.test('should not show tooltip if leave event occurs before delay expires', function (assert) {
927
    assert.expect(2)
928
    var done = assert.async()
fat's avatar
fat committed
929
930
931

    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
      .appendTo('#qunit-fixture')
932
      .bootstrapTooltip({ delay: 150 })
fat's avatar
fat committed
933
934

    setTimeout(function () {
935
      assert.ok(!$('.tooltip').is('.fade.in'), '100ms: tooltip not faded in')
fat's avatar
fat committed
936
      $tooltip.trigger('mouseout')
937
    }, 100)
fat's avatar
fat committed
938
939

    setTimeout(function () {
940
      assert.ok(!$('.tooltip').is('.fade.in'), '200ms: tooltip not faded in')
941
      done()
942
    }, 200)
fat's avatar
fat committed
943
944
945
946

    $tooltip.trigger('mouseenter')
  })

947
  QUnit.test('should not hide tooltip if leave event occurs and enter event occurs within the hide delay', function (assert) {
948
    assert.expect(3)
949
    var done = assert.async()
fat's avatar
fat committed
950
951
952

    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
      .appendTo('#qunit-fixture')
953
      .bootstrapTooltip({ delay: { show: 0, hide: 150 }})
fat's avatar
fat committed
954
955

    setTimeout(function () {
956
      assert.ok($('.tooltip').is('.fade.in'), '1ms: tooltip faded in')
fat's avatar
fat committed
957
958
959
      $tooltip.trigger('mouseout')

      setTimeout(function () {
960
        assert.ok($('.tooltip').is('.fade.in'), '100ms: tooltip still faded in')
fat's avatar
fat committed
961
        $tooltip.trigger('mouseenter')
962
      }, 100)
fat's avatar
fat committed
963
964

      setTimeout(function () {
965
        assert.ok($('.tooltip').is('.fade.in'), '200ms: tooltip still faded in')
966
        done()
967
      }, 200)
fat's avatar
fat committed
968
969
970
971
972
    }, 0)

    $tooltip.trigger('mouseenter')
  })

973
  QUnit.test('should not show tooltip if leave event occurs before delay expires', function (assert) {
974
    assert.expect(2)
975
    var done = assert.async()
fat's avatar
fat committed
976
977
978

    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
      .appendTo('#qunit-fixture')
979
      .bootstrapTooltip({ delay: 150 })
fat's avatar
fat committed
980
981

    setTimeout(function () {
982
      assert.ok(!$('.tooltip').is('.fade.in'), '100ms: tooltip not faded in')
fat's avatar
fat committed
983
      $tooltip.trigger('mouseout')
984
    }, 100)
fat's avatar
fat committed
985
986

    setTimeout(function () {
987
      assert.ok(!$('.tooltip').is('.fade.in'), '200ms: tooltip not faded in')
988
      done()
989
    }, 200)
fat's avatar
fat committed
990
991
992
993

    $tooltip.trigger('mouseenter')
  })

994
  QUnit.test('should not show tooltip if leave event occurs before delay expires, even if hide delay is 0', function (assert) {
995
    assert.expect(2)
996
    var done = assert.async()
fat's avatar
fat committed
997
998
999

    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
      .appendTo('#qunit-fixture')
1000
      .bootstrapTooltip({ delay: { show: 150, hide: 0 }})
For faster browsing, not all history is shown. View entire blame