tooltip.js 30.5 KB
Newer Older
Jacob Thornton's avatar
Jacob Thornton committed
1
$(function () {
2
  'use strict'
Jacob Thornton's avatar
Jacob Thornton committed
3

fat's avatar
fat committed
4
  QUnit.module('tooltip plugin')
XhmikosR's avatar
XhmikosR committed
5

fat's avatar
fat committed
6
7
8
  QUnit.test('should be defined on jquery object', function (assert) {
    assert.expect(1)
    assert.ok($(document.body).tooltip, 'tooltip method is defined')
XhmikosR's avatar
XhmikosR committed
9
10
  })

fat's avatar
fat committed
11
12
  QUnit.module('tooltip', {
    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()
    },
fat's avatar
fat committed
16
    afterEach: function () {
17
18
      $.fn.tooltip = $.fn.bootstrapTooltip
      delete $.fn.bootstrapTooltip
19
      $('.tooltip').remove()
20
21
22
    }
  })

fat's avatar
fat committed
23
24
  QUnit.test('should provide no conflict', function (assert) {
    assert.expect(1)
XhmikosR's avatar
XhmikosR committed
25
    assert.strictEqual(typeof $.fn.tooltip, 'undefined', 'tooltip was set back to undefined (org value)')
26
27
  })

28
29
30
31
32
33
  QUnit.test('should throw explicit error on undefined method', function (assert) {
    assert.expect(1)
    var $el = $('<div/>')
    $el.bootstrapTooltip()
    try {
      $el.bootstrapTooltip('noMethod')
XhmikosR's avatar
XhmikosR committed
34
    } catch (err) {
35
36
37
38
      assert.strictEqual(err.message, 'No method named "noMethod"')
    }
  })

fat's avatar
fat committed
39
40
  QUnit.test('should return jquery collection containing the element', function (assert) {
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
41
42
    var $el = $('<div/>')
    var $tooltip = $el.bootstrapTooltip()
fat's avatar
fat committed
43
44
    assert.ok($tooltip instanceof $, 'returns jquery collection')
    assert.strictEqual($tooltip[0], $el[0], 'collection contains element')
XhmikosR's avatar
XhmikosR committed
45
46
  })

fat's avatar
fat committed
47
48
  QUnit.test('should expose default settings', function (assert) {
    assert.expect(1)
49
    assert.ok($.fn.bootstrapTooltip.Constructor.Default, 'defaults is defined')
XhmikosR's avatar
XhmikosR committed
50
51
  })

fat's avatar
fat committed
52
53
  QUnit.test('should empty title attribute', function (assert) {
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
54
    var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>').bootstrapTooltip()
fat's avatar
fat committed
55
    assert.strictEqual($trigger.attr('title'), '', 'title attribute was emptied')
XhmikosR's avatar
XhmikosR committed
56
57
  })

fat's avatar
fat committed
58
59
  QUnit.test('should add data attribute for referencing original title', function (assert) {
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
60
    var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>').bootstrapTooltip()
fat's avatar
fat committed
61
    assert.strictEqual($trigger.attr('data-original-title'), 'Another tooltip', 'original title preserved in data attribute')
XhmikosR's avatar
XhmikosR committed
62
63
  })

fat's avatar
fat committed
64
65
66
  QUnit.test('should add aria-describedby to the trigger on show', function (assert) {
    assert.expect(3)
    var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
67
      .bootstrapTooltip()
68
69
      .appendTo('#qunit-fixture')
      .bootstrapTooltip('show')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
70

71
72
    var id = $('.tooltip').attr('id')

fat's avatar
fat committed
73
74
75
    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')
76
77
  })

fat's avatar
fat committed
78
79
  QUnit.test('should remove aria-describedby from trigger on hide', function (assert) {
    assert.expect(2)
80
    var done = assert.async()
fat's avatar
fat committed
81
    var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
82
      .bootstrapTooltip()
83
      .appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
84

85
86
87
88
89
90
91
92
93
94
    $trigger
      .one('shown.bs.tooltip', function () {
        assert.ok($trigger[0].hasAttribute('aria-describedby'), 'trigger has aria-describedby')
        $trigger.bootstrapTooltip('hide')
      })
      .one('hidden.bs.tooltip', function () {
        assert.ok(!$trigger[0].hasAttribute('aria-describedby'), 'trigger does not have aria-describedby')
        done()
      })
      .bootstrapTooltip('show')
95
96
  })

fat's avatar
fat committed
97
98
99
  QUnit.test('should assign a unique id tooltip element', function (assert) {
    assert.expect(2)
    $('<a href="#" rel="tooltip" title="Another tooltip"/>')
100
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
101
      .bootstrapTooltip('show')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
102

XhmikosR's avatar
XhmikosR committed
103
    var id = $('.tooltip').attr('id')
104

fat's avatar
fat committed
105
106
    assert.strictEqual($('#' + id).length, 1, 'tooltip has unique id')
    assert.strictEqual(id.indexOf('tooltip'), 0, 'tooltip id has prefix')
107
108
  })

fat's avatar
fat committed
109
  QUnit.test('should place tooltips relative to placement option', function (assert) {
fat's avatar
fat committed
110
    assert.expect(2)
111
    var done = assert.async()
fat's avatar
fat committed
112
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
XhmikosR's avatar
XhmikosR committed
113
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
114
115
116
      .bootstrapTooltip({
        placement: 'bottom'
      })
XhmikosR's avatar
XhmikosR committed
117

118
119
120
121
    $tooltip
      .one('shown.bs.tooltip', function () {
        assert.ok($('.tooltip')
          .is('.fade.bs-tooltip-bottom.show'), 'has correct classes applied')
122

123
124
125
126
127
128
129
        $tooltip.bootstrapTooltip('hide')
      })
      .one('hidden.bs.tooltip', function () {
        assert.strictEqual($tooltip.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
        done()
      })
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
130
131
  })

fat's avatar
fat committed
132
133
  QUnit.test('should allow html entities', function (assert) {
    assert.expect(2)
134
    var done = assert.async()
fat's avatar
fat committed
135
    var $tooltip = $('<a href="#" rel="tooltip" title="&lt;b&gt;@fat&lt;/b&gt;"/>')
XhmikosR's avatar
XhmikosR committed
136
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
137
138
139
      .bootstrapTooltip({
        html: true
      })
XhmikosR's avatar
XhmikosR committed
140

141
142
143
144
145
146
147
148
149
150
    $tooltip
      .one('shown.bs.tooltip', function () {
        assert.notEqual($('.tooltip b').length, 0, 'b tag was inserted')
        $tooltip.bootstrapTooltip('hide')
      })
      .one('hidden.bs.tooltip', function () {
        assert.strictEqual($tooltip.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
        done()
      })
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
151
152
  })

153
154
  QUnit.test('should allow DOMElement title (html: false)', function (assert) {
    assert.expect(3)
155
    var done = assert.async()
156
157
158
    var title = document.createTextNode('<3 writing tests')
    var $tooltip = $('<a href="#" rel="tooltip"/>')
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
159
160
161
      .bootstrapTooltip({
        title: title
      })
162

163
164
165
166
167
168
169
170
    $tooltip
      .one('shown.bs.tooltip', function () {
        assert.notEqual($('.tooltip').length, 0, 'tooltip inserted')
        assert.strictEqual($('.tooltip').text(), '<3 writing tests', 'title inserted')
        assert.ok(!$.contains($('.tooltip').get(0), title), 'title node copied, not moved')
        done()
      })
      .bootstrapTooltip('show')
171
172
173
174
  })

  QUnit.test('should allow DOMElement title (html: true)', function (assert) {
    assert.expect(3)
175
    var done = assert.async()
176
177
178
    var title = document.createTextNode('<3 writing tests')
    var $tooltip = $('<a href="#" rel="tooltip"/>')
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
179
180
181
182
      .bootstrapTooltip({
        html: true,
        title: title
      })
183

184
185
186
187
188
189
190
191
    $tooltip
      .one('shown.bs.tooltip', function () {
        assert.notEqual($('.tooltip').length, 0, 'tooltip inserted')
        assert.strictEqual($('.tooltip').text(), '<3 writing tests', 'title inserted')
        assert.ok($.contains($('.tooltip').get(0), title), 'title node moved, not copied')
        done()
      })
      .bootstrapTooltip('show')
192
193
  })

fat's avatar
fat committed
194
195
  QUnit.test('should respect custom classes', function (assert) {
    assert.expect(2)
196
    var done = assert.async()
fat's avatar
fat committed
197
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
XhmikosR's avatar
XhmikosR committed
198
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
199
200
201
      .bootstrapTooltip({
        template: '<div class="tooltip some-class"><div class="tooltip-arrow"/><div class="tooltip-inner"/></div>'
      })
XhmikosR's avatar
XhmikosR committed
202

203
204
205
206
207
208
209
210
211
212
    $tooltip
      .one('shown.bs.tooltip', function () {
        assert.ok($('.tooltip').hasClass('some-class'), 'custom class is present')
        $tooltip.bootstrapTooltip('hide')
      })
      .one('hidden.bs.tooltip', function () {
        assert.strictEqual($tooltip.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
        done()
      })
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
213
214
  })

fat's avatar
fat committed
215
216
  QUnit.test('should fire show event', function (assert) {
    assert.expect(1)
217
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
218

fat's avatar
fat committed
219
    $('<div title="tooltip title"/>')
XhmikosR's avatar
XhmikosR committed
220
      .on('show.bs.tooltip', function () {
fat's avatar
fat committed
221
        assert.ok(true, 'show event fired')
222
        done()
XhmikosR's avatar
XhmikosR committed
223
      })
224
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
225
226
  })

227
228
229
230
231
232
  QUnit.test('should throw an error when show is called on hidden elements', function (assert) {
    assert.expect(1)
    var done = assert.async()

    try {
      $('<div title="tooltip title" style="display: none"/>').bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
233
    } catch (err) {
234
235
236
237
238
      assert.strictEqual(err.message, 'Please use show on visible elements')
      done()
    }
  })

fat's avatar
fat committed
239
240
  QUnit.test('should fire inserted event', function (assert) {
    assert.expect(2)
241
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
242

fat's avatar
fat committed
243
    $('<div title="tooltip title"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
244
      .appendTo('#qunit-fixture')
fat's avatar
fat committed
245
246
247
      .on('inserted.bs.tooltip', function () {
        assert.notEqual($('.tooltip').length, 0, 'tooltip was inserted')
        assert.ok(true, 'inserted event fired')
248
        done()
XhmikosR's avatar
XhmikosR committed
249
      })
250
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
251
252
  })

fat's avatar
fat committed
253
254
  QUnit.test('should fire shown event', function (assert) {
    assert.expect(1)
255
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
256

fat's avatar
fat committed
257
    $('<div title="tooltip title"></div>')
258
      .appendTo('#qunit-fixture')
fat's avatar
fat committed
259
260
261
262
263
264
265
266
267
268
269
270
      .on('shown.bs.tooltip', function () {
        assert.ok(true, 'shown was called')
        done()
      })
      .bootstrapTooltip('show')
  })

  QUnit.test('should not fire shown event when show was prevented', function (assert) {
    assert.expect(1)
    var done = assert.async()

    $('<div title="tooltip title"/>')
XhmikosR's avatar
XhmikosR committed
271
272
      .on('show.bs.tooltip', function (e) {
        e.preventDefault()
fat's avatar
fat committed
273
        assert.ok(true, 'show event fired')
274
        done()
XhmikosR's avatar
XhmikosR committed
275
276
      })
      .on('shown.bs.tooltip', function () {
fat's avatar
fat committed
277
        assert.ok(false, 'shown event fired')
XhmikosR's avatar
XhmikosR committed
278
      })
279
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
280
281
  })

fat's avatar
fat committed
282
283
  QUnit.test('should fire hide event', function (assert) {
    assert.expect(1)
284
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
285

fat's avatar
fat committed
286
    $('<div title="tooltip title"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
287
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
288
      .on('shown.bs.tooltip', function () {
289
        $(this).bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
290
291
      })
      .on('hide.bs.tooltip', function () {
fat's avatar
fat committed
292
        assert.ok(true, 'hide event fired')
293
        done()
XhmikosR's avatar
XhmikosR committed
294
      })
295
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
296
297
  })

fat's avatar
fat committed
298
299
  QUnit.test('should fire hidden event', function (assert) {
    assert.expect(1)
300
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
301

fat's avatar
fat committed
302
    $('<div title="tooltip title"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
303
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
304
      .on('shown.bs.tooltip', function () {
305
        $(this).bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
306
307
      })
      .on('hidden.bs.tooltip', function () {
fat's avatar
fat committed
308
        assert.ok(true, 'hidden event fired')
309
        done()
XhmikosR's avatar
XhmikosR committed
310
      })
311
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
312
313
  })

fat's avatar
fat committed
314
315
  QUnit.test('should not fire hidden event when hide was prevented', function (assert) {
    assert.expect(1)
316
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
317

fat's avatar
fat committed
318
    $('<div title="tooltip title"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
319
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
320
      .on('shown.bs.tooltip', function () {
321
        $(this).bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
322
323
324
      })
      .on('hide.bs.tooltip', function (e) {
        e.preventDefault()
fat's avatar
fat committed
325
        assert.ok(true, 'hide event fired')
326
        done()
XhmikosR's avatar
XhmikosR committed
327
328
      })
      .on('hidden.bs.tooltip', function () {
fat's avatar
fat committed
329
        assert.ok(false, 'hidden event fired')
XhmikosR's avatar
XhmikosR committed
330
      })
331
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
332
333
  })

fat's avatar
fat committed
334
335
336
  QUnit.test('should destroy tooltip', function (assert) {
    assert.expect(7)
    var $tooltip = $('<div/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
337
      .bootstrapTooltip()
XhmikosR's avatar
XhmikosR committed
338
      .on('click.foo', function () {})  // eslint-disable-line no-empty-function
Heinrich Fenkart's avatar
Heinrich Fenkart committed
339

fat's avatar
fat committed
340
341
342
    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')
    assert.strictEqual($._data($tooltip[0], 'events').click[0].namespace, 'foo', 'tooltip has extra click.foo event')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
343
344

    $tooltip.bootstrapTooltip('show')
fat's avatar
fat committed
345
    $tooltip.bootstrapTooltip('dispose')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
346

Starsam80's avatar
Starsam80 committed
347
    assert.ok(!$tooltip.hasClass('show'), 'tooltip is hidden')
fat's avatar
fat committed
348
349
350
    assert.ok(!$._data($tooltip[0], 'bs.tooltip'), 'tooltip does not have data')
    assert.strictEqual($._data($tooltip[0], 'events').click[0].namespace, 'foo', 'tooltip still has click.foo')
    assert.ok(!$._data($tooltip[0], 'events').mouseover && !$._data($tooltip[0], 'events').mouseout, 'tooltip does not have hover events')
XhmikosR's avatar
XhmikosR committed
351
352
  })

353
354
355
356
357
358
359
360
  // QUnit.test('should show tooltip with delegate selector on click', function (assert) {
  //   assert.expect(2)
  //   var $div = $('<div><a href="#" rel="tooltip" title="Another tooltip"/></div>')
  //     .appendTo('#qunit-fixture')
  //     .bootstrapTooltip({
  //       selector: 'a[rel="tooltip"]',
  //       trigger: 'click'
  //     })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
361

362
363
  //   $div.find('a').trigger('click')
  //   assert.ok($('.tooltip').is('.fade.in'), 'tooltip is faded in')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
364

365
366
367
  //   $div.find('a').trigger('click')
  //   assert.strictEqual($div.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
  // })
XhmikosR's avatar
XhmikosR committed
368

fat's avatar
fat committed
369
370
371
  QUnit.test('should show tooltip when toggle is called', function (assert) {
    assert.expect(1)
    $('<a href="#" rel="tooltip" title="tooltip on toggle"/>')
XhmikosR's avatar
XhmikosR committed
372
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
373
374
375
      .bootstrapTooltip({
        trigger: 'manual'
      })
376
      .bootstrapTooltip('toggle')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
377

Starsam80's avatar
Starsam80 committed
378
    assert.ok($('.tooltip').is('.fade.show'), 'tooltip is faded active')
XhmikosR's avatar
XhmikosR committed
379
380
  })

fat's avatar
fat committed
381
382
  QUnit.test('should hide previously shown tooltip when toggle is called on tooltip', function (assert) {
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
383
    $('<a href="#" rel="tooltip" title="tooltip on toggle">@ResentedHook</a>')
384
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
385
386
387
      .bootstrapTooltip({
        trigger: 'manual'
      })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
388
389
390
      .bootstrapTooltip('show')

    $('.tooltip').bootstrapTooltip('toggle')
Starsam80's avatar
Starsam80 committed
391
    assert.ok($('.tooltip').not('.fade.show'), 'tooltip was faded out')
392
393
  })

fat's avatar
fat committed
394
395
  QUnit.test('should place tooltips inside body when container is body', function (assert) {
    assert.expect(3)
396
    var done = assert.async()
fat's avatar
fat committed
397
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
XhmikosR's avatar
XhmikosR committed
398
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
399
400
401
      .bootstrapTooltip({
        container: 'body'
      })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
402

403
404
405
406
407
408
409
410
411
412
413
    $tooltip
      .one('shown.bs.tooltip', function () {
        assert.notEqual($('body > .tooltip').length, 0, 'tooltip is direct descendant of body')
        assert.strictEqual($('#qunit-fixture > .tooltip').length, 0, 'tooltip is not in parent')
        $tooltip.bootstrapTooltip('hide')
      })
      .one('hidden.bs.tooltip', function () {
        assert.strictEqual($('body > .tooltip').length, 0, 'tooltip was removed from dom')
        done()
      })
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
414
415
  })

fat's avatar
fat committed
416
  QUnit.test('should add position class before positioning so that position-specific styles are taken into account', function (assert) {
Johann-S's avatar
Johann-S committed
417
418
    assert.expect(2)
    var done = assert.async()
XhmikosR's avatar
XhmikosR committed
419
420
421
422
    var styles = '<style>' +
      '.bs-tooltip-right { white-space: nowrap; }' +
      '.bs-tooltip-right .tooltip-inner { max-width: none; }' +
      '</style>'
423
    var $styles = $(styles).appendTo('head')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
424

fat's avatar
fat committed
425
    var $container = $('<div/>').appendTo('#qunit-fixture')
Johann-S's avatar
Johann-S committed
426
    $('<a href="#" rel="tooltip" title="very very very very very very very very long tooltip in one line"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
427
428
      .appendTo($container)
      .bootstrapTooltip({
Johann-S's avatar
Johann-S committed
429
430
431
432
433
434
        placement: 'right',
        trigger: 'manual'
      })
      .on('inserted.bs.tooltip', function () {
        var $tooltip = $($(this).data('bs.tooltip').tip)
        assert.ok($tooltip.hasClass('bs-tooltip-right'))
XhmikosR's avatar
XhmikosR committed
435
        assert.ok(typeof $tooltip.attr('style') === 'undefined')
Johann-S's avatar
Johann-S committed
436
437
        $styles.remove()
        done()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
438
439
      })
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
440
441
  })

fat's avatar
fat committed
442
443
  QUnit.test('should use title attribute for tooltip text', function (assert) {
    assert.expect(2)
444
    var done = assert.async()
fat's avatar
fat committed
445
    var $tooltip = $('<a href="#" rel="tooltip" title="Simple tooltip"/>')
XhmikosR's avatar
XhmikosR committed
446
      .appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
447
448
      .bootstrapTooltip()

449
450
451
452
453
454
455
456
457
458
    $tooltip
      .one('shown.bs.tooltip', function () {
        assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title from title attribute is set')
        $tooltip.bootstrapTooltip('hide')
      })
      .one('hidden.bs.tooltip', function () {
        assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
        done()
      })
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
459
460
  })

fat's avatar
fat committed
461
462
  QUnit.test('should prefer title attribute over title option', function (assert) {
    assert.expect(2)
463
    var done = assert.async()
fat's avatar
fat committed
464
    var $tooltip = $('<a href="#" rel="tooltip" title="Simple tooltip"/>')
XhmikosR's avatar
XhmikosR committed
465
      .appendTo('#qunit-fixture')
466
      .bootstrapTooltip({
XhmikosR's avatar
XhmikosR committed
467
468
        title: 'This is a tooltip with some content'
      })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
469

470
471
472
473
474
475
476
477
478
479
    $tooltip
      .one('shown.bs.tooltip', function () {
        assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title is set from title attribute while preferred over title option')
        $tooltip.bootstrapTooltip('hide')
      })
      .one('hidden.bs.tooltip', function () {
        assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
        done()
      })
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
480
481
  })

fat's avatar
fat committed
482
483
  QUnit.test('should use title option', function (assert) {
    assert.expect(2)
484
    var done = assert.async()
fat's avatar
fat committed
485
    var $tooltip = $('<a href="#" rel="tooltip"/>')
XhmikosR's avatar
XhmikosR committed
486
      .appendTo('#qunit-fixture')
487
      .bootstrapTooltip({
XhmikosR's avatar
XhmikosR committed
488
489
        title: 'This is a tooltip with some content'
      })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
490

491
492
493
494
495
496
497
498
499
500
    $tooltip
      .one('shown.bs.tooltip', function () {
        assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'This is a tooltip with some content', 'title from title option is set')
        $tooltip.bootstrapTooltip('hide')
      })
      .one('hidden.bs.tooltip', function () {
        assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
        done()
      })
      .bootstrapTooltip('show')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
501
502
  })

503
  QUnit.test('should not error when trying to show an top-placed tooltip that has been removed from the dom', function (assert) {
fat's avatar
fat committed
504
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
505
    var passed = true
fat's avatar
fat committed
506
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
507
      .appendTo('#qunit-fixture')
Chris Rebert's avatar
Chris Rebert committed
508
      .one('show.bs.tooltip', function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
509
        $(this).remove()
Chris Rebert's avatar
Chris Rebert committed
510
      })
XhmikosR's avatar
XhmikosR committed
511
512
513
      .bootstrapTooltip({
        placement: 'top'
      })
Chris Rebert's avatar
Chris Rebert committed
514
515

    try {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
516
517
      $tooltip.bootstrapTooltip('show')
    } catch (err) {
Chris Rebert's avatar
Chris Rebert committed
518
519
520
521
      passed = false
      console.log(err)
    }

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

fat's avatar
fat committed
525
526
  QUnit.test('should place tooltip on top of element', function (assert) {
    assert.expect(1)
527
    var done = assert.async()
fat's avatar
fat committed
528

XhmikosR's avatar
XhmikosR committed
529
530
531
532
533
    var containerHTML = '<div id="test">' +
        '<p style="margin-top: 200px">' +
        '<a href="#" title="very very very very very very very long tooltip">Hover me</a>' +
        '</p>' +
        '</div>'
fat's avatar
fat committed
534
535
536
537
538
539
540
541
542
543
544
545

    var $container = $(containerHTML)
      .css({
        position: 'absolute',
        bottom: 0,
        left: 0,
        textAlign: 'right',
        width: 300,
        height: 300
      })
      .appendTo('#qunit-fixture')

546
    $container
fat's avatar
fat committed
547
548
549
      .find('a')
      .css('margin-top', 200)
      .bootstrapTooltip({
fat's avatar
fat committed
550
        placement: 'top',
fat's avatar
fat committed
551
552
        animate: false
      })
553
554
      .on('shown.bs.tooltip', function () {
        var $tooltip = $($(this).data('bs.tooltip').tip)
Johann-S's avatar
Johann-S committed
555
556
        if (/iPhone|iPad|iPod/.test(navigator.userAgent)) {
          assert.ok(Math.round($tooltip.offset().top + $tooltip.outerHeight()) <= Math.round($(this).offset().top))
XhmikosR's avatar
XhmikosR committed
557
        } else {
Johann-S's avatar
Johann-S committed
558
559
          assert.ok(Math.round($tooltip.offset().top + $tooltip.outerHeight()) >= Math.round($(this).offset().top))
        }
560
        done()
Johann-S's avatar
Johann-S committed
561
      })
562
      .bootstrapTooltip('show')
fat's avatar
fat committed
563
564
  })

fat's avatar
fat committed
565
566
  QUnit.test('should show tooltip if leave event hasn\'t occurred before delay expires', function (assert) {
    assert.expect(2)
567
    var done = assert.async()
fat's avatar
fat committed
568

fat's avatar
fat committed
569
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
fat's avatar
fat committed
570
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
571
572
573
      .bootstrapTooltip({
        delay: 150
      })
fat's avatar
fat committed
574
575

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
576
      assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip is not faded active')
577
    }, 100)
fat's avatar
fat committed
578
579

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
580
      assert.ok($('.tooltip').is('.fade.show'), '200ms: tooltip is faded active')
581
      done()
582
    }, 200)
fat's avatar
fat committed
583
584
585
586

    $tooltip.trigger('mouseenter')
  })

fat's avatar
fat committed
587
588
  QUnit.test('should not show tooltip if leave event occurs before delay expires', function (assert) {
    assert.expect(2)
589
    var done = assert.async()
fat's avatar
fat committed
590

fat's avatar
fat committed
591
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
fat's avatar
fat committed
592
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
593
594
595
      .bootstrapTooltip({
        delay: 150
      })
fat's avatar
fat committed
596
597

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
598
      assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip not faded active')
fat's avatar
fat committed
599
      $tooltip.trigger('mouseout')
600
    }, 100)
fat's avatar
fat committed
601
602

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
603
      assert.ok(!$('.tooltip').is('.fade.show'), '200ms: tooltip not faded active')
604
      done()
605
    }, 200)
fat's avatar
fat committed
606
607
608
609

    $tooltip.trigger('mouseenter')
  })

fat's avatar
fat committed
610
611
  QUnit.test('should not hide tooltip if leave event occurs and enter event occurs within the hide delay', function (assert) {
    assert.expect(3)
612
    var done = assert.async()
fat's avatar
fat committed
613

fat's avatar
fat committed
614
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
fat's avatar
fat committed
615
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
616
617
618
619
620
621
      .bootstrapTooltip({
        delay: {
          show: 0,
          hide: 150
        }
      })
fat's avatar
fat committed
622
623

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
624
      assert.ok($('.tooltip').is('.fade.show'), '1ms: tooltip faded active')
fat's avatar
fat committed
625
626
627
      $tooltip.trigger('mouseout')

      setTimeout(function () {
Starsam80's avatar
Starsam80 committed
628
        assert.ok($('.tooltip').is('.fade.show'), '100ms: tooltip still faded active')
fat's avatar
fat committed
629
        $tooltip.trigger('mouseenter')
630
      }, 100)
fat's avatar
fat committed
631
632

      setTimeout(function () {
Starsam80's avatar
Starsam80 committed
633
        assert.ok($('.tooltip').is('.fade.show'), '200ms: tooltip still faded active')
634
        done()
635
      }, 200)
fat's avatar
fat committed
636
637
638
639
640
    }, 0)

    $tooltip.trigger('mouseenter')
  })

fat's avatar
fat committed
641
642
  QUnit.test('should not show tooltip if leave event occurs before delay expires', function (assert) {
    assert.expect(2)
643
    var done = assert.async()
fat's avatar
fat committed
644

fat's avatar
fat committed
645
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
fat's avatar
fat committed
646
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
647
648
649
      .bootstrapTooltip({
        delay: 150
      })
fat's avatar
fat committed
650
651

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
652
      assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip not faded active')
fat's avatar
fat committed
653
      $tooltip.trigger('mouseout')
654
    }, 100)
fat's avatar
fat committed
655
656

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
657
      assert.ok(!$('.tooltip').is('.fade.show'), '200ms: tooltip not faded active')
658
      done()
659
    }, 200)
fat's avatar
fat committed
660
661
662
663

    $tooltip.trigger('mouseenter')
  })

fat's avatar
fat committed
664
665
  QUnit.test('should not show tooltip if leave event occurs before delay expires, even if hide delay is 0', function (assert) {
    assert.expect(2)
666
    var done = assert.async()
fat's avatar
fat committed
667

fat's avatar
fat committed
668
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
fat's avatar
fat committed
669
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
670
671
672
673
674
675
      .bootstrapTooltip({
        delay: {
          show: 150,
          hide: 0
        }
      })
fat's avatar
fat committed
676
677

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
678
      assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip not faded active')
fat's avatar
fat committed
679
      $tooltip.trigger('mouseout')
680
    }, 100)
fat's avatar
fat committed
681
682

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
683
      assert.ok(!$('.tooltip').is('.fade.show'), '250ms: tooltip not faded active')
684
      done()
685
    }, 250)
fat's avatar
fat committed
686
687
688
689

    $tooltip.trigger('mouseenter')
  })

fat's avatar
fat committed
690
691
  QUnit.test('should wait 200ms before hiding the tooltip', function (assert) {
    assert.expect(3)
692
    var done = assert.async()
fat's avatar
fat committed
693

fat's avatar
fat committed
694
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
fat's avatar
fat committed
695
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
696
697
698
699
700
701
      .bootstrapTooltip({
        delay: {
          show: 0,
          hide: 150
        }
      })
fat's avatar
fat committed
702
703

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
704
      assert.ok($($tooltip.data('bs.tooltip').tip).is('.fade.show'), '1ms: tooltip faded active')
fat's avatar
fat committed
705
706
707
708

      $tooltip.trigger('mouseout')

      setTimeout(function () {
Starsam80's avatar
Starsam80 committed
709
        assert.ok($($tooltip.data('bs.tooltip').tip).is('.fade.show'), '100ms: tooltip still faded active')
710
      }, 100)
fat's avatar
fat committed
711
712

      setTimeout(function () {
Starsam80's avatar
Starsam80 committed
713
        assert.ok(!$($tooltip.data('bs.tooltip').tip).is('.show'), '200ms: tooltip removed')
fat's avatar
fat committed
714
        done()
715
      }, 200)
fat's avatar
fat committed
716
717
718
719
720
    }, 0)

    $tooltip.trigger('mouseenter')
  })

fat's avatar
fat committed
721
722
  QUnit.test('should not reload the tooltip on subsequent mouseenter events', function (assert) {
    assert.expect(1)
723
    var titleHtml = function () {
724
      var uid = Util.getUID('tooltip')
725
726
727
      return '<p id="tt-content">' + uid + '</p><p>' + uid + '</p><p>' + uid + '</p>'
    }

fat's avatar
fat committed
728
    var $tooltip = $('<span id="tt-outer" rel="tooltip" data-trigger="hover" data-placement="top">some text</span>')
729
730
731
732
733
734
      .appendTo('#qunit-fixture')

    $tooltip.bootstrapTooltip({
      html: true,
      animation: false,
      trigger: 'hover',
XhmikosR's avatar
XhmikosR committed
735
736
737
738
      delay: {
        show: 0,
        hide: 500
      },
739
740
741
742
743
744
745
746
747
      container: $tooltip,
      title: titleHtml
    })

    $('#tt-outer').trigger('mouseenter')

    var currentUid = $('#tt-content').text()

    $('#tt-content').trigger('mouseenter')
fat's avatar
fat committed
748
    assert.strictEqual(currentUid, $('#tt-content').text())
749
750
  })

fat's avatar
fat committed
751
752
  QUnit.test('should not reload the tooltip if the mouse leaves and re-enters before hiding', function (assert) {
    assert.expect(4)
753

754
    var titleHtml = function () {
755
      var uid = Util.getUID('tooltip')
756
757
758
      return '<p id="tt-content">' + uid + '</p><p>' + uid + '</p><p>' + uid + '</p>'
    }

fat's avatar
fat committed
759
    var $tooltip = $('<span id="tt-outer" rel="tooltip" data-trigger="hover" data-placement="top">some text</span>')
760
761
762
763
764
765
      .appendTo('#qunit-fixture')

    $tooltip.bootstrapTooltip({
      html: true,
      animation: false,
      trigger: 'hover',
XhmikosR's avatar
XhmikosR committed
766
767
768
769
      delay: {
        show: 0,
        hide: 500
      },
770
771
772
773
774
775
776
777
778
779
      title: titleHtml
    })

    var obj = $tooltip.data('bs.tooltip')

    $('#tt-outer').trigger('mouseenter')

    var currentUid = $('#tt-content').text()

    $('#tt-outer').trigger('mouseleave')
fat's avatar
fat committed
780
    assert.strictEqual(currentUid, $('#tt-content').text())
fat's avatar
fat committed
781

782
    assert.ok(obj._hoverState === 'out', 'the tooltip hoverState should be set to "out"')
783

784
    $('#tt-outer').trigger('mouseenter')
Starsam80's avatar
Starsam80 committed
785
    assert.ok(obj._hoverState === 'show', 'the tooltip hoverState should be set to "show"')
786

fat's avatar
fat committed
787
    assert.strictEqual(currentUid, $('#tt-content').text())
788
789
  })

fat's avatar
fat committed
790
  QUnit.test('should do nothing when an attempt is made to hide an uninitialized tooltip', function (assert) {
791
792
    assert.expect(1)

fat's avatar
fat committed
793
794
795
796
797
798
    var $tooltip = $('<span data-toggle="tooltip" title="some tip">some text</span>')
      .appendTo('#qunit-fixture')
      .on('hidden.bs.tooltip shown.bs.tooltip', function () {
        assert.ok(false, 'should not fire any tooltip events')
      })
      .bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
799
    assert.strictEqual(typeof $tooltip.data('bs.tooltip'), 'undefined', 'should not initialize the tooltip')
fat's avatar
fat committed
800
801
802
803
804
805
  })

  QUnit.test('should not remove tooltip if multiple triggers are set and one is still active', function (assert) {
    assert.expect(41)
    var $el = $('<button>Trigger</button>')
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
806
807
808
809
      .bootstrapTooltip({
        trigger: 'click hover focus',
        animation: false
      })
fat's avatar
fat committed
810
    var tooltip = $el.data('bs.tooltip')
811
    var $tooltip = $(tooltip.getTipElement())
fat's avatar
fat committed
812

XhmikosR's avatar
XhmikosR committed
813
814
815
    function showingTooltip() {
      return $tooltip.hasClass('show') || tooltip._hoverState === 'show'
    }
fat's avatar
fat committed
816
817

    var tests = [
XhmikosR's avatar
XhmikosR committed
818
      ['mouseenter', 'mouseleave'],
819

XhmikosR's avatar
XhmikosR committed
820
      ['focusin', 'focusout'],
fat's avatar
fat committed
821

XhmikosR's avatar
XhmikosR committed
822
      ['click', 'click'],
fat's avatar
fat committed
823

XhmikosR's avatar
XhmikosR committed
824
825
      ['mouseenter', 'focusin', 'focusout', 'mouseleave'],
      ['mouseenter', 'focusin', 'mouseleave', 'focusout'],
fat's avatar
fat committed
826

XhmikosR's avatar
XhmikosR committed
827
828
      ['focusin', 'mouseenter', 'mouseleave', 'focusout'],
      ['focusin', 'mouseenter', 'focusout', 'mouseleave'],
fat's avatar
fat committed
829

XhmikosR's avatar
XhmikosR committed
830
831
832
      ['click', 'focusin', 'mouseenter', 'focusout', 'mouseleave', 'click'],
      ['mouseenter', 'click', 'focusin', 'focusout', 'mouseleave', 'click'],
      ['mouseenter', 'focusin', 'click', 'click', 'mouseleave', 'focusout']
fat's avatar
fat committed
833
834
835
836
837
838
    ]

    assert.ok(!showingTooltip())

    $.each(tests, function (idx, triggers) {
      for (var i = 0, len = triggers.length; i < len; i++) {
839
840
        $el.trigger(triggers[i])
        assert.equal(i < len - 1, showingTooltip())
fat's avatar
fat committed
841
842
      }
    })
843
844
  })

845
846
847
848
  QUnit.test('should show on first trigger after hide', function (assert) {
    assert.expect(3)
    var $el = $('<a href="#" rel="tooltip" title="Test tooltip"/>')
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
849
850
851
852
      .bootstrapTooltip({
        trigger: 'click hover focus',
        animation: false
      })
853
854
855
856

    var tooltip = $el.data('bs.tooltip')
    var $tooltip = $(tooltip.getTipElement())

XhmikosR's avatar
XhmikosR committed
857
858
859
    function showingTooltip() {
      return $tooltip.hasClass('show') || tooltip._hoverState === 'show'
    }
860
861
862
863
864
865
866
867
868
869
870

    $el.trigger('click')
    assert.ok(showingTooltip(), 'tooltip is faded in')

    $el.bootstrapTooltip('hide')
    assert.ok(!showingTooltip(), 'tooltip was faded out')

    $el.trigger('click')
    assert.ok(showingTooltip(), 'tooltip is faded in again')
  })

871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
  QUnit.test('should hide tooltip when their containing modal is closed', function (assert) {
    assert.expect(1)
    var done = assert.async()
    var templateHTML = '<div id="modal-test" class="modal">' +
                          '<div class="modal-dialog" role="document">' +
                            '<div class="modal-content">' +
                              '<div class="modal-body">' +
                                '<a id="tooltipTest" href="#" data-toggle="tooltip" title="Some tooltip text!">Tooltip</a>' +
                              '</div>' +
                            '</div>' +
                          '</div>' +
                        '</div>'

    $(templateHTML).appendTo('#qunit-fixture')
    $('#tooltipTest')
XhmikosR's avatar
XhmikosR committed
886
887
888
      .bootstrapTooltip({
        trigger: 'manuel'
      })
889
890
891
892
893
894
895
896
897
898
899
900
901
902
      .on('shown.bs.tooltip', function () {
        $('#modal-test').modal('hide')
      })
      .on('hide.bs.tooltip', function () {
        assert.ok(true, 'tooltip hide')
        done()
      })

    $('#modal-test')
      .on('shown.bs.modal', function () {
        $('#tooltipTest').bootstrapTooltip('show')
      })
      .modal('show')
  })
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919

  QUnit.test('should reset tip classes when hidden event triggered', function (assert) {
    assert.expect(2)
    var done = assert.async()
    var $el = $('<a href="#" rel="tooltip" title="Test tooltip"/>')
      .appendTo('#qunit-fixture')
      .bootstrapTooltip('show')
      .on('hidden.bs.tooltip', function () {
        var tooltip = $el.data('bs.tooltip')
        var $tooltip = $(tooltip.getTipElement())
        assert.ok($tooltip.hasClass('tooltip'))
        assert.ok($tooltip.hasClass('fade'))
        done()
      })

    $el.bootstrapTooltip('hide')
  })
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934

  QUnit.test('should convert number in title to string', function (assert) {
    assert.expect(1)
    var done = assert.async()
    var $el = $('<a href="#" rel="tooltip" title="7"/>')
      .appendTo('#qunit-fixture')
      .on('shown.bs.tooltip', function () {
        var tooltip = $el.data('bs.tooltip')
        var $tooltip = $(tooltip.getTipElement())
        assert.strictEqual($tooltip.children().text(), '7')
        done()
      })

    $el.bootstrapTooltip('show')
  })
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955

  QUnit.test('tooltip should be shown right away after the call of disable/enable', function (assert) {
    assert.expect(2)
    var done = assert.async()

    var $trigger = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
      .appendTo('#qunit-fixture')
      .bootstrapTooltip()
      .on('shown.bs.tooltip', function () {
        assert.strictEqual($('.tooltip').hasClass('show'), true)
        done()
      })

    $trigger.bootstrapTooltip('disable')
    $trigger.trigger($.Event('click'))
    setTimeout(function () {
      assert.strictEqual($('.tooltip').length === 0, true)
      $trigger.bootstrapTooltip('enable')
      $trigger.trigger($.Event('click'))
    }, 200)
  })
956
})