test_keyset.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. #include "test.h"
  2. int test_keyset_stack()
  3. {
  4. LSUP_Keyset ks_s;
  5. LSUP_Keyset *ks = &ks_s;
  6. LSUP_keyset_init(ks, 10, .5);
  7. EXPECT_INT_EQ(ks->capacity, 10);
  8. LSUP_keyset_done(ks);
  9. return 0;
  10. }
  11. int test_keyset_heap()
  12. {
  13. LSUP_Keyset *ks = LSUP_keyset_new(10, .5);
  14. EXPECT_INT_EQ(ks->capacity, 10);
  15. LSUP_keyset_free(ks);
  16. return 0;
  17. }
  18. int test_keyset_add_remove()
  19. {
  20. LSUP_Keyset *ks = LSUP_keyset_new(10, .5);
  21. LSUP_TripleKey k1 = {1,1,1};
  22. LSUP_TripleKey k2 = {1,1,2};
  23. LSUP_TripleKey k3 = {1,1,3};
  24. LSUP_TripleKey k4 = {1,2,1};
  25. LSUP_TripleKey k5 = {1,2,1}; // Duplicate
  26. LSUP_keyset_add(ks, &k1, LSUP_KS_CHECK_DUP);
  27. LSUP_keyset_add(ks, &k2, LSUP_KS_CHECK_DUP);
  28. LSUP_keyset_add(ks, &k3, LSUP_KS_CHECK_DUP);
  29. LSUP_keyset_add(ks, &k4, LSUP_KS_CHECK_DUP);
  30. LSUP_keyset_add(ks, &k5, LSUP_KS_CHECK_DUP);
  31. EXPECT_INT_EQ(LSUP_keyset_size(ks), 4);
  32. EXPECT_INT_EQ(LSUP_keyset_tell(ks), 3);
  33. EXPECT_INT_EQ(LSUP_keyset_seek(ks, 1), true);
  34. ASSERT(
  35. memcmp(LSUP_keyset_peek(ks), &k2, sizeof(LSUP_TripleKey)) == 0,
  36. "Key not corresponding to index!");
  37. LSUP_TripleKey k6 = {1,1,2};
  38. LSUP_keyset_remove(ks, &k6);
  39. ASSERT(!LSUP_keyset_contains(ks, &k6), "Triple not removed!");
  40. ASSERT(!LSUP_keyset_contains(ks, &k2), "Triple not removed!");
  41. EXPECT_INT_EQ(ks->free_i, 4);
  42. LSUP_Keyset *ks2 = malloc(sizeof(LSUP_Keyset));
  43. LSUP_keyset_sparse_copy(ks, ks2);
  44. EXPECT_INT_EQ(ks2->free_i, 3);
  45. LSUP_keyset_free(ks);
  46. LSUP_keyset_free(ks2);
  47. return 0;
  48. }
  49. int test_keyset_lookup()
  50. {
  51. LSUP_Keyset *ks = LSUP_keyset_new(10, .5);
  52. LSUP_Keyset res_s;
  53. LSUP_Keyset *res = &res_s;
  54. LSUP_TripleKey k1 = {1,1,1};
  55. LSUP_TripleKey k2 = {1,1,2};
  56. LSUP_TripleKey k3 = {1,2,1};
  57. LSUP_TripleKey k4 = {2,1,3};
  58. LSUP_keyset_add(ks, &k1, 0);
  59. LSUP_keyset_add(ks, &k2, 0);
  60. LSUP_keyset_add(ks, &k3, 0);
  61. LSUP_keyset_add(ks, &k4, 0);
  62. LSUP_keyset_lookup(ks, res, 1, 1, 1);
  63. EXPECT_INT_EQ(LSUP_keyset_size(res), 1);
  64. LSUP_keyset_done(res);
  65. LSUP_keyset_lookup(ks, res, 1, 1, 0);
  66. EXPECT_INT_EQ(LSUP_keyset_size(res), 2);
  67. LSUP_keyset_done(res);
  68. LSUP_keyset_lookup(ks, res, 1, 2, 0);
  69. EXPECT_INT_EQ(LSUP_keyset_size(res), 1);
  70. LSUP_keyset_done(res);
  71. LSUP_keyset_lookup(ks, res, 1, 0, 0);
  72. EXPECT_INT_EQ(LSUP_keyset_size(res), 3);
  73. LSUP_keyset_done(res);
  74. LSUP_keyset_lookup(ks, res, 0, 1, 0);
  75. EXPECT_INT_EQ(LSUP_keyset_size(res), 3);
  76. LSUP_keyset_done(res);
  77. LSUP_keyset_lookup(ks, res, 0, 0, 0);
  78. EXPECT_INT_EQ(LSUP_keyset_size(res), 4);
  79. LSUP_keyset_done(res);
  80. LSUP_keyset_free(ks);
  81. return 0;
  82. }
  83. int test_keyset_bool_ops()
  84. {
  85. LSUP_Keyset res_s;
  86. LSUP_Keyset *res = &res_s;
  87. LSUP_TripleKey k1 = {1,1,1};
  88. LSUP_TripleKey k2 = {1,1,2};
  89. LSUP_TripleKey k3 = {1,2,1};
  90. LSUP_TripleKey k4 = {2,1,3};
  91. LSUP_TripleKey k5 = {3,1,1};
  92. LSUP_TripleKey k6 = {1,1,1};
  93. LSUP_TripleKey k7 = {1,1,2};
  94. LSUP_TripleKey k8 = {3,2,1};
  95. LSUP_TripleKey k9 = {4,1,3};
  96. LSUP_TripleKey k10 = {5,1,3};
  97. LSUP_Keyset *ks1 = LSUP_keyset_new(5, .5);
  98. LSUP_Keyset *ks2 = LSUP_keyset_new(5, .5);
  99. // Both sets empty.
  100. LSUP_keyset_join(ks1, ks2, res);
  101. EXPECT_INT_EQ(LSUP_keyset_size(res), 0);
  102. LSUP_keyset_done(res);
  103. LSUP_keyset_subtract(ks1, ks2, res);
  104. EXPECT_INT_EQ(LSUP_keyset_size(res), 0);
  105. LSUP_keyset_done(res);
  106. LSUP_keyset_intersect(ks1, ks2, res);
  107. EXPECT_INT_EQ(LSUP_keyset_size(res), 0);
  108. LSUP_keyset_done(res);
  109. LSUP_keyset_xor(ks1, ks2, res);
  110. EXPECT_INT_EQ(LSUP_keyset_size(res), 0);
  111. LSUP_keyset_done(res);
  112. LSUP_keyset_add(ks1, &k1, 0);
  113. LSUP_keyset_add(ks1, &k2, 0);
  114. LSUP_keyset_add(ks1, &k3, 0);
  115. LSUP_keyset_add(ks1, &k4, 0);
  116. LSUP_keyset_add(ks1, &k5, 0);
  117. // Set 2 empty.
  118. LSUP_keyset_join(ks1, ks2, res);
  119. EXPECT_INT_EQ(LSUP_keyset_size(res), 5);
  120. LSUP_keyset_done(res);
  121. LSUP_keyset_subtract(ks1, ks2, res);
  122. EXPECT_INT_EQ(LSUP_keyset_size(res), 5);
  123. LSUP_keyset_done(res);
  124. LSUP_keyset_intersect(ks1, ks2, res);
  125. EXPECT_INT_EQ(LSUP_keyset_size(res), 0);
  126. LSUP_keyset_done(res);
  127. LSUP_keyset_xor(ks1, ks2, res);
  128. EXPECT_INT_EQ(LSUP_keyset_size(res), 5);
  129. LSUP_keyset_done(res);
  130. LSUP_keyset_add(ks2, &k6, 0);
  131. LSUP_keyset_add(ks2, &k7, 0);
  132. LSUP_keyset_add(ks2, &k8, 0);
  133. LSUP_keyset_add(ks2, &k9, 0);
  134. LSUP_keyset_add(ks2, &k10, 0);
  135. // Both sets populated.
  136. LSUP_keyset_join(ks1, ks2, res);
  137. EXPECT_INT_EQ(LSUP_keyset_size(res), 8);
  138. LSUP_keyset_done(res);
  139. LSUP_keyset_subtract(ks1, ks2, res);
  140. EXPECT_INT_EQ(LSUP_keyset_size(res), 3);
  141. LSUP_keyset_done(res);
  142. LSUP_keyset_intersect(ks1, ks2, res);
  143. EXPECT_INT_EQ(LSUP_keyset_size(res), 2);
  144. LSUP_keyset_done(res);
  145. LSUP_keyset_xor(ks1, ks2, res);
  146. EXPECT_INT_EQ(LSUP_keyset_size(res), 6);
  147. LSUP_keyset_done(res);
  148. LSUP_keyset_free(ks1);
  149. LSUP_keyset_free(ks2);
  150. return 0;
  151. }
  152. int keyset_tests()
  153. {
  154. RUN(test_keyset_stack);
  155. RUN(test_keyset_heap);
  156. RUN(test_keyset_add_remove);
  157. RUN(test_keyset_lookup);
  158. RUN(test_keyset_bool_ops);
  159. return 0;
  160. }