Mercurial > projects > ldc
diff tests/makewebstatistics.d @ 266:5d2f4814bb2e trunk
[svn r287] update to test statistics generation
author | ChristianK |
---|---|
date | Sun, 15 Jun 2008 12:58:48 +0200 |
parents | 5723b7385c25 |
children | c9d5c711d65a |
line wrap: on
line diff
--- a/tests/makewebstatistics.d Sun Jun 15 11:40:47 2008 +0200 +++ b/tests/makewebstatistics.d Sun Jun 15 12:58:48 2008 +0200 @@ -330,25 +330,29 @@ } +char[] basedir = "web"; +bool regenerate = false; + int main(char[][] args){ - if(args.length < 2){ - fwritefln(stderr, "%s [--regenerate] <log> <log> ...", args[0]); - fwritefln(stderr, "bash example: %s $(ls reference/llvmdc*)", args[0]); + if(args.length < 3 || (args[1] == "--regenerate" && args.length < 4)){ + fwritefln(stderr, "%s [--regenerate] <reference-log> <log> <log> ...", args[0]); + fwritefln(stderr, "bash example: %s reference/dmd-something $(ls reference/llvmdc*)", args[0]); return 1; } - bool regenerate = false; + char[] reference; char[][] files; if(args[1] == "--regenerate") { regenerate = true; - files = args[2..$]; + reference = args[2]; + files = args[3..$] ~ reference; } else { - files = args[1..$]; + reference = args[1]; + files = args[2..$] ~ reference; } // make sure base path exists - char[] basedir = "web"; if(std.file.exists(basedir) && !std.file.isdir(basedir)) throw new Exception(basedir ~ " is not a directory!"); else if(!std.file.exists(basedir)) @@ -357,29 +361,102 @@ Log[char[]] logs; - // parse log and emit per-log data if necessary - foreach(char[] file; files){ - char[] id = std.path.getBaseName(file); - char[] dirname = std.path.join(basedir, id); + // emit per-log data + foreach(char[] file; files) + generateLogStatistics(file, logs); + + // differences between logs + foreach(int i, char[] file; files[1 .. $]) + generateChangeStatistics(files[1+i], files[1+i-1], logs); + + // differences between reference and logs + foreach(char[] file; files[0..$-1]) + generateChangeStatistics(file, reference, logs); + + // collect all the stats.base files into a large table + BufferedFile index = new BufferedFile(std.path.join(basedir, "index.html"), FileMode.OutNew); + scope(exit) index.close(); + index.writefln(` + <html><body> + <table style="border-collapse:collapse; text-align:center;"> + <colgroup> + <col style="border-right: medium solid black;"> + <col style="background-color: #AAFFAA;"> + <col style="background-color: #AAFFAA; border-right: thin solid black;"> + <col style="background-color: #FFAAAA;"> + <col style="background-color: #FFAAAA;"> + <col style="background-color: #FFAAAA;"> + <col style="border-left: medium solid black;"> + </colgroup> + <tr style="border-bottom: medium solid black;"> + <th>name</th> + <th style="padding-left:1em;padding-right:1em;">PASS</th> + <th style="padding-left:1em;padding-right:1em;">XFAIL</th> + <th style="padding-left:1em;padding-right:1em;">FAIL</th> + <th style="padding-left:1em;padding-right:1em;">XPASS</th> + <th style="padding-left:1em;padding-right:1em;">ERROR</th> + <th style="padding-left:1em;padding-right:1em;">comparison to ` ~ std.path.getBaseName(reference) ~ `</th> + </tr> + `); - if(std.file.exists(dirname)) { - if(std.file.isdir(dirname)) { - if(!regenerate) { - writefln("Directory ", dirname, " already exists, skipping..."); - continue; - } + for(int i = files.length - 1; i >= 0; --i) { + auto file = files[i]; + index.writefln(`<tr>`); + char[] id = std.path.getBaseName(file); + char[] statsname = std.path.join(std.path.join(basedir, id), "stats.base"); + index.writef(cast(char[])std.file.read(statsname)); + + if(i != files.length - 1) { + index.writefln(`<td>`); + char[] refid = std.path.getBaseName(reference); + statsname = std.path.join(std.path.join(basedir, refid ~ "-to-" ~ id), "stats.base"); + index.writef(cast(char[])std.file.read(statsname)); + index.writefln(`</td></tr>`); + } else { + index.writefln(`<td></td></tr>`); + } + + if(i == 0) { + continue; + } + + index.writefln(`<tr><td></td>`); + index.writefln(`<td style="background-color:white;" colspan="5">`); + char[] newid = std.path.getBaseName(files[i-1]); + statsname = std.path.join(std.path.join(basedir, newid ~ "-to-" ~ id), "stats.base"); + index.writef(cast(char[])std.file.read(statsname)); + index.writefln(`</td><td></td></tr>`); + } + + index.writefln(`</table></body></html>`); + + return 0; +} + +void generateLogStatistics(char[] file, ref Log[char[]] logs) +{ + char[] id = std.path.getBaseName(file); + char[] dirname = std.path.join(basedir, id); + + if(std.file.exists(dirname)) { + if(std.file.isdir(dirname)) { + if(!regenerate) { + writefln("Directory ", dirname, " already exists, skipping..."); + return; } - else - throw new Exception(dirname ~ " is not a directory!"); } else - std.file.mkdir(dirname); + throw new Exception(dirname ~ " is not a directory!"); + } + else + std.file.mkdir(dirname); - // parse etc. - Log log = new Log(id, file); - logs[id] = log; + // parse etc. + Log log = new Log(id, file); + logs[id] = log; - // write status + // write status + { BufferedFile makeFile(char[] name) { return new BufferedFile(std.path.join(dirname, name), FileMode.OutNew); } @@ -389,75 +466,86 @@ Result.XPASS: makeFile("xpass.html"), Result.XFAIL: makeFile("xfail.html"), Result.ERROR: makeFile("error.html") ]; - + scope(exit) { foreach(file; resultsfile) file.close(); } - - + + foreach(file; resultsfile) + file.writefln(`<html><body>`); + foreach(tkey; log.tests.keys.sort) { auto test = log.tests[tkey]; auto result = test.r & Result.BASE_MASK; - resultsfile[result].writefln(test.name, " in ", test.file); + resultsfile[result].writefln(test.name, " in ", test.file, "<br>"); } - - - BufferedFile stats = new BufferedFile(std.path.join(dirname, "stats.base"), FileMode.OutNew); - scope(exit) stats.close(); - stats.writefln(`<tr>`); - stats.writefln(`<td style="padding-right:1em; text-align:left;">`, id, `</td>`); - stats.writefln(`<td><a href="`, std.path.join(log.id, "pass.html"), `">`, log.counts[Result.PASS], `</a></td>`); - stats.writefln(`<td><a href="`, std.path.join(log.id, "xfail.html"), `">`, log.counts[Result.XFAIL], `</a></td>`); - stats.writefln(`<td><a href="`, std.path.join(log.id, "fail.html"), `">`, log.counts[Result.FAIL], `</a></td>`); - stats.writefln(`<td><a href="`, std.path.join(log.id, "xpass.html"), `">`, log.counts[Result.XPASS], `</a></td>`); - stats.writefln(`<td><a href="`, std.path.join(log.id, "error.html"), `">`, log.counts[Result.ERROR], `</a></td>`); - stats.writefln(`</tr>`); - } - // differences between logs - foreach(int i, char[] file; files[1 .. $]){ - char[] newid = std.path.getBaseName(files[1+i]); - char[] oldid = std.path.getBaseName(files[1+i-1]); + foreach(file; resultsfile) + file.writefln(`</body></html>`); + } - char[] dirname = std.path.join(basedir, oldid ~ "-to-" ~ newid); + BufferedFile stats = new BufferedFile(std.path.join(dirname, "stats.base"), FileMode.OutNew); + scope(exit) stats.close(); + stats.writefln(`<td style="padding-right:1em; text-align:left;">`, id, `</td>`); + stats.writefln(`<td><a href="`, std.path.join(log.id, "pass.html"), `">`, log.counts[Result.PASS], `</a></td>`); + stats.writefln(`<td><a href="`, std.path.join(log.id, "xfail.html"), `">`, log.counts[Result.XFAIL], `</a></td>`); + stats.writefln(`<td><a href="`, std.path.join(log.id, "fail.html"), `">`, log.counts[Result.FAIL], `</a></td>`); + stats.writefln(`<td><a href="`, std.path.join(log.id, "xpass.html"), `">`, log.counts[Result.XPASS], `</a></td>`); + stats.writefln(`<td><a href="`, std.path.join(log.id, "error.html"), `">`, log.counts[Result.ERROR], `</a></td>`); +} - if(std.file.exists(dirname)) { - if(std.file.isdir(dirname)) { - if(!regenerate) { - writefln("Directory ", dirname, " already exists, skipping..."); - continue; - } +void generateChangeStatistics(char[] file1, char[] file2, ref Log[char[]] logs) +{ + char[] newid = std.path.getBaseName(file1); + char[] oldid = std.path.getBaseName(file2); + + char[] dirname = std.path.join(basedir, oldid ~ "-to-" ~ newid); + + if(std.file.exists(dirname)) { + if(std.file.isdir(dirname)) { + if(!regenerate) { + writefln("Directory ", dirname, " already exists, skipping..."); + return; } - else - throw new Exception(dirname ~ " is not a directory!"); } else - std.file.mkdir(dirname); + throw new Exception(dirname ~ " is not a directory!"); + } + else + std.file.mkdir(dirname); - // parse etc. - Log newLog, oldLog; - Log getOrParse(char[] id, char[] file) { - if(id in logs) - return logs[id]; - else { - Log tmp = new Log(id, file); - logs[id] = tmp; - return tmp; - } + // parse etc. + Log newLog, oldLog; + Log getOrParse(char[] id, char[] file) { + if(id in logs) + return logs[id]; + else { + Log tmp = new Log(id, file); + logs[id] = tmp; + return tmp; } - newLog = getOrParse(newid, files[1+i]); - oldLog = getOrParse(oldid, files[1+i-1]); + } + newLog = getOrParse(newid, file1); + oldLog = getOrParse(oldid, file2); - int nRegressions, nImprovements, nChanges; + int nRegressions, nImprovements, nChanges; + + { auto regressionsFile = new BufferedFile(std.path.join(dirname, "regressions.html"), FileMode.OutNew); scope(exit) regressionsFile.close(); + regressionsFile.writefln(`<html><body>`); + auto improvementsFile = new BufferedFile(std.path.join(dirname, "improvements.html"), FileMode.OutNew); scope(exit) improvementsFile.close(); + improvementsFile.writefln(`<html><body>`); + auto changesFile = new BufferedFile(std.path.join(dirname, "changes.html"), FileMode.OutNew); scope(exit) changesFile.close(); + changesFile.writefln(`<html><body>`); + BufferedFile targetFile; - + foreach(Test t; newLog.tests.values){ Test* oldT = t.file in oldLog.tests; @@ -476,61 +564,19 @@ targetFile = changesFile; nChanges++; } - targetFile.writefln(toString(oldT.r), " -> ", toString(t.r), " : ", t.name, " in ", t.file); + targetFile.writefln(toString(oldT.r), " -> ", toString(t.r), " : ", t.name, " in ", t.file, "<br>"); } - } + } - BufferedFile stats = new BufferedFile(std.path.join(dirname, "stats.base"), FileMode.OutNew); - scope(exit) stats.close(); - auto dir = oldid ~ "-to-" ~ newid; - stats.writefln(`<tr><td></td>`); - stats.writefln(`<td style="background-color:white;" colspan="5">`); - stats.writefln(`<a href="`, std.path.join(dir, "improvements.html"), `">Improvements: `, nImprovements, `</a>, `); - stats.writefln(`<a href="`, std.path.join(dir, "regressions.html"), `">Regressions: `, nRegressions, `</a>, `); - stats.writefln(`<a href="`, std.path.join(dir, "changes.html"), `">Changes: `, nChanges, `</a></td>`); - stats.writefln(`</tr>`); + regressionsFile.writefln(`</body></html>`); + improvementsFile.writefln(`</body></html>`); + changesFile.writefln(`</body></html>`); } - // collect all the stats.base files into a large table - BufferedFile index = new BufferedFile(std.path.join(basedir, "index.html"), FileMode.OutNew); - scope(exit) index.close(); - index.writefln(` - <html><body> - <table style="border-collapse:collapse; text-align:center;"> - <colgroup> - <col style="border-right: medium solid black;"> - <col style="background-color: #AAFFAA;"> - <col style="background-color: #AAFFAA; border-right: thin solid black;"> - <col style="background-color: #FFAAAA;"> - <col style="background-color: #FFAAAA;"> - <col style="background-color: #FFAAAA;"> - </colgroup> - <tr style="border-bottom: medium solid black;"> - <th>name</th> - <th style="padding-left:1em;padding-right:1em;">PASS</th> - <th style="padding-left:1em;padding-right:1em;">XFAIL</th> - <th style="padding-left:1em;padding-right:1em;">FAIL</th> - <th style="padding-left:1em;padding-right:1em;">XPASS</th> - <th style="padding-left:1em;padding-right:1em;">ERROR</th> - </tr> - `); - - for(int i = files.length - 1; i >= 0; --i) { - auto file = files[i]; - char[] id = std.path.getBaseName(file); - char[] statsname = std.path.join(std.path.join(basedir, id), "stats.base"); - index.writef(cast(char[])std.file.read(statsname)); - - if(i == 0) - continue; - - char[] newid = std.path.getBaseName(files[i-1]); - statsname = std.path.join(std.path.join(basedir, newid ~ "-to-" ~ id), "stats.base"); - index.writef(cast(char[])std.file.read(statsname)); - } - - index.writefln(`</table></body></html>`); - - return 0; + BufferedFile stats = new BufferedFile(std.path.join(dirname, "stats.base"), FileMode.OutNew); + scope(exit) stats.close(); + auto dir = oldid ~ "-to-" ~ newid; + stats.writefln(`<a href="`, std.path.join(dir, "improvements.html"), `">Improvements: `, nImprovements, `</a>, `); + stats.writefln(`<a href="`, std.path.join(dir, "regressions.html"), `">Regressions: `, nRegressions, `</a>, `); + stats.writefln(`<a href="`, std.path.join(dir, "changes.html"), `">Changes: `, nChanges, `</a>`); } -