"""Run with python -m unittest -v test_cache.py, beside cache.py. No packages."""
import unittest

from cache import TTLCache


class CacheContract(unittest.TestCase):
    def setUp(self):
        self.now = 100
        self.cache = TTLCache(lambda: self.now)

    def test_missing_key(self):
        self.assertEqual(self.cache.get("missing", "absent"), "absent")

    def test_live_entry(self):
        self.cache.set("item", "saved", ttl=5)
        self.now = 104
        self.assertEqual(self.cache.get("item", "absent"), "saved")

    def test_exact_expiry(self):
        self.cache.set("item", "saved", ttl=5)
        self.now = 105
        self.assertEqual(self.cache.get("item", "absent"), "absent")

    def test_after_expiry(self):
        self.cache.set("item", "saved", ttl=5)
        self.now = 106
        self.assertEqual(self.cache.get("item", "absent"), "absent")

    def test_zero_value(self):
        self.cache.set("item", 0)
        self.assertEqual(self.cache.get("item", "absent"), 0)

    def test_false_value(self):
        self.cache.set("item", False)
        self.assertIs(self.cache.get("item", "absent"), False)

    def test_empty_string(self):
        self.cache.set("item", "")
        self.assertEqual(self.cache.get("item", "absent"), "")

    def test_none_value(self):
        self.cache.set("item", None)
        self.assertIsNone(self.cache.get("item", "absent"))

    def test_zero_ttl(self):
        self.cache.set("item", "saved", ttl=0)
        self.assertEqual(self.cache.get("item", "absent"), "absent")

    def test_instances_are_independent(self):
        other = TTLCache(lambda: self.now)
        self.cache.set("item", "saved")
        self.assertEqual(other.get("item", "absent"), "absent")


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