test_fcpqueue.h 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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_PQUEUE_FCPQUEUE_H
  6. #define CDSUNIT_PQUEUE_FCPQUEUE_H
  7. #include "test_data.h"
  8. namespace cds_test {
  9. class FCPQueue : public PQueueTest
  10. {
  11. protected:
  12. template <class PQueue>
  13. void test( PQueue& pq )
  14. {
  15. data_array<value_type> arr( PQueueTest::c_nCapacity );
  16. value_type * pFirst = arr.begin();
  17. value_type * pLast = arr.end();
  18. ASSERT_TRUE( pq.empty());
  19. ASSERT_TRUE( pq.size() == 0 );
  20. size_t nSize = 0;
  21. // Push test
  22. for ( value_type * p = pFirst; p < pLast; ++p ) {
  23. ASSERT_TRUE( pq.push( *p ));
  24. ASSERT_TRUE( !pq.empty());
  25. ASSERT_EQ( pq.size(), ++nSize );
  26. }
  27. ASSERT_EQ( pq.size(), static_cast<size_t>(PQueueTest::c_nCapacity ));
  28. // Pop test
  29. key_type nPrev = PQueueTest::c_nMinValue + key_type( PQueueTest::c_nCapacity ) - 1;
  30. value_type kv( 0 );
  31. ASSERT_TRUE( pq.pop( kv ));
  32. EXPECT_EQ( kv.k, nPrev );
  33. ASSERT_EQ( pq.size(), static_cast<size_t>( PQueueTest::c_nCapacity - 1 ));
  34. ASSERT_TRUE( !pq.empty());
  35. nSize = pq.size();
  36. while ( pq.size() > 1 ) {
  37. ASSERT_TRUE( pq.pop( kv ));
  38. EXPECT_EQ( kv.k, nPrev - 1 );
  39. nPrev = kv.k;
  40. --nSize;
  41. ASSERT_EQ( pq.size(), nSize );
  42. }
  43. ASSERT_TRUE( !pq.empty());
  44. ASSERT_EQ( pq.size(), 1u );
  45. ASSERT_TRUE( pq.pop( kv ));
  46. EXPECT_EQ( kv.k, PQueueTest::c_nMinValue );
  47. ASSERT_TRUE( pq.empty());
  48. ASSERT_EQ( pq.size(), 0u );
  49. // pop from empty pqueue
  50. kv.k = PQueueTest::c_nCapacity * 2;
  51. ASSERT_FALSE( pq.pop( kv ));
  52. EXPECT_EQ( kv.k, PQueueTest::c_nCapacity * 2 );
  53. // Clear test
  54. for ( value_type * p = pFirst; p < pLast; ++p )
  55. ASSERT_TRUE( pq.push( *p ));
  56. ASSERT_TRUE( !pq.empty());
  57. ASSERT_EQ( pq.size(), static_cast<size_t>( PQueueTest::c_nCapacity ));
  58. pq.clear();
  59. ASSERT_TRUE( pq.empty());
  60. ASSERT_EQ( pq.size(), 0u );
  61. }
  62. };
  63. } // namespace cds_test
  64. #endif // CDSUNIT_PQUEUE_FCPQUEUE_H