# # # Nimrod Tester # (c) Copyright 2014 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. # ## HTML generator for the tester. import db_sqlite, cgi, backend, strutils, json const TableHeader = """""" TableFooter = "
TestCategoryTarget Action Expected Given Success
" HtmlBegin = """ Test results """ HtmlEnd = "" proc td(s: string): string = result = "" & s.substr(0, 200).XMLEncode & "" proc getCommit(db: TDbConn, c: int): string = var commit = c for thisCommit in db.rows(sql"select id from [Commit] order by id desc"): if commit == 0: result = thisCommit[0] inc commit proc generateHtml*(filename: string, commit: int) = const selRow = """select name, category, target, action, expected, given, result from TestResult where [commit] = ? and machine = ? order by category""" var db = open(connection="testament.db", user="testament", password="", database="testament") # search for proper commit: let lastCommit = db.getCommit(commit) var outfile = open(filename, fmWrite) outfile.write(HtmlBegin) let commit = db.getValue(sql"select hash from [Commit] where id = ?", lastCommit) let branch = db.getValue(sql"select branch from [Commit] where id = ?", lastCommit) outfile.write("

$# $#

" % [branch, commit]) # generate navigation: outfile.write("""") for currentMachine in db.rows(sql"select id from Machine order by id"): let m = currentMachine[0] outfile.write("""
""" % m) outfile.write(TableHeader) for row in db.rows(sql(selRow), lastCommit, m): outfile.write("") for x in row: outfile.write(x.td) outfile.write("") outfile.write(TableFooter) outfile.write("
") outfile.write(HtmlEnd) close(db) close(outfile) proc generateJson*(filename: string, commit: int) = const selRow = """select count(*), sum(result = 'reSuccess'), sum(result = 'reIgnored') from TestResult where [commit] = ? and machine = ? order by category""" selDiff = """select A.category || '/' || A.target || '/' || A.name, A.result, B.result from TestResult A inner join TestResult B on A.name = B.name and A.category = B.category where A.[commit] = ? and B.[commit] = ? and A.machine = ? and A.result != B.result""" var db = open(connection="testament.db", user="testament", password="", database="testament") let lastCommit = db.getCommit(commit) if lastCommit.isNil: quit "cannot determine commit " & $commit let previousCommit = db.getCommit(commit-1) var outfile = open(filename, fmWrite) let machine = $backend.getMachine(db) let data = db.getRow(sql(selRow), lastCommit, machine) outfile.writeln("""{"total": $#, "passed": $#, "skipped": $#""" % data) if not previousCommit.isNil: let diff = newJArray() for row in db.rows(sql(selDiff), previousCommit, lastCommit, machine): var obj = newJObject() obj["name"] = %row[0] obj["old"] = %row[1] obj["new"] = %row[2] diff.add obj outfile.writeln(""", "diff": """) outfile.writeln(diff.pretty) outfile.writeln "}" close(db) close(outfile)