1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
from __future__ import unicode_literals, print_function, absolute_import, division, generators, nested_scopes
import logging
import unittest
from ply.lex import LexToken
from jsonpath_rw.lexer import JsonPathLexer, JsonPathLexerError
class TestLexer(unittest.TestCase):
def token(self, value, ty=None):
t = LexToken()
t.type = ty if ty != None else value
t.value = value
t.lineno = -1
t.lexpos = -1
return t
def assert_lex_equiv(self, s, stream2):
# NOTE: lexer fails to reset after call?
l = JsonPathLexer(debug=True)
stream1 = list(l.tokenize(s)) # Save the stream for debug output when a test fails
stream2 = list(stream2)
assert len(stream1) == len(stream2)
for token1, token2 in zip(stream1, stream2):
print(token1, token2)
assert token1.type == token2.type
assert token1.value == token2.value
@classmethod
def setup_class(cls):
logging.basicConfig()
def test_simple_inputs(self):
self.assert_lex_equiv('$', [self.token('$', '$')])
self.assert_lex_equiv('"hello"', [self.token('hello', 'ID')])
self.assert_lex_equiv("'goodbye'", [self.token('goodbye', 'ID')])
self.assert_lex_equiv("'doublequote\"'", [self.token('doublequote"', 'ID')])
self.assert_lex_equiv(r'"doublequote\""', [self.token('doublequote"', 'ID')])
self.assert_lex_equiv(r"'singlequote\''", [self.token("singlequote'", 'ID')])
self.assert_lex_equiv('"singlequote\'"', [self.token("singlequote'", 'ID')])
self.assert_lex_equiv('fuzz', [self.token('fuzz', 'ID')])
self.assert_lex_equiv('1', [self.token(1, 'NUMBER')])
self.assert_lex_equiv('45', [self.token(45, 'NUMBER')])
self.assert_lex_equiv('-1', [self.token(-1, 'NUMBER')])
self.assert_lex_equiv(' -13 ', [self.token(-13, 'NUMBER')])
self.assert_lex_equiv('"fuzz.bang"', [self.token('fuzz.bang', 'ID')])
self.assert_lex_equiv('fuzz.bang', [self.token('fuzz', 'ID'), self.token('.', '.'), self.token('bang', 'ID')])
self.assert_lex_equiv('fuzz.*', [self.token('fuzz', 'ID'), self.token('.', '.'), self.token('*', '*')])
self.assert_lex_equiv('fuzz..bang', [self.token('fuzz', 'ID'), self.token('..', 'DOUBLEDOT'), self.token('bang', 'ID')])
self.assert_lex_equiv('&', [self.token('&', '&')])
self.assert_lex_equiv('@', [self.token('@', 'ID')])
self.assert_lex_equiv('`this`', [self.token('this', 'NAMED_OPERATOR')])
self.assert_lex_equiv('|', [self.token('|', '|')])
self.assert_lex_equiv('where', [self.token('where', 'WHERE')])
def test_basic_errors(self):
def tokenize(s):
l = JsonPathLexer(debug=True)
return list(l.tokenize(s))
self.assertRaises(JsonPathLexerError, tokenize, "'\"")
self.assertRaises(JsonPathLexerError, tokenize, '"\'')
self.assertRaises(JsonPathLexerError, tokenize, '`"')
self.assertRaises(JsonPathLexerError, tokenize, "`'")
self.assertRaises(JsonPathLexerError, tokenize, '"`')
self.assertRaises(JsonPathLexerError, tokenize, "'`")
self.assertRaises(JsonPathLexerError, tokenize, '?')
self.assertRaises(JsonPathLexerError, tokenize, '$.foo.bar.#')
|