tooltip.js 41 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 with the dynamic placement option', function (assert) {
366
    assert.expect(6)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
367
368
369
370
371
372
373
374
375
376
377
378
379
380
    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
381
      .bootstrapTooltip({ placement: 'auto' })
XhmikosR's avatar
XhmikosR committed
382

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

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

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

Heinrich Fenkart's avatar
Heinrich Fenkart committed
393
    $rightTooltip.bootstrapTooltip('show')
394
    assert.ok($('.tooltip').is('.left'), 'right positioned tooltip is dynamically positioned left')
XhmikosR's avatar
XhmikosR committed
395

Heinrich Fenkart's avatar
Heinrich Fenkart committed
396
    $rightTooltip.bootstrapTooltip('hide')
397
    assert.strictEqual($('.tooltip').length, 0, 'right positioned tooltip removed from dom')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
398
399
400

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

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

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

    $container.remove()
    $style.remove()
XhmikosR's avatar
XhmikosR committed
411
  })
412

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

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

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

    $target.bootstrapTooltip('hide')
434
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
435
436
437
438

    $styles.remove()
  })

439
  QUnit.test('should position tip on bottom if the tip\'s dimension exceeds the viewport area and placement is "auto top"', function (assert) {
440
    assert.expect(2)
441
442
    var styles = '<style>'
        + 'body { padding-top: 100px; }'
443
        + '#section { height: 300px; border: 1px solid red; }'
444
445
446
447
        + 'div[rel="tooltip"] { width: 150px; border: 1px solid blue; }'
        + '</style>'
    var $styles = $(styles).appendTo('head')

448
    var $container = $('<div id="section"/>').appendTo('#qunit-fixture')
449
450
451
452
    var $target = $('<div rel="tooltip" title="tip"/>')
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'auto top',
453
        viewport: '#section'
454
455
456
      })

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

    $target.bootstrapTooltip('hide')
460
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
461
462
463
464

    $styles.remove()
  })

465
  QUnit.test('should display the tip on top whenever scrollable viewport has enough room if the given placement is "auto top"', function (assert) {
466
    assert.expect(2)
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
    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')
484
    assert.ok($('.tooltip').is('.fade.top.in'), 'has correct classes applied')
485
486

    $target.bootstrapTooltip('hide')
487
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
488
489
490
491

    $styles.remove()
  })

492
  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) {
493
    assert.expect(2)
494
495
    var styles = '<style>'
        + '#scrollable-div { height: 200px; overflow: auto; }'
496
        + '.tooltip-item { padding: 200px 0 400px; width: 150px; }'
497
498
499
500
501
502
503
504
505
506
507
508
509
510
        + '</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')
511
    assert.ok($('.tooltip').is('.fade.bottom.in'), 'has correct classes applied')
512
513

    $target.bootstrapTooltip('hide')
514
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
515
516
517
518

    $styles.remove()
  })

519
  QUnit.test('should display the tip on bottom whenever scrollable viewport has enough room if the given placement is "auto bottom"', function (assert) {
520
    assert.expect(2)
521
522
    var styles = '<style>'
        + '#scrollable-div { height: 200px; overflow: auto; }'
523
524
525
        + '.spacer { height: 400px; }'
        + '.spacer:first-child { height: 200px; }'
        + '.tooltip-item { width: 150px; }'
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)
532
533
      .before('<div class="spacer"/>')
      .after('<div class="spacer"/>')
534
535
536
537
538
539
540
541
      .bootstrapTooltip({
        placement: 'bottom auto',
        viewport: '#scrollable-div'
      })

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

    $target.bootstrapTooltip('show')
542
    assert.ok($('.tooltip').is('.fade.bottom.in'), 'has correct classes applied')
543
544

    $target.bootstrapTooltip('hide')
545
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
546
547
548
549

    $styles.remove()
  })

550
  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) {
551
    assert.expect(2)
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
    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')
569
    assert.ok($('.tooltip').is('.fade.top.in'), 'has correct classes applied')
570
571

    $target.bootstrapTooltip('hide')
572
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
573
574
575
576

    $styles.remove()
  })

577
  QUnit.test('should adjust the tip\'s top position when up against the top of the viewport', function (assert) {
578
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
579
580
581
582
    var styles = '<style>'
        + '.tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; }'
        + 'a[rel="tooltip"] { position: fixed; }'
        + '</style>'
583
    var $styles = $(styles).appendTo('head')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
584

fat's avatar
fat committed
585
    var $container = $('<div/>').appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
586
587
588
589
590
591
592
593
594
595
596
    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')
597
    assert.strictEqual(Math.round($container.find('.tooltip').offset().top), 12)
598

Heinrich Fenkart's avatar
Heinrich Fenkart committed
599
    $target.bootstrapTooltip('hide')
600
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
601

Heinrich Fenkart's avatar
Heinrich Fenkart committed
602
    $styles.remove()
603
604
  })

605
  QUnit.test('should adjust the tip\'s top position when up against the bottom of the viewport', function (assert) {
606
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
607
608
609
610
    var styles = '<style>'
        + '.tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; }'
        + 'a[rel="tooltip"] { position: fixed; }'
        + '</style>'
611
    var $styles = $(styles).appendTo('head')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
612

fat's avatar
fat committed
613
    var $container = $('<div/>').appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
614
615
616
617
618
619
620
621
622
    var $target = $('<a href="#" rel="tooltip" title="tip" style="bottom: 0px; left: 0px;"/>')
      .appendTo($container)
      .bootstrapTooltip({
        placement: 'right',
        viewport: {
          selector: 'body',
          padding: 12
        }
      })
623

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

Heinrich Fenkart's avatar
Heinrich Fenkart committed
628
    $target.bootstrapTooltip('hide')
629
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
630
631
632

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

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

fat's avatar
fat committed
643
    var $container = $('<div/>').appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
644
645
646
647
648
649
650
651
652
653
654
    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')
655
    assert.strictEqual(Math.round($container.find('.tooltip').offset().left), 12)
656

Heinrich Fenkart's avatar
Heinrich Fenkart committed
657
    $target.bootstrapTooltip('hide')
658
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
659

Heinrich Fenkart's avatar
Heinrich Fenkart committed
660
661
    $container.remove()
    $styles.remove()
662
663
  })

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

Heinrich Fenkart's avatar
Heinrich Fenkart committed
672
673
674
675
676
677
678
679
680
681
682
683
684
    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')
685
    assert.strictEqual(Math.round($tooltip.offset().left), Math.round($(window).width() - 12 - $tooltip[0].offsetWidth))
686

Heinrich Fenkart's avatar
Heinrich Fenkart committed
687
    $target.bootstrapTooltip('hide')
688
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
689
690
691

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

694
  QUnit.test('should adjust the tip when up against the right of an arbitrary viewport', function (assert) {
695
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
696
697
698
699
700
    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>'
701
    var $styles = $(styles).appendTo('head')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
702
703
704
705
706
707
708
709
710
711
712

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

Heinrich Fenkart's avatar
Heinrich Fenkart committed
715
    $target.bootstrapTooltip('hide')
716
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
717

Heinrich Fenkart's avatar
Heinrich Fenkart committed
718
719
    $container.remove()
    $styles.remove()
720
  })
Chris Rebert's avatar
Chris Rebert committed
721

722
  QUnit.test('should not error when trying to show an auto-placed tooltip that has been removed from the dom', function (assert) {
723
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
724
725
726
    var passed = true
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
      .appendTo('#qunit-fixture')
Chris Rebert's avatar
Chris Rebert committed
727
      .one('show.bs.tooltip', function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
728
        $(this).remove()
Chris Rebert's avatar
Chris Rebert committed
729
730
731
732
      })
      .bootstrapTooltip({ placement: 'auto' })

    try {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
733
734
      $tooltip.bootstrapTooltip('show')
    } catch (err) {
Chris Rebert's avatar
Chris Rebert committed
735
736
737
738
      passed = false
      console.log(err)
    }

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

742
  QUnit.test('should place tooltip on top of element', function (assert) {
743
    assert.expect(1)
744
    var done = assert.async()
fat's avatar
fat committed
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774

    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 () {
775
      assert.ok(Math.round($tooltip.offset().top + $tooltip.outerHeight()) <= Math.round($trigger.offset().top))
776
      done()
fat's avatar
fat committed
777
778
779
    }, 0)
  })

780
  QUnit.test('should place tooltip inside viewport', function (assert) {
781
    assert.expect(1)
782
    var done = assert.async()
fat's avatar
fat committed
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806

    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 () {
807
      assert.ok($('.tooltip').offset().left >= 0)
808
      done()
fat's avatar
fat committed
809
810
811
    }, 0)
  })

812
  QUnit.test('should show tooltip if leave event hasn\'t occurred before delay expires', function (assert) {
813
    assert.expect(2)
814
    var done = assert.async()
fat's avatar
fat committed
815
816
817

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

    setTimeout(function () {
821
      assert.ok(!$('.tooltip').is('.fade.in'), '100ms: tooltip is not faded in')
822
    }, 100)
fat's avatar
fat committed
823
824

    setTimeout(function () {
825
      assert.ok($('.tooltip').is('.fade.in'), '200ms: tooltip is faded in')
826
      done()
827
    }, 200)
fat's avatar
fat committed
828
829
830
831

    $tooltip.trigger('mouseenter')
  })

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

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

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

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

    $tooltip.trigger('mouseenter')
  })

853
  QUnit.test('should not hide tooltip if leave event occurs and enter event occurs within the hide delay', function (assert) {
854
    assert.expect(3)
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: { show: 0, hide: 150 }})
fat's avatar
fat committed
860
861

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

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

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

    $tooltip.trigger('mouseenter')
  })

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

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

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

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

    $tooltip.trigger('mouseenter')
  })

900
  QUnit.test('should not show tooltip if leave event occurs before delay expires, even if hide delay is 0', 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: { show: 150, hide: 0 }})
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'), '250ms: tooltip not faded in')
915
      done()
916
    }, 250)
fat's avatar
fat committed
917
918
919
920

    $tooltip.trigger('mouseenter')
  })

921
  QUnit.test('should wait 200ms before hiding the tooltip', function (assert) {
922
    assert.expect(3)
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: 0, hide: 150 }})
fat's avatar
fat committed
928
929

    setTimeout(function () {
930
      assert.ok($tooltip.data('bs.tooltip').$tip.is('.fade.in'), '1ms: tooltip faded in')
fat's avatar
fat committed
931
932
933
934

      $tooltip.trigger('mouseout')

      setTimeout(function () {
935
        assert.ok($tooltip.data('bs.tooltip').$tip.is('.fade.in'), '100ms: tooltip still faded in')
936
      }, 100)
fat's avatar
fat committed
937
938

      setTimeout(function () {
939
        assert.ok(!$tooltip.data('bs.tooltip').$tip.is('.in'), '200ms: tooltip removed')
940
        done()
941
      }, 200)
fat's avatar
fat committed
942
943
944
945
946
947

    }, 0)

    $tooltip.trigger('mouseenter')
  })

948
  QUnit.test('should correctly position tooltips on SVG elements', function (assert) {
949
950
    if (!window.SVGElement) {
      // Skip IE8 since it doesn't support SVG
951
      assert.expect(0)
952
953
      return
    }
954
    assert.expect(2)
955

956
    var done = assert.async()
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976

    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()
977
        assert.ok(Math.abs(offset.left - 88) <= 1, 'tooltip has correct horizontal location')
978
        $circle.bootstrapTooltip('hide')
979
        assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
980
        done()
981
982
983
984
985
986
      })
      .bootstrapTooltip({ container: 'body', placement: 'top', trigger: 'manual' })

    $circle.bootstrapTooltip('show')
  })

987
  QUnit.test('should correctly determine auto placement based on container rather than parent', function (assert) {
988
    assert.expect(2)
989
    var done = assert.async()
990
991
992
993
994
995
996
997
998
999
1000

    var styles = '<style>'
        + '.tooltip, .tooltip *, .tooltip *:before, .tooltip *:after { box-sizing: border-box; }'
        + '.tooltip { position: absolute; display: block; font-size: 12px; line-height: 1.4; }'
        + '.tooltip .tooltip-inner { max-width: 200px; padding: 3px 8px; font-family: Helvetica; text-align: center; }'
        + '#trigger-parent {'
        + '  position: fixed;'
        + '  top: 100px;'
        + '  right: 17px;'
        + '}'
        + '</style>'
For faster browsing, not all history is shown. View entire blame