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.

227 lines
6.3 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_vargs_override(self):
  123. t = Tree('add', [Tree('sub', [Tree('i', ['3']), Tree('f', ['1.1'])]), Tree('i', ['1'])])
  124. @v_args(inline=True)
  125. class T(Transformer):
  126. i = int
  127. f = float
  128. sub = lambda self, a, b: a-b
  129. not_a_method = {'other': 'stuff'}
  130. @v_args(inline=False)
  131. def add(self, values):
  132. return sum(values)
  133. res = T().transform(t)
  134. self.assertEqual(res, 2.9)
  135. def test_partial(self):
  136. tree = Tree("start", [Tree("a", ["test1"]), Tree("b", ["test2"])])
  137. def test(prefix, s, postfix):
  138. return prefix + s.upper() + postfix
  139. @v_args(inline=True)
  140. class T(Transformer):
  141. a = functools.partial(test, "@", postfix="!")
  142. b = functools.partial(lambda s: s + "!")
  143. res = T().transform(tree)
  144. assert res.children == ["@TEST1!", "test2!"]
  145. def test_discard(self):
  146. class MyTransformer(Transformer):
  147. def a(self, args):
  148. return 1 # some code here
  149. def b(cls, args):
  150. raise Discard()
  151. t = Tree('root', [
  152. Tree('b', []),
  153. Tree('a', []),
  154. Tree('b', []),
  155. Tree('c', []),
  156. Tree('b', []),
  157. ])
  158. t2 = Tree('root', [1, Tree('c', [])])
  159. x = MyTransformer().transform( t )
  160. self.assertEqual(x, t2)
  161. if __name__ == '__main__':
  162. unittest.main()