# HG changeset patch # User ChristianK # Date 1213527528 -7200 # Node ID 5d2f4814bb2e396a59cfcdb3c21563cf11d362e8 # Parent 455eb10696f26f1be4abbf72c49ff2c212d3e790 [svn r287] update to test statistics generation diff -r 455eb10696f2 -r 5d2f4814bb2e tests/makewebstatistics.d --- 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] ...", 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] ...", 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(` + + + + + + + + + + + + + + + + + + + + + `); - 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(``); + 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(``); + } else { + index.writefln(``); + } + + if(i == 0) { + continue; + } + + index.writefln(``); + index.writefln(``); + } + + index.writefln(`
namePASSXFAILFAILXPASSERRORcomparison to ` ~ std.path.getBaseName(reference) ~ `
`); + 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(`
`); + 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(`
`); + + 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(``); + 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, "
"); } - - - BufferedFile stats = new BufferedFile(std.path.join(dirname, "stats.base"), FileMode.OutNew); - scope(exit) stats.close(); - stats.writefln(``); - stats.writefln(``, id, ``); - stats.writefln(``, log.counts[Result.PASS], ``); - stats.writefln(``, log.counts[Result.XFAIL], ``); - stats.writefln(``, log.counts[Result.FAIL], ``); - stats.writefln(``, log.counts[Result.XPASS], ``); - stats.writefln(``, log.counts[Result.ERROR], ``); - stats.writefln(``); - } - // 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(``); + } - 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(``, id, ``); + stats.writefln(``, log.counts[Result.PASS], ``); + stats.writefln(``, log.counts[Result.XFAIL], ``); + stats.writefln(``, log.counts[Result.FAIL], ``); + stats.writefln(``, log.counts[Result.XPASS], ``); + stats.writefln(``, log.counts[Result.ERROR], ``); +} - 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(``); + auto improvementsFile = new BufferedFile(std.path.join(dirname, "improvements.html"), FileMode.OutNew); scope(exit) improvementsFile.close(); + improvementsFile.writefln(``); + auto changesFile = new BufferedFile(std.path.join(dirname, "changes.html"), FileMode.OutNew); scope(exit) changesFile.close(); + changesFile.writefln(``); + 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, "
"); } - } + } - BufferedFile stats = new BufferedFile(std.path.join(dirname, "stats.base"), FileMode.OutNew); - scope(exit) stats.close(); - auto dir = oldid ~ "-to-" ~ newid; - stats.writefln(``); - stats.writefln(``); - stats.writefln(`Improvements: `, nImprovements, `, `); - stats.writefln(`Regressions: `, nRegressions, `, `); - stats.writefln(`Changes: `, nChanges, ``); - stats.writefln(``); + regressionsFile.writefln(``); + improvementsFile.writefln(``); + changesFile.writefln(``); } - // 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(` - - - - - - - - - - - - - - - - - - - `); - - 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(`
namePASSXFAILFAILXPASSERROR
`); - - 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(`Improvements: `, nImprovements, `, `); + stats.writefln(`Regressions: `, nRegressions, `, `); + stats.writefln(`Changes: `, nChanges, ``); } -