#!/usr/bin/env node var fs = require('fs'); var path = require('path'); var spawn = require('child_process').spawn; var base_dir = path.join(path.resolve('.'), 'test/fixtures/styles'); var files = fs.readdirSync(base_dir).filter(function(name) { return name.match(/\.info\.json$/); }); var html = '\n' + '\n' + '\n' + ' \n' + ' \n' + ' \n' + '\n'; var exitCode = 0; var failures = 0; processFiles(); function processFiles() { if (!files.length) return done(); var name = files.shift(); var info = require(path.join(base_dir, name)); var base = path.basename(name, '.info.json'); var actual = path.join(base_dir, base + '.actual.png'); var expected = path.join(base_dir, base + '.expected.png'); var diff = path.join(base_dir, base + '.diff.png'); var compare = spawn('compare', ['-metric', 'MAE', actual, expected, diff ]); var error = ''; compare.stderr.on('data', function(data) { error += data.toString(); }); compare.on('exit', function(code, signal) { // The compare program returns 2 on error otherwise 0 if the images are similar or 1 if they are dissimilar. if (code == 2) { writeResult(base, info, error.trim(), Infinity); exitCode = 2; } else { var difference = parseFloat(error.match(/^\d+(?:\.\d+)?\s+\(([^\)]+)\)\s*$/)[1]); writeResult(base, info, '', difference); } return processFiles(); }); compare.stdin.end(); } function writeResult(base, info, error, difference) { var color = 'green'; var allowedDifference = ('diff' in info) ? info.diff : 0.01; if (difference > allowedDifference) { color = 'red'; if (exitCode < 1) { exitCode = 1; } failures++; } html += '\n' + ' \n' + ' \n' + ' \n' + '\n' ; } function done() { html += "
ActualExpectedInfo
\n' + '

' + base + '

\n' + (error ? '

' + error + '

\n' : '') + '
    \n' + '
  • diff: ' + difference + '
  • \n' + '
  • zoom: ' + (info.zoom || 0) + '
  • \n' + '
  • latitude: ' + (info.latitude || 0) + '
  • \n' + '
  • longitude: ' + (info.longitude || 0) + '
  • \n' + '
  • angle: ' + (info.angle || 0) + '
  • \n' + '
  • width: ' + (info.width || 0) + '
  • \n' + '
  • height: ' + (info.height || 0) + '
  • \n' + '
\n' + '
\n"; fs.writeFileSync(path.join(base_dir, 'index.html'), html); console.warn('Results at: ' + path.join(base_dir, 'index.html')); if (failures) { console.warn('\x1B[1m\x1B[31m' + failures + ' ' + (failures == 1 ? 'image doesn\'t' : 'images don\'t') + ' match\x1B[39m\x1B[22m'); } else { console.warn('\x1B[1m\x1B[32mAll images match\x1B[39m\x1B[22m'); } process.exit(exitCode); }