var passCount = 0;
var failCount = 0;
$(function()
{
// First, wireup!
$('#results').on('click', 'td.rvl', function()
{
var tr = $(this).closest('tr');
if (tr.hasClass('collapsed'))
{
$('.revealer', tr).hide();
$('.hidden', tr).show();
$(this).html("-");
}
else
{
$('.revealer', tr).show();
$('.hidden', tr).hide();
$(this).html("+");
}
tr.toggleClass('collapsed expanded');
});
$('#expand-all').click(function()
{
$('.collapsed .rvl').click();
});
$('#collapse-all').click(function()
{
$('.expanded .rvl').click();
});
// Next, run tests and render results!
for (var i = 0; i < TESTS.length; i++)
{
var test = TESTS[i];
var passed = runTest(test, i);
if (passed)
passCount++;
else
failCount++;
}
// Finally, show the overall status.
if (failCount == 0)
$('#status').addClass('status-pass').html("All "+passCount+" test"+(passCount == 1 ? "" : "s")+" passed");
else
$('#status').addClass('status-fail').html(""+failCount+" test"+(failCount == 1 ? "" : "s")+" failed; "+passCount+" passed");
});
function runTest(test, num)
{
var actual = Papa.parse(test.input, test.config);
var results = compare(actual.data, actual.errors, test.expected);
var testDescription = (test.description || "");
if (testDescription.length > 0)
testDescription += '
';
if (test.notes)
testDescription += '' + test.notes + '';
var tr = '
'
+ '+ | '
+ '' + testDescription + ' | '
+ passOrFailTd(results.data)
+ passOrFailTd(results.errors)
+ 'condensed ' + JSON.stringify(test.config, null, 2) + ' | '
+ 'condensed ' + revealChars(test.input) + ' | '
+ 'condensed data: ' + JSON.stringify(test.expected.data, null, 4) + '\r\nerrors: ' + JSON.stringify(test.expected.errors, null, 4) + ' | '
+ 'condensed data: ' + JSON.stringify(actual.data, null, 4) + '\r\nerrors: ' + JSON.stringify(actual.errors, null, 4) + ' | '
+ '
';
$('#results').append(tr);
if (!results.data.passed || !results.errors.passed)
$('#test-'+num+' td.rvl').click();
return results.data.passed && results.errors.passed
}
function compare(actualData, actualErrors, expected)
{
var data = compareData(actualData, expected.data);
var errors = compareErrors(actualErrors, expected.errors);
return {
data: data,
errors: errors
}
}
function compareData(actual, expected)
{
var passed = true;
if (actual.length != expected.length)
passed = false;
for (var row = 0; row < expected.length; row++)
{
if (actual.length != expected.length)
{
passed = false;
break;
}
for (var col = 0; col < expected[row].length; col++)
{
if (actual[row].length != expected[row].length)
{
passed = false;
break;
}
var expectedVal = expected[row][col];
var actualVal = actual[row][col];
if (actualVal !== expectedVal)
{
passed = false;
break;
}
}
}
// We pass back an object right now, even though it only contains
// one value, because we might add details to the test results later
// (same with compareErrors below)
return {
passed: passed
};
}
function compareErrors(actual, expected)
{
var passed = JSON.stringify(actual) == JSON.stringify(expected);
return {
passed: passed
};
}
function passOrFailTd(result)
{
if (result.passed)
return 'OK | ';
else
return 'FAIL | ';
}
function revealChars(txt)
{
// Make spaces and tabs more obvious when glancing
txt = txt.replace(/( |\t)/ig, '$1');
txt = txt.replace(/(\r\n|\n\r|\r|\n)/ig, '$1$1');
// Now make the line breaks within the spans actually appear on the page
txt = txt.replace(/">\r\n<\/span>/ig, '">\\r\\n');
txt = txt.replace(/">\n\r<\/span>/ig, '">\\n\\r');
txt = txt.replace(/">\r<\/span>/ig, '">\\r');
txt = txt.replace(/">\n<\/span>/ig, '">\\n');
return txt;
}