Changeset 2245

Show
Ignore:
Timestamp:
03/03/08 16:02:09 (2 months ago)
Author:
wrobe..@pld-linux.org
Message:

- implemented final state and initial pseudostate correct transition

connectors

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • gaphor/trunk/gaphor/adapters/states/tests/test_transition_connect.py

    r2170 r2245  
    11""" 
    2 Test transition item connections. 
     2Test transition item and state vertices connections. 
    33""" 
    44 
     
    1818        factory = self.element_factory 
    1919 
    20         v1 = self.create(items.StateItem
    21         v2 = self.create(items.StateItem
     20        v1 = self.create(items.StateItem, UML.State
     21        v2 = self.create(items.StateItem, UML.State
    2222 
    2323        t = self.create(items.TransitionItem) 
     
    4040        assert len(factory.lselect(lambda e: e.isKindOf(UML.Transition))) == 1 
    4141         
    42         assert t.subject.source == v1.subject.outgoing 
    43         assert t.subject.target == v2.subject.incoming 
    44  
    45  
    46     def test_vertex_connect(self): 
     42        assert t.subject == v1.subject.outgoing[0] 
     43        assert t.subject == v2.subject.incoming[0] 
     44        assert t.subject.source == v1.subject 
     45        assert t.subject.target == v2.subject 
     46 
     47 
     48    def test_vertex_disconnect(self): 
    4749        """Test transition and state vertices disconnection 
    4850        """ 
    4951        factory = self.element_factory 
    5052 
    51         v1 = self.create(items.StateItem
    52         v2 = self.create(items.StateItem
     53        v1 = self.create(items.StateItem, UML.State
     54        v2 = self.create(items.StateItem, UML.State
    5355 
    5456        t = self.create(items.TransitionItem) 
     
    7173        assert len(factory.lselect(lambda e: e.isKindOf(UML.Transition))) == 1 
    7274         
    73         assert t.subject.source == v1.subject.outgoing 
    74         assert t.subject.target == v2.subject.incoming 
     75        assert t.subject == v1.subject.outgoing[0] 
     76        assert t.subject == v2.subject.incoming[0] 
    7577 
    7678        adapter.disconnect(t.tail) 
     
    8183 
    8284 
     85    def test_initial_pseudostate_connect(self): 
     86        """Test transition and initial pseudostate connection 
     87        """ 
     88        factory = self.element_factory 
     89 
     90        v1 = self.create(items.InitialPseudostateItem, UML.Pseudostate) 
     91        assert v1._connected == False # not connected 
     92        v2 = self.create(items.StateItem, UML.State) 
     93        assert v1.subject.kind == 'initial' 
     94 
     95        t = self.create(items.TransitionItem) 
     96        assert t.subject is None 
     97 
     98        # connect head of transition to an initial pseudostate 
     99        adapter = component.queryMultiAdapter((v1, t), IConnect) 
     100        assert adapter is not None 
     101        adapter.connect(t.head) 
     102        assert t.subject is None 
     103        assert v1._connected == True # psuedostate connected 
     104 
     105        # connect tail of transition to a state 
     106        adapter = component.queryMultiAdapter((v2, t), IConnect) 
     107        assert adapter is not None 
     108        adapter.connect(t.tail) 
     109        assert t.subject is not None 
     110 
     111        assert len(factory.lselect(lambda e: e.isKindOf(UML.Transition))) == 1 
     112         
     113        assert t.subject == v1.subject.outgoing[0] 
     114        assert t.subject == v2.subject.incoming[0] 
     115 
     116        # we should not be able to connect two transitions to initial 
     117        # pseudostate 
     118        t2 = self.create(items.TransitionItem) 
     119        adapter = component.queryMultiAdapter((v1, t2), IConnect) 
     120        assert adapter is not None 
     121        adapter.connect(t.head) 
     122        # connection to `t2` should not be possible as v1 is already connected 
     123        # to `t` 
     124        assert t2.head.connected_to is None 
     125        assert v1._connected == True # psuedostate remains connected 
     126 
     127 
     128    def test_initial_pseudostate_disconnect(self): 
     129        """Test transition and initial pseudostate disconnection 
     130        """ 
     131        factory = self.element_factory 
     132 
     133        v1 = self.create(items.InitialPseudostateItem, UML.Pseudostate) 
     134        assert v1._connected == False # not connected 
     135        v2 = self.create(items.StateItem, UML.State) 
     136        assert v1.subject.kind == 'initial' 
     137 
     138        t = self.create(items.TransitionItem) 
     139        assert t.subject is None 
     140 
     141        # connect head of transition to an initial pseudostate 
     142        adapter = component.queryMultiAdapter((v1, t), IConnect) 
     143        assert adapter is not None 
     144        adapter.connect(t.head) 
     145        assert t.subject is None 
     146 
     147        assert v1._connected == True # psuedostate connected 
     148 
     149        adapter.disconnect(t.head) 
     150        assert v1._connected == False # psuedostate disconnected 
     151 
     152 
     153    def test_initial_pseudostate_tail_connect(self): 
     154        """Test transition tail and initial pseudostate connection 
     155        """ 
     156        factory = self.element_factory 
     157 
     158        v1 = self.create(items.InitialPseudostateItem, UML.Pseudostate) 
     159        assert v1._connected == False # not connected 
     160        v2 = self.create(items.StateItem, UML.State) 
     161        assert v1.subject.kind == 'initial' 
     162 
     163        t = self.create(items.TransitionItem) 
     164        assert t.subject is None 
     165 
     166        # connect head of transition to an initial pseudostate 
     167        adapter = component.queryMultiAdapter((v1, t), IConnect) 
     168        assert adapter is not None 
     169        adapter.connect(t.tail) 
     170        assert t.tail.connected_to is None, 'no tail connection should be possible' 
     171        assert v1._connected == False # psuedostate not connected 
     172 
     173 
     174    def test_final_state_connect(self): 
     175        """Test transition to final state connection 
     176        """ 
     177        factory = self.element_factory 
     178 
     179        v1 = self.create(items.StateItem, UML.State) 
     180        v2 = self.create(items.FinalStateItem, UML.FinalState) 
     181 
     182        t = self.create(items.TransitionItem) 
     183        assert t.subject is None 
     184 
     185        adapter = component.queryMultiAdapter((v1, t), IConnect) 
     186        assert adapter is not None 
     187         
     188        # connect head of transition to a state 
     189        adapter.connect(t.head) 
     190        assert t.subject is None 
     191 
     192        adapter = component.queryMultiAdapter((v2, t), IConnect) 
     193        assert adapter is not None 
     194 
     195        # connect tail of transition to final state 
     196        adapter.connect(t.tail) 
     197        assert t.subject is not None 
     198 
     199        assert len(factory.lselect(lambda e: e.isKindOf(UML.Transition))) == 1 
     200         
     201        assert t.subject == v1.subject.outgoing[0] 
     202        assert t.subject == v2.subject.incoming[0] 
     203        assert t.subject.source == v1.subject 
     204        assert t.subject.target == v2.subject 
     205 
     206 
     207    def test_final_state_head_connect(self): 
     208        """Test transition head to final state connection 
     209        """ 
     210        factory = self.element_factory 
     211 
     212        v = self.create(items.FinalStateItem, UML.FinalState) 
     213        t = self.create(items.TransitionItem) 
     214 
     215        adapter = component.queryMultiAdapter((v, t), IConnect) 
     216        assert adapter is not None 
     217 
     218        # connect head of transition to final state 
     219        adapter.connect(t.head) 
     220        # no connection as only tail of transition can be connected 
     221        assert t.head.connected_to is None 
     222 
     223 
    83224# vim:sw=4:et:ai 
  • gaphor/trunk/gaphor/adapters/states/vertexconnect.py

    r2168 r2245  
    1010from gaphor.adapters.connectors import RelationshipConnect 
    1111 
    12 class TransitionConnect(RelationshipConnect): 
     12 
     13class VertexConnect(RelationshipConnect): 
    1314    """ 
    14     Connect two state vertices using transition item
     15    Abstract relationship between two state vertices
    1516    """ 
    16     component.adapts(items.VertexItem, items.TransitionItem) 
    17  
    1817    def connect_subject(self, handle): 
    1918        relation = self.relationship_or_new(UML.Transition, 
     
    2221        self.line.subject = relation 
    2322 
     23 
     24 
     25class TransitionConnect(VertexConnect): 
     26    """ 
     27    Connect two state vertices using transition item. 
     28    """ 
     29    component.adapts(items.VertexItem, items.TransitionItem) 
     30 
     31    def glue(self, handle): 
     32        """ 
     33        Glue transition handle and vertex item. Guard from connecting 
     34        transition's head with final state. 
     35        """ 
     36        line = self.line 
     37        subject = self.element.subject 
     38 
     39        is_final = isinstance(subject, UML.FinalState) 
     40        if isinstance(subject, UML.State) and not is_final \ 
     41                or handle is line.tail and is_final: 
     42            return super(TransitionConnect, self).glue(handle) 
     43        else: 
     44            return None 
     45 
    2446component.provideAdapter(TransitionConnect) 
     47 
     48 
     49 
     50class InitialPseudostateTransitionConnect(VertexConnect): 
     51    """ 
     52    Connect initial pseudostate using transition item. 
     53 
     54    It modifies InitialPseudostateItem._connected attribute to disallow 
     55    connection of more than one transition. 
     56    """ 
     57    component.adapts(items.InitialPseudostateItem, items.TransitionItem) 
     58 
     59    def glue(self, handle): 
     60        """ 
     61        Glue to initial pseudostate with transition's head and when there are 
     62        no transitions connected. 
     63        """ 
     64        line = self.line 
     65        subject = self.element.subject 
     66 
     67        if handle is line.head and not self.element._connected: 
     68            return super(InitialPseudostateTransitionConnect, self).glue(handle) 
     69        else: 
     70            return None 
     71 
     72 
     73    def connect(self, handle): 
     74        """ 
     75        Update InitialPseudostateItem._connected attribute to `True` to 
     76        disallow more connections. 
     77        """ 
     78        if super(InitialPseudostateTransitionConnect, self).connect(handle): 
     79            self.element._connected = True 
     80 
     81 
     82    def disconnect(self, handle): 
     83        """ 
     84        Update InitialPseudostateItem._connected attribute to `False` to 
     85        allow transition connection again after disconnection. 
     86        """ 
     87        super(InitialPseudostateTransitionConnect, self).disconnect(handle) 
     88        self.element._connected = False 
     89 
     90component.provideAdapter(InitialPseudostateTransitionConnect) 
  • gaphor/trunk/gaphor/diagram/states/pseudostates.py

    r2237 r2245  
    1313 
    1414class InitialPseudostateItem(VertexItem): 
     15    """ 
     16    Initial pseudostate diagram item. 
     17 
     18    Parameters 
     19        - _connected - guard used to not connect more than one transition 
     20    """ 
    1521    __uml__   = UML.Pseudostate 
    1622    __style__ = { 
     
    2733            h.movable = False 
    2834 
     35        self._connected = False 
     36 
     37 
    2938    def draw(self, context): 
    3039        """