xref: /aosp_15_r20/external/pigweed/pw_tokenizer/py/encode_test.py (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*61c4878aSAndroid Build Coastguard Worker# Copyright 2020 The Pigweed Authors
3*61c4878aSAndroid Build Coastguard Worker#
4*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not
5*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of
6*61c4878aSAndroid Build Coastguard Worker# the License at
7*61c4878aSAndroid Build Coastguard Worker#
8*61c4878aSAndroid Build Coastguard Worker#     https://www.apache.org/licenses/LICENSE-2.0
9*61c4878aSAndroid Build Coastguard Worker#
10*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
11*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under
14*61c4878aSAndroid Build Coastguard Worker# the License.
15*61c4878aSAndroid Build Coastguard Worker"""Tests the tokenized string encoder module."""
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Workerimport unittest
18*61c4878aSAndroid Build Coastguard Worker
19*61c4878aSAndroid Build Coastguard Workerimport varint_test_data
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard Workerfrom pw_tokenizer.encode import encode_token_and_args
22*61c4878aSAndroid Build Coastguard Worker
23*61c4878aSAndroid Build Coastguard Worker
24*61c4878aSAndroid Build Coastguard Workerclass TestEncodeTokenized(unittest.TestCase):
25*61c4878aSAndroid Build Coastguard Worker    """Tests encoding tokenized strings with various arguments."""
26*61c4878aSAndroid Build Coastguard Worker
27*61c4878aSAndroid Build Coastguard Worker    def test_no_args(self):
28*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(b'\xab\xcd\x12\x34', encode_token_and_args(0x3412CDAB))
29*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(b'\x00\x00\x00\x00', encode_token_and_args(0))
30*61c4878aSAndroid Build Coastguard Worker
31*61c4878aSAndroid Build Coastguard Worker    def test_int(self):
32*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
33*61c4878aSAndroid Build Coastguard Worker            b'\xff\xff\xff\xff\0', encode_token_and_args(0xFFFFFFFF, 0)
34*61c4878aSAndroid Build Coastguard Worker        )
35*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
36*61c4878aSAndroid Build Coastguard Worker            b'\xff\xff\xff\xff\1', encode_token_and_args(0xFFFFFFFF, -1)
37*61c4878aSAndroid Build Coastguard Worker        )
38*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
39*61c4878aSAndroid Build Coastguard Worker            b'\xff\xff\xff\xff\2', encode_token_and_args(0xFFFFFFFF, 1)
40*61c4878aSAndroid Build Coastguard Worker        )
41*61c4878aSAndroid Build Coastguard Worker
42*61c4878aSAndroid Build Coastguard Worker    def test_float(self):
43*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
44*61c4878aSAndroid Build Coastguard Worker            b'\xff\xff\xff\xff\0\0\0\0', encode_token_and_args(0xFFFFFFFF, 0.0)
45*61c4878aSAndroid Build Coastguard Worker        )
46*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
47*61c4878aSAndroid Build Coastguard Worker            b'\xff\xff\xff\xff\0\0\0\x80',
48*61c4878aSAndroid Build Coastguard Worker            encode_token_and_args(0xFFFFFFFF, -0.0),
49*61c4878aSAndroid Build Coastguard Worker        )
50*61c4878aSAndroid Build Coastguard Worker
51*61c4878aSAndroid Build Coastguard Worker    def test_string(self):
52*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
53*61c4878aSAndroid Build Coastguard Worker            b'\xff\xff\xff\xff\5hello',
54*61c4878aSAndroid Build Coastguard Worker            encode_token_and_args(0xFFFFFFFF, 'hello'),
55*61c4878aSAndroid Build Coastguard Worker        )
56*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
57*61c4878aSAndroid Build Coastguard Worker            b'\xff\xff\xff\xff\x7f' + b'!' * 127,
58*61c4878aSAndroid Build Coastguard Worker            encode_token_and_args(0xFFFFFFFF, '!' * 127),
59*61c4878aSAndroid Build Coastguard Worker        )
60*61c4878aSAndroid Build Coastguard Worker
61*61c4878aSAndroid Build Coastguard Worker    def test_string_too_long(self):
62*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
63*61c4878aSAndroid Build Coastguard Worker            b'\xff\xff\xff\xff\xff' + b'!' * 127,
64*61c4878aSAndroid Build Coastguard Worker            encode_token_and_args(0xFFFFFFFF, '!' * 128),
65*61c4878aSAndroid Build Coastguard Worker        )
66*61c4878aSAndroid Build Coastguard Worker
67*61c4878aSAndroid Build Coastguard Worker    def test_bytes(self):
68*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
69*61c4878aSAndroid Build Coastguard Worker            b'\xff\xff\xff\xff\4\0yo\0',
70*61c4878aSAndroid Build Coastguard Worker            encode_token_and_args(0xFFFFFFFF, '\0yo\0'),
71*61c4878aSAndroid Build Coastguard Worker        )
72*61c4878aSAndroid Build Coastguard Worker
73*61c4878aSAndroid Build Coastguard Worker    def test_bytes_too_long(self):
74*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
75*61c4878aSAndroid Build Coastguard Worker            b'\xff\xff\xff\xff\xff' + b'?' * 127,
76*61c4878aSAndroid Build Coastguard Worker            encode_token_and_args(0xFFFFFFFF, b'?' * 200),
77*61c4878aSAndroid Build Coastguard Worker        )
78*61c4878aSAndroid Build Coastguard Worker
79*61c4878aSAndroid Build Coastguard Worker    def test_multiple_args(self):
80*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
81*61c4878aSAndroid Build Coastguard Worker            b'\xdd\xcc\xbb\xaa\0', encode_token_and_args(0xAABBCCDD, 0)
82*61c4878aSAndroid Build Coastguard Worker        )
83*61c4878aSAndroid Build Coastguard Worker
84*61c4878aSAndroid Build Coastguard Worker
85*61c4878aSAndroid Build Coastguard Workerclass TestIntegerEncoding(unittest.TestCase):
86*61c4878aSAndroid Build Coastguard Worker    """Test encoding variable-length integers."""
87*61c4878aSAndroid Build Coastguard Worker
88*61c4878aSAndroid Build Coastguard Worker    def test_encode_generated_data(self):
89*61c4878aSAndroid Build Coastguard Worker        test_data = varint_test_data.TEST_DATA
90*61c4878aSAndroid Build Coastguard Worker        self.assertGreater(len(test_data), 100)
91*61c4878aSAndroid Build Coastguard Worker
92*61c4878aSAndroid Build Coastguard Worker        for _, signed, _, unsigned, encoded in test_data:
93*61c4878aSAndroid Build Coastguard Worker            # Skip numbers that are larger than 32-bits, since they aren't
94*61c4878aSAndroid Build Coastguard Worker            # supported currently.
95*61c4878aSAndroid Build Coastguard Worker            if int(unsigned).bit_length() > 32:
96*61c4878aSAndroid Build Coastguard Worker                continue
97*61c4878aSAndroid Build Coastguard Worker
98*61c4878aSAndroid Build Coastguard Worker            # Encode the value as an arg, but skip the 4 bytes for the token.
99*61c4878aSAndroid Build Coastguard Worker            self.assertEqual(encode_token_and_args(0, int(signed))[4:], encoded)
100*61c4878aSAndroid Build Coastguard Worker            self.assertEqual(
101*61c4878aSAndroid Build Coastguard Worker                encode_token_and_args(0, int(unsigned))[4:], encoded
102*61c4878aSAndroid Build Coastguard Worker            )
103*61c4878aSAndroid Build Coastguard Worker
104*61c4878aSAndroid Build Coastguard Worker
105*61c4878aSAndroid Build Coastguard Workerif __name__ == '__main__':
106*61c4878aSAndroid Build Coastguard Worker    unittest.main()
107