File: test_particles.py

package info (click to toggle)
python-asciimatics 1.15.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,488 kB
  • sloc: python: 15,713; sh: 8; makefile: 2
file content (156 lines) | stat: -rw-r--r-- 5,867 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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
import random
import unittest
from unittest.mock import MagicMock
from asciimatics.particles import ShootScreen, DropScreen, Explosion, Rain, \
    StarFirework, PalmFirework, RingFirework, SerpentFirework
from asciimatics.screen import Screen, Canvas


class TestParticles(unittest.TestCase):
    def setUp(self):
        random.seed(42)

    def check_effect(self, canvas, effect, assert_fn,
                     is_blank=True, iterations=40, warm_up=0):
        """
        Basic checks for all effects.  Since they are all randomised to a
        certain extent, just check the overall content for expected values.
        """
        # Asciimatics always calls reset on entering a new Scene.
        effect.reset()

        # Check canvas is in desired starting state.
        if is_blank:
            for x in range(canvas.width):
                for y in range(canvas.height):
                    self.assertEqual(canvas.get_from(x, y), (32, 7, 0, 0))

        # Set up blank my_buffer - OK this should copy the existing screen, but
        # we just lose one iteration on the checks (when not really blank).
        my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)]

        # Re-draw comparing the my_buffer with what's on the canvas
        for i in range(iterations):
            effect.update(i)
            changed = False
            if i >= warm_up:
                view = ""
                for y in range(canvas.height):
                    for x in range(canvas.width):
                        value = canvas.get_from(x, y)
                        assert_fn(value)
                        if value != my_buffer[y][x]:
                            changed = True
                            my_buffer[y][x] = value
                        view += chr(value[0])
                    view += "\n"
                self.assertTrue(changed, "failed at step %d %s" % (i, view))

        # Check there is no stop frame by default.
        self.assertEqual(effect.stop_frame, 0)

    def test_shoot_screen(self):
        """
        Test that ShootScreen works as expected.
        """
        screen = MagicMock(spec=Screen, colours=8)
        canvas = Canvas(screen, 10, 40, 0, 0)
        canvas.centre("Hello World!", 5)
        effect = ShootScreen(canvas, canvas.width // 2, canvas.height // 2, 100, diameter=10)
        self.check_effect(canvas,
                          effect,
                          lambda value: self.assertIn(chr(value[0]),
                                                      'HeloWrd! '),
                          is_blank=False,
                          iterations=4)

    def test_drop_screen(self):
        """
        Test that DropScreen works as expected.
        """
        screen = MagicMock(spec=Screen, colours=8)
        canvas = Canvas(screen, 10, 40, 0, 0)
        canvas.centre("Hello World!", 0)
        effect = DropScreen(canvas, 100)
        self.check_effect(canvas,
                          effect,
                          lambda value: self.assertIn(chr(value[0]),
                                                      'HeloWrd! '),
                          is_blank=False,
                          warm_up=3,
                          iterations=10)

    def test_explosion(self):
        """
        Test that Explosion works as expected.
        """
        screen = MagicMock(spec=Screen, colours=8)
        canvas = Canvas(screen, 10, 40, 0, 0)
        effect = Explosion(canvas, 4, 4, 25)
        self.check_effect(canvas,
                          effect,
                          lambda value: self.assertIn(chr(value[0]), ' #'),
                          iterations=25)

    def test_rain(self):
        """
        Test that Rain works as expected.
        """
        screen = MagicMock(spec=Screen, colours=8)
        canvas = Canvas(screen, 10, 40, 0, 0)
        effect = Rain(canvas, 200)
        self.check_effect(canvas,
                          effect,
                          lambda value: self.assertIn(chr(value[0]), ' `\\v'))

    def test_star_firework(self):
        """
        Test that StarFirework works as expected.
        """
        screen = MagicMock(spec=Screen, colours=8)
        canvas = Canvas(screen, 10, 40, 0, 0)
        effect = StarFirework(canvas, 4, 4, 25)
        self.check_effect(canvas,
                          effect,
                          lambda value: self.assertIn(chr(value[0]), '|+:,. '),
                          iterations=25)

    def test_palm_firework(self):
        """
        Test that PalmFirework works as expected.
        """
        screen = MagicMock(spec=Screen, colours=8)
        canvas = Canvas(screen, 10, 40, 0, 0)
        effect = PalmFirework(canvas, 4, 4, 25)
        self.check_effect(canvas,
                          effect,
                          lambda value: self.assertIn(chr(value[0]), '|*+:,. '),
                          iterations=26)

    def test_ring_firework(self):
        """
        Test that RingFirework works as expected.
        """
        screen = MagicMock(spec=Screen, colours=8)
        canvas = Canvas(screen, 10, 40, 0, 0)
        effect = RingFirework(canvas, 4, 4, 25)
        self.check_effect(canvas,
                          effect,
                          lambda value: self.assertIn(chr(value[0]), '|*:. '),
                          iterations=15)

    def test_serpent_firework(self):
        """
        Test that SerpentFirework works as expected.
        """
        screen = MagicMock(spec=Screen, colours=8)
        canvas = Canvas(screen, 10, 40, 0, 0)
        effect = SerpentFirework(canvas, 4, 4, 25)
        self.check_effect(canvas,
                          effect,
                          lambda value: self.assertIn(chr(value[0]), '|+- '),
                          iterations=20)


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