tooltip.js 41.9 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
  })

142
  QUnit.test('should fire shown event', function (assert) {
143
    assert.expect(1)
144
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
145
146
147

    $('<div title="tooltip title"></div>')
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
148
      .on('shown.bs.tooltip', function () {
149
        assert.ok(true, 'shown was called')
150
        done()
XhmikosR's avatar
XhmikosR committed
151
      })
152
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
153
154
  })

155
  QUnit.test('should not fire shown event when show was prevented', function (assert) {
156
    assert.expect(1)
157
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
158
159

    $('<div title="tooltip title"/>')
XhmikosR's avatar
XhmikosR committed
160
161
      .on('show.bs.tooltip', function (e) {
        e.preventDefault()
162
        assert.ok(true, 'show event fired')
163
        done()
XhmikosR's avatar
XhmikosR committed
164
165
      })
      .on('shown.bs.tooltip', function () {
166
        assert.ok(false, 'shown event fired')
XhmikosR's avatar
XhmikosR committed
167
      })
168
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
169
170
  })

171
  QUnit.test('should fire hide event', function (assert) {
172
    assert.expect(1)
173
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
174
175
176

    $('<div title="tooltip title"/>')
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
177
      .on('shown.bs.tooltip', function () {
178
        $(this).bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
179
180
      })
      .on('hide.bs.tooltip', function () {
181
        assert.ok(true, 'hide event fired')
182
        done()
XhmikosR's avatar
XhmikosR committed
183
      })
184
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
185
186
  })

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

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

203
  QUnit.test('should not fire hidden event when hide was prevented', function (assert) {
204
    assert.expect(1)
205
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
206
207
208

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

223
  QUnit.test('should destroy tooltip', function (assert) {
224
    assert.expect(7)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
225
226
227
228
    var $tooltip = $('<div/>')
      .bootstrapTooltip()
      .on('click.foo', function () {})

229
230
    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')
231
    assert.strictEqual($._data($tooltip[0], 'events').click[0].namespace, 'foo', 'tooltip has extra click.foo event')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
232
233
234
235

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

236
237
    assert.ok(!$tooltip.hasClass('in'), 'tooltip is hidden')
    assert.ok(!$._data($tooltip[0], 'bs.tooltip'), 'tooltip does not have data')
238
    assert.strictEqual($._data($tooltip[0], 'events').click[0].namespace, 'foo', 'tooltip still has click.foo')
239
    assert.ok(!$._data($tooltip[0], 'events').mouseover && !$._data($tooltip[0], 'events').mouseout, 'tooltip does not have hover events')
XhmikosR's avatar
XhmikosR committed
240
241
  })

242
  QUnit.test('should show tooltip with delegate selector on click', function (assert) {
243
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
244
245
246
247
248
249
250
    var $div = $('<div><a href="#" rel="tooltip" title="Another tooltip"/></div>')
      .appendTo('#qunit-fixture')
      .bootstrapTooltip({
        selector: 'a[rel="tooltip"]',
        trigger: 'click'
      })

251
    $div.find('a').trigger('click')
252
    assert.ok($('.tooltip').is('.fade.in'), 'tooltip is faded in')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
253

254
    $div.find('a').trigger('click')
255
    assert.strictEqual($('.tooltip').length, 0, 'tooltip was removed from dom')
XhmikosR's avatar
XhmikosR committed
256
257
  })

258
  QUnit.test('should show tooltip when toggle is called', function (assert) {
259
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
260
    $('<a href="#" rel="tooltip" title="tooltip on toggle"/>')
XhmikosR's avatar
XhmikosR committed
261
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
262
      .bootstrapTooltip({ trigger: 'manual' })
263
      .bootstrapTooltip('toggle')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
264

265
    assert.ok($('.tooltip').is('.fade.in'), 'tooltip is faded in')
XhmikosR's avatar
XhmikosR committed
266
267
  })

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

    $('.tooltip').bootstrapTooltip('toggle')
276
    assert.ok($('.tooltip').not('.fade.in'), 'tooltip was faded out')
277
278
  })

279
  QUnit.test('should place tooltips inside body when container is body', function (assert) {
280
    assert.expect(3)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
281
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
XhmikosR's avatar
XhmikosR committed
282
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
283
      .bootstrapTooltip({ container: 'body' })
284
      .bootstrapTooltip('show')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
285

286
    assert.notEqual($('body > .tooltip').length, 0, 'tooltip is direct descendant of body')
287
    assert.strictEqual($('#qunit-fixture > .tooltip').length, 0, 'tooltip is not in parent')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
288
289

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

293
  QUnit.test('should add position class before positioning so that position-specific styles are taken into account', function (assert) {
294
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
295
296
297
298
    var styles = '<style>'
        + '.tooltip.right { white-space: nowrap; }'
        + '.tooltip.right .tooltip-inner { max-width: none; }'
        + '</style>'
299
    var $styles = $(styles).appendTo('head')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
300

fat's avatar
fat committed
301
    var $container = $('<div/>').appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
302
303
304
305
306
307
308
309
    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
310
311

    // this is some dumb hack shit because sub pixels in firefox
Heinrich Fenkart's avatar
Heinrich Fenkart committed
312
313
    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
314
    var topDiff = top - top2
315
    assert.ok(topDiff <= 1 && topDiff >= -1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
316
317
318
319
    $target.bootstrapTooltip('hide')

    $container.remove()
    $styles.remove()
XhmikosR's avatar
XhmikosR committed
320
321
  })

322
  QUnit.test('should use title attribute for tooltip text', function (assert) {
323
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
324
    var $tooltip = $('<a href="#" rel="tooltip" title="Simple tooltip"/>')
XhmikosR's avatar
XhmikosR committed
325
      .appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
326
327
328
      .bootstrapTooltip()

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

    $tooltip.bootstrapTooltip('hide')
332
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
XhmikosR's avatar
XhmikosR committed
333
334
  })

335
  QUnit.test('should prefer title attribute over title option', function (assert) {
336
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
337
    var $tooltip = $('<a href="#" rel="tooltip" title="Simple tooltip"/>')
XhmikosR's avatar
XhmikosR committed
338
      .appendTo('#qunit-fixture')
339
      .bootstrapTooltip({
XhmikosR's avatar
XhmikosR committed
340
341
        title: 'This is a tooltip with some content'
      })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
342
343

    $tooltip.bootstrapTooltip('show')
344
    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
345
346

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

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

    $tooltip.bootstrapTooltip('show')
359
    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
360
361

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

365
  QUnit.test('should be placed dynamically to viewport with the dynamic placement option', function (assert) {
366
    assert.expect(6)
Adrien Jarthon's avatar
Adrien Jarthon committed
367
    var $style = $('<style> div[rel="tooltip"] { position: absolute; } #qunit-fixture { top: inherit; left: inherit } </style>').appendTo('head')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
368
369
    var $container = $('<div/>')
      .css({
370
371
        position: 'relative',
        height: '100%'
Heinrich Fenkart's avatar
Heinrich Fenkart committed
372
      })
373
      .appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
374
375
376

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

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

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

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

Heinrich Fenkart's avatar
Heinrich Fenkart committed
389
    $rightTooltip.bootstrapTooltip('show')
390
    assert.ok($('.tooltip').is('.left'), 'right positioned tooltip is dynamically positioned left')
XhmikosR's avatar
XhmikosR committed
391

Heinrich Fenkart's avatar
Heinrich Fenkart committed
392
    $rightTooltip.bootstrapTooltip('hide')
393
    assert.strictEqual($('.tooltip').length, 0, 'right positioned tooltip removed from dom')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
394
395
396

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

Heinrich Fenkart's avatar
Heinrich Fenkart committed
399
    $leftTooltip.bootstrapTooltip('show')
400
    assert.ok($('.tooltip').is('.right'), 'left positioned tooltip is dynamically positioned right')
XhmikosR's avatar
XhmikosR committed
401

Heinrich Fenkart's avatar
Heinrich Fenkart committed
402
    $leftTooltip.bootstrapTooltip('hide')
403
    assert.strictEqual($('.tooltip').length, 0, 'left positioned tooltip removed from dom')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
404
405
406

    $container.remove()
    $style.remove()
XhmikosR's avatar
XhmikosR committed
407
  })
408

409
  QUnit.test('should position tip on top if viewport has enough space and placement is "auto top"', function (assert) {
410
    assert.expect(2)
411
412
    var styles = '<style>'
        + 'body { padding-top: 100px; }'
413
        + '#section { height: 300px; border: 1px solid red; padding-top: 50px }'
414
415
416
417
        + 'div[rel="tooltip"] { width: 150px; border: 1px solid blue; }'
        + '</style>'
    var $styles = $(styles).appendTo('head')

418
    var $container = $('<div id="section"/>').appendTo('#qunit-fixture')
419
420
421
422
    var $target = $('<div rel="tooltip" title="tip"/>')
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'auto top',
423
        viewport: '#section'
424
425
426
      })

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

    $target.bootstrapTooltip('hide')
430
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
431
432
433
434

    $styles.remove()
  })

435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
  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()
  })

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

469
    var $container = $('<div id="section"/>').appendTo('#qunit-fixture')
470
471
472
473
    var $target = $('<div rel="tooltip" title="tip"/>')
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'auto top',
474
        viewport: '#section'
475
476
477
      })

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

    $target.bootstrapTooltip('hide')
481
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
482
483
484
485

    $styles.remove()
  })

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

    $target.bootstrapTooltip('hide')
508
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
509
510
511
512

    $styles.remove()
  })

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

    $target.bootstrapTooltip('hide')
535
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
536
537
538
539

    $styles.remove()
  })

540
  QUnit.test('should display the tip on bottom whenever scrollable viewport has enough room if the given placement is "auto bottom"', function (assert) {
541
    assert.expect(2)
542
543
    var styles = '<style>'
        + '#scrollable-div { height: 200px; overflow: auto; }'
544
545
546
        + '.spacer { height: 400px; }'
        + '.spacer:first-child { height: 200px; }'
        + '.tooltip-item { width: 150px; }'
547
548
549
550
551
552
        + '</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)
553
554
      .before('<div class="spacer"/>')
      .after('<div class="spacer"/>')
555
556
557
558
559
560
561
562
      .bootstrapTooltip({
        placement: 'bottom auto',
        viewport: '#scrollable-div'
      })

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

    $target.bootstrapTooltip('show')
563
    assert.ok($('.tooltip').is('.fade.bottom.in'), 'has correct classes applied')
564
565

    $target.bootstrapTooltip('hide')
566
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
567
568
569
570

    $styles.remove()
  })

571
  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) {
572
    assert.expect(2)
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
    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')
590
    assert.ok($('.tooltip').is('.fade.top.in'), 'has correct classes applied')
591
592

    $target.bootstrapTooltip('hide')
593
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
594
595
596
597

    $styles.remove()
  })

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

fat's avatar
fat committed
606
    var $container = $('<div/>').appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
607
608
609
610
611
612
613
614
615
616
617
    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')
618
    assert.strictEqual(Math.round($container.find('.tooltip').offset().top), 12)
619

Heinrich Fenkart's avatar
Heinrich Fenkart committed
620
    $target.bootstrapTooltip('hide')
621
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
622

Heinrich Fenkart's avatar
Heinrich Fenkart committed
623
    $styles.remove()
624
625
  })

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

fat's avatar
fat committed
634
    var $container = $('<div/>').appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
635
636
637
638
639
640
641
642
643
    var $target = $('<a href="#" rel="tooltip" title="tip" style="bottom: 0px; left: 0px;"/>')
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'right',
        viewport: {
          selector: 'body',
          padding: 12
        }
      })
644

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

Heinrich Fenkart's avatar
Heinrich Fenkart committed
649
    $target.bootstrapTooltip('hide')
650
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
651
652
653

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

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

fat's avatar
fat committed
664
    var $container = $('<div/>').appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
665
666
667
668
669
670
671
672
673
674
675
    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')
676
    assert.strictEqual(Math.round($container.find('.tooltip').offset().left), 12)
677

Heinrich Fenkart's avatar
Heinrich Fenkart committed
678
    $target.bootstrapTooltip('hide')
679
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
680

Heinrich Fenkart's avatar
Heinrich Fenkart committed
681
682
    $container.remove()
    $styles.remove()
683
684
  })

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

Heinrich Fenkart's avatar
Heinrich Fenkart committed
693
694
695
696
697
698
699
700
701
702
703
704
705
    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')
706
    assert.strictEqual(Math.round($tooltip.offset().left), Math.round($(window).width() - 12 - $tooltip[0].offsetWidth))
707

Heinrich Fenkart's avatar
Heinrich Fenkart committed
708
    $target.bootstrapTooltip('hide')
709
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
710
711
712

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

715
  QUnit.test('should adjust the tip when up against the right of an arbitrary viewport', function (assert) {
716
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
717
718
719
720
721
    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>'
722
    var $styles = $(styles).appendTo('head')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
723
724
725
726
727
728
729
730
731
732
733

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

Heinrich Fenkart's avatar
Heinrich Fenkart committed
736
    $target.bootstrapTooltip('hide')
737
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
738

Heinrich Fenkart's avatar
Heinrich Fenkart committed
739
740
    $container.remove()
    $styles.remove()
741
  })
Chris Rebert's avatar
Chris Rebert committed
742

743
  QUnit.test('should not error when trying to show an auto-placed tooltip that has been removed from the dom', function (assert) {
744
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
745
746
747
    var passed = true
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
      .appendTo('#qunit-fixture')
Chris Rebert's avatar
Chris Rebert committed
748
      .one('show.bs.tooltip', function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
749
        $(this).remove()
Chris Rebert's avatar
Chris Rebert committed
750
751
752
753
      })
      .bootstrapTooltip({ placement: 'auto' })

    try {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
754
755
      $tooltip.bootstrapTooltip('show')
    } catch (err) {
Chris Rebert's avatar
Chris Rebert committed
756
757
758
759
      passed = false
      console.log(err)
    }

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

763
  QUnit.test('should place tooltip on top of element', function (assert) {
764
    assert.expect(1)
765
    var done = assert.async()
fat's avatar
fat committed
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795

    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 () {
796
      assert.ok(Math.round($tooltip.offset().top + $tooltip.outerHeight()) <= Math.round($trigger.offset().top))
797
      done()
fat's avatar
fat committed
798
799
800
    }, 0)
  })

801
  QUnit.test('should place tooltip inside viewport', function (assert) {
802
    assert.expect(1)
803
    var done = assert.async()
fat's avatar
fat committed
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827

    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 () {
828
      assert.ok($('.tooltip').offset().left >= 0)
829
      done()
fat's avatar
fat committed
830
831
832
    }, 0)
  })

833
  QUnit.test('should show tooltip if leave event hasn\'t occurred before delay expires', function (assert) {
834
    assert.expect(2)
835
    var done = assert.async()
fat's avatar
fat committed
836
837
838

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

    setTimeout(function () {
842
      assert.ok(!$('.tooltip').is('.fade.in'), '100ms: tooltip is not faded in')
843
    }, 100)
fat's avatar
fat committed
844
845

    setTimeout(function () {
846
      assert.ok($('.tooltip').is('.fade.in'), '200ms: tooltip is faded in')
847
      done()
848
    }, 200)
fat's avatar
fat committed
849
850
851
852

    $tooltip.trigger('mouseenter')
  })

853
  QUnit.test('should not show tooltip if leave event occurs before delay expires', function (assert) {
854
    assert.expect(2)
855
    var done = assert.async()
fat's avatar
fat committed
856
857
858

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

    setTimeout(function () {
862
      assert.ok(!$('.tooltip').is('.fade.in'), '100ms: tooltip not faded in')
fat's avatar
fat committed
863
      $tooltip.trigger('mouseout')
864
    }, 100)
fat's avatar
fat committed
865
866

    setTimeout(function () {
867
      assert.ok(!$('.tooltip').is('.fade.in'), '200ms: tooltip not faded in')
868
      done()
869
    }, 200)
fat's avatar
fat committed
870
871
872
873

    $tooltip.trigger('mouseenter')
  })

874
  QUnit.test('should not hide tooltip if leave event occurs and enter event occurs within the hide delay', function (assert) {
875
    assert.expect(3)
876
    var done = assert.async()
fat's avatar
fat committed
877
878
879

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

    setTimeout(function () {
883
      assert.ok($('.tooltip').is('.fade.in'), '1ms: tooltip faded in')
fat's avatar
fat committed
884
885
886
      $tooltip.trigger('mouseout')

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

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

    $tooltip.trigger('mouseenter')
  })

900
  QUnit.test('should not show tooltip if leave event occurs before delay expires', function (assert) {
901
    assert.expect(2)
902
    var done = assert.async()
fat's avatar
fat committed
903
904
905

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

    setTimeout(function () {
909
      assert.ok(!$('.tooltip').is('.fade.in'), '100ms: tooltip not faded in')
fat's avatar
fat committed
910
      $tooltip.trigger('mouseout')
911
    }, 100)
fat's avatar
fat committed
912
913

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

    $tooltip.trigger('mouseenter')
  })

921
  QUnit.test('should not show tooltip if leave event occurs before delay expires, even if hide delay is 0', function (assert) {
922
    assert.expect(2)
923
    var done = assert.async()
fat's avatar
fat committed
924
925
926

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

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

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

    $tooltip.trigger('mouseenter')
  })

942
  QUnit.test('should wait 200ms before hiding the tooltip', function (assert) {
943
    assert.expect(3)
944
    var done = assert.async()
fat's avatar
fat committed
945
946
947

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

    setTimeout(function () {
951
      assert.ok($tooltip.data('bs.tooltip').$tip.is('.fade.in'), '1ms: tooltip faded in')
fat's avatar
fat committed
952
953
954
955

      $tooltip.trigger('mouseout')

      setTimeout(function () {
956
        assert.ok($tooltip.data('bs.tooltip').$tip.is('.fade.in'), '100ms: tooltip still faded in')
957
      }, 100)
fat's avatar
fat committed
958
959

      setTimeout(function () {
960
        assert.ok(!$tooltip.data('bs.tooltip').$tip.is('.in'), '200ms: tooltip removed')
961
        done()
962
      }, 200)
fat's avatar
fat committed
963
964
965
966
967
968

    }, 0)

    $tooltip.trigger('mouseenter')
  })

969
  QUnit.test('should correctly position tooltips on SVG elements', function (assert) {
970
971
    if (!window.SVGElement) {
      // Skip IE8 since it doesn't support SVG
972
      assert.expect(0)
973
974
      return
    }
975
    assert.expect(2)
976

977
    var done = assert.async()
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997

    var styles = '<style>'
        + '.tooltip, .tooltip *, .tooltip *:before, .tooltip *:after { box-sizing: border-box; }'
        + '.tooltip { position: absolute; }'
        + '.tooltip .tooltip-inner { width: 24px; height: 24px; font-family: Helvetica; }'
        + '</style>'
    var $styles = $(styles).appendTo('head')

    $('#qunit-fixture').append(
        '<div style="position: fixed; top: 0; left: 0;">'
      + '  <svg width="200" height="200">'
      + '    <circle cx="100" cy="100" r="10" title="m" id="theCircle" />'
      + '  </svg>'
      + '</div>')
    var $circle = $('#theCircle')

    $circle
      .on('shown.bs.tooltip', function () {
        var offset = $('.tooltip').offset()
        $styles.remove()
998
        assert.ok(Math.abs(offset.left - 88) <= 1, 'tooltip has correct horizontal location')
999
        $circle.bootstrapTooltip('hide')
1000
        assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
For faster browsing, not all history is shown. View entire blame