# This file is Copyright 2015, Will Bond <will@wbond.net>, licensed to Google
# under the terms of the Google Inbound Service Agreement, signed August 15 2015


def data(provider_method, first_param_name_suffix=False):
    """
    A method decorator for unittest.TestCase classes that configured a
    static method to be used to provide multiple sets of test data to a single
    test

    :param provider_method:
        The name of the staticmethod of the class to use as the data provider

    :param first_param_name_suffix:
        If the first parameter for each set should be appended to the method
        name to generate the name of the test. Otherwise integers are used.

    :return:
        The decorated function
    """

    def test_func_decorator(test_func):
        test_func._provider_method = provider_method
        test_func._provider_name_suffix = first_param_name_suffix
        return test_func
    return test_func_decorator


def data_class(cls):
    """
    A class decorator that works with the @provider decorator to generate test
    method from a data provider
    """

    def generate_test_func(name, original_function, num, params):
        if original_function._provider_name_suffix:
            data_name = params[0]
            params = params[1:]
        else:
            data_name = num
        expanded_name = 'test_%s_%s' % (name, data_name)
        # We used expanded variable names here since this line is present in
        # backtraces that are generated from test failures.
        generated_test_function = lambda self: original_function(self, *params)
        setattr(cls, expanded_name, generated_test_function)

    for name in dir(cls):
        func = getattr(cls, name)
        if hasattr(func, '_provider_method'):
            num = 1
            for params in getattr(cls, func._provider_method)():
                generate_test_func(name, func, num, params)
                num += 1

    return cls
