Exemple #1
0
 def test_class_patching_is_undone(self) -> None:
     # CrossHair does a lot of monkey matching of classes
     # with contracts. Ensure that gets undone.
     original_container = ShippingContainer.__dict__.copy()
     original_overloaded = OverloadedContainer.__dict__.copy()
     run_checkables(analyze_class(OverloadedContainer))
     for k, v in original_container.items():
         self.assertIs(ShippingContainer.__dict__[k], v)
     for k, v in original_overloaded.items():
         self.assertIs(OverloadedContainer.__dict__[k], v)
Exemple #2
0
def check_post_err(
    fn: Callable, optionset: AnalysisOptionSet = AnalysisOptionSet()
) -> ComparableLists:
    local_opts = AnalysisOptionSet(max_iterations=20)
    options = local_opts.overlay(optionset)
    states = [m.state for m in run_checkables(analyze_function(fn, options))]
    return (states, [MessageType.POST_ERR])
Exemple #3
0
def check_fail(
    fn: Callable, optionset: AnalysisOptionSet = AnalysisOptionSet()
) -> ComparableLists:
    local_opts = AnalysisOptionSet(max_iterations=40, per_condition_timeout=5)
    options = local_opts.overlay(optionset)
    states = [m.state for m in run_checkables(analyze_function(fn, options))]
    return (states, [MessageType.POST_FAIL])
Exemple #4
0
def check_messages(checkables: Iterable[Checkable], **kw) -> ComparableLists:
    msgs = run_checkables(checkables)
    if kw.get("state") != MessageType.CONFIRMED:
        # Normally, ignore confirmation messages:
        msgs = [m for m in msgs if m.state != MessageType.CONFIRMED]
    else:
        # When we want CONFIRMED, take the message with the worst status:
        msgs = [max(msgs, key=lambda m: m.state)]
    default_msg = AnalysisMessage(MessageType.CANNOT_CONFIRM, "", "", 0, 0, "")
    msg = msgs[0] if msgs else replace(default_msg)
    fields = (
        "state",
        "message",
        "filename",
        "line",
        "column",
        "traceback",
        "test_fn",
        "condition_src",
    )
    for k in fields:
        if k not in kw:
            default_val = getattr(default_msg, k)
            msg = replace(msg, **{k: default_val})
            kw[k] = default_val
    if msgs:
        msgs[0] = msg
    return (msgs, [AnalysisMessage(**kw)])
Exemple #5
0
 def test_icontract_class(self):
     messages = run_checkables(
         analyze_class(
             IcontractB,
             DEFAULT_OPTIONS.overlay(
                 analysis_kind=[AnalysisKind.icontract]),
         ))
     messages = {(m.state, m.line, m.message)
                 for m in messages if m.state != MessageType.CONFIRMED}
     self.assertEqual(
         messages,
         {
             (
                 MessageType.POST_FAIL,
                 114,
                 '"@icontract.invariant(lambda self: self.x > 0)" yields false '
                 "when calling break_parent_invariant(self = instance of B(10))",
             ),
             (
                 MessageType.POST_FAIL,
                 117,
                 '"@icontract.invariant(lambda self: self.x < 100)" yields false '
                 "when calling break_my_invariant(self = instance of B(10))",
             ),
         },
     )
Exemple #6
0
def check_unknown(
    fn: Callable, optionset: AnalysisOptionSet = AnalysisOptionSet()
) -> ComparableLists:
    local_opts = AnalysisOptionSet(max_iterations=40, per_condition_timeout=3)
    options = local_opts.overlay(optionset)
    messages = [(m.state, m.message, m.traceback)
                for m in run_checkables(analyze_function(fn, options))]
    return (messages, [(MessageType.CANNOT_CONFIRM, "Not confirmed.", "")])
Exemple #7
0
def check_ok(
    fn: Callable, optionset: AnalysisOptionSet = AnalysisOptionSet()
) -> ComparableLists:
    local_opts = AnalysisOptionSet(per_condition_timeout=5)
    options = local_opts.overlay(optionset)
    messages = [
        message for message in run_checkables(analyze_function(fn, options))
        if message.state != MessageType.CONFIRMED
    ]
    return (messages, [])
Exemple #8
0
def check_exec_err(
    fn: Callable, message_prefix="", optionset: AnalysisOptionSet = AnalysisOptionSet()
) -> ComparableLists:
    local_opts = AnalysisOptionSet(max_iterations=20, per_condition_timeout=5)
    options = local_opts.overlay(optionset)
    messages = run_checkables(analyze_function(fn, options))
    if all(m.message.startswith(message_prefix) for m in messages):
        return ([m.state for m in messages], [MessageType.EXEC_ERR])
    else:
        return (
            [(m.state, m.message) for m in messages],
            [(MessageType.EXEC_ERR, message_prefix)],
        )
Exemple #9
0
def check_states(
    fn: Callable, optionset: AnalysisOptionSet = AnalysisOptionSet()
) -> Set[MessageType]:
    local_opts = AnalysisOptionSet(max_iterations=40, per_condition_timeout=5)
    options = local_opts.overlay(optionset)
    return set([m.state for m in run_checkables(analyze_function(fn, options))])