#!/usr/bin/env python """ @file with_setup_args.py @author garyvdm @date 2016-06-02 $LicenseInfo:firstyear=2016&license=viewerlgpl$ Second Life Viewer Source Code Copyright (C) 2016, Linden Research, Inc. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; version 2.1 of the License only. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA $/LicenseInfo$ """ def with_setup_args(setup, teardown=None): """Decorator to add setup and/or teardown methods to a test function:: @with_setup_args(setup, teardown) def test_something(): " ... " The setup function should return (args, kwargs) which will be passed to test function, and teardown function. Note that `with_setup_args` is useful *only* for test functions, not for test methods or inside of TestCase subclasses. """ def decorate(func): args = [] kwargs = {} def test_wrapped(): func(*args, **kwargs) test_wrapped.__name__ = func.__name__ def setup_wrapped(): a, k = setup() args.extend(a) kwargs.update(k) if hasattr(func, 'setup'): func.setup() test_wrapped.setup = setup_wrapped if teardown: def teardown_wrapped(): if hasattr(func, 'teardown'): func.teardown() teardown(*args, **kwargs) test_wrapped.teardown = teardown_wrapped else: if hasattr(func, 'teardown'): test_wrapped.teardown = func.teardown() return test_wrapped return decorate