~widelands-dev/widelands/trunk

10790 by The Widelands Bunnybot
Python files require python3 explicitly (CB #4529 / GH #6187)
1
#!/usr/bin/env python3
6509.5.1 by Nicolai Hähnle
Hack on alternative spritemap generation (via rectangle coverings)
2
8939 by Wideland's Bunnybot
Merged lp:~widelands-dev/widelands/appveyor_reenable_glbinding:
3
import make_spritemap
6509.5.1 by Nicolai Hähnle
Hack on alternative spritemap generation (via rectangle coverings)
4
import numpy as np
5
import os
6
import sys
7
import unittest
8
8201 by GunChleoc
Fetched translations and updated catalogues.
9
sys.path.append(os.path.normpath(
10
    os.path.dirname(os.path.abspath(__file__)) + '/..'))
6509.5.1 by Nicolai Hähnle
Hack on alternative spritemap generation (via rectangle coverings)
11
8201 by GunChleoc
Fetched translations and updated catalogues.
12
6509.5.1 by Nicolai Hähnle
Hack on alternative spritemap generation (via rectangle coverings)
13
class TestMinimumAverageCostRectangle(unittest.TestCase):
14
    def test_case1(self):
15
        FRAGMENT_COST = 4
16
        bitmask = np.array([
17
            [False, False, True],
18
            [False, False, False],
19
            [True, False, False],
20
            [True, False, False]
21
        ])
8201 by GunChleoc
Fetched translations and updated catalogues.
22
        cost, rectangle = make_spritemap.minimum_average_cost_rectangle(
23
            bitmask, FRAGMENT_COST=FRAGMENT_COST)
6509.5.1 by Nicolai Hähnle
Hack on alternative spritemap generation (via rectangle coverings)
24
        self.assertEqual(rectangle, (2, 0, 4, 1))
25
        self.assertAlmostEqual(cost, (FRAGMENT_COST + 2) / 2.0)
26
8201 by GunChleoc
Fetched translations and updated catalogues.
27
6509.5.1 by Nicolai Hähnle
Hack on alternative spritemap generation (via rectangle coverings)
28
class TestMinimumAverageCostGrow(unittest.TestCase):
29
    def test_basic_right(self):
30
        bitmask = np.array([
31
            [False, False, False, False],
32
            [False, False, False, False],
33
            [False, True,  True,  False],
34
            [False, True,  False, False],
35
            [False, False, False, False],
36
        ])
8201 by GunChleoc
Fetched translations and updated catalogues.
37
        cost, rectangle = make_spritemap.minimum_average_cost_grow(
38
            bitmask, (2, 1, 4, 2))
6509.5.1 by Nicolai Hähnle
Hack on alternative spritemap generation (via rectangle coverings)
39
        self.assertEqual(rectangle, (2, 1, 4, 3))
40
        self.assertAlmostEqual(cost, 2.0)
41
8201 by GunChleoc
Fetched translations and updated catalogues.
42
        cost, rectangle = make_spritemap.minimum_average_cost_grow(
43
            bitmask, (2, 1, 4, 3))
6509.5.1 by Nicolai Hähnle
Hack on alternative spritemap generation (via rectangle coverings)
44
        self.assertEqual(rectangle, (2, 1, 4, 3))
45
        self.assertEqual(cost, None)
46
47
    def test_basic_left(self):
48
        bitmask = np.array([
49
            [False, False, False, False],
50
            [False, False, False, False],
51
            [False, True,  False, False],
52
            [True,  False, False, False],
53
            [False, False, False, False],
54
        ])
8201 by GunChleoc
Fetched translations and updated catalogues.
55
        cost, rectangle = make_spritemap.minimum_average_cost_grow(
56
            bitmask, (2, 3, 4, 4))
6509.5.1 by Nicolai Hähnle
Hack on alternative spritemap generation (via rectangle coverings)
57
        self.assertEqual(rectangle, (2, 0, 4, 4))
58
        self.assertAlmostEqual(cost, 3.0)
59
60
    def test_basic_vertical(self):
61
        bitmask = np.array([
62
            [False, True,  False, False],
63
            [False, False, False, False],
64
            [False, True,  False, False],
65
            [False, False, False, True],
66
            [False, False, False, False],
67
        ])
8201 by GunChleoc
Fetched translations and updated catalogues.
68
        cost, rectangle = make_spritemap.minimum_average_cost_grow(
69
            bitmask, (3, 1, 4, 2))
6509.5.1 by Nicolai Hähnle
Hack on alternative spritemap generation (via rectangle coverings)
70
        self.assertEqual(rectangle, (2, 1, 4, 2))
71
        self.assertAlmostEqual(cost, 1.0)
72
73
        bitmask = np.array([
74
            [False, True,  False, False],
75
            [False, False, False, False],
76
            [False, False, False, False],
77
            [False, True,  False, False],
78
            [False, False, False, False],
79
        ])
8201 by GunChleoc
Fetched translations and updated catalogues.
80
        cost, rectangle = make_spritemap.minimum_average_cost_grow(
81
            bitmask, (2, 1, 3, 2))
6509.5.1 by Nicolai Hähnle
Hack on alternative spritemap generation (via rectangle coverings)
82
        self.assertEqual(rectangle, (2, 1, 4, 2))
83
        self.assertAlmostEqual(cost, 1.0)
84
85
86
class TestComputeRectangleCovering(unittest.TestCase):
87
    def test_basic(self):
8201 by GunChleoc
Fetched translations and updated catalogues.
88
        """Tests a case where the optimal solution consists of a single minimum
89
        average cost rectangle."""
6509.5.1 by Nicolai Hähnle
Hack on alternative spritemap generation (via rectangle coverings)
90
        FRAGMENT_COST = 4
91
        bitmask = np.array([
92
            [False, False, False, False],
93
            [False, False, False, False],
94
            [False, True,  True,  False],
95
            [False, True,  False, False],
96
            [False, False, False, False],
97
        ])
98
        cost, rectangles = make_spritemap.compute_rectangle_covering(
99
            bitmask,
100
            FRAGMENT_COST=FRAGMENT_COST
101
        )
102
        self.assertEqual(cost, FRAGMENT_COST + 4)
103
        self.assertItemsEqual(rectangles, [(2, 1, 4, 3)])
104
105
    def test_grow(self):
8201 by GunChleoc
Fetched translations and updated catalogues.
106
        """Tests a case where the optimal solution can be found by growing the
107
        initial minimum average cost rectangle."""
6509.5.1 by Nicolai Hähnle
Hack on alternative spritemap generation (via rectangle coverings)
108
        FRAGMENT_COST = 4
109
        bitmask = np.array([
110
            [False, False, False, False, False, False],
111
            [False, False, False, False, False, False],
112
            [False, True,  True,  False, False, False],
113
            [False, True,  False, False, False, False],
114
            [False, True,  False, False, False, False],
115
            [False, True,  False, False, False, False],
116
            [False, False, False, False, False, False],
117
        ])
118
        cost, rectangles = make_spritemap.compute_rectangle_covering(
119
            bitmask,
120
            FRAGMENT_COST=FRAGMENT_COST
121
        )
122
        self.assertEqual(cost, FRAGMENT_COST + 8)
123
        self.assertItemsEqual(rectangles, [(2, 1, 6, 3)])
124
125
    def test_nogrow(self):
8201 by GunChleoc
Fetched translations and updated catalogues.
126
        """Similar to test_grow, but tests a situation in which growing the
127
        initial rectangle is in fact not optimal."""
6509.5.1 by Nicolai Hähnle
Hack on alternative spritemap generation (via rectangle coverings)
128
        FRAGMENT_COST = 4
129
        bitmask = np.array([
130
            [False, False, False, False, False, False],
131
            [False, False, False, False, False, False],
132
            [False, True,  True,  True,  False, False],
133
            [False, True,  False, False, False, False],
134
            [False, True,  False, False, False, False],
135
            [False, True,  False, False, False, False],
136
            [False, False, False, False, False, False],
137
        ])
138
        cost, rectangles = make_spritemap.compute_rectangle_covering(
139
            bitmask,
140
            FRAGMENT_COST=FRAGMENT_COST
141
        )
142
        self.assertEqual(cost, 2 * FRAGMENT_COST + 6)
143
        self.assertItemsEqual(rectangles, [(2, 1, 6, 2), (2, 2, 3, 4)])
144
6509.5.2 by Nicolai Hähnle
Iron out some bugs in rectangle covering
145
    def test_diag_growth_bug(self):
8201 by GunChleoc
Fetched translations and updated catalogues.
146
        """Regression test for a silly bug."""
6509.5.2 by Nicolai Hähnle
Iron out some bugs in rectangle covering
147
        FRAGMENT_COST = 4
148
        bitmask = np.array([
149
            [True,  False, False, False],
150
            [False, False, False, False],
151
            [False, False, False, False],
152
            [False, False, False, True],
153
        ])
154
        cost, rectangles = make_spritemap.compute_rectangle_covering(
155
            bitmask,
156
            FRAGMENT_COST=FRAGMENT_COST
157
        )
158
        self.assertEqual(cost, 2 * FRAGMENT_COST + 2)
159
        self.assertItemsEqual(rectangles, [(0, 0, 1, 1), (3, 3, 4, 4)])
160
8939 by Wideland's Bunnybot
Merged lp:~widelands-dev/widelands/appveyor_reenable_glbinding:
161
6509.5.1 by Nicolai Hähnle
Hack on alternative spritemap generation (via rectangle coverings)
162
if __name__ == '__main__':
163
    unittest.main()