This repo contains code to mirror other repos. It also contains the code that is getting mirrored.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

236 regels
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()