root/gaphor/tags/gaphor-0.12.0/gaphor/tests/test_storage.py

Revision 2052, 8.2 kB (checked in by wrobe..@pld-linux.org, 1 year ago)

- storage tests refactorized to use basic TestCase? class

Line 
1 """
2 Unittest the storage and parser modules
3 """
4
5 import os
6 from testcase import TestCase
7 from gaphor import UML
8 from gaphor.UML.elementfactory import ElementFactory
9 from gaphor.application import Application
10 from gaphor import storage
11 from gaphor.misc.xmlwriter import XMLWriter
12 from gaphor.diagram import items
13 from gaphor.diagram.interfaces import IConnect
14 from zope import component
15 from cStringIO import StringIO
16
17 __module__ = 'test_storage'
18
19 class PseudoFile(object):
20
21     def __init__(self):
22         self.data = ''
23
24     def write(self, data):
25         self.data += data
26
27     def close(self):
28         pass
29
30
31 class StorageTestCase(TestCase):
32
33     services = TestCase.services + ['adapter_loader']
34
35     def test_save_uml(self):
36         """Saving gaphor.UML model elements.
37         """
38         self.element_factory.create(UML.Package)
39         self.element_factory.create(UML.Diagram)
40         self.element_factory.create(UML.Comment)
41         self.element_factory.create(UML.Class)
42
43         out = PseudoFile()
44         storage.save(XMLWriter(out), factory=self.element_factory)
45         out.close()
46
47         assert '<Package ' in out.data
48         assert '<Diagram ' in out.data
49         assert '<Comment ' in out.data
50         assert '<Class ' in out.data
51        
52
53     def test_save_item(self):
54         """Save a diagranm item too.
55         """
56         diagram = self.element_factory.create(UML.Diagram)
57         diagram.create(items.CommentItem, subject=self.element_factory.create(UML.Comment))
58
59         out = PseudoFile()
60         storage.save(XMLWriter(out), factory=self.element_factory)
61         out.close()
62
63         assert '<Diagram ' in out.data
64         assert '<Comment ' in out.data
65         assert '<canvas>' in out.data
66         assert ' type="CommentItem" ' in out.data, out.data
67
68
69     def test_load_uml(self):
70         """
71         Test loading of a freshly saved model.
72         """
73         self.element_factory.create(UML.Package)
74         # diagram is created in TestCase.setUp
75         #self.element_factory.create(UML.Diagram)
76         self.element_factory.create(UML.Comment)
77         self.element_factory.create(UML.Class)
78  
79         data = self.save()
80         self.load(data)
81
82         assert len(self.element_factory.lselect()) == 4
83         assert len(self.element_factory.lselect(lambda e: e.isKindOf(UML.Package))) == 1
84         # diagram is created in TestCase.setUp
85         assert len(self.element_factory.lselect(lambda e: e.isKindOf(UML.Diagram))) == 1
86         assert len(self.element_factory.lselect(lambda e: e.isKindOf(UML.Comment))) == 1
87         assert len(self.element_factory.lselect(lambda e: e.isKindOf(UML.Class))) == 1
88        
89
90     def test_load_uml_2(self):
91         """
92         Test loading of a freshly saved model.
93         """
94         self.element_factory.create(UML.Package)
95         self.create(items.CommentItem, UML.Comment)
96         self.create(items.ClassItem, UML.Class)
97         iface = self.create(items.InterfaceItem, UML.Interface)
98         iface.subject.name = 'Circus'
99         iface.matrix.translate(10, 10)
100
101         data = self.save()
102         self.load(data)
103
104         assert len(self.element_factory.lselect()) == 5
105         assert len(self.element_factory.lselect(lambda e: e.isKindOf(UML.Package))) == 1
106         assert len(self.element_factory.lselect(lambda e: e.isKindOf(UML.Diagram))) == 1
107         d = self.element_factory.lselect(lambda e: e.isKindOf(UML.Diagram))[0]
108         assert len(self.element_factory.lselect(lambda e: e.isKindOf(UML.Comment))) == 1
109         assert len(self.element_factory.lselect(lambda e: e.isKindOf(UML.Class))) == 1
110         assert len(self.element_factory.lselect(lambda e: e.isKindOf(UML.Interface))) == 1
111
112         c = self.element_factory.lselect(lambda e: e.isKindOf(UML.Class))[0]
113         assert c.presentation
114         assert c.presentation[0].subject is c
115         #assert c.presentation[0].subject.name.startwith('Class')
116
117         iface = self.element_factory.lselect(lambda e: e.isKindOf(UML.Interface))[0]
118         assert iface.name == 'Circus'
119         assert len(iface.presentation) == 1
120         assert tuple(iface.presentation[0].matrix) == (1, 0, 0, 1, 10, 10), tuple(iface.presentation[0].matrix)
121        
122         # Check load/save of other canvas items.
123         assert len(d.canvas.get_all_items()) == 3
124         for item in d.canvas.get_all_items():
125             assert item.subject, 'No subject for %s' % item
126         d1 = d.canvas.select(lambda e: isinstance(e, items.ClassItem))[0]
127         assert d1
128         #print d1, d1.subject
129
130
131     def test_load_uml_relationships(self):
132         """
133         Test loading of a freshly saved model with relationship objects.
134         """
135         self.element_factory.create(UML.Package)
136         self.create(items.CommentItem, UML.Comment)
137         c1 = self.create(items.ClassItem, UML.Class)
138
139         a = self.diagram.create(items.AssociationItem)
140         a.handles()[0].pos = (10, 20)
141         a.handles()[1].pos = (50, 60)
142         assert 10 == a.handles()[0].x, a.handles()[0].pos
143         assert a.handles()[0].y == 20, a.handles()[0].pos
144         assert a.handles()[1].pos == (50, 60), a.handles()[1].pos
145
146         data = self.save()
147         self.load(data)
148
149         assert len(self.element_factory.lselect()) == 4
150         assert len(self.element_factory.lselect(lambda e: e.isKindOf(UML.Package))) == 1
151         assert len(self.element_factory.lselect(lambda e: e.isKindOf(UML.Diagram))) == 1
152         d = self.element_factory.lselect(lambda e: e.isKindOf(UML.Diagram))[0]
153         assert len(self.element_factory.lselect(lambda e: e.isKindOf(UML.Comment))) == 1
154         assert len(self.element_factory.lselect(lambda e: e.isKindOf(UML.Class))) == 1
155         assert len(self.element_factory.lselect(lambda e: e.isKindOf(UML.Association))) == 0
156
157         # Check load/save of other canvas items.
158         assert len(d.canvas.get_all_items()) == 3
159         for item in d.canvas.get_all_items():
160             if isinstance(item, items.AssociationItem):
161                 aa = item
162         assert aa
163         assert map(float, aa.handles()[0].pos) == [0, 0], aa.handles()[0].pos
164         assert map(float, aa.handles()[1].pos) == [40, 40], aa.handles()[1].pos
165         d1 = d.canvas.select(lambda e: isinstance(e, items.ClassItem))[0]
166         assert d1
167         #print d1, d1.subject
168
169     def test_connection(self):
170         """
171         Test connection loading of an association and two classes.
172         (Should count for all line-like objects alike if this works).
173         """
174         c1 = self.create(items.ClassItem, UML.Class)
175         c2 = self.create(items.ClassItem, UML.Class)
176         c2.matrix.translate(200, 200)
177         self.diagram.canvas.update_matrix(c2)
178         assert tuple(self.diagram.canvas.get_matrix_i2c(c2)) == (1, 0, 0, 1, 200, 200)
179
180         a = self.diagram.create(items.AssociationItem)
181
182         # Provide our element factory as Utility, since the connect adapters
183         # depend on it.
184         from gaphor.interfaces import IService
185         component.provideUtility(self.element_factory, IService, 'element_factory')
186
187         adapter = component.queryMultiAdapter((c1, a), IConnect)
188         assert adapter
189         h = a.head
190         adapter.connect(h)
191         head_pos = h.pos
192
193         adapter = component.queryMultiAdapter((c2, a), IConnect)
194         assert adapter
195         h = a.tail
196         adapter.connect(h)
197         tail_pos = h.pos
198
199         self.diagram.canvas.update_now()
200
201         assert a.head.y == 0, a.head.pos
202         assert a.tail.x == 10, a.tail.pos
203         #assert a.tail.y == 200, a.tail.pos
204         assert a.subject
205
206         fd = StringIO()
207         storage.save(XMLWriter(fd), factory=self.element_factory)
208         data = fd.getvalue()
209         fd.close()
210
211         old_a_subject_id = a.subject.id
212
213         self.element_factory.flush()
214         assert not list(self.element_factory.select())
215         fd = StringIO(data)
216         storage.load(fd, factory=self.element_factory)
217         fd.close()
218
219         assert len(self.element_factory.lselect(lambda e: e.isKindOf(UML.Diagram))) == 1
220         d = self.element_factory.lselect(lambda e: e.isKindOf(UML.Diagram))[0]
221         a = d.canvas.select(lambda e: isinstance(e, items.AssociationItem))[0]
222         assert a.subject
223         assert old_a_subject_id == a.subject.id
224         assert a.head.connected_to
225         assert a.tail.connected_to
226         assert not a.head.connected_to is a.tail.connected_to
227         #assert a.head_end._name
228
229
230 # vim:sw=4:et:ai
Note: See TracBrowser for help on using the browser.