// Copyright (c) Wojciech Figat. All rights reserved. #include "Engine/Core/RandomStream.h" #include "Engine/Core/Collections/Array.h" #include "Engine/Core/Collections/BitArray.h" #include "Engine/Core/Collections/HashSet.h" #include "Engine/Core/Collections/Dictionary.h" #include const bool TestBits[] = { true, false, true, false }; template void InitBitArray(BitArray& array) { array.Add(TestBits, ARRAY_COUNT(TestBits)); } template void CheckBitArray(const BitArray& array) { CHECK(array.Count() == ARRAY_COUNT(TestBits)); for (int32 i = 0; i < ARRAY_COUNT(TestBits); i++) { CHECK(array[i] == TestBits[i]); } } TEST_CASE("Array") { SECTION("Test Allocators") { Array a1; Array> a2; Array> a3; for (int32 i = 0; i < 7; i++) { a1.Add(i); a2.Add(i); a3.Add(i); } CHECK(a1.Count() == 7); CHECK(a2.Count() == 7); CHECK(a3.Count() == 7); for (int32 i = 0; i < 7; i++) { CHECK(a1[i] == i); CHECK(a2[i] == i); CHECK(a3[i] == i); } } // Generate some random data for testing Array testData; testData.Resize(32); RandomStream rand(101); for (int32 i = 0; i < testData.Count(); i++) testData[i] = rand.GetUnsignedInt(); SECTION("Test Copy Constructor") { const Array a1(testData); const Array> a2(testData); const Array> a3(testData); const Array> a4(testData); CHECK(a1 == testData); CHECK(a2 == testData); CHECK(a3 == testData); CHECK(a4 == testData); } SECTION("Test Copy Operator") { Array a1; a1 = testData; CHECK(a1 == testData); } } TEST_CASE("BitArray") { SECTION("Test Allocators") { BitArray<> a1; BitArray> a2; BitArray> a3; for (int32 i = 0; i < 7; i++) { const bool v = i & 2; a1.Add(v); a2.Add(v); a3.Add(v); } CHECK(a1.Count() == 7); CHECK(a2.Count() == 7); CHECK(a3.Count() == 7); for (int32 i = 0; i < 7; i++) { const bool v = i & 2; CHECK(a1.Get(i) == v); CHECK(a2.Get(i) == v); CHECK(a3.Get(i) == v); } } SECTION("Test Move/Copy") { BitArray<> array1; BitArray> array2; BitArray> array3; BitArray> array4; InitBitArray(array1); InitBitArray(array2); InitBitArray(array3); InitBitArray(array4); CheckBitArray(array1); CheckBitArray(array2); CheckBitArray(array3); CheckBitArray(array4); BitArray<> arrayClone1 = array1; BitArray> arrayClone2(array1); BitArray> arrayClone3(MoveTemp(array1)); BitArray<> arrayClone4(MoveTemp(array1)); BitArray> arrayClone5 = MoveTemp(array2); BitArray> arrayClone6 = MoveTemp(array3); BitArray> arrayClone7 = MoveTemp(array4); CheckBitArray(arrayClone1); CheckBitArray(arrayClone2); CheckBitArray(arrayClone4); CheckBitArray(arrayClone5); CheckBitArray(arrayClone6); CheckBitArray(arrayClone7); CHECK(array1.Count() == 0); CHECK(array2.Count() == 0); CHECK(array3.Count() == 0); CHECK(array4.Count() == 0); } // Generate some random data for testing BitArray<> testData; testData.Resize(32); RandomStream rand(101); for (int32 i = 0; i < testData.Count(); i++) testData.Set(i, rand.GetBool()); SECTION("Test Copy Constructor") { const BitArray<> a1(testData); const BitArray> a2(testData); const BitArray> a3(testData); const BitArray> a4(testData); CHECK(a1 == testData); CHECK(a2 == testData); CHECK(a3 == testData); CHECK(a4 == testData); } SECTION("Test Copy Operator") { BitArray<> a1; a1 = testData; CHECK(a1 == testData); } SECTION("Test Set All") { BitArray<> a1; a1.Resize(9); CHECK(a1.Count() == 9); a1.SetAll(true); for (int32 i = 0; i < a1.Count(); i++) CHECK(a1[i] == true); a1.SetAll(false); for (int32 i = 0; i < a1.Count(); i++) CHECK(a1[i] == false); } } TEST_CASE("HashSet") { SECTION("Test Allocators") { HashSet a1; HashSet> a2; HashSet> a3; for (int32 i = 0; i < 7; i++) { a1.Add(i); a2.Add(i); a3.Add(i); } CHECK(a1.Count() == 7); CHECK(a2.Count() == 7); CHECK(a3.Count() == 7); for (int32 i = 0; i < 7; i++) { CHECK(a1.Contains(i)); CHECK(a2.Contains(i)); CHECK(a3.Contains(i)); } } SECTION("Test Resizing") { HashSet a1; for (int32 i = 0; i < 4000; i++) a1.Add(i); CHECK(a1.Count() == 4000); int32 capacity = a1.Capacity(); for (int32 i = 0; i < 4000; i++) { CHECK(a1.Contains(i)); } a1.Clear(); CHECK(a1.Count() == 0); CHECK(a1.Capacity() == capacity); for (int32 i = 0; i < 4000; i++) a1.Add(i); CHECK(a1.Count() == 4000); CHECK(a1.Capacity() == capacity); for (int32 i = 0; i < 4000; i++) a1.Remove(i); CHECK(a1.Count() == 0); CHECK(a1.Capacity() == capacity); for (int32 i = 0; i < 4000; i++) a1.Add(i); CHECK(a1.Count() == 4000); CHECK(a1.Capacity() == capacity); } SECTION("Test Default Capacity") { HashSet a1; a1.Add(1); CHECK(a1.Capacity() <= HASH_SET_DEFAULT_CAPACITY); } SECTION("Test Add/Remove") { HashSet a1; for (int32 i = 0; i < 4000; i++) { a1.Add(i); a1.Remove(i); } CHECK(a1.Count() == 0); CHECK(a1.Capacity() <= HASH_SET_DEFAULT_CAPACITY); a1.Clear(); for (int32 i = 1; i <= 10; i++) a1.Add(-i); for (int32 i = 0; i < 4000; i++) { a1.Add(i); a1.Remove(i); } CHECK(a1.Count() == 10); CHECK(a1.Capacity() <= HASH_SET_DEFAULT_CAPACITY); } } TEST_CASE("Dictionary") { SECTION("Test Allocators") { Dictionary a1; Dictionary> a2; Dictionary> a3; for (int32 i = 0; i < 7; i++) { a1.Add(i, i); a2.Add(i, i); a3.Add(i, i); } CHECK(a1.Count() == 7); CHECK(a2.Count() == 7); CHECK(a3.Count() == 7); for (int32 i = 0; i < 7; i++) { CHECK(a1.ContainsKey(i)); CHECK(a2.ContainsKey(i)); CHECK(a3.ContainsKey(i)); CHECK(a1.ContainsValue(i)); CHECK(a2.ContainsValue(i)); CHECK(a3.ContainsValue(i)); } } SECTION("Test Resizing") { Dictionary a1; for (int32 i = 0; i < 4000; i++) a1.Add(i, i); CHECK(a1.Count() == 4000); int32 capacity = a1.Capacity(); for (int32 i = 0; i < 4000; i++) { CHECK(a1.ContainsKey(i)); CHECK(a1.ContainsValue(i)); } a1.Clear(); CHECK(a1.Count() == 0); CHECK(a1.Capacity() == capacity); for (int32 i = 0; i < 4000; i++) a1.Add(i, i); CHECK(a1.Count() == 4000); CHECK(a1.Capacity() == capacity); for (int32 i = 0; i < 4000; i++) a1.Remove(i); CHECK(a1.Count() == 0); CHECK(a1.Capacity() == capacity); for (int32 i = 0; i < 4000; i++) a1.Add(i, i); CHECK(a1.Count() == 4000); CHECK(a1.Capacity() == capacity); } SECTION("Test Default Capacity") { Dictionary a1; a1.Add(1, 1); CHECK(a1.Capacity() <= HASH_SET_DEFAULT_CAPACITY); } SECTION("Test Add/Remove") { Dictionary a1; for (int32 i = 0; i < 4000; i++) { a1.Add(i, i); a1.Remove(i); } CHECK(a1.Count() == 0); CHECK(a1.Capacity() <= HASH_SET_DEFAULT_CAPACITY); a1.Clear(); for (int32 i = 1; i <= 10; i++) a1.Add(-i, -i); for (int32 i = 0; i < 4000; i++) { a1.Add(i, i); a1.Remove(i); } CHECK(a1.Count() == 10); CHECK(a1.Capacity() <= HASH_SET_DEFAULT_CAPACITY); } }