#!/usr/bin/env python3
#
# Copyright (C) 2022 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

from unittest import TestCase

import vyos.opmode

class TestVyOSOpMode(TestCase):
    def test_field_name_normalization(self):
        from vyos.opmode import _normalize_field_name

        self.assertEqual(_normalize_field_name(" foo bar "), "foo_bar")
        self.assertEqual(_normalize_field_name("foo-bar"), "foo_bar")
        self.assertEqual(_normalize_field_name("foo (bar) baz"), "foo_bar_baz")
        self.assertEqual(_normalize_field_name("load%"), "load_percentage")

    def test_dict_fields_normalization_non_unique(self):
        from vyos.opmode import _normalize_field_names

        # Space and dot are both replaced by an underscore,
        # so dicts like this cannor be normalized uniquely
        data = {"foo bar": True, "foo.bar": False}

        with self.assertRaises(vyos.opmode.InternalError):
            _normalize_field_names(data)

    def test_dict_fields_normalization_simple_dict(self):
        from vyos.opmode import _normalize_field_names

        data = {"foo bar": True, "Bar-Baz": False}
        self.assertEqual(_normalize_field_names(data), {"foo_bar": True, "bar_baz": False})

    def test_dict_fields_normalization_nested_dict(self):
        from vyos.opmode import _normalize_field_names

        data = {"foo bar": True, "bar-baz": {"baz-quux": {"quux-xyzzy": False}}}
        self.assertEqual(_normalize_field_names(data),
          {"foo_bar": True, "bar_baz": {"baz_quux": {"quux_xyzzy": False}}})

    def test_dict_fields_normalization_mixed(self):
        from vyos.opmode import _normalize_field_names

        data = [{"foo bar": True, "bar-baz": [{"baz-quux": {"quux-xyzzy": [False]}}]}]
        self.assertEqual(_normalize_field_names(data),
          [{"foo_bar": True, "bar_baz": [{"baz_quux": {"quux_xyzzy": [False]}}]}])

    def test_dict_fields_normalization_primitive(self):
        from vyos.opmode import _normalize_field_names

        data = [1, False, "foo"]
        self.assertEqual(_normalize_field_names(data), [1, False, "foo"])