# # # Nim Tester # (c) Copyright 2015 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; onlyFailing: bool) = 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): if onlyFailing and row.len > 0 and row[row.high] == "reSuccess": discard else: 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""" selResults = """select category || '/' || target || '/' || name, category, target, action, result, expected, given from TestResult where [commit] = ?""" 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) let results = newJArray() for row in db.rows(sql(selResults), lastCommit): var obj = newJObject() obj["name"] = %row[0] obj["category"] = %row[1] obj["target"] = %row[2] obj["action"] = %row[3] obj["result"] = %row[4] obj["expected"] = %row[5] obj["given"] = %row[6] results.add(obj) outfile.writeln(""", "results": """) outfile.write(results.pretty) 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)