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
' + '
condensed
' + '
condensed
' + '
condensed
' + ''; $('#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; }