def test_dataflow_assignment_node_attribute(graph: DataflowGraph, instantiate: bool) -> None: x: AssignableNodeReference = get_dataflow_node(graph, "x") y: AssignableNodeReference = get_dataflow_node(graph, "y") z: AssignableNodeReference = get_dataflow_node(graph, "z") x.assign(y, Statement(), graph) y.assign(z, Statement(), graph) if instantiate: y.assign(create_instance().reference(), Statement(), graph) x_n: AssignableNodeReference = get_dataflow_node(graph, "x.n") assignment_node: AssignableNode = x_n.assignment_node() instance: InstanceNode if instantiate: assert isinstance(y, VariableNodeReference) assert len(y.node.instance_assignments) == 1 instance = y.node.instance_assignments[0].rhs.node() else: assert isinstance(z, VariableNodeReference) assert z.node.equivalence.tentative_instance is not None instance = z.node.equivalence.tentative_instance # verify tentative nodes only get created once assignment_node2: AssignableNode = x_n.assignment_node() assert assignment_node == assignment_node2 assert assignment_node == instance.get_attribute("n")
def test_dataflow_tentative_attribute_propagation_on_equivalence( graph: DataflowGraph) -> None: x: AssignableNodeReference = get_dataflow_node(graph, "x") y: AssignableNodeReference = get_dataflow_node(graph, "y") z: AssignableNodeReference = get_dataflow_node(graph, "z") x.assign(y, Statement(), graph) y.assign(z, Statement(), graph) z.assign(x, Statement(), graph) x_n: AssignableNodeReference = get_dataflow_node(graph, "x.n") x_n.assign(ValueNode(42).reference(), Statement(), graph) assert isinstance(y, VariableNodeReference) assert len(y.node.instance_assignments) == 0 y.assign(create_instance().reference(), Statement(), graph) assert len(y.node.instance_assignments) == 1 y_n: Optional[AttributeNode] = y.node.instance_assignments[0].rhs.node( ).get_attribute("n") assert y_n is not None assert len(y_n.value_assignments) == 1 assert y_n.value_assignments[0].rhs.node.value == 42
def test_dataflow_index(graph: DataflowGraph, reverse: bool) -> None: entity: Entity = Entity("DummyEntity", Namespace("dummy_namespace")) i1: InstanceNode = create_instance(graph, entity) i2: InstanceNode = create_instance(graph, entity) assert i1.get_self() is i1 assert i2.get_self() is i2 assert i1 is not i2 graph.add_index_match([i.reference() for i in [i1, i2]]) if reverse: # make sure adding them again in another order does not cause issues graph.add_index_match([i.reference() for i in [i2, i1]]) assert i1.get_self() is i1 assert i2.get_self() is i1 assert i2.reference().node() is i1 assert i2.reference().top_node() is i2 assert i1.get_all_index_nodes() == {i1, i2}
def test_dataflow_index_nodes(graph: DataflowGraph) -> None: entity: Entity = Entity("DummyEntity", Namespace("dummy_namespace")) i1: InstanceNode = create_instance(graph, entity) i2: InstanceNode = create_instance(graph, entity) i1.register_attribute("n").assign( ValueNode(0).reference(), Statement(), graph) i1.register_attribute("n").assign( ValueNode(0).reference(), Statement(), graph) x: AssignableNodeReference = get_dataflow_node(graph, "x") y: AssignableNodeReference = get_dataflow_node(graph, "y") x.assign(i1.reference(), Statement(), graph) y.assign(i2.reference(), Statement(), graph) graph.add_index_match([i.reference() for i in [i1, i2]]) x_n: AssignableNodeReference = get_dataflow_node(graph, "x.n") y_n: AssignableNodeReference = get_dataflow_node(graph, "y.n") assert set(x_n.nodes()) == set(y_n.nodes())
def test_dataflow_attribute_reference_nodes(graph: DataflowGraph) -> None: x: AssignableNodeReference = get_dataflow_node(graph, "x") y: AssignableNodeReference = get_dataflow_node(graph, "y") x.assign(y, Statement(), graph) y.assign(create_instance().reference(), Statement(), graph) assert isinstance(y, VariableNodeReference) assert len(y.node.instance_assignments) == 1 y_n: AssignableNodeReference = get_dataflow_node(graph, "y.n") y_n.assign(ValueNode(42).reference(), Statement(), graph) x_n: AssignableNodeReference = get_dataflow_node(graph, "x.n") x_n_nodes: List[AssignableNode] = list(x_n.nodes()) assert len(x_n_nodes) == 1 assert x_n_nodes[0] == y.node.instance_assignments[0].rhs.node( ).get_attribute("n")
def test_attribute_assignment(graph: DataflowGraph, instantiate: bool) -> None: x: AssignableNodeReference = get_dataflow_node(graph, "x") x_n: AssignableNodeReference = get_dataflow_node(graph, "x.n") if instantiate: x.assign(create_instance().reference(), Statement(), graph) x_n.assign(ValueNode(42).reference(), Statement(), graph) assert isinstance(x, VariableNodeReference) instance: InstanceNode if instantiate: assert x.node.equivalence.tentative_instance is None assert len(x.node.instance_assignments) == 1 instance = x.node.instance_assignments[0].rhs.node() else: assert x.node.equivalence.tentative_instance is not None instance = x.node.equivalence.tentative_instance n: Optional[AttributeNode] = instance.get_attribute("n") assert n is not None assert len(n.value_assignments) == 1 assert n.value_assignments[0].rhs == ValueNode(42).reference()
def test_dataflow_variable_chain_leaf(graph: DataflowGraph) -> None: x: AssignableNodeReference = get_dataflow_node(graph, "x") y: AssignableNodeReference = get_dataflow_node(graph, "y") z: AssignableNodeReference = get_dataflow_node(graph, "z") x.assign(y, Statement(), graph) y.assign(z, Statement(), graph) leaves: Set[AssignableNode] = set(x.leaf_nodes()) assert isinstance(z, DirectNodeReference) assert leaves == {z.node} @pytest.mark.parametrize("value_node", [ValueNode(42), create_instance()]) def test_dataflow_variable_tree_leaves(graph: DataflowGraph, value_node: Node) -> None: x: AssignableNodeReference = get_dataflow_node(graph, "x") y: AssignableNodeReference = get_dataflow_node(graph, "y") z: AssignableNodeReference = get_dataflow_node(graph, "z") x.assign(y, Statement(), graph) y.assign(z, Statement(), graph) y.assign(value_node.reference(), Statement(), graph) leaves: Set[AssignableNode] = set(x.leaf_nodes()) assert isinstance(y, DirectNodeReference) assert isinstance(z, DirectNodeReference) assert leaves == {y.node, z.node}