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