Esempio n. 1
0
def test_reg_change_add():
    assert RegChangeKnown(1) + 5 == RegChangeKnown(6)
    assert 3 + RegChangeKnown(4) == RegChangeKnown(7)
    assert RegChangeUnknown() + RegChangeKnown(2) == RegChangeUnknown()

    with pytest.raises(TypeError):
        RegChangeKnown(3) + 'asd'

    with pytest.raises(TypeError):
        RegChangeUnconstrained() + RegChangeKnown(0)
Esempio n. 2
0
def test_reg_tracking_data_add():
    initial_data = RegTrackingData(group=3, offset=5)
    groups = itertools.count(4)

    def group_alloc():
        return next(groups)

    assert initial_data.add(3, group_alloc) == RegTrackingData(group=3,
                                                               offset=8)
    assert initial_data.add(RegChangeUnknown(),
                            group_alloc) == RegTrackingData(group=4, offset=0)
    assert initial_data.add(RegChangeUnknown(),
                            group_alloc) == RegTrackingData(group=5, offset=0)
    with pytest.raises(NotImplementedError):
        initial_data.add(RegChangeUnconstrained(), group_alloc)
Esempio n. 3
0
def test_flow_tracking():
    flow_tracking = FlowTracking()
    loc1 = flow_tracking.get_ap_tracking()
    flow_tracking.add_ap(3)
    assert flow_tracking.get_ap_tracking() - loc1 == RegChangeKnown(3)
    flow_tracking.add_ap(2)
    assert flow_tracking.get_ap_tracking() - loc1 == RegChangeKnown(5)
    # Adding an unknown value will revoke().
    flow_tracking.add_ap(RegChangeUnknown())
    loc2 = flow_tracking.get_ap_tracking()
    assert flow_tracking.get_ap_tracking() - loc1 == RegChangeUnknown()
    assert flow_tracking.get_ap_tracking() - loc2 == RegChangeKnown(0)
    flow_tracking.add_ap(10)
    flow_tracking.add_ap(1)
    assert flow_tracking.get_ap_tracking() - loc2 == RegChangeKnown(11)
Esempio n. 4
0
def test_from_expr():
    assert RegChange.from_expr(5) == RegChangeKnown(5)
    assert RegChange.from_expr(RegChangeKnown(6)) == RegChangeKnown(6)
    assert RegChange.from_expr(ExprConst(7)) == RegChangeKnown(7)
    assert RegChange.from_expr(ExprIdentifier('asd')) == RegChangeUnknown()

    with pytest.raises(TypeError):
        RegChange.from_expr('wrong type')
Esempio n. 5
0
def test_flow_tracking_converge_references(refs):
    flow_tracking = FlowTracking()
    flow_tracking.add_flow_to_label(ScopedName.from_string('a'),
                                    RegChangeUnknown())
    flow_tracking.add_flow_to_label(ScopedName.from_string('b'),
                                    RegChangeUnknown())

    # Label a.
    flow_tracking.revoke()
    flow_tracking.converge_with_label(ScopedName.from_string('a'))
    flow_tracking.add_reference(
        name=ScopedName.from_string('x'),
        ref=Reference(
            pc=0,
            value=refs.expr_a,
            ap_tracking_data=flow_tracking.get_ap_tracking(),
        ))
    flow_tracking.add_ap(13)
    flow_tracking.add_flow_to_label(ScopedName.from_string('c'), 0)

    # Label b.
    flow_tracking.revoke()
    flow_tracking.converge_with_label(ScopedName.from_string('b'))
    flow_tracking.add_reference(
        name=ScopedName.from_string('x'),
        ref=Reference(
            pc=0,
            value=refs.expr_b,
            ap_tracking_data=flow_tracking.get_ap_tracking(),
        ))
    flow_tracking.add_ap(15)
    flow_tracking.add_flow_to_label(ScopedName.from_string('c'), 0)

    # Label c - convergence.
    flow_tracking.revoke()
    flow_tracking.converge_with_label(ScopedName.from_string('c'))

    if refs.valid:
        flow_tracking.resolve_reference(ScopedName.from_string('x'))
    else:
        with pytest.raises(FlowTrackingError):
            flow_tracking.resolve_reference(ScopedName.from_string('x'))
Esempio n. 6
0
def test_reg_tracking_data():
    assert RegTrackingData(group=3, offset=5) - RegTrackingData(group=3, offset=17) == \
        RegChangeKnown(-12)
    assert RegTrackingData(group=3, offset=5) - RegTrackingData(group=4, offset=17) == \
        RegChangeUnknown()
Esempio n. 7
0
def test_reg_change_and():
    assert RegChangeKnown(1) & 5 == RegChangeUnknown()
    assert 3 & RegChangeKnown(3) == RegChangeKnown(3)
    assert 1 & RegChangeUnconstrained() == RegChangeKnown(1)