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.

128 lines
3.4 KiB

  1. from __future__ import absolute_import
  2. import sys
  3. from unittest import TestCase, main
  4. from lark import Lark, Tree, Transformer
  5. from lark.lexer import Lexer, Token
  6. import lark.lark as lark_module
  7. try:
  8. from StringIO import StringIO
  9. except ImportError:
  10. from io import BytesIO as StringIO
  11. import tempfile, os
  12. class TestT(Transformer):
  13. def add(self, children):
  14. return sum(children if isinstance(children, list) else children.children)
  15. def NUM(self, token):
  16. return int(token)
  17. class MockFile(StringIO):
  18. def close(self):
  19. pass
  20. def __enter__(self):
  21. return self
  22. def __exit__(self, *args):
  23. pass
  24. class MockFS:
  25. def __init__(self):
  26. self.files = {}
  27. def open(self, name, mode=None):
  28. if name not in self.files:
  29. f = self.files[name] = MockFile()
  30. else:
  31. f = self.files[name]
  32. f.seek(0)
  33. return f
  34. def exists(self, name):
  35. return name in self.files
  36. class CustomLexer(Lexer):
  37. def __init__(self, lexer_conf):
  38. pass
  39. def lex(self, data):
  40. for obj in data:
  41. yield Token('A', obj)
  42. class TestCache(TestCase):
  43. def setUp(self):
  44. pass
  45. def test_simple(self):
  46. g = '''start: "a"'''
  47. fn = "bla"
  48. fs = lark_module.FS
  49. mock_fs = MockFS()
  50. try:
  51. lark_module.FS = mock_fs
  52. Lark(g, parser='lalr', cache=fn)
  53. assert fn in mock_fs.files
  54. parser = Lark(g, parser='lalr', cache=fn)
  55. assert parser.parse('a') == Tree('start', [])
  56. mock_fs.files = {}
  57. assert len(mock_fs.files) == 0
  58. Lark(g, parser='lalr', cache=True)
  59. assert len(mock_fs.files) == 1
  60. parser = Lark(g, parser='lalr', cache=True)
  61. assert parser.parse('a') == Tree('start', [])
  62. parser = Lark(g+' "b"', parser='lalr', cache=True)
  63. assert len(mock_fs.files) == 2
  64. assert parser.parse('ab') == Tree('start', [])
  65. parser = Lark(g, parser='lalr', cache=True)
  66. assert parser.parse('a') == Tree('start', [])
  67. # Test with custom lexer
  68. mock_fs.files = {}
  69. parser = Lark(g, parser='lalr', lexer=CustomLexer, cache=True)
  70. parser = Lark(g, parser='lalr', lexer=CustomLexer, cache=True)
  71. assert len(mock_fs.files) == 1
  72. assert parser.parse('a') == Tree('start', [])
  73. # Test options persistence
  74. mock_fs.files = {}
  75. Lark(g, parser="lalr", debug=True, cache=True)
  76. parser = Lark(g, parser="lalr", debug=True, cache=True)
  77. assert parser.options.options['debug']
  78. # Test inline transformer (tree-less)
  79. mock_fs.files = {}
  80. g = """
  81. start: add+
  82. add: NUM "+" NUM
  83. NUM: /\d+/
  84. %ignore " "
  85. """
  86. text = "1+2 3+4"
  87. expected = Tree('start', [3, 7])
  88. parser = Lark(g, parser='lalr', transformer=TestT(), cache=True)
  89. parser = Lark(g, parser='lalr', transformer=TestT(), cache=True)
  90. assert len(mock_fs.files) == 1
  91. res1 = parser.parse(text)
  92. res2 = TestT().transform( Lark(g, parser="lalr", cache=True).parse(text) )
  93. assert res1 == res2
  94. finally:
  95. lark_module.FS = fs
  96. if __name__ == '__main__':
  97. main()