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)
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)
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)
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')
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'))
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()
def test_reg_change_and(): assert RegChangeKnown(1) & 5 == RegChangeUnknown() assert 3 & RegChangeKnown(3) == RegChangeKnown(3) assert 1 & RegChangeUnconstrained() == RegChangeKnown(1)