tooltip.js 42.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 with the dynamic placement option', function (assert) {
380
    assert.expect(6)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
381
382
383
384
385
386
387
388
389
390
391
392
393
394
    var $style = $('<style> a[rel="tooltip"] { display: inline-block; position: absolute; } </style>')
    var $container = $('<div/>')
      .css({
        position: 'absolute',
        overflow: 'hidden',
        width: 600,
        height: 400,
        top: 0,
        left: 0
      })
      .appendTo(document.body)

    var $topTooltip = $('<div style="left: 0; top: 0;" rel="tooltip" title="Top tooltip">Top Dynamic Tooltip</div>')
      .appendTo($container)
XhmikosR's avatar
XhmikosR committed
395
      .bootstrapTooltip({ placement: 'auto' })
XhmikosR's avatar
XhmikosR committed
396

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

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

Heinrich Fenkart's avatar
Heinrich Fenkart committed
403
404
    var $rightTooltip = $('<div style="right: 0;" rel="tooltip" title="Right tooltip">Right Dynamic Tooltip</div>')
      .appendTo($container)
XhmikosR's avatar
XhmikosR committed
405
      .bootstrapTooltip({ placement: 'right auto' })
XhmikosR's avatar
XhmikosR committed
406

Heinrich Fenkart's avatar
Heinrich Fenkart committed
407
    $rightTooltip.bootstrapTooltip('show')
408
    assert.ok($('.tooltip').is('.left'), 'right positioned tooltip is dynamically positioned left')
XhmikosR's avatar
XhmikosR committed
409

Heinrich Fenkart's avatar
Heinrich Fenkart committed
410
    $rightTooltip.bootstrapTooltip('hide')
411
    assert.strictEqual($('.tooltip').length, 0, 'right positioned tooltip removed from dom')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
412
413
414

    var $leftTooltip = $('<div style="left: 0;" rel="tooltip" title="Left tooltip">Left Dynamic Tooltip</div>')
      .appendTo($container)
XhmikosR's avatar
XhmikosR committed
415
      .bootstrapTooltip({ placement: 'auto left' })
XhmikosR's avatar
XhmikosR committed
416

Heinrich Fenkart's avatar
Heinrich Fenkart committed
417
    $leftTooltip.bootstrapTooltip('show')
418
    assert.ok($('.tooltip').is('.right'), 'left positioned tooltip is dynamically positioned right')
XhmikosR's avatar
XhmikosR committed
419

Heinrich Fenkart's avatar
Heinrich Fenkart committed
420
    $leftTooltip.bootstrapTooltip('hide')
421
    assert.strictEqual($('.tooltip').length, 0, 'left positioned tooltip removed from dom')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
422
423
424

    $container.remove()
    $style.remove()
XhmikosR's avatar
XhmikosR committed
425
  })
426

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

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

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

    $target.bootstrapTooltip('hide')
448
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
449
450
451
452

    $styles.remove()
  })

453
  QUnit.test('should position tip on bottom if the tip\'s dimension exceeds the viewport area and placement is "auto top"', function (assert) {
454
    assert.expect(2)
455
456
    var styles = '<style>'
        + 'body { padding-top: 100px; }'
457
        + '#section { height: 300px; border: 1px solid red; }'
458
459
460
461
        + 'div[rel="tooltip"] { width: 150px; border: 1px solid blue; }'
        + '</style>'
    var $styles = $(styles).appendTo('head')

462
    var $container = $('<div id="section"/>').appendTo('#qunit-fixture')
463
464
465
466
    var $target = $('<div rel="tooltip" title="tip"/>')
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'auto top',
467
        viewport: '#section'
468
469
470
      })

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

    $target.bootstrapTooltip('hide')
474
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
475
476
477
478

    $styles.remove()
  })

479
  QUnit.test('should display the tip on top whenever scrollable viewport has enough room if the given placement is "auto top"', function (assert) {
480
    assert.expect(2)
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
    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')
498
    assert.ok($('.tooltip').is('.fade.top.in'), 'has correct classes applied')
499
500

    $target.bootstrapTooltip('hide')
501
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
502
503
504
505

    $styles.remove()
  })

506
  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) {
507
    assert.expect(2)
508
509
    var styles = '<style>'
        + '#scrollable-div { height: 200px; overflow: auto; }'
510
        + '.tooltip-item { padding: 200px 0 400px; width: 150px; }'
511
512
513
514
515
516
517
518
519
520
521
522
523
524
        + '</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')
525
    assert.ok($('.tooltip').is('.fade.bottom.in'), 'has correct classes applied')
526
527

    $target.bootstrapTooltip('hide')
528
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
529
530
531
532

    $styles.remove()
  })

533
  QUnit.test('should display the tip on bottom whenever scrollable viewport has enough room if the given placement is "auto bottom"', function (assert) {
534
    assert.expect(2)
535
536
    var styles = '<style>'
        + '#scrollable-div { height: 200px; overflow: auto; }'
537
538
539
        + '.spacer { height: 400px; }'
        + '.spacer:first-child { height: 200px; }'
        + '.tooltip-item { width: 150px; }'
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)
546
547
      .before('<div class="spacer"/>')
      .after('<div class="spacer"/>')
548
549
550
551
552
553
554
555
      .bootstrapTooltip({
        placement: 'bottom auto',
        viewport: '#scrollable-div'
      })

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

    $target.bootstrapTooltip('show')
556
    assert.ok($('.tooltip').is('.fade.bottom.in'), 'has correct classes applied')
557
558

    $target.bootstrapTooltip('hide')
559
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
560
561
562
563

    $styles.remove()
  })

564
  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) {
565
    assert.expect(2)
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
    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')
583
    assert.ok($('.tooltip').is('.fade.top.in'), 'has correct classes applied')
584
585

    $target.bootstrapTooltip('hide')
586
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
587
588
589
590

    $styles.remove()
  })

591
  QUnit.test('should adjust the tip\'s top position when up against the top of the viewport', function (assert) {
592
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
593
594
595
596
    var styles = '<style>'
        + '.tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; }'
        + 'a[rel="tooltip"] { position: fixed; }'
        + '</style>'
597
    var $styles = $(styles).appendTo('head')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
598

fat's avatar
fat committed
599
    var $container = $('<div/>').appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
600
601
602
603
604
605
606
607
608
609
610
    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')
611
    assert.strictEqual(Math.round($container.find('.tooltip').offset().top), 12)
612

Heinrich Fenkart's avatar
Heinrich Fenkart committed
613
    $target.bootstrapTooltip('hide')
614
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
615

Heinrich Fenkart's avatar
Heinrich Fenkart committed
616
    $styles.remove()
617
618
  })

619
  QUnit.test('should adjust the tip\'s top position when up against the bottom of the viewport', function (assert) {
620
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
621
622
623
624
    var styles = '<style>'
        + '.tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; }'
        + 'a[rel="tooltip"] { position: fixed; }'
        + '</style>'
625
    var $styles = $(styles).appendTo('head')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
626

fat's avatar
fat committed
627
    var $container = $('<div/>').appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
628
629
630
631
632
633
634
635
636
    var $target = $('<a href="#" rel="tooltip" title="tip" style="bottom: 0px; left: 0px;"/>')
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'right',
        viewport: {
          selector: 'body',
          padding: 12
        }
      })
637

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

Heinrich Fenkart's avatar
Heinrich Fenkart committed
642
    $target.bootstrapTooltip('hide')
643
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
644
645
646

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

649
  QUnit.test('should adjust the tip\'s left position when up against the left of the viewport', function (assert) {
650
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
651
652
653
654
    var styles = '<style>'
        + '.tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; }'
        + 'a[rel="tooltip"] { position: fixed; }'
        + '</style>'
655
    var $styles = $(styles).appendTo('head')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
656

fat's avatar
fat committed
657
    var $container = $('<div/>').appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
658
659
660
661
662
663
664
665
666
667
668
    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')
669
    assert.strictEqual(Math.round($container.find('.tooltip').offset().left), 12)
670

Heinrich Fenkart's avatar
Heinrich Fenkart committed
671
    $target.bootstrapTooltip('hide')
672
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
673

Heinrich Fenkart's avatar
Heinrich Fenkart committed
674
675
    $container.remove()
    $styles.remove()
676
677
  })

678
  QUnit.test('should adjust the tip\'s left position when up against the right of the viewport', function (assert) {
679
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
680
681
682
683
    var styles = '<style>'
        + '.tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; }'
        + 'a[rel="tooltip"] { position: fixed; }'
        + '</style>'
684
    var $styles = $(styles).appendTo('head')
685

Heinrich Fenkart's avatar
Heinrich Fenkart committed
686
687
688
689
690
691
692
693
694
695
696
697
698
    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')
699
    assert.strictEqual(Math.round($tooltip.offset().left), Math.round($(window).width() - 12 - $tooltip[0].offsetWidth))
700

Heinrich Fenkart's avatar
Heinrich Fenkart committed
701
    $target.bootstrapTooltip('hide')
702
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
703
704
705

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

708
  QUnit.test('should adjust the tip when up against the right of an arbitrary viewport', function (assert) {
709
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
710
711
712
713
714
    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>'
715
    var $styles = $(styles).appendTo('head')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
716
717
718
719
720
721
722
723
724
725
726

    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')
727
    assert.strictEqual(Math.round($tooltip.offset().left), Math.round(60 + $container.width() - $tooltip[0].offsetWidth))
728

Heinrich Fenkart's avatar
Heinrich Fenkart committed
729
    $target.bootstrapTooltip('hide')
730
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
731

Heinrich Fenkart's avatar
Heinrich Fenkart committed
732
733
    $container.remove()
    $styles.remove()
734
  })
Chris Rebert's avatar
Chris Rebert committed
735

736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
  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()
  })

767
  QUnit.test('should not error when trying to show an auto-placed tooltip that has been removed from the dom', function (assert) {
768
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
769
770
771
    var passed = true
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
      .appendTo('#qunit-fixture')
Chris Rebert's avatar
Chris Rebert committed
772
      .one('show.bs.tooltip', function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
773
        $(this).remove()
Chris Rebert's avatar
Chris Rebert committed
774
775
776
777
      })
      .bootstrapTooltip({ placement: 'auto' })

    try {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
778
779
      $tooltip.bootstrapTooltip('show')
    } catch (err) {
Chris Rebert's avatar
Chris Rebert committed
780
781
782
783
      passed = false
      console.log(err)
    }

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

787
  QUnit.test('should place tooltip on top of element', function (assert) {
788
    assert.expect(1)
789
    var done = assert.async()
fat's avatar
fat committed
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819

    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 () {
820
      assert.ok(Math.round($tooltip.offset().top + $tooltip.outerHeight()) <= Math.round($trigger.offset().top))
821
      done()
fat's avatar
fat committed
822
823
824
    }, 0)
  })

825
  QUnit.test('should place tooltip inside viewport', function (assert) {
826
    assert.expect(1)
827
    var done = assert.async()
fat's avatar
fat committed
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851

    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 () {
852
      assert.ok($('.tooltip').offset().left >= 0)
853
      done()
fat's avatar
fat committed
854
855
856
    }, 0)
  })

857
  QUnit.test('should show tooltip if leave event hasn\'t occurred before delay expires', function (assert) {
858
    assert.expect(2)
859
    var done = assert.async()
fat's avatar
fat committed
860
861
862

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

    setTimeout(function () {
866
      assert.ok(!$('.tooltip').is('.fade.in'), '100ms: tooltip is not faded in')
867
    }, 100)
fat's avatar
fat committed
868
869

    setTimeout(function () {
870
      assert.ok($('.tooltip').is('.fade.in'), '200ms: tooltip is faded in')
871
      done()
872
    }, 200)
fat's avatar
fat committed
873
874
875
876

    $tooltip.trigger('mouseenter')
  })

877
  QUnit.test('should not show tooltip if leave event occurs before delay expires', function (assert) {
878
    assert.expect(2)
879
    var done = assert.async()
fat's avatar
fat committed
880
881
882

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

    setTimeout(function () {
886
      assert.ok(!$('.tooltip').is('.fade.in'), '100ms: tooltip not faded in')
fat's avatar
fat committed
887
      $tooltip.trigger('mouseout')
888
    }, 100)
fat's avatar
fat committed
889
890

    setTimeout(function () {
891
      assert.ok(!$('.tooltip').is('.fade.in'), '200ms: tooltip not faded in')
892
      done()
893
    }, 200)
fat's avatar
fat committed
894
895
896
897

    $tooltip.trigger('mouseenter')
  })

898
  QUnit.test('should not hide tooltip if leave event occurs and enter event occurs within the hide delay', function (assert) {
899
    assert.expect(3)
900
    var done = assert.async()
fat's avatar
fat committed
901
902
903

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

    setTimeout(function () {
907
      assert.ok($('.tooltip').is('.fade.in'), '1ms: tooltip faded in')
fat's avatar
fat committed
908
909
910
      $tooltip.trigger('mouseout')

      setTimeout(function () {
911
        assert.ok($('.tooltip').is('.fade.in'), '100ms: tooltip still faded in')
fat's avatar
fat committed
912
        $tooltip.trigger('mouseenter')
913
      }, 100)
fat's avatar
fat committed
914
915

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

    $tooltip.trigger('mouseenter')
  })

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

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

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

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

    $tooltip.trigger('mouseenter')
  })

945
  QUnit.test('should not show tooltip if leave event occurs before delay expires, even if hide delay is 0', function (assert) {
946
    assert.expect(2)
947
    var done = assert.async()
fat's avatar
fat committed
948
949
950

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

    setTimeout(function () {
954
      assert.ok(!$('.tooltip').is('.fade.in'), '100ms: tooltip not faded in')
fat's avatar
fat committed
955
      $tooltip.trigger('mouseout')
956
    }, 100)
fat's avatar
fat committed
957
958

    setTimeout(function () {
959
      assert.ok(!$('.tooltip').is('.fade.in'), '250ms: tooltip not faded in')
960
      done()
961
    }, 250)
fat's avatar
fat committed
962
963
964
965

    $tooltip.trigger('mouseenter')
  })

966
  QUnit.test('should wait 200ms before hiding the tooltip', function (assert) {
967
    assert.expect(3)
968
    var done = assert.async()
fat's avatar
fat committed
969
970
971

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

    setTimeout(function () {
975
      assert.ok($tooltip.data('bs.tooltip').$tip.is('.fade.in'), '1ms: tooltip faded in')
fat's avatar
fat committed
976
977
978
979

      $tooltip.trigger('mouseout')

      setTimeout(function () {
980
        assert.ok($tooltip.data('bs.tooltip').$tip.is('.fade.in'), '100ms: tooltip still faded in')
981
      }, 100)
fat's avatar
fat committed
982
983

      setTimeout(function () {
984
        assert.ok(!$tooltip.data('bs.tooltip').$tip.is('.in'), '200ms: tooltip removed')
985
        done()
986
      }, 200)
fat's avatar
fat committed
987
988
989
990
991
992

    }, 0)

    $tooltip.trigger('mouseenter')
  })

993
  QUnit.test('should correctly position tooltips on SVG elements', function (assert) {
994
995
    if (!window.SVGElement) {
      // Skip IE8 since it doesn't support SVG
996
      assert.expect(0)
997
998
      return
    }
999
    assert.expect(2)
1000

For faster browsing, not all history is shown. View entire blame