|
- from __future__ import absolute_import
-
- import unittest
- from unittest import TestCase
- import copy
- import pickle
-
- from lark.tree import Tree
- from lark.visitors import Transformer, Interpreter, visit_children_decor, v_args
-
-
- class TestTrees(TestCase):
- def setUp(self):
- self.tree1 = Tree('a', [Tree(x, y) for x, y in zip('bcd', 'xyz')])
-
- def test_deepcopy(self):
- assert self.tree1 == copy.deepcopy(self.tree1)
-
- def test_pickle(self):
- s = copy.deepcopy(self.tree1)
- data = pickle.dumps(s)
- assert pickle.loads(data) == s
-
-
- def test_interp(self):
- t = Tree('a', [Tree('b', []), Tree('c', []), 'd'])
-
- class Interp1(Interpreter):
- def a(self, tree):
- return self.visit_children(tree) + ['e']
-
- def b(self, tree):
- return 'B'
-
- def c(self, tree):
- return 'C'
-
- self.assertEqual(Interp1().visit(t), list('BCde'))
-
- class Interp2(Interpreter):
- @visit_children_decor
- def a(self, values):
- return values + ['e']
-
- def b(self, tree):
- return 'B'
-
- def c(self, tree):
- return 'C'
-
- self.assertEqual(Interp2().visit(t), list('BCde'))
-
- class Interp3(Interpreter):
- def b(self, tree):
- return 'B'
-
- def c(self, tree):
- return 'C'
-
- self.assertEqual(Interp3().visit(t), list('BCd'))
-
- def test_transformer(self):
- t = Tree('add', [Tree('sub', [Tree('i', ['3']), Tree('f', ['1.1'])]), Tree('i', ['1'])])
-
- class T(Transformer):
- i = v_args(inline=True)(int)
- f = v_args(inline=True)(float)
-
- sub = lambda self, values: values[0] - values[1]
-
- def add(self, values):
- return sum(values)
-
- res = T().transform(t)
- self.assertEqual(res, 2.9)
-
- @v_args(inline=True)
- class T(Transformer):
- i = int
- f = float
- sub = lambda self, a, b: a-b
-
- def add(self, a, b):
- return a + b
-
-
- res = T().transform(t)
- self.assertEqual(res, 2.9)
-
-
- @v_args(inline=True)
- class T(Transformer):
- i = int
- f = float
- from operator import sub, add
-
- res = T().transform(t)
- self.assertEqual(res, 2.9)
-
-
-
- if __name__ == '__main__':
- unittest.main()
|