def test_get_node_addr(self): # Signature: name(self) # Get the namespace address of this component 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={'d': d, 'e': e}) c = ComponentClass(name='C', subnodes={'f': f, 'g': g}) a = ComponentClass(name='A', subnodes={'b': b, 'c': 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(a.get_node_addr(), NamespaceAddress.create_root()) self.assertEquals(bNew.get_node_addr(), NamespaceAddress('b')) self.assertEquals(cNew.get_node_addr(), NamespaceAddress('c')) self.assertEquals(dNew.get_node_addr(), NamespaceAddress('b.d')) self.assertEquals(eNew.get_node_addr(), NamespaceAddress('b.e')) self.assertEquals(fNew.get_node_addr(), NamespaceAddress('c.f')) self.assertEquals(gNew.get_node_addr(), NamespaceAddress('c.g')) self.assertEquals(a.name, 'A') self.assertEquals(bNew.name, 'B') self.assertEquals(cNew.name, 'C') self.assertEquals(dNew.name, 'D') self.assertEquals(eNew.name, 'E') self.assertEquals(fNew.name, 'F') self.assertEquals(gNew.name, 'G')
def test_backsub_all(self): from nineml.abstraction_layer.component import ComponentClass # Check the aliases: # ====================== # c2 = ComponentClass(name='C1', aliases=['A:=1+2', 'B:=5*A', 'C:=B+2']) self.assertEqual(c2.aliases_map['A'].rhs_as_python_func()(), 3) # This should assert, because its not yet back-subbed c2.backsub_all() self.assertEqual(c2.aliases_map['B'].rhs_as_python_func()(), 15) # Check the ordering: self.assertEqual(c2.aliases_map['C'].rhs_as_python_func()(), ((5 * (3)) + 2)) # ====================== # # Check the equations: # ====================== # warnings.warn('Tests not implemented')
def test_insert_subnode(self): # Signature: name(self, subnode, namespace) # Insert a subnode into this component # # # :param subnode: An object of type ``ComponentClass``. # :param namespace: A `string` specifying the name of the component in # this components namespace. # # :raises: ``NineMLRuntimeException`` if there is already a subcomponent at # the same namespace location # # .. note:: # # This method will clone the subnode. from nineml.abstraction_layer import ComponentClass from nineml.abstraction_layer import NamespaceAddress from nineml.exceptions import NineMLRuntimeError 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(a.get_node_addr(), NamespaceAddress.create_root()) self.assertEquals(bNew.get_node_addr(), NamespaceAddress('b')) self.assertEquals(cNew.get_node_addr(), NamespaceAddress('c')) self.assertEquals(dNew.get_node_addr(), NamespaceAddress('b.d')) self.assertEquals(eNew.get_node_addr(), NamespaceAddress('b.e')) self.assertEquals(fNew.get_node_addr(), NamespaceAddress('c.f')) self.assertEquals(gNew.get_node_addr(), NamespaceAddress('c.g')) self.assertEquals(a.name, 'A') self.assertEquals(bNew.name, 'B') self.assertEquals(cNew.name, 'C') self.assertEquals(dNew.name, 'D') self.assertEquals(eNew.name, 'E') self.assertEquals(fNew.name, 'F') self.assertEquals(gNew.name, 'G') self.assertRaises(NineMLRuntimeError, a.get_subnode, 'x') self.assertRaises(NineMLRuntimeError, a.get_subnode, 'a.') self.assertRaises(NineMLRuntimeError, a.get_subnode, 'a.X') self.assertRaises(NineMLRuntimeError, a.get_subnode, 'a.b.') self.assertRaises(NineMLRuntimeError, a.get_subnode, 'a.b.X') # Adding to the same namespace twice: d1 = ComponentClass(name='D1') d2 = ComponentClass(name='D2') a = ComponentClass(name='B') a.insert_subnode(namespace='d', subnode=d1) self.assertRaises( NineMLRuntimeError, a.insert_subnode, namespace='d', subnode=d2)
def test_connect_ports(self): # Signature: name(self, src, sink) # Connects the ports of 2 subcomponents. # # The ports can be specified as ``string`` s or ``NamespaceAddresses`` es. # # # :param src: The source port of one sub-component; this should either an # event port or analog port, but it *must* be a send port. # # :param sink: The sink port of one sub-component; this should either an # event port or analog port, but it *must* be either a 'recv' or a # 'reduce' port. from nineml.abstraction_layer import ComponentClass from nineml.abstraction_layer.testing_utils import TestableComponent from nineml.exceptions import NineMLRuntimeError tIaf = TestableComponent('iaf') tCoba = TestableComponent('coba_synapse') # Should be fine: c = ComponentClass(name='C1', subnodes={'iaf': tIaf(), 'coba': tCoba()}) c.connect_ports('iaf.V', 'coba.V') c = ComponentClass(name='C1', subnodes={'iaf': tIaf(), 'coba': tCoba()}, portconnections=[('iaf.V', 'coba.V')] ) # Non existant Ports: c = ComponentClass(name='C1', subnodes={'iaf': tIaf(), 'coba': tCoba()}) self.assertRaises( NineMLRuntimeError, c.connect_ports, 'iaf.V1', 'coba.V') self.assertRaises( NineMLRuntimeError, c.connect_ports, 'iaf.V', 'coba.V1') self.assertRaises( NineMLRuntimeError, ComponentClass, name='C1', subnodes={'iaf': tIaf(), 'coba': tCoba()}, portconnections=[('iaf.V1', 'coba.V')] ) self.assertRaises( NineMLRuntimeError, ComponentClass, name='C1', subnodes={'iaf': tIaf(), 'coba': tCoba()}, portconnections=[('iaf.V', 'coba.V1')] ) # Connect ports the wronf way around: # [Check the wright way around works:] c = ComponentClass(name='C1', subnodes={'iaf': tIaf(), 'coba': tCoba()}, portconnections=[('coba.I', 'iaf.ISyn')] ) # And the wrong way around: c = ComponentClass(name='C1', subnodes={'iaf': tIaf(), 'coba': tCoba()}) self.assertRaises( NineMLRuntimeError, c.connect_ports, 'iaf.ISyn.', 'coba.I') self.assertRaises( NineMLRuntimeError, c.connect_ports, 'coba.V', 'iaf.V') # Error raised on duplicate port-connection: c = ComponentClass(name='C1', subnodes={'iaf': tIaf(), 'coba': tCoba()}, ) c.connect_ports('coba.I', 'iaf.ISyn') self.assertRaises( NineMLRuntimeError, c.connect_ports, 'coba.I', 'iaf.ISyn')