This repo contains code to mirror other repos. It also contains the code that is getting mirrored.
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

236 Zeilen
6.6 KiB

  1. from __future__ import absolute_import
  2. import unittest
  3. from unittest import TestCase
  4. import copy
  5. import pickle
  6. import functools
  7. from lark.tree import Tree
  8. from lark.visitors import Visitor, Visitor_Recursive, Transformer, Interpreter, visit_children_decor, v_args, Discard
  9. class TestTrees(TestCase):
  10. def setUp(self):
  11. self.tree1 = Tree('a', [Tree(x, y) for x, y in zip('bcd', 'xyz')])
  12. def test_deepcopy(self):
  13. assert self.tree1 == copy.deepcopy(self.tree1)
  14. def test_pickle(self):
  15. s = copy.deepcopy(self.tree1)
  16. data = pickle.dumps(s)
  17. assert pickle.loads(data) == s
  18. def test_iter_subtrees(self):
  19. expected = [Tree('b', 'x'), Tree('c', 'y'), Tree('d', 'z'),
  20. Tree('a', [Tree('b', 'x'), Tree('c', 'y'), Tree('d', 'z')])]
  21. nodes = list(self.tree1.iter_subtrees())
  22. self.assertEqual(nodes, expected)
  23. def test_iter_subtrees_topdown(self):
  24. expected = [Tree('a', [Tree('b', 'x'), Tree('c', 'y'), Tree('d', 'z')]),
  25. Tree('b', 'x'), Tree('c', 'y'), Tree('d', 'z')]
  26. nodes = list(self.tree1.iter_subtrees_topdown())
  27. self.assertEqual(nodes, expected)
  28. def test_visitor(self):
  29. class Visitor1(Visitor):
  30. def __init__(self):
  31. self.nodes=[]
  32. def __default__(self,tree):
  33. self.nodes.append(tree)
  34. class Visitor1_Recursive(Visitor_Recursive):
  35. def __init__(self):
  36. self.nodes=[]
  37. def __default__(self,tree):
  38. self.nodes.append(tree)
  39. visitor1=Visitor1()
  40. visitor1_recursive=Visitor1_Recursive()
  41. expected_top_down = [Tree('a', [Tree('b', 'x'), Tree('c', 'y'), Tree('d', 'z')]),
  42. Tree('b', 'x'), Tree('c', 'y'), Tree('d', 'z')]
  43. expected_botton_up= [Tree('b', 'x'), Tree('c', 'y'), Tree('d', 'z'),
  44. Tree('a', [Tree('b', 'x'), Tree('c', 'y'), Tree('d', 'z')])]
  45. visitor1.visit(self.tree1)
  46. self.assertEqual(visitor1.nodes,expected_botton_up)
  47. visitor1_recursive.visit(self.tree1)
  48. self.assertEqual(visitor1_recursive.nodes,expected_botton_up)
  49. visitor1.nodes=[]
  50. visitor1_recursive.nodes=[]
  51. visitor1.visit_topdown(self.tree1)
  52. self.assertEqual(visitor1.nodes,expected_top_down)
  53. visitor1_recursive.visit_topdown(self.tree1)
  54. self.assertEqual(visitor1_recursive.nodes,expected_top_down)
  55. def test_interp(self):
  56. t = Tree('a', [Tree('b', []), Tree('c', []), 'd'])
  57. class Interp1(Interpreter):
  58. def a(self, tree):
  59. return self.visit_children(tree) + ['e']
  60. def b(self, tree):
  61. return 'B'
  62. def c(self, tree):
  63. return 'C'
  64. self.assertEqual(Interp1().visit(t), list('BCde'))
  65. class Interp2(Interpreter):
  66. @visit_children_decor
  67. def a(self, values):
  68. return values + ['e']
  69. def b(self, tree):
  70. return 'B'
  71. def c(self, tree):
  72. return 'C'
  73. self.assertEqual(Interp2().visit(t), list('BCde'))
  74. class Interp3(Interpreter):
  75. def b(self, tree):
  76. return 'B'
  77. def c(self, tree):
  78. return 'C'
  79. self.assertEqual(Interp3().visit(t), list('BCd'))
  80. def test_transformer(self):
  81. t = Tree('add', [Tree('sub', [Tree('i', ['3']), Tree('f', ['1.1'])]), Tree('i', ['1'])])
  82. class T(Transformer):
  83. i = v_args(inline=True)(int)
  84. f = v_args(inline=True)(float)
  85. sub = lambda self, values: values[0] - values[1]
  86. def add(self, values):
  87. return sum(values)
  88. res = T().transform(t)
  89. self.assertEqual(res, 2.9)
  90. @v_args(inline=True)
  91. class T(Transformer):
  92. i = int
  93. f = float
  94. sub = lambda self, a, b: a-b
  95. def add(self, a, b):
  96. return a + b
  97. res = T().transform(t)
  98. self.assertEqual(res, 2.9)
  99. @v_args(inline=True)
  100. class T(Transformer):
  101. i = int
  102. f = float
  103. from operator import sub, add
  104. res = T().transform(t)
  105. self.assertEqual(res, 2.9)
  106. def test_vargs(self):
  107. @v_args()
  108. class MyTransformer(Transformer):
  109. @staticmethod
  110. def integer(args):
  111. return 1 # some code here
  112. @classmethod
  113. def integer2(cls, args):
  114. return 2 # some code here
  115. hello = staticmethod(lambda args: 'hello')
  116. x = MyTransformer().transform( Tree('integer', [2]))
  117. self.assertEqual(x, 1)
  118. x = MyTransformer().transform( Tree('integer2', [2]))
  119. self.assertEqual(x, 2)
  120. x = MyTransformer().transform( Tree('hello', [2]))
  121. self.assertEqual(x, 'hello')
  122. def test_inline_static(self):
  123. @v_args(inline=True)
  124. class T(Transformer):
  125. @staticmethod
  126. def test(a, b):
  127. return a + b
  128. x = T().transform(Tree('test', ['a', 'b']))
  129. self.assertEqual(x, 'ab')
  130. def test_vargs_override(self):
  131. t = Tree('add', [Tree('sub', [Tree('i', ['3']), Tree('f', ['1.1'])]), Tree('i', ['1'])])
  132. @v_args(inline=True)
  133. class T(Transformer):
  134. i = int
  135. f = float
  136. sub = lambda self, a, b: a-b
  137. not_a_method = {'other': 'stuff'}
  138. @v_args(inline=False)
  139. def add(self, values):
  140. return sum(values)
  141. res = T().transform(t)
  142. self.assertEqual(res, 2.9)
  143. def test_partial(self):
  144. tree = Tree("start", [Tree("a", ["test1"]), Tree("b", ["test2"])])
  145. def test(prefix, s, postfix):
  146. return prefix + s.upper() + postfix
  147. @v_args(inline=True)
  148. class T(Transformer):
  149. a = functools.partial(test, "@", postfix="!")
  150. b = functools.partial(lambda s: s + "!")
  151. res = T().transform(tree)
  152. assert res.children == ["@TEST1!", "test2!"]
  153. def test_discard(self):
  154. class MyTransformer(Transformer):
  155. def a(self, args):
  156. return 1 # some code here
  157. def b(cls, args):
  158. raise Discard()
  159. t = Tree('root', [
  160. Tree('b', []),
  161. Tree('a', []),
  162. Tree('b', []),
  163. Tree('c', []),
  164. Tree('b', []),
  165. ])
  166. t2 = Tree('root', [1, Tree('c', [])])
  167. x = MyTransformer().transform( t )
  168. self.assertEqual(x, t2)
  169. if __name__ == '__main__':
  170. unittest.main()