def check_not(state, *tests, msg):
    """Run multiple subtests that should fail. If all subtests fail, returns original state (for chaining)

    - This function is currently only tested in working with ``has_code()`` in the subtests.
    - This function can be thought as a ``NOT(x OR y OR ...)`` statement, since all tests it runs must fail
    - This function can be considered a direct counterpart of multi.

    Args:
        state: State instance describing student and solution code, can be omitted if used with Ex()
        *tests: one or more sub-SCTs to run
        msg: feedback message that is shown in case not all tests specified in ``*tests`` fail.

    :Example:

        Thh SCT below runs two has_code cases.. ::

            Ex().check_not(
                has_code('INNER'),
                has_code('OUTER'),
                incorrect_msg="Don't use `INNER` or `OUTER`!"
            )

        If students use ``INNER (JOIN)`` or ``OUTER (JOIN)`` in their code, this test will fail.

    """
    for test in iter_tests(tests):
        try:
            test(state)
        except TestFail:
            # it fails, as expected, off to next one
            continue
        return state.report(Feedback(msg))

    # return original state, so can be chained
    return state