formatting
[libcds.git] / test / unit / queue / vyukov_mpmc_queue.cpp
index 421e36f0a29fd054f510a5beca7528ce6912cc32..9b83e4a7b0ca9f8f36062728850ba1418a8f3927 100644 (file)
@@ -36,7 +36,43 @@ namespace {
     namespace cc = cds::container;
 
     class VyukovMPMCCycleQueue: public cds_test::bounded_queue
-    {};
+    {
+    public:
+        template <typename Queue>
+        void test_single_consumer( Queue& q )
+        {
+            typedef typename Queue::value_type value_type;
+
+            const size_t nSize = q.capacity();
+
+            ASSERT_TRUE( q.empty());
+            ASSERT_CONTAINER_SIZE( q, 0 );
+
+            // enqueue/dequeue
+            for ( unsigned pass = 0; pass < 3; ++pass ) {
+                for ( size_t i = 0; i < nSize; ++i ) {
+                    ASSERT_TRUE( q.enqueue( static_cast<value_type>( i )));
+                    ASSERT_CONTAINER_SIZE( q, i + 1 );
+                }
+                ASSERT_FALSE( q.empty());
+                ASSERT_CONTAINER_SIZE( q, nSize );
+                ASSERT_FALSE( q.enqueue( static_cast<value_type>( nSize ) * 2 ));
+
+                for ( size_t i = 0; i < nSize; ++i ) {
+                    value_type* fr = q.front();
+                    ASSERT_TRUE( fr != nullptr );
+                    ASSERT_EQ( *fr, static_cast<value_type>( i ));
+                    ASSERT_TRUE( q.pop_front());
+                    ASSERT_CONTAINER_SIZE( q, nSize - i - 1 );
+                }
+                ASSERT_TRUE( q.empty());
+                ASSERT_CONTAINER_SIZE( q, 0 );
+
+                ASSERT_TRUE( q.front() == nullptr );
+                ASSERT_FALSE( q.pop_front());
+            }
+        }
+    };
 
     TEST_F( VyukovMPMCCycleQueue, defaulted )
     {
@@ -130,5 +166,18 @@ namespace {
         test_string( q );
     }
 
+    TEST_F( VyukovMPMCCycleQueue, single_consumer )
+    {
+        struct traits: public cds::container::vyukov_queue::traits
+        {
+            enum: bool { single_consumer = true };
+        };
+        typedef cds::container::VyukovMPMCCycleQueue< int, traits > test_queue;
+
+        test_queue q( 128 );
+        test( q );
+        test_single_consumer( q );
+    }
+
 } // namespace