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,471 @@
1
+ $(function () {
2
+ 'use strict'
3
+
4
+ QUnit.module('popover plugin')
5
+
6
+ QUnit.test('should be defined on jquery object', function (assert) {
7
+ assert.expect(1)
8
+ assert.ok($(document.body).popover, 'popover method is defined')
9
+ })
10
+
11
+ QUnit.module('popover', {
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.bootstrapPopover = $.fn.popover.noConflict()
15
+ },
16
+ afterEach: function () {
17
+ $.fn.popover = $.fn.bootstrapPopover
18
+ delete $.fn.bootstrapPopover
19
+ $('.popover').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.popover, 'undefined', 'popover 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.bootstrapPopover()
33
+ try {
34
+ $el.bootstrapPopover('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 $popover = $el.bootstrapPopover()
44
+ assert.ok($popover instanceof $, 'returns jquery collection')
45
+ assert.strictEqual($popover[0], $el[0], 'collection contains element')
46
+ })
47
+
48
+ QUnit.test('should render popover element', function (assert) {
49
+ assert.expect(2)
50
+ var done = assert.async()
51
+ $('<a href="#" title="mdo" data-content="https://twitter.com/mdo">@mdo</a>')
52
+ .appendTo('#qunit-fixture')
53
+ .on('shown.bs.popover', function () {
54
+ assert.notEqual($('.popover').length, 0, 'popover was inserted')
55
+ $(this).bootstrapPopover('hide')
56
+ })
57
+ .on('hidden.bs.popover', function () {
58
+ assert.strictEqual($('.popover').length, 0, 'popover removed')
59
+ done()
60
+ })
61
+ .bootstrapPopover('show')
62
+ })
63
+
64
+ QUnit.test('should store popover instance in popover data object', function (assert) {
65
+ assert.expect(1)
66
+ var $popover = $('<a href="#" title="mdo" data-content="https://twitter.com/mdo">@mdo</a>').bootstrapPopover()
67
+
68
+ assert.ok($popover.data('bs.popover'), 'popover instance exists')
69
+ })
70
+
71
+ QUnit.test('should store popover trigger in popover instance data object', function (assert) {
72
+ assert.expect(1)
73
+ var $popover = $('<a href="#" title="ResentedHook">@ResentedHook</a>')
74
+ .appendTo('#qunit-fixture')
75
+ .bootstrapPopover()
76
+
77
+ $popover.bootstrapPopover('show')
78
+
79
+ assert.ok($('.popover').data('bs.popover'), 'popover trigger stored in instance data')
80
+ })
81
+
82
+ QUnit.test('should get title and content from options', function (assert) {
83
+ assert.expect(4)
84
+ var done = assert.async()
85
+ var $popover = $('<a href="#">@fat</a>')
86
+ .appendTo('#qunit-fixture')
87
+ .bootstrapPopover({
88
+ title: function () {
89
+ return '@fat'
90
+ },
91
+ content: function () {
92
+ return 'loves writing tests (╯°□°)╯︵ ┻━┻'
93
+ }
94
+ })
95
+
96
+ $popover
97
+ .one('shown.bs.popover', function () {
98
+ assert.notEqual($('.popover').length, 0, 'popover was inserted')
99
+ assert.strictEqual($('.popover .popover-header').text(), '@fat', 'title correctly inserted')
100
+ assert.strictEqual($('.popover .popover-body').text(), 'loves writing tests (╯°□°)╯︵ ┻━┻', 'content correctly inserted')
101
+ $popover.bootstrapPopover('hide')
102
+ })
103
+ .one('hidden.bs.popover', function () {
104
+ assert.strictEqual($('.popover').length, 0, 'popover was removed')
105
+ done()
106
+ })
107
+ .bootstrapPopover('show')
108
+ })
109
+
110
+ QUnit.test('should allow DOMElement title and content (html: true)', function (assert) {
111
+ assert.expect(5)
112
+ var title = document.createTextNode('@glebm <3 writing tests')
113
+ var content = $('<i>¯\\_(ツ)_/¯</i>').get(0)
114
+ var $popover = $('<a href="#" rel="tooltip"/>')
115
+ .appendTo('#qunit-fixture')
116
+ .bootstrapPopover({
117
+ html: true,
118
+ title: title,
119
+ content: content
120
+ })
121
+
122
+ $popover.bootstrapPopover('show')
123
+
124
+ assert.notEqual($('.popover').length, 0, 'popover inserted')
125
+ assert.strictEqual($('.popover .popover-header').text(), '@glebm <3 writing tests', 'title inserted')
126
+ assert.ok($.contains($('.popover').get(0), title), 'title node moved, not copied')
127
+ // toLowerCase because IE8 will return <I>...</I>
128
+ assert.strictEqual($('.popover .popover-body').html().toLowerCase(), '<i>¯\\_(ツ)_/¯</i>', 'content inserted')
129
+ assert.ok($.contains($('.popover').get(0), content), 'content node moved, not copied')
130
+ })
131
+
132
+ QUnit.test('should allow DOMElement title and content (html: false)', function (assert) {
133
+ assert.expect(5)
134
+ var title = document.createTextNode('@glebm <3 writing tests')
135
+ var content = $('<i>¯\\_(ツ)_/¯</i>').get(0)
136
+ var $popover = $('<a href="#" rel="tooltip"/>')
137
+ .appendTo('#qunit-fixture')
138
+ .bootstrapPopover({
139
+ title: title,
140
+ content: content
141
+ })
142
+
143
+ $popover.bootstrapPopover('show')
144
+
145
+ assert.notEqual($('.popover').length, 0, 'popover inserted')
146
+ assert.strictEqual($('.popover .popover-header').text(), '@glebm <3 writing tests', 'title inserted')
147
+ assert.ok(!$.contains($('.popover').get(0), title), 'title node copied, not moved')
148
+ assert.strictEqual($('.popover .popover-body').html(), '¯\\_(ツ)_/¯', 'content inserted')
149
+ assert.ok(!$.contains($('.popover').get(0), content), 'content node copied, not moved')
150
+ })
151
+
152
+ QUnit.test('should not duplicate HTML object', function (assert) {
153
+ assert.expect(6)
154
+ var done = assert.async()
155
+ var $div = $('<div/>').html('loves writing tests (╯°□°)╯︵ ┻━┻')
156
+
157
+ var $popover = $('<a href="#">@fat</a>')
158
+ .appendTo('#qunit-fixture')
159
+ .bootstrapPopover({
160
+ html: true,
161
+ content: function () {
162
+ return $div
163
+ }
164
+ })
165
+
166
+ function popoverInserted() {
167
+ assert.notEqual($('.popover').length, 0, 'popover was inserted')
168
+ assert.equal($('.popover .popover-body').html(), $div[0].outerHTML, 'content correctly inserted')
169
+ }
170
+
171
+ $popover
172
+ .one('shown.bs.popover', function () {
173
+ popoverInserted()
174
+
175
+ $popover.one('hidden.bs.popover', function () {
176
+ assert.strictEqual($('.popover').length, 0, 'popover was removed')
177
+
178
+ $popover.one('shown.bs.popover', function () {
179
+ popoverInserted()
180
+
181
+ $popover.one('hidden.bs.popover', function () {
182
+ assert.strictEqual($('.popover').length, 0, 'popover was removed')
183
+ done()
184
+ }).bootstrapPopover('hide')
185
+ }).bootstrapPopover('show')
186
+ }).bootstrapPopover('hide')
187
+ })
188
+ .bootstrapPopover('show')
189
+ })
190
+
191
+ QUnit.test('should get title and content from attributes', function (assert) {
192
+ assert.expect(4)
193
+ var done = assert.async()
194
+ var $popover = $('<a href="#" title="@mdo" data-content="loves data attributes (づ。◕‿‿◕。)づ ︵ ┻━┻" >@mdo</a>')
195
+ .appendTo('#qunit-fixture')
196
+ .bootstrapPopover()
197
+ .one('shown.bs.popover', function () {
198
+ assert.notEqual($('.popover').length, 0, 'popover was inserted')
199
+ assert.strictEqual($('.popover .popover-header').text(), '@mdo', 'title correctly inserted')
200
+ assert.strictEqual($('.popover .popover-body').text(), 'loves data attributes (づ。◕‿‿◕。)づ ︵ ┻━┻', 'content correctly inserted')
201
+ $popover.bootstrapPopover('hide')
202
+ })
203
+ .one('hidden.bs.popover', function () {
204
+ assert.strictEqual($('.popover').length, 0, 'popover was removed')
205
+ done()
206
+ })
207
+ .bootstrapPopover('show')
208
+ })
209
+
210
+ QUnit.test('should get title and content from attributes ignoring options passed via js', function (assert) {
211
+ assert.expect(4)
212
+ var done = assert.async()
213
+ var $popover = $('<a href="#" title="@mdo" data-content="loves data attributes (づ。◕‿‿◕。)づ ︵ ┻━┻" >@mdo</a>')
214
+ .appendTo('#qunit-fixture')
215
+ .bootstrapPopover({
216
+ title: 'ignored title option',
217
+ content: 'ignored content option'
218
+ })
219
+ .one('shown.bs.popover', function () {
220
+ assert.notEqual($('.popover').length, 0, 'popover was inserted')
221
+ assert.strictEqual($('.popover .popover-header').text(), '@mdo', 'title correctly inserted')
222
+ assert.strictEqual($('.popover .popover-body').text(), 'loves data attributes (づ。◕‿‿◕。)づ ︵ ┻━┻', 'content correctly inserted')
223
+ $popover.bootstrapPopover('hide')
224
+ })
225
+ .one('hidden.bs.popover', function () {
226
+ assert.strictEqual($('.popover').length, 0, 'popover was removed')
227
+ done()
228
+ })
229
+ .bootstrapPopover('show')
230
+ })
231
+
232
+ QUnit.test('should respect custom template', function (assert) {
233
+ assert.expect(3)
234
+ var done = assert.async()
235
+ var $popover = $('<a href="#">@fat</a>')
236
+ .appendTo('#qunit-fixture')
237
+ .bootstrapPopover({
238
+ title: 'Test',
239
+ content: 'Test',
240
+ template: '<div class="popover foobar"><div class="arrow"></div><div class="inner"><h3 class="title"/><div class="content"><p/></div></div></div>'
241
+ })
242
+ .one('shown.bs.popover', function () {
243
+ assert.notEqual($('.popover').length, 0, 'popover was inserted')
244
+ assert.ok($('.popover').hasClass('foobar'), 'custom class is present')
245
+ $popover.bootstrapPopover('hide')
246
+ })
247
+ .one('hidden.bs.popover', function () {
248
+ assert.strictEqual($('.popover').length, 0, 'popover was removed')
249
+ done()
250
+ })
251
+ .bootstrapPopover('show')
252
+ })
253
+
254
+ QUnit.test('should destroy popover', function (assert) {
255
+ assert.expect(7)
256
+ var $popover = $('<div/>')
257
+ .bootstrapPopover({
258
+ trigger: 'hover'
259
+ })
260
+ .on('click.foo', $.noop)
261
+
262
+ assert.ok($popover.data('bs.popover'), 'popover has data')
263
+ assert.ok($._data($popover[0], 'events').mouseover && $._data($popover[0], 'events').mouseout, 'popover has hover event')
264
+ assert.strictEqual($._data($popover[0], 'events').click[0].namespace, 'foo', 'popover has extra click.foo event')
265
+
266
+ $popover.bootstrapPopover('show')
267
+ $popover.bootstrapPopover('dispose')
268
+
269
+ assert.ok(!$popover.hasClass('show'), 'popover is hidden')
270
+ assert.ok(!$popover.data('popover'), 'popover does not have data')
271
+ assert.strictEqual($._data($popover[0], 'events').click[0].namespace, 'foo', 'popover still has click.foo')
272
+ assert.ok(!$._data($popover[0], 'events').mouseover && !$._data($popover[0], 'events').mouseout, 'popover does not have any events')
273
+ })
274
+
275
+ QUnit.test('should render popover element using delegated selector', function (assert) {
276
+ assert.expect(2)
277
+ var done = assert.async()
278
+ var $div = $('<div><a href="#" title="mdo" data-content="https://twitter.com/mdo">@mdo</a></div>')
279
+ .appendTo('#qunit-fixture')
280
+ .bootstrapPopover({
281
+ selector: 'a',
282
+ trigger: 'click'
283
+ })
284
+ .one('shown.bs.popover', function () {
285
+ assert.notEqual($('.popover').length, 0, 'popover was inserted')
286
+ $div.find('a').trigger('click')
287
+ })
288
+ .one('hidden.bs.popover', function () {
289
+ assert.strictEqual($('.popover').length, 0, 'popover was removed')
290
+ done()
291
+ })
292
+
293
+ $div.find('a').trigger('click')
294
+ })
295
+
296
+ QUnit.test('should detach popover content rather than removing it so that event handlers are left intact', function (assert) {
297
+ assert.expect(1)
298
+ var $content = $('<div class="content-with-handler"><a class="btn btn-warning">Button with event handler</a></div>').appendTo('#qunit-fixture')
299
+
300
+ var handlerCalled = false
301
+ $('.content-with-handler .btn').on('click', function () {
302
+ handlerCalled = true
303
+ })
304
+
305
+ var $div = $('<div><a href="#">Show popover</a></div>')
306
+ .appendTo('#qunit-fixture')
307
+ .bootstrapPopover({
308
+ html: true,
309
+ trigger: 'manual',
310
+ container: 'body',
311
+ animation: false,
312
+ content: function () {
313
+ return $content
314
+ }
315
+ })
316
+
317
+ var done = assert.async()
318
+ $div
319
+ .one('shown.bs.popover', function () {
320
+ $div
321
+ .one('hidden.bs.popover', function () {
322
+ $div
323
+ .one('shown.bs.popover', function () {
324
+ $('.content-with-handler .btn').trigger('click')
325
+ assert.ok(handlerCalled, 'content\'s event handler still present')
326
+ $div.bootstrapPopover('dispose')
327
+ done()
328
+ })
329
+ .bootstrapPopover('show')
330
+ })
331
+ .bootstrapPopover('hide')
332
+ })
333
+ .bootstrapPopover('show')
334
+ })
335
+
336
+ QUnit.test('should do nothing when an attempt is made to hide an uninitialized popover', function (assert) {
337
+ assert.expect(1)
338
+
339
+ var $popover = $('<span data-toggle="popover" data-title="some title" data-content="some content">some text</span>')
340
+ .appendTo('#qunit-fixture')
341
+ .on('hidden.bs.popover shown.bs.popover', function () {
342
+ assert.ok(false, 'should not fire any popover events')
343
+ })
344
+ .bootstrapPopover('hide')
345
+ assert.strictEqual(typeof $popover.data('bs.popover'), 'undefined', 'should not initialize the popover')
346
+ })
347
+
348
+ QUnit.test('should fire inserted event', function (assert) {
349
+ assert.expect(2)
350
+ var done = assert.async()
351
+
352
+ $('<a href="#">@Johann-S</a>')
353
+ .appendTo('#qunit-fixture')
354
+ .on('inserted.bs.popover', function () {
355
+ assert.notEqual($('.popover').length, 0, 'popover was inserted')
356
+ assert.ok(true, 'inserted event fired')
357
+ done()
358
+ })
359
+ .bootstrapPopover({
360
+ title: 'Test',
361
+ content: 'Test'
362
+ })
363
+ .bootstrapPopover('show')
364
+ })
365
+
366
+ QUnit.test('should throw an error when show is called on hidden elements', function (assert) {
367
+ assert.expect(1)
368
+ var done = assert.async()
369
+
370
+ try {
371
+ $('<div data-toggle="popover" data-title="some title" data-content="@Johann-S" style="display: none"/>').bootstrapPopover('show')
372
+ } catch (err) {
373
+ assert.strictEqual(err.message, 'Please use show on visible elements')
374
+ done()
375
+ }
376
+ })
377
+
378
+ QUnit.test('should hide popovers when their containing modal is closed', function (assert) {
379
+ assert.expect(1)
380
+ var done = assert.async()
381
+ var templateHTML = '<div id="modal-test" class="modal">' +
382
+ '<div class="modal-dialog" role="document">' +
383
+ '<div class="modal-content">' +
384
+ '<div class="modal-body">' +
385
+ '<button id="popover-test" type="button" class="btn btn-secondary" data-toggle="popover" data-placement="top" data-content="Popover">' +
386
+ 'Popover on top' +
387
+ '</button>' +
388
+ '</div>' +
389
+ '</div>' +
390
+ '</div>' +
391
+ '</div>'
392
+
393
+ $(templateHTML).appendTo('#qunit-fixture')
394
+ $('#popover-test')
395
+ .on('shown.bs.popover', function () {
396
+ $('#modal-test').modal('hide')
397
+ })
398
+ .on('hide.bs.popover', function () {
399
+ assert.ok(true, 'popover hide')
400
+ done()
401
+ })
402
+
403
+ $('#modal-test')
404
+ .on('shown.bs.modal', function () {
405
+ $('#popover-test').bootstrapPopover('show')
406
+ })
407
+ .modal('show')
408
+ })
409
+
410
+ QUnit.test('should convert number to string without error for content and title', function (assert) {
411
+ assert.expect(2)
412
+ var done = assert.async()
413
+ var $popover = $('<a href="#">@mdo</a>')
414
+ .appendTo('#qunit-fixture')
415
+ .bootstrapPopover({
416
+ title: 5,
417
+ content: 7
418
+ })
419
+ .on('shown.bs.popover', function () {
420
+ assert.strictEqual($('.popover .popover-header').text(), '5')
421
+ assert.strictEqual($('.popover .popover-body').text(), '7')
422
+ done()
423
+ })
424
+
425
+ $popover.bootstrapPopover('show')
426
+ })
427
+
428
+ QUnit.test('popover should be shown right away after the call of disable/enable', function (assert) {
429
+ assert.expect(2)
430
+ var done = assert.async()
431
+ var $popover = $('<a href="#">@mdo</a>')
432
+ .appendTo('#qunit-fixture')
433
+ .bootstrapPopover({
434
+ title: 'Test popover',
435
+ content: 'with disable/enable'
436
+ })
437
+ .on('shown.bs.popover', function () {
438
+ assert.strictEqual($('.popover').hasClass('show'), true)
439
+ done()
440
+ })
441
+
442
+ $popover.bootstrapPopover('disable')
443
+ $popover.trigger($.Event('click'))
444
+ setTimeout(function () {
445
+ assert.strictEqual($('.popover').length === 0, true)
446
+ $popover.bootstrapPopover('enable')
447
+ $popover.trigger($.Event('click'))
448
+ }, 200)
449
+ })
450
+
451
+ QUnit.test('popover should call content function only once', function (assert) {
452
+ assert.expect(1)
453
+ var done = assert.async()
454
+ var nbCall = 0
455
+ $('<div id="popover" style="display:none">content</div>').appendTo('#qunit-fixture')
456
+ var $popover = $('<a href="#">@Johann-S</a>')
457
+ .appendTo('#qunit-fixture')
458
+ .bootstrapPopover({
459
+ content: function () {
460
+ nbCall++
461
+ return $('#popover').clone().show().get(0)
462
+ }
463
+ })
464
+ .on('shown.bs.popover', function () {
465
+ assert.strictEqual(nbCall, 1)
466
+ done()
467
+ })
468
+
469
+ $popover.trigger($.Event('click'))
470
+ })
471
+ })