summaryrefslogtreecommitdiff
path: root/tests/glibext/singleton.py
blob: b0608f0a1824173666f593cbdf958b8681dcf0d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101

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)