import unittest

import icalendar


class TestCaselessdict(unittest.TestCase):
    def test_caselessdict_canonsort_keys(self):
        canonsort_keys = icalendar.caselessdict.canonsort_keys

        keys = ["DTEND", "DTSTAMP", "DTSTART", "UID", "SUMMARY", "LOCATION"]

        out = canonsort_keys(keys)
        self.assertEqual(
            out, ["DTEND", "DTSTAMP", "DTSTART", "LOCATION", "SUMMARY", "UID"]
        )

        out = canonsort_keys(
            keys,
            (
                "SUMMARY",
                "DTSTART",
                "DTEND",
            ),
        )
        self.assertEqual(
            out, ["SUMMARY", "DTSTART", "DTEND", "DTSTAMP", "LOCATION", "UID"]
        )

        out = canonsort_keys(
            keys,
            (
                "UID",
                "DTSTART",
                "DTEND",
            ),
        )
        self.assertEqual(
            out, ["UID", "DTSTART", "DTEND", "DTSTAMP", "LOCATION", "SUMMARY"]
        )

        out = canonsort_keys(keys, ("UID", "DTSTART", "DTEND", "RRULE", "EXDATE"))
        self.assertEqual(
            out, ["UID", "DTSTART", "DTEND", "DTSTAMP", "LOCATION", "SUMMARY"]
        )

    def test_caselessdict_canonsort_items(self):
        canonsort_items = icalendar.caselessdict.canonsort_items

        d = {
            "i": 7,
            "c": "at",
            "a": 3.5,
            "l": (2, 3),
            "e": [4, 5],
            "n": 13,
            "d": {"x": "y"},
            "r": 1.0,
        }

        out = canonsort_items(d)
        self.assertEqual(
            out,
            [
                ("a", 3.5),
                ("c", "at"),
                ("d", {"x": "y"}),
                ("e", [4, 5]),
                ("i", 7),
                ("l", (2, 3)),
                ("n", 13),
                ("r", 1.0),
            ],
        )

        out = canonsort_items(d, ("i", "c", "a"))
        self.assertTrue(
            out,
            [
                ("i", 7),
                ("c", "at"),
                ("a", 3.5),
                ("d", {"x": "y"}),
                ("e", [4, 5]),
                ("l", (2, 3)),
                ("n", 13),
                ("r", 1.0),
            ],
        )

    def test_caselessdict_copy(self):
        CaselessDict = icalendar.caselessdict.CaselessDict

        original_dict = CaselessDict(key1="val1", key2="val2")
        copied_dict = original_dict.copy()

        self.assertEqual(original_dict, copied_dict)

    def test_CaselessDict(self):
        CaselessDict = icalendar.caselessdict.CaselessDict

        ncd = CaselessDict(key1="val1", key2="val2")
        self.assertEqual(ncd, CaselessDict({"KEY2": "val2", "KEY1": "val1"}))

        self.assertEqual(ncd["key1"], "val1")
        self.assertEqual(ncd["KEY1"], "val1")

        assert ncd.has_key("key1")

        ncd["KEY3"] = "val3"
        self.assertEqual(ncd["key3"], "val3")

        self.assertEqual(ncd.setdefault("key3", "FOUND"), "val3")
        self.assertEqual(ncd.setdefault("key4", "NOT FOUND"), "NOT FOUND")
        self.assertEqual(ncd["key4"], "NOT FOUND")
        self.assertEqual(ncd.get("key1"), "val1")
        self.assertEqual(ncd.get("key3", "NOT FOUND"), "val3")
        self.assertEqual(ncd.get("key4", "NOT FOUND"), "NOT FOUND")
        self.assertIn("key4", ncd)

        del ncd["key4"]
        self.assertNotIn("key4", ncd)

        ncd.update({"key5": "val5", "KEY6": "val6", "KEY5": "val7"})
        self.assertEqual(ncd["key6"], "val6")

        keys = sorted(ncd.keys())
        self.assertEqual(keys, ["KEY1", "KEY2", "KEY3", "KEY5", "KEY6"])
