class TestIdentityRef(unittest.TestCase):
    def setUp(self):
        self.ident = mockup()
        self.cache = IdentityCache()
        self.cache.update_ident(self.ident)
        self.ref = IdentRef(self.ident.key, self.cache)

    def thorough_equality(self, other_ref):
        self.assertEqual(self.ref, other_ref)
        self.assertEqual(hash(self.ref), hash(other_ref))

    def thorough_inequality(self, ineq_ref):
        self.assertNotEqual(self.ref, ineq_ref)
        self.assertNotEqual(hash(self.ref), hash(ineq_ref))

    def test_eq(self):
        self.thorough_equality(IdentRef(self.ident.key, self.cache))
        self.thorough_inequality(IdentRef("random key", self.cache))
        self.thorough_inequality(IdentRef(self.ident.key, IdentityCache()))

    def test_deref(self):
        self.assertEqual(self.ident, self.ref.deref())

    def test_from_cache(self):
        self.assertEqual(self.ref, self.cache.ref(self.ident))
        self.assertEqual(self.ref, self.cache.ref(self.ident.key))

    def test_from_ident(self):
        self.assertEqual(self.ref, self.ident.ref(self.cache))

    def test_hashable(self):
        # What can I say, I'm paranoid.
        myset = set([self.ref])
        self.assertIn(self.ref, myset)
        self.assertEquals(list(myset), [self.ref])