tooltip.js 21.5 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
  module('tooltip plugin')
XhmikosR's avatar
XhmikosR committed
5
6
7
8
9
10

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

11
  module('tooltip', {
XhmikosR's avatar
XhmikosR committed
12
    setup: 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()
    },
XhmikosR's avatar
XhmikosR committed
16
    teardown: function () {
17
18
19
20
21
22
23
24
25
      $.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
26
27
  test('should return element', function () {
    var div = $('<div></div>')
28
    ok(div.bootstrapTooltip() == div, 'document.body returned')
XhmikosR's avatar
XhmikosR committed
29
30
31
  })

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

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

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

XhmikosR's avatar
XhmikosR committed
45
  test('should add set set aria describedby to the element called on show', function () {
46
47
48
49
50
51
52
53
54
55
56
    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')
  })

XhmikosR's avatar
XhmikosR committed
57
  test('should remove the aria-describedby attributes on hide', function () {
58
59
60
61
62
63
64
65
66
67
68
    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')
XhmikosR's avatar
XhmikosR committed
69
70
      .bootstrapTooltip('show')
    var id = $('.tooltip').attr('id')
71

XhmikosR's avatar
XhmikosR committed
72
    ok($('#' + id).length == 1 && id.indexOf('tooltip') === 0, 'generated prefixed and unique tooltip id')
73
74
  })

XhmikosR's avatar
XhmikosR committed
75
76
77
78
  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')
XhmikosR's avatar
XhmikosR committed
79
      .bootstrapTooltip({ placement: 'bottom' })
80
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
81
82

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

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

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

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

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

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

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

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

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

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

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

  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')
189
      .bootstrapTooltip({ delay: 200 })
XhmikosR's avatar
XhmikosR committed
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207

    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')
XhmikosR's avatar
XhmikosR committed
208
      .bootstrapTooltip({ delay: { show: 200, hide: 0 }})
XhmikosR's avatar
XhmikosR committed
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226

    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')
XhmikosR's avatar
XhmikosR committed
227
      .bootstrapTooltip({ delay: { show: 0, hide: 200 }})
XhmikosR's avatar
XhmikosR committed
228
229
230
231
232
233
234
235
236
237

    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
238
        setTimeout(function () {
XhmikosR's avatar
XhmikosR committed
239
240
241
242
243
244
          ok(!$('.tooltip').is('.in'), 'tooltip removed')
          start()
        }, 150)
      }, 100)
    }, 1)
  })
Jacob Thornton's avatar
Jacob Thornton committed
245

XhmikosR's avatar
XhmikosR committed
246
247
248
  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')
XhmikosR's avatar
XhmikosR committed
249
      .bootstrapTooltip({ delay: { show: 0, hide: 200 }})
Jacob Thornton's avatar
Jacob Thornton committed
250

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

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

XhmikosR's avatar
XhmikosR committed
255
256
257
258
259
    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')
260
261
        tooltip.trigger('mouseenter')
        setTimeout(function () {
XhmikosR's avatar
XhmikosR committed
262
          ok($('.tooltip').is('.in'), 'tooltip removed')
Jacob Thornton's avatar
Jacob Thornton committed
263
          start()
XhmikosR's avatar
XhmikosR committed
264
265
266
267
268
269
270
271
        }, 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')
272
      .bootstrapTooltip({ delay: 100 })
XhmikosR's avatar
XhmikosR committed
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
    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')
288
      .bootstrapTooltip({ delay: 150 })
XhmikosR's avatar
XhmikosR committed
289
290
291
292
293
294
295
296
297
298
299
300
    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 () {
301
    var tooltip = $('<div/>').bootstrapTooltip().on('click.foo', function () {})
XhmikosR's avatar
XhmikosR committed
302
303
304
    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')
305
306
    tooltip.bootstrapTooltip('show')
    tooltip.bootstrapTooltip('destroy')
XhmikosR's avatar
XhmikosR committed
307
308
309
310
311
312
313
314
    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
315
316
317
    div.appendTo('#qunit-fixture').bootstrapTooltip({
      selector: 'a[rel="tooltip"]', trigger: 'click'
    })
XhmikosR's avatar
XhmikosR committed
318
319
320
321
322
    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
323
    $('<a href="#" rel="tooltip" title="tooltip on toggle"></a>')
XhmikosR's avatar
XhmikosR committed
324
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
325
      .bootstrapTooltip({ trigger: 'manual' })
326
      .bootstrapTooltip('toggle')
XhmikosR's avatar
XhmikosR committed
327
328
329
    ok($('.tooltip').is('.fade.in'), 'tooltip should be toggled in')
  })

330
331
332
  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')
XhmikosR's avatar
XhmikosR committed
333
      .bootstrapTooltip({ trigger: 'manual' })
334
335
336
337
338
339
340
      .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
341
342
343
  test('should place tooltips inside the body', function () {
    var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
344
      .bootstrapTooltip({ container: 'body' })
345
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
346
347
    ok($('body > .tooltip').length, 'inside the body')
    ok(!$('#qunit-fixture > .tooltip').length, 'not found in parent')
348
    tooltip.bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
349
350
351
352
  })

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

    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')
XhmikosR's avatar
XhmikosR committed
372
373
374
375
          .css({ position: 'absolute', bottom: 0, left: 0, textAlign: 'right', width: 300, height: 300 })
    var p = $('<p style="margin-top:200px" />').appendTo(container)
    var tooltiped = $('<a href="#" title="very very very very very very very long tooltip">Hover me</a>')
            .css({ marginTop: 200 })
XhmikosR's avatar
XhmikosR committed
376
            .appendTo(p)
XhmikosR's avatar
XhmikosR committed
377
            .bootstrapTooltip({ placement: 'top', animate: false })
378
            .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
379
380
381
382
383
384
385
386
387
388
389
390
391

    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 () {
392
    $('head').append('<style id="test"> .tooltip.right { white-space: nowrap; } .tooltip.right .tooltip-inner { max-width: none; } </style>')
XhmikosR's avatar
XhmikosR committed
393

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

    // 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)
XhmikosR's avatar
XhmikosR committed
404
    var topDiff = top - top2
XhmikosR's avatar
XhmikosR committed
405
    ok(topDiff <= 1 && topDiff >= -1)
406
    target.bootstrapTooltip('hide')
407
    $('head #test').remove()
XhmikosR's avatar
XhmikosR committed
408
409
410
411
412
  })

  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')
413
414
      .bootstrapTooltip({})
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
415
    equal($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title from title attribute is set')
416
    tooltip.bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
417
418
419
420
421
422
    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')
423
      .bootstrapTooltip({
XhmikosR's avatar
XhmikosR committed
424
425
        title: 'This is a tooltip with some content'
      })
426
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
427
    equal($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title is set from title attribute while prefered over title option')
428
    tooltip.bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
429
430
431
432
433
434
    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')
435
      .bootstrapTooltip({
XhmikosR's avatar
XhmikosR committed
436
437
        title: 'This is a tooltip with some content'
      })
438
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
439
    equal($('.tooltip').children('.tooltip-inner').text(), 'This is a tooltip with some content', 'title from title option is set')
440
    tooltip.bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
441
442
443
444
445
446
    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
447
448
449
450
451
452
      height: 400,
      overflow: 'hidden',
      position: 'absolute',
      top: 0,
      left: 0,
      width: 600
453
454
    })
    .appendTo('body')
XhmikosR's avatar
XhmikosR committed
455
456
457

    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')
XhmikosR's avatar
XhmikosR committed
458
      .bootstrapTooltip({ placement: 'auto' })
459
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
460

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

463
    topTooltip.bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
464
465
466

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

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

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

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

    ttContainer.remove()
  })
483

484
485
486
  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>')

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

XhmikosR's avatar
XhmikosR committed
494
    ok(Math.round(tooltip.offset().top) === 12)
495
    target.bootstrapTooltip('hide')
496
497
498
499
500
501
    $('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>')

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

XhmikosR's avatar
XhmikosR committed
509
    ok(Math.round(tooltip.offset().top) === Math.round($(window).height() - 12 - tooltip[0].offsetHeight))
510
    target.bootstrapTooltip('hide')
511
512
513
514
515
516
    $('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>')

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

XhmikosR's avatar
XhmikosR committed
524
    ok(Math.round(tooltip.offset().left) === 12)
525
    target.bootstrapTooltip('hide')
526
527
528
529
530
531
    $('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>')

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

XhmikosR's avatar
XhmikosR committed
539
    ok(Math.round(tooltip.offset().left) === Math.round($(window).width() - 12 - tooltip[0].offsetWidth))
540
    target.bootstrapTooltip('hide')
541
542
543
544
545
546
547
    $('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>')

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

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