diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..82ff623 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,5 @@ +**/node_modules/* +**/vendor/* +**/*.min.js +**/coverage/* +**/build/* \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..c09d6ba --- /dev/null +++ b/.eslintrc @@ -0,0 +1,23 @@ +{ + "rules": { + "no-console": "off", + "indent": ["error", 2], + "quotes": ["error", "single"], + "semi": ["error", "always"], + "linebreak-style": ["error", "unix"] + }, + "env": { + "es6": true, + "node": true, + "mocha": true, + "jasmine": true + }, + "parserOptions": { + "ecmaFeatures": { + "modules": true, + "experimentalObjectRestSpread": true, + "impliedStrict": true + } + }, + "extends": "eslint:recommended" +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..401d449 --- /dev/null +++ b/.gitignore @@ -0,0 +1,128 @@ + +# Created by https://www.gitignore.io/api/node,macos,linux,windows + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### macOS ### +*.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.gitignore.io/api/node,macos,linux,windows \ No newline at end of file diff --git a/README.md b/README.md index d6f6eb4..b7d4a0f 100644 --- a/README.md +++ b/README.md @@ -1,61 +1,15 @@ -![CF](https://camo.githubusercontent.com/70edab54bba80edb7493cad3135e9606781cbb6b/687474703a2f2f692e696d6775722e636f6d2f377635415363382e706e67) Lab 04: Bitmap Transformer -=== +# Bitmap Transformer -## To Submit this Assignment -* have team leader fork this repository -* have team leader add team members as collaborators to the team fork -* team members should clone team fork -* write all of your code in a directory name `bitmap-` + `` **e.g.** `bitmap-weasels` -* submit a pull request to this repository when done -* each person will submit a link to their own PR in canvas -* each person write a question and observation on canvas +This application takes a bit map image and applies four transformations to it, creating four additional files in the assets directory. -## Learning Objectives -* students will be able to manipulate binary data using the node.js `Buffer` class -* students will be able to architect modular solutions to solving problems + - Greyscale + - Infared + - Inverted Color + - Reversed (a flipped image) -## Resources -* [Bitmap Specification](https://en.wikipedia.org/wiki/BMP_file_format) -* [NodeJS Buffer docs](https://nodejs.org/api/buffer.html) +# Run it! -#### Feature Tasks - -For this assignment you will be building a bitmap (`.bmp`) reader and transformer. It will read a bitmap in from disk, run one or more color transforms on the bitmap and then write it out to a new file. This project will require the use of node buffers in order to manipulate binary data. Your project should include tests, as well as a `package.json`, `.eslintrc`, `README.md`, and a `.gitignore`. Make sure to run all your code through eslint. The process will look something like this: - -1. open the original bitmap file using fs and read it into a buffer -2. convert the buffer header data into a Javascript Object (using constructors) -3. run a transform on the buffer directly -4. write the buffer to a new file - -The wikipedia article found here [Bitmap Specification](https://en.wikipedia.org/wiki/BMP_file_format) describes the byte specification of a "windows bitmap file." We'll be working with the simplest version, meaning no compression. - -* your project should have three ***(or more)*** transforms -* invert the colors (***hint:*** subtract every color value from the max color value which is 255), -* grayscale the colors (***hint:*** multiply each color value by a constant, just make sure your values don't go over 255) -* (red|green|blue)scale the colors (***hint:*** same as above but only multiply one of the colors) - -#### Bonus: -* ability to handle various sized bitmap -* ability to handle LE and BE computers with a single if statement -* utilizes a command line interface (CLI) -* CLI can select the transforms - -#### Suggested Directory Structure (this is optional): -* suggested directory structure: - - **index.js** - - **lib** - - bitmap file helper - - **model** - - bitmap constructor - - color constructor - - **test** - - bitmap file helper test - - bitmap constructor test - - color constructor test - -#### Rubric: -* **tests:** 3pts -* **package.json:** 2pts -* **read bitmap meta data:** 5pts -* **successfully apply transforms:** 5pts -* **project design and organization:** 5pts + - open the file in the terminal + - navigate to the Lib directory + - run the command node bitmap-file-helper.js + - At this point you'll have 4 new files in your assets directory. diff --git a/assets/greyscaled.bmp b/assets/greyscaled.bmp new file mode 100644 index 0000000..ad74592 Binary files /dev/null and b/assets/greyscaled.bmp differ diff --git a/assets/infrared.bmp b/assets/infrared.bmp new file mode 100644 index 0000000..b4a3c83 Binary files /dev/null and b/assets/infrared.bmp differ diff --git a/assets/inverted.bmp b/assets/inverted.bmp new file mode 100644 index 0000000..d835124 Binary files /dev/null and b/assets/inverted.bmp differ diff --git a/assets/reversed.bmp b/assets/reversed.bmp new file mode 100644 index 0000000..ad72ecd Binary files /dev/null and b/assets/reversed.bmp differ diff --git a/index.js b/index.js new file mode 100644 index 0000000..372571c --- /dev/null +++ b/index.js @@ -0,0 +1,42 @@ +'use strict'; + +const bitmapFileHelper = require(`${__dirname}/lib/bitmap-file-helper.js`); +const bitmapConstructor = require(`${__dirname}/model/bitmap-constructor.js`); +const greyScaleTransform = require(`${__dirname}/lib/grey-scale-transform.js`); +const reverseTransform = require(`${__dirname}/lib/reverse-transform.js`); +const invertTransform = require(`${__dirname}/lib/invert-transform.js`); +const infraredTransform = require(`${__dirname}/lib/infrared-transform.js`); + + +bitmapFileHelper(`${__dirname}/assets/palette-bitmap.bmp`, function(err, data) { + if(err) throw err; + let bmp = new bitmapConstructor.Bitmap(data); + + bmp.colorArr = greyScaleTransform(bmp.colorArr); + bmp.newFile('greyscaled'); +}); + +bitmapFileHelper(`${__dirname}/assets/palette-bitmap.bmp`, function(err, data) { + if(err) throw err; + let bmp = new bitmapConstructor.Bitmap(data); + + bmp.pixelArr = reverseTransform(bmp.pixelArr); + bmp.newFile('reversed'); +}); + + +bitmapFileHelper(`${__dirname}/assets/palette-bitmap.bmp`, function(err, data) { + if(err) throw err; + let bmp = new bitmapConstructor.Bitmap(data); + + bmp.colorArr = invertTransform(bmp.colorArr); + bmp.newFile('inverted'); +}); + +bitmapFileHelper(`${__dirname}/assets/palette-bitmap.bmp`, function(err, data) { + if(err) throw err; + let bmp = new bitmapConstructor.Bitmap(data); + + bmp.colorArr = infraredTransform(bmp.colorArr); + bmp.newFile('infrared'); +}); diff --git a/lib/bitmap-file-helper.js b/lib/bitmap-file-helper.js new file mode 100644 index 0000000..10cc394 --- /dev/null +++ b/lib/bitmap-file-helper.js @@ -0,0 +1,10 @@ +'use strict'; + +const fs = require('fs'); + +const bitmapFileHelper = module.exports = function(file, callback) { + fs.readFile(file, function(err, data) { + if (err) return callback(err); + return callback(null, data); + }); +}; \ No newline at end of file diff --git a/lib/grey-scale-transform.js b/lib/grey-scale-transform.js new file mode 100644 index 0000000..8e168b6 --- /dev/null +++ b/lib/grey-scale-transform.js @@ -0,0 +1,27 @@ +'use strict'; + +module.exports = exports = function greyScale(colorArrayText) { + let colorArray = colorArrayText.match(/.{1,8}/g); + let greyArray = []; + + colorArray.forEach(function(n) { + let pairsArray = n.match(/.{1,2}/g); + let b = parseInt(pairsArray[0],16); //hex value to decimal value; + let g = parseInt(pairsArray[1],16); + let r = parseInt(pairsArray[2],16); + var avg = Math.floor((Math.max(r,g,b) + Math.min(r,g,b)) / 2); + pairsArray[0] = avg.toString(16); + pairsArray[1] = avg.toString(16); + pairsArray[2] = avg.toString(16); + pairsArray.forEach(function(value, i){ + if(value.length === 1){ + pairsArray[i] = '0' + pairsArray[i]; + } + }); + let greyHex = pairsArray.join(''); + greyArray.push(greyHex); + }); + + let greyColorArrayText = greyArray.join(''); + return greyColorArrayText; +}; diff --git a/lib/infrared-transform.js b/lib/infrared-transform.js new file mode 100644 index 0000000..9dd57e8 --- /dev/null +++ b/lib/infrared-transform.js @@ -0,0 +1,27 @@ +'use strict'; + +module.exports = exports = function greyScale(colorArrayText) { + let colorArray = colorArrayText.match(/.{1,8}/g); + let greyArray = []; + + colorArray.forEach(function(n) { + let pairsArray = n.match(/.{1,2}/g); + let b = parseInt(pairsArray[0],16); //hex value to decimal value; + let g = parseInt(pairsArray[1],16); + let r = parseInt(pairsArray[2],16); + var avg = Math.floor((Math.max(r,g,b) + Math.min(r,g,b)) / 2); + pairsArray[0] = avg.toString(16); + pairsArray[1] = avg.toString(16); + pairsArray[2] = (255).toString(16); + pairsArray.forEach(function(value, i){ + if(value.length === 1){ + pairsArray[i] = '0' + pairsArray[i]; + } + }); + let greyHex = pairsArray.join(''); + greyArray.push(greyHex); + }); + + let greyColorArrayText = greyArray.join(''); + return greyColorArrayText; +}; diff --git a/lib/invert-transform.js b/lib/invert-transform.js new file mode 100644 index 0000000..b20aef0 --- /dev/null +++ b/lib/invert-transform.js @@ -0,0 +1,28 @@ +'use strict'; + +module.exports = exports = function invertColor(colorArrayText){ + let colorArray = colorArrayText.match(/.{1,8}/g); + let invertedColorArray = []; + + colorArray.forEach(function(n) { + let invertArray = []; + let pairsArray = n.match(/.{1,2}/g); + let b = parseInt(pairsArray[0],16); //hex value to decimal value; + let g = parseInt(pairsArray[1],16); + let r = parseInt(pairsArray[2],16); + let bInvert = (255-b).toString(16); // invert ; + let gInvert = (255-g).toString(16); + let rInvert = (255-r).toString(16); + + invertArray.push(bInvert, gInvert, rInvert, '00'); + invertArray.forEach(function(value, i){ + if(value.length === 1){ + invertArray[i] = '0'+invertArray[i]; + } + }); + invertedColorArray.push(invertArray.join('')); + }); + + let invertedColorString = invertedColorArray.join(''); + return invertedColorString; +}; diff --git a/lib/reverse-transform.js b/lib/reverse-transform.js new file mode 100644 index 0000000..db090e3 --- /dev/null +++ b/lib/reverse-transform.js @@ -0,0 +1,8 @@ +'use strict'; + +module.exports = exports = function reverser(pixelArrayText) { + let pixelArray = pixelArrayText.match(/.{1,2}/g); + let reversed = pixelArray.reverse().join(''); + + return reversed; +}; diff --git a/model/bitmap-constructor.js b/model/bitmap-constructor.js new file mode 100644 index 0000000..db66160 --- /dev/null +++ b/model/bitmap-constructor.js @@ -0,0 +1,27 @@ +'use strict'; + +module.exports = exports = {}; + +const fs = require('fs'); + +exports.Bitmap = function(data) { + this.all = data; + this.filetype = data.toString('hex', 0, 2); + this.offsetToPixelArrInHex = data.toString('hex', 10, 14); + this.offsetToPixelArr = data.readInt32LE(10); + this.offsetToColorArr = 54; + + // full file: + this.headerAll = data.toString('hex', 0, this.offsetToColorArr); + this.colorArr = data.toString('hex', this.offsetToColorArr, this.offsetToPixelArr); + this.pixelArr = data.toString('hex', this.offsetToPixelArr); +}; + +exports.Bitmap.prototype.newFile = function(fileName) { + let newBuffer = Buffer.alloc(this.all.length, (this.headerAll + this.colorArr + this.pixelArr), 'hex'); + + fs.writeFile(`${__dirname}/../assets/${fileName}.bmp`, newBuffer, (err) => { + if(err) console.error(err); + console.log(`${fileName}.bmp initiated`); + }); +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..717f2e7 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,261 @@ +{ + "name": "04-bitmap_transformer", + "version": "1.0.0", + "lockfileVersion": 1, + "dependencies": { + "assertion-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "chai": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.0.tgz", + "integrity": "sha1-MxoDkbVcOvh0CunDt0WLwcOAXm0=", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "debug": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.0.tgz", + "integrity": "sha1-vFlryr52F/Edn6FTYe3tVgi4SZs=", + "dev": true + }, + "deep-eql": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz", + "integrity": "sha1-sbrAblbwp2d3aG1Qyf63XC7XZ5o=", + "dev": true, + "dependencies": { + "type-detect": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-3.0.0.tgz", + "integrity": "sha1-RtDMhVOrt7E6NSsNbeov1Y8tm1U=", + "dev": true + } + } + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true + }, + "mocha": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.4.2.tgz", + "integrity": "sha1-0O9NMyEm2/GNDWQMmzgt1IvpdZQ=", + "dev": true + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true + }, + "type-detect": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", + "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..a24cef5 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "04-bitmap_transformer", + "version": "1.0.0", + "description": "![CF](https://camo.githubusercontent.com/70edab54bba80edb7493cad3135e9606781cbb6b/687474703a2f2f692e696d6775722e636f6d2f377635415363382e706e67) Lab 04: Bitmap Transformer ===", + "main": "index.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "mocha" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ohjonah/04-bitmap_transformer.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/ohjonah/04-bitmap_transformer/issues" + }, + "homepage": "https://github.com/ohjonah/04-bitmap_transformer#readme", + "devDependencies": { + "chai": "^4.1.0", + "mocha": "^3.4.2" + } +} diff --git a/test/bitmap-constructor-test.js b/test/bitmap-constructor-test.js new file mode 100644 index 0000000..f5b3342 --- /dev/null +++ b/test/bitmap-constructor-test.js @@ -0,0 +1,21 @@ +'use strict'; + +const expect = require('chai').expect; +const bitmapConstructor = require(`${__dirname}/../model/bitmap-constructor.js`); +const bitmapFileHelper = require(`${__dirname}/../lib/bitmap-file-helper.js`); + +describe('Bitmap Constructor', function() { + describe('if object', () => { + it('should return new Bitmap object', done => { + bitmapFileHelper(`${__dirname}/../assets/palette-bitmap.bmp`, function(err, data) { + if(err) throw err; + let result = new bitmapConstructor.Bitmap(data); + expect(result).to.be.an('object'); + done(); + }); + }); + }); +}); + + + diff --git a/test/bitmap-file-helper-test.js b/test/bitmap-file-helper-test.js new file mode 100644 index 0000000..ed5060c --- /dev/null +++ b/test/bitmap-file-helper-test.js @@ -0,0 +1,26 @@ +'use strict'; + +const expect = require('chai').expect; +const bitmapFileHelper = require(`${__dirname}/../lib/bitmap-file-helper.js`); + +describe('Bitmap File Helper', function() { + describe('with improper file path', () => { + it('should return an error', done => { + bitmapFileHelper(`${__dirname}/not-a-file.bmp`, err => { + expect(err).to.be.an('error'); + done(); + }); + }); + }); + + describe('with proper file path', () => { + it('should return the content of the file', done => { + bitmapFileHelper(`${__dirname}/../assets/palette-bitmap.bmp`, (err, data) => { + expect(err).to.equal(null); + expect(data.toString()).to.be.a('string'); + expect(data.toString('hex', 0, 2)).to.equal('424d'); + done(); + }); + }); + }); +}); diff --git a/test/grey-scale-transform-test.js b/test/grey-scale-transform-test.js new file mode 100644 index 0000000..ad248bb --- /dev/null +++ b/test/grey-scale-transform-test.js @@ -0,0 +1,14 @@ +'use strict'; + +const expect = require('chai').expect; +const greyscaleTransform = require(`${__dirname}/../lib/grey-scale-transform.js`); + +describe('Grey Scale Transform', function() { + describe('with valid string', () => { + it('should return grey scale string', done => { + let test = greyscaleTransform('55aacc'); + expect(test).to.deep.equal('909090'); + done(); + }); + }); +}); diff --git a/test/invert-color-test.js b/test/invert-color-test.js new file mode 100644 index 0000000..929bd03 --- /dev/null +++ b/test/invert-color-test.js @@ -0,0 +1,15 @@ +'use strict'; + +const expect = require('chai').expect; +const invertTransform = require(`${__dirname}/../lib/invert-transform.js`); + +describe('Color Invert', function(){ + describe('with valid string', () => { + it('return inverse', done => { + let test = invertTransform('00000000'); + expect(test).to.be.a('string'); + expect(test).to.deep.equal('ffffff00'); + done(); + }); + }); +}); diff --git a/test/reverse-transform-test.js b/test/reverse-transform-test.js new file mode 100644 index 0000000..4b1a0b9 --- /dev/null +++ b/test/reverse-transform-test.js @@ -0,0 +1,15 @@ +'use strict'; + +const expect = require('chai').expect; +const reverseTransform = require(`${__dirname}/../lib/reverse-transform.js`); + +describe('Reverse Transform', function(){ + describe('with valid string', () =>{ + it('should return a flip of pairs', done =>{ + let test = reverseTransform('1c002d'); + expect(test).to.be.a('string'); + expect(test).to.deep.equal('2d001c'); + done(); + }); + }); +});