Changeset 2245
- Timestamp:
- 03/03/08 16:02:09 (2 months ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
gaphor/trunk/gaphor/adapters/states/tests/test_transition_connect.py
r2170 r2245 1 1 """ 2 Test transition item connections.2 Test transition item and state vertices connections. 3 3 """ 4 4 … … 18 18 factory = self.element_factory 19 19 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) 22 22 23 23 t = self.create(items.TransitionItem) … … 40 40 assert len(factory.lselect(lambda e: e.isKindOf(UML.Transition))) == 1 41 41 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): 47 49 """Test transition and state vertices disconnection 48 50 """ 49 51 factory = self.element_factory 50 52 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) 53 55 54 56 t = self.create(items.TransitionItem) … … 71 73 assert len(factory.lselect(lambda e: e.isKindOf(UML.Transition))) == 1 72 74 73 assert t.subject .source == v1.subject.outgoing74 assert t.subject .target == v2.subject.incoming75 assert t.subject == v1.subject.outgoing[0] 76 assert t.subject == v2.subject.incoming[0] 75 77 76 78 adapter.disconnect(t.tail) … … 81 83 82 84 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 83 224 # vim:sw=4:et:ai gaphor/trunk/gaphor/adapters/states/vertexconnect.py
r2168 r2245 10 10 from gaphor.adapters.connectors import RelationshipConnect 11 11 12 class TransitionConnect(RelationshipConnect): 12 13 class VertexConnect(RelationshipConnect): 13 14 """ 14 Connect two state vertices using transition item.15 Abstract relationship between two state vertices. 15 16 """ 16 component.adapts(items.VertexItem, items.TransitionItem)17 18 17 def connect_subject(self, handle): 19 18 relation = self.relationship_or_new(UML.Transition, … … 22 21 self.line.subject = relation 23 22 23 24 25 class 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 24 46 component.provideAdapter(TransitionConnect) 47 48 49 50 class 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 90 component.provideAdapter(InitialPseudostateTransitionConnect) gaphor/trunk/gaphor/diagram/states/pseudostates.py
r2237 r2245 13 13 14 14 class InitialPseudostateItem(VertexItem): 15 """ 16 Initial pseudostate diagram item. 17 18 Parameters 19 - _connected - guard used to not connect more than one transition 20 """ 15 21 __uml__ = UML.Pseudostate 16 22 __style__ = { … … 27 33 h.movable = False 28 34 35 self._connected = False 36 37 29 38 def draw(self, context): 30 39 """
