From: "Michał Górny" <mgorny@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/pms-test-suite:master commit in: pmstestsuite/output/
Date: Fri, 5 Aug 2011 19:54:52 +0000 (UTC) [thread overview]
Message-ID: <6c21f8b452e8454fc56a0eda654b54a299f29e9c.mgorny@gentoo> (raw)
commit: 6c21f8b452e8454fc56a0eda654b54a299f29e9c
Author: Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Fri Aug 5 19:55:12 2011 +0000
Commit: Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Fri Aug 5 19:55:12 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/pms-test-suite.git;a=commit;h=6c21f8b4
Add the HTML output module.
---
pmstestsuite/output/__init__.py | 3 +-
pmstestsuite/output/html.py | 182 +++++++++++++++++++++++++++++++++++++++
2 files changed, 184 insertions(+), 1 deletions(-)
diff --git a/pmstestsuite/output/__init__.py b/pmstestsuite/output/__init__.py
index cef7ab8..0c7c8be 100644
--- a/pmstestsuite/output/__init__.py
+++ b/pmstestsuite/output/__init__.py
@@ -83,5 +83,6 @@ def get_output_modules():
"""
from pmstestsuite.output.cli import CLIOutput
+ from pmstestsuite.output.html import HTMLOutput
- return (CLIOutput,)
+ return (CLIOutput, HTMLOutput)
diff --git a/pmstestsuite/output/html.py b/pmstestsuite/output/html.py
new file mode 100644
index 0000000..5842eb9
--- /dev/null
+++ b/pmstestsuite/output/html.py
@@ -0,0 +1,182 @@
+# vim:fileencoding=utf-8
+# (c) 2011 Michał Górny <mgorny@gentoo.org>
+# Released under the terms of the 2-clause BSD license.
+
+from collections import defaultdict
+
+from pmstestsuite.output import OutputModule
+
+class HTMLOutput(OutputModule):
+ name = 'html'
+
+ def __init__(self, path = None):
+ if path is None:
+ path = 'pms-test-suite-output.html'
+ self._path = path
+
+ _htmlheader = '''<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>PMS Test Suite test results</title>
+ <style type="text/css">
+ table {
+ margin: 0 auto;
+ border: 1px solid;
+ }
+
+ th, td {
+ padding: .1em 1em;
+ border: 1px solid;
+ }
+
+ .value {
+ font-family: monospace;
+ text-align: center;
+ }
+
+ .good {
+ background: #88e888;
+ }
+
+ .bad {
+ background: #e88888;
+ }
+ </style>
+ </head>
+ <body>
+ <table>'''
+
+ _htmlfooter = '''
+ </table>
+ </body>
+</html>'''
+
+ def __call__(self, allresults, verbose = False):
+ mypms = []
+
+ def _results_by_test(allresults):
+ ret = defaultdict(lambda: defaultdict(lambda: None))
+ for pm, results in allresults.items():
+ mypms.append(pm)
+ for t, r in results.items():
+ ret[t][pm] = r
+ return ret
+
+ def _results_by_class(reorderedresults):
+ ret = defaultdict(dict)
+ for t, r in reorderedresults.items():
+ ret[t.__class__.__name__][t] = r
+ return ret
+
+ def _sorted_pms(pms):
+ for pm in sorted(pms, key = lambda pm: mypms.index(pm)):
+ yield (pm, pms[pm])
+
+ class HTMLElem(object):
+ _elem = 'td'
+
+ def __init__(self, text):
+ self._attrs = []
+ self._text = text
+
+ def set_rowspan(self, rowspan):
+ if rowspan != 1:
+ self._attrs.append('rowspan="%d"' % rowspan)
+
+ def __str__(self):
+ return '<%s>%s</%s>' % (' '.join([self._elem] + self._attrs),
+ self._text, self._elem)
+
+ class TH(HTMLElem):
+ _elem = 'th'
+
+ def __init__(self, text, colspan = 1):
+ HTMLElem.__init__(self, text)
+ self._colspan = colspan
+ if colspan != 1:
+ self._attrs.append('colspan="%d"' % colspan)
+
+ class ValCell(HTMLElem):
+ _color_class = ''
+
+ def __init__(self, text):
+ HTMLElem.__init__(self, text)
+ self._attrs.append('class="value %s"' % self._color_class)
+
+ class ColorValCell(ValCell):
+ def __init__(self, text, cond):
+ self._color_class = 'good' if cond else 'bad'
+ ValCell.__init__(self, text)
+
+ class BoolCell(ValCell):
+ def __init__(self, cond):
+ self._color_class = 'good' if cond else 'bad'
+ ValCell.__init__(self, 'OK' if cond else 'FAIL')
+
+ class NoCell(HTMLElem):
+ def __init__(self):
+ pass
+
+ def __str__(self):
+ return ''
+
+ ret = True
+ results = _results_by_test(allresults)
+ table = defaultdict(lambda: defaultdict(lambda: None))
+
+ table[0][0] = TH('Test name')
+ table[0][1] = TH('EAPI')
+ table[0][2] = TH('Assertion')
+ table[0][3] = TH('Expected')
+ for i, pm in enumerate(mypms):
+ table[0][4 + i*3] = TH(pm.name, colspan = 3)
+ table[0][5 + i*3] = NoCell()
+ table[1][4 + i*3] = TH('Actual')
+ table[1][5 + i*3] = TH('Result')
+ maxcol = 6 + i*3
+
+ row = 2
+ for cl, tests in _results_by_class(results).items():
+ table[row][0] = cl
+ for t, pms in tests.items():
+ table[row][1] = t.eapi
+ test_asserts = []
+ col = 4
+ for pm, r in _sorted_pms(pms):
+ table[row][col+1] = BoolCell(r)
+ for a in r.assertions:
+ if a.name not in test_asserts:
+ test_asserts.append(a.name)
+ crow = row + test_asserts.index(a.name)
+ table[crow][2] = a.name
+ table[crow][3] = ValCell(a.expected)
+ else:
+ crow = row + test_asserts.index(a.name)
+
+ table[crow][col] = ColorValCell(a.actual, a)
+ col += 2
+ row += len(test_asserts)
+
+ f = open(self._path, 'w')
+ f.write(self._htmlheader)
+ for y in range(0, row):
+ f.write('<tr>')
+ for x in range(0, maxcol):
+ cell = table[y][x]
+ if cell is not None:
+ rowspan = 1
+ for y2 in range(y + 1, row):
+ if table[y2][x] is None:
+ rowspan += 1
+ else:
+ break
+
+ if not isinstance(cell, HTMLElem):
+ cell = HTMLElem(cell)
+ cell.set_rowspan(rowspan)
+ f.write(str(cell))
+ f.write('</tr>')
+ f.write(self._htmlfooter)
+ f.close()
+
+ return ret
next reply other threads:[~2011-08-05 19:55 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-05 19:54 Michał Górny [this message]
-- strict thread matches above, loose matches on Subject: below --
2011-08-05 21:36 [gentoo-commits] proj/pms-test-suite:master commit in: pmstestsuite/output/ Michał Górny
2011-08-05 21:36 Michał Górny
2011-08-06 8:31 Michał Górny
2011-08-06 14:25 Michał Górny
2011-08-06 14:25 Michał Górny
2011-08-11 8:53 Michał Górny
2011-08-11 8:53 Michał Górny
2011-08-11 22:09 Michał Górny
2011-08-11 22:09 Michał Górny
2011-08-12 9:35 Michał Górny
2011-08-15 18:06 Michał Górny
2012-01-03 15:52 Michał Górny
2013-08-09 23:01 Michał Górny
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=6c21f8b452e8454fc56a0eda654b54a299f29e9c.mgorny@gentoo \
--to=mgorny@gentoo.org \
--cc=gentoo-commits@lists.gentoo.org \
--cc=gentoo-dev@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox