From 1e855836e8022ca29dcb751bda68cd7b0daf72a3 Mon Sep 17 00:00:00 2001 From: Wang Qiu Date: Fri, 26 Jul 2013 16:46:21 +0800 Subject: [PATCH 1/6] implementation of image_generator. Qiu --- .gitignore | 1 + Gruntfile.js | 4 +- demo/blog/build_prod.config.js | 2 +- package.json | 3 +- src/comparison.coffee | 1 - src/image.generator.coffee | 30 ++++++++++++ test/src/image_generator_test.coffee | 71 ++++++++++++++++++++++++++++ 7 files changed, 108 insertions(+), 4 deletions(-) create mode 100644 src/image.generator.coffee create mode 100644 test/src/image_generator_test.coffee diff --git a/.gitignore b/.gitignore index 87cce0d..38b2f22 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ chromedriver.log report.html +.DS_Store /node_modules/ /lib/ diff --git a/Gruntfile.js b/Gruntfile.js index e99f3d1..1833479 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -28,10 +28,12 @@ module.exports = function(grunt) { 'lib/reporter.js': 'src/reporter.coffee', 'lib/html.report.template.js': 'src/html.report.template.coffee', 'lib/process.argv.js': 'src/process.argv.coffee', + 'lib/image.generator.js': 'src/image.generator.coffee', 'test/build/comparison_test.js': 'test/src/comparison_test.coffee', 'test/build/viff_test.js': 'test/src/viff_test.coffee', 'test/build/reporter_test.js': 'test/src/reporter_test.coffee', - 'test/build/process_argv_test.js': 'test/src/process_argv_test.coffee' + 'test/build/process_argv_test.js': 'test/src/process_argv_test.coffee', + 'test/build/image_generator_test.js': 'test/src/image_generator_test.coffee' } } }, diff --git a/demo/blog/build_prod.config.js b/demo/blog/build_prod.config.js index f81758b..50bd052 100644 --- a/demo/blog/build_prod.config.js +++ b/demo/blog/build_prod.config.js @@ -2,7 +2,7 @@ module.exports = { seleniumHost: 'http://localhost:4444/wd/hub', - browsers: ['firefox'], + browsers: ['firefox', 'safari', 'chrome', 'opera'], envHosts: { build: 'http://localhost:4000', prod: 'http://ishouldbeageek.me' diff --git a/package.json b/package.json index 7b8e930..fe10602 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,8 @@ "underscore": "*", "selenium-webdriver": ">=2.33.0", "handlebars": "~1.0.12", - "resemble": "~1.0.3" + "resemble": "~1.0.3", + "wrench": "*" }, "devDependencies": { "grunt": "~0.4.1", diff --git a/src/comparison.coffee b/src/comparison.coffee index 92a183b..652815b 100644 --- a/src/comparison.coffee +++ b/src/comparison.coffee @@ -1,7 +1,6 @@ path = require 'path' _ = require 'underscore' mr = require 'Mr.Async' -spawn = require('child_process').spawn fs = require('fs') resemble = require('resemble').resemble diff --git a/src/image.generator.coffee b/src/image.generator.coffee new file mode 100644 index 0000000..62ea23f --- /dev/null +++ b/src/image.generator.coffee @@ -0,0 +1,30 @@ +path = require 'path' +_ = require 'underscore' +mr = require 'Mr.Async' +fs = require 'fs' +wrench = require 'wrench' + +preprocessFolderName = (name) -> + encodeURIComponent name + +class ImageGenerator + + @generate: (compares) -> + throw new Error('compares cannot be null.') if compares is null + + screenshotPath = path.join(__dirname, '../screenshots') + wrench.rmdirSyncRecursive(screenshotPath) if fs.existsSync screenshotPath + wrench.mkdirSyncRecursive screenshotPath + + for browser, urls of compares + browserFolderPath = path.join screenshotPath, browser + fs.mkdirSync browserFolderPath + + for url, images of urls + urlFolderPath = path.join browserFolderPath, preprocessFolderName(url) + fs.mkdirSync urlFolderPath + + _.each images, (base64Img, image) -> + fs.writeFileSync path.join(urlFolderPath, image + '.png'), new Buffer(base64Img, 'base64') + +module.exports = ImageGenerator \ No newline at end of file diff --git a/test/src/image_generator_test.coffee b/test/src/image_generator_test.coffee new file mode 100644 index 0000000..43820e2 --- /dev/null +++ b/test/src/image_generator_test.coffee @@ -0,0 +1,71 @@ +_ = require 'underscore' +sinon = require 'sinon' +path = require 'path' +fs = require 'fs' +wrench = require 'wrench' + +ImageGenerator = require '../../lib/image.generator.js' + +module.exports = + setUp: (callback) -> + @compares = + "firefox": + "/404.html?a=1": + "build": "base64_build_1" + "prod": "base64_prod_1" + "DIFF": "base64_diff_1" + "/": + "build": "base64_build_2" + "prod": "base64_prod_2" + "DIFF": "base64_diff_2" + "chrome": + "/404.html": + "build": "base64_build_3" + "prod": "base64_prod_3" + "DIFF": "base64_diff_3" + "/": + "build": "base64_build_4" + "prod": "base64_prod_4" + "DIFF": "base64_diff_4" + + @mkdirSync = sinon.stub(fs, 'mkdirSync').returns 1 + @existsSync = sinon.stub(fs, 'existsSync').returns true + @writeFileSync = sinon.stub(fs, 'writeFileSync').returns undefined + @rmdirSyncRecursive = sinon.stub(wrench, 'rmdirSyncRecursive').returns undefined + @mkdirSyncRecursive = sinon.stub(wrench, 'mkdirSyncRecursive').returns undefined + + callback() + + tearDown: (callback) -> + method.restore() for method in [ + fs.mkdirSync + fs.existsSync + fs.writeFileSync + wrench.rmdirSyncRecursive + wrench.mkdirSyncRecursive + ] + callback() + + 'it should remove "screenshots" folder if exist': (test) -> + ImageGenerator.generate @compares + test.ok @rmdirSyncRecursive.lastCall.args[0].indexOf('/screenshots') >= 0 + + test.done() + + 'it should generate correct directories': (test) -> + ImageGenerator.generate @compares + test.equals @mkdirSync.callCount, 6 + test.ok @mkdirSync.getCall(1).args[0].indexOf('/screenshots/firefox/%2F404.html%3Fa%3D1') >= 0 + test.ok @mkdirSync.getCall(3).args[0].indexOf('/screenshots/chrome') >= 0 + test.done() + + 'it should always create new "screenshots" folder': (test) -> + ImageGenerator.generate @compares + test.ok @mkdirSyncRecursive.lastCall.args[0].indexOf('/screenshots') >= 0 + test.done() + + 'it should generate correct images': (test) -> + ImageGenerator.generate @compares + test.equals @writeFileSync.callCount, 12 + test.done() + From 06a9f741cb2903bd89c7d8152674e0dce9f3874c Mon Sep 17 00:00:00 2001 From: Wang Qiu Date: Sun, 28 Jul 2013 17:50:01 +0800 Subject: [PATCH 2/6] reconstruct comparison object. Qiu --- src/comparison.coffee | 13 +++++++---- src/html.report.template.coffee | 4 ++-- test/src/comparison_test.coffee | 18 ++++++++++++---- test/src/reporter_test.coffee | 38 +++++++++++++++++++++++---------- 4 files changed, 52 insertions(+), 21 deletions(-) diff --git a/src/comparison.coffee b/src/comparison.coffee index 92a183b..54aa150 100644 --- a/src/comparison.coffee +++ b/src/comparison.coffee @@ -7,20 +7,25 @@ resemble = require('resemble').resemble class Comparison constructor: (imgWithEnvs) -> - _.extend(@, imgWithEnvs) + @images = imgWithEnvs diff: (callback) -> defer = mr.Deferred() defer.done callback that = @ - fileData = _.map _.values(@), (base64Img) -> + fileData = _.map _.values(@images), (base64Img) -> new Buffer base64Img, 'base64' Comparison.compare fileData[0], fileData[1], (diffObj) -> if diffObj - that.DIFF = diffObj.getImageDataUrl().replace('data:image/png;base64,', '') - defer.resolve that.DIFF + that.images.diff = diffObj.getImageDataUrl().replace('data:image/png;base64,', '') + _.extend that, + isSameDimensions: diffObj.isSameDimensions + misMatchPercentage: Number diffObj.misMatchPercentage + analysisTime: diffObj.analysisTime + + defer.resolve that.images.diff defer.promise() diff --git a/src/html.report.template.coffee b/src/html.report.template.coffee index 9cd905e..759f633 100644 --- a/src/html.report.template.coffee +++ b/src/html.report.template.coffee @@ -42,8 +42,8 @@ template = """