#!/usr/bin/env python # Copyright (C) 2011 Canonical Ltd # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA """Displays the sum of a counter found in a subunit stream. Each test have (or not) the counter as a named detail in the stream. """ import subunit import sys import testtools import unittest class TestSumCounter(testtools.TestResult): def __init__(self, counter_names): """Create a FilterResult object outputting to stream.""" testtools.TestResult.__init__(self) self.counter_names = counter_names self.totals = {} self.longest = 0 for name in counter_names: l = len(name) if l > self.longest: self.longest = l self.totals[name] = 0 def addSuccess(self, test, details): for name in self.counter_names: try: counter_text = ''.join(details[name].iter_text()) except KeyError, e: # this counter doesn't exist for the test continue self.totals[name] += int(counter_text) def display_totals(self, stream): for name in self.counter_names: stream.write('%-*s: %s\n' % (self.longest, name, self.totals[name])) counter_names = sys.argv[1:] result = TestSumCounter(counter_names) test = subunit.ProtocolTestCase(sys.stdin) test.run(result) result.display_totals(sys.stdout)