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