def test_get_subns_addr(self):
        # Signature: name(self, component_name)
                # Returns the address of a subcomponent at this address.
                #
                # For example:
                #
                # >>> a = NamespaceAddress('level1.level2.level3')
                # >>> a.get_subns_addr('subcomponent')
                # NameSpaceAddress: '/level1/level2/level3/subcomponent/'
        # from nineml.abstraction_layer.component.namespaceaddress import NamespaceAddress
        from nineml.abstraction_layer import ComponentClass
        from nineml.abstraction_layer import NamespaceAddress

        d = ComponentClass(name='D',)
        e = ComponentClass(name='E')
        f = ComponentClass(name='F')
        g = ComponentClass(name='G')
        b = ComponentClass(name='B', subnodes={'atD': d, 'atE': e})
        c = ComponentClass(name='C', subnodes={'atF': f, 'atG': g})
        a = ComponentClass(name='A', subnodes={'atB': b, 'atC': c})

        # Construction of the objects causes cloning to happen:
        # Therefore we test by looking up and checking that there
        # are the correct component names:
        bNew = a.get_subnode('atB')
        cNew = a.get_subnode('atC')
        dNew = a.get_subnode('atB.atD')
        eNew = a.get_subnode('atB.atE')
        fNew = a.get_subnode('atC.atF')
        gNew = a.get_subnode('atC.atG')

        self.assertEquals(
            gNew.get_node_addr().get_subns_addr('MyObject1'),
            NamespaceAddress('atC.atG.MyObject1')
        )

        self.assertEquals(
            eNew.get_node_addr().get_subns_addr('MyObject2'),
            NamespaceAddress('atB.atE.MyObject2')
        )

        self.assertEquals(
            bNew.get_node_addr().get_subns_addr('MyObject3'),
            NamespaceAddress('atB.MyObject3')
        )
    def test_recurse_all_components(self):
        # Signature: name
        # Returns an iterator over this component and all subcomponents

        from nineml.abstraction_layer import ComponentClass

        d = ComponentClass(name="D")
        e = ComponentClass(name="E")
        f = ComponentClass(name="F")
        g = ComponentClass(name="G")

        b = ComponentClass(name="B")
        b.insert_subnode(namespace="d", subnode=d)
        b.insert_subnode(namespace="e", subnode=e)

        c = ComponentClass(name="C")
        c.insert_subnode(namespace="f", subnode=f)
        c.insert_subnode(namespace="g", subnode=g)

        a = ComponentClass(name="A")
        a.insert_subnode(namespace="b", subnode=b)
        a.insert_subnode(namespace="c", subnode=c)

        # Construction of the objects causes cloning to happen:
        # Therefore we test by looking up and checking that there
        # are the correct component names:
        bNew = a.get_subnode("b")
        cNew = a.get_subnode("c")
        dNew = a.get_subnode("b.d")
        eNew = a.get_subnode("b.e")
        fNew = a.get_subnode("c.f")
        gNew = a.get_subnode("c.g")

        self.assertEquals(set(a.query.recurse_all_components), set([a, bNew, cNew, dNew, eNew, fNew, gNew]))
        self.assertEquals(set(bNew.query.recurse_all_components), set([bNew, dNew, eNew]))
        self.assertEquals(set(cNew.query.recurse_all_components), set([cNew, fNew, gNew]))
        self.assertEquals(set(dNew.query.recurse_all_components), set([dNew]))
        self.assertEquals(set(eNew.query.recurse_all_components), set([eNew]))
        self.assertEquals(set(fNew.query.recurse_all_components), set([fNew]))
        self.assertEquals(set(gNew.query.recurse_all_components), set([gNew]))
    def test_get_fully_qualified_port_connections(self):
        # Signature: name(self)
        # Used by the flattening code.
        #
        # This method returns a d list of tuples of the
        # the fully-qualified port connections
        # from nineml.abstraction_layer.component.componentqueryer import ComponentQueryer

        # Signature: name(self)
        # Get the namespace address of this component
        from nineml.abstraction_layer import ComponentClass, SendPort, RecvPort
        from nineml.abstraction_layer import NamespaceAddress

        d = ComponentClass(name="D", aliases=["A:=1", "B:=2"], analog_ports=[SendPort("A"), SendPort("B")])
        e = ComponentClass(name="E", analog_ports=[RecvPort("C")])
        f = ComponentClass(name="F", analog_ports=[RecvPort("D")])
        g = ComponentClass(name="G", analog_ports=[RecvPort("E")])
        b = ComponentClass(name="B", subnodes={"d": d, "e": e}, portconnections=[("d.A", "e.C")])
        c = ComponentClass(
            name="C",
            aliases=["G:=-1"],
            analog_ports=[SendPort("G")],
            subnodes={"f": f, "g": g},
            portconnections=[("G", "f.D")],
        )

        a = ComponentClass(
            name="A", subnodes={"b": b, "c": c}, analog_ports=[RecvPort("F")], portconnections=[("b.d.A", "F")]
        )

        bNew = a.get_subnode("b")
        cNew = a.get_subnode("c")
        # dNew = a.get_subnode('b.d')
        # eNew = a.get_subnode('b.e')
        # fNew = a.get_subnode('c.f')
        # gNew = a.get_subnode('c.g')

        self.assertEquals(
            list(a.query.get_fully_qualified_port_connections()), [(NamespaceAddress("b.d.A"), NamespaceAddress("F"))]
        )

        self.assertEquals(
            list(bNew.query.get_fully_qualified_port_connections()),
            [(NamespaceAddress("b.d.A"), NamespaceAddress("b.e.C"))],
        )

        self.assertEquals(
            list(cNew.query.get_fully_qualified_port_connections()),
            [(NamespaceAddress("c.G"), NamespaceAddress("c.f.D"))],
        )