Browse Source

Tests for reconstructors

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.6.3
Julien Malard 6 years ago
parent
commit
92b50c39cd
1 changed files with 114 additions and 0 deletions
  1. +114
    -0
      tests/test_reconstructor.py

+ 114
- 0
tests/test_reconstructor.py View File

@@ -0,0 +1,114 @@
import json
import unittest
from unittest import TestCase
from lark import Lark
from lark.reconstruct import Reconstructor


common = """
%import common (WS_INLINE, NUMBER, WORD)
%ignore WS_INLINE
"""


class TestReconstructor(TestCase):

def reconstruct(self, grammar, code):
parser = Lark(grammar, parser='lalr')
tree = parser.parse(code)
new = Reconstructor(parser).reconstruct(tree)
self.assertEqual(code.replace(' ', ''), new.replace(' ', ''))

def test_starred_rule(self):

g = """
start: item*
item: NL
| rule
rule: WORD ":" NUMBER
NL: /(\\r?\\n)+\s*/
""" + common

code = """
Elephants: 12
"""

self.reconstruct(g, code)

def test_starred_group(self):

g = """
start: (rule | _NL)*
rule: WORD ":" NUMBER
_NL: /(\\r?\\n)+\s*/
""" + common

code = """
Elephants: 12
"""

self.reconstruct(g, code)

def test_alias(self):

g = """
start: line*
line: NL
| rule
| "hello" -> hi
rule: WORD ":" NUMBER
NL: /(\\r?\\n)+\s*/
""" + common

code = """
Elephants: 12
hello
"""

self.reconstruct(g, code)

def test_json_example(self):
test_json = '''
{
"empty_object" : {},
"empty_array" : [],
"booleans" : { "YES" : true, "NO" : false },
"numbers" : [ 0, 1, -2, 3.3, 4.4e5, 6.6e-7 ],
"strings" : [ "This", [ "And" , "That", "And a \\"b" ] ],
"nothing" : null
}
'''

json_grammar = r"""
?start: value

?value: object
| array
| string
| SIGNED_NUMBER -> number
| "true" -> true
| "false" -> false
| "null" -> null

array : "[" [value ("," value)*] "]"
object : "{" [pair ("," pair)*] "}"
pair : string ":" value

string : ESCAPED_STRING

%import common.ESCAPED_STRING
%import common.SIGNED_NUMBER
%import common.WS

%ignore WS
"""

json_parser = Lark(json_grammar, parser='lalr')
tree = json_parser.parse(test_json)

new_json = Reconstructor(json_parser).reconstruct(tree)
self.assertEqual(json.loads(new_json), json.loads(test_json))


if __name__ == '__main__':
unittest.main()

Loading…
Cancel
Save