Array.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. #include "pch.h"
  2. #define NO_MAIN
  3. #include "Array.h"
  4. #include "CppUnitTest.h"
  5. using namespace Microsoft::VisualStudio::CppUnitTestFramework;
  6. namespace FrameworkTests
  7. {
  8. TEST_CLASS (ArrayTests)
  9. {
  10. public:
  11. TEST_METHOD (EmtptyTest)
  12. {
  13. Framework::Array<int> array;
  14. Assert::IsTrue(array.getEntryCount() == 0,
  15. L"getEntryCount() on empty array should be 0");
  16. int count = 0;
  17. for (auto i : array)
  18. count++;
  19. Assert::IsTrue(count == 0,
  20. L"Iteration with : over an empty array should not do anything");
  21. auto end = array.end();
  22. Assert::IsFalse(array.begin() != end,
  23. L"Iterator of an empty array should not have an element");
  24. Assert::IsFalse(
  25. array.has(0), L"Empty Array should not have an element");
  26. }
  27. TEST_METHOD (AddTest)
  28. {
  29. Framework::Array<int> array;
  30. array.add(100);
  31. array.add(20, 1);
  32. array.add(10, 0);
  33. array.add(0);
  34. Assert::IsTrue(array.getEntryCount() == 4,
  35. L"after adding 4 elements getEntryCount() should be 4");
  36. Assert::IsTrue(array.get(0) == 10,
  37. L"invalid value at index 0 of array after adding elements");
  38. Assert::IsTrue(array.get(1) == 100,
  39. L"invalid value at index 1 of array after adding elements");
  40. Assert::IsTrue(array.get(2) == 20,
  41. L"invalid value at index 1 of array after adding elements");
  42. Assert::IsTrue(array.get(3) == 0,
  43. L"invalid value at index 1 of array after adding elements");
  44. auto i = array.begin();
  45. Assert::IsTrue(i.val() == 10,
  46. L"invalid value at index 0 of array after adding elements");
  47. i++;
  48. Assert::IsTrue(i.val() == 100,
  49. L"invalid value at index 1 of array after adding elements");
  50. ++i;
  51. Assert::IsTrue(i.val() == 20,
  52. L"invalid value at index 2 of array after adding elements");
  53. i = i.next();
  54. Assert::IsTrue(i.val() == 0,
  55. L"invalid value at index 3 of array after adding elements");
  56. Assert::IsFalse(i.hasNext(),
  57. L"Iterator has to much elements after adding elements to "
  58. L"array");
  59. auto end = array.end();
  60. Assert::IsFalse(++i != end,
  61. L"iterator should match end() after iterating throu the array");
  62. }
  63. TEST_METHOD (RemoveTest)
  64. {
  65. Framework::Array<int> array;
  66. array.add(100);
  67. array.add(20, 1);
  68. array.add(10, 0);
  69. array.add(0);
  70. array.remove(3);
  71. array.remove(1);
  72. array.begin().remove();
  73. array.add(30);
  74. (++array.begin()).remove();
  75. array.begin().remove();
  76. array.add(20);
  77. array.add(40);
  78. Assert::IsTrue(array.getEntryCount() == 2,
  79. L"after adding 7 elements and removing 5 elements "
  80. L"getEntryCount() should be 2");
  81. Assert::IsTrue(array.get(0) == 20,
  82. L"invalid value at index 0 of array after removing elements");
  83. Assert::IsTrue(array.get(1) == 40,
  84. L"invalid value at index 1 of array after removing elements");
  85. Assert::IsTrue(array.begin().val() == 20,
  86. L"invalid value at index 0 of array after removing elements");
  87. Assert::IsTrue(array.begin().next().val() == 40,
  88. L"invalid value at index 1 of array after removing elements");
  89. Assert::IsFalse(array.begin().next().hasNext(),
  90. L"Iterator has to many elements after removing elements");
  91. auto end = array.end();
  92. Assert::IsFalse(array.begin().next().next() != end,
  93. L"Iterator has to many elements after removing elements");
  94. array.clear();
  95. Assert::IsTrue(array.getEntryCount() == 0,
  96. L"getEntryCount() should be 0 after the array was cleared");
  97. }
  98. TEST_METHOD (SwapTest)
  99. {
  100. Framework::Array<int> array;
  101. array.add(100);
  102. array.add(20, 1);
  103. array.add(10, 0);
  104. array.add(0);
  105. array.swap(0, 3);
  106. array.swap(1, 2);
  107. Assert::IsTrue(array.getEntryCount() == 4,
  108. L"after adding 4 elements and swap elements getEntryCount() "
  109. L"should be 4");
  110. Assert::IsTrue(array.get(0) == 0,
  111. L"invalid value at index 0 of array after swapping elements");
  112. Assert::IsTrue(array.get(1) == 20,
  113. L"invalid value at index 1 of array after swapping elements");
  114. Assert::IsTrue(array.get(2) == 100,
  115. L"invalid value at index 2 of array after swapping elements");
  116. Assert::IsTrue(array.get(3) == 10,
  117. L"invalid value at index 3 of array after swapping elements");
  118. array.swap(2, 0);
  119. Assert::IsTrue(array.get(2) == 0,
  120. L"invalid value at index 2 of array after swapping elements");
  121. Assert::IsTrue(array.get(0) == 100,
  122. L"invalid value at index 0 of array after swapping elements");
  123. }
  124. TEST_METHOD (SetTest)
  125. {
  126. Framework::Array<int> array;
  127. array.add(100);
  128. array.add(20, 1);
  129. array.add(10, 0);
  130. array.add(0);
  131. array.set(30, 0);
  132. array.set(200, 3);
  133. array.set(500, 1);
  134. Assert::IsTrue(array.getEntryCount() == 4,
  135. L"after adding 4 elements and changing elements "
  136. L"getEntryCount() should be 4");
  137. Assert::IsTrue(array.get(0) == 30,
  138. L"invalid value at index 0 of array after swapping elements");
  139. Assert::IsTrue(array.get(1) == 500,
  140. L"invalid value at index 1 of array after swapping elements");
  141. Assert::IsTrue(array.get(2) == 20,
  142. L"invalid value at index 2 of array after swapping elements");
  143. Assert::IsTrue(array.get(3) == 200,
  144. L"invalid value at index 3 of array after swapping elements");
  145. }
  146. TEST_METHOD (ValueTest)
  147. {
  148. Framework::Array<int> array;
  149. array.add(100);
  150. array.add(20, 1);
  151. array.add(10, 0);
  152. array.add(0);
  153. array.removeValue(10);
  154. Assert::IsTrue(array.getEntryCount() == 3,
  155. L"after adding 4 elements and removing elements by value "
  156. L"getEntryCount() should be 3");
  157. Assert::IsTrue(array.getValueIndex(0) == 2,
  158. L"invalid value index of value after removing elements");
  159. Assert::IsTrue(array.getValueIndex(10) < 0,
  160. L"value is still in array after removeValue");
  161. }
  162. };
  163. template<typename T> class Test : public Framework::ReferenceCounter
  164. {
  165. int val = 0;
  166. T* tc;
  167. public:
  168. Test(const int v, T* tc)
  169. : ReferenceCounter(),
  170. val(v),
  171. tc(tc)
  172. {}
  173. ~Test()
  174. {
  175. tc->deleteCounter++;
  176. }
  177. operator int()
  178. {
  179. return val;
  180. }
  181. int getVal()
  182. {
  183. return val;
  184. }
  185. };
  186. TEST_CLASS (RCArrayTests)
  187. {
  188. public:
  189. int deleteCounter = 0;
  190. TEST_METHOD_INITIALIZE(InitTest)
  191. {
  192. deleteCounter = 0;
  193. }
  194. TEST_METHOD (EmtptyTest)
  195. {
  196. Framework::RCArray<Test<RCArrayTests>> array;
  197. Assert::IsTrue(array.getEntryCount() == 0,
  198. L"getEntryCount() on empty array should be 0");
  199. int count = 0;
  200. for (auto i : array)
  201. count++;
  202. Assert::IsTrue(count == 0,
  203. L"Iteration with : over an empty array should not do anything");
  204. auto end = array.end();
  205. Assert::IsFalse(array.begin() != end,
  206. L"Iterator of an empty array should not have an element");
  207. Assert::IsFalse(
  208. array.has(0), L"Empty Array should not have an element");
  209. }
  210. TEST_METHOD (AddTest)
  211. {
  212. Framework::RCArray<Test<RCArrayTests>> array;
  213. array.add(new Test<RCArrayTests>(100, this));
  214. array.add(new Test<RCArrayTests>(20, this), 1);
  215. array.add(new Test<RCArrayTests>(10, this), 0);
  216. array.add(new Test<RCArrayTests>(0, this));
  217. Assert::IsTrue(array.getEntryCount() == 4,
  218. L"after adding 4 elements getEntryCount() should be 4");
  219. Assert::IsTrue((int)*array.z(0) == 10,
  220. L"invalid value at index 0 of array after adding elements");
  221. Assert::IsTrue((int)*array.z(1) == 100,
  222. L"invalid value at index 1 of array after adding elements");
  223. Assert::IsTrue((int)*array.z(2) == 20,
  224. L"invalid value at index 1 of array after adding elements");
  225. Assert::IsTrue((int)*array.z(3) == 0,
  226. L"invalid value at index 1 of array after adding elements");
  227. auto i = array.begin();
  228. Assert::IsTrue(i->getVal() == 10,
  229. L"invalid value at index 0 of array after adding elements");
  230. i++;
  231. Assert::IsTrue(i->getVal() == 100,
  232. L"invalid value at index 1 of array after adding elements");
  233. ++i;
  234. Assert::IsTrue(i->getVal() == 20,
  235. L"invalid value at index 2 of array after adding elements");
  236. i = i.next();
  237. Assert::IsTrue(i->getVal() == 0,
  238. L"invalid value at index 3 of array after adding elements");
  239. Assert::IsFalse(i.hasNext(),
  240. L"Iterator has to much elements after adding elements to "
  241. L"array");
  242. auto end = array.end();
  243. Assert::IsFalse(++i != end,
  244. L"iterator should match end() after iterating throu the array");
  245. array.clear();
  246. Assert::IsTrue(deleteCounter == 4, L"Memory leaks detected");
  247. }
  248. TEST_METHOD (RemoveTest)
  249. {
  250. Framework::RCArray<Test<RCArrayTests>> array;
  251. array.add(new Test<RCArrayTests>(100, this));
  252. array.add(new Test<RCArrayTests>(20, this), 1);
  253. array.add(new Test<RCArrayTests>(10, this), 0);
  254. array.add(new Test<RCArrayTests>(0, this));
  255. array.remove(3);
  256. array.remove(1);
  257. array.begin().remove();
  258. array.add(new Test<RCArrayTests>(30, this));
  259. (++array.begin()).remove();
  260. array.begin().remove();
  261. array.add(new Test<RCArrayTests>(20, this));
  262. array.add(new Test<RCArrayTests>(40, this));
  263. Assert::IsTrue(array.getEntryCount() == 2,
  264. L"after adding 7 elements and removing 5 elements "
  265. L"getEntryCount() should be 2");
  266. Assert::IsTrue((int)*array.z(0) == 20,
  267. L"invalid value at index 0 of array after removing elements");
  268. Assert::IsTrue((int)*array.z(1) == 40,
  269. L"invalid value at index 1 of array after removing elements");
  270. Assert::IsTrue(array.begin()->getVal() == 20,
  271. L"invalid value at index 0 of array after removing elements");
  272. Assert::IsTrue(array.begin().next()->getVal() == 40,
  273. L"invalid value at index 1 of array after removing elements");
  274. Assert::IsFalse(array.begin().next().hasNext(),
  275. L"Iterator has to many elements after removing elements");
  276. auto end = array.end();
  277. Assert::IsFalse(array.begin().next().next() != end,
  278. L"Iterator has to many elements after removing elements");
  279. Assert::IsTrue(deleteCounter == 5, L"Memory leaks detected");
  280. array.clear();
  281. Assert::IsTrue(deleteCounter == 7, L"Memory leaks detected");
  282. }
  283. TEST_METHOD (SwapTest)
  284. {
  285. Framework::RCArray<Test<RCArrayTests>> array;
  286. array.add(new Test<RCArrayTests>(100, this));
  287. array.add(new Test<RCArrayTests>(20, this), 1);
  288. array.add(new Test<RCArrayTests>(10, this), 0);
  289. array.add(new Test<RCArrayTests>(0, this));
  290. array.swap(0, 3);
  291. array.swap(1, 2);
  292. Assert::IsTrue(array.getEntryCount() == 4,
  293. L"after adding 4 elements and swap elements getEntryCount() "
  294. L"should be 4");
  295. Assert::IsTrue((int)*array.z(0) == 0,
  296. L"invalid value at index 0 of array after swapping elements");
  297. Assert::IsTrue((int)*array.z(1) == 20,
  298. L"invalid value at index 1 of array after swapping elements");
  299. Assert::IsTrue((int)*array.z(2) == 100,
  300. L"invalid value at index 2 of array after swapping elements");
  301. Assert::IsTrue((int)*array.z(3) == 10,
  302. L"invalid value at index 3 of array after swapping elements");
  303. array.swap(2, 0);
  304. Assert::IsTrue((int)*array.z(2) == 0,
  305. L"invalid value at index 2 of array after swapping elements");
  306. Assert::IsTrue((int)*array.z(0) == 100,
  307. L"invalid value at index 0 of array after swapping elements");
  308. Assert::IsTrue(array.getEntryCount() == 4,
  309. L"invalid value count in array after swapping elements");
  310. array.clear();
  311. Assert::IsTrue(deleteCounter == 4, L"Memory leaks detected");
  312. }
  313. TEST_METHOD (SetTest)
  314. {
  315. Framework::RCArray<Test<RCArrayTests>> array;
  316. array.add(new Test<RCArrayTests>(100, this));
  317. array.add(new Test<RCArrayTests>(20, this), 1);
  318. array.add(new Test<RCArrayTests>(10, this), 0);
  319. array.add(new Test<RCArrayTests>(0, this));
  320. array.set(new Test<RCArrayTests>(30, this), 0);
  321. array.set(new Test<RCArrayTests>(200, this), 3);
  322. array.set(new Test<RCArrayTests>(500, this), 1);
  323. Assert::IsTrue(array.getEntryCount() == 4,
  324. L"after adding 4 elements and changing elements "
  325. L"getEntryCount() should be 4");
  326. Assert::IsTrue((int)*array.z(0) == 30,
  327. L"invalid value at index 0 of array after swapping elements");
  328. Assert::IsTrue((int)*array.z(1) == 500,
  329. L"invalid value at index 1 of array after swapping elements");
  330. Assert::IsTrue((int)*array.z(2) == 20,
  331. L"invalid value at index 2 of array after swapping elements");
  332. Assert::IsTrue((int)*array.z(3) == 200,
  333. L"invalid value at index 3 of array after swapping elements");
  334. Assert::IsTrue(deleteCounter == 3, L"Memory leaks detected");
  335. array.clear();
  336. Assert::IsTrue(deleteCounter == 7, L"Memory leaks detected");
  337. }
  338. TEST_METHOD (IteratorTest)
  339. {
  340. Framework::RCArray<Test<RCArrayTests>> array;
  341. array.add(new Test<RCArrayTests>(100, this));
  342. array.begin().remove();
  343. Assert::IsTrue(array.getEntryCount() == 0,
  344. L"after adding 1 element and removing it "
  345. L"getEntryCount() should be 0");
  346. array.add(new Test<RCArrayTests>(100, this));
  347. array.add(new Test<RCArrayTests>(20, this), 1);
  348. array.add(new Test<RCArrayTests>(10, this), 0);
  349. array.add(new Test<RCArrayTests>(0, this));
  350. auto i = array.begin();
  351. Assert::IsTrue(i->getVal() == 10,
  352. L"invalid value at index 0 of array after adding elements");
  353. Assert::IsTrue(i.hasNext(), L"No next element after first element");
  354. Assert::IsTrue((++i)->getVal() == 100,
  355. L"invalid value at index 1 of array after adding elements");
  356. Assert::IsTrue(
  357. i.hasNext(), L"No next element after second element");
  358. Assert::IsTrue((++i)->getVal() == 20,
  359. L"invalid value at index 2 of array after adding elements");
  360. Assert::IsTrue(i.hasNext(), L"No next element after third element");
  361. Assert::IsTrue((++i)->getVal() == 0,
  362. L"invalid value at index 3 of array after adding elements");
  363. Assert::IsFalse(i.hasNext(), L"Next element after last element");
  364. i = array.begin();
  365. int count = 4;
  366. while (i)
  367. {
  368. i.remove();
  369. Assert::IsTrue(array.getEntryCount() == --count,
  370. L"after removing 1 element "
  371. L"getEntryCount() should be reduced");
  372. }
  373. Assert::IsTrue(deleteCounter == 5, L"Memory leaks detected");
  374. }
  375. TEST_METHOD (MoveTest)
  376. {
  377. Framework::RCArray<Test<RCArrayTests>> array;
  378. array.add(new Test<RCArrayTests>(100, this));
  379. array.add(new Test<RCArrayTests>(20, this));
  380. array.setPosition(0, 1);
  381. array.add(new Test<RCArrayTests>(10, this));
  382. Assert::IsTrue(array.getEntryCount() == 3,
  383. L"after adding 3 elements "
  384. L"getEntryCount() should be 0");
  385. Assert::IsTrue(array.z(2)->getVal() == 10,
  386. L"third element of array has an invalid value");
  387. }
  388. };
  389. } // namespace FrameworkTests