tooltip.js 21.4 KB
Newer Older
Jacob Thornton's avatar
Jacob Thornton committed
1
2
$(function () {

3
  module('tooltip plugin')
XhmikosR's avatar
XhmikosR committed
4
5
6
7
8
9

  test('should be defined on jquery object', function () {
    var div = $('<div></div>')
    ok(div.tooltip, 'popover method is defined')
  })

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  module('tooltip', {
    setup: function() {
      // 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()
    },
    teardown: function() {
      $.fn.tooltip = $.fn.bootstrapTooltip
      delete $.fn.bootstrapTooltip
    }
  })

  test('should provide no conflict', function () {
    ok(!$.fn.tooltip, 'tooltip was set back to undefined (org value)')
  })

XhmikosR's avatar
XhmikosR committed
25
26
  test('should return element', function () {
    var div = $('<div></div>')
27
    ok(div.bootstrapTooltip() == div, 'document.body returned')
XhmikosR's avatar
XhmikosR committed
28
29
30
  })

  test('should expose default settings', function () {
31
    ok(!!$.fn.bootstrapTooltip.Constructor.DEFAULTS, 'defaults is defined')
XhmikosR's avatar
XhmikosR committed
32
33
34
  })

  test('should empty title attribute', function () {
35
    var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>').bootstrapTooltip()
XhmikosR's avatar
XhmikosR committed
36
37
38
39
    ok(tooltip.attr('title') === '', 'title attribute was emptied')
  })

  test('should add data attribute for referencing original title', function () {
40
    var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>').bootstrapTooltip()
XhmikosR's avatar
XhmikosR committed
41
42
43
    equal(tooltip.attr('data-original-title'), 'Another tooltip', 'original title preserved in data attribute')
  })

44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
  test('should add set set aria describedby to the element called on show', function() {
    var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>').bootstrapTooltip()
      .appendTo('#qunit-fixture')
      .bootstrapTooltip('show')
    ok(tooltip.attr('aria-describedby'), 'has the right attributes')
    var id = $('.tooltip').attr('id')

    ok($('#' + id).length == 1, 'has a unique id')
    ok($('.tooltip').attr('aria-describedby') === tooltip.attr('id'), 'they match!')
    ok(tooltip.attr('aria-describedby') !== undefined, 'has the right attributes')
  })

  test('should remove the aria-describedby attributes on hide', function() {
    var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>').bootstrapTooltip()
      .appendTo('#qunit-fixture')
      .bootstrapTooltip('show')
    ok(tooltip.attr('aria-describedby'), 'has the right attributes')
    tooltip.bootstrapTooltip('hide')
    ok(!tooltip.attr('aria-describedby'), 'removed the attributes on hide')
  })

  test('should assign a unique id tooltip element', function () {
    $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
      .appendTo('#qunit-fixture')
      .bootstrapTooltip('show'),
    id = $('.tooltip').attr('id')

    ok( $('#' + id).length == 1 && id.indexOf('tooltip') === 0, 'generated prefixed and unique tooltip id')
  })

XhmikosR's avatar
XhmikosR committed
74
75
76
77
  test('should place tooltips relative to placement option', function () {
    $.support.transition = false
    var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
      .appendTo('#qunit-fixture')
78
79
      .bootstrapTooltip({placement: 'bottom'})
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
80
81

    ok($('.tooltip').is('.fade.bottom.in'), 'has correct classes applied')
82
    tooltip.bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
83
84
85
86
87
88
  })

  test('should allow html entities', function () {
    $.support.transition = false
    var tooltip = $('<a href="#" rel="tooltip" title="<b>@fat</b>"></a>')
      .appendTo('#qunit-fixture')
89
90
      .bootstrapTooltip({html: true})
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
91
92

    ok($('.tooltip b').length, 'b tag was inserted')
93
    tooltip.bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
94
95
96
97
98
99
    ok(!$('.tooltip').length, 'tooltip removed')
  })

  test('should respect custom classes', function () {
    var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
      .appendTo('#qunit-fixture')
100
101
      .bootstrapTooltip({ template: '<div class="tooltip some-class"><div class="tooltip-arrow"/><div class="tooltip-inner"/></div>'})
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
102
103

    ok($('.tooltip').hasClass('some-class'), 'custom class is present')
104
    tooltip.bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
105
106
107
108
109
    ok(!$('.tooltip').length, 'tooltip removed')
  })

  test('should fire show event', function () {
    stop()
XhmikosR's avatar
XhmikosR committed
110
    $('<div title="tooltip title"></div>')
XhmikosR's avatar
XhmikosR committed
111
112
113
114
      .on('show.bs.tooltip', function () {
        ok(true, 'show was called')
        start()
      })
115
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
116
117
118
119
  })

  test('should fire shown event', function () {
    stop()
XhmikosR's avatar
XhmikosR committed
120
    $('<div title="tooltip title"></div>')
XhmikosR's avatar
XhmikosR committed
121
122
123
124
      .on('shown.bs.tooltip', function () {
        ok(true, 'shown was called')
        start()
      })
125
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
126
127
128
129
  })

  test('should not fire shown event when default prevented', function () {
    stop()
XhmikosR's avatar
XhmikosR committed
130
    $('<div title="tooltip title"></div>')
XhmikosR's avatar
XhmikosR committed
131
132
133
134
135
136
137
138
      .on('show.bs.tooltip', function (e) {
        e.preventDefault()
        ok(true, 'show was called')
        start()
      })
      .on('shown.bs.tooltip', function () {
        ok(false, 'shown was called')
      })
139
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
140
141
142
143
  })

  test('should fire hide event', function () {
    stop()
XhmikosR's avatar
XhmikosR committed
144
    $('<div title="tooltip title"></div>')
XhmikosR's avatar
XhmikosR committed
145
      .on('shown.bs.tooltip', function () {
146
        $(this).bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
147
148
149
150
151
      })
      .on('hide.bs.tooltip', function () {
        ok(true, 'hide was called')
        start()
      })
152
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
153
154
155
156
  })

  test('should fire hidden event', function () {
    stop()
XhmikosR's avatar
XhmikosR committed
157
    $('<div title="tooltip title"></div>')
XhmikosR's avatar
XhmikosR committed
158
      .on('shown.bs.tooltip', function () {
159
        $(this).bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
160
161
162
163
164
      })
      .on('hidden.bs.tooltip', function () {
        ok(true, 'hidden was called')
        start()
      })
165
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
166
167
168
169
  })

  test('should not fire hidden event when default prevented', function () {
    stop()
XhmikosR's avatar
XhmikosR committed
170
    $('<div title="tooltip title"></div>')
XhmikosR's avatar
XhmikosR committed
171
      .on('shown.bs.tooltip', function () {
172
        $(this).bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
173
174
175
176
177
178
179
180
181
      })
      .on('hide.bs.tooltip', function (e) {
        e.preventDefault()
        ok(true, 'hide was called')
        start()
      })
      .on('hidden.bs.tooltip', function () {
        ok(false, 'hidden was called')
      })
182
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
183
184
185
186
187
  })

  test('should not show tooltip if leave event occurs before delay expires', function () {
    var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
      .appendTo('#qunit-fixture')
188
      .bootstrapTooltip({ delay: 200 })
XhmikosR's avatar
XhmikosR committed
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206

    stop()

    tooltip.trigger('mouseenter')

    setTimeout(function () {
      ok(!$('.tooltip').is('.fade.in'), 'tooltip is not faded in')
      tooltip.trigger('mouseout')
      setTimeout(function () {
        ok(!$('.tooltip').is('.fade.in'), 'tooltip is not faded in')
        start()
      }, 200)
    }, 100)
  })

  test('should not show tooltip if leave event occurs before delay expires, even if hide delay is 0', function () {
    var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
      .appendTo('#qunit-fixture')
207
      .bootstrapTooltip({ delay: { show: 200, hide: 0} })
XhmikosR's avatar
XhmikosR committed
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225

    stop()

    tooltip.trigger('mouseenter')

    setTimeout(function () {
      ok(!$('.tooltip').is('.fade.in'), 'tooltip is not faded in')
      tooltip.trigger('mouseout')
      setTimeout(function () {
        ok(!$('.tooltip').is('.fade.in'), 'tooltip is not faded in')
        start()
      }, 200)
    }, 100)
  })

  test('should wait 200 ms before hiding the tooltip', 3, function () {
    var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
      .appendTo('#qunit-fixture')
226
      .bootstrapTooltip({ delay: { show: 0, hide: 200} })
XhmikosR's avatar
XhmikosR committed
227
228
229
230
231
232
233
234
235
236

    stop()

    tooltip.trigger('mouseenter')

    setTimeout(function () {
      ok($('.tooltip').is('.fade.in'), 'tooltip is faded in')
      tooltip.trigger('mouseout')
      setTimeout(function () {
        ok($('.tooltip').is('.fade.in'), '100ms:tooltip is still faded in')
Jacob Thornton's avatar
Jacob Thornton committed
237
        setTimeout(function () {
XhmikosR's avatar
XhmikosR committed
238
239
240
241
242
243
          ok(!$('.tooltip').is('.in'), 'tooltip removed')
          start()
        }, 150)
      }, 100)
    }, 1)
  })
Jacob Thornton's avatar
Jacob Thornton committed
244

XhmikosR's avatar
XhmikosR committed
245
246
247
  test('should not hide tooltip if leave event occurs, then tooltip is show immediately again', function () {
    var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
      .appendTo('#qunit-fixture')
248
      .bootstrapTooltip({ delay: { show: 0, hide: 200} })
Jacob Thornton's avatar
Jacob Thornton committed
249

XhmikosR's avatar
XhmikosR committed
250
    stop()
Jacob Thornton's avatar
Jacob Thornton committed
251

XhmikosR's avatar
XhmikosR committed
252
    tooltip.trigger('mouseenter')
Jacob Thornton's avatar
Jacob Thornton committed
253

XhmikosR's avatar
XhmikosR committed
254
255
256
257
258
    setTimeout(function () {
      ok($('.tooltip').is('.fade.in'), 'tooltip is faded in')
      tooltip.trigger('mouseout')
      setTimeout(function () {
        ok($('.tooltip').is('.fade.in'), '100ms:tooltip is still faded in')
259
260
        tooltip.trigger('mouseenter')
        setTimeout(function () {
XhmikosR's avatar
XhmikosR committed
261
          ok($('.tooltip').is('.in'), 'tooltip removed')
Jacob Thornton's avatar
Jacob Thornton committed
262
          start()
XhmikosR's avatar
XhmikosR committed
263
264
265
266
267
268
269
270
        }, 150)
      }, 100)
    }, 1)
  })

  test('should not show tooltip if leave event occurs before delay expires', function () {
    var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
      .appendTo('#qunit-fixture')
271
      .bootstrapTooltip({ delay: 100 })
XhmikosR's avatar
XhmikosR committed
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
    stop()
    tooltip.trigger('mouseenter')
    setTimeout(function () {
      ok(!$('.tooltip').is('.fade.in'), 'tooltip is not faded in')
      tooltip.trigger('mouseout')
      setTimeout(function () {
        ok(!$('.tooltip').is('.fade.in'), 'tooltip is not faded in')
        start()
      }, 100)
    }, 50)
  })

  test('should show tooltip if leave event hasn\'t occured before delay expires', function () {
    var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
      .appendTo('#qunit-fixture')
287
      .bootstrapTooltip({ delay: 150 })
XhmikosR's avatar
XhmikosR committed
288
289
290
291
292
293
294
295
296
297
298
299
    stop()
    tooltip.trigger('mouseenter')
    setTimeout(function () {
      ok(!$('.tooltip').is('.fade.in'), 'tooltip is not faded in')
    }, 100)
    setTimeout(function () {
      ok($('.tooltip').is('.fade.in'), 'tooltip has faded in')
      start()
    }, 200)
  })

  test('should destroy tooltip', function () {
300
    var tooltip = $('<div/>').bootstrapTooltip().on('click.foo', function () {})
XhmikosR's avatar
XhmikosR committed
301
302
303
    ok(tooltip.data('bs.tooltip'), 'tooltip has data')
    ok($._data(tooltip[0], 'events').mouseover && $._data(tooltip[0], 'events').mouseout, 'tooltip has hover event')
    ok($._data(tooltip[0], 'events').click[0].namespace == 'foo', 'tooltip has extra click.foo event')
304
305
    tooltip.bootstrapTooltip('show')
    tooltip.bootstrapTooltip('destroy')
XhmikosR's avatar
XhmikosR committed
306
307
308
309
310
311
312
313
    ok(!tooltip.hasClass('in'), 'tooltip is hidden')
    ok(!$._data(tooltip[0], 'bs.tooltip'), 'tooltip does not have data')
    ok($._data(tooltip[0], 'events').click[0].namespace == 'foo', 'tooltip still has click.foo')
    ok(!$._data(tooltip[0], 'events').mouseover && !$._data(tooltip[0], 'events').mouseout, 'tooltip does not have any events')
  })

  test('should show tooltip with delegate selector on click', function () {
    var div = $('<div><a href="#" rel="tooltip" title="Another tooltip"></a></div>')
XhmikosR's avatar
XhmikosR committed
314
    div.appendTo('#qunit-fixture')
315
                     .bootstrapTooltip({ selector: 'a[rel="tooltip"]', trigger: 'click' })
XhmikosR's avatar
XhmikosR committed
316
317
318
319
320
    div.find('a').trigger('click')
    ok($('.tooltip').is('.fade.in'), 'tooltip is faded in')
  })

  test('should show tooltip when toggle is called', function () {
XhmikosR's avatar
XhmikosR committed
321
    $('<a href="#" rel="tooltip" title="tooltip on toggle"></a>')
XhmikosR's avatar
XhmikosR committed
322
      .appendTo('#qunit-fixture')
323
324
      .bootstrapTooltip({trigger: 'manual'})
      .bootstrapTooltip('toggle')
XhmikosR's avatar
XhmikosR committed
325
326
327
    ok($('.tooltip').is('.fade.in'), 'tooltip should be toggled in')
  })

328
329
330
331
332
333
334
335
336
337
338
  test('should hide shown tooltip when toggle is called on tooltip', function () {
    var tooltip = $('<a href="#" rel="tooltip" title="tooltip on toggle">@ResentedHook</a>')
      .appendTo('#qunit-fixture')
      .bootstrapTooltip({trigger: 'manual'})
      .bootstrapTooltip('toggle')
    $('.tooltip', '#qunit-fixture').bootstrapTooltip('toggle')
    ok($('.tooltip').not('.fade.in'), 'tooltip should be toggled out')
    tooltip.bootstrapTooltip('hide')
    $('#qunit-fixture').empty()
  })

XhmikosR's avatar
XhmikosR committed
339
340
341
  test('should place tooltips inside the body', function () {
    var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
      .appendTo('#qunit-fixture')
342
343
      .bootstrapTooltip({container: 'body'})
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
344
345
    ok($('body > .tooltip').length, 'inside the body')
    ok(!$('#qunit-fixture > .tooltip').length, 'not found in parent')
346
    tooltip.bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
347
348
349
350
  })

  test('should place tooltip inside window', function () {
    var container = $('<div />').appendTo('body')
XhmikosR's avatar
XhmikosR committed
351
352
        .css({position: 'absolute', width: 200, height: 200, bottom: 0, left: 0})
    $('<a href="#" title="Very very very very very very very very long tooltip">Hover me</a>')
XhmikosR's avatar
XhmikosR committed
353
354
      .css({position: 'absolute', top: 0, left: 0})
      .appendTo(container)
355
356
      .bootstrapTooltip({placement: 'top', animate: false})
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374

    stop()

    setTimeout(function () {
      ok($('.tooltip').offset().left >= 0)

      start()
      container.remove()
    }, 100)
  })

  test('should place tooltip on top of element', function () {
    var container = $('<div />').appendTo('body')
          .css({position: 'absolute', bottom: 0, left: 0, textAlign: 'right', width: 300, height: 300}),
          p = $('<p style="margin-top:200px" />').appendTo(container),
          tooltiped = $('<a href="#" title="very very very very very very very long tooltip">Hover me</a>')
            .css({marginTop: 200})
            .appendTo(p)
375
376
            .bootstrapTooltip({placement: 'top', animate: false})
            .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
377
378
379
380
381
382
383
384
385
386
387
388
389

    stop()

    setTimeout(function () {
      var tooltip = container.find('.tooltip')

      start()
      ok(Math.round(tooltip.offset().top + tooltip.outerHeight()) <= Math.round(tooltiped.offset().top))
      container.remove()
    }, 100)
  })

  test('should add position class before positioning so that position-specific styles are taken into account', function () {
390
    $('head').append('<style id="test"> .tooltip.right { white-space: nowrap; } .tooltip.right .tooltip-inner { max-width: none; } </style>')
XhmikosR's avatar
XhmikosR committed
391
392
393

    var container = $('<div />').appendTo('body'),
        target = $('<a href="#" rel="tooltip" title="very very very very very very very very long tooltip in one line"></a>')
394
          .appendTo(container)
395
396
          .bootstrapTooltip({placement: 'right', viewport: null})
          .bootstrapTooltip('show'),
XhmikosR's avatar
XhmikosR committed
397
398
399
400
401
402
403
        tooltip = container.find('.tooltip')

    // this is some dumb hack shit because sub pixels in firefox
    var top = Math.round(target.offset().top + (target[0].offsetHeight / 2) - (tooltip[0].offsetHeight / 2))
    var top2 = Math.round(tooltip.offset().top)
    var topDiff =  top - top2
    ok(topDiff <= 1 && topDiff >= -1)
404
    target.bootstrapTooltip('hide')
405
    $('head #test').remove()
XhmikosR's avatar
XhmikosR committed
406
407
408
409
410
  })

  test('tooltip title test #1', function () {
    var tooltip = $('<a href="#" rel="tooltip" title="Simple tooltip" style="display: inline-block; position: absolute; top: 0; left: 0;"></a>')
      .appendTo('#qunit-fixture')
411
412
      .bootstrapTooltip({})
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
413
    equal($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title from title attribute is set')
414
    tooltip.bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
415
416
417
418
419
420
    ok(!$('.tooltip').length, 'tooltip removed')
  })

  test('tooltip title test #2', function () {
    var tooltip = $('<a href="#" rel="tooltip" title="Simple tooltip" style="display: inline-block; position: absolute; top: 0; left: 0;"></a>')
      .appendTo('#qunit-fixture')
421
      .bootstrapTooltip({
XhmikosR's avatar
XhmikosR committed
422
423
        title: 'This is a tooltip with some content'
      })
424
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
425
    equal($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title is set from title attribute while prefered over title option')
426
    tooltip.bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
427
428
429
430
431
432
    ok(!$('.tooltip').length, 'tooltip removed')
  })

  test('tooltip title test #3', function () {
    var tooltip = $('<a href="#" rel="tooltip" style="display: inline-block; position: absolute; top: 0; left: 0;"></a>')
      .appendTo('#qunit-fixture')
433
      .bootstrapTooltip({
XhmikosR's avatar
XhmikosR committed
434
435
        title: 'This is a tooltip with some content'
      })
436
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
437
    equal($('.tooltip').children('.tooltip-inner').text(), 'This is a tooltip with some content', 'title from title option is set')
438
    tooltip.bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
439
440
441
442
443
444
    ok(!$('.tooltip').length, 'tooltip removed')
  })

  test('tooltips should be placed dynamically, with the dynamic placement option', function () {
    $.support.transition = false
    var ttContainer = $('<div id="dynamic-tt-test"/>').css({
XhmikosR's avatar
XhmikosR committed
445
446
447
448
449
450
      height : 400,
      overflow : 'hidden',
      position : 'absolute',
      top : 0,
      left : 0,
      width : 600
451
452
    })
    .appendTo('body')
XhmikosR's avatar
XhmikosR committed
453
454
455

    var topTooltip = $('<div style="display: inline-block; position: absolute; left: 0; top: 0;" rel="tooltip" title="Top tooltip">Top Dynamic Tooltip</div>')
      .appendTo('#dynamic-tt-test')
456
457
      .bootstrapTooltip({placement: 'auto'})
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
458

459
    ok($('.tooltip').is('.bottom'), 'top positioned tooltip is dynamically positioned bottom')
XhmikosR's avatar
XhmikosR committed
460

461
    topTooltip.bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
462
463
464

    var rightTooltip = $('<div style="display: inline-block; position: absolute; right: 0;" rel="tooltip" title="Right tooltip">Right Dynamic Tooltip</div>')
      .appendTo('#dynamic-tt-test')
465
466
      .bootstrapTooltip({placement: 'right auto'})
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
467

468
    ok($('.tooltip').is('.left'), 'right positioned tooltip is dynamically positioned left')
469
    rightTooltip.bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
470
471
472

    var leftTooltip = $('<div style="display: inline-block; position: absolute; left: 0;" rel="tooltip" title="Left tooltip">Left Dynamic Tooltip</div>')
      .appendTo('#dynamic-tt-test')
473
474
      .bootstrapTooltip({placement: 'auto left'})
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
475

476
    ok($('.tooltip').is('.right'), 'left positioned tooltip is dynamically positioned right')
477
    leftTooltip.bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
478
479
480

    ttContainer.remove()
  })
481

482
483
484
485
486
487
  test('should adjust the tip\'s top when up against the top of the viewport', function () {
    $('head').append('<style id="test"> .tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; } </style>')

    var container = $('<div />').appendTo('body'),
      target = $('<a href="#" rel="tooltip" title="tip" style="position: fixed; top: 0px; left: 0px;"></a>')
          .appendTo(container)
488
489
          .bootstrapTooltip({placement: 'right', viewport: {selector: 'body', padding: 12}})
          .bootstrapTooltip('show'),
490
491
492
      tooltip = container.find('.tooltip')

    ok( Math.round(tooltip.offset().top) === 12 )
493
    target.bootstrapTooltip('hide')
494
495
496
497
498
499
500
501
502
    $('head #test').remove()
  })

  test('should adjust the tip\'s top when up against the bottom of the viewport', function () {
    $('head').append('<style id="test"> .tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; } </style>')

    var container = $('<div />').appendTo('body'),
      target = $('<a href="#" rel="tooltip" title="tip" style="position: fixed; bottom: 0px; left: 0px;"></a>')
          .appendTo(container)
503
504
          .bootstrapTooltip({placement: 'right', viewport: {selector: 'body', padding: 12}})
          .bootstrapTooltip('show'),
505
506
507
      tooltip = container.find('.tooltip')

    ok( Math.round(tooltip.offset().top) === Math.round($(window).height() - 12 - tooltip[0].offsetHeight) )
508
    target.bootstrapTooltip('hide')
509
510
511
512
513
514
515
516
517
    $('head #test').remove()
  })

  test('should adjust the tip\'s left when up against the left of the viewport', function () {
    $('head').append('<style id="test"> .tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; } </style>')

    var container = $('<div />').appendTo('body'),
      target = $('<a href="#" rel="tooltip" title="tip" style="position: fixed; top: 0px; left: 0px;"></a>')
          .appendTo(container)
518
519
          .bootstrapTooltip({placement: 'bottom', viewport: {selector: 'body', padding: 12}})
          .bootstrapTooltip('show'),
520
521
522
      tooltip = container.find('.tooltip')

    ok( Math.round(tooltip.offset().left) === 12 )
523
    target.bootstrapTooltip('hide')
524
525
526
527
528
529
530
531
532
    $('head #test').remove()
  })

  test('should adjust the tip\'s left when up against the right of the viewport', function () {
    $('head').append('<style id="test"> .tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; } </style>')

    var container = $('<div />').appendTo('body'),
      target = $('<a href="#" rel="tooltip" title="tip" style="position: fixed; top: 0px; right: 0px;"></a>')
          .appendTo(container)
533
534
          .bootstrapTooltip({placement: 'bottom', viewport: {selector: 'body', padding: 12}})
          .bootstrapTooltip('show'),
535
536
537
      tooltip = container.find('.tooltip')

    ok( Math.round(tooltip.offset().left) === Math.round($(window).width() - 12 - tooltip[0].offsetWidth) )
538
    target.bootstrapTooltip('hide')
539
540
541
542
543
544
545
546
547
548
    $('head #test').remove()
  })

  test('should adjust the tip when up against the right of an arbitrary viewport', function () {
    $('head').append('<style id="test"> .tooltip, .tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; } </style>')
    $('head').append('<style id="viewport-style"> .container-viewport { position: absolute; top: 50px; left: 60px; width: 300px; height: 300px; } </style>')

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

    ok( Math.round(tooltip.offset().left) === Math.round(60 + container.width() - tooltip[0].offsetWidth) )
554
    target.bootstrapTooltip('hide')
555
556
557
    $('head #test').remove()
    $('head #viewport-style').remove()
  })
558
})