12f083884Ss.makeev_local // The MIT License (MIT)
22f083884Ss.makeev_local //
32f083884Ss.makeev_local // 	Copyright (c) 2015 Sergey Makeev, Vadim Slyusarev
42f083884Ss.makeev_local //
52f083884Ss.makeev_local // 	Permission is hereby granted, free of charge, to any person obtaining a copy
62f083884Ss.makeev_local // 	of this software and associated documentation files (the "Software"), to deal
72f083884Ss.makeev_local // 	in the Software without restriction, including without limitation the rights
82f083884Ss.makeev_local // 	to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
92f083884Ss.makeev_local // 	copies of the Software, and to permit persons to whom the Software is
102f083884Ss.makeev_local // 	furnished to do so, subject to the following conditions:
112f083884Ss.makeev_local //
122f083884Ss.makeev_local //  The above copyright notice and this permission notice shall be included in
132f083884Ss.makeev_local // 	all copies or substantial portions of the Software.
142f083884Ss.makeev_local //
152f083884Ss.makeev_local // 	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
162f083884Ss.makeev_local // 	IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
172f083884Ss.makeev_local // 	FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
182f083884Ss.makeev_local // 	AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
192f083884Ss.makeev_local // 	LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
202f083884Ss.makeev_local // 	OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
212f083884Ss.makeev_local // 	THE SOFTWARE.
222f083884Ss.makeev_local 
232f083884Ss.makeev_local #include "Tests.h"
242f083884Ss.makeev_local #include <UnitTest++.h>
252f083884Ss.makeev_local #include <MTScheduler.h>
2660ac17fbSs.makeev_local #include <MTQueueMPMC.h>
272f083884Ss.makeev_local #include <MTConcurrentRingBuffer.h>
282f083884Ss.makeev_local #include <MTArrayView.h>
29*b23bdf5aSs.makeev_local #include <MTStaticVector.h>
302f083884Ss.makeev_local 
SUITE(FoundationTests)312f083884Ss.makeev_local SUITE(FoundationTests)
322f083884Ss.makeev_local {
332f083884Ss.makeev_local 
342f083884Ss.makeev_local 
352f083884Ss.makeev_local ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
362f083884Ss.makeev_local TEST(RingBufferTest)
372f083884Ss.makeev_local {
382f083884Ss.makeev_local 	MT::ConcurrentRingBuffer<int, 32> ringBuffer;
392f083884Ss.makeev_local 
402f083884Ss.makeev_local 	ringBuffer.Push(-1);
412f083884Ss.makeev_local 	ringBuffer.Push(1);
422f083884Ss.makeev_local 
432f083884Ss.makeev_local 	int tempData[32];
442f083884Ss.makeev_local 	size_t elementsCount = ringBuffer.PopAll(tempData, MT_ARRAY_SIZE(tempData));
452f083884Ss.makeev_local 	CHECK_EQUAL(elementsCount, (size_t)2);
462f083884Ss.makeev_local 
472f083884Ss.makeev_local 	CHECK_EQUAL(tempData[0], -1);
482f083884Ss.makeev_local 	CHECK_EQUAL(tempData[1], 1);
492f083884Ss.makeev_local 
502f083884Ss.makeev_local 	int j;
512f083884Ss.makeev_local 	for(j = 0; j < 507; j++)
522f083884Ss.makeev_local 	{
532f083884Ss.makeev_local 		ringBuffer.Push(3 + j);
542f083884Ss.makeev_local 	}
552f083884Ss.makeev_local 
562f083884Ss.makeev_local 	elementsCount = ringBuffer.PopAll(tempData, MT_ARRAY_SIZE(tempData));
572f083884Ss.makeev_local 	CHECK_EQUAL(elementsCount, (size_t)32);
582f083884Ss.makeev_local 
592f083884Ss.makeev_local 	size_t i;
602f083884Ss.makeev_local 	for(i = 0; i < elementsCount; i++)
612f083884Ss.makeev_local 	{
622f083884Ss.makeev_local 		CHECK_EQUAL(tempData[i], (int)((507+3-32) + i));
632f083884Ss.makeev_local 	}
642f083884Ss.makeev_local 
652f083884Ss.makeev_local }
662f083884Ss.makeev_local ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
672f083884Ss.makeev_local TEST(StackArrayTest)
682f083884Ss.makeev_local {
692f083884Ss.makeev_local 	const int elementsCount = 128;
702f083884Ss.makeev_local 
71*b23bdf5aSs.makeev_local 	MT::StaticVector<int, elementsCount> stackArray;
722f083884Ss.makeev_local 
732f083884Ss.makeev_local 	CHECK(stackArray.IsEmpty() == true);
742f083884Ss.makeev_local 
752f083884Ss.makeev_local 	stackArray.PushBack(200);
762f083884Ss.makeev_local 	CHECK(stackArray.IsEmpty() == false);
772f083884Ss.makeev_local 	CHECK_EQUAL(stackArray.Size(), (size_t)1);
782f083884Ss.makeev_local 
792f083884Ss.makeev_local 	for(int i = 1; i < elementsCount; i++)
802f083884Ss.makeev_local 	{
812f083884Ss.makeev_local 		stackArray.PushBack(200 + i);
822f083884Ss.makeev_local 	}
832f083884Ss.makeev_local 
842f083884Ss.makeev_local 	CHECK(stackArray.IsEmpty() == false);
852f083884Ss.makeev_local 	CHECK_EQUAL(stackArray.Size(), (size_t)elementsCount);
862f083884Ss.makeev_local 
872f083884Ss.makeev_local 	for(int i = 0; i < elementsCount; i++)
882f083884Ss.makeev_local 	{
892f083884Ss.makeev_local 		CHECK_EQUAL(stackArray[i], (200 + i));
902f083884Ss.makeev_local 	}
912f083884Ss.makeev_local 
922f083884Ss.makeev_local }
9360ac17fbSs.makeev_local 
9460ac17fbSs.makeev_local 
9560ac17fbSs.makeev_local ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
9660ac17fbSs.makeev_local TEST(QueueMPMC_BasicTest)
9760ac17fbSs.makeev_local {
9860ac17fbSs.makeev_local 	MT::LockFreeQueueMPMC<int, 32> queue;
9960ac17fbSs.makeev_local 
10060ac17fbSs.makeev_local 	for(int i = 0; i < 64; i++)
10160ac17fbSs.makeev_local 	{
10260ac17fbSs.makeev_local 		bool res = queue.TryPush( std::move(77 + i) );
10360ac17fbSs.makeev_local 		if (i < 32)
10460ac17fbSs.makeev_local 		{
10560ac17fbSs.makeev_local 			CHECK_EQUAL(true, res);
10660ac17fbSs.makeev_local 		} else
10760ac17fbSs.makeev_local 		{
10860ac17fbSs.makeev_local 			CHECK_EQUAL(false, res);
10960ac17fbSs.makeev_local 		}
11060ac17fbSs.makeev_local 	}
11160ac17fbSs.makeev_local 
11260ac17fbSs.makeev_local 	for(int i = 0; i < 64; i++)
11360ac17fbSs.makeev_local 	{
11460ac17fbSs.makeev_local 		int val;
11560ac17fbSs.makeev_local 		bool res = queue.TryPop(val);
11660ac17fbSs.makeev_local 		if (i < 32)
11760ac17fbSs.makeev_local 		{
11860ac17fbSs.makeev_local 			CHECK_EQUAL(true, res);
11960ac17fbSs.makeev_local 			CHECK_EQUAL(77 + i, val);
12060ac17fbSs.makeev_local 		} else
12160ac17fbSs.makeev_local 		{
12260ac17fbSs.makeev_local 			CHECK_EQUAL(false, res);
12360ac17fbSs.makeev_local 		}
12460ac17fbSs.makeev_local 	}
12560ac17fbSs.makeev_local 
12660ac17fbSs.makeev_local 
12760ac17fbSs.makeev_local 	CHECK_EQUAL(true, queue.TryPush( 113 ));
12860ac17fbSs.makeev_local 	CHECK_EQUAL(true, queue.TryPush( 114 ));
12960ac17fbSs.makeev_local 	CHECK_EQUAL(true, queue.TryPush( 115 ));
13060ac17fbSs.makeev_local 
13160ac17fbSs.makeev_local 	int v;
13260ac17fbSs.makeev_local 	CHECK_EQUAL(true, queue.TryPop(v));
13360ac17fbSs.makeev_local 	CHECK_EQUAL(113, v);
13460ac17fbSs.makeev_local 
13560ac17fbSs.makeev_local 	CHECK_EQUAL(true, queue.TryPush( 116 ));
13660ac17fbSs.makeev_local 	CHECK_EQUAL(true, queue.TryPush( 117 ));
13760ac17fbSs.makeev_local 	CHECK_EQUAL(true, queue.TryPush( 118 ));
13860ac17fbSs.makeev_local 
13960ac17fbSs.makeev_local 	CHECK_EQUAL(true, queue.TryPop(v));
14060ac17fbSs.makeev_local 	CHECK_EQUAL(114, v);
14160ac17fbSs.makeev_local 	CHECK_EQUAL(true, queue.TryPop(v));
14260ac17fbSs.makeev_local 	CHECK_EQUAL(115, v);
14360ac17fbSs.makeev_local 	CHECK_EQUAL(true, queue.TryPop(v));
14460ac17fbSs.makeev_local 	CHECK_EQUAL(116, v);
14560ac17fbSs.makeev_local 	CHECK_EQUAL(true, queue.TryPop(v));
14660ac17fbSs.makeev_local 	CHECK_EQUAL(117, v);
14760ac17fbSs.makeev_local 	CHECK_EQUAL(true, queue.TryPop(v));
14860ac17fbSs.makeev_local 	CHECK_EQUAL(118, v);
14960ac17fbSs.makeev_local 
15060ac17fbSs.makeev_local 	v = -133;
15160ac17fbSs.makeev_local 	CHECK_EQUAL(false, queue.TryPop(v));
15260ac17fbSs.makeev_local 	CHECK_EQUAL(-133, v);
15360ac17fbSs.makeev_local 
15460ac17fbSs.makeev_local }
15560ac17fbSs.makeev_local 
15660ac17fbSs.makeev_local 
15760ac17fbSs.makeev_local 
1582f083884Ss.makeev_local ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1592f083884Ss.makeev_local TEST(ArrayViewTest)
1602f083884Ss.makeev_local {
1612f083884Ss.makeev_local 
1622f083884Ss.makeev_local 	MT::ArrayView<int> emptyArrayView(nullptr, 0);
1632f083884Ss.makeev_local 	CHECK(emptyArrayView.IsEmpty() == true);
1642f083884Ss.makeev_local 
1652f083884Ss.makeev_local 	const int elementsCount = 128;
1662f083884Ss.makeev_local 	void* rawMemory = MT::Memory::Alloc(sizeof(int) * elementsCount);
1672f083884Ss.makeev_local 
1682f083884Ss.makeev_local 	MT::ArrayView<int> arrayView(rawMemory, elementsCount);
1692f083884Ss.makeev_local 	CHECK(arrayView.IsEmpty() == false);
1702f083884Ss.makeev_local 
1712f083884Ss.makeev_local 	for (int i = 0; i < elementsCount; i++)
1722f083884Ss.makeev_local 	{
1732f083884Ss.makeev_local 		arrayView[i] = (100 + i);
1742f083884Ss.makeev_local 	}
1752f083884Ss.makeev_local 
1762f083884Ss.makeev_local 	const int* buffer = static_cast<const int*>(rawMemory);
1772f083884Ss.makeev_local 	for (int i = 0; i < elementsCount; i++)
1782f083884Ss.makeev_local 	{
1792f083884Ss.makeev_local 		CHECK_EQUAL(buffer[i], arrayView[i]);
1802f083884Ss.makeev_local 	}
1812f083884Ss.makeev_local 
1822f083884Ss.makeev_local 	MT::Memory::Free(rawMemory);
1832f083884Ss.makeev_local }
1842f083884Ss.makeev_local ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1852f083884Ss.makeev_local 
1862f083884Ss.makeev_local }
187