|  | #!/usr/bin/env python3 | 
|  | # Copyright 2020 The Pigweed Authors | 
|  | # | 
|  | # Licensed under the Apache License, Version 2.0 (the "License"); you may not | 
|  | # use this file except in compliance with the License. You may obtain a copy of | 
|  | # the License at | 
|  | # | 
|  | #     https://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, software | 
|  | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | 
|  | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | 
|  | # License for the specific language governing permissions and limitations under | 
|  | # the License. | 
|  | """Tests the tokenized string encoder module.""" | 
|  |  | 
|  | import unittest | 
|  |  | 
|  | import varint_test_data | 
|  |  | 
|  | from pw_tokenizer.encode import encode_token_and_args | 
|  |  | 
|  |  | 
|  | class TestEncodeTokenized(unittest.TestCase): | 
|  | """Tests encoding tokenized strings with various arguments.""" | 
|  | def test_no_args(self): | 
|  | self.assertEqual(b'\xab\xcd\x12\x34', | 
|  | encode_token_and_args(0x3412cdab)) | 
|  | self.assertEqual(b'\x00\x00\x00\x00', encode_token_and_args(0)) | 
|  |  | 
|  | def test_int(self): | 
|  | self.assertEqual(b'\xff\xff\xff\xff\0', | 
|  | encode_token_and_args(0xffffffff, 0)) | 
|  | self.assertEqual(b'\xff\xff\xff\xff\1', | 
|  | encode_token_and_args(0xffffffff, -1)) | 
|  | self.assertEqual(b'\xff\xff\xff\xff\2', | 
|  | encode_token_and_args(0xffffffff, 1)) | 
|  |  | 
|  | def test_float(self): | 
|  | self.assertEqual(b'\xff\xff\xff\xff\0\0\0\0', | 
|  | encode_token_and_args(0xffffffff, 0.0)) | 
|  | self.assertEqual(b'\xff\xff\xff\xff\0\0\0\x80', | 
|  | encode_token_and_args(0xffffffff, -0.0)) | 
|  |  | 
|  | def test_string(self): | 
|  | self.assertEqual(b'\xff\xff\xff\xff\5hello', | 
|  | encode_token_and_args(0xffffffff, 'hello')) | 
|  | self.assertEqual(b'\xff\xff\xff\xff\x7f' + b'!' * 127, | 
|  | encode_token_and_args(0xffffffff, '!' * 127)) | 
|  |  | 
|  | def test_string_too_long(self): | 
|  | self.assertEqual(b'\xff\xff\xff\xff\xff' + b'!' * 127, | 
|  | encode_token_and_args(0xffffffff, '!' * 128)) | 
|  |  | 
|  | def test_bytes(self): | 
|  | self.assertEqual(b'\xff\xff\xff\xff\4\0yo\0', | 
|  | encode_token_and_args(0xffffffff, '\0yo\0')) | 
|  |  | 
|  | def test_bytes_too_long(self): | 
|  | self.assertEqual(b'\xff\xff\xff\xff\xff' + b'?' * 127, | 
|  | encode_token_and_args(0xffffffff, b'?' * 200)) | 
|  |  | 
|  | def test_multiple_args(self): | 
|  | self.assertEqual(b'\xdd\xcc\xbb\xaa\0', | 
|  | encode_token_and_args(0xaabbccdd, 0)) | 
|  |  | 
|  |  | 
|  | class TestIntegerEncoding(unittest.TestCase): | 
|  | """Test encoding variable-length integers.""" | 
|  | def test_encode_generated_data(self): | 
|  | test_data = varint_test_data.TEST_DATA | 
|  | self.assertGreater(len(test_data), 100) | 
|  |  | 
|  | for _, signed, _, unsigned, encoded in test_data: | 
|  | # Skip numbers that are larger than 32-bits, since they aren't | 
|  | # supported currently. | 
|  | if int(unsigned).bit_length() > 32: | 
|  | continue | 
|  |  | 
|  | # Encode the value as an arg, but skip the 4 bytes for the token. | 
|  | self.assertEqual( | 
|  | encode_token_and_args(0, int(signed))[4:], encoded) | 
|  | self.assertEqual( | 
|  | encode_token_and_args(0, int(unsigned))[4:], encoded) | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | unittest.main() |