osrm-backend/features/lib/table_diff.js

124 lines
3.6 KiB
JavaScript
Raw Normal View History

'use strict';
var util = require('util');
var path = require('path');
var fs = require('fs');
var chalk = require('chalk');
var unescapeStr = (str) => str.replace(/\\\|/g, '\|').replace(/\\\\/g, '\\');
2017-02-07 04:24:31 -05:00
String.prototype.padLeft = function(char, length) {
return char.repeat(Math.max(0, length - this.length)) + this;
}
String.prototype.padRight = function(char, length) {
return this + char.repeat(Math.max(0, length - this.length));
}
module.exports = function (expected, actual) {
let headers = expected.raw()[0];
2017-02-07 08:10:26 -05:00
let expectedRows = expected.hashes();
2017-02-07 04:24:31 -05:00
let tableError = false;
2017-02-07 08:10:26 -05:00
let statusRows = [];
let columnStatus = {}
2017-02-07 08:10:26 -05:00
expectedRows.forEach((expectedRow, i) => {
var rowError = false;
2017-02-07 08:10:26 -05:00
statusRows[i] = {};
var statusRow = statusRows[i];
2017-02-07 04:24:31 -05:00
for (var key in expectedRow) {
var actualRow = actual[i]
var row
if (unescapeStr(expectedRow[key]) != actualRow[key]) {
2017-02-07 08:10:26 -05:00
statusRow[key] = false;
2017-02-07 04:24:31 -05:00
tableError = true;
2017-02-07 08:10:26 -05:00
columnStatus[key] = false;
}
}
2017-02-07 04:24:31 -05:00
});
2017-02-07 08:10:26 -05:00
if (!tableError) return null;
2017-02-07 04:24:31 -05:00
// determine column widths
2017-02-07 08:10:26 -05:00
var widths = {};
var wantStr = '(-) ';
var gotStr = '(+) ';
var okStr = ' ';
headers.forEach( (key) => {
widths[key] = key.length;
});
expectedRows.forEach((row,i) => {
2017-02-07 04:24:31 -05:00
var cells = []
2017-02-07 08:10:26 -05:00
headers.forEach( (key) => {
var content = row[key]
var length = content.length;
if(widths[key]==null || length > widths[key])
widths[key] = length;
2017-02-07 04:24:31 -05:00
});
});
2017-02-07 08:10:26 -05:00
2017-02-07 04:24:31 -05:00
// format
2017-02-07 08:10:26 -05:00
var lines = [chalk.red('Tables were not identical:')];
var cells;
// header row
cells = []
headers.forEach( (key) => {
var content = String(key).padRight(' ', widths[key] );
2017-02-07 08:10:26 -05:00
if (columnStatus[key] == false )
content = okStr + content;
cells.push( chalk.white( content ) );
});
lines.push( '| ' + cells.join(' | ') + ' |');
// content rows
expectedRows.forEach((row,i) => {
var cells;
var rowError = Object.keys(statusRows[i]).length > 0;
// expected row
cells = []
headers.forEach( (key) => {
var content = String(row[key]).padRight(' ', widths[key] );
2017-02-07 08:10:26 -05:00
if (statusRows[i][key] == false)
cells.push( chalk.yellow( wantStr + content) );
else {
if (rowError) {
if (columnStatus[key]==false)
content = okStr + content
cells.push( chalk.yellow( content) );
}
else {
if (columnStatus[key]==false)
content = okStr + content
cells.push( chalk.green( content) );
}
}
});
2017-02-07 04:24:31 -05:00
lines.push('| ' + cells.join(' | ') + ' |');
2017-02-07 08:10:26 -05:00
// if error in row, insert extra row showing actual result
if (rowError) {
cells = []
headers.forEach( (key) => {
var content = String(actual[i][key]).padRight(' ', widths[key] );
2017-02-07 08:10:26 -05:00
if (statusRows[i][key] == false)
cells.push( chalk.red( gotStr + content) );
else {
if (columnStatus[key]==false)
cells.push( chalk.red( okStr + content) );
else
cells.push( chalk.red( content) );
}
});
lines.push('| ' + cells.join(' | ') + ' |');
}
});
2017-02-07 04:24:31 -05:00
return lines.join('\n');
};