def multi(state, *tests):
    """Run multiple subtests. Return original state (for chaining).

    This function could be thought as an AND statement, since all tests it runs must pass

    Args:
        state: State instance describing student and solution code,  can be omitted if used with Ex()
        tests: one or more sub-SCTs to run.

    :Example:
        The SCT below checks two has_code cases.. ::

            Ex().multi(has_code('SELECT'), has_code('WHERE'))

        The SCT below uses ``multi`` to 'branch out' to check that
        the SELECT statement has both a WHERE and LIMIT clause.. ::

            Ex().check_node('SelectStmt', 0).multi(
                check_edge('where_clause'),
                check_edge('limit_clause')
            )
    """
    for test in iter_tests(tests):
        # assume test is function needing a state argument
        # partial state so reporter can test
        state.do_test(partial(test, state))

    # return original state, so can be chained
    return state