Add some test cases for coordit.cc
[crawl.git] / crawl-ref / source / catch2-tests / test_coordit.cc
1 #include <random>
2 #include <set>
3
4 #include "catch.hpp"
5
6 #include "AppHdr.h"
7
8 #include "coordit.h"
9
10 TEST_CASE("rectangle_iterator", "[single-file]")
11 {
12     SECTION("Generates w*h unique points from top left, bottom right pair")
13     {
14         const auto x = GENERATE(10, 20, 30, 40);
15         const auto y = GENERATE(10, 20, 30, 40);
16         const auto w = GENERATE(10, 20, 30, 40);
17         const auto h = GENERATE(10, 20, 30, 40);
18
19         CAPTURE(x, y, w, h);
20
21         set<coord_def> points;
22         for (rectangle_iterator ri(coord_def(x,y), coord_def(x+w,y+h)); ri; ++ri)
23             points.insert(*ri);
24
25         REQUIRE(points.size() == (w+1)*(h+1));  // Inclusive.
26     }
27
28     SECTION("Generates w*h unique points from centre and halfside")
29     {
30         const auto x = GENERATE(10, 20, 30, 40);
31         const auto y = GENERATE(10, 20, 30, 40);
32         const auto halfside = GENERATE(10, 20, 30, 40);
33
34         CAPTURE(x, y, halfside);
35
36         set<coord_def> points;
37         for (rectangle_iterator ri(coord_def(x,y), halfside); ri; ++ri)
38             points.insert(*ri);
39
40         const auto side_length = halfside*2 + 1;
41         REQUIRE(points.size() == side_length*side_length);  // Inclusive.
42     }
43 }
44
45 TEST_CASE("random_rectangle_iterator", "[single-file]")
46 {
47     SECTION("Generates w*h unique points")
48     {
49         auto x = GENERATE(10, 20, 30, 40);
50         auto y = GENERATE(10, 20, 30, 40);
51         auto w = GENERATE(10, 20, 30, 40);
52         auto h = GENERATE(10, 20, 30, 40);
53
54         CAPTURE(x, y, w, h);
55
56         set<coord_def> points;
57         for (random_rectangle_iterator ri(coord_def(x,y), coord_def(x+w,y+h)); ri; ++ri)
58             points.insert(*ri);
59
60         REQUIRE(points.size() == (w+1)*(h+1));  // Inclusive.
61     }
62 }
63
64 TEST_CASE("orth_adjacent_iterator", "[single-file]")
65 {
66     SECTION("Includes only orthagonally adjacent locations")
67     {
68         const coord_def where(50, 50);
69
70         vector<coord_def> adjacent;
71         for (orth_adjacent_iterator ai(where); ai; ++ai)
72             adjacent.push_back(*ai);
73
74         // Right, left, bottom, top.
75         const vector<coord_def> expected = {
76             coord_def(51, 50),
77             coord_def(49, 50),
78             coord_def(50, 51),
79             coord_def(50, 49),
80         };
81
82         REQUIRE(adjacent == expected);
83     }
84
85     SECTION("Includes the centre if specified")
86     {
87         const coord_def where(50, 50);
88
89         vector<coord_def> adjacent;
90         for (orth_adjacent_iterator ai(where, false); ai; ++ai)
91             adjacent.push_back(*ai);
92
93         // Centre, right, left, bottom, top.
94         const vector<coord_def> expected = {
95             coord_def(50, 50),
96             coord_def(51, 50),
97             coord_def(49, 50),
98             coord_def(50, 51),
99             coord_def(50, 49),
100         };
101
102         REQUIRE(adjacent == expected);
103     }
104 }
105
106 TEST_CASE("adjacent_iterator", "[single-file]")
107 {
108     SECTION("Includes all adjacent locations")
109     {
110         const coord_def where(50, 50);
111
112         vector<coord_def> adjacent;
113         for (adjacent_iterator ai(where); ai; ++ai)
114             adjacent.push_back(*ai);
115
116         // Starts at top-left and rotates counter-clockwise.
117         const vector<coord_def> expected = {
118             coord_def(49, 49),
119             coord_def(49, 50),
120             coord_def(49, 51),
121             coord_def(50, 51),
122             coord_def(51, 51),
123             coord_def(51, 50),
124             coord_def(51, 49),
125             coord_def(50, 49),
126         };
127
128         REQUIRE(adjacent == expected);
129     }
130
131     SECTION("Includes the centre if specified")
132     {
133         const coord_def where(50, 50);
134
135         vector<coord_def> adjacent;
136         for (adjacent_iterator ai(where, false); ai; ++ai)
137             adjacent.push_back(*ai);
138
139         // Centre first, then starts at top-left and rotates counter-clockwise.
140         const vector<coord_def> expected = {
141             coord_def(50, 50),
142             coord_def(49, 49),
143             coord_def(49, 50),
144             coord_def(49, 51),
145             coord_def(50, 51),
146             coord_def(51, 51),
147             coord_def(51, 50),
148             coord_def(51, 49),
149             coord_def(50, 49),
150         };
151
152         REQUIRE(adjacent == expected);
153     }
154 }
155
156 TEST_CASE("distance_iterator", "[single-file]")
157 {
158     SECTION("Includes all adjacent locations for d = 1")
159     {
160         const coord_def where(50, 50);
161
162         vector<coord_def> points;
163         for (distance_iterator di(where, false, true, 1); di; ++di)
164             points.push_back(*di);
165
166         // Top to bottom, left to right.
167         const vector<coord_def> expected = {
168             coord_def(49, 49),
169             coord_def(49, 50),
170             coord_def(49, 51),
171             coord_def(50, 49),
172             coord_def(50, 51),
173             coord_def(51, 49),
174             coord_def(51, 50),
175             coord_def(51, 51),
176         };
177
178         REQUIRE(points == expected);
179     }
180
181     SECTION("Includes the centre if specified")
182     {
183         const coord_def where(50, 50);
184
185         vector<coord_def> points;
186         for (distance_iterator di(where, false, false, 1); di; ++di)
187             points.push_back(*di);
188
189         // Centre first, then top to bottom, left to right.
190         const vector<coord_def> expected = {
191             coord_def(50, 50),
192             coord_def(49, 49),
193             coord_def(49, 50),
194             coord_def(49, 51),
195             coord_def(50, 49),
196             coord_def(50, 51),
197             coord_def(51, 49),
198             coord_def(51, 50),
199             coord_def(51, 51),
200         };
201
202         REQUIRE(points == expected);
203     }
204 }