File: test_lexer.py

package info (click to toggle)
python-jsonpath-rw 1.4.0-7
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 180 kB
  • sloc: python: 898; makefile: 21; sh: 10
file content (69 lines) | stat: -rw-r--r-- 3,337 bytes parent folder | download | duplicates (5)
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.#')