diff --git a/build/webpack.test.config.js b/build/webpack.test.config.js new file mode 100644 index 0000000..366cbc3 --- /dev/null +++ b/build/webpack.test.config.js @@ -0,0 +1,14 @@ +// This is the webpack config used for unit tests. + +var webpack = require('webpack') +var merge = require('webpack-merge') +var baseConfig = require('./webpack.base.config') + +var webpackConfig = merge(baseConfig, { + devtool: '#inline-source-map' +}) + +delete webpackConfig.entry +delete webpackConfig.output + +module.exports = webpackConfig diff --git a/dist/index.js b/dist/index.js index 89dcdf3..e947022 100644 --- a/dist/index.js +++ b/dist/index.js @@ -485,6 +485,8 @@ var inRange = exports.inRange = function inRange(from, to, value) { return value; }; +exports.default = { inRange: inRange }; + /***/ }), /* 5 */ /***/ (function(module, exports, __webpack_require__) { @@ -1191,7 +1193,7 @@ var getType = function getType(value) { }; }; -var parse = function parse(value) { +var parse = exports.parse = function parse(value) { switch (typeof value === 'undefined' ? 'undefined' : _typeof(value)) { case 'number': return { type: 'px', value: value }; diff --git a/dist/ssr.index.js b/dist/ssr.index.js index 79a9c46..7c83354 100644 --- a/dist/ssr.index.js +++ b/dist/ssr.index.js @@ -349,6 +349,8 @@ var inRange = exports.inRange = function inRange(from, to, value) { return value; }; +exports.default = { inRange: inRange }; + /***/ }), /* 5 */ /***/ (function(module, exports, __webpack_require__) { @@ -1029,7 +1031,7 @@ var getType = function getType(value) { }; }; -var parse = function parse(value) { +var parse = exports.parse = function parse(value) { switch (typeof value === 'undefined' ? 'undefined' : _typeof(value)) { case 'number': return { type: 'px', value: value }; diff --git a/package.json b/package.json index f9c7a71..06189aa 100644 --- a/package.json +++ b/package.json @@ -19,18 +19,37 @@ }, "scripts": { "build:client": "webpack --config ./build/webpack.client.config.js --progress --hide-modules", - "build:server": "webpack --config ./build/webpack.server.config.js --progress --hide-modules" + "build:server": "webpack --config ./build/webpack.server.config.js --progress --hide-modules", + "unit": "karma start test/unit/karma.conf.js", + "build": "npm run unit && npm run build:client && npm run build:server" }, "license": "MIT", "devDependencies": { "babel-core": "^6.25.0", "babel-loader": "latest", "babel-preset-env": "^1.5.2", + "chai": "^3.5.0", "cross-env": "^3.0.0", "css-loader": "^0.25.0", "file-loader": "^0.9.0", + "jasmine-core": "^2.7.0", + "karma": "^1.4.1", + "karma-chrome-launcher": "^2.2.0", + "karma-coverage": "^1.1.1", + "karma-mocha": "^1.3.0", + "karma-phantomjs-launcher": "^1.0.4", + "karma-phantomjs-shim": "^1.4.0", + "karma-sinon-chai": "^1.3.1", + "karma-sourcemap-loader": "^0.3.7", + "karma-spec-reporter": "0.0.31", + "karma-webpack": "^2.0.2", + "lolex": "^1.5.2", + "mocha": "^3.2.0", "node-sass": "^4.5.0", + "phantomjs-prebuilt": "^2.1.14", "sass-loader": "^5.0.1", + "sinon": "^2.1.0", + "sinon-chai": "^2.8.0", "uglifyjs-webpack-plugin": "^0.4.6", "vue": "^2.2.6", "vue-hot-reload-api": "^2.0.8", diff --git a/src/parser.js b/src/parser.js index 4668855..2cb70c2 100644 --- a/src/parser.js +++ b/src/parser.js @@ -11,7 +11,7 @@ var types = [ { name: 'px', regexp: new RegExp(`^${floatRegexp}px\$`) - }, + }, { name: '%', regexp: new RegExp(`^${floatRegexp}%\$`) @@ -48,15 +48,15 @@ var getType = (value) => { } } -var parse = (value) => { +export const parse = (value) => { switch (typeof value) { case 'number': return { type: 'px', value } case 'string': return getType(value) - default: + default: return { type: '', value } } } -export default parse \ No newline at end of file +export default parse diff --git a/src/util.js b/src/util.js index 1a2b9d5..f909301 100644 --- a/src/util.js +++ b/src/util.js @@ -9,3 +9,5 @@ export const inRange = (from, to, value) => { return value } + +export default { inRange } diff --git a/test/unit/karma.conf.js b/test/unit/karma.conf.js new file mode 100644 index 0000000..b57deca --- /dev/null +++ b/test/unit/karma.conf.js @@ -0,0 +1,43 @@ +// Karma configuration +var webpackConfig = require('../../build/webpack.test.config.js') + +module.exports = function(config) { + config.set({ + frameworks: [ + 'mocha' + ], + files: [ + './tests.webpack.js' + ], + browsers: [ + 'Chrome' + ], + preprocessors: { + './tests.webpack.js': ['webpack', 'sourcemap'] + }, + reporters: ['spec'], + plugins: [ + // Launchers + 'karma-chrome-launcher', + + // Test Libraries + 'karma-mocha', + 'karma-sinon-chai', + + // Preprocessors + 'karma-webpack', + 'karma-sourcemap-loader', + // Reporters + 'karma-spec-reporter', + 'karma-coverage' + ], + + webpack: webpackConfig, + webpackMiddleware: { + noInfo: true + }, + logLevel: config.LOG_INFO, + singleRun: true, + concurrency: Infinity, + }) +} diff --git a/test/unit/parser.spec.js b/test/unit/parser.spec.js new file mode 100644 index 0000000..1387be0 --- /dev/null +++ b/test/unit/parser.spec.js @@ -0,0 +1,69 @@ +var parser = require('../../src/parser') +var { expect } = require('chai') + +describe('parser.js', () => { + describe('#parse', () => { + describe('Correct types', () => { + it('Should parse numbers', () => { + let object = parser.parse(10) + + expect(object.value).to.be.a('number') + expect(object.type).to.be.a('string') + + expect(object.value).to.equal(10) + expect(object.type).to.equal('px') + }) + + it('Should parse strings', () => { + let object = parser.parse('10') + + expect(object.value).to.be.a('number') + expect(object.type).to.be.a('string') + + expect(object.value).to.equal(10) + expect(object.type).to.equal('px') + }) + + it ('Should parse "auto" string, auto => {type: "auto", value: 0}', () => { + let object = parser.parse('auto') + + expect(object.value).to.equal(0) + expect(object.type).to.equal('auto') + }) + + it ('Should parse wrong types', () => { + let nullValue = parser.parse(null) + let booleanValue = parser.parse(false) + + expect(nullValue.value).to.equal(null) + expect(nullValue.type).to.equal('') + + expect(booleanValue.value).to.equal(false) + expect(booleanValue.type).to.equal('') + }) + }) + + describe('Parsing suffixed string', () => { + it ('Should parse "px"', () => { + let object = parser.parse('10px') + + expect(object.value).to.equal(10) + expect(object.type).to.equal('px') + }) + + it ('Should parse "%"', () => { + let object = parser.parse('10%') + + expect(object.value).to.equal(10) + expect(object.type).to.equal('%') + }) + + it ('Should not parse "%px"', () => { + let object = parser.parse('10%px') + + expect(object.value).to.be.a('string') + expect(object.type).to.equal('') + }) + }) + }) +}) diff --git a/test/unit/tests.webpack.js b/test/unit/tests.webpack.js new file mode 100644 index 0000000..05d9a6d --- /dev/null +++ b/test/unit/tests.webpack.js @@ -0,0 +1,2 @@ +var testsContext = require.context('.', true, /\.spec$/) +testsContext.keys().forEach(testsContext) diff --git a/test/unit/util.spec.js b/test/unit/util.spec.js new file mode 100644 index 0000000..10d9bc0 --- /dev/null +++ b/test/unit/util.spec.js @@ -0,0 +1,26 @@ +var util = require('../../src/util') +var { expect } = require('chai') + +describe('util.js', () => { + describe('#inRange', () => { + it('Should return the source value (in the range)', () => { + let value = util.inRange(-10, 10, 0) + expect(value).to.equal(0) + }) + + it('Should not be equal to the source value (outside the range)', () => { + let value = util.inRange(-10, 10, -100) + expect(value).not.to.equal(-100) + }) + + it('Should replace source value with upper limit', () => { + let value = util.inRange(0, 10, 30) + expect(value).to.equal(10) + }) + + it('Should replace source value with lower limit', () => { + let value = util.inRange(1, 10, -1) + expect(value).to.equal(1) + }) + }) +})