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.

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