source: trunk/src/t/base/map.cpp @ 3838

Last change on this file since 3838 was 3838, checked in by guite, 7 years ago

map: adding test for random failure with add/remove updates

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
File size: 8.0 KB
Line 
1//
2//  Lol Engine
3//
4//  Copyright © 2010-2015 Sam Hocevar <sam@hocevar.net>
5//
6//  This program is free software. It comes without any warranty, to
7//  the extent permitted by applicable law. You can redistribute it
8//  and/or modify it under the terms of the Do What the Fuck You Want
9//  to Public License, Version 2, as published by the WTFPL Task Force.
10//  See http://www.wtfpl.net/ for more details.
11//
12
13#include <lol/engine-internal.h>
14
15#include <lolunit.h>
16
17namespace lol
18{
19
20lolunit_declare_fixture(MapTest)
21{
22    void SetUp() {}
23
24    void TearDown() {}
25
26    lolunit_declare_test(MapDeclare)
27    {
28        map<uint8_t, uint8_t> m1;
29        map<int, int> m2;
30        map<float, float> m3;
31        map<char const *, char const *> m4;
32    }
33
34    lolunit_declare_test(MapSet)
35    {
36        map<int, int> m;
37
38        for (int i = 0; i < 1000; i++)
39            m[i] = -1;
40
41        for (int i = 0; i < 1000; i++)
42            m[i] = i;
43
44        for (int i = 0; i < 1000; i++)
45            lolunit_assert_equal(m[i], i);
46    }
47
48    lolunit_declare_test(MapHasKey)
49    {
50        map<int, int> m;
51
52        m[0] = 1;
53        m[2] = 2;
54
55        lolunit_assert(m.has_key(0));
56        lolunit_assert(!m.has_key(1));
57        lolunit_assert(m.has_key(2));
58    }
59
60    lolunit_declare_test(MapRemove)
61    {
62        map<uint64_t, uint64_t> m;
63        array<uint64_t> a;
64
65        for (int i = 0; i < 20; i++)
66        {
67            a << i;
68            m[i] = -1;
69        }
70        for (int i = 0; i < a.Count(); i++)
71            m[i] = i;
72        a.Shuffle();
73        for (int i = 0; i < a.Count(); i++)
74            m.remove(a[i]);
75    }
76
77    lolunit_declare_test(MapRemoveString)
78    {
79        map<String, uint64_t> m;
80        array<String> a;
81
82        for (int i = 0; i < 20; i++)
83        {
84            a << String::Printf("test_str_%i", i);
85            m[a.Last()] = -1;
86        }
87        for (int i = 0; i < a.Count(); i++)
88            m[a[i]] = i;
89        a.Shuffle();
90        for (int i = 0; i < a.Count(); i++)
91            m.remove(a[i]);
92    }
93
94    lolunit_declare_test(MapRemoveBug)
95    {
96        map<uint64_t, uint64_t> m;
97
98        for (int i = 0; i < 20; i++)
99            m[i] = i;
100
101        m.remove(12);
102        m.remove(0);
103        m.remove(17);
104        m.remove(2);
105        m.remove(9);
106        m.remove(4);
107        m.remove(15);
108        m.remove(10);
109        lolunit_assert_equal(m[8], 8);
110    }
111
112    lolunit_declare_test(MapRandomAddRemove)
113    {
114        map<unsigned char, unsigned char> m;
115
116        unsigned char a = 1, b = 1, c = 1;
117
118        char presence[256];
119        char value[256];
120
121        for (int i = 0 ; i < 256 ; ++i)
122        {
123            presence[i] = 0;
124        }
125
126        for (int i = 0 ; i < 10000 ; ++i)
127        {
128            m[a] = b;
129            m.remove(b);
130
131            presence[a] = 1;
132            value[a] = b;
133            presence[b] = 0;
134
135            a = a * b + c;
136            b = b * c + a;
137            c = c * a + b;
138
139            // debug output
140            // std::cout << "a " << (int)a << ", b " << (int)b  << std::endl;
141
142            for (int j = 0 ; j < 256 ; ++j)
143            {
144                unsigned char v;
145                if (presence[j])
146                {
147                    lolunit_assert(m.try_get(j, v));
148                    lolunit_assert_equal((int) value[j], (int) v);
149                }
150                else
151                {
152                    lolunit_assert(!m.try_get(j, v));
153                }
154            }
155        }
156    }
157
158    lolunit_declare_test(StringMap)
159    {
160        map<char const *, int> m;
161
162        m["foo"] = 42;
163        m["bar"] = 12;
164        m["baz"] = 2;
165
166        int foo = m["foo"];
167        int bar = m["bar"];
168        int baz = m["baz"];
169
170        lolunit_assert_equal(42, foo);
171        lolunit_assert_equal(12, bar);
172        lolunit_assert_equal(2, baz);
173
174        //Big stress test
175        array<String> bones = { "RootNode",
176        "Cyberano_Ns:Root_$AssimpFbx$_Translation",
177        "Cyberano_Ns:Box004_$AssimpFbx$_PreRotation",
178        "Cyberano_Ns:Root_$AssimpFbx$_PreRotation",
179        "Cyberano_Ns:Box004",
180        "Cyberano_Ns:Root_$AssimpFbx$_Rotation",
181        "Cyberano_Ns:Root",
182        "Cyberano_Ns:Hips",
183        "Cyberano_Ns:Spine",
184        "Cyberano_Ns:RightUpLeg",
185        "Cyberano_Ns:LeftUpLeg",
186        "Cyberano_Ns:BeltSheath1",
187        "Cyberano_Ns:RightCoat",
188        "Cyberano_Ns:LeftCoat",
189        "Cyberano_Ns:Spine1",
190        "Cyberano_Ns:RightLeg",
191        "Cyberano_Ns:RightUpLegRoll",
192        "Cyberano_Ns:LeftUpLegRoll",
193        "Cyberano_Ns:LeftLeg",
194        "Cyberano_Ns:Sheath",
195        "Cyberano_Ns:BeltSheath2",
196        "Cyberano_Ns:BeltSheath3",
197        "Cyberano_Ns:Spine2",
198        "Cyberano_Ns:FrontBelt1",
199        "Cyberano_Ns:BackBelt1",
200        "Cyberano_Ns:RightFoot",
201        "Cyberano_Ns:RightLegRoll",
202        "Cyberano_Ns:LeftLegRoll",
203        "Cyberano_Ns:LeftFoot",
204        "Cyberano_Ns:Sword",
205        "Cyberano_Ns:Neck",
206        "Cyberano_Ns:RightShoulder",
207        "Cyberano_Ns:LeftShoulder",
208        "Cyberano_Ns:Cloth",
209        "Cyberano_Ns:FrontBelt2",
210        "Cyberano_Ns:RightToeBase",
211        "Cyberano_Ns:LeftToeBase",
212        "Cyberano_Ns:Head",
213        "Cyberano_Ns:RightArm",
214        "Cyberano_Ns:RightSpaulder1",
215        "Cyberano_Ns:RightSpaulder2",
216        "Cyberano_Ns:LeftArm",
217        "Cyberano_Ns:LeftSpaulder1",
218        "Cyberano_Ns:LeftCloth01",
219        "Cyberano_Ns:MiddleCloth01",
220        "Cyberano_Ns:RightCloth01",
221        "Cyberano_Ns:FrontBelt3",
222        "Cyberano_Ns:RightoeEnd",
223        "Cyberano_Ns:LeftoeEnd",
224        "Cyberano_Ns:HeadEnd",
225        "Cyberano_Ns:Cap",
226        "Cyberano_Ns:RightForeArm",
227        "Cyberano_Ns:RightArmRoll",
228        "Cyberano_Ns:LeftForeArm",
229        "Cyberano_Ns:LeftArmRoll",
230        "Cyberano_Ns:LeftCloth02",
231        "Cyberano_Ns:MiddleCloth02",
232        "Cyberano_Ns:RightCloth02",
233        "Cyberano_Ns:Feather01",
234        "Cyberano_Ns:RightHand",
235        "Cyberano_Ns:RightForeArmRoll",
236        "Cyberano_Ns:LeftHand",
237        "Cyberano_Ns:LeftForeArmRoll",
238        "Cyberano_Ns:LeftCloth03",
239        "Cyberano_Ns:MiddleCloth03",
240        "Cyberano_Ns:RightCloth03",
241        "Cyberano_Ns:Feather02",
242        "Cyberano_Ns:RightThumb1",
243        "Cyberano_Ns:RightIndex1",
244        "Cyberano_Ns:RightMiddle1",
245        "Cyberano_Ns:RightRing1",
246        "Cyberano_Ns:RightCuff",
247        "Cyberano_Ns:LeftThumb1",
248        "Cyberano_Ns:LeftIndex1",
249        "Cyberano_Ns:LeftMiddle1",
250        "Cyberano_Ns:LeftRing1",
251        "Cyberano_Ns:LeftCloth04",
252        "Cyberano_Ns:MiddleCloth04",
253        "Cyberano_Ns:RightCloth04",
254        "Cyberano_Ns:Feather03",
255        "Cyberano_Ns:RightThumb2",
256        "Cyberano_Ns:RightIndex2",
257        "Cyberano_Ns:RightMiddle2",
258        "Cyberano_Ns:RightRing2",
259        "Cyberano_Ns:LeftThumb2",
260        "Cyberano_Ns:LeftIndex2",
261        "Cyberano_Ns:LeftMiddle2",
262        "Cyberano_Ns:LeftRing2",
263        "Cyberano_Ns:Feather04",
264        "Cyberano_Ns:RightThumb3",
265        "Cyberano_Ns:RightIndex3",
266        "Cyberano_Ns:RightMiddle3",
267        "Cyberano_Ns:RightRing3",
268        "Cyberano_Ns:LeftThumb3",
269        "Cyberano_Ns:LeftIndex3",
270        "Cyberano_Ns:LeftMiddle3",
271        "Cyberano_Ns:LeftRing3",
272        "Cyberano_Ns:Feather05",
273        "Cyberano_Ns:RightThumb4",
274        "Cyberano_Ns:RightIndex4",
275        "Cyberano_Ns:RightMiddle4",
276        "Cyberano_Ns:RightRing4",
277        "Cyberano_Ns:LeftThumb4",
278        "Cyberano_Ns:LeftIndex4",
279        "Cyberano_Ns:LeftMiddle4",
280        "Cyberano_Ns:LeftRing4",
281        "Cyberano_Ns:Feather06",
282        "Cyberano_Ns:Feather07",
283        "Cyberano_Ns:Feather08",
284        "Cyberano_Ns:Feather09",
285        "Cyberano_Ns:Feather10",
286        "Cyberano_Ns:Feather11",
287        "Cyberano_Ns:Feather12",
288        "Cyberano_Ns:Feather13",
289        "Cyberano_Ns:Feather14",
290        "Cyberano_Ns:Feather15",
291        "Cyberano_Ns:Feather16",
292        "Cyberano_Ns:Feather17" };
293
294        map<String, int> bones_map;
295        for (int i = 0; i < bones.Count(); ++i)
296            bones_map[bones[i]] = i;
297
298        for (int i = 0; i < bones.Count(); ++i)
299            lolunit_assert_equal(bones_map[bones[i]], i);
300    }
301};
302
303} /* namespace lol */
304
Note: See TracBrowser for help on using the repository browser.