inkstream 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (218) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +21 -0
  3. data/README.md +93 -0
  4. data/_config.yml +122 -0
  5. data/_includes/button.html +4 -0
  6. data/_includes/icon.html +1 -0
  7. data/_includes/nav-default.html +23 -0
  8. data/_includes/nav-header.html +25 -0
  9. data/_includes/post-list.html +59 -0
  10. data/_includes/post-meta.html +0 -0
  11. data/_includes/post-pagination.html +29 -0
  12. data/_includes/promo-section.html +12 -0
  13. data/_includes/site-before-end.html +1 -0
  14. data/_includes/site-before-start.html +1 -0
  15. data/_includes/site-favicons.html +7 -0
  16. data/_includes/site-fonts.html +13 -0
  17. data/_includes/site-footer-default.html +17 -0
  18. data/_includes/site-footer.html +12 -0
  19. data/_includes/site-header.html +46 -0
  20. data/_includes/site-styles.html +6 -0
  21. data/_layouts/blog.html +24 -0
  22. data/_layouts/default.html +62 -0
  23. data/_layouts/page.html +35 -0
  24. data/_layouts/post.html +201 -0
  25. data/assets/css/styles.css +11167 -0
  26. data/assets/images/about-me.jpg +0 -0
  27. data/assets/images/blog/blog-post-banner.jpg +0 -0
  28. data/assets/images/blog/blog-post-thumb-1.jpg +0 -0
  29. data/assets/images/blog/blog-post-thumb-10.jpg +0 -0
  30. data/assets/images/blog/blog-post-thumb-11.jpg +0 -0
  31. data/assets/images/blog/blog-post-thumb-12.jpg +0 -0
  32. data/assets/images/blog/blog-post-thumb-2.jpg +0 -0
  33. data/assets/images/blog/blog-post-thumb-3.jpg +0 -0
  34. data/assets/images/blog/blog-post-thumb-4.jpg +0 -0
  35. data/assets/images/blog/blog-post-thumb-5.jpg +0 -0
  36. data/assets/images/blog/blog-post-thumb-6.jpg +0 -0
  37. data/assets/images/blog/blog-post-thumb-7.jpg +0 -0
  38. data/assets/images/blog/blog-post-thumb-8.jpg +0 -0
  39. data/assets/images/blog/blog-post-thumb-9.jpg +0 -0
  40. data/assets/images/posts/default-post-img.jpg +0 -0
  41. data/assets/images/posts/text-syntax.jpg +0 -0
  42. data/assets/images/posts/welcome.jpg +0 -0
  43. data/assets/images/profile.png +0 -0
  44. data/assets/images/promo-banner.jpg +0 -0
  45. data/assets/js/blog.js +9 -0
  46. data/assets/js/demo/style-switcher.js +45 -0
  47. data/assets/plugins/bootstrap/js/bootstrap.min.js +7 -0
  48. data/assets/plugins/jquery-3.3.1.min.js +2 -0
  49. data/assets/plugins/popper.min.js +5 -0
  50. data/assets/scss/bootstrap/js/dist/alert.js +199 -0
  51. data/assets/scss/bootstrap/js/dist/alert.js.map +1 -0
  52. data/assets/scss/bootstrap/js/dist/button.js +187 -0
  53. data/assets/scss/bootstrap/js/dist/button.js.map +1 -0
  54. data/assets/scss/bootstrap/js/dist/carousel.js +668 -0
  55. data/assets/scss/bootstrap/js/dist/carousel.js.map +1 -0
  56. data/assets/scss/bootstrap/js/dist/collapse.js +428 -0
  57. data/assets/scss/bootstrap/js/dist/collapse.js.map +1 -0
  58. data/assets/scss/bootstrap/js/dist/dropdown.js +595 -0
  59. data/assets/scss/bootstrap/js/dist/dropdown.js.map +1 -0
  60. data/assets/scss/bootstrap/js/dist/index.js +23 -0
  61. data/assets/scss/bootstrap/js/dist/index.js.map +1 -0
  62. data/assets/scss/bootstrap/js/dist/modal.js +650 -0
  63. data/assets/scss/bootstrap/js/dist/modal.js.map +1 -0
  64. data/assets/scss/bootstrap/js/dist/popover.js +261 -0
  65. data/assets/scss/bootstrap/js/dist/popover.js.map +1 -0
  66. data/assets/scss/bootstrap/js/dist/scrollspy.js +375 -0
  67. data/assets/scss/bootstrap/js/dist/scrollspy.js.map +1 -0
  68. data/assets/scss/bootstrap/js/dist/tab.js +269 -0
  69. data/assets/scss/bootstrap/js/dist/tab.js.map +1 -0
  70. data/assets/scss/bootstrap/js/dist/toast.js +283 -0
  71. data/assets/scss/bootstrap/js/dist/toast.js.map +1 -0
  72. data/assets/scss/bootstrap/js/dist/tooltip.js +760 -0
  73. data/assets/scss/bootstrap/js/dist/tooltip.js.map +1 -0
  74. data/assets/scss/bootstrap/js/dist/util.js +172 -0
  75. data/assets/scss/bootstrap/js/dist/util.js.map +1 -0
  76. data/assets/scss/bootstrap/js/src/alert.js +179 -0
  77. data/assets/scss/bootstrap/js/src/button.js +171 -0
  78. data/assets/scss/bootstrap/js/src/carousel.js +606 -0
  79. data/assets/scss/bootstrap/js/src/collapse.js +402 -0
  80. data/assets/scss/bootstrap/js/src/dropdown.js +545 -0
  81. data/assets/scss/bootstrap/js/src/index.js +52 -0
  82. data/assets/scss/bootstrap/js/src/modal.js +594 -0
  83. data/assets/scss/bootstrap/js/src/popover.js +184 -0
  84. data/assets/scss/bootstrap/js/src/scrollspy.js +326 -0
  85. data/assets/scss/bootstrap/js/src/tab.js +260 -0
  86. data/assets/scss/bootstrap/js/src/toast.js +227 -0
  87. data/assets/scss/bootstrap/js/src/tooltip.js +752 -0
  88. data/assets/scss/bootstrap/js/src/util.js +177 -0
  89. data/assets/scss/bootstrap/js/tests/README.md +69 -0
  90. data/assets/scss/bootstrap/js/tests/browsers.js +82 -0
  91. data/assets/scss/bootstrap/js/tests/index.html +133 -0
  92. data/assets/scss/bootstrap/js/tests/integration/bundle.js +8 -0
  93. data/assets/scss/bootstrap/js/tests/integration/index.html +66 -0
  94. data/assets/scss/bootstrap/js/tests/integration/rollup.bundle.js +20 -0
  95. data/assets/scss/bootstrap/js/tests/karma.conf.js +143 -0
  96. data/assets/scss/bootstrap/js/tests/unit/.eslintrc.json +40 -0
  97. data/assets/scss/bootstrap/js/tests/unit/alert.js +123 -0
  98. data/assets/scss/bootstrap/js/tests/unit/button.js +222 -0
  99. data/assets/scss/bootstrap/js/tests/unit/carousel.js +1333 -0
  100. data/assets/scss/bootstrap/js/tests/unit/collapse.js +892 -0
  101. data/assets/scss/bootstrap/js/tests/unit/dropdown.js +1419 -0
  102. data/assets/scss/bootstrap/js/tests/unit/modal.js +815 -0
  103. data/assets/scss/bootstrap/js/tests/unit/popover.js +471 -0
  104. data/assets/scss/bootstrap/js/tests/unit/scrollspy.js +728 -0
  105. data/assets/scss/bootstrap/js/tests/unit/tab.js +518 -0
  106. data/assets/scss/bootstrap/js/tests/unit/toast.js +259 -0
  107. data/assets/scss/bootstrap/js/tests/unit/tooltip.js +1109 -0
  108. data/assets/scss/bootstrap/js/tests/unit/util.js +163 -0
  109. data/assets/scss/bootstrap/js/tests/visual/alert.html +58 -0
  110. data/assets/scss/bootstrap/js/tests/visual/button.html +51 -0
  111. data/assets/scss/bootstrap/js/tests/visual/carousel.html +66 -0
  112. data/assets/scss/bootstrap/js/tests/visual/collapse.html +78 -0
  113. data/assets/scss/bootstrap/js/tests/visual/dropdown.html +212 -0
  114. data/assets/scss/bootstrap/js/tests/visual/modal.html +268 -0
  115. data/assets/scss/bootstrap/js/tests/visual/popover.html +46 -0
  116. data/assets/scss/bootstrap/js/tests/visual/scrollspy.html +95 -0
  117. data/assets/scss/bootstrap/js/tests/visual/tab.html +234 -0
  118. data/assets/scss/bootstrap/js/tests/visual/toast.html +72 -0
  119. data/assets/scss/bootstrap/js/tests/visual/tooltip.html +106 -0
  120. data/assets/scss/bootstrap/scss/_alert.scss +51 -0
  121. data/assets/scss/bootstrap/scss/_badge.scss +54 -0
  122. data/assets/scss/bootstrap/scss/_breadcrumb.scss +41 -0
  123. data/assets/scss/bootstrap/scss/_button-group.scss +163 -0
  124. data/assets/scss/bootstrap/scss/_buttons.scss +137 -0
  125. data/assets/scss/bootstrap/scss/_card.scss +289 -0
  126. data/assets/scss/bootstrap/scss/_carousel.scss +197 -0
  127. data/assets/scss/bootstrap/scss/_close.scss +41 -0
  128. data/assets/scss/bootstrap/scss/_code.scss +48 -0
  129. data/assets/scss/bootstrap/scss/_custom-forms.scss +507 -0
  130. data/assets/scss/bootstrap/scss/_dropdown.scss +191 -0
  131. data/assets/scss/bootstrap/scss/_forms.scss +330 -0
  132. data/assets/scss/bootstrap/scss/_functions.scss +86 -0
  133. data/assets/scss/bootstrap/scss/_grid.scss +52 -0
  134. data/assets/scss/bootstrap/scss/_images.scss +42 -0
  135. data/assets/scss/bootstrap/scss/_input-group.scss +193 -0
  136. data/assets/scss/bootstrap/scss/_jumbotron.scss +17 -0
  137. data/assets/scss/bootstrap/scss/_list-group.scss +149 -0
  138. data/assets/scss/bootstrap/scss/_media.scss +8 -0
  139. data/assets/scss/bootstrap/scss/_mixins.scss +47 -0
  140. data/assets/scss/bootstrap/scss/_modal.scss +229 -0
  141. data/assets/scss/bootstrap/scss/_nav.scss +120 -0
  142. data/assets/scss/bootstrap/scss/_navbar.scss +294 -0
  143. data/assets/scss/bootstrap/scss/_pagination.scss +73 -0
  144. data/assets/scss/bootstrap/scss/_popover.scss +171 -0
  145. data/assets/scss/bootstrap/scss/_print.scss +141 -0
  146. data/assets/scss/bootstrap/scss/_progress.scss +43 -0
  147. data/assets/scss/bootstrap/scss/_reboot.scss +483 -0
  148. data/assets/scss/bootstrap/scss/_root.scss +19 -0
  149. data/assets/scss/bootstrap/scss/_spinners.scss +55 -0
  150. data/assets/scss/bootstrap/scss/_tables.scss +185 -0
  151. data/assets/scss/bootstrap/scss/_toasts.scss +44 -0
  152. data/assets/scss/bootstrap/scss/_tooltip.scss +115 -0
  153. data/assets/scss/bootstrap/scss/_transitions.scss +20 -0
  154. data/assets/scss/bootstrap/scss/_type.scss +125 -0
  155. data/assets/scss/bootstrap/scss/_utilities.scss +17 -0
  156. data/assets/scss/bootstrap/scss/_variables.scss +1123 -0
  157. data/assets/scss/bootstrap/scss/bootstrap-grid.scss +29 -0
  158. data/assets/scss/bootstrap/scss/bootstrap-reboot.scss +12 -0
  159. data/assets/scss/bootstrap/scss/bootstrap.scss +44 -0
  160. data/assets/scss/bootstrap/scss/mixins/_alert.scss +13 -0
  161. data/assets/scss/bootstrap/scss/mixins/_background-variant.scss +21 -0
  162. data/assets/scss/bootstrap/scss/mixins/_badge.scss +17 -0
  163. data/assets/scss/bootstrap/scss/mixins/_border-radius.scss +63 -0
  164. data/assets/scss/bootstrap/scss/mixins/_box-shadow.scss +20 -0
  165. data/assets/scss/bootstrap/scss/mixins/_breakpoints.scss +123 -0
  166. data/assets/scss/bootstrap/scss/mixins/_buttons.scss +107 -0
  167. data/assets/scss/bootstrap/scss/mixins/_caret.scss +62 -0
  168. data/assets/scss/bootstrap/scss/mixins/_clearfix.scss +7 -0
  169. data/assets/scss/bootstrap/scss/mixins/_deprecate.scss +10 -0
  170. data/assets/scss/bootstrap/scss/mixins/_float.scss +14 -0
  171. data/assets/scss/bootstrap/scss/mixins/_forms.scss +192 -0
  172. data/assets/scss/bootstrap/scss/mixins/_gradients.scss +45 -0
  173. data/assets/scss/bootstrap/scss/mixins/_grid-framework.scss +66 -0
  174. data/assets/scss/bootstrap/scss/mixins/_grid.scss +51 -0
  175. data/assets/scss/bootstrap/scss/mixins/_hover.scss +37 -0
  176. data/assets/scss/bootstrap/scss/mixins/_image.scss +36 -0
  177. data/assets/scss/bootstrap/scss/mixins/_list-group.scss +21 -0
  178. data/assets/scss/bootstrap/scss/mixins/_lists.scss +7 -0
  179. data/assets/scss/bootstrap/scss/mixins/_nav-divider.scss +10 -0
  180. data/assets/scss/bootstrap/scss/mixins/_pagination.scss +22 -0
  181. data/assets/scss/bootstrap/scss/mixins/_reset-text.scss +17 -0
  182. data/assets/scss/bootstrap/scss/mixins/_resize.scss +6 -0
  183. data/assets/scss/bootstrap/scss/mixins/_screen-reader.scss +33 -0
  184. data/assets/scss/bootstrap/scss/mixins/_size.scss +7 -0
  185. data/assets/scss/bootstrap/scss/mixins/_table-row.scss +39 -0
  186. data/assets/scss/bootstrap/scss/mixins/_text-emphasis.scss +16 -0
  187. data/assets/scss/bootstrap/scss/mixins/_text-hide.scss +11 -0
  188. data/assets/scss/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  189. data/assets/scss/bootstrap/scss/mixins/_transition.scss +16 -0
  190. data/assets/scss/bootstrap/scss/mixins/_visibility.scss +8 -0
  191. data/assets/scss/bootstrap/scss/utilities/_align.scss +8 -0
  192. data/assets/scss/bootstrap/scss/utilities/_background.scss +19 -0
  193. data/assets/scss/bootstrap/scss/utilities/_borders.scss +75 -0
  194. data/assets/scss/bootstrap/scss/utilities/_clearfix.scss +3 -0
  195. data/assets/scss/bootstrap/scss/utilities/_display.scss +26 -0
  196. data/assets/scss/bootstrap/scss/utilities/_embed.scss +39 -0
  197. data/assets/scss/bootstrap/scss/utilities/_flex.scss +51 -0
  198. data/assets/scss/bootstrap/scss/utilities/_float.scss +11 -0
  199. data/assets/scss/bootstrap/scss/utilities/_overflow.scss +5 -0
  200. data/assets/scss/bootstrap/scss/utilities/_position.scss +32 -0
  201. data/assets/scss/bootstrap/scss/utilities/_screenreaders.scss +11 -0
  202. data/assets/scss/bootstrap/scss/utilities/_shadows.scss +6 -0
  203. data/assets/scss/bootstrap/scss/utilities/_sizing.scss +20 -0
  204. data/assets/scss/bootstrap/scss/utilities/_spacing.scss +73 -0
  205. data/assets/scss/bootstrap/scss/utilities/_stretched-link.scss +19 -0
  206. data/assets/scss/bootstrap/scss/utilities/_text.scss +72 -0
  207. data/assets/scss/bootstrap/scss/utilities/_visibility.scss +13 -0
  208. data/assets/scss/bootstrap/scss/vendor/_rfs.scss +212 -0
  209. data/assets/scss/theme/_about.scss +28 -0
  210. data/assets/scss/theme/_base.scss +207 -0
  211. data/assets/scss/theme/_blog.scss +140 -0
  212. data/assets/scss/theme/_demo.scss +153 -0
  213. data/assets/scss/theme/_mixins.scss +34 -0
  214. data/assets/scss/theme/_responsive.scss +88 -0
  215. data/assets/scss/theme/styles.scss +14 -0
  216. data/assets/scss/theme-8.scss +41 -0
  217. data/assets/styles.scss +6 -0
  218. metadata +219 -3
@@ -0,0 +1,1109 @@
1
+ $(function () {
2
+ 'use strict'
3
+
4
+ QUnit.module('tooltip plugin')
5
+
6
+ QUnit.test('should be defined on jquery object', function (assert) {
7
+ assert.expect(1)
8
+ assert.ok($(document.body).tooltip, 'tooltip method is defined')
9
+ })
10
+
11
+ QUnit.module('tooltip', {
12
+ beforeEach: function () {
13
+ // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
14
+ $.fn.bootstrapTooltip = $.fn.tooltip.noConflict()
15
+ },
16
+ afterEach: function () {
17
+ $.fn.tooltip = $.fn.bootstrapTooltip
18
+ delete $.fn.bootstrapTooltip
19
+ $('.tooltip').remove()
20
+ $('#qunit-fixture').html('')
21
+ }
22
+ })
23
+
24
+ QUnit.test('should provide no conflict', function (assert) {
25
+ assert.expect(1)
26
+ assert.strictEqual(typeof $.fn.tooltip, 'undefined', 'tooltip was set back to undefined (org value)')
27
+ })
28
+
29
+ QUnit.test('should throw explicit error on undefined method', function (assert) {
30
+ assert.expect(1)
31
+ var $el = $('<div/>')
32
+ $el.bootstrapTooltip()
33
+ try {
34
+ $el.bootstrapTooltip('noMethod')
35
+ } catch (err) {
36
+ assert.strictEqual(err.message, 'No method named "noMethod"')
37
+ }
38
+ })
39
+
40
+ QUnit.test('should return jquery collection containing the element', function (assert) {
41
+ assert.expect(2)
42
+ var $el = $('<div/>')
43
+ var $tooltip = $el.bootstrapTooltip()
44
+ assert.ok($tooltip instanceof $, 'returns jquery collection')
45
+ assert.strictEqual($tooltip[0], $el[0], 'collection contains element')
46
+ })
47
+
48
+ QUnit.test('should expose default settings', function (assert) {
49
+ assert.expect(1)
50
+ assert.ok($.fn.bootstrapTooltip.Constructor.Default, 'defaults is defined')
51
+ })
52
+
53
+ QUnit.test('should empty title attribute', function (assert) {
54
+ assert.expect(1)
55
+ var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>').bootstrapTooltip()
56
+ assert.strictEqual($trigger.attr('title'), '', 'title attribute was emptied')
57
+ })
58
+
59
+ QUnit.test('should add data attribute for referencing original title', function (assert) {
60
+ assert.expect(1)
61
+ var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>').bootstrapTooltip()
62
+ assert.strictEqual($trigger.attr('data-original-title'), 'Another tooltip', 'original title preserved in data attribute')
63
+ })
64
+
65
+ QUnit.test('should add aria-describedby to the trigger on show', function (assert) {
66
+ assert.expect(3)
67
+ var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
68
+ .bootstrapTooltip()
69
+ .appendTo('#qunit-fixture')
70
+ .bootstrapTooltip('show')
71
+
72
+ var id = $('.tooltip').attr('id')
73
+
74
+ assert.strictEqual($('#' + id).length, 1, 'has a unique id')
75
+ assert.strictEqual($('.tooltip').attr('aria-describedby'), $trigger.attr('id'), 'tooltip id and aria-describedby on trigger match')
76
+ assert.ok($trigger[0].hasAttribute('aria-describedby'), 'trigger has aria-describedby')
77
+ })
78
+
79
+ QUnit.test('should remove aria-describedby from trigger on hide', function (assert) {
80
+ assert.expect(2)
81
+ var done = assert.async()
82
+ var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
83
+ .bootstrapTooltip()
84
+ .appendTo('#qunit-fixture')
85
+
86
+ $trigger
87
+ .one('shown.bs.tooltip', function () {
88
+ assert.ok($trigger[0].hasAttribute('aria-describedby'), 'trigger has aria-describedby')
89
+ $trigger.bootstrapTooltip('hide')
90
+ })
91
+ .one('hidden.bs.tooltip', function () {
92
+ assert.ok(!$trigger[0].hasAttribute('aria-describedby'), 'trigger does not have aria-describedby')
93
+ done()
94
+ })
95
+ .bootstrapTooltip('show')
96
+ })
97
+
98
+ QUnit.test('should assign a unique id tooltip element', function (assert) {
99
+ assert.expect(2)
100
+ $('<a href="#" rel="tooltip" title="Another tooltip"/>')
101
+ .appendTo('#qunit-fixture')
102
+ .bootstrapTooltip('show')
103
+
104
+ var id = $('.tooltip').attr('id')
105
+
106
+ assert.strictEqual($('#' + id).length, 1, 'tooltip has unique id')
107
+ assert.strictEqual(id.indexOf('tooltip'), 0, 'tooltip id has prefix')
108
+ })
109
+
110
+ QUnit.test('should place tooltips relative to placement option', function (assert) {
111
+ assert.expect(2)
112
+ var done = assert.async()
113
+ var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
114
+ .appendTo('#qunit-fixture')
115
+ .bootstrapTooltip({
116
+ placement: 'bottom'
117
+ })
118
+
119
+ $tooltip
120
+ .one('shown.bs.tooltip', function () {
121
+ assert.ok($('.tooltip')
122
+ .is('.fade.bs-tooltip-bottom.show'), 'has correct classes applied')
123
+
124
+ $tooltip.bootstrapTooltip('hide')
125
+ })
126
+ .one('hidden.bs.tooltip', function () {
127
+ assert.strictEqual($tooltip.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
128
+ done()
129
+ })
130
+ .bootstrapTooltip('show')
131
+ })
132
+
133
+ QUnit.test('should allow html entities', function (assert) {
134
+ assert.expect(2)
135
+ var done = assert.async()
136
+ var $tooltip = $('<a href="#" rel="tooltip" title="&lt;b&gt;@fat&lt;/b&gt;"/>')
137
+ .appendTo('#qunit-fixture')
138
+ .bootstrapTooltip({
139
+ html: true
140
+ })
141
+
142
+ $tooltip
143
+ .one('shown.bs.tooltip', function () {
144
+ assert.notEqual($('.tooltip b').length, 0, 'b tag was inserted')
145
+ $tooltip.bootstrapTooltip('hide')
146
+ })
147
+ .one('hidden.bs.tooltip', function () {
148
+ assert.strictEqual($tooltip.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
149
+ done()
150
+ })
151
+ .bootstrapTooltip('show')
152
+ })
153
+
154
+ QUnit.test('should allow DOMElement title (html: false)', function (assert) {
155
+ assert.expect(3)
156
+ var done = assert.async()
157
+ var title = document.createTextNode('<3 writing tests')
158
+ var $tooltip = $('<a href="#" rel="tooltip"/>')
159
+ .appendTo('#qunit-fixture')
160
+ .bootstrapTooltip({
161
+ title: title
162
+ })
163
+
164
+ $tooltip
165
+ .one('shown.bs.tooltip', function () {
166
+ assert.notEqual($('.tooltip').length, 0, 'tooltip inserted')
167
+ assert.strictEqual($('.tooltip').text(), '<3 writing tests', 'title inserted')
168
+ assert.ok(!$.contains($('.tooltip').get(0), title), 'title node copied, not moved')
169
+ done()
170
+ })
171
+ .bootstrapTooltip('show')
172
+ })
173
+
174
+ QUnit.test('should allow DOMElement title (html: true)', function (assert) {
175
+ assert.expect(3)
176
+ var done = assert.async()
177
+ var title = document.createTextNode('<3 writing tests')
178
+ var $tooltip = $('<a href="#" rel="tooltip"/>')
179
+ .appendTo('#qunit-fixture')
180
+ .bootstrapTooltip({
181
+ html: true,
182
+ title: title
183
+ })
184
+
185
+ $tooltip
186
+ .one('shown.bs.tooltip', function () {
187
+ assert.notEqual($('.tooltip').length, 0, 'tooltip inserted')
188
+ assert.strictEqual($('.tooltip').text(), '<3 writing tests', 'title inserted')
189
+ assert.ok($.contains($('.tooltip').get(0), title), 'title node moved, not copied')
190
+ done()
191
+ })
192
+ .bootstrapTooltip('show')
193
+ })
194
+
195
+ QUnit.test('should respect custom classes', function (assert) {
196
+ assert.expect(2)
197
+ var done = assert.async()
198
+ var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
199
+ .appendTo('#qunit-fixture')
200
+ .bootstrapTooltip({
201
+ template: '<div class="tooltip some-class"><div class="tooltip-arrow"/><div class="tooltip-inner"/></div>'
202
+ })
203
+
204
+ $tooltip
205
+ .one('shown.bs.tooltip', function () {
206
+ assert.ok($('.tooltip').hasClass('some-class'), 'custom class is present')
207
+ $tooltip.bootstrapTooltip('hide')
208
+ })
209
+ .one('hidden.bs.tooltip', function () {
210
+ assert.strictEqual($tooltip.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
211
+ done()
212
+ })
213
+ .bootstrapTooltip('show')
214
+ })
215
+
216
+ QUnit.test('should fire show event', function (assert) {
217
+ assert.expect(1)
218
+ var done = assert.async()
219
+
220
+ $('<div title="tooltip title"/>')
221
+ .on('show.bs.tooltip', function () {
222
+ assert.ok(true, 'show event fired')
223
+ done()
224
+ })
225
+ .bootstrapTooltip('show')
226
+ })
227
+
228
+ QUnit.test('should throw an error when show is called on hidden elements', function (assert) {
229
+ assert.expect(1)
230
+ var done = assert.async()
231
+
232
+ try {
233
+ $('<div title="tooltip title" style="display: none"/>').bootstrapTooltip('show')
234
+ } catch (err) {
235
+ assert.strictEqual(err.message, 'Please use show on visible elements')
236
+ done()
237
+ }
238
+ })
239
+
240
+ QUnit.test('should fire inserted event', function (assert) {
241
+ assert.expect(2)
242
+ var done = assert.async()
243
+
244
+ $('<div title="tooltip title"/>')
245
+ .appendTo('#qunit-fixture')
246
+ .on('inserted.bs.tooltip', function () {
247
+ assert.notEqual($('.tooltip').length, 0, 'tooltip was inserted')
248
+ assert.ok(true, 'inserted event fired')
249
+ done()
250
+ })
251
+ .bootstrapTooltip('show')
252
+ })
253
+
254
+ QUnit.test('should fire shown event', function (assert) {
255
+ assert.expect(1)
256
+ var done = assert.async()
257
+
258
+ $('<div title="tooltip title"></div>')
259
+ .appendTo('#qunit-fixture')
260
+ .on('shown.bs.tooltip', function () {
261
+ assert.ok(true, 'shown was called')
262
+ done()
263
+ })
264
+ .bootstrapTooltip('show')
265
+ })
266
+
267
+ QUnit.test('should not fire shown event when show was prevented', function (assert) {
268
+ assert.expect(1)
269
+ var done = assert.async()
270
+
271
+ $('<div title="tooltip title"/>')
272
+ .on('show.bs.tooltip', function (e) {
273
+ e.preventDefault()
274
+ assert.ok(true, 'show event fired')
275
+ done()
276
+ })
277
+ .on('shown.bs.tooltip', function () {
278
+ assert.ok(false, 'shown event fired')
279
+ })
280
+ .bootstrapTooltip('show')
281
+ })
282
+
283
+ QUnit.test('should fire hide event', function (assert) {
284
+ assert.expect(1)
285
+ var done = assert.async()
286
+
287
+ $('<div title="tooltip title"/>')
288
+ .appendTo('#qunit-fixture')
289
+ .on('shown.bs.tooltip', function () {
290
+ $(this).bootstrapTooltip('hide')
291
+ })
292
+ .on('hide.bs.tooltip', function () {
293
+ assert.ok(true, 'hide event fired')
294
+ done()
295
+ })
296
+ .bootstrapTooltip('show')
297
+ })
298
+
299
+ QUnit.test('should fire hidden event', function (assert) {
300
+ assert.expect(1)
301
+ var done = assert.async()
302
+
303
+ $('<div title="tooltip title"/>')
304
+ .appendTo('#qunit-fixture')
305
+ .on('shown.bs.tooltip', function () {
306
+ $(this).bootstrapTooltip('hide')
307
+ })
308
+ .on('hidden.bs.tooltip', function () {
309
+ assert.ok(true, 'hidden event fired')
310
+ done()
311
+ })
312
+ .bootstrapTooltip('show')
313
+ })
314
+
315
+ QUnit.test('should not fire hidden event when hide was prevented', function (assert) {
316
+ assert.expect(1)
317
+ var done = assert.async()
318
+
319
+ $('<div title="tooltip title"/>')
320
+ .appendTo('#qunit-fixture')
321
+ .on('shown.bs.tooltip', function () {
322
+ $(this).bootstrapTooltip('hide')
323
+ })
324
+ .on('hide.bs.tooltip', function (e) {
325
+ e.preventDefault()
326
+ assert.ok(true, 'hide event fired')
327
+ done()
328
+ })
329
+ .on('hidden.bs.tooltip', function () {
330
+ assert.ok(false, 'hidden event fired')
331
+ })
332
+ .bootstrapTooltip('show')
333
+ })
334
+
335
+ QUnit.test('should destroy tooltip', function (assert) {
336
+ assert.expect(7)
337
+ var $tooltip = $('<div/>')
338
+ .bootstrapTooltip()
339
+ .on('click.foo', function () {}) // eslint-disable-line no-empty-function
340
+
341
+ assert.ok($tooltip.data('bs.tooltip'), 'tooltip has data')
342
+ assert.ok($._data($tooltip[0], 'events').mouseover && $._data($tooltip[0], 'events').mouseout, 'tooltip has hover events')
343
+ assert.strictEqual($._data($tooltip[0], 'events').click[0].namespace, 'foo', 'tooltip has extra click.foo event')
344
+
345
+ $tooltip.bootstrapTooltip('show')
346
+ $tooltip.bootstrapTooltip('dispose')
347
+
348
+ assert.ok(!$tooltip.hasClass('show'), 'tooltip is hidden')
349
+ assert.ok(!$._data($tooltip[0], 'bs.tooltip'), 'tooltip does not have data')
350
+ assert.strictEqual($._data($tooltip[0], 'events').click[0].namespace, 'foo', 'tooltip still has click.foo')
351
+ assert.ok(!$._data($tooltip[0], 'events').mouseover && !$._data($tooltip[0], 'events').mouseout, 'tooltip does not have hover events')
352
+ })
353
+
354
+ // QUnit.test('should show tooltip with delegate selector on click', function (assert) {
355
+ // assert.expect(2)
356
+ // var $div = $('<div><a href="#" rel="tooltip" title="Another tooltip"/></div>')
357
+ // .appendTo('#qunit-fixture')
358
+ // .bootstrapTooltip({
359
+ // selector: 'a[rel="tooltip"]',
360
+ // trigger: 'click'
361
+ // })
362
+
363
+ // $div.find('a').trigger('click')
364
+ // assert.ok($('.tooltip').is('.fade.in'), 'tooltip is faded in')
365
+
366
+ // $div.find('a').trigger('click')
367
+ // assert.strictEqual($div.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
368
+ // })
369
+
370
+ QUnit.test('should show tooltip when toggle is called', function (assert) {
371
+ assert.expect(1)
372
+ $('<a href="#" rel="tooltip" title="tooltip on toggle"/>')
373
+ .appendTo('#qunit-fixture')
374
+ .bootstrapTooltip({
375
+ trigger: 'manual'
376
+ })
377
+ .bootstrapTooltip('toggle')
378
+
379
+ assert.ok($('.tooltip').is('.fade.show'), 'tooltip is faded active')
380
+ })
381
+
382
+ QUnit.test('should hide previously shown tooltip when toggle is called on tooltip', function (assert) {
383
+ assert.expect(1)
384
+ $('<a href="#" rel="tooltip" title="tooltip on toggle">@ResentedHook</a>')
385
+ .appendTo('#qunit-fixture')
386
+ .bootstrapTooltip({
387
+ trigger: 'manual'
388
+ })
389
+ .bootstrapTooltip('show')
390
+
391
+ $('.tooltip').bootstrapTooltip('toggle')
392
+ assert.ok($('.tooltip').not('.fade.show'), 'tooltip was faded out')
393
+ })
394
+
395
+ QUnit.test('should place tooltips inside body when container is body', function (assert) {
396
+ assert.expect(3)
397
+ var done = assert.async()
398
+ var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
399
+ .appendTo('#qunit-fixture')
400
+ .bootstrapTooltip({
401
+ container: 'body'
402
+ })
403
+
404
+ $tooltip
405
+ .one('shown.bs.tooltip', function () {
406
+ assert.notEqual($('body > .tooltip').length, 0, 'tooltip is direct descendant of body')
407
+ assert.strictEqual($('#qunit-fixture > .tooltip').length, 0, 'tooltip is not in parent')
408
+ $tooltip.bootstrapTooltip('hide')
409
+ })
410
+ .one('hidden.bs.tooltip', function () {
411
+ assert.strictEqual($('body > .tooltip').length, 0, 'tooltip was removed from dom')
412
+ done()
413
+ })
414
+ .bootstrapTooltip('show')
415
+ })
416
+
417
+ QUnit.test('should place tooltips inside a specific container when container is an element', function (assert) {
418
+ assert.expect(3)
419
+ var done = assert.async()
420
+ var $container = $('<div></div>').appendTo('#qunit-fixture')
421
+ var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
422
+ .appendTo('#qunit-fixture')
423
+ .bootstrapTooltip({
424
+ container: $container[0]
425
+ })
426
+
427
+ $tooltip
428
+ .one('shown.bs.tooltip', function () {
429
+ assert.strictEqual($container.find('.tooltip').length, 1)
430
+ assert.strictEqual($('#qunit-fixture > .tooltip').length, 0, 'tooltip is not in parent')
431
+ $tooltip.bootstrapTooltip('hide')
432
+ })
433
+ .one('hidden.bs.tooltip', function () {
434
+ assert.strictEqual($container.find('.tooltip').length, 0, 'tooltip was removed from dom')
435
+ done()
436
+ })
437
+ .bootstrapTooltip('show')
438
+ })
439
+
440
+ QUnit.test('should place tooltips inside a specific container when container is a selector', function (assert) {
441
+ assert.expect(3)
442
+ var done = assert.async()
443
+ var $container = $('<div id="container"></div>').appendTo('#qunit-fixture')
444
+ var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
445
+ .appendTo('#qunit-fixture')
446
+ .bootstrapTooltip({
447
+ container: '#container'
448
+ })
449
+
450
+ $tooltip
451
+ .one('shown.bs.tooltip', function () {
452
+ assert.strictEqual($container.find('.tooltip').length, 1)
453
+ assert.strictEqual($('#qunit-fixture > .tooltip').length, 0, 'tooltip is not in parent')
454
+ $tooltip.bootstrapTooltip('hide')
455
+ })
456
+ .one('hidden.bs.tooltip', function () {
457
+ assert.strictEqual($container.find('.tooltip').length, 0, 'tooltip was removed from dom')
458
+ done()
459
+ })
460
+ .bootstrapTooltip('show')
461
+ })
462
+
463
+ QUnit.test('should add position class before positioning so that position-specific styles are taken into account', function (assert) {
464
+ assert.expect(2)
465
+ var done = assert.async()
466
+ var styles = '<style>' +
467
+ '.bs-tooltip-right { white-space: nowrap; }' +
468
+ '.bs-tooltip-right .tooltip-inner { max-width: none; }' +
469
+ '</style>'
470
+ var $styles = $(styles).appendTo('head')
471
+
472
+ var $container = $('<div/>').appendTo('#qunit-fixture')
473
+ $('<a href="#" rel="tooltip" title="very very very very very very very very long tooltip in one line"/>')
474
+ .appendTo($container)
475
+ .bootstrapTooltip({
476
+ placement: 'right',
477
+ trigger: 'manual'
478
+ })
479
+ .on('inserted.bs.tooltip', function () {
480
+ var $tooltip = $($(this).data('bs.tooltip').tip)
481
+ assert.ok($tooltip.hasClass('bs-tooltip-right'))
482
+ assert.ok(typeof $tooltip.attr('style') === 'undefined')
483
+ $styles.remove()
484
+ done()
485
+ })
486
+ .bootstrapTooltip('show')
487
+ })
488
+
489
+ QUnit.test('should use title attribute for tooltip text', function (assert) {
490
+ assert.expect(2)
491
+ var done = assert.async()
492
+ var $tooltip = $('<a href="#" rel="tooltip" title="Simple tooltip"/>')
493
+ .appendTo('#qunit-fixture')
494
+ .bootstrapTooltip()
495
+
496
+ $tooltip
497
+ .one('shown.bs.tooltip', function () {
498
+ assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title from title attribute is set')
499
+ $tooltip.bootstrapTooltip('hide')
500
+ })
501
+ .one('hidden.bs.tooltip', function () {
502
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
503
+ done()
504
+ })
505
+ .bootstrapTooltip('show')
506
+ })
507
+
508
+ QUnit.test('should prefer title attribute over title option', function (assert) {
509
+ assert.expect(2)
510
+ var done = assert.async()
511
+ var $tooltip = $('<a href="#" rel="tooltip" title="Simple tooltip"/>')
512
+ .appendTo('#qunit-fixture')
513
+ .bootstrapTooltip({
514
+ title: 'This is a tooltip with some content'
515
+ })
516
+
517
+ $tooltip
518
+ .one('shown.bs.tooltip', function () {
519
+ assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title is set from title attribute while preferred over title option')
520
+ $tooltip.bootstrapTooltip('hide')
521
+ })
522
+ .one('hidden.bs.tooltip', function () {
523
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
524
+ done()
525
+ })
526
+ .bootstrapTooltip('show')
527
+ })
528
+
529
+ QUnit.test('should use title option', function (assert) {
530
+ assert.expect(2)
531
+ var done = assert.async()
532
+ var $tooltip = $('<a href="#" rel="tooltip"/>')
533
+ .appendTo('#qunit-fixture')
534
+ .bootstrapTooltip({
535
+ title: 'This is a tooltip with some content'
536
+ })
537
+
538
+ $tooltip
539
+ .one('shown.bs.tooltip', function () {
540
+ assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'This is a tooltip with some content', 'title from title option is set')
541
+ $tooltip.bootstrapTooltip('hide')
542
+ })
543
+ .one('hidden.bs.tooltip', function () {
544
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
545
+ done()
546
+ })
547
+ .bootstrapTooltip('show')
548
+ })
549
+
550
+ QUnit.test('should not error when trying to show an top-placed tooltip that has been removed from the dom', function (assert) {
551
+ assert.expect(1)
552
+ var passed = true
553
+ var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
554
+ .appendTo('#qunit-fixture')
555
+ .one('show.bs.tooltip', function () {
556
+ $(this).remove()
557
+ })
558
+ .bootstrapTooltip({
559
+ placement: 'top'
560
+ })
561
+
562
+ try {
563
+ $tooltip.bootstrapTooltip('show')
564
+ } catch (err) {
565
+ passed = false
566
+ }
567
+
568
+ assert.ok(passed, '.tooltip(\'show\') should not throw an error if element no longer is in dom')
569
+ })
570
+
571
+ QUnit.test('should show tooltip if leave event hasn\'t occurred before delay expires', function (assert) {
572
+ assert.expect(2)
573
+ var done = assert.async()
574
+
575
+ var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
576
+ .appendTo('#qunit-fixture')
577
+ .bootstrapTooltip({
578
+ delay: 150
579
+ })
580
+
581
+ setTimeout(function () {
582
+ assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip is not faded active')
583
+ }, 100)
584
+
585
+ setTimeout(function () {
586
+ assert.ok($('.tooltip').is('.fade.show'), '200ms: tooltip is faded active')
587
+ done()
588
+ }, 200)
589
+
590
+ $tooltip.trigger('mouseenter')
591
+ })
592
+
593
+ QUnit.test('should not show tooltip if leave event occurs before delay expires', function (assert) {
594
+ assert.expect(2)
595
+ var done = assert.async()
596
+
597
+ var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
598
+ .appendTo('#qunit-fixture')
599
+ .bootstrapTooltip({
600
+ delay: 150
601
+ })
602
+
603
+ setTimeout(function () {
604
+ assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip not faded active')
605
+ $tooltip.trigger('mouseout')
606
+ }, 100)
607
+
608
+ setTimeout(function () {
609
+ assert.ok(!$('.tooltip').is('.fade.show'), '200ms: tooltip not faded active')
610
+ done()
611
+ }, 200)
612
+
613
+ $tooltip.trigger('mouseenter')
614
+ })
615
+
616
+ QUnit.test('should not hide tooltip if leave event occurs and enter event occurs within the hide delay', function (assert) {
617
+ assert.expect(3)
618
+ var done = assert.async()
619
+
620
+ var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
621
+ .appendTo('#qunit-fixture')
622
+ .bootstrapTooltip({
623
+ delay: {
624
+ show: 0,
625
+ hide: 150
626
+ }
627
+ })
628
+
629
+ setTimeout(function () {
630
+ assert.ok($('.tooltip').is('.fade.show'), '1ms: tooltip faded active')
631
+ $tooltip.trigger('mouseout')
632
+
633
+ setTimeout(function () {
634
+ assert.ok($('.tooltip').is('.fade.show'), '100ms: tooltip still faded active')
635
+ $tooltip.trigger('mouseenter')
636
+ }, 100)
637
+
638
+ setTimeout(function () {
639
+ assert.ok($('.tooltip').is('.fade.show'), '200ms: tooltip still faded active')
640
+ done()
641
+ }, 200)
642
+ }, 0)
643
+
644
+ $tooltip.trigger('mouseenter')
645
+ })
646
+
647
+ QUnit.test('should not show tooltip if leave event occurs before delay expires', function (assert) {
648
+ assert.expect(2)
649
+ var done = assert.async()
650
+
651
+ var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
652
+ .appendTo('#qunit-fixture')
653
+ .bootstrapTooltip({
654
+ delay: 150
655
+ })
656
+
657
+ setTimeout(function () {
658
+ assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip not faded active')
659
+ $tooltip.trigger('mouseout')
660
+ }, 100)
661
+
662
+ setTimeout(function () {
663
+ assert.ok(!$('.tooltip').is('.fade.show'), '200ms: tooltip not faded active')
664
+ done()
665
+ }, 200)
666
+
667
+ $tooltip.trigger('mouseenter')
668
+ })
669
+
670
+ QUnit.test('should not show tooltip if leave event occurs before delay expires, even if hide delay is 0', function (assert) {
671
+ assert.expect(2)
672
+ var done = assert.async()
673
+
674
+ var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
675
+ .appendTo('#qunit-fixture')
676
+ .bootstrapTooltip({
677
+ delay: {
678
+ show: 150,
679
+ hide: 0
680
+ }
681
+ })
682
+
683
+ setTimeout(function () {
684
+ assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip not faded active')
685
+ $tooltip.trigger('mouseout')
686
+ }, 100)
687
+
688
+ setTimeout(function () {
689
+ assert.ok(!$('.tooltip').is('.fade.show'), '250ms: tooltip not faded active')
690
+ done()
691
+ }, 250)
692
+
693
+ $tooltip.trigger('mouseenter')
694
+ })
695
+
696
+ QUnit.test('should wait 200ms before hiding the tooltip', function (assert) {
697
+ assert.expect(3)
698
+ var done = assert.async()
699
+
700
+ var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
701
+ .appendTo('#qunit-fixture')
702
+ .bootstrapTooltip({
703
+ delay: {
704
+ show: 0,
705
+ hide: 150
706
+ }
707
+ })
708
+
709
+ setTimeout(function () {
710
+ assert.ok($($tooltip.data('bs.tooltip').tip).is('.fade.show'), '1ms: tooltip faded active')
711
+
712
+ $tooltip.trigger('mouseout')
713
+
714
+ setTimeout(function () {
715
+ assert.ok($($tooltip.data('bs.tooltip').tip).is('.fade.show'), '100ms: tooltip still faded active')
716
+ }, 100)
717
+
718
+ setTimeout(function () {
719
+ assert.ok(!$($tooltip.data('bs.tooltip').tip).is('.show'), '200ms: tooltip removed')
720
+ done()
721
+ }, 200)
722
+ }, 0)
723
+
724
+ $tooltip.trigger('mouseenter')
725
+ })
726
+
727
+ QUnit.test('should not reload the tooltip on subsequent mouseenter events', function (assert) {
728
+ assert.expect(1)
729
+ var titleHtml = function () {
730
+ var uid = Util.getUID('tooltip')
731
+ return '<p id="tt-content">' + uid + '</p><p>' + uid + '</p><p>' + uid + '</p>'
732
+ }
733
+
734
+ var $tooltip = $('<span id="tt-outer" rel="tooltip" data-trigger="hover" data-placement="top">some text</span>')
735
+ .appendTo('#qunit-fixture')
736
+
737
+ $tooltip.bootstrapTooltip({
738
+ html: true,
739
+ animation: false,
740
+ trigger: 'hover',
741
+ delay: {
742
+ show: 0,
743
+ hide: 500
744
+ },
745
+ container: $tooltip,
746
+ title: titleHtml
747
+ })
748
+
749
+ $('#tt-outer').trigger('mouseenter')
750
+
751
+ var currentUid = $('#tt-content').text()
752
+
753
+ $('#tt-content').trigger('mouseenter')
754
+ assert.strictEqual(currentUid, $('#tt-content').text())
755
+ })
756
+
757
+ QUnit.test('should not reload the tooltip if the mouse leaves and re-enters before hiding', function (assert) {
758
+ assert.expect(4)
759
+
760
+ var titleHtml = function () {
761
+ var uid = Util.getUID('tooltip')
762
+ return '<p id="tt-content">' + uid + '</p><p>' + uid + '</p><p>' + uid + '</p>'
763
+ }
764
+
765
+ var $tooltip = $('<span id="tt-outer" rel="tooltip" data-trigger="hover" data-placement="top">some text</span>')
766
+ .appendTo('#qunit-fixture')
767
+
768
+ $tooltip.bootstrapTooltip({
769
+ html: true,
770
+ animation: false,
771
+ trigger: 'hover',
772
+ delay: {
773
+ show: 0,
774
+ hide: 500
775
+ },
776
+ title: titleHtml
777
+ })
778
+
779
+ var obj = $tooltip.data('bs.tooltip')
780
+
781
+ $('#tt-outer').trigger('mouseenter')
782
+
783
+ var currentUid = $('#tt-content').text()
784
+
785
+ $('#tt-outer').trigger('mouseleave')
786
+ assert.strictEqual(currentUid, $('#tt-content').text())
787
+
788
+ assert.ok(obj._hoverState === 'out', 'the tooltip hoverState should be set to "out"')
789
+
790
+ $('#tt-outer').trigger('mouseenter')
791
+ assert.ok(obj._hoverState === 'show', 'the tooltip hoverState should be set to "show"')
792
+
793
+ assert.strictEqual(currentUid, $('#tt-content').text())
794
+ })
795
+
796
+ QUnit.test('should do nothing when an attempt is made to hide an uninitialized tooltip', function (assert) {
797
+ assert.expect(1)
798
+
799
+ var $tooltip = $('<span data-toggle="tooltip" title="some tip">some text</span>')
800
+ .appendTo('#qunit-fixture')
801
+ .on('hidden.bs.tooltip shown.bs.tooltip', function () {
802
+ assert.ok(false, 'should not fire any tooltip events')
803
+ })
804
+ .bootstrapTooltip('hide')
805
+ assert.strictEqual(typeof $tooltip.data('bs.tooltip'), 'undefined', 'should not initialize the tooltip')
806
+ })
807
+
808
+ QUnit.test('should not remove tooltip if multiple triggers are set and one is still active', function (assert) {
809
+ assert.expect(41)
810
+ var $el = $('<button>Trigger</button>')
811
+ .appendTo('#qunit-fixture')
812
+ .bootstrapTooltip({
813
+ trigger: 'click hover focus',
814
+ animation: false
815
+ })
816
+ var tooltip = $el.data('bs.tooltip')
817
+ var $tooltip = $(tooltip.getTipElement())
818
+
819
+ function showingTooltip() {
820
+ return $tooltip.hasClass('show') || tooltip._hoverState === 'show'
821
+ }
822
+
823
+ var tests = [
824
+ ['mouseenter', 'mouseleave'],
825
+
826
+ ['focusin', 'focusout'],
827
+
828
+ ['click', 'click'],
829
+
830
+ ['mouseenter', 'focusin', 'focusout', 'mouseleave'],
831
+ ['mouseenter', 'focusin', 'mouseleave', 'focusout'],
832
+
833
+ ['focusin', 'mouseenter', 'mouseleave', 'focusout'],
834
+ ['focusin', 'mouseenter', 'focusout', 'mouseleave'],
835
+
836
+ ['click', 'focusin', 'mouseenter', 'focusout', 'mouseleave', 'click'],
837
+ ['mouseenter', 'click', 'focusin', 'focusout', 'mouseleave', 'click'],
838
+ ['mouseenter', 'focusin', 'click', 'click', 'mouseleave', 'focusout']
839
+ ]
840
+
841
+ assert.ok(!showingTooltip())
842
+
843
+ $.each(tests, function (idx, triggers) {
844
+ for (var i = 0, len = triggers.length; i < len; i++) {
845
+ $el.trigger(triggers[i])
846
+ assert.equal(i < len - 1, showingTooltip())
847
+ }
848
+ })
849
+ })
850
+
851
+ QUnit.test('should show on first trigger after hide', function (assert) {
852
+ assert.expect(3)
853
+ var $el = $('<a href="#" rel="tooltip" title="Test tooltip"/>')
854
+ .appendTo('#qunit-fixture')
855
+ .bootstrapTooltip({
856
+ trigger: 'click hover focus',
857
+ animation: false
858
+ })
859
+
860
+ var tooltip = $el.data('bs.tooltip')
861
+ var $tooltip = $(tooltip.getTipElement())
862
+
863
+ function showingTooltip() {
864
+ return $tooltip.hasClass('show') || tooltip._hoverState === 'show'
865
+ }
866
+
867
+ $el.trigger('click')
868
+ assert.ok(showingTooltip(), 'tooltip is faded in')
869
+
870
+ $el.bootstrapTooltip('hide')
871
+ assert.ok(!showingTooltip(), 'tooltip was faded out')
872
+
873
+ $el.trigger('click')
874
+ assert.ok(showingTooltip(), 'tooltip is faded in again')
875
+ })
876
+
877
+ QUnit.test('should hide tooltip when their containing modal is closed', function (assert) {
878
+ assert.expect(1)
879
+ var done = assert.async()
880
+ var templateHTML = '<div id="modal-test" class="modal">' +
881
+ '<div class="modal-dialog" role="document">' +
882
+ '<div class="modal-content">' +
883
+ '<div class="modal-body">' +
884
+ '<a id="tooltipTest" href="#" data-toggle="tooltip" title="Some tooltip text!">Tooltip</a>' +
885
+ '</div>' +
886
+ '</div>' +
887
+ '</div>' +
888
+ '</div>'
889
+
890
+ $(templateHTML).appendTo('#qunit-fixture')
891
+ $('#tooltipTest')
892
+ .bootstrapTooltip({
893
+ trigger: 'manuel'
894
+ })
895
+ .on('shown.bs.tooltip', function () {
896
+ $('#modal-test').modal('hide')
897
+ })
898
+ .on('hide.bs.tooltip', function () {
899
+ assert.ok(true, 'tooltip hide')
900
+ done()
901
+ })
902
+
903
+ $('#modal-test')
904
+ .on('shown.bs.modal', function () {
905
+ $('#tooltipTest').bootstrapTooltip('show')
906
+ })
907
+ .modal('show')
908
+ })
909
+
910
+ QUnit.test('should allow to close modal if the tooltip element is detached', function (assert) {
911
+ assert.expect(1)
912
+ var done = assert.async()
913
+ var templateHTML = [
914
+ '<div id="modal-test" class="modal">',
915
+ ' <div class="modal-dialog" role="document">',
916
+ ' <div class="modal-content">',
917
+ ' <div class="modal-body">',
918
+ ' <a id="tooltipTest" href="#" data-toggle="tooltip" title="Some tooltip text!">Tooltip</a>',
919
+ ' </div>',
920
+ ' </div>',
921
+ ' </div>',
922
+ '</div>'
923
+ ].join('')
924
+
925
+ $(templateHTML).appendTo('#qunit-fixture')
926
+ var $tooltip = $('#tooltipTest')
927
+ var $modal = $('#modal-test')
928
+
929
+ $tooltip.on('shown.bs.tooltip', function () {
930
+ $tooltip.detach()
931
+ $tooltip.bootstrapTooltip('dispose')
932
+ $modal.modal('hide')
933
+ })
934
+
935
+ $modal.on('shown.bs.modal', function () {
936
+ $tooltip.bootstrapTooltip({
937
+ trigger: 'manuel'
938
+ })
939
+ .bootstrapTooltip('show')
940
+ })
941
+ .on('hidden.bs.modal', function () {
942
+ assert.ok(true, 'modal hidden')
943
+ done()
944
+ })
945
+ .modal('show')
946
+ })
947
+
948
+ QUnit.test('should reset tip classes when hidden event triggered', function (assert) {
949
+ assert.expect(2)
950
+ var done = assert.async()
951
+ var $el = $('<a href="#" rel="tooltip" title="Test tooltip"/>')
952
+ .appendTo('#qunit-fixture')
953
+ .bootstrapTooltip('show')
954
+ .on('hidden.bs.tooltip', function () {
955
+ var tooltip = $el.data('bs.tooltip')
956
+ var $tooltip = $(tooltip.getTipElement())
957
+ assert.ok($tooltip.hasClass('tooltip'))
958
+ assert.ok($tooltip.hasClass('fade'))
959
+ done()
960
+ })
961
+
962
+ $el.bootstrapTooltip('hide')
963
+ })
964
+
965
+ QUnit.test('should convert number in title to string', function (assert) {
966
+ assert.expect(1)
967
+ var done = assert.async()
968
+ var $el = $('<a href="#" rel="tooltip" title="7"/>')
969
+ .appendTo('#qunit-fixture')
970
+ .on('shown.bs.tooltip', function () {
971
+ var tooltip = $el.data('bs.tooltip')
972
+ var $tooltip = $(tooltip.getTipElement())
973
+ assert.strictEqual($tooltip.children().text(), '7')
974
+ done()
975
+ })
976
+
977
+ $el.bootstrapTooltip('show')
978
+ })
979
+
980
+ QUnit.test('tooltip should be shown right away after the call of disable/enable', function (assert) {
981
+ assert.expect(2)
982
+ var done = assert.async()
983
+
984
+ var $trigger = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
985
+ .appendTo('#qunit-fixture')
986
+ .bootstrapTooltip()
987
+ .on('shown.bs.tooltip', function () {
988
+ assert.strictEqual($('.tooltip').hasClass('show'), true)
989
+ done()
990
+ })
991
+
992
+ $trigger.bootstrapTooltip('disable')
993
+ $trigger.trigger($.Event('click'))
994
+ setTimeout(function () {
995
+ assert.strictEqual($('.tooltip').length === 0, true)
996
+ $trigger.bootstrapTooltip('enable')
997
+ $trigger.trigger($.Event('click'))
998
+ }, 200)
999
+ })
1000
+
1001
+ QUnit.test('should call Popper.js to update', function (assert) {
1002
+ assert.expect(2)
1003
+
1004
+ var $tooltip = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
1005
+ .appendTo('#qunit-fixture')
1006
+ .bootstrapTooltip()
1007
+
1008
+ var tooltip = $tooltip.data('bs.tooltip')
1009
+ tooltip.show()
1010
+ assert.ok(tooltip._popper)
1011
+
1012
+ var spyPopper = sinon.spy(tooltip._popper, 'scheduleUpdate')
1013
+ tooltip.update()
1014
+ assert.ok(spyPopper.called)
1015
+ })
1016
+
1017
+ QUnit.test('should not call Popper.js to update', function (assert) {
1018
+ assert.expect(1)
1019
+
1020
+ var $tooltip = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
1021
+ .appendTo('#qunit-fixture')
1022
+ .bootstrapTooltip()
1023
+
1024
+ var tooltip = $tooltip.data('bs.tooltip')
1025
+ tooltip.update()
1026
+
1027
+ assert.ok(tooltip._popper === null)
1028
+ })
1029
+
1030
+ QUnit.test('should use Popper.js to get the tip on placement change', function (assert) {
1031
+ assert.expect(1)
1032
+
1033
+ var $tooltip = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
1034
+ .appendTo('#qunit-fixture')
1035
+ .bootstrapTooltip()
1036
+
1037
+ var $tipTest = $('<div class="bs-tooltip" />')
1038
+ .appendTo('#qunit-fixture')
1039
+
1040
+ var tooltip = $tooltip.data('bs.tooltip')
1041
+ tooltip.tip = null
1042
+
1043
+ tooltip._handlePopperPlacementChange({
1044
+ instance: {
1045
+ popper: $tipTest[0]
1046
+ },
1047
+ placement: 'auto'
1048
+ })
1049
+
1050
+ assert.ok(tooltip.tip === $tipTest[0])
1051
+ })
1052
+
1053
+ QUnit.test('should toggle enabled', function (assert) {
1054
+ assert.expect(3)
1055
+
1056
+ var $tooltip = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
1057
+ .appendTo('#qunit-fixture')
1058
+ .bootstrapTooltip()
1059
+
1060
+ var tooltip = $tooltip.data('bs.tooltip')
1061
+
1062
+ assert.strictEqual(tooltip._isEnabled, true)
1063
+
1064
+ tooltip.toggleEnabled()
1065
+
1066
+ assert.strictEqual(tooltip._isEnabled, false)
1067
+
1068
+ tooltip.toggleEnabled()
1069
+
1070
+ assert.strictEqual(tooltip._isEnabled, true)
1071
+ })
1072
+
1073
+ QUnit.test('should create offset modifier correctly when offset option is a function', function (assert) {
1074
+ assert.expect(2)
1075
+
1076
+ var getOffset = function (offsets) {
1077
+ return offsets
1078
+ }
1079
+
1080
+ var $trigger = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
1081
+ .appendTo('#qunit-fixture')
1082
+ .bootstrapTooltip({
1083
+ offset: getOffset
1084
+ })
1085
+
1086
+ var tooltip = $trigger.data('bs.tooltip')
1087
+ var offset = tooltip._getOffset()
1088
+
1089
+ assert.ok(typeof offset.offset === 'undefined')
1090
+ assert.ok(typeof offset.fn === 'function')
1091
+ })
1092
+
1093
+ QUnit.test('should create offset modifier correctly when offset option is not a function', function (assert) {
1094
+ assert.expect(2)
1095
+
1096
+ var myOffset = 42
1097
+ var $trigger = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
1098
+ .appendTo('#qunit-fixture')
1099
+ .bootstrapTooltip({
1100
+ offset: myOffset
1101
+ })
1102
+
1103
+ var tooltip = $trigger.data('bs.tooltip')
1104
+ var offset = tooltip._getOffset()
1105
+
1106
+ assert.strictEqual(offset.offset, myOffset)
1107
+ assert.ok(typeof offset.fn === 'undefined')
1108
+ })
1109
+ })