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.

173 lines
4.6 KiB

  1. from __future__ import absolute_import
  2. import unittest
  3. from unittest import TestCase
  4. import copy
  5. import pickle
  6. from lark.tree import Tree
  7. from lark.visitors import Transformer, Interpreter, visit_children_decor, v_args, Discard
  8. class TestTrees(TestCase):
  9. def setUp(self):
  10. self.tree1 = Tree('a', [Tree(x, y) for x, y in zip('bcd', 'xyz')])
  11. def test_deepcopy(self):
  12. assert self.tree1 == copy.deepcopy(self.tree1)
  13. def test_pickle(self):
  14. s = copy.deepcopy(self.tree1)
  15. data = pickle.dumps(s)
  16. assert pickle.loads(data) == s
  17. def test_iter_subtrees(self):
  18. expected = [Tree('b', 'x'), Tree('c', 'y'), Tree('d', 'z'),
  19. Tree('a', [Tree('b', 'x'), Tree('c', 'y'), Tree('d', 'z')])]
  20. nodes = list(self.tree1.iter_subtrees())
  21. self.assertEqual(nodes, expected)
  22. def test_iter_subtrees_topdown(self):
  23. expected = [Tree('a', [Tree('b', 'x'), Tree('c', 'y'), Tree('d', 'z')]),
  24. Tree('b', 'x'), Tree('c', 'y'), Tree('d', 'z')]
  25. nodes = list(self.tree1.iter_subtrees_topdown())
  26. self.assertEqual(nodes, expected)
  27. def test_interp(self):
  28. t = Tree('a', [Tree('b', []), Tree('c', []), 'd'])
  29. class Interp1(Interpreter):
  30. def a(self, tree):
  31. return self.visit_children(tree) + ['e']
  32. def b(self, tree):
  33. return 'B'
  34. def c(self, tree):
  35. return 'C'
  36. self.assertEqual(Interp1().visit(t), list('BCde'))
  37. class Interp2(Interpreter):
  38. @visit_children_decor
  39. def a(self, values):
  40. return values + ['e']
  41. def b(self, tree):
  42. return 'B'
  43. def c(self, tree):
  44. return 'C'
  45. self.assertEqual(Interp2().visit(t), list('BCde'))
  46. class Interp3(Interpreter):
  47. def b(self, tree):
  48. return 'B'
  49. def c(self, tree):
  50. return 'C'
  51. self.assertEqual(Interp3().visit(t), list('BCd'))
  52. def test_transformer(self):
  53. t = Tree('add', [Tree('sub', [Tree('i', ['3']), Tree('f', ['1.1'])]), Tree('i', ['1'])])
  54. class T(Transformer):
  55. i = v_args(inline=True)(int)
  56. f = v_args(inline=True)(float)
  57. sub = lambda self, values: values[0] - values[1]
  58. def add(self, values):
  59. return sum(values)
  60. res = T().transform(t)
  61. self.assertEqual(res, 2.9)
  62. @v_args(inline=True)
  63. class T(Transformer):
  64. i = int
  65. f = float
  66. sub = lambda self, a, b: a-b
  67. def add(self, a, b):
  68. return a + b
  69. res = T().transform(t)
  70. self.assertEqual(res, 2.9)
  71. @v_args(inline=True)
  72. class T(Transformer):
  73. i = int
  74. f = float
  75. from operator import sub, add
  76. res = T().transform(t)
  77. self.assertEqual(res, 2.9)
  78. def test_vargs(self):
  79. @v_args()
  80. class MyTransformer(Transformer):
  81. @staticmethod
  82. def integer(args):
  83. return 1 # some code here
  84. @classmethod
  85. def integer2(cls, args):
  86. return 2 # some code here
  87. hello = staticmethod(lambda args: 'hello')
  88. x = MyTransformer().transform( Tree('integer', [2]))
  89. self.assertEqual(x, 1)
  90. x = MyTransformer().transform( Tree('integer2', [2]))
  91. self.assertEqual(x, 2)
  92. x = MyTransformer().transform( Tree('hello', [2]))
  93. self.assertEqual(x, 'hello')
  94. def test_vargs_override(self):
  95. t = Tree('add', [Tree('sub', [Tree('i', ['3']), Tree('f', ['1.1'])]), Tree('i', ['1'])])
  96. @v_args(inline=True)
  97. class T(Transformer):
  98. i = int
  99. f = float
  100. sub = lambda self, a, b: a-b
  101. not_a_method = {'other': 'stuff'}
  102. @v_args(inline=False)
  103. def add(self, values):
  104. return sum(values)
  105. res = T().transform(t)
  106. self.assertEqual(res, 2.9)
  107. def test_discard(self):
  108. class MyTransformer(Transformer):
  109. def a(self, args):
  110. return 1 # some code here
  111. def b(cls, args):
  112. raise Discard()
  113. t = Tree('root', [
  114. Tree('b', []),
  115. Tree('a', []),
  116. Tree('b', []),
  117. Tree('c', []),
  118. Tree('b', []),
  119. ])
  120. t2 = Tree('root', [1, Tree('c', [])])
  121. x = MyTransformer().transform( t )
  122. self.assertEqual(x, t2)
  123. if __name__ == '__main__':
  124. unittest.main()