test_generic_queue.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. // Copyright (c) 2006-2018 Maxim Khizhinsky
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. // file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #ifndef CDSUNIT_QUEUE_TEST_GENERIC_QUEUE_H
  6. #define CDSUNIT_QUEUE_TEST_GENERIC_QUEUE_H
  7. #include <cds_test/check_size.h>
  8. namespace cds_test {
  9. class generic_queue : public ::testing::Test
  10. {
  11. protected:
  12. template <typename Queue>
  13. void test( Queue& q )
  14. {
  15. typedef typename Queue::value_type value_type;
  16. value_type it;
  17. const size_t nSize = 100;
  18. ASSERT_TRUE( q.empty());
  19. ASSERT_CONTAINER_SIZE( q, 0 );
  20. // enqueue/dequeue
  21. for ( size_t i = 0; i < nSize; ++i ) {
  22. it = static_cast<value_type>(i);
  23. ASSERT_TRUE( q.enqueue( it ));
  24. ASSERT_CONTAINER_SIZE( q, i + 1 );
  25. }
  26. ASSERT_FALSE( q.empty());
  27. ASSERT_CONTAINER_SIZE( q, nSize );
  28. for ( size_t i = 0; i < nSize; ++i ) {
  29. it = -1;
  30. ASSERT_TRUE( q.dequeue( it ));
  31. ASSERT_EQ( it, static_cast<value_type>( i ));
  32. ASSERT_CONTAINER_SIZE( q, nSize - i - 1 );
  33. }
  34. ASSERT_TRUE( q.empty());
  35. ASSERT_CONTAINER_SIZE( q, 0 );
  36. // push/pop
  37. for ( size_t i = 0; i < nSize; ++i ) {
  38. it = static_cast<value_type>(i);
  39. ASSERT_TRUE( q.push( it ));
  40. ASSERT_CONTAINER_SIZE( q, i + 1 );
  41. }
  42. ASSERT_FALSE( q.empty());
  43. ASSERT_CONTAINER_SIZE( q, nSize );
  44. for ( size_t i = 0; i < nSize; ++i ) {
  45. it = -1;
  46. ASSERT_TRUE( q.pop( it ));
  47. ASSERT_EQ( it, static_cast<value_type>( i ));
  48. ASSERT_CONTAINER_SIZE( q, nSize - i - 1 );
  49. }
  50. ASSERT_TRUE( q.empty());
  51. ASSERT_CONTAINER_SIZE( q, 0 );
  52. // push/pop with lambda
  53. for ( size_t i = 0; i < nSize; ++i ) {
  54. it = static_cast<value_type>(i);
  55. ASSERT_NE( it, -1 );
  56. auto f = [&it]( value_type& dest ) { dest = it; it = -1; };
  57. if ( i & 1 )
  58. ASSERT_TRUE( q.enqueue_with( f ));
  59. else
  60. ASSERT_TRUE( q.push_with( f ));
  61. ASSERT_EQ( it, -1 );
  62. ASSERT_CONTAINER_SIZE( q, i + 1 );
  63. }
  64. ASSERT_FALSE( q.empty());
  65. ASSERT_CONTAINER_SIZE( q, nSize );
  66. for ( size_t i = 0; i < nSize; ++i ) {
  67. it = -1;
  68. auto f = [&it]( value_type& src ) { it = src; src = -1; };
  69. if ( i & 1 )
  70. ASSERT_TRUE( q.pop_with( f ));
  71. else
  72. ASSERT_TRUE( q.dequeue_with( f ));
  73. ASSERT_EQ( it, static_cast<value_type>( i ));
  74. ASSERT_CONTAINER_SIZE( q, nSize - i - 1 );
  75. }
  76. ASSERT_TRUE( q.empty());
  77. ASSERT_CONTAINER_SIZE( q, 0 );
  78. // clear
  79. for ( size_t i = 0; i < nSize; ++i ) {
  80. ASSERT_TRUE( q.push( static_cast<value_type>(i)));
  81. }
  82. ASSERT_FALSE( q.empty());
  83. ASSERT_CONTAINER_SIZE( q, nSize );
  84. q.clear();
  85. ASSERT_TRUE( q.empty());
  86. ASSERT_CONTAINER_SIZE( q, 0 );
  87. // pop from empty queue
  88. it = nSize * 2;
  89. ASSERT_FALSE( q.pop( it ));
  90. ASSERT_EQ( it, static_cast<value_type>( nSize * 2 ));
  91. ASSERT_TRUE( q.empty());
  92. ASSERT_CONTAINER_SIZE( q, 0 );
  93. ASSERT_FALSE( q.dequeue( it ));
  94. ASSERT_EQ( it, static_cast<value_type>( nSize * 2 ));
  95. ASSERT_TRUE( q.empty());
  96. ASSERT_CONTAINER_SIZE( q, 0 );
  97. }
  98. template <class Queue>
  99. void test_string( Queue& q )
  100. {
  101. std::string str[3];
  102. str[0] = "one";
  103. str[1] = "two";
  104. str[2] = "three";
  105. const size_t nSize = sizeof( str ) / sizeof( str[0] );
  106. // emplace
  107. for ( size_t i = 0; i < nSize; ++i ) {
  108. ASSERT_TRUE( q.emplace( str[i].c_str()));
  109. ASSERT_CONTAINER_SIZE( q, i + 1 );
  110. }
  111. ASSERT_FALSE( q.empty());
  112. ASSERT_CONTAINER_SIZE( q, nSize );
  113. {
  114. std::string s;
  115. auto f = [&s]( std::string& src ) {
  116. ASSERT_FALSE( src.empty());
  117. s = std::move( src );
  118. ASSERT_NE( s, src );
  119. };
  120. for ( size_t i = 0; i < nSize; ++i ) {
  121. if ( i & 1 )
  122. ASSERT_TRUE( q.pop_with( f ));
  123. else
  124. ASSERT_TRUE( q.dequeue_with( f ));
  125. ASSERT_CONTAINER_SIZE( q, nSize - i - 1 );
  126. ASSERT_EQ( s, str[i] );
  127. }
  128. }
  129. ASSERT_TRUE( q.empty());
  130. ASSERT_CONTAINER_SIZE( q, 0 );
  131. // move push
  132. for ( size_t i = 0; i < nSize; ++i ) {
  133. std::string s = str[i];
  134. ASSERT_FALSE( s.empty());
  135. if ( i & 1 )
  136. ASSERT_TRUE( q.enqueue( std::move( s )));
  137. else
  138. ASSERT_TRUE( q.push( std::move( s )));
  139. ASSERT_TRUE( s.empty());
  140. ASSERT_CONTAINER_SIZE( q, i + 1 );
  141. }
  142. ASSERT_FALSE( q.empty());
  143. ASSERT_CONTAINER_SIZE( q, nSize );
  144. for ( size_t i = 0; i < nSize; ++i ) {
  145. std::string s;
  146. ASSERT_TRUE( q.pop( s ));
  147. ASSERT_CONTAINER_SIZE( q, nSize - i - 1 );
  148. ASSERT_EQ( s, str[i] );
  149. }
  150. ASSERT_TRUE( q.empty());
  151. ASSERT_CONTAINER_SIZE( q, 0 );
  152. }
  153. };
  154. } // namespace cds_test
  155. #endif // CDSUNIT_QUEUE_TEST_GENERIC_QUEUE_H