1 /* 2 * PROJECT: ReactOS api tests 3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory 4 * PURPOSE: Test for CSimpleMap 5 * PROGRAMMER: Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com) 6 */ 7 8 #ifdef HAVE_APITEST 9 #include <apitest.h> 10 #else 11 #include "atltest.h" 12 #endif 13 14 #include <atlbase.h> 15 #include <atlsimpcoll.h> 16 17 struct CMonster 18 { 19 static int s_nCount; 20 static int s_nCopyCount; 21 22 CMonster() 23 { 24 CMonster::s_nCount++; 25 } 26 CMonster(const CMonster& c) 27 { 28 CMonster::s_nCount++; 29 } 30 ~CMonster() 31 { 32 CMonster::s_nCount--; 33 } 34 CMonster& operator=(const CMonster& other) 35 { 36 CMonster::s_nCopyCount++; 37 return *this; 38 } 39 }; 40 41 int CMonster::s_nCount = 0; 42 int CMonster::s_nCopyCount = 0; 43 44 START_TEST(CSimpleMap) 45 { 46 CSimpleMap<int, int> map1; 47 48 ok_int(map1.GetSize(), 0); 49 50 map1.Add(1, 2); 51 ok_int(map1.GetSize(), 1); 52 map1.Add(2, 3); 53 ok_int(map1.GetSize(), 2); 54 55 ok_int(map1.Lookup(1), 2); 56 ok_int(map1.Lookup(2), 3); 57 ok_int(map1.Lookup(-1), 0); 58 59 ok_int(map1.ReverseLookup(2), 1); 60 ok_int(map1.ReverseLookup(3), 2); 61 62 ok_int(map1.GetKeyAt(0), 1); 63 ok_int(map1.GetKeyAt(1), 2); 64 65 ok_int(map1.GetValueAt(0), 2); 66 ok_int(map1.GetValueAt(1), 3); 67 68 map1.SetAt(2, 4); 69 70 ok_int(map1.Lookup(1), 2); 71 ok_int(map1.Lookup(2), 4); 72 73 ok_int(map1.ReverseLookup(2), 1); 74 ok_int(map1.ReverseLookup(4), 2); 75 76 map1.Remove(1); 77 ok_int(map1.GetSize(), 1); 78 map1.Remove(2); 79 ok_int(map1.GetSize(), 0); 80 81 map1.Add(1, 4); 82 ok_int(map1.GetSize(), 1); 83 map1.Add(2, 8); 84 ok_int(map1.GetSize(), 2); 85 map1.Add(3, 12); 86 ok_int(map1.GetSize(), 3); 87 88 map1.RemoveAll(); 89 ok_int(map1.GetSize(), 0); 90 91 ok_int(CMonster::s_nCount, 0); 92 ok_int(CMonster::s_nCopyCount, 0); 93 94 CSimpleMap<CMonster, CMonster> map2; 95 ok_int(map2.GetSize(), 0); 96 97 ok_int(CMonster::s_nCount, 0); 98 ok_int(CMonster::s_nCopyCount, 0); 99 100 { 101 CMonster m1; 102 ok_int(CMonster::s_nCount, 1); 103 ok_int(CMonster::s_nCopyCount, 0); 104 105 CMonster m2; 106 ok_int(CMonster::s_nCount, 2); 107 ok_int(CMonster::s_nCopyCount, 0); 108 109 map2.Add(m1, m2); 110 ok_int(CMonster::s_nCount, 4); 111 ok_int(CMonster::s_nCopyCount, 0); 112 } 113 114 ok_int(map2.GetSize(), 1); 115 ok_int(CMonster::s_nCount, 2); 116 ok_int(CMonster::s_nCopyCount, 0); 117 118 { 119 CMonster m1; 120 ok_int(CMonster::s_nCount, 3); 121 ok_int(CMonster::s_nCopyCount, 0); 122 123 CMonster m2; 124 ok_int(CMonster::s_nCount, 4); 125 ok_int(CMonster::s_nCopyCount, 0); 126 127 map2.Add(m1, m2); 128 ok_int(CMonster::s_nCount, 6); 129 ok_int(CMonster::s_nCopyCount, 0); 130 } 131 132 ok_int(map2.GetSize(), 2); 133 ok_int(CMonster::s_nCount, 4); 134 ok_int(CMonster::s_nCopyCount, 0); 135 136 map2.RemoveAt(0); 137 ok_int(CMonster::s_nCount, 2); 138 ok_int(map2.GetSize(), 1); 139 ok_int(CMonster::s_nCopyCount, 0); 140 141 map2.RemoveAt(0); 142 ok_int(CMonster::s_nCount, 0); 143 ok_int(map2.GetSize(), 0); 144 ok_int(CMonster::s_nCopyCount, 0); 145 146 CSimpleMap<int, CMonster> map3; 147 ok_int(map3.GetSize(), 0); 148 149 CMonster m3; 150 ok_int(CMonster::s_nCount, 1); 151 152 map3.Add(1, m3); 153 ok_int(map3.GetSize(), 1); 154 ok_int(CMonster::s_nCount, 2); 155 156 map3.Add(2, m3); 157 ok_int(map3.GetSize(), 2); 158 ok_int(CMonster::s_nCount, 3); 159 160 map3.Add(3, m3); 161 ok_int(map3.GetSize(), 3); 162 ok_int(CMonster::s_nCount, 4); 163 164 map3.Remove(2); 165 ok_int(map3.GetSize(), 2); 166 ok_int(CMonster::s_nCount, 3); 167 168 map3.RemoveAll(); 169 ok_int(map3.GetSize(), 0); 170 ok_int(CMonster::s_nCount, 1); 171 172 map1.Add(1, 2); 173 ok_int(map1.GetSize(), 1); 174 map1.Add(2, 3); 175 ok_int(map1.GetSize(), 2); 176 177 ok(!!map1.RemoveAt(0), "Expected RemoveAt(0) to succeed\n"); 178 ok_int(map1.GetSize(), 1); 179 ok(!!map1.RemoveAt(0), "Expected RemoveAt(0) to succeed\n"); 180 ok_int(map1.GetSize(), 0); 181 } 182