# Copyright 2021 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.
"""Unit tests for generate_cc_blob_library.py"""

from pathlib import Path
import tempfile
import unittest

from pw_build import generate_cc_blob_library

COMMENT = """\
// This file was generated by generate_cc_blob_library.py.
//
// DO NOT EDIT!
//
// This file contains declarations for byte arrays created from files during the
// build. The byte arrays are constant initialized and are safe to access at any
// time, including before main().
//
// See https://pigweed.dev/pw_build/#pw-cc-blob-library for details.
"""

COMMON_HEADER_START = COMMENT + """\
#pragma once

#include <array>
#include <cstddef>
"""

COMMON_SOURCE_START = COMMENT + """\

#include "path/to/header.h"

#include <array>
#include <cstddef>

#include "pw_preprocessor/compiler.h"
"""

FOO_BLOB = """\
constexpr std::array<std::byte, 2> fooBlob = {
    std::byte{0x01}, std::byte{0x02},
};
"""

BAR_BLOB = """\
constexpr std::array<std::byte, 10> barBlob = {
    std::byte{0x01}, std::byte{0x02}, std::byte{0x03}, std::byte{0x04},
    std::byte{0x05}, std::byte{0x06}, std::byte{0x07}, std::byte{0x08},
    std::byte{0x09}, std::byte{0x0A},
};
"""


class TestSplitIntoChunks(unittest.TestCase):
    """Unit tests for the split_into_chunks() function."""
    def test_perfect_split(self):
        """Tests basic splitting where the iterable divides perfectly."""
        data = (1, 7, 0, 1)
        self.assertEqual(
            ((1, 7), (0, 1)),
            tuple(generate_cc_blob_library.split_into_chunks(data, 2)))

    def test_split_with_remainder(self):
        """Tests basic splitting where there is a remainder."""
        data = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
        self.assertEqual(
            ((1, 2, 3), (4, 5, 6), (7, 8, 9), (10, )),
            tuple(generate_cc_blob_library.split_into_chunks(data, 3)))


class TestHeaderFromBlobs(unittest.TestCase):
    """Unit tests for the header_from_blobs() function."""
    def test_single_blob_header(self):
        """Tests the generation of a header for a single blob."""
        foo_blob = Path(tempfile.NamedTemporaryFile().name)
        foo_blob.write_bytes(bytes((1, 2, 3, 4, 5, 6)))
        blobs = [generate_cc_blob_library.Blob('fooBlob', foo_blob, None)]

        header = generate_cc_blob_library.header_from_blobs(blobs)
        expected_header = (
            f'{COMMON_HEADER_START}'
            '\n\n'  # No namespace, so two blank lines
            'extern const std::array<std::byte, 6> fooBlob;\n')
        self.assertEqual(expected_header, header)

    def test_multi_blob_header(self):
        """Tests the generation of a header for multiple blobs."""
        foo_blob = Path(tempfile.NamedTemporaryFile().name)
        foo_blob.write_bytes(bytes((1, 2, 3, 4, 5, 6)))
        bar_blob = Path(tempfile.NamedTemporaryFile().name)
        bar_blob.write_bytes(bytes((10, 9, 8, 7, 6)))
        blobs = [
            generate_cc_blob_library.Blob('fooBlob', foo_blob, None),
            generate_cc_blob_library.Blob('barBlob', bar_blob, None),
        ]

        header = generate_cc_blob_library.header_from_blobs(blobs)
        expected_header = (f'{COMMON_HEADER_START}\n'
                           '\n'
                           'extern const std::array<std::byte, 6> fooBlob;\n'
                           '\n'
                           'extern const std::array<std::byte, 5> barBlob;\n')

        self.assertEqual(expected_header, header)

    def test_header_with_namespace(self):
        """Tests the header generation of namespace definitions."""
        foo_blob = Path(tempfile.NamedTemporaryFile().name)
        foo_blob.write_bytes(bytes((1, 2, 3, 4, 5, 6)))
        blobs = [generate_cc_blob_library.Blob('fooBlob', foo_blob, None)]

        header = generate_cc_blob_library.header_from_blobs(blobs, 'pw::foo')
        expected_header = (f'{COMMON_HEADER_START}'
                           '\n'
                           'namespace pw::foo {\n'
                           '\n'
                           'extern const std::array<std::byte, 6> fooBlob;\n'
                           '\n'
                           '}  // namespace pw::foo\n')

        self.assertEqual(expected_header, header)


class TestArrayDefFromBlobData(unittest.TestCase):
    """Unit tests for the array_def_from_blob_data() function."""
    def test_single_line(self):
        """Tests the generation of array definitions with one line of data."""
        foo_data = bytes((1, 2))

        foo_definition = generate_cc_blob_library.array_def_from_blob_data(
            generate_cc_blob_library.Blob('fooBlob', Path(), None), foo_data)
        self.assertEqual(f'\n{FOO_BLOB}', foo_definition)

    def test_multi_line(self):
        """Tests the generation of multi-line array definitions."""
        bar_data = bytes((1, 2, 3, 4, 5, 6, 7, 8, 9, 10))

        bar_definition = generate_cc_blob_library.array_def_from_blob_data(
            generate_cc_blob_library.Blob('barBlob', Path(), None), bar_data)
        self.assertEqual(f'\n{BAR_BLOB}', bar_definition)


class TestSourceFromBlobs(unittest.TestCase):
    """Unit tests for the source_from_blobs() function."""
    def test_source_with_mixed_blobs(self):
        """Tests generation of a source file with single- and multi-liners."""
        foo_blob = Path(tempfile.NamedTemporaryFile().name)
        foo_blob.write_bytes(bytes((1, 2)))
        bar_blob = Path(tempfile.NamedTemporaryFile().name)
        bar_blob.write_bytes(bytes((1, 2, 3, 4, 5, 6, 7, 8, 9, 10)))
        blobs = [
            generate_cc_blob_library.Blob('fooBlob', foo_blob, None),
            generate_cc_blob_library.Blob('barBlob', bar_blob, None),
        ]

        source = generate_cc_blob_library.source_from_blobs(
            blobs, 'path/to/header.h')
        expected_source = (f'{COMMON_SOURCE_START}'
                           '\n'
                           '\n'
                           f'{FOO_BLOB}'
                           '\n'
                           f'{BAR_BLOB}')

        self.assertEqual(expected_source, source)

    def test_source_with_namespace(self):
        """Tests the source generation of namespace definitions."""
        foo_blob = Path(tempfile.NamedTemporaryFile().name)
        foo_blob.write_bytes(bytes((1, 2)))
        blobs = [generate_cc_blob_library.Blob('fooBlob', foo_blob, None)]

        source = generate_cc_blob_library.source_from_blobs(
            blobs, 'path/to/header.h', 'pw::foo')
        expected_source = (f'{COMMON_SOURCE_START}'
                           '\n'
                           'namespace pw::foo {\n'
                           '\n'
                           f'{FOO_BLOB}'
                           '\n'
                           '}  // namespace pw::foo\n')

        self.assertEqual(expected_source, source)

    def test_source_with_linker_sections(self):
        """Tests generation of a source file with defined linker sections."""
        foo_blob = Path(tempfile.NamedTemporaryFile().name)
        foo_blob.write_bytes(bytes((1, 2)))
        bar_blob = Path(tempfile.NamedTemporaryFile().name)
        bar_blob.write_bytes(bytes((1, 2, 3, 4, 5, 6, 7, 8, 9, 10)))
        blobs = [
            generate_cc_blob_library.Blob('fooBlob', foo_blob, '.foo_section'),
            generate_cc_blob_library.Blob('barBlob', bar_blob, '.bar_section'),
        ]

        source = generate_cc_blob_library.source_from_blobs(
            blobs, 'path/to/header.h')
        expected_source = (f'{COMMON_SOURCE_START}'
                           '\n'
                           '\n'
                           'PW_PLACE_IN_SECTION(".foo_section")\n'
                           f'{FOO_BLOB}'
                           '\n'
                           'PW_PLACE_IN_SECTION(".bar_section")\n'
                           f'{BAR_BLOB}')

        self.assertEqual(expected_source, source)

    def test_source_with_alignas(self):
        """Tests generation of a source file with alignas specified."""
        foo_blob = Path(tempfile.NamedTemporaryFile().name)
        foo_blob.write_bytes(bytes((1, 2)))
        bar_blob = Path(tempfile.NamedTemporaryFile().name)
        bar_blob.write_bytes(bytes((1, 2, 3, 4, 5, 6, 7, 8, 9, 10)))
        blobs = [
            generate_cc_blob_library.Blob('fooBlob', foo_blob, None, '64'),
            generate_cc_blob_library.Blob('barBlob', bar_blob, '.abc', 'int'),
        ]

        source = generate_cc_blob_library.source_from_blobs(
            blobs, 'path/to/header.h')
        expected_source = (f'{COMMON_SOURCE_START}'
                           '\n'
                           '\n'
                           f'alignas(64) {FOO_BLOB}'
                           '\n'
                           'PW_PLACE_IN_SECTION(".abc")\n'
                           f'alignas(int) {BAR_BLOB}')

        self.assertEqual(expected_source, source)


if __name__ == '__main__':
    unittest.main()
