public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
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



             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