inkstream 0.1.0 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.txt +21 -0
- data/README.md +95 -0
- data/_config.yml +131 -0
- data/_includes/button.html +4 -0
- data/_includes/icon.html +1 -0
- data/_includes/nav-default.html +23 -0
- data/_includes/nav-header.html +25 -0
- data/_includes/post-list.html +59 -0
- data/_includes/post-meta.html +0 -0
- data/_includes/post-pagination.html +29 -0
- data/_includes/promo-section.html +12 -0
- data/_includes/site-before-end.html +1 -0
- data/_includes/site-before-start.html +1 -0
- data/_includes/site-favicons.html +12 -0
- data/_includes/site-fonts.html +13 -0
- data/_includes/site-footer-default.html +17 -0
- data/_includes/site-footer.html +23 -0
- data/_includes/site-header.html +66 -0
- data/_includes/site-styles.html +6 -0
- data/_layouts/blog.html +24 -0
- data/_layouts/default.html +62 -0
- data/_layouts/page.html +35 -0
- data/_layouts/post.html +201 -0
- data/assets/css/styles.css +11167 -0
- data/assets/favicon/android-chrome-192x192.png +0 -0
- data/assets/favicon/android-chrome-512x512.png +0 -0
- data/assets/favicon/apple-touch-icon.png +0 -0
- data/assets/favicon/browserconfig.xml +9 -0
- data/assets/favicon/favicon-16x16.png +0 -0
- data/assets/favicon/favicon-32x32.png +0 -0
- data/assets/favicon/favicon.ico +0 -0
- data/assets/favicon/favicon.svg +1 -0
- data/assets/favicon/mstile-150x150.png +0 -0
- data/assets/favicon/safari-pinned-tab.svg +88 -0
- data/assets/favicon/site.webmanifest +19 -0
- data/assets/images/about-me.jpg +0 -0
- data/assets/images/posts/default-post-img.jpg +0 -0
- data/assets/images/posts/text-syntax.jpg +0 -0
- data/assets/images/posts/welcome.jpg +0 -0
- data/assets/images/profile.png +0 -0
- data/assets/images/promo-banner.jpg +0 -0
- data/assets/js/blog.js +9 -0
- data/assets/js/demo/style-switcher.js +45 -0
- data/assets/logo/logo.jpg +0 -0
- data/assets/logo/logo.svg +1 -0
- data/assets/plugins/bootstrap/js/bootstrap.min.js +7 -0
- data/assets/plugins/jquery-3.3.1.min.js +2 -0
- data/assets/plugins/popper.min.js +5 -0
- data/assets/resume/resume.pdf +0 -0
- data/assets/scss/bootstrap/js/dist/alert.js +199 -0
- data/assets/scss/bootstrap/js/dist/alert.js.map +1 -0
- data/assets/scss/bootstrap/js/dist/button.js +187 -0
- data/assets/scss/bootstrap/js/dist/button.js.map +1 -0
- data/assets/scss/bootstrap/js/dist/carousel.js +668 -0
- data/assets/scss/bootstrap/js/dist/carousel.js.map +1 -0
- data/assets/scss/bootstrap/js/dist/collapse.js +428 -0
- data/assets/scss/bootstrap/js/dist/collapse.js.map +1 -0
- data/assets/scss/bootstrap/js/dist/dropdown.js +595 -0
- data/assets/scss/bootstrap/js/dist/dropdown.js.map +1 -0
- data/assets/scss/bootstrap/js/dist/index.js +23 -0
- data/assets/scss/bootstrap/js/dist/index.js.map +1 -0
- data/assets/scss/bootstrap/js/dist/modal.js +650 -0
- data/assets/scss/bootstrap/js/dist/modal.js.map +1 -0
- data/assets/scss/bootstrap/js/dist/popover.js +261 -0
- data/assets/scss/bootstrap/js/dist/popover.js.map +1 -0
- data/assets/scss/bootstrap/js/dist/scrollspy.js +375 -0
- data/assets/scss/bootstrap/js/dist/scrollspy.js.map +1 -0
- data/assets/scss/bootstrap/js/dist/tab.js +269 -0
- data/assets/scss/bootstrap/js/dist/tab.js.map +1 -0
- data/assets/scss/bootstrap/js/dist/toast.js +283 -0
- data/assets/scss/bootstrap/js/dist/toast.js.map +1 -0
- data/assets/scss/bootstrap/js/dist/tooltip.js +760 -0
- data/assets/scss/bootstrap/js/dist/tooltip.js.map +1 -0
- data/assets/scss/bootstrap/js/dist/util.js +172 -0
- data/assets/scss/bootstrap/js/dist/util.js.map +1 -0
- data/assets/scss/bootstrap/js/src/alert.js +179 -0
- data/assets/scss/bootstrap/js/src/button.js +171 -0
- data/assets/scss/bootstrap/js/src/carousel.js +606 -0
- data/assets/scss/bootstrap/js/src/collapse.js +402 -0
- data/assets/scss/bootstrap/js/src/dropdown.js +545 -0
- data/assets/scss/bootstrap/js/src/index.js +52 -0
- data/assets/scss/bootstrap/js/src/modal.js +594 -0
- data/assets/scss/bootstrap/js/src/popover.js +184 -0
- data/assets/scss/bootstrap/js/src/scrollspy.js +326 -0
- data/assets/scss/bootstrap/js/src/tab.js +260 -0
- data/assets/scss/bootstrap/js/src/toast.js +227 -0
- data/assets/scss/bootstrap/js/src/tooltip.js +752 -0
- data/assets/scss/bootstrap/js/src/util.js +177 -0
- data/assets/scss/bootstrap/js/tests/README.md +69 -0
- data/assets/scss/bootstrap/js/tests/browsers.js +82 -0
- data/assets/scss/bootstrap/js/tests/index.html +133 -0
- data/assets/scss/bootstrap/js/tests/integration/bundle.js +8 -0
- data/assets/scss/bootstrap/js/tests/integration/index.html +66 -0
- data/assets/scss/bootstrap/js/tests/integration/rollup.bundle.js +20 -0
- data/assets/scss/bootstrap/js/tests/karma.conf.js +143 -0
- data/assets/scss/bootstrap/js/tests/unit/.eslintrc.json +40 -0
- data/assets/scss/bootstrap/js/tests/unit/alert.js +123 -0
- data/assets/scss/bootstrap/js/tests/unit/button.js +222 -0
- data/assets/scss/bootstrap/js/tests/unit/carousel.js +1333 -0
- data/assets/scss/bootstrap/js/tests/unit/collapse.js +892 -0
- data/assets/scss/bootstrap/js/tests/unit/dropdown.js +1419 -0
- data/assets/scss/bootstrap/js/tests/unit/modal.js +815 -0
- data/assets/scss/bootstrap/js/tests/unit/popover.js +471 -0
- data/assets/scss/bootstrap/js/tests/unit/scrollspy.js +728 -0
- data/assets/scss/bootstrap/js/tests/unit/tab.js +518 -0
- data/assets/scss/bootstrap/js/tests/unit/toast.js +259 -0
- data/assets/scss/bootstrap/js/tests/unit/tooltip.js +1109 -0
- data/assets/scss/bootstrap/js/tests/unit/util.js +163 -0
- data/assets/scss/bootstrap/js/tests/visual/alert.html +58 -0
- data/assets/scss/bootstrap/js/tests/visual/button.html +51 -0
- data/assets/scss/bootstrap/js/tests/visual/carousel.html +66 -0
- data/assets/scss/bootstrap/js/tests/visual/collapse.html +78 -0
- data/assets/scss/bootstrap/js/tests/visual/dropdown.html +212 -0
- data/assets/scss/bootstrap/js/tests/visual/modal.html +268 -0
- data/assets/scss/bootstrap/js/tests/visual/popover.html +46 -0
- data/assets/scss/bootstrap/js/tests/visual/scrollspy.html +95 -0
- data/assets/scss/bootstrap/js/tests/visual/tab.html +234 -0
- data/assets/scss/bootstrap/js/tests/visual/toast.html +72 -0
- data/assets/scss/bootstrap/js/tests/visual/tooltip.html +106 -0
- data/assets/scss/bootstrap/scss/_alert.scss +51 -0
- data/assets/scss/bootstrap/scss/_badge.scss +54 -0
- data/assets/scss/bootstrap/scss/_breadcrumb.scss +41 -0
- data/assets/scss/bootstrap/scss/_button-group.scss +163 -0
- data/assets/scss/bootstrap/scss/_buttons.scss +137 -0
- data/assets/scss/bootstrap/scss/_card.scss +289 -0
- data/assets/scss/bootstrap/scss/_carousel.scss +197 -0
- data/assets/scss/bootstrap/scss/_close.scss +41 -0
- data/assets/scss/bootstrap/scss/_code.scss +48 -0
- data/assets/scss/bootstrap/scss/_custom-forms.scss +507 -0
- data/assets/scss/bootstrap/scss/_dropdown.scss +191 -0
- data/assets/scss/bootstrap/scss/_forms.scss +330 -0
- data/assets/scss/bootstrap/scss/_functions.scss +86 -0
- data/assets/scss/bootstrap/scss/_grid.scss +52 -0
- data/assets/scss/bootstrap/scss/_images.scss +42 -0
- data/assets/scss/bootstrap/scss/_input-group.scss +193 -0
- data/assets/scss/bootstrap/scss/_jumbotron.scss +17 -0
- data/assets/scss/bootstrap/scss/_list-group.scss +149 -0
- data/assets/scss/bootstrap/scss/_media.scss +8 -0
- data/assets/scss/bootstrap/scss/_mixins.scss +47 -0
- data/assets/scss/bootstrap/scss/_modal.scss +229 -0
- data/assets/scss/bootstrap/scss/_nav.scss +120 -0
- data/assets/scss/bootstrap/scss/_navbar.scss +294 -0
- data/assets/scss/bootstrap/scss/_pagination.scss +73 -0
- data/assets/scss/bootstrap/scss/_popover.scss +171 -0
- data/assets/scss/bootstrap/scss/_print.scss +141 -0
- data/assets/scss/bootstrap/scss/_progress.scss +43 -0
- data/assets/scss/bootstrap/scss/_reboot.scss +483 -0
- data/assets/scss/bootstrap/scss/_root.scss +19 -0
- data/assets/scss/bootstrap/scss/_spinners.scss +55 -0
- data/assets/scss/bootstrap/scss/_tables.scss +185 -0
- data/assets/scss/bootstrap/scss/_toasts.scss +44 -0
- data/assets/scss/bootstrap/scss/_tooltip.scss +115 -0
- data/assets/scss/bootstrap/scss/_transitions.scss +20 -0
- data/assets/scss/bootstrap/scss/_type.scss +125 -0
- data/assets/scss/bootstrap/scss/_utilities.scss +17 -0
- data/assets/scss/bootstrap/scss/_variables.scss +1123 -0
- data/assets/scss/bootstrap/scss/bootstrap-grid.scss +29 -0
- data/assets/scss/bootstrap/scss/bootstrap-reboot.scss +12 -0
- data/assets/scss/bootstrap/scss/bootstrap.scss +44 -0
- data/assets/scss/bootstrap/scss/mixins/_alert.scss +13 -0
- data/assets/scss/bootstrap/scss/mixins/_background-variant.scss +21 -0
- data/assets/scss/bootstrap/scss/mixins/_badge.scss +17 -0
- data/assets/scss/bootstrap/scss/mixins/_border-radius.scss +63 -0
- data/assets/scss/bootstrap/scss/mixins/_box-shadow.scss +20 -0
- data/assets/scss/bootstrap/scss/mixins/_breakpoints.scss +123 -0
- data/assets/scss/bootstrap/scss/mixins/_buttons.scss +107 -0
- data/assets/scss/bootstrap/scss/mixins/_caret.scss +62 -0
- data/assets/scss/bootstrap/scss/mixins/_clearfix.scss +7 -0
- data/assets/scss/bootstrap/scss/mixins/_deprecate.scss +10 -0
- data/assets/scss/bootstrap/scss/mixins/_float.scss +14 -0
- data/assets/scss/bootstrap/scss/mixins/_forms.scss +192 -0
- data/assets/scss/bootstrap/scss/mixins/_gradients.scss +45 -0
- data/assets/scss/bootstrap/scss/mixins/_grid-framework.scss +66 -0
- data/assets/scss/bootstrap/scss/mixins/_grid.scss +51 -0
- data/assets/scss/bootstrap/scss/mixins/_hover.scss +37 -0
- data/assets/scss/bootstrap/scss/mixins/_image.scss +36 -0
- data/assets/scss/bootstrap/scss/mixins/_list-group.scss +21 -0
- data/assets/scss/bootstrap/scss/mixins/_lists.scss +7 -0
- data/assets/scss/bootstrap/scss/mixins/_nav-divider.scss +10 -0
- data/assets/scss/bootstrap/scss/mixins/_pagination.scss +22 -0
- data/assets/scss/bootstrap/scss/mixins/_reset-text.scss +17 -0
- data/assets/scss/bootstrap/scss/mixins/_resize.scss +6 -0
- data/assets/scss/bootstrap/scss/mixins/_screen-reader.scss +33 -0
- data/assets/scss/bootstrap/scss/mixins/_size.scss +7 -0
- data/assets/scss/bootstrap/scss/mixins/_table-row.scss +39 -0
- data/assets/scss/bootstrap/scss/mixins/_text-emphasis.scss +16 -0
- data/assets/scss/bootstrap/scss/mixins/_text-hide.scss +11 -0
- data/assets/scss/bootstrap/scss/mixins/_text-truncate.scss +8 -0
- data/assets/scss/bootstrap/scss/mixins/_transition.scss +16 -0
- data/assets/scss/bootstrap/scss/mixins/_visibility.scss +8 -0
- data/assets/scss/bootstrap/scss/utilities/_align.scss +8 -0
- data/assets/scss/bootstrap/scss/utilities/_background.scss +19 -0
- data/assets/scss/bootstrap/scss/utilities/_borders.scss +75 -0
- data/assets/scss/bootstrap/scss/utilities/_clearfix.scss +3 -0
- data/assets/scss/bootstrap/scss/utilities/_display.scss +26 -0
- data/assets/scss/bootstrap/scss/utilities/_embed.scss +39 -0
- data/assets/scss/bootstrap/scss/utilities/_flex.scss +51 -0
- data/assets/scss/bootstrap/scss/utilities/_float.scss +11 -0
- data/assets/scss/bootstrap/scss/utilities/_overflow.scss +5 -0
- data/assets/scss/bootstrap/scss/utilities/_position.scss +32 -0
- data/assets/scss/bootstrap/scss/utilities/_screenreaders.scss +11 -0
- data/assets/scss/bootstrap/scss/utilities/_shadows.scss +6 -0
- data/assets/scss/bootstrap/scss/utilities/_sizing.scss +20 -0
- data/assets/scss/bootstrap/scss/utilities/_spacing.scss +73 -0
- data/assets/scss/bootstrap/scss/utilities/_stretched-link.scss +19 -0
- data/assets/scss/bootstrap/scss/utilities/_text.scss +72 -0
- data/assets/scss/bootstrap/scss/utilities/_visibility.scss +13 -0
- data/assets/scss/bootstrap/scss/vendor/_rfs.scss +212 -0
- data/assets/scss/theme/_about.scss +28 -0
- data/assets/scss/theme/_base.scss +207 -0
- data/assets/scss/theme/_blog.scss +140 -0
- data/assets/scss/theme/_demo.scss +153 -0
- data/assets/scss/theme/_mixins.scss +34 -0
- data/assets/scss/theme/_responsive.scss +88 -0
- data/assets/scss/theme/styles.scss +14 -0
- data/assets/scss/theme-8.scss +41 -0
- data/assets/styles.scss +6 -0
- metadata +221 -4
@@ -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
|
+
})
|