| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428 |
- /* configuration */
- /* TODO: UNTESTED count can't be shown because it's not tracked explicitly */
- headerResults = [ "PASS", "NEW", "FAIL", "XFAIL", "CRASHED" ];
- logResults = [ "PASS", "NEW", "FAIL", "XFAIL", "CRASH!" ];
- resultToImgs = {
- "PASS" : [],
- "NEW" : [ "output" ],
- "FAIL" : [ "output", "difference", "reference" ],
- "XFAIL" : [],
- "UNTESTED" : [],
- "CRASHED" : []
- };
- resultToString = {
- "PASS" : "",
- "NEW" : "",
- "FAIL" : "",
- "XFAIL" : "",
- "UNTESTED" : "",
- "CRASHED" : "CRASHED!"
- };
- resultField = "result";
- rowFields = [ "test", "offset", "scale", "similar" ];
- colFields = [ "target", "format" ];
- allFields = [ resultField ].concat (rowFields, colFields);
- /* globals: */
- function resetGlobals () {
- dragElement = undefined;
- table = document.getElementById ("testTable");
- while (table.rows.length)
- table.deleteRow (0);
- colsArray = [ "HrowHeader" ];
- colsMap = undefined;
- headerId = "HcolHeader";
- fTrue = function (x) { return true; };
- empty = new Row ();
- header = new Row ();
- header[colsArray[0]].toString = function () { return ""; };
- untested = new Test ();
- untested[resultField] = "UNTESTED";
- }
- /* utility functions */
- function isKey (key) { return key[key.length-1] == ':'; }
- function normalizeKey (key) { return key.toLowerCase ().replace (/[^a-z0-9]/, ""); }
- function isVisible (x) { return x.style.display != "none"; }
- function link (html, url) { return "<a href='" + url + "'>" + html + "</a>"; }
- function image (url) { return "<img src='" + url + "'>"; }
- function span (html, id, cls) { return "<span id='" + id + "' class='" + cls + "' onmousedown='startDrag (event)' onmouseup='mouseUp (event)'>" + html + "</span>"; }
- function fieldsToHTML (bColumns, values) {
- var fields = bColumns ? colFields : rowFields;
- var prefix = bColumns ? "c" : "r";
- var tmpRE = arrayApply (function (x) { return "[^/]*"; }, fields);
- var r = Array ();
- for (var i = 0; i < fields.length; i++)
- if (fields[i] == "test") {
- r.push (link (values[fields[i]], "output/" + values[fields[i]] + ".log"));
- } else {
- tmpRE[i] = values[fields[i]];
- r.push (span (values[fields[i]], prefix + "/" + tmpRE.join ("/") + "/", fields[i]));
- tmpRE[i] = "[^/]*";
- }
- return r.join ("/");
- }
- function inArray (value, array) {
- for (var i = 0; i < array.length; i++)
- if (value == array[i])
- return true;
- return false;
- }
- function arrayApply (fun, array) {
- var r = new Array ();
- for (var i = 0; i < array.length; i++)
- r.push (fun(array[i]));
- return r;
- }
- function arrayPred (pred, array) {
- var r = new Array ();
- for (var i = 0; i < array.length; i++)
- if (pred (array[i]))
- r.push (array[i]);
- return r;
- }
- function arrayMap (map, array) { return arrayApply (function (x) { return map[x]; }, array); }
- function binSearch (rows, newId){
- var min = 0;
- var max = rows.length;
- while (max - min > 1) {
- var mid = (max + min) >> 1;
- if (rows[mid].id > newId)
- max = mid;
- else
- min = mid;
- }
- if (max == min)
- return max;
- else
- return rows[min].id > newId ? min : max;
- }
- /* dynamic table utils */
- function updateCurrent () {
- for (var i = 0; i < table.rows.length; i++) {
- var row = table.rows[i];
- if (isVisible (row)) {
- /* j starts from 1 because we want to ignore _rowHeader */
- for (var j = 1; j < row.cells.length; j++)
- if (row.id[0] == "H")
- for (var k = 0; k < headerResults.length; k++)
- header[row.cells[j].id].current[headerResults[k]] = 0;
- else if (isVisible (row.cells[j]))
- header[row.cells[j].id].current[row.cells[j].className]++;
- }
- }
- updateHeader ();
- }
- function setVisible (array, subsetPred, visibilityPred, visibleFlag) {
- var modified = false, somethingVisible = false;
- for (var i = 0; i < array.length; i++)
- if (array[i].id[0] != "H") {
- if (subsetPred (array[i])) {
- var wanted = visibilityPred (array[i]);
- if (isVisible (array[i]) != wanted) {
- modified = true;
- array[i].style.display = wanted ? visibleFlag : "none";
- }
- }
- somethingVisible = somethingVisible || isVisible (array[i]);
- }
- return modified && somethingVisible;
- }
- function setVisibleOnly (array, pred, visibleFlag) {
- return setVisible (array, fTrue, pred, visibleFlag);
- }
- function flipVisible (array, subsetPred, visibleFlag) {
- return setVisible (array, subsetPred, function (x) { return !isVisible (x); }, visibleFlag);
- }
- /* event handling */
- function ignoreEvent (event) {
- if (event.preventDefault)
- event.preventDefault();
- else
- event.returnValue= false;
- return false;
- }
- function mouseUp (event) {
- var visFun;
- if (event.button == 0)
- visFun = setVisibleOnly;
- else if (event.button == 2)
- visFun = flipVisible;
- else
- return false;
- var structureFun;
- if (event.target.id[0] == "r") /* rows */
- structureFun = function (f, p) { return f (table.rows, p, "table-row"); };
- else if (event.target.id[0] == "c") /* cols */
- structureFun = function (f, p) { return inArray (true, arrayApply (function (row) { return f (row.cells, p, "table-cell") }, table.rows)) };
- else
- return false;
- var pred;
- if (event.target.id[1] == "/") { /* regexp */
- var re = new RegExp (event.target.id);
- pred = function (x) { return re.test (x.id); };
- } else if (event.target.id[1] == "#") { /* counters */
- var s = event.target.id.substr (2).split ("/");
- pred = function (row) { return row.cells[s[0]].className == s[1]; }
- } else
- return false;
- if (!structureFun (visFun, pred))
- if (!structureFun (flipVisible, fTrue))
- structureFun (flipVisible, fTrue);
- updateCurrent ();
- return false;
- }
- function noDrag (event) {
- dragElement = undefined;
- return false;
- }
- function startDrag (event) {
- if (event.button == 0)
- dragElement = event.target;
- else
- dragElement = undefined;
- return false;
- }
- function endDrag (event) {
- if (!dragElement)
- return false;
- if (event.currentTarget.id == colsArray[0] &&
- inArray (dragElement.className, colFields)) {
- rowFields.push (dragElement.className);
- colFields = arrayPred (function (x) { return x != dragElement.className; }, colFields);
- } else if (event.currentTarget.id == headerId &&
- inArray (dragElement.className, rowFields)) {
- colFields.push (dragElement.className);
- rowFields = arrayPred (function (x) { return x != dragElement.className; }, rowFields);
- } else
- return true;
- reloadAll ();
- return false;
- }
- /* table content */
- function Row (id, t) {
- this[colsArray[0]] = new RowHeader (id, t);
- this.get = function (c) { return this[c] != undefined ? this[c] : untested; }
- this.getHTML = function (c) { return this.get(c).toString (); };
- this.setStyle = function (c, element) { return this.get(c).setStyle (element); };
- }
- function ColumnHeader (id, values) {
- this.id = id;
- this.values = values;
- this.total = new Object ();
- this.current = new Object ();
- for (var i = 0; i < headerResults.length; i++) {
- this.total[headerResults[i]] = 0;
- this.current[headerResults[i]] = 0;
- }
- this.toString = function () {
- var counts = new Array ();
- for (var i = 0; i < headerResults.length; i++) {
- var hr = headerResults[i];
- var s = span (this.current[hr], "r#" + colsMap[this.id] + "/" + hr, hr);
- if (this.current[hr] != this.total[hr])
- s += span ("[" + this.total[hr] + "]", "r#" + colsMap[this.id] + "/" + hr, hr);
- counts.push (s);
- }
- return fieldsToHTML (true, this.values) + "<br>" + counts.join ("/");
- }
- this.setStyle = function (element) { };
- }
- function RowHeader (id, values) {
- this.id = id;
- this.values = values;
- this.toString = function () { return fieldsToHTML (false, this.values); }
- this.setStyle = function (element) { element.onmouseup = endDrag; };
- }
- function Test () {
- this.rowId = function () { return "r/" + arrayMap (this, rowFields).join("/") + "/"; };
- this.colId = function () { return "c/" + arrayMap (this, colFields).join("/") + "/"; };
- this.isComplete = function () { return !inArray (undefined, arrayMap (this, allFields)); }
- this.toString = function () {
- var images = arrayMap (this, resultToImgs[this[resultField]]);
- images = arrayPred (function (x) { return x != undefined; }, images);
- images = arrayApply (function (x) { return link (image (x), x); }, images);
- images.push (resultToString[this[resultField]]);
- return images.join (" ");
- };
- this.setStyle = function (element) { element.className = this[resultField]; };
- this.addData = function (array) {
- for (var i = 0; i < array.length - 1; i += 2)
- if (isKey (array[i]))
- this[normalizeKey (array[i])] = array[i+1];
- };
- }
- /* table creation */
- function insertCell (domRow, nid, tests) {
- var domCell = domRow.insertCell (nid);
- domCell.id = colsArray[nid];
- domCell.innerHTML = tests.getHTML (colsArray[nid]);
- tests.setStyle (colsArray[nid], domCell);
- }
- function updateRow (row, tests) {
- var domRow = document.getElementById (row);
- if (!domRow) {
- domRow = table.insertRow (binSearch (table.rows, row));
- domRow.id = row;
- }
- for (var i = 0; i < colsArray.length; i++)
- if (i >= domRow.cells.length || domRow.cells[i].id != colsArray[i])
- insertCell (domRow, i, tests);
- }
- function updateHeader () {
- var visibility;
- var domRow = document.getElementById (headerId);
- if (domRow) {
- visibility = new Object ();
- for (var i = 0; i < domRow.cells.length; i++)
- visibility[domRow.cells[i].id] = domRow.cells[i].style.display;
- table.deleteRow (domRow.rowIndex);
- }
- updateRow (headerId, header);
- table.rows[0].onmouseup = endDrag;
- if (visibility)
- for (var i = 0; i < colsArray.length; i++)
- if (visibility[colsArray[i]])
- table.rows[0].cells[colsMap[colsArray[i]]].style.display = visibility[colsArray[i]];
- }
- function updateTable () {
- colsArray.sort ();
- colsMap = new Object ();
- for (var i = 0; i < colsArray.length; i++)
- colsMap[colsArray[i]] = i;
- updateHeader ();
- for (var i = 0; i < table.rows.length; i++)
- updateRow (table.rows[i].id, empty);
- }
- /* log file parsing */
- function parseTest (testData) {
- var colsChanged = false;
- var rows = new Array ();
- var data = new Object ();
- var t = new Test ();
- var lines = testData.replace (/\r/g, "").split ("\n");
- for (var i = 0; i < lines.length; i++) {
- t.addData (lines[i].split (" "));
- if (t.isComplete ()) {
- var c = t.colId ();
- if (header[c] == undefined) {
- colsArray.push (c);
- header[c] = new ColumnHeader (c, t);
- colsChanged = true;
- }
- var r = t.rowId ();
- if (!data[r]) {
- rows.push (r);
- data[r] = new Row (r, t);
- }
- data[r][c] = t;
- header[c].total[t[resultField]]++;
- header[c].current[t[resultField]]++;
- t = new Test ();
- }
- }
- if (colsChanged)
- updateTable ();
- else
- updateHeader ();
- for (var i = 0; i < rows.length; i++)
- updateRow (rows[i], data[rows[i]]);
- }
- function parseFile (fileName, parser) {
- var req = new XMLHttpRequest ();
- req.onreadystatechange = function () {
- if (req.readyState == 4)
- parser (req.responseText);
- }
- try {
- req.open ("GET", fileName);
- req.send (null);
- } catch (e) {}
- }
- function parseTestList (listData) {
- var summaryRE = /\d+ Passed, \d+ Failed \x5b\d+ crashed, \d+ expected\x5d, \d+ Skipped/;
- var lines = listData.replace (/\r/g, "").split ("\n");
- for (var i = 0; i < lines.length; i++) {
- if (summaryRE.test (lines[i]))
- return;
-
- var words = lines[i].split (" ");
- if (words.length >= 2 &&
- words[0][words[0].length-1] == ":" &&
- inArray (words[1], logResults))
- parseFile ("output/" + words[0].substr (0, words[0].length-1) + ".log", parseTest);
- }
- }
- function reloadAll() {
- resetGlobals ();
- parseFile ("cairo-test-suite.log", parseTestList);
- }
- window.onload = reloadAll;
|