File: test_log.py

package info (click to toggle)
petsc4py 3.24.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,612 kB
  • sloc: python: 13,569; ansic: 1,768; makefile: 345; f90: 313; sh: 14
file content (123 lines) | stat: -rw-r--r-- 3,925 bytes parent folder | download
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# --------------------------------------------------------------------

if __name__ == '__main__':
    import sys
    import petsc4py

    petsc4py.init(sys.argv + ['-log_view'])

# --------------------------------------------------------------------

from petsc4py import PETSc
import unittest

# --------------------------------------------------------------------


class TestLog(unittest.TestCase):
    def setUp(self):
        # PETSc.Log.begin()
        # register stages
        self.stage1 = PETSc.Log.Stage('Stage 1')
        self.stage2 = PETSc.Log.Stage('Stage 2')
        # register classes
        self.klassA = PETSc.Log.Class('Class A')
        self.klassB = PETSc.Log.Class('Class B')
        # register events
        self.event1 = PETSc.Log.Event('Event 1')  # no class
        self.event2 = PETSc.Log.Event('Event 2')  # no class
        self.eventA = PETSc.Log.Event('Event A', self.klassA)
        self.eventB = PETSc.Log.Event('Event B', self.klassB)

    def testGetName(self):
        self.assertEqual(self.klassA.name, 'Class A')
        self.assertEqual(self.klassB.name, 'Class B')
        self.assertEqual(self.event1.name, 'Event 1')
        self.assertEqual(self.event2.name, 'Event 2')
        self.assertEqual(self.eventA.name, 'Event A')
        self.assertEqual(self.eventB.name, 'Event B')
        self.assertEqual(self.stage1.name, 'Stage 1')
        self.assertEqual(self.stage2.name, 'Stage 2')

    def testLogBeginEnd(self):
        # -----
        self._run_events()  # in main stage
        self._run_stages()  # in user stages
        # -----
        for event in self._get_events():
            event.deactivate()
            event.setActive(False)
            event.active = False
        self._run_events()  # should not be logged
        for event in self._get_events():
            event.activate()
            event.setActive(True)
            event.active = True
        # -----
        for klass in self._get_classes():
            klass.deactivate()
            klass.setActive(False)
            klass.active = False
        self._run_events()  # A and B should not be logged
        for klass in self._get_classes():
            klass.activate()
            klass.setActive(True)
            klass.active = True
        # -----
        for stage in self._get_stages():
            active = stage.getActive()
            self.assertTrue(active)
            self.assertTrue(stage.active)
            stage.setActive(False)
            active = stage.getActive()
            self.assertFalse(active)
            self.assertFalse(stage.active)
        self._run_stages()  # should not be logged
        for stage in self._get_stages():
            stage.setActive(True)
            stage.active = True
            active = stage.getActive()
            self.assertTrue(active)
            self.assertTrue(stage.active)
        # -----
        self._run_events()
        self._run_stages()

    def test_log_decorator(self):
        timed_func = PETSc.Log.EventDecorator()(lambda: None)
        timed_func()

    def _run_stages(self):
        for stage in self._get_stages():
            self._run_events(stage)

    def _get_stages(self):
        return (self.stage1, self.stage2)

    def _get_classes(self):
        return (self.klassA, self.klassB)

    def _get_events(self):
        return (self.event1, self.event2, self.eventA, self.eventB)

    def _run_events(self, stage=None):
        if stage is not None:
            stage.push()
        self._events_begin()
        self._events_end()
        if stage is not None:
            stage.pop()

    def _events_begin(self):
        for event in self._get_events():
            event.begin()

    def _events_end(self):
        for event in reversed(self._get_events()):
            event.end()


# --------------------------------------------------------------------

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