test_tb_space_allocator.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. // ================================================================================
  2. // == This file is a part of Turbo Badger. (C) 2011-2014, Emil Segerås ==
  3. // == See tb_core.h for more information. ==
  4. // ================================================================================
  5. #include "tb_test.h"
  6. #include "tb_bitmap_fragment.h"
  7. #ifdef TB_UNIT_TESTING
  8. using namespace tb;
  9. TB_TEST_GROUP(tb_space_allocator)
  10. {
  11. TB_TEST(free_when_full)
  12. {
  13. TBSpaceAllocator spa(30);
  14. TB_VERIFY(spa.HasSpace(30));
  15. TBSpaceAllocator::Space *s1 = spa.AllocSpace(10);
  16. TBSpaceAllocator::Space *s2 = spa.AllocSpace(10);
  17. TBSpaceAllocator::Space *s3 = spa.AllocSpace(10);
  18. TB_VERIFY(s1 && s2 && s3);
  19. TB_VERIFY(!spa.HasSpace(1));
  20. // Free middle
  21. spa.FreeSpace(s2);
  22. TB_VERIFY(spa.HasSpace(10));
  23. // Allocate middle (again)
  24. s2 = spa.AllocSpace(10);
  25. TB_VERIFY(!spa.HasSpace(10));
  26. // Free first
  27. spa.FreeSpace(s1);
  28. TB_VERIFY(spa.HasSpace(10));
  29. // Allocate first (again)
  30. s1 = spa.AllocSpace(10);
  31. TB_VERIFY(!spa.HasSpace(10));
  32. // Free last
  33. spa.FreeSpace(s3);
  34. TB_VERIFY(spa.HasSpace(10));
  35. // Allocate last (again)
  36. s3 = spa.AllocSpace(10);
  37. TB_VERIFY(!spa.HasSpace(10));
  38. }
  39. TB_TEST(free_all)
  40. {
  41. TBSpaceAllocator spa(30);
  42. {
  43. TBSpaceAllocator::Space *s = spa.AllocSpace(30);
  44. spa.FreeSpace(s);
  45. TB_VERIFY(spa.HasSpace(30));
  46. }
  47. // Free in order
  48. TBSpaceAllocator::Space *s1 = spa.AllocSpace(10);
  49. TBSpaceAllocator::Space *s2 = spa.AllocSpace(10);
  50. TBSpaceAllocator::Space *s3 = spa.AllocSpace(10);
  51. TB_VERIFY(s1 && s2 && s3);
  52. spa.FreeSpace(s1);
  53. spa.FreeSpace(s2);
  54. spa.FreeSpace(s3);
  55. TB_VERIFY(spa.HasSpace(30));
  56. // Free in backwards order
  57. s1 = spa.AllocSpace(10);
  58. s2 = spa.AllocSpace(10);
  59. s3 = spa.AllocSpace(10);
  60. TB_VERIFY(s1 && s2 && s3);
  61. spa.FreeSpace(s3);
  62. spa.FreeSpace(s2);
  63. spa.FreeSpace(s1);
  64. TB_VERIFY(spa.HasSpace(30));
  65. // Free middle first (in order)
  66. s1 = spa.AllocSpace(10);
  67. s2 = spa.AllocSpace(10);
  68. s3 = spa.AllocSpace(10);
  69. TB_VERIFY(s1 && s2 && s3);
  70. spa.FreeSpace(s2);
  71. spa.FreeSpace(s1);
  72. spa.FreeSpace(s3);
  73. TB_VERIFY(spa.HasSpace(30));
  74. // Free middle first (in backwards order)
  75. s1 = spa.AllocSpace(10);
  76. s2 = spa.AllocSpace(10);
  77. s3 = spa.AllocSpace(10);
  78. TB_VERIFY(s1 && s2 && s3);
  79. spa.FreeSpace(s2);
  80. spa.FreeSpace(s3);
  81. spa.FreeSpace(s1);
  82. TB_VERIFY(spa.HasSpace(30));
  83. }
  84. TB_TEST(free_scattered)
  85. {
  86. TBSpaceAllocator spa(50);
  87. TBSpaceAllocator::Space *s1 = spa.AllocSpace(10);
  88. TBSpaceAllocator::Space *s2 = spa.AllocSpace(10);
  89. TBSpaceAllocator::Space *s3 = spa.AllocSpace(10);
  90. TBSpaceAllocator::Space *s4 = spa.AllocSpace(10);
  91. TBSpaceAllocator::Space *s5 = spa.AllocSpace(10);
  92. TB_VERIFY(s1 && s2 && s3 && s4 && s5);
  93. // Free all middle space
  94. spa.FreeSpace(s2);
  95. spa.FreeSpace(s4);
  96. spa.FreeSpace(s3);
  97. TB_VERIFY(spa.HasSpace(30));
  98. s2 = spa.AllocSpace(10);
  99. s3 = spa.AllocSpace(10);
  100. s4 = spa.AllocSpace(10);
  101. // Free edges, then middle
  102. spa.FreeSpace(s1);
  103. spa.FreeSpace(s5);
  104. spa.FreeSpace(s3);
  105. TB_VERIFY(!spa.HasSpace(30)); // We should not have 30 of continous space.
  106. s1 = spa.AllocSpace(10);
  107. s3 = spa.AllocSpace(10);
  108. s5 = spa.AllocSpace(10);
  109. TB_VERIFY(s1 && s3 && s5); // We should have 3 * 10 spaces though.
  110. }
  111. }
  112. #endif // TB_UNIT_TESTING