PageRenderTime 40ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/MaKaC_tests/common_tests/testFossilize.py

https://github.com/flannery/indico-flannery
Python | 255 lines | 196 code | 59 blank | 0 comment | 1 complexity | dc59cf04a747514b392f6cab9c2c6434 MD5 | raw file
  1. from MaKaC.common.fossilize import IFossil, Fossilizable, fossilizes, fossilize, \
  2. NonFossilizableException, WrongFossilTypeException, addFossil,\
  3. InvalidFossilException
  4. import unittest
  5. class ISomeFossil(IFossil):
  6. pass
  7. class ISimpleFossil1Fossil(IFossil):
  8. def getB(self):
  9. pass
  10. def getC(self):
  11. pass
  12. getC.convert = lambda x: x.upper()
  13. class ISimpleFossil2Fossil(IFossil):
  14. def getA(self):
  15. pass
  16. def getC(self):
  17. pass
  18. getC.convert = lambda x: x.title()
  19. class IComplexFossil1Fossil(IFossil):
  20. def getSimpleInstance(self):
  21. pass
  22. getSimpleInstance.result = ISimpleFossil2Fossil
  23. class IComplexFossil2Fossil(IFossil):
  24. def getSimpleInstance(self):
  25. pass
  26. getSimpleInstance.result = ISimpleFossil2Fossil
  27. getSimpleInstance.convert = lambda x: sorted(x.values())
  28. getSimpleInstance.name = 'mySimpleInstance'
  29. class IDynamicFossil(IFossil):
  30. def getA(self):
  31. pass
  32. def getB(self):
  33. pass
  34. getB.convert = lambda x: x.upper()
  35. class IFossilWithProduceFossil(ISimpleFossil1Fossil):
  36. def getSum(self):
  37. pass
  38. getSum.produce = lambda self: self.a + self.b
  39. class IClassWithDifferentMethodNamesFossil(IFossil):
  40. def getAttributeOne(self):
  41. pass
  42. def hasAttributeTwo(self):
  43. pass
  44. def isAttributeThree(self):
  45. pass
  46. def weirdMethodName(self):
  47. pass
  48. weirdMethodName.name = 'weirdName'
  49. class IClassWithDifferentMethodNamesBadFossil(IClassWithDifferentMethodNamesFossil):
  50. def weirdMethodName(self):
  51. pass
  52. class IClassWithDifferentMethodNamesBad2Fossil(IClassWithDifferentMethodNamesFossil):
  53. def get_type(self):
  54. pass
  55. class SimpleClass(Fossilizable):
  56. fossilizes(ISimpleFossil1Fossil, ISimpleFossil2Fossil, IFossilWithProduceFossil)
  57. def __init__(self, a, b, c):
  58. self.a = a
  59. self.b = b
  60. self.c = c
  61. def getA(self):
  62. return self.a
  63. def getB(self):
  64. return self.b
  65. def getC(self):
  66. return self.c
  67. class DerivedClass(SimpleClass):
  68. pass
  69. class ComplexClass(Fossilizable):
  70. def __init__(self):
  71. self.simpleInstance = SimpleClass(1, 'foo', 'bar')
  72. fossilizes(IComplexFossil1Fossil, IComplexFossil2Fossil)
  73. def getSimpleInstance(self):
  74. return self.simpleInstance
  75. class ConversionClass(object):
  76. @classmethod
  77. def multiply(cls, number, factor):
  78. return number * factor
  79. def mysum(number, numberToBeAdded):
  80. return number + numberToBeAdded
  81. class IWithConversion2Fossil(IFossil):
  82. def getA(self):
  83. pass
  84. getA.convert = mysum
  85. class IWithConversionFossil(IFossil):
  86. def getA(self):
  87. pass
  88. getA.convert = ConversionClass.multiply
  89. def getList(self):
  90. pass
  91. getList.result = IWithConversion2Fossil
  92. class AnotherClass(Fossilizable):
  93. fossilizes(IWithConversionFossil)
  94. def __init__(self, a , listArg):
  95. self.a = a
  96. self.list = listArg
  97. def getA(self):
  98. return self.a
  99. def getList(self):
  100. return self.list
  101. class AnotherChildrenClass(Fossilizable):
  102. fossilizes(IWithConversion2Fossil)
  103. def __init__(self, a):
  104. self.a = a
  105. def getA(self):
  106. return self.a
  107. class ClassWithDifferentMethodNames(Fossilizable):
  108. fossilizes(IClassWithDifferentMethodNamesFossil, IClassWithDifferentMethodNamesBadFossil, IClassWithDifferentMethodNamesBad2Fossil)
  109. def __init__(self):
  110. pass
  111. def getAttributeOne(self):
  112. return 1
  113. def hasAttributeTwo(self):
  114. return 2
  115. def isAttributeThree(self):
  116. return 3
  117. def weirdMethodName(self):
  118. return 4
  119. def get_type(self):
  120. pass
  121. class TestFossilize(unittest.TestCase):
  122. def setUp(self):
  123. addFossil(SimpleClass, IDynamicFossil)
  124. self.s = SimpleClass(1, 'a', 'foo')
  125. self.c = ComplexClass()
  126. def testFossilizePrimitives(self):
  127. self.assertEquals(4, fossilize(4, ISomeFossil))
  128. self.assertEquals('foo', fossilize('foo', ISomeFossil))
  129. self.assertEquals(5.0, fossilize(5.0, ISomeFossil))
  130. self.assertEquals(None, fossilize(None, ISomeFossil))
  131. def testFossilizeStructuresOfPrimitives(self):
  132. self.assertEquals([], fossilize([], ISomeFossil))
  133. self.assertEquals([4, [4, 5, 6], [1]], fossilize([4, (4, 5, 6), set([1])], ISomeFossil))
  134. self.assertEquals({'a':'foo', 2:'bar'}, fossilize({'a':'foo', 2:'bar'}, ISomeFossil))
  135. self.assertEquals({'a':'foo', 2:'bar', 3:5.0}, fossilize({'a':'foo', 2:'bar', 3:5.0}, ISomeFossil))
  136. def testFossilizeNames(self):
  137. o1 = ClassWithDifferentMethodNames()
  138. self.assertEquals(o1.fossilize(IClassWithDifferentMethodNamesFossil), {'isAttributeThree': 3, 'attributeOne': 1, '_type': 'ClassWithDifferentMethodNames', 'weirdName': 4, 'hasAttributeTwo': 2, '_fossil': 'classWithDifferentMethodNames'})
  139. def testInvalidNames(self):
  140. o1 = ClassWithDifferentMethodNames()
  141. self.assertRaises(InvalidFossilException, fossilize, o1, IClassWithDifferentMethodNamesBadFossil)
  142. self.assertRaises(InvalidFossilException, fossilize, o1, IClassWithDifferentMethodNamesBad2Fossil)
  143. def testFossilizingNonFossilizable(self):
  144. self.assertRaises(NonFossilizableException, fossilize, 1+4j, ISomeFossil)
  145. def testFossilizingWrongType(self):
  146. self.assertRaises(WrongFossilTypeException, self.s.fossilize, ISomeFossil)
  147. def testFossilizingSimpleClass(self):
  148. self.assertEquals(self.s.fossilize(ISimpleFossil1Fossil),
  149. {'_type':'SimpleClass', '_fossil':'simpleFossil1', "b": "a", "c":"FOO"})
  150. self.assertEquals(self.s.fossilize(ISimpleFossil2Fossil),
  151. {'_type':'SimpleClass', '_fossil':'simpleFossil2', "a":1, "c":"Foo"})
  152. def testFossilizingComplexClass(self):
  153. self.assertEquals(self.c.fossilize(IComplexFossil1Fossil),
  154. {'_type':'ComplexClass', '_fossil':'complexFossil1', 'simpleInstance': {'_type':'SimpleClass', '_fossil':'simpleFossil2', 'a': 1, 'c':'Bar'}})
  155. def testFossilizingComplexClassWithConversion(self):
  156. self.assertEquals(self.c.fossilize(IComplexFossil2Fossil),
  157. {'_type':'ComplexClass', '_fossil':'complexFossil2', 'mySimpleInstance': [1, 'Bar', 'SimpleClass', 'simpleFossil2']})
  158. def testFossilizingWithInheritance(self):
  159. d = DerivedClass(2, 'b', 'bar')
  160. self.assertEquals(d.fossilize(ISimpleFossil1Fossil),
  161. {"_type": "DerivedClass", "_fossil": "simpleFossil1", "b": "b", "c":"BAR"})
  162. def testFossilizeList(self):
  163. d1 = SimpleClass(1, 'a', 'aaa')
  164. d2 = SimpleClass(2, 'b', 'bbb')
  165. l = [d1, d2]
  166. self.assertEquals(fossilize(l, ISimpleFossil1Fossil),
  167. [{'_type':'SimpleClass', '_fossil':'simpleFossil1', 'b': 'a', 'c': 'AAA'}, {'_type':'SimpleClass', '_fossil':'simpleFossil1', 'b': 'b', 'c': 'BBB'}] )
  168. def testFossilizingWithDynamicFossil(self):
  169. d = DerivedClass(2, 'bababa', 'bar')
  170. self.assertEquals(d.fossilize(ISimpleFossil1Fossil),
  171. {'_type':'DerivedClass', '_fossil':'simpleFossil1', "b": "bababa", "c":"BAR"})
  172. self.assertEquals(d.fossilize(IDynamicFossil),
  173. {'_type':'DerivedClass', '_fossil':'dynamic', "a": 2, "b":"BABABA"})
  174. def testFossilizingWithConversion(self):
  175. a1 = AnotherChildrenClass(10)
  176. a2 = AnotherChildrenClass(20)
  177. aFather = AnotherClass(1000, [a1, a2])
  178. self.assertEquals(aFather.fossilize(IWithConversionFossil, factor = 10, numberToBeAdded = 1),
  179. {'_type':'AnotherClass', '_fossil':'withConversion', 'a': 10000, 'list': [{'_type': 'AnotherChildrenClass', '_fossil': 'withConversion2', 'a': 11}, {'_type': 'AnotherChildrenClass', '_fossil': 'withConversion2', 'a': 21}]})
  180. def testFossilizeProduce(self):
  181. s1 = SimpleClass(10, 20, 'foo')
  182. self.assertEquals(s1.fossilize(IFossilWithProduceFossil),
  183. {'_type': 'SimpleClass', '_fossil': 'fossilWithProduce', 'sum': 30, 'b': 20, 'c': 'FOO'})
  184. def testFossilizeDefault(self):
  185. s1 = SimpleClass(10, 20, 'foo')
  186. d1 = DerivedClass(10, 50, 'bar')
  187. self.assertEquals(s1.fossilize(), {'_type':'SimpleClass', '_fossil':'simpleFossil1', "b": 20, "c":"FOO"})
  188. self.assertEquals(fossilize(d1), {'_type':'DerivedClass', '_fossil':'simpleFossil1', "b": 50, "c":"BAR"})
  189. self.assertEquals(fossilize([s1, d1]), [fossilize(s1), d1.fossilize()])
  190. def testFossilizeDict(self):
  191. s1 = SimpleClass(10, 20, 'foo')
  192. d1 = DerivedClass(10, 50, 'bar')
  193. self.assertEquals(fossilize([s1, d1], {"MaKaC_tests.common_tests.testFossilize.SimpleClass": ISimpleFossil2Fossil, "MaKaC_tests.common_tests.testFossilize.DerivedClass": ISimpleFossil1Fossil}),
  194. [s1.fossilize(ISimpleFossil2Fossil), d1.fossilize(ISimpleFossil1Fossil)])
  195. if __name__ == '__main__':
  196. unittest.main()