Tests given sequence of conditions and stores results.
    
    Parameters
    ----------
    exprs: bool or tuple of (bool, str)
        Variable number of expressions evaluated. If a tuple first element is 
        expression evaluated, second is the message displayed on failure in the report.

def expect(*exprs):
    """Tests given sequence of conditions and stores results.
    
    Parameters
    ----------
    exprs: bool or tuple of (bool, str)
        Variable number of expressions evaluated. If a tuple first element is 
        expression evaluated, second is the message displayed on failure in the report.   
    """

    # Catch case of only two arguments where one is expr and other is msg
    if len(exprs) == 2 and (isinstance(exprs[0], (bool, np.bool_)) and isinstance(exprs[1], str)):
        if not exprs[0]:
            _log_failure(arg_num=0, msg=exprs[1])
    else:
        for i, arg in enumerate(exprs):
            if isinstance(arg, (bool, np.bool_)):
                # Just an epression on its own 
                if not arg:
                    _log_failure(arg_num=i)
            elif isinstance(arg, (list, tuple)):
                if len(arg) != 2:
                    raise ValueError('Arguments to "expect" are invalid. They must be either an expression,'
                                     ' or a tuple of length two as (expression, error_message)')
                expr, msg = arg
                if not expr:
                    _log_failure(arg_num=i, msg=msg)