#!/usr/bin/env python
#
# Test the behavior of a UML tree with a Diagram as leaf. The whole tree
# should be freed...
#
# vim: sw=4

import sys
sys.path.insert(0, '..')
import gaphor.UML as UML
import gaphor.diagram as diagram
import weakref, gobject, gc
import unittest

factory = UML.ElementFactory()
diafactory = diagram.DiagramItemFactory()

class DiagramItemTestCase(unittest.TestCase):

    def testSimpleItem(self):
	item = diagram.ActorItem()
	self.failUnless (item.subject == None)
	w_item = weakref.ref(item)
	del item
	self.failUnless (w_item() != None, gc.get_referrers(w_item()))

    def testItem2(self):
	self.failUnlessEqual(len(factory._ElementFactory__signal._Signal__signals), 0)
	gen = factory.create(UML.Generalization)
	self.failUnlessEqual(len(factory._ElementFactory__signal._Signal__signals), 0)
	self.failUnlessEqual(len(gen.__dict__['__signal']._Signal__signals), 1)
	# gen, the element factory and getrefcount()
	self.failUnlessEqual(sys.getrefcount(gen), 3)
	factory.flush()
	self.failUnlessEqual(len(gen.__dict__['__signal']._Signal__signals), 1)
	w_gen = weakref.ref(gen)
	del gen
	self.failIf(w_gen(), 'Generalization not freed')

    def testItemOnLine(self):
	self.failUnlessEqual(len(factory._ElementFactory__signal._Signal__signals), 0)
	gen = factory.create(UML.Generalization)
	self.failUnlessEqual(len(factory._ElementFactory__signal._Signal__signals), 0)
	self.failUnlessEqual(len(gen.__dict__['__signal']._Signal__signals), 1)
	# gen, the element factory and getrefcount()
	self.failUnlessEqual(sys.getrefcount(gen), 3)

	dia = factory.create(UML.Diagram)
	self.failUnlessEqual(len(dia.__dict__['__signal']._Signal__signals), 1)
	self.failUnlessEqual(sys.getrefcount(dia), 3)

	item = diafactory.create(dia, diagram.GeneralizationItem)
	self.failUnlessEqual(len(gen.__dict__['__signal']._Signal__signals), 1)
	self.failUnlessEqual(len(factory._ElementFactory__signal._Signal__signals), 0)
	self.failUnlessEqual(sys.getrefcount(dia), 3)
	self.failUnlessEqual(item.__grefcount__, 2)

#	item.set_property('subject', gen)
	self.failUnlessEqual(sys.getrefcount(gen), 3)
	item.set_subject(gen)
	self.failUnlessEqual(sys.getrefcount(gen), 4)
	self.failUnlessEqual(len(gen.__dict__['__signal']._Signal__signals), 2)
	self.failUnlessEqual(sys.getrefcount(gen), 4)
	self.failUnlessEqual(sys.getrefcount(dia), 3)

	print 'flushing...'
	factory.flush()
#	self.failUnlessEqual(len(gen.__dict__['__signal']._Signal__signals), 3)
	print 'flush done'
	w_gen = weakref.ref(gen)
	print 'del gen'
	del gen
	print 'done'
	self.failIf(w_gen(), 'Generalization not freed')

    def no_testItemOnModel(self):
	model = factory.create(UML.Model)
	# One for model, one for the factory hash (and one extra ;-)
	self.failUnlessEqual (sys.getrefcount(model), 3)
	model.name = "MyModel"
	actor = factory.create(UML.Generalization)
	actor.namespace = model
	self.failUnlessEqual (len(model.ownedElement.list), 1)
	self.failUnlessEqual (sys.getrefcount(actor), 4)
	self.failUnless (model.ownedElement.list[0] is actor)
	self.failUnless (actor.namespace is model)
	dia = factory.create(UML.Diagram)
	dia.namespace = model
	self.failUnlessEqual (sys.getrefcount(dia), 4)
	item = diafactory.create(dia, diagram.ActorItem)
	self.failUnless(item.parent is dia.canvas.root)
	self.failUnless(item.subject is not None) # New actor has been created
	self.failUnlessEqual(item.__grefcount__, 4)
	self.failUnlessEqual(sys.getrefcount(item), 8)
	item.set_property('subject', actor);
	print 'refs:', gc.get_referrers (item)

if __name__ == '__main__':
    unittest.main()