| 1 |
|
|---|
| 2 |
|
|---|
| 3 |
import unittest |
|---|
| 4 |
from weakref import ref as wref |
|---|
| 5 |
from sys import getrefcount |
|---|
| 6 |
from gaphor import UML |
|---|
| 7 |
from gaphor.diagram import items |
|---|
| 8 |
|
|---|
| 9 |
from gaphor.application import Application |
|---|
| 10 |
Application.shutdown() |
|---|
| 11 |
|
|---|
| 12 |
factory = UML.ElementFactory() |
|---|
| 13 |
factory.init(Application) |
|---|
| 14 |
|
|---|
| 15 |
|
|---|
| 16 |
class TestDiagramItems(unittest.TestCase): |
|---|
| 17 |
|
|---|
| 18 |
def gc_collect(self): |
|---|
| 19 |
import gc |
|---|
| 20 |
for x in range(6): gc.collect() |
|---|
| 21 |
|
|---|
| 22 |
def _testTemplate1(self, uml_class, item_class): |
|---|
| 23 |
m = factory.create(UML.Package) |
|---|
| 24 |
d = factory.create(UML.Diagram) |
|---|
| 25 |
d.package = m |
|---|
| 26 |
p1 = factory.create(uml_class) |
|---|
| 27 |
p1.package = m |
|---|
| 28 |
pi1 = d.create(item_class) |
|---|
| 29 |
pi1.subject = p1 |
|---|
| 30 |
w_m = wref(m) |
|---|
| 31 |
w_d = wref(d) |
|---|
| 32 |
w_p1 = wref(p1) |
|---|
| 33 |
w_pi1 = wref(pi1) |
|---|
| 34 |
del m, d, p1, pi1 |
|---|
| 35 |
factory.flush() |
|---|
| 36 |
self.gc_collect() |
|---|
| 37 |
self.assertEquals(w_m(), None) |
|---|
| 38 |
self.failUnless(w_d() is None) |
|---|
| 39 |
self.failUnless(w_p1() is None) |
|---|
| 40 |
self.failUnless(w_pi1() is None) |
|---|
| 41 |
|
|---|
| 42 |
def _testTemplate2(self, uml_class, item_class): |
|---|
| 43 |
m = factory.create(UML.Package) |
|---|
| 44 |
d = factory.create(UML.Diagram) |
|---|
| 45 |
d.package = m |
|---|
| 46 |
p1 = factory.create(uml_class) |
|---|
| 47 |
p1.package = m |
|---|
| 48 |
pi1 = d.create(item_class) |
|---|
| 49 |
pi1.subject = p1 |
|---|
| 50 |
rc_p1 = getrefcount(p1) |
|---|
| 51 |
rc_pi1 = getrefcount(pi1) |
|---|
| 52 |
p2 = factory.create(uml_class) |
|---|
| 53 |
p2.package = m |
|---|
| 54 |
pi2 = d.create(item_class) |
|---|
| 55 |
pi2.subject = p2 |
|---|
| 56 |
self.assertEquals(getrefcount(p1), rc_p1) |
|---|
| 57 |
self.assertEquals(getrefcount(pi1), rc_pi1) |
|---|
| 58 |
d.canvas.update_now() |
|---|
| 59 |
self.assertEquals(getrefcount(p1), rc_p1) |
|---|
| 60 |
self.assertEquals(getrefcount(pi1), rc_pi1) |
|---|
| 61 |
w_m = wref(m) |
|---|
| 62 |
w_d = wref(d) |
|---|
| 63 |
w_p1 = wref(p1) |
|---|
| 64 |
w_pi1 = wref(pi1) |
|---|
| 65 |
w_p2 = wref(p2) |
|---|
| 66 |
w_pi2 = wref(pi2) |
|---|
| 67 |
self.assertEquals(getrefcount(p1), rc_p1) |
|---|
| 68 |
self.assertEquals(getrefcount(pi1), rc_pi1) |
|---|
| 69 |
del m, d, p1, pi1, p2, pi2 |
|---|
| 70 |
self.assertEquals(getrefcount(w_p1()), rc_p1 - 1) |
|---|
| 71 |
self.assertEquals(getrefcount(w_pi1()), rc_pi1 - 1) |
|---|
| 72 |
factory.flush() |
|---|
| 73 |
self.gc_collect() |
|---|
| 74 |
self.failUnless(w_p1() is None, getrefcount(w_p1())) |
|---|
| 75 |
self.failUnless(w_pi1() is None, getrefcount(w_p1())) |
|---|
| 76 |
self.failUnless(w_p2() is None, getrefcount(w_p1())) |
|---|
| 77 |
self.failUnless(w_pi2() is None, getrefcount(w_p1())) |
|---|
| 78 |
self.failUnless(w_m() is None, getrefcount(w_p1())) |
|---|
| 79 |
self.failUnless(w_d() is None, getrefcount(w_p1())) |
|---|
| 80 |
|
|---|
| 81 |
def testPackage1(self): |
|---|
| 82 |
self._testTemplate1(UML.Package, items.PackageItem) |
|---|
| 83 |
|
|---|
| 84 |
def testPackage2(self): |
|---|
| 85 |
self._testTemplate2(UML.Package, items.PackageItem) |
|---|
| 86 |
|
|---|
| 87 |
def testClass1(self): |
|---|
| 88 |
self._testTemplate1(UML.Class, items.ClassItem) |
|---|
| 89 |
|
|---|
| 90 |
def testClass2(self): |
|---|
| 91 |
self._testTemplate2(UML.Class, items.ClassItem) |
|---|
| 92 |
|
|---|
| 93 |
def testDependency1(self): |
|---|
| 94 |
self._testTemplate1(UML.Dependency, items.DependencyItem) |
|---|
| 95 |
|
|---|
| 96 |
def testDependency2(self): |
|---|
| 97 |
self._testTemplate2(UML.Dependency, items.DependencyItem) |
|---|
| 98 |
|
|---|
| 99 |
def _testTemplate3(self, uml_class, item_class): |
|---|
| 100 |
import gtk |
|---|
| 101 |
import gaphor.ui as ui |
|---|
| 102 |
m = factory.create(UML.Package) |
|---|
| 103 |
d = factory.create(UML.Diagram) |
|---|
| 104 |
d.package = m |
|---|
| 105 |
p1 = factory.create(uml_class) |
|---|
| 106 |
p1.package = m |
|---|
| 107 |
pi1 = d.create(item_class) |
|---|
| 108 |
pi1.subject = p1 |
|---|
| 109 |
rc_p1 = getrefcount(p1) |
|---|
| 110 |
rc_pi1 = getrefcount(pi1) |
|---|
| 111 |
p2 = factory.create(uml_class) |
|---|
| 112 |
p2.package = m |
|---|
| 113 |
pi2 = d.create(item_class) |
|---|
| 114 |
pi2.subject = p2 |
|---|
| 115 |
self.assertEquals(getrefcount(p1), rc_p1) |
|---|
| 116 |
self.assertEquals(getrefcount(pi1), rc_pi1) |
|---|
| 117 |
d.canvas.update_now() |
|---|
| 118 |
win = gtk.Window() |
|---|
| 119 |
view = ui.DiagramView(d) |
|---|
| 120 |
win.add(view) |
|---|
| 121 |
win.show_all() |
|---|
| 122 |
win.destroy() |
|---|
| 123 |
self.assertEquals(getrefcount(p1), rc_p1) |
|---|
| 124 |
self.assertEquals(getrefcount(pi1), rc_pi1) |
|---|
| 125 |
w_m = wref(m) |
|---|
| 126 |
w_d = wref(d) |
|---|
| 127 |
w_p1 = wref(p1) |
|---|
| 128 |
w_pi1 = wref(pi1) |
|---|
| 129 |
w_p2 = wref(p2) |
|---|
| 130 |
w_pi2 = wref(pi2) |
|---|
| 131 |
self.assertEquals(getrefcount(p1), rc_p1) |
|---|
| 132 |
self.assertEquals(getrefcount(pi1), rc_pi1) |
|---|
| 133 |
del m, d, p1, pi1, p2, pi2 |
|---|
| 134 |
del win, view |
|---|
| 135 |
self.assertEquals(getrefcount(w_p1()), rc_p1 - 1) |
|---|
| 136 |
self.assertEquals(getrefcount(w_pi1()), rc_pi1 - 1) |
|---|
| 137 |
factory.flush() |
|---|
| 138 |
self.gc_collect() |
|---|
| 139 |
self.failUnless(w_p1() is None, getrefcount(w_p1())) |
|---|
| 140 |
self.failUnless(w_pi1() is None, getrefcount(w_p1())) |
|---|
| 141 |
self.failUnless(w_p2() is None, getrefcount(w_p1())) |
|---|
| 142 |
self.failUnless(w_pi2() is None, getrefcount(w_p1())) |
|---|
| 143 |
self.failUnless(w_m() is None, getrefcount(w_p1())) |
|---|
| 144 |
self.failUnless(w_d() is None, getrefcount(w_p1())) |
|---|
| 145 |
|
|---|
| 146 |
def testSubjectNotify(self): |
|---|
| 147 |
"""Test the working of the DiagramItem.on_subject_notify(). |
|---|
| 148 |
""" |
|---|
| 149 |
p1 = factory.create(UML.Package) |
|---|
| 150 |
p2 = factory.create(UML.Package) |
|---|
| 151 |
c = factory.create(UML.Class) |
|---|
| 152 |
d = factory.create(UML.Diagram) |
|---|
| 153 |
self.failUnless(getrefcount(c) == 3, getrefcount(c)) |
|---|
| 154 |
ci = d.create(items.ClassItem) |
|---|
| 155 |
|
|---|
| 156 |
|
|---|
| 157 |
|
|---|
| 158 |
ci.subject = c |
|---|
| 159 |
self.failUnless(len(c._observers['appliedStereotype']) == 1, |
|---|
| 160 |
c._observers['appliedStereotype']) |
|---|
| 161 |
self.failUnless(len(c._observers['isAbstract']) == 1, |
|---|
| 162 |
c._observers['isAbstract']) |
|---|
| 163 |
self.failUnless(len(c._observers['namespace']) == 2, |
|---|
| 164 |
c._observers['namespace']) |
|---|
| 165 |
self.failUnless(len(c._observers['ownedOperation']) == 1, |
|---|
| 166 |
c._observers['ownedOperation']) |
|---|
| 167 |
self.failUnless(len(c._observers['ownedAttribute']) == 1, |
|---|
| 168 |
c._observers['ownedAttribute']) |
|---|
| 169 |
|
|---|
| 170 |
|
|---|
| 171 |
|
|---|
| 172 |
c.package = p1 |
|---|
| 173 |
self.failUnless(len(c._observers['namespace']) == 2, |
|---|
| 174 |
c._observers['namespace']) |
|---|
| 175 |
self.failUnless(len(p1._observers.get('name', [])) == 1, |
|---|
| 176 |
p1._observers.get('name')) |
|---|
| 177 |
|
|---|
| 178 |
|
|---|
| 179 |
c.package = p2 |
|---|
| 180 |
self.failUnless(len(c._observers['namespace']) == 2, |
|---|
| 181 |
c._observers['namespace']) |
|---|
| 182 |
self.failUnless(len(p1._observers.get('name', [])) == 0, |
|---|
| 183 |
p1._observers.get('name')) |
|---|
| 184 |
self.failUnless(len(p2._observers.get('name', [])) == 1, |
|---|
| 185 |
p2._observers.get('name')) |
|---|
| 186 |
|
|---|
| 187 |
ci.subject = None |
|---|
| 188 |
|
|---|
| 189 |
self.failUnless(len(c._observers['namespace']) == 0, |
|---|
| 190 |
c._observers['namespace']) |
|---|
| 191 |
self.failUnless(len(p1._observers.get('name', [])) == 0, |
|---|
| 192 |
p1._observers.get('name')) |
|---|
| 193 |
self.failUnless(len(p2._observers.get('name', [])) == 0, |
|---|
| 194 |
p2._observers.get('name')) |
|---|
| 195 |
|
|---|
| 196 |
|
|---|
| 197 |
c.package = p2 |
|---|
| 198 |
ci.subject = c |
|---|
| 199 |
self.failUnless(len(c._observers['namespace']) == 2, |
|---|
| 200 |
c._observers['namespace']) |
|---|
| 201 |
self.failUnless(len(p1._observers.get('name', [])) == 0, |
|---|
| 202 |
p1._observers.get('name')) |
|---|
| 203 |
self.failUnless(len(p2._observers.get('name', [])) == 1, |
|---|
| 204 |
p2._observers.get('name')) |
|---|
| 205 |
|
|---|
| 206 |
if __name__ == '__main__': |
|---|
| 207 |
unittest.main() |
|---|
| 208 |
|
|---|