Esempio n. 1
0
    def test_dataobject(self):
        
        dobj = DataObject()

        dobj.set_attr('thing1','thing2')
        self.assertIsInstance(dobj.__dict__, dict)
        
        self.assertIsInstance(dobj.encode(),dict)
        
        self.assertEqual(dobj.get_attr('thing1'),'thing2')
        
        # test a simple dictionary
        d = dict()
        d['a']=1
        d['b']='b'
        d['c']=3.14159
        
        dobj.decode(d)
        
        self.assertEqual(dobj.get_attr('a'),1)
        self.assertEqual(dobj.get_attr('b'),'b')
        self.assertEqual(dobj.get_attr('c'),3.14159)
        
        dobj2=DataObject.from_encoding(d)
        
        self.assertEqual(dobj2.get_attr('a'),1)
        self.assertEqual(dobj2.get_attr('b'),'b')
        self.assertEqual(dobj2.get_attr('c'),3.14159)
        
        self.assertIdentical(dobj,dobj)

        # The Uniquie ID makes these two not equal
        self.assertNotEqual(dobj,dobj2)
        
        self.assertEqual(dobj2,DataObject.from_encoding(dobj2.encode()))
       
        self.assertRaises(AssertionError,dobj.set_attr, 6, 6) 
        
        # Put a list, tuple, dict, DataObject and set in a dictionary

        # List
        d = dict()
        l=[1,'f',3.4]
        d['a']=l
        
        dobj3=DataObject.from_encoding(d)
        
        self.assertIsInstance(dobj3.get_attr('a'),list)
        self.assertEqual(dobj3.get_attr('a'),l)
        
        # For now, Assuming Lists are protected Blobs!
        ## Can't put complex things in a list
        #lx = list(l)
        #lx.append({6:5})
        #dlx={'a':lx}
        #self.assertRaises(AssertionError,DataObject.from_encoding,dlx)
      
        
        # Tuple
        t=('t','u','p','l','e')
        dt={'b':t}
        
        self.assertRaises(AssertionError,DataObject.from_encoding,dt)
        #dobj3=DataObject.from_encoding(dt)
        ## Made Tuple an error!
        #self.assertIsInstance(dobj3.get_attr('b'),tuple)
        #self.assertEqual(dobj3.get_attr('b'),t)

        # Can't use tuple as Dict Key in DataObject
        dt={'b':t,(9,8):5}
        self.assertRaises(AssertionError,DataObject.from_encoding,dt)

        
        # Set
        s=set()
        for i in t:
            s.add(i)
        ds={'s':s}
        self.assertRaises(AssertionError,DataObject.from_encoding,ds)
        
        #self.assertIsInstance(dobj3.get_attr('c'),set)
        #self.assertEqual(dobj3.get_attr('c'),s)
        
        # Dictionary in a dictionary
        e=dict()
        f=dict()
        e['d']=d
        f['e']=e
        dobj3=DataObject.from_encoding(f)
        
        self.assertIsInstance(dobj3.get_attr('e'),DataObject)
        de=dobj3.get_attr('e')
        self.assertIsInstance(de.get_attr('d'),DataObject)
        dd=de.get_attr('d')
        self.assertEqual(dd.get_attr('a'),l)

        # Data Object
        a=DataObject.from_encoding(d)
        b=DataObject.from_encoding(d)
        c=DataObject.from_encoding(d)
        
        do=DataObject()
        do.set_attr('a',a)
        do.set_attr('b',b)
        do.set_attr('c',c)

        self.assertIsInstance(do.get_attr('a'),DataObject)
        self.assertEqual(do.get_attr('a'),a)
        print 'obja',a
        print 'objref',do.get_attr('a')

        blob = do.encode()   

        d0 = DataObject.from_encoding(blob)
        
        #print '===a',d0.get_attr('a').__dict__
        #print '===b',d0.get_attr('b').__dict__
        #print '===c',d0.get_attr('c').__dict__
        
        self.assertEqual(d0.get_attr('a'),a)

        # Recover the tuple
#        dt=d0.get_attr('a')
#        ti=dt.get_attr('b')
#        self.assertEqual(ti,t)
        
        # Recover the set
#        ds=d0.get_attr('a')
#        si=dt.get_attr('c')
#        self.assertEqual(si,s)
        
        self.assertEqual(do,d0)
        
        # Test Memory leak issue:
        # http://code.activestate.com/recipes/52308-the-simple-but-handy-collector-of-a-bunch-of-named/
        
        for i in range(10**2): # try 10**9 
            a = DataObject()