]> git.lizzy.rs Git - dragonfireclient.git/blob - src/unittest/test_areastore.cpp
Merge pull request #59 from PrairieAstronomer/readme_irrlicht_change
[dragonfireclient.git] / src / unittest / test_areastore.cpp
1 /*
2 Minetest
3 Copyright (C) 2015 est31, <MTest31@outlook.com>
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #include "test.h"
21
22 #include "util/areastore.h"
23
24 class TestAreaStore : public TestBase {
25 public:
26         TestAreaStore() { TestManager::registerTestModule(this); }
27         const char *getName() { return "TestAreaStore"; }
28
29         void runTests(IGameDef *gamedef);
30
31         void genericStoreTest(AreaStore *store);
32         void testVectorStore();
33         void testSpatialStore();
34         void testSerialization();
35 };
36
37 static TestAreaStore g_test_instance;
38
39 void TestAreaStore::runTests(IGameDef *gamedef)
40 {
41         TEST(testVectorStore);
42 #if USE_SPATIAL
43         TEST(testSpatialStore);
44 #endif
45         TEST(testSerialization);
46 }
47
48 ////////////////////////////////////////////////////////////////////////////////
49
50 void TestAreaStore::testVectorStore()
51 {
52         VectorAreaStore store;
53         genericStoreTest(&store);
54 }
55
56 void TestAreaStore::testSpatialStore()
57 {
58 #if USE_SPATIAL
59         SpatialAreaStore store;
60         genericStoreTest(&store);
61 #endif
62 }
63
64 void TestAreaStore::genericStoreTest(AreaStore *store)
65 {
66         Area a(v3s16(-10, -3, 5), v3s16(0, 29, 7));
67         Area b(v3s16(-5, -2, 5), v3s16(0, 28, 6));
68         Area c(v3s16(-7, -3, 6), v3s16(-1, 27, 7));
69         std::vector<Area *> res;
70
71         UASSERTEQ(size_t, store->size(), 0);
72         store->reserve(2); // sic
73         store->insertArea(&a);
74         store->insertArea(&b);
75         store->insertArea(&c);
76         UASSERTEQ(size_t, store->size(), 3);
77
78         store->getAreasForPos(&res, v3s16(-1, 0, 6));
79         UASSERTEQ(size_t, res.size(), 3);
80         res.clear();
81         store->getAreasForPos(&res, v3s16(0, 0, 7));
82         UASSERTEQ(size_t, res.size(), 1);
83         res.clear();
84
85         store->removeArea(a.id);
86
87         store->getAreasForPos(&res, v3s16(0, 0, 7));
88         UASSERTEQ(size_t, res.size(), 0);
89         res.clear();
90
91         store->insertArea(&a);
92
93         store->getAreasForPos(&res, v3s16(0, 0, 7));
94         UASSERTEQ(size_t, res.size(), 1);
95         res.clear();
96
97         store->getAreasInArea(&res, v3s16(-10, -3, 5), v3s16(0, 29, 7), false);
98         UASSERTEQ(size_t, res.size(), 3);
99         res.clear();
100
101         store->getAreasInArea(&res, v3s16(-100, 0, 6), v3s16(200, 0, 6), false);
102         UASSERTEQ(size_t, res.size(), 0);
103         res.clear();
104
105         store->getAreasInArea(&res, v3s16(-100, 0, 6), v3s16(200, 0, 6), true);
106         UASSERTEQ(size_t, res.size(), 3);
107         res.clear();
108
109         store->removeArea(a.id);
110         store->removeArea(b.id);
111         store->removeArea(c.id);
112
113         Area d(v3s16(-100, -300, -200), v3s16(-50, -200, -100));
114         d.data = "Hi!";
115         store->insertArea(&d);
116
117         store->getAreasForPos(&res, v3s16(-75, -250, -150));
118         UASSERTEQ(size_t, res.size(), 1);
119         UASSERTEQ(u16, res[0]->data.size(), 3);
120         UASSERT(strncmp(res[0]->data.c_str(), "Hi!", 3) == 0);
121         res.clear();
122
123         store->removeArea(d.id);
124 }
125
126 void TestAreaStore::testSerialization()
127 {
128         VectorAreaStore store;
129
130         Area a(v3s16(-1, 0, 1), v3s16(0, 1, 2));
131         a.data = "Area AA";
132         store.insertArea(&a);
133
134         Area b(v3s16(123, 456, 789), v3s16(32000, 100, 10));
135         b.data = "Area BB";
136         store.insertArea(&b);
137
138         std::ostringstream os(std::ios_base::binary);
139         store.serialize(os);
140         std::string str = os.str();
141
142         std::string str_wanted("\x00"  // Version
143                         "\x00\x02"  // Count
144                         "\xFF\xFF\x00\x00\x00\x01"  // Area A min edge
145                         "\x00\x00\x00\x01\x00\x02"  // Area A max edge
146                         "\x00\x07"  // Area A data length
147                         "Area AA"   // Area A data
148                         "\x00\x7B\x00\x64\x00\x0A"  // Area B min edge (last two swapped with max edge for sorting)
149                         "\x7D\x00\x01\xC8\x03\x15"  // Area B max edge (^)
150                         "\x00\x07"  // Area B data length
151                         "Area BB"   // Area B data
152                         "\x00\x00\x00\x00"  // ID A = 0
153                         "\x00\x00\x00\x01", // ID B = 1
154                         1 + 2 +
155                         (6 + 6 + 2 + 7) * 2 + // min/max edge, length, data
156                         2 * 4); // Area IDs
157
158         UASSERTEQ(const std::string &, str, str_wanted);
159
160         std::istringstream is(str, std::ios_base::binary);
161         store.deserialize(is);
162
163         // deserialize() doesn't clear the store
164         // But existing IDs are overridden
165         UASSERTEQ(size_t, store.size(), 2);
166
167         Area c(v3s16(33, -2, -6), v3s16(4, 77, -76));
168         c.data = "Area CC";
169         store.insertArea(&c);
170
171         UASSERTEQ(u32, c.id, 2);
172 }
173