enum_set_test.cpp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. // Copyright (c) 2016 Google Inc.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include <algorithm>
  15. #include <utility>
  16. #include <vector>
  17. #include "gmock/gmock.h"
  18. #include "source/enum_set.h"
  19. #include "test/unit_spirv.h"
  20. namespace spvtools {
  21. namespace {
  22. using spvtest::ElementsIn;
  23. using ::testing::Eq;
  24. using ::testing::ValuesIn;
  25. TEST(EnumSet, IsEmpty1) {
  26. EnumSet<uint32_t> set;
  27. EXPECT_TRUE(set.IsEmpty());
  28. set.Add(0);
  29. EXPECT_FALSE(set.IsEmpty());
  30. }
  31. TEST(EnumSet, IsEmpty2) {
  32. EnumSet<uint32_t> set;
  33. EXPECT_TRUE(set.IsEmpty());
  34. set.Add(150);
  35. EXPECT_FALSE(set.IsEmpty());
  36. }
  37. TEST(EnumSet, IsEmpty3) {
  38. EnumSet<uint32_t> set(4);
  39. EXPECT_FALSE(set.IsEmpty());
  40. }
  41. TEST(EnumSet, IsEmpty4) {
  42. EnumSet<uint32_t> set(300);
  43. EXPECT_FALSE(set.IsEmpty());
  44. }
  45. TEST(EnumSetHasAnyOf, EmptySetEmptyQuery) {
  46. const EnumSet<uint32_t> set;
  47. const EnumSet<uint32_t> empty;
  48. EXPECT_TRUE(set.HasAnyOf(empty));
  49. EXPECT_TRUE(EnumSet<uint32_t>().HasAnyOf(EnumSet<uint32_t>()));
  50. }
  51. TEST(EnumSetHasAnyOf, MaskSetEmptyQuery) {
  52. EnumSet<uint32_t> set;
  53. const EnumSet<uint32_t> empty;
  54. set.Add(5);
  55. set.Add(8);
  56. EXPECT_TRUE(set.HasAnyOf(empty));
  57. }
  58. TEST(EnumSetHasAnyOf, OverflowSetEmptyQuery) {
  59. EnumSet<uint32_t> set;
  60. const EnumSet<uint32_t> empty;
  61. set.Add(200);
  62. set.Add(300);
  63. EXPECT_TRUE(set.HasAnyOf(empty));
  64. }
  65. TEST(EnumSetHasAnyOf, EmptyQuery) {
  66. EnumSet<uint32_t> set;
  67. const EnumSet<uint32_t> empty;
  68. set.Add(5);
  69. set.Add(8);
  70. set.Add(200);
  71. set.Add(300);
  72. EXPECT_TRUE(set.HasAnyOf(empty));
  73. }
  74. TEST(EnumSetHasAnyOf, EmptyQueryAlwaysTrue) {
  75. EnumSet<uint32_t> set;
  76. const EnumSet<uint32_t> empty;
  77. EXPECT_TRUE(set.HasAnyOf(empty));
  78. set.Add(5);
  79. EXPECT_TRUE(set.HasAnyOf(empty));
  80. EXPECT_TRUE(EnumSet<uint32_t>(100).HasAnyOf(EnumSet<uint32_t>()));
  81. }
  82. TEST(EnumSetHasAnyOf, ReflexiveMask) {
  83. EnumSet<uint32_t> set(3);
  84. set.Add(24);
  85. set.Add(30);
  86. EXPECT_TRUE(set.HasAnyOf(set));
  87. }
  88. TEST(EnumSetHasAnyOf, ReflexiveOverflow) {
  89. EnumSet<uint32_t> set(200);
  90. set.Add(300);
  91. set.Add(400);
  92. EXPECT_TRUE(set.HasAnyOf(set));
  93. }
  94. TEST(EnumSetHasAnyOf, Reflexive) {
  95. EnumSet<uint32_t> set(3);
  96. set.Add(24);
  97. set.Add(300);
  98. set.Add(400);
  99. EXPECT_TRUE(set.HasAnyOf(set));
  100. }
  101. TEST(EnumSetHasAnyOf, EmptySetHasNone) {
  102. EnumSet<uint32_t> set;
  103. EnumSet<uint32_t> items;
  104. for (uint32_t i = 0; i < 200; ++i) {
  105. items.Add(i);
  106. EXPECT_FALSE(set.HasAnyOf(items));
  107. EXPECT_FALSE(set.HasAnyOf(EnumSet<uint32_t>(i)));
  108. }
  109. }
  110. TEST(EnumSetHasAnyOf, MaskSetMaskQuery) {
  111. EnumSet<uint32_t> set(0);
  112. EnumSet<uint32_t> items(1);
  113. EXPECT_FALSE(set.HasAnyOf(items));
  114. set.Add(2);
  115. items.Add(3);
  116. EXPECT_FALSE(set.HasAnyOf(items));
  117. set.Add(3);
  118. EXPECT_TRUE(set.HasAnyOf(items));
  119. set.Add(4);
  120. EXPECT_TRUE(set.HasAnyOf(items));
  121. }
  122. TEST(EnumSetHasAnyOf, OverflowSetOverflowQuery) {
  123. EnumSet<uint32_t> set(100);
  124. EnumSet<uint32_t> items(200);
  125. EXPECT_FALSE(set.HasAnyOf(items));
  126. set.Add(300);
  127. items.Add(400);
  128. EXPECT_FALSE(set.HasAnyOf(items));
  129. set.Add(200);
  130. EXPECT_TRUE(set.HasAnyOf(items));
  131. set.Add(500);
  132. EXPECT_TRUE(set.HasAnyOf(items));
  133. }
  134. TEST(EnumSetHasAnyOf, GeneralCase) {
  135. EnumSet<uint32_t> set(0);
  136. EnumSet<uint32_t> items(100);
  137. EXPECT_FALSE(set.HasAnyOf(items));
  138. set.Add(300);
  139. items.Add(4);
  140. EXPECT_FALSE(set.HasAnyOf(items));
  141. set.Add(5);
  142. items.Add(500);
  143. EXPECT_FALSE(set.HasAnyOf(items));
  144. set.Add(500);
  145. EXPECT_TRUE(set.HasAnyOf(items));
  146. EXPECT_FALSE(set.HasAnyOf(EnumSet<uint32_t>(20)));
  147. EXPECT_FALSE(set.HasAnyOf(EnumSet<uint32_t>(600)));
  148. EXPECT_TRUE(set.HasAnyOf(EnumSet<uint32_t>(5)));
  149. EXPECT_TRUE(set.HasAnyOf(EnumSet<uint32_t>(300)));
  150. EXPECT_TRUE(set.HasAnyOf(EnumSet<uint32_t>(0)));
  151. }
  152. TEST(EnumSet, DefaultIsEmpty) {
  153. EnumSet<uint32_t> set;
  154. for (uint32_t i = 0; i < 1000; ++i) {
  155. EXPECT_FALSE(set.Contains(i));
  156. }
  157. }
  158. TEST(CapabilitySet, ConstructSingleMemberMatrix) {
  159. CapabilitySet s(SpvCapabilityMatrix);
  160. EXPECT_TRUE(s.Contains(SpvCapabilityMatrix));
  161. EXPECT_FALSE(s.Contains(SpvCapabilityShader));
  162. EXPECT_FALSE(s.Contains(static_cast<SpvCapability>(1000)));
  163. }
  164. TEST(CapabilitySet, ConstructSingleMemberMaxInMask) {
  165. CapabilitySet s(static_cast<SpvCapability>(63));
  166. EXPECT_FALSE(s.Contains(SpvCapabilityMatrix));
  167. EXPECT_FALSE(s.Contains(SpvCapabilityShader));
  168. EXPECT_TRUE(s.Contains(static_cast<SpvCapability>(63)));
  169. EXPECT_FALSE(s.Contains(static_cast<SpvCapability>(64)));
  170. EXPECT_FALSE(s.Contains(static_cast<SpvCapability>(1000)));
  171. }
  172. TEST(CapabilitySet, ConstructSingleMemberMinOverflow) {
  173. // Check the first one that forces overflow beyond the mask.
  174. CapabilitySet s(static_cast<SpvCapability>(64));
  175. EXPECT_FALSE(s.Contains(SpvCapabilityMatrix));
  176. EXPECT_FALSE(s.Contains(SpvCapabilityShader));
  177. EXPECT_FALSE(s.Contains(static_cast<SpvCapability>(63)));
  178. EXPECT_TRUE(s.Contains(static_cast<SpvCapability>(64)));
  179. EXPECT_FALSE(s.Contains(static_cast<SpvCapability>(1000)));
  180. }
  181. TEST(CapabilitySet, ConstructSingleMemberMaxOverflow) {
  182. // Check the max 32-bit signed int.
  183. CapabilitySet s(static_cast<SpvCapability>(0x7fffffffu));
  184. EXPECT_FALSE(s.Contains(SpvCapabilityMatrix));
  185. EXPECT_FALSE(s.Contains(SpvCapabilityShader));
  186. EXPECT_FALSE(s.Contains(static_cast<SpvCapability>(1000)));
  187. EXPECT_TRUE(s.Contains(static_cast<SpvCapability>(0x7fffffffu)));
  188. }
  189. TEST(CapabilitySet, AddEnum) {
  190. CapabilitySet s(SpvCapabilityShader);
  191. s.Add(SpvCapabilityKernel);
  192. s.Add(static_cast<SpvCapability>(42));
  193. EXPECT_FALSE(s.Contains(SpvCapabilityMatrix));
  194. EXPECT_TRUE(s.Contains(SpvCapabilityShader));
  195. EXPECT_TRUE(s.Contains(SpvCapabilityKernel));
  196. EXPECT_TRUE(s.Contains(static_cast<SpvCapability>(42)));
  197. }
  198. TEST(CapabilitySet, InitializerListEmpty) {
  199. CapabilitySet s{};
  200. for (uint32_t i = 0; i < 1000; i++) {
  201. EXPECT_FALSE(s.Contains(static_cast<SpvCapability>(i)));
  202. }
  203. }
  204. struct ForEachCase {
  205. CapabilitySet capabilities;
  206. std::vector<SpvCapability> expected;
  207. };
  208. using CapabilitySetForEachTest = ::testing::TestWithParam<ForEachCase>;
  209. TEST_P(CapabilitySetForEachTest, CallsAsExpected) {
  210. EXPECT_THAT(ElementsIn(GetParam().capabilities), Eq(GetParam().expected));
  211. }
  212. TEST_P(CapabilitySetForEachTest, CopyConstructor) {
  213. CapabilitySet copy(GetParam().capabilities);
  214. EXPECT_THAT(ElementsIn(copy), Eq(GetParam().expected));
  215. }
  216. TEST_P(CapabilitySetForEachTest, MoveConstructor) {
  217. // We need a writable copy to move from.
  218. CapabilitySet copy(GetParam().capabilities);
  219. CapabilitySet moved(std::move(copy));
  220. EXPECT_THAT(ElementsIn(moved), Eq(GetParam().expected));
  221. // The moved-from set is empty.
  222. EXPECT_THAT(ElementsIn(copy), Eq(std::vector<SpvCapability>{}));
  223. }
  224. TEST_P(CapabilitySetForEachTest, OperatorEquals) {
  225. CapabilitySet assigned = GetParam().capabilities;
  226. EXPECT_THAT(ElementsIn(assigned), Eq(GetParam().expected));
  227. }
  228. TEST_P(CapabilitySetForEachTest, OperatorEqualsSelfAssign) {
  229. CapabilitySet assigned{GetParam().capabilities};
  230. assigned = assigned;
  231. EXPECT_THAT(ElementsIn(assigned), Eq(GetParam().expected));
  232. }
  233. INSTANTIATE_TEST_SUITE_P(Samples, CapabilitySetForEachTest,
  234. ValuesIn(std::vector<ForEachCase>{
  235. {{}, {}},
  236. {{SpvCapabilityMatrix}, {SpvCapabilityMatrix}},
  237. {{SpvCapabilityKernel, SpvCapabilityShader},
  238. {SpvCapabilityShader, SpvCapabilityKernel}},
  239. {{static_cast<SpvCapability>(999)},
  240. {static_cast<SpvCapability>(999)}},
  241. {{static_cast<SpvCapability>(0x7fffffff)},
  242. {static_cast<SpvCapability>(0x7fffffff)}},
  243. // Mixture and out of order
  244. {{static_cast<SpvCapability>(0x7fffffff),
  245. static_cast<SpvCapability>(100),
  246. SpvCapabilityShader, SpvCapabilityMatrix},
  247. {SpvCapabilityMatrix, SpvCapabilityShader,
  248. static_cast<SpvCapability>(100),
  249. static_cast<SpvCapability>(0x7fffffff)}},
  250. }));
  251. } // namespace
  252. } // namespace spvtools