# Copyright 2022 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 for the file_prefix_map utility"""

from io import StringIO
import json
import unittest

from pw_build import file_prefix_map

# pylint: disable=line-too-long
JSON_SOURCE_FILES = json.dumps([
    "../pigweed/pw_polyfill/standard_library_public/pw_polyfill/standard_library/assert.h",
    "protocol_buffer/gen/pigweed/pw_protobuf/common_protos.proto_library/nanopb/pw_protobuf_protos/status.pb.h",
    "../pigweed/pw_rpc/client_server.cc",
    "../pigweed/pw_rpc/public/pw_rpc/client_server.h",
    "/home/user/pigweed/out/../gen/generated_build_info.cc",
    "/home/user/pigweed/pw_protobuf/encoder.cc",
])

JSON_PATH_TRANSFORMATIONS = json.dumps([
    "/home/user/pigweed/out=out",
    "/home/user/pigweed/=",
    "../=",
    "/home/user/pigweed/out=out",
])

EXPECTED_TRANSFORMED_PATHS = json.dumps([
    "pigweed/pw_polyfill/standard_library_public/pw_polyfill/standard_library/assert.h",
    "protocol_buffer/gen/pigweed/pw_protobuf/common_protos.proto_library/nanopb/pw_protobuf_protos/status.pb.h",
    "pigweed/pw_rpc/client_server.cc",
    "pigweed/pw_rpc/public/pw_rpc/client_server.h",
    "out/../gen/generated_build_info.cc",
    "pw_protobuf/encoder.cc",
])


class FilePrefixMapTest(unittest.TestCase):
    def test_prefix_remap(self):
        path_list = [
            '/foo_root/root_subdir/source.cc',
            '/foo_root/root_subdir/out/../gen.cc'
        ]
        prefix_maps = [('/foo_root/root_subdir/', ''), ('out/../', 'out/')]
        expected_paths = ['source.cc', 'out/gen.cc']
        self.assertEqual(
            list(file_prefix_map.remap_paths(path_list, prefix_maps)),
            expected_paths)

    def test_json_prefix_map(self):
        in_fd = StringIO(JSON_SOURCE_FILES)
        prefix_map_fd = StringIO(JSON_PATH_TRANSFORMATIONS)
        out_fd = StringIO()
        file_prefix_map.remap_json_paths(in_fd, out_fd, prefix_map_fd)
        self.assertEqual(json.loads(out_fd.getvalue()),
                         json.loads(EXPECTED_TRANSFORMED_PATHS))


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