from chrysacase import ChrysalideTestCase from gi.repository import GObject from pychrysalide.glibext import SingletonCandidate, SingletonFactory class TestSingleton(ChrysalideTestCase): """Test cases for pychrysalide.glibext.SingletonFactory.""" def testSingletonCreation(self): """Create singleton objects.""" with self.assertRaisesRegex(NotImplementedError, 'SingletonCandidate can not be constructed'): sc = SingletonCandidate() class NewSingletonImplem(GObject.Object, SingletonCandidate): pass nsi = NewSingletonImplem() self.assertIsNotNone(nsi) def testFactoryCreation(self): """Create singleton factories.""" sf = SingletonFactory() self.assertIsNotNone(sf) class MyFactory(SingletonFactory): pass msf = MyFactory() self.assertIsNotNone(msf) def testSingletonMethods(self): """Test the singleton methods.""" class IntegerCacheImplem(GObject.Object, SingletonCandidate): def __init__(self, val): super().__init__() self._val = val def __eq__(self, other): return self._val == other._val def __hash__(self): return hash('common-key') val_0 = IntegerCacheImplem(0) val_0_bis = IntegerCacheImplem(0) val_1 = IntegerCacheImplem(1) self.assertEqual(hash(val_0), hash(val_0_bis)) self.assertEqual(hash(val_0), hash(val_1)) self.assertEqual(val_0.hash(), val_0_bis.hash()) self.assertEqual(val_0.hash(), val_1.hash()) self.assertTrue(val_0 == val_0_bis) self.assertFalse(val_0 == val_1) def testSingletonFootprint(self): """Check for singleton memory footprint.""" class IntegerCacheImplem(GObject.Object, SingletonCandidate): def __init__(self, val): super().__init__() self._val = val def __eq__(self, other): return self._val == other._val def __hash__(self): return hash('common-key') val_0 = IntegerCacheImplem(0) val_0_bis = IntegerCacheImplem(0) val_1 = IntegerCacheImplem(1) sf = SingletonFactory() obj = sf.get_instance(val_0) self.assertTrue(obj is val_0) obj = sf.get_instance(val_0_bis) self.assertTrue(obj is val_0) obj = sf.get_instance(val_1) self.assertTrue(obj is val_1)