#!/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

from pw_tokenizer.encode import encode_token_and_args
import varint_test_data


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()
