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

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

map: more bug fixes (still not fully fixed…)

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
File size: 8.7 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        unsigned char presence[256];
119        unsigned 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 < 198 ; ++i)
127        {
128            // debug output
129            // std::cout << "i " << i << ", a " << (int)a << ", b " << (int)b  << std::endl;
130
131            m[a] = b;
132            m.remove(b);
133
134            presence[a] = 1;
135            value[a] = b;
136            presence[b] = 0;
137
138            a = a * b + c;
139            b = b * c + a;
140            c = c * a + b;
141
142            for (int j = 0 ; j < 256 ; ++j)
143            {
144                unsigned char v;
145                if (presence[j])
146                {
147                    // debug output
148                    // std::cout << "j " << j << " v " << (int)v << std::endl;
149                    lolunit_assert(m.try_get(j, v));
150                    lolunit_assert_equal(value[j], v);
151                }
152                else
153                {
154                    lolunit_assert(!m.try_get(j, v));
155                }
156            }
157        }
158    }
159
160    // lolunit_declare_test(StringMap)
161    // {
162    //     map<char const *, int> m;
163
164    //     m["foo"] = 42;
165    //     m["bar"] = 12;
166    //     m["baz"] = 2;
167
168    //     int foo = m["foo"];
169    //     int bar = m["bar"];
170    //     int baz = m["baz"];
171
172    //     lolunit_assert_equal(42, foo);
173    //     lolunit_assert_equal(12, bar);
174    //     lolunit_assert_equal(2, baz);
175
176    //     //Big stress test
177    //     array<String> bones = { "RootNode",
178    //     "Cyberano_Ns:Root_$AssimpFbx$_Translation",
179    //     "Cyberano_Ns:Box004_$AssimpFbx$_PreRotation",
180    //     "Cyberano_Ns:Root_$AssimpFbx$_PreRotation",
181    //     "Cyberano_Ns:Box004",
182    //     "Cyberano_Ns:Root_$AssimpFbx$_Rotation",
183    //     "Cyberano_Ns:Root",
184    //     "Cyberano_Ns:Hips",
185    //     "Cyberano_Ns:Spine",
186    //     "Cyberano_Ns:RightUpLeg",
187    //     "Cyberano_Ns:LeftUpLeg",
188    //     "Cyberano_Ns:BeltSheath1",
189    //     "Cyberano_Ns:RightCoat",
190    //     "Cyberano_Ns:LeftCoat",
191    //     "Cyberano_Ns:Spine1",
192    //     "Cyberano_Ns:RightLeg",
193    //     "Cyberano_Ns:RightUpLegRoll",
194    //     "Cyberano_Ns:LeftUpLegRoll",
195    //     "Cyberano_Ns:LeftLeg",
196    //     "Cyberano_Ns:Sheath",
197    //     "Cyberano_Ns:BeltSheath2",
198    //     "Cyberano_Ns:BeltSheath3",
199    //     "Cyberano_Ns:Spine2",
200    //     "Cyberano_Ns:FrontBelt1",
201    //     "Cyberano_Ns:BackBelt1",
202    //     "Cyberano_Ns:RightFoot",
203    //     "Cyberano_Ns:RightLegRoll",
204    //     "Cyberano_Ns:LeftLegRoll",
205    //     "Cyberano_Ns:LeftFoot",
206    //     "Cyberano_Ns:Sword",
207    //     "Cyberano_Ns:Neck",
208    //     "Cyberano_Ns:RightShoulder",
209    //     "Cyberano_Ns:LeftShoulder",
210    //     "Cyberano_Ns:Cloth",
211    //     "Cyberano_Ns:FrontBelt2",
212    //     "Cyberano_Ns:RightToeBase",
213    //     "Cyberano_Ns:LeftToeBase",
214    //     "Cyberano_Ns:Head",
215    //     "Cyberano_Ns:RightArm",
216    //     "Cyberano_Ns:RightSpaulder1",
217    //     "Cyberano_Ns:RightSpaulder2",
218    //     "Cyberano_Ns:LeftArm",
219    //     "Cyberano_Ns:LeftSpaulder1",
220    //     "Cyberano_Ns:LeftCloth01",
221    //     "Cyberano_Ns:MiddleCloth01",
222    //     "Cyberano_Ns:RightCloth01",
223    //     "Cyberano_Ns:FrontBelt3",
224    //     "Cyberano_Ns:RightoeEnd",
225    //     "Cyberano_Ns:LeftoeEnd",
226    //     "Cyberano_Ns:HeadEnd",
227    //     "Cyberano_Ns:Cap",
228    //     "Cyberano_Ns:RightForeArm",
229    //     "Cyberano_Ns:RightArmRoll",
230    //     "Cyberano_Ns:LeftForeArm",
231    //     "Cyberano_Ns:LeftArmRoll",
232    //     "Cyberano_Ns:LeftCloth02",
233    //     "Cyberano_Ns:MiddleCloth02",
234    //     "Cyberano_Ns:RightCloth02",
235    //     "Cyberano_Ns:Feather01",
236    //     "Cyberano_Ns:RightHand",
237    //     "Cyberano_Ns:RightForeArmRoll",
238    //     "Cyberano_Ns:LeftHand",
239    //     "Cyberano_Ns:LeftForeArmRoll",
240    //     "Cyberano_Ns:LeftCloth03",
241    //     "Cyberano_Ns:MiddleCloth03",
242    //     "Cyberano_Ns:RightCloth03",
243    //     "Cyberano_Ns:Feather02",
244    //     "Cyberano_Ns:RightThumb1",
245    //     "Cyberano_Ns:RightIndex1",
246    //     "Cyberano_Ns:RightMiddle1",
247    //     "Cyberano_Ns:RightRing1",
248    //     "Cyberano_Ns:RightCuff",
249    //     "Cyberano_Ns:LeftThumb1",
250    //     "Cyberano_Ns:LeftIndex1",
251    //     "Cyberano_Ns:LeftMiddle1",
252    //     "Cyberano_Ns:LeftRing1",
253    //     "Cyberano_Ns:LeftCloth04",
254    //     "Cyberano_Ns:MiddleCloth04",
255    //     "Cyberano_Ns:RightCloth04",
256    //     "Cyberano_Ns:Feather03",
257    //     "Cyberano_Ns:RightThumb2",
258    //     "Cyberano_Ns:RightIndex2",
259    //     "Cyberano_Ns:RightMiddle2",
260    //     "Cyberano_Ns:RightRing2",
261    //     "Cyberano_Ns:LeftThumb2",
262    //     "Cyberano_Ns:LeftIndex2",
263    //     "Cyberano_Ns:LeftMiddle2",
264    //     "Cyberano_Ns:LeftRing2",
265    //     "Cyberano_Ns:Feather04",
266    //     "Cyberano_Ns:RightThumb3",
267    //     "Cyberano_Ns:RightIndex3",
268    //     "Cyberano_Ns:RightMiddle3",
269    //     "Cyberano_Ns:RightRing3",
270    //     "Cyberano_Ns:LeftThumb3",
271    //     "Cyberano_Ns:LeftIndex3",
272    //     "Cyberano_Ns:LeftMiddle3",
273    //     "Cyberano_Ns:LeftRing3",
274    //     "Cyberano_Ns:Feather05",
275    //     "Cyberano_Ns:RightThumb4",
276    //     "Cyberano_Ns:RightIndex4",
277    //     "Cyberano_Ns:RightMiddle4",
278    //     "Cyberano_Ns:RightRing4",
279    //     "Cyberano_Ns:LeftThumb4",
280    //     "Cyberano_Ns:LeftIndex4",
281    //     "Cyberano_Ns:LeftMiddle4",
282    //     "Cyberano_Ns:LeftRing4",
283    //     "Cyberano_Ns:Feather06",
284    //     "Cyberano_Ns:Feather07",
285    //     "Cyberano_Ns:Feather08",
286    //     "Cyberano_Ns:Feather09",
287    //     "Cyberano_Ns:Feather10",
288    //     "Cyberano_Ns:Feather11",
289    //     "Cyberano_Ns:Feather12",
290    //     "Cyberano_Ns:Feather13",
291    //     "Cyberano_Ns:Feather14",
292    //     "Cyberano_Ns:Feather15",
293    //     "Cyberano_Ns:Feather16",
294    //     "Cyberano_Ns:Feather17" };
295
296    //     map<String, int> bones_map;
297    //     for (int i = 0; i < bones.Count(); ++i)
298    //         bones_map[bones[i]] = i;
299
300    //     for (int i = 0; i < bones.Count(); ++i)
301    //         lolunit_assert_equal(bones_map[bones[i]], i);
302    // }
303};
304
305} /* namespace lol */
306
Note: See TracBrowser for help on using the repository browser.