1# Copyright (c) 2017 Mark D. Hill and David A. Wood 2# All rights reserved. 3# 4# Redistribution and use in source and binary forms, with or without 5# modification, are permitted provided that the following conditions are 6# met: redistributions of source code must retain the above copyright 7# notice, this list of conditions and the following disclaimer; 8# redistributions in binary form must reproduce the above copyright 9# notice, this list of conditions and the following disclaimer in the 10# documentation and/or other materials provided with the distribution; 11# neither the name of the copyright holders nor the names of its 12# contributors may be used to endorse or promote products derived from 13# this software without specific prior written permission. 14# 15# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26# 27# Authors: Sean Wilson 28 29 30import helper 31import runner as runner_mod 32 33class TestSuite(object): 34 ''' 35 An object grouping a collection of tests. It provides tags which enable 36 filtering during list and run selection. All tests held in the suite must 37 have a unique name. 38 39 ..note:: 40 The :func:`__new__` method enables collection of test cases, it must 41 be called in order for test cases to be collected. 42 43 ..note:: 44 To reduce test definition boilerplate, the :func:`init` method is 45 forwarded all `*args` and `**kwargs`. This means derived classes can 46 define init without boilerplate super().__init__(*args, **kwargs). 47 ''' 48 runner = runner_mod.SuiteRunner 49 collector = helper.InstanceCollector() 50 fixtures = [] 51 tests = [] 52 tags = set() 53 54 def __new__(klass, *args, **kwargs): 55 obj = super(TestSuite, klass).__new__(klass, *args, **kwargs) 56 TestSuite.collector.collect(obj) 57 return obj 58 59 def __init__(self, name=None, fixtures=tuple(), tests=tuple(), 60 tags=tuple(), **kwargs): 61 self.fixtures = self.fixtures + list(fixtures) 62 self.tags = self.tags | set(tags) 63 self.tests = self.tests + list(tests) 64 if name is None: 65 name = self.__class__.__name__ 66 self.name = name 67 68 def __iter__(self): 69 return iter(self.tests)