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,143 @@
1
+ /* eslint-env node */
2
+ /* eslint no-process-env: 0 */
3
+
4
+ const path = require('path')
5
+ const ip = require('ip')
6
+ const {
7
+ browsers,
8
+ browsersKeys
9
+ } = require('./browsers')
10
+
11
+ const jqueryFile = process.env.USE_OLD_JQUERY ? 'https://code.jquery.com/jquery-1.9.1.min.js' : 'node_modules/jquery/dist/jquery.slim.min.js'
12
+ const bundle = process.env.BUNDLE === 'true'
13
+ const browserStack = process.env.BROWSER === 'true'
14
+
15
+ const frameworks = [
16
+ 'qunit',
17
+ 'sinon'
18
+ ]
19
+
20
+ const plugins = [
21
+ 'karma-qunit',
22
+ 'karma-sinon'
23
+ ]
24
+
25
+ const reporters = ['dots']
26
+
27
+ const detectBrowsers = {
28
+ usePhantomJS: false,
29
+ postDetection(availableBrowser) {
30
+ if (typeof process.env.TRAVIS_JOB_ID !== 'undefined' || availableBrowser.includes('Chrome')) {
31
+ return ['ChromeHeadless']
32
+ }
33
+
34
+ if (availableBrowser.includes('Firefox')) {
35
+ return ['FirefoxHeadless']
36
+ }
37
+
38
+ throw new Error('Please install Firefox or Chrome')
39
+ }
40
+ }
41
+
42
+ const customLaunchers = {
43
+ FirefoxHeadless: {
44
+ base: 'Firefox',
45
+ flags: ['-headless']
46
+ }
47
+ }
48
+
49
+ let files = [
50
+ 'node_modules/popper.js/dist/umd/popper.min.js',
51
+ 'node_modules/hammer-simulator/index.js'
52
+ ]
53
+
54
+ const conf = {
55
+ basePath: '../..',
56
+ port: 9876,
57
+ colors: true,
58
+ autoWatch: false,
59
+ singleRun: true,
60
+ concurrency: Infinity,
61
+ client: {
62
+ qunit: {
63
+ showUI: true
64
+ }
65
+ }
66
+ }
67
+
68
+ if (bundle) {
69
+ frameworks.push('detectBrowsers')
70
+ plugins.push(
71
+ 'karma-chrome-launcher',
72
+ 'karma-firefox-launcher',
73
+ 'karma-detect-browsers'
74
+ )
75
+ conf.customLaunchers = customLaunchers
76
+ conf.detectBrowsers = detectBrowsers
77
+ files = files.concat([
78
+ jqueryFile,
79
+ 'dist/js/bootstrap.js'
80
+ ])
81
+ } else if (browserStack) {
82
+ conf.hostname = ip.address()
83
+ conf.browserStack = {
84
+ username: process.env.BROWSER_STACK_USERNAME,
85
+ accessKey: process.env.BROWSER_STACK_ACCESS_KEY,
86
+ build: `bootstrap-${new Date().toISOString()}`,
87
+ project: 'Bootstrap',
88
+ retryLimit: 2
89
+ }
90
+ plugins.push('karma-browserstack-launcher')
91
+ conf.customLaunchers = browsers
92
+ conf.browsers = browsersKeys
93
+ reporters.push('BrowserStack')
94
+ files = files.concat([
95
+ 'node_modules/jquery/dist/jquery.slim.min.js',
96
+ 'js/dist/util.js',
97
+ 'js/dist/tooltip.js',
98
+ 'js/dist/!(util|index|tooltip).js' // include all of our js/dist files except util.js, index.js and tooltip.js
99
+ ])
100
+ } else {
101
+ frameworks.push('detectBrowsers')
102
+ plugins.push(
103
+ 'karma-chrome-launcher',
104
+ 'karma-firefox-launcher',
105
+ 'karma-detect-browsers',
106
+ 'karma-coverage-istanbul-reporter'
107
+ )
108
+ files = files.concat([
109
+ jqueryFile,
110
+ 'js/coverage/dist/util.js',
111
+ 'js/coverage/dist/tooltip.js',
112
+ 'js/coverage/dist/!(util|index|tooltip).js' // include all of our js/dist files except util.js, index.js and tooltip.js
113
+ ])
114
+ reporters.push('coverage-istanbul')
115
+ conf.customLaunchers = customLaunchers
116
+ conf.detectBrowsers = detectBrowsers
117
+ conf.coverageIstanbulReporter = {
118
+ dir: path.resolve(__dirname, '../coverage/'),
119
+ reports: ['lcov', 'text-summary'],
120
+ thresholds: {
121
+ emitWarning: false,
122
+ global: {
123
+ statements: 90,
124
+ branches: 86,
125
+ functions: 89,
126
+ lines: 90
127
+ }
128
+ }
129
+ }
130
+ }
131
+
132
+ files.push('js/tests/unit/*.js')
133
+
134
+ conf.frameworks = frameworks
135
+ conf.plugins = plugins
136
+ conf.reporters = reporters
137
+ conf.files = files
138
+
139
+ module.exports = (karmaConfig) => {
140
+ // possible values: karmaConfig.LOG_DISABLE || karmaConfig.LOG_ERROR || karmaConfig.LOG_WARN || karmaConfig.LOG_INFO || karmaConfig.LOG_DEBUG
141
+ conf.logLevel = karmaConfig.LOG_ERROR || karmaConfig.LOG_WARN
142
+ karmaConfig.set(conf)
143
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "env": {
3
+ "es6": false,
4
+ "jquery": true,
5
+ "qunit": true
6
+ },
7
+ "globals": {
8
+ "bootstrap": false,
9
+ "sinon": false,
10
+ "Util": false,
11
+ "Alert": false,
12
+ "Button": false,
13
+ "Carousel": false,
14
+ "Simulator": false,
15
+ "Toast": false
16
+ },
17
+ "parserOptions": {
18
+ "ecmaVersion": 5,
19
+ "sourceType": "script"
20
+ },
21
+ "extends": "../../../.eslintrc.json",
22
+ "rules": {
23
+ "no-console": "error",
24
+ // Best Practices
25
+ "consistent-return": "off",
26
+ "no-magic-numbers": "off",
27
+ "vars-on-top": "off",
28
+
29
+ // Stylistic Issues
30
+ "func-style": "off",
31
+ "spaced-comment": "off",
32
+
33
+ // ECMAScript 6
34
+ "no-var": "off",
35
+ "object-shorthand": "off",
36
+ "prefer-arrow-callback": "off",
37
+ "prefer-template": "off",
38
+ "prefer-rest-params": "off"
39
+ }
40
+ }
@@ -0,0 +1,123 @@
1
+ $(function () {
2
+ 'use strict'
3
+
4
+ QUnit.module('alert plugin')
5
+
6
+ QUnit.test('should be defined on jquery object', function (assert) {
7
+ assert.expect(1)
8
+ assert.ok($(document.body).alert, 'alert method is defined')
9
+ })
10
+
11
+ QUnit.module('alert', {
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.bootstrapAlert = $.fn.alert.noConflict()
15
+ },
16
+ afterEach: function () {
17
+ $.fn.alert = $.fn.bootstrapAlert
18
+ delete $.fn.bootstrapAlert
19
+ $('#qunit-fixture').html('')
20
+ }
21
+ })
22
+
23
+ QUnit.test('should provide no conflict', function (assert) {
24
+ assert.expect(1)
25
+ assert.strictEqual(typeof $.fn.alert, 'undefined', 'alert was set back to undefined (org value)')
26
+ })
27
+
28
+ QUnit.test('should return jquery collection containing the element', function (assert) {
29
+ assert.expect(2)
30
+ var $el = $('<div/>')
31
+ var $alert = $el.bootstrapAlert()
32
+ assert.ok($alert instanceof $, 'returns jquery collection')
33
+ assert.strictEqual($alert[0], $el[0], 'collection contains element')
34
+ })
35
+
36
+ QUnit.test('should fade element out on clicking .close', function (assert) {
37
+ assert.expect(1)
38
+ var alertHTML = '<div class="alert alert-danger fade show">' +
39
+ '<a class="close" href="#" data-dismiss="alert">×</a>' +
40
+ '<p><strong>Holy guacamole!</strong> Best check yo self, you\'re not looking too good.</p>' +
41
+ '</div>'
42
+
43
+ var $alert = $(alertHTML).bootstrapAlert().appendTo($('#qunit-fixture'))
44
+
45
+ $alert.find('.close').trigger('click')
46
+
47
+ assert.strictEqual($alert.hasClass('show'), false, 'remove .show class on .close click')
48
+ })
49
+
50
+ QUnit.test('should remove element when clicking .close', function (assert) {
51
+ assert.expect(2)
52
+ var done = assert.async()
53
+ var alertHTML = '<div class="alert alert-danger fade show">' +
54
+ '<a class="close" href="#" data-dismiss="alert">×</a>' +
55
+ '<p><strong>Holy guacamole!</strong> Best check yo self, you\'re not looking too good.</p>' +
56
+ '</div>'
57
+ var $alert = $(alertHTML).appendTo('#qunit-fixture').bootstrapAlert()
58
+
59
+ assert.notEqual($('#qunit-fixture').find('.alert').length, 0, 'element added to dom')
60
+
61
+ $alert
62
+ .one('closed.bs.alert', function () {
63
+ assert.strictEqual($('#qunit-fixture').find('.alert').length, 0, 'element removed from dom')
64
+ done()
65
+ })
66
+ .find('.close')
67
+ .trigger('click')
68
+ })
69
+
70
+ QUnit.test('should not fire closed when close is prevented', function (assert) {
71
+ assert.expect(1)
72
+ var done = assert.async()
73
+ $('<div class="alert"/>')
74
+ .on('close.bs.alert', function (e) {
75
+ e.preventDefault()
76
+ assert.ok(true, 'close event fired')
77
+ done()
78
+ })
79
+ .on('closed.bs.alert', function () {
80
+ assert.ok(false, 'closed event fired')
81
+ })
82
+ .bootstrapAlert('close')
83
+ })
84
+
85
+ QUnit.test('close should use internal _element if no element provided', function (assert) {
86
+ assert.expect(1)
87
+
88
+ var done = assert.async()
89
+ var $el = $('<div/>')
90
+ var $alert = $el.bootstrapAlert()
91
+ var alertInstance = $alert.data('bs.alert')
92
+
93
+ $alert.one('closed.bs.alert', function () {
94
+ assert.ok('alert closed')
95
+ done()
96
+ })
97
+
98
+ alertInstance.close()
99
+ })
100
+
101
+ QUnit.test('dispose should remove data and the element', function (assert) {
102
+ assert.expect(2)
103
+
104
+ var $el = $('<div/>')
105
+ var $alert = $el.bootstrapAlert()
106
+
107
+ assert.ok(typeof $alert.data('bs.alert') !== 'undefined')
108
+
109
+ $alert.data('bs.alert').dispose()
110
+
111
+ assert.ok(typeof $alert.data('bs.button') === 'undefined')
112
+ })
113
+
114
+ QUnit.test('should return alert version', function (assert) {
115
+ assert.expect(1)
116
+
117
+ if (typeof Alert !== 'undefined') {
118
+ assert.ok(typeof Alert.VERSION === 'string')
119
+ } else {
120
+ assert.notOk()
121
+ }
122
+ })
123
+ })
@@ -0,0 +1,222 @@
1
+ $(function () {
2
+ 'use strict'
3
+
4
+ QUnit.module('button plugin')
5
+
6
+ QUnit.test('should be defined on jquery object', function (assert) {
7
+ assert.expect(1)
8
+ assert.ok($(document.body).button, 'button method is defined')
9
+ })
10
+
11
+ QUnit.module('button', {
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.bootstrapButton = $.fn.button.noConflict()
15
+ },
16
+ afterEach: function () {
17
+ $.fn.button = $.fn.bootstrapButton
18
+ delete $.fn.bootstrapButton
19
+ $('#qunit-fixture').html('')
20
+ }
21
+ })
22
+
23
+ QUnit.test('should provide no conflict', function (assert) {
24
+ assert.expect(1)
25
+ assert.strictEqual(typeof $.fn.button, 'undefined', 'button was set back to undefined (org value)')
26
+ })
27
+
28
+ QUnit.test('should return jquery collection containing the element', function (assert) {
29
+ assert.expect(2)
30
+ var $el = $('<div/>')
31
+ var $button = $el.bootstrapButton()
32
+ assert.ok($button instanceof $, 'returns jquery collection')
33
+ assert.strictEqual($button[0], $el[0], 'collection contains element')
34
+ })
35
+
36
+ QUnit.test('should toggle active', function (assert) {
37
+ assert.expect(2)
38
+ var $btn = $('<button class="btn" data-toggle="button">mdo</button>')
39
+ assert.ok(!$btn.hasClass('active'), 'btn does not have active class')
40
+ $btn.bootstrapButton('toggle')
41
+ assert.ok($btn.hasClass('active'), 'btn has class active')
42
+ })
43
+
44
+ QUnit.test('should toggle active when btn children are clicked', function (assert) {
45
+ assert.expect(2)
46
+ var $btn = $('<button class="btn" data-toggle="button">mdo</button>')
47
+ var $inner = $('<i/>')
48
+ $btn
49
+ .append($inner)
50
+ .appendTo('#qunit-fixture')
51
+ assert.ok(!$btn.hasClass('active'), 'btn does not have active class')
52
+ $inner.trigger('click')
53
+ assert.ok($btn.hasClass('active'), 'btn has class active')
54
+ })
55
+
56
+ QUnit.test('should toggle aria-pressed', function (assert) {
57
+ assert.expect(2)
58
+ var $btn = $('<button class="btn" data-toggle="button" aria-pressed="false">redux</button>')
59
+ assert.strictEqual($btn.attr('aria-pressed'), 'false', 'btn aria-pressed state is false')
60
+ $btn.bootstrapButton('toggle')
61
+ assert.strictEqual($btn.attr('aria-pressed'), 'true', 'btn aria-pressed state is true')
62
+ })
63
+
64
+ QUnit.test('should toggle aria-pressed on buttons with container', function (assert) {
65
+ assert.expect(1)
66
+ var groupHTML = '<div class="btn-group" data-toggle="buttons">' +
67
+ '<button id="btn1" class="btn btn-secondary" type="button">One</button>' +
68
+ '<button class="btn btn-secondary" type="button">Two</button>' +
69
+ '</div>'
70
+ $('#qunit-fixture').append(groupHTML)
71
+ $('#btn1').bootstrapButton('toggle')
72
+ assert.strictEqual($('#btn1').attr('aria-pressed'), 'true')
73
+ })
74
+
75
+ QUnit.test('should toggle aria-pressed when btn children are clicked', function (assert) {
76
+ assert.expect(2)
77
+ var $btn = $('<button class="btn" data-toggle="button" aria-pressed="false">redux</button>')
78
+ var $inner = $('<i/>')
79
+ $btn
80
+ .append($inner)
81
+ .appendTo('#qunit-fixture')
82
+ assert.strictEqual($btn.attr('aria-pressed'), 'false', 'btn aria-pressed state is false')
83
+ $inner.trigger('click')
84
+ assert.strictEqual($btn.attr('aria-pressed'), 'true', 'btn aria-pressed state is true')
85
+ })
86
+
87
+ QUnit.test('should trigger input change event when toggled button has input field', function (assert) {
88
+ assert.expect(1)
89
+ var done = assert.async()
90
+
91
+ var groupHTML = '<div class="btn-group" data-toggle="buttons">' +
92
+ '<label class="btn btn-primary">' +
93
+ '<input type="radio" id="radio" autocomplete="off">Radio' +
94
+ '</label>' +
95
+ '</div>'
96
+ var $group = $(groupHTML).appendTo('#qunit-fixture')
97
+
98
+ $group.find('input').on('change', function (e) {
99
+ e.preventDefault()
100
+ assert.ok(true, 'change event fired')
101
+ done()
102
+ })
103
+
104
+ $group.find('label').trigger('click')
105
+ })
106
+
107
+ QUnit.test('should check for closest matching toggle', function (assert) {
108
+ assert.expect(12)
109
+ var groupHTML = '<div class="btn-group" data-toggle="buttons">' +
110
+ '<label class="btn btn-primary active">' +
111
+ '<input type="radio" name="options" id="option1" checked="true"> Option 1' +
112
+ '</label>' +
113
+ '<label class="btn btn-primary">' +
114
+ '<input type="radio" name="options" id="option2"> Option 2' +
115
+ '</label>' +
116
+ '<label class="btn btn-primary">' +
117
+ '<input type="radio" name="options" id="option3"> Option 3' +
118
+ '</label>' +
119
+ '</div>'
120
+ var $group = $(groupHTML).appendTo('#qunit-fixture')
121
+
122
+ var $btn1 = $group.children().eq(0)
123
+ var $btn2 = $group.children().eq(1)
124
+
125
+ assert.ok($btn1.hasClass('active'), 'btn1 has active class')
126
+ assert.ok($btn1.find('input').prop('checked'), 'btn1 is checked')
127
+ assert.ok(!$btn2.hasClass('active'), 'btn2 does not have active class')
128
+ assert.ok(!$btn2.find('input').prop('checked'), 'btn2 is not checked')
129
+ $btn2.find('input').trigger('click')
130
+ assert.ok(!$btn1.hasClass('active'), 'btn1 does not have active class')
131
+ assert.ok(!$btn1.find('input').prop('checked'), 'btn1 is not checked')
132
+ assert.ok($btn2.hasClass('active'), 'btn2 has active class')
133
+ assert.ok($btn2.find('input').prop('checked'), 'btn2 is checked')
134
+
135
+ $btn2.find('input').trigger('click') // Clicking an already checked radio should not un-check it
136
+ assert.ok(!$btn1.hasClass('active'), 'btn1 does not have active class')
137
+ assert.ok(!$btn1.find('input').prop('checked'), 'btn1 is not checked')
138
+ assert.ok($btn2.hasClass('active'), 'btn2 has active class')
139
+ assert.ok($btn2.find('input').prop('checked'), 'btn2 is checked')
140
+ })
141
+
142
+ QUnit.test('should only toggle selectable inputs', function (assert) {
143
+ assert.expect(6)
144
+ var groupHTML = '<div class="btn-group" data-toggle="buttons">' +
145
+ '<label class="btn btn-primary active">' +
146
+ '<input type="hidden" name="option1" id="option1-default" value="false">' +
147
+ '<input type="checkbox" name="option1" id="option1" checked="true"> Option 1' +
148
+ '</label>' +
149
+ '</div>'
150
+ var $group = $(groupHTML).appendTo('#qunit-fixture')
151
+
152
+ var $btn = $group.children().eq(0)
153
+ var $hidden = $btn.find('input#option1-default')
154
+ var $cb = $btn.find('input#option1')
155
+
156
+ assert.ok($btn.hasClass('active'), 'btn has active class')
157
+ assert.ok($cb.prop('checked'), 'btn is checked')
158
+ assert.ok(!$hidden.prop('checked'), 'hidden is not checked')
159
+ $btn.trigger('click')
160
+ assert.ok(!$btn.hasClass('active'), 'btn does not have active class')
161
+ assert.ok(!$cb.prop('checked'), 'btn is not checked')
162
+ assert.ok(!$hidden.prop('checked'), 'hidden is not checked') // should not be changed
163
+ })
164
+
165
+ QUnit.test('should not add aria-pressed on labels for radio/checkbox inputs in a data-toggle="buttons" group', function (assert) {
166
+ assert.expect(2)
167
+ var groupHTML = '<div class="btn-group" data-toggle="buttons">' +
168
+ '<label class="btn btn-primary"><input type="checkbox" autocomplete="off"> Checkbox</label>' +
169
+ '<label class="btn btn-primary"><input type="radio" name="options" autocomplete="off"> Radio</label>' +
170
+ '</div>'
171
+ var $group = $(groupHTML).appendTo('#qunit-fixture')
172
+
173
+ var $btn1 = $group.children().eq(0)
174
+ var $btn2 = $group.children().eq(1)
175
+
176
+ $btn1.find('input').trigger('click')
177
+ assert.ok($btn1.is(':not([aria-pressed])'), 'label for nested checkbox input has not been given an aria-pressed attribute')
178
+
179
+ $btn2.find('input').trigger('click')
180
+ assert.ok($btn2.is(':not([aria-pressed])'), 'label for nested radio input has not been given an aria-pressed attribute')
181
+ })
182
+
183
+ QUnit.test('should handle disabled attribute on non-button elements', function (assert) {
184
+ assert.expect(2)
185
+ var groupHTML = '<div class="btn-group disabled" data-toggle="buttons" aria-disabled="true" disabled>' +
186
+ '<label class="btn btn-danger disabled" aria-disabled="true" disabled>' +
187
+ '<input type="checkbox" aria-disabled="true" autocomplete="off" disabled class="disabled"/>' +
188
+ '</label>' +
189
+ '</div>'
190
+ var $group = $(groupHTML).appendTo('#qunit-fixture')
191
+
192
+ var $btn = $group.children().eq(0)
193
+ var $input = $btn.children().eq(0)
194
+
195
+ $btn.trigger('click')
196
+ assert.ok($btn.is(':not(.active)'), 'button did not become active')
197
+ assert.ok(!$input.is(':checked'), 'checkbox did not get checked')
198
+ })
199
+
200
+ QUnit.test('dispose should remove data and the element', function (assert) {
201
+ assert.expect(2)
202
+
203
+ var $el = $('<div/>')
204
+ var $button = $el.bootstrapButton()
205
+
206
+ assert.ok(typeof $button.data('bs.button') !== 'undefined')
207
+
208
+ $button.data('bs.button').dispose()
209
+
210
+ assert.ok(typeof $button.data('bs.button') === 'undefined')
211
+ })
212
+
213
+ QUnit.test('should return button version', function (assert) {
214
+ assert.expect(1)
215
+
216
+ if (typeof Button !== 'undefined') {
217
+ assert.ok(typeof Button.VERSION === 'string')
218
+ } else {
219
+ assert.notOk()
220
+ }
221
+ })
222
+ })