#!/usr/bin/env python3
# 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 bloaty configuration tooling."""

import unittest
import os
import logging
import sys
from pw_bloat.label import from_bloaty_tsv, DataSourceMap, Label

LIST_LABELS = [
    Label(name='main()', size=30, parents=tuple(['FLASH', '.code'])),
    Label(name='foo()', size=100, parents=tuple(['RAM', '.heap'])),
    Label(name='bar()', size=220, parents=tuple(['RAM', '.heap']))
]

logger = logging.getLogger()
logger.level = logging.DEBUG
logger.addHandler(logging.StreamHandler(sys.stdout))


def get_test_map():
    pw_root = os.environ.get("PW ROOT")
    filename = f"{pw_root}/pigweed/pw_bloat/test_label.csv"
    with open(filename, 'r') as csvfile:
        ds_map = from_bloaty_tsv(csvfile)
        capacity_patterns = [("^__TEXT$", 459), ("^_", 920834)]
        for cap_pattern, cap_size in capacity_patterns:
            ds_map.add_capacity(cap_pattern, cap_size)
    return ds_map


class LabelStructTest(unittest.TestCase):
    """Testing class for the label structs."""
    def test_data_source_total_size(self):
        ds_map = DataSourceMap(['a', 'b', 'c'])
        self.assertEqual(ds_map.get_total_size(), 0)

    def test_data_source_single_insert_total_size(self):
        ds_map = DataSourceMap(['a', 'b', 'c'])
        ds_map.insert_label_hierachy(['FLASH', '.code', 'main()'], 30)
        self.assertEqual(ds_map.get_total_size(), 30)

    def test_data_source_multiple_insert_total_size(self):
        ds_map = DataSourceMap(['a', 'b', 'c'])
        ds_map.insert_label_hierachy(['FLASH', '.code', 'main()'], 30)
        ds_map.insert_label_hierachy(['RAM', '.code', 'foo()'], 100)
        self.assertEqual(ds_map.get_total_size(), 130)

    def test_parsing_generator_three_datasource_names(self):
        ds_map = DataSourceMap(['a', 'b', 'c'])
        for label in LIST_LABELS:
            ds_map.insert_label_hierachy(
                [label.parents[0], label.parents[1], label.name], label.size)
        list_labels_three = [*LIST_LABELS, Label(name='total', size=350)]
        for label_hiearchy in ds_map.labels():
            self.assertIn(label_hiearchy, list_labels_three)
        self.assertEqual(ds_map.get_total_size(), 350)

    def test_parsing_generator_two_datasource_names(self):
        ds_map = DataSourceMap(['a', 'b'])
        ds_label_list = [
            Label(name='main()', size=30, parents=tuple(['FLASH'])),
            Label(name='foo()', size=100, parents=tuple(['RAM'])),
            Label(name='bar()', size=220, parents=tuple(['RAM']))
        ]
        for label in ds_label_list:
            ds_map.insert_label_hierachy([label.parents[0], label.name],
                                         label.size)
        list_labels_two = [*ds_label_list, Label(name='total', size=350)]
        for label_hiearchy in ds_map.labels():
            self.assertIn(label_hiearchy, list_labels_two)
        self.assertEqual(ds_map.get_total_size(), 350)

    def test_parsing_generator_specified_datasource_1(self):
        ds_map = DataSourceMap(['a', 'b', 'c'])
        for label in LIST_LABELS:
            ds_map.insert_label_hierachy(
                [label.parents[0], label.parents[1], label.name], label.size)
        list_labels_ds_b = [
            Label(name='.code', size=30, parents=tuple(['FLASH'])),
            Label(name='.heap', size=320, parents=tuple(['RAM']))
        ]
        list_labels_ds_b += [Label(name='total', size=350)]
        for label_hiearchy in ds_map.labels(1):
            self.assertIn(label_hiearchy, list_labels_ds_b)
        self.assertEqual(ds_map.get_total_size(), 350)

    def test_parsing_generator_specified_datasource_str_2(self):
        ds_map = DataSourceMap(['a', 'b', 'c'])
        for label in LIST_LABELS:
            ds_map.insert_label_hierachy(
                [label.parents[0], label.parents[1], label.name], label.size)
        list_labels_ds_a = [
            Label(name='FLASH', size=30, parents=tuple([])),
            Label(name='RAM', size=320, parents=tuple([]))
        ]
        list_labels_ds_a += [Label(name='total', size=350)]
        for label_hiearchy in ds_map.labels(0):
            self.assertIn(label_hiearchy, list_labels_ds_a)
        self.assertEqual(ds_map.get_total_size(), 350)

    def test_parsing_generator_specified_datasource_int(self):
        ds_map = DataSourceMap(['a', 'b', 'c'])
        for label in LIST_LABELS:
            ds_map.insert_label_hierachy(
                [label.parents[0], label.parents[1], label.name], label.size)
        list_labels_ds_a = [
            Label(name='FLASH', size=30, parents=tuple([])),
            Label(name='RAM', size=320, parents=tuple([]))
        ]
        list_labels_ds_a += [Label(name='total', size=350)]
        for label_hiearchy in ds_map.labels(0):
            self.assertIn(label_hiearchy, list_labels_ds_a)
        self.assertEqual(ds_map.get_total_size(), 350)

    def test_parsing_generator_specified_datasource_int_2(self):
        ds_map = DataSourceMap(['a', 'b', 'c'])
        for label in LIST_LABELS:
            ds_map.insert_label_hierachy(
                [label.parents[0], label.parents[1], label.name], label.size)
        list_labels_ds_b = [
            Label(name='.code', size=30, parents=tuple(['FLASH'])),
            Label(name='.heap', size=320, parents=tuple(['RAM']))
        ]
        list_labels_ds_b += [Label(name='total', size=350)]
        for label_hiearchy in ds_map.labels(1):
            self.assertIn(label_hiearchy, list_labels_ds_b)
        self.assertEqual(ds_map.get_total_size(), 350)

    def test_diff_same_ds_labels_diff_sizes(self):
        """Same map with different sizes."""
        ds_map = DataSourceMap(['a', 'b', 'c'])
        for label in LIST_LABELS:
            ds_map.insert_label_hierachy(
                [label.parents[0], label.parents[1], label.name], label.size)

        ds_map2 = DataSourceMap(['a', 'b', 'c'])
        for label in LIST_LABELS:
            ds_map2.insert_label_hierachy(
                [label.parents[0], label.parents[1], label.name],
                label.size + 10)

        list_labels_ds_b = [
            Label(name='main()',
                  size=-10,
                  exists_both=True,
                  parents=tuple(['FLASH', '.code'])),
            Label(name='foo()',
                  size=-10,
                  exists_both=True,
                  parents=tuple(['RAM', '.heap'])),
            Label(name='bar()',
                  size=-10,
                  exists_both=True,
                  parents=tuple(['RAM', '.heap']))
        ]

        ds_map_diff = ds_map.diff(ds_map2)

        for label_hiearchy in ds_map_diff.labels():
            self.assertIn(label_hiearchy, list_labels_ds_b)

    def test_diff_missing_ds_labels_diff_sizes(self):
        """Different map with different sizes."""
        ds_map = DataSourceMap(['a', 'b', 'c'])
        for label in LIST_LABELS:
            ds_map.insert_label_hierachy(
                [label.parents[0], label.parents[1], label.name], label.size)

        ds_map2 = DataSourceMap(['a', 'b', 'c'])
        for label in LIST_LABELS[:-1]:
            ds_map2.insert_label_hierachy(
                [label.parents[0], label.parents[1], label.name],
                label.size + 20)
        ds_map2.insert_label_hierachy(
            [label.parents[0], label.parents[1], 'foobar()'], label.size + 20)

        ds_map2.insert_label_hierachy(["LOAD #5", 'random_load', 'func()'],
                                      250)

        list_labels_ds_b = [
            Label(name='FLASH',
                  size=20,
                  capacity=None,
                  exists_both=True,
                  parents=()),
            Label(name='RAM',
                  size=-80,
                  capacity=None,
                  exists_both=True,
                  parents=()),
            Label(name='LOAD #5',
                  size=250,
                  capacity=None,
                  exists_both=False,
                  parents=())
        ]

        ds_map_diff = ds_map2.diff(ds_map)

        for label_hiearchy in ds_map_diff.labels(0):
            self.assertIn(label_hiearchy, list_labels_ds_b)


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