FixedSizeQueueTest.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // Copyright 2014 Dolphin Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include <gtest/gtest.h>
  4. #include "Common/FixedSizeQueue.h"
  5. TEST(FixedSizeQueue, Simple)
  6. {
  7. Common::FixedSizeQueue<int, 5> q;
  8. EXPECT_EQ(0u, q.size());
  9. q.push(0);
  10. q.push(1);
  11. q.push(2);
  12. q.push(3);
  13. q.push(4);
  14. for (int i = 0; i < 1000; ++i)
  15. {
  16. EXPECT_EQ(i, q.front());
  17. EXPECT_EQ(i, q.pop_front());
  18. q.push(i + 5);
  19. }
  20. EXPECT_EQ(1000, q.pop_front());
  21. EXPECT_EQ(1001, q.pop_front());
  22. EXPECT_EQ(1002, q.pop_front());
  23. EXPECT_EQ(1003, q.pop_front());
  24. EXPECT_EQ(1004, q.pop_front());
  25. EXPECT_EQ(0u, q.size());
  26. }
  27. TEST(FixedSizeQueue, RingBuffer)
  28. {
  29. // Testing if queue works when used as a ring buffer
  30. Common::FixedSizeQueue<int, 5> q;
  31. EXPECT_EQ(0u, q.size());
  32. q.push(0);
  33. q.push(1);
  34. q.push(2);
  35. q.push(3);
  36. q.push(4);
  37. q.push(5);
  38. EXPECT_EQ(5u, q.size());
  39. EXPECT_EQ(1, q.pop_front());
  40. EXPECT_EQ(4u, q.size());
  41. }
  42. // Local classes cannot have static fields,
  43. // therefore this has to be declared in global scope.
  44. class NonTrivialTypeTestData
  45. {
  46. public:
  47. static inline int num_objects = 0;
  48. static inline int total_constructed = 0;
  49. static inline int default_constructed = 0;
  50. static inline int total_destructed = 0;
  51. NonTrivialTypeTestData()
  52. {
  53. num_objects++;
  54. total_constructed++;
  55. default_constructed++;
  56. }
  57. NonTrivialTypeTestData(int /*val*/)
  58. {
  59. num_objects++;
  60. total_constructed++;
  61. }
  62. ~NonTrivialTypeTestData()
  63. {
  64. num_objects--;
  65. total_destructed++;
  66. }
  67. };
  68. TEST(FixedSizeQueue, NonTrivialTypes)
  69. {
  70. // Testing if construction/destruction of non-trivial types happens as expected
  71. Common::FixedSizeQueue<NonTrivialTypeTestData, 2> q;
  72. EXPECT_EQ(0u, q.size());
  73. EXPECT_EQ(2, NonTrivialTypeTestData::num_objects);
  74. EXPECT_EQ(2, NonTrivialTypeTestData::total_constructed);
  75. EXPECT_EQ(2, NonTrivialTypeTestData::default_constructed);
  76. EXPECT_EQ(0, NonTrivialTypeTestData::total_destructed);
  77. q.emplace(4);
  78. q.emplace(6);
  79. q.emplace(8);
  80. EXPECT_EQ(2, NonTrivialTypeTestData::num_objects);
  81. EXPECT_EQ(2 + 3, NonTrivialTypeTestData::total_constructed);
  82. EXPECT_EQ(2, NonTrivialTypeTestData::default_constructed);
  83. EXPECT_EQ(3, NonTrivialTypeTestData::total_destructed);
  84. EXPECT_EQ(2u, q.size());
  85. q.pop();
  86. q.pop();
  87. EXPECT_EQ(2, NonTrivialTypeTestData::num_objects);
  88. EXPECT_EQ(2 + 3 + 2, NonTrivialTypeTestData::total_constructed);
  89. EXPECT_EQ(2 + 2, NonTrivialTypeTestData::default_constructed);
  90. EXPECT_EQ(3 + 2, NonTrivialTypeTestData::total_destructed);
  91. EXPECT_EQ(0u, q.size());
  92. }