1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
# -*- coding: utf-8 -*-
import unittest
import jsonpickle
class Node(object):
def __init__(self, name):
self._name = name
self._children = []
self._parent = None
def add_child(self, child, index=-1):
if index == -1:
index = len(self._children)
self._children.insert(index, child)
child._parent = self
class Document(Node):
def __init__(self, name):
Node.__init__(self, name)
def __repr__(self):
return str(self)
def __str__(self):
ret_str = 'Document "%s"\n' % self._name
for c in self._children:
ret_str += repr(c)
return ret_str
class Question(Node):
def __init__(self, name):
Node.__init__(self, name)
def __str__(self):
return 'Question "%s", parent: "%s"\n' % (self._name, self._parent._name)
def __repr__(self):
return self.__str__()
class Section(Node):
def __init__(self, name):
Node.__init__(self, name)
def __str__(self):
ret_str = 'Section "%s", parent: "%s"\n' % (self._name, self._parent._name)
for c in self._children:
ret_str += repr(c)
return ret_str
def __repr__(self):
return self.__str__()
class DocumentTestCase(unittest.TestCase):
def test_cyclical(self):
"""Test that we can pickle cyclical data structure
This test is ensures that we can reference objects which
first appear within a list (in other words, not a top-level
object or attribute). Later children will reference that
object through its "_parent" field.
This makes sure that we handle this case correctly.
"""
document = Document('My Document')
section1 = Section('Section 1')
section2 = Section('Section 2')
question1 = Question('Question 1')
question2 = Question('Question 2')
question3 = Question('Question 3')
question4 = Question('Question 4')
document.add_child(section1)
document.add_child(section2)
section1.add_child(question1)
section1.add_child(question2)
section2.add_child(question3)
section2.add_child(question4)
pickled = jsonpickle.encode(document)
unpickled = jsonpickle.decode(pickled)
self.assertEqual(str(document), str(unpickled))
def suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(DocumentTestCase))
return suite
if __name__ == '__main__':
unittest.main(defaultTest='suite')
|