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.

124 lines
3.0 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
  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_interp(self):
  18. t = Tree('a', [Tree('b', []), Tree('c', []), 'd'])
  19. class Interp1(Interpreter):
  20. def a(self, tree):
  21. return self.visit_children(tree) + ['e']
  22. def b(self, tree):
  23. return 'B'
  24. def c(self, tree):
  25. return 'C'
  26. self.assertEqual(Interp1().visit(t), list('BCde'))
  27. class Interp2(Interpreter):
  28. @visit_children_decor
  29. def a(self, values):
  30. return values + ['e']
  31. def b(self, tree):
  32. return 'B'
  33. def c(self, tree):
  34. return 'C'
  35. self.assertEqual(Interp2().visit(t), list('BCde'))
  36. class Interp3(Interpreter):
  37. def b(self, tree):
  38. return 'B'
  39. def c(self, tree):
  40. return 'C'
  41. self.assertEqual(Interp3().visit(t), list('BCd'))
  42. def test_transformer(self):
  43. t = Tree('add', [Tree('sub', [Tree('i', ['3']), Tree('f', ['1.1'])]), Tree('i', ['1'])])
  44. class T(Transformer):
  45. i = v_args(inline=True)(int)
  46. f = v_args(inline=True)(float)
  47. sub = lambda self, values: values[0] - values[1]
  48. def add(self, values):
  49. return sum(values)
  50. res = T().transform(t)
  51. self.assertEqual(res, 2.9)
  52. @v_args(inline=True)
  53. class T(Transformer):
  54. i = int
  55. f = float
  56. sub = lambda self, a, b: a-b
  57. def add(self, a, b):
  58. return a + b
  59. res = T().transform(t)
  60. self.assertEqual(res, 2.9)
  61. @v_args(inline=True)
  62. class T(Transformer):
  63. i = int
  64. f = float
  65. from operator import sub, add
  66. res = T().transform(t)
  67. self.assertEqual(res, 2.9)
  68. def test_vargs(self):
  69. @v_args()
  70. class MyTransformer(Transformer):
  71. @staticmethod
  72. def integer(args):
  73. return 1 # some code here
  74. @classmethod
  75. def integer2(cls, args):
  76. return 2 # some code here
  77. hello = staticmethod(lambda args: 'hello')
  78. x = MyTransformer().transform( Tree('integer', [2]))
  79. self.assertEqual(x, 1)
  80. x = MyTransformer().transform( Tree('integer2', [2]))
  81. self.assertEqual(x, 2)
  82. x = MyTransformer().transform( Tree('hello', [2]))
  83. self.assertEqual(x, 'hello')
  84. if __name__ == '__main__':
  85. unittest.main()