enum_set_test.cpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898
  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 "source/enum_set.h"
  15. #include <algorithm>
  16. #include <array>
  17. #include <random>
  18. #include <utility>
  19. #include <vector>
  20. #include "gmock/gmock.h"
  21. #include "test/unit_spirv.h"
  22. namespace spvtools {
  23. namespace {
  24. using spvtest::ElementsIn;
  25. using ::testing::Eq;
  26. using ::testing::Values;
  27. using ::testing::ValuesIn;
  28. enum class TestEnum : uint32_t {
  29. ZERO = 0,
  30. ONE = 1,
  31. TWO = 2,
  32. THREE = 3,
  33. FOUR = 4,
  34. FIVE = 5,
  35. EIGHT = 8,
  36. TWENTY = 20,
  37. TWENTY_FOUR = 24,
  38. THIRTY = 30,
  39. ONE_HUNDRED = 100,
  40. ONE_HUNDRED_FIFTY = 150,
  41. TWO_HUNDRED = 200,
  42. THREE_HUNDRED = 300,
  43. FOUR_HUNDRED = 400,
  44. FIVE_HUNDRED = 500,
  45. SIX_HUNDRED = 600,
  46. };
  47. constexpr std::array kCapabilities{
  48. spv::Capability::Matrix,
  49. spv::Capability::Shader,
  50. spv::Capability::Geometry,
  51. spv::Capability::Tessellation,
  52. spv::Capability::Addresses,
  53. spv::Capability::Linkage,
  54. spv::Capability::Kernel,
  55. spv::Capability::Vector16,
  56. spv::Capability::Float16Buffer,
  57. spv::Capability::Float16,
  58. spv::Capability::Float64,
  59. spv::Capability::Int64,
  60. spv::Capability::Int64Atomics,
  61. spv::Capability::ImageBasic,
  62. spv::Capability::ImageReadWrite,
  63. spv::Capability::ImageMipmap,
  64. spv::Capability::Pipes,
  65. spv::Capability::Groups,
  66. spv::Capability::DeviceEnqueue,
  67. spv::Capability::LiteralSampler,
  68. spv::Capability::AtomicStorage,
  69. spv::Capability::Int16,
  70. spv::Capability::TessellationPointSize,
  71. spv::Capability::GeometryPointSize,
  72. spv::Capability::ImageGatherExtended,
  73. spv::Capability::StorageImageMultisample,
  74. spv::Capability::UniformBufferArrayDynamicIndexing,
  75. spv::Capability::SampledImageArrayDynamicIndexing,
  76. spv::Capability::StorageBufferArrayDynamicIndexing,
  77. spv::Capability::StorageImageArrayDynamicIndexing,
  78. spv::Capability::ClipDistance,
  79. spv::Capability::CullDistance,
  80. spv::Capability::ImageCubeArray,
  81. spv::Capability::SampleRateShading,
  82. spv::Capability::ImageRect,
  83. spv::Capability::SampledRect,
  84. spv::Capability::GenericPointer,
  85. spv::Capability::Int8,
  86. spv::Capability::InputAttachment,
  87. spv::Capability::SparseResidency,
  88. spv::Capability::MinLod,
  89. spv::Capability::Sampled1D,
  90. spv::Capability::Image1D,
  91. spv::Capability::SampledCubeArray,
  92. spv::Capability::SampledBuffer,
  93. spv::Capability::ImageBuffer,
  94. spv::Capability::ImageMSArray,
  95. spv::Capability::StorageImageExtendedFormats,
  96. spv::Capability::ImageQuery,
  97. spv::Capability::DerivativeControl,
  98. spv::Capability::InterpolationFunction,
  99. spv::Capability::TransformFeedback,
  100. spv::Capability::GeometryStreams,
  101. spv::Capability::StorageImageReadWithoutFormat,
  102. spv::Capability::StorageImageWriteWithoutFormat,
  103. spv::Capability::MultiViewport,
  104. spv::Capability::SubgroupDispatch,
  105. spv::Capability::NamedBarrier,
  106. spv::Capability::PipeStorage,
  107. spv::Capability::GroupNonUniform,
  108. spv::Capability::GroupNonUniformVote,
  109. spv::Capability::GroupNonUniformArithmetic,
  110. spv::Capability::GroupNonUniformBallot,
  111. spv::Capability::GroupNonUniformShuffle,
  112. spv::Capability::GroupNonUniformShuffleRelative,
  113. spv::Capability::GroupNonUniformClustered,
  114. spv::Capability::GroupNonUniformQuad,
  115. spv::Capability::ShaderLayer,
  116. spv::Capability::ShaderViewportIndex,
  117. spv::Capability::UniformDecoration,
  118. spv::Capability::CoreBuiltinsARM,
  119. spv::Capability::FragmentShadingRateKHR,
  120. spv::Capability::SubgroupBallotKHR,
  121. spv::Capability::DrawParameters,
  122. spv::Capability::WorkgroupMemoryExplicitLayoutKHR,
  123. spv::Capability::WorkgroupMemoryExplicitLayout8BitAccessKHR,
  124. spv::Capability::WorkgroupMemoryExplicitLayout16BitAccessKHR,
  125. spv::Capability::SubgroupVoteKHR,
  126. spv::Capability::StorageBuffer16BitAccess,
  127. spv::Capability::StorageUniformBufferBlock16,
  128. spv::Capability::StorageUniform16,
  129. spv::Capability::UniformAndStorageBuffer16BitAccess,
  130. spv::Capability::StoragePushConstant16,
  131. spv::Capability::StorageInputOutput16,
  132. spv::Capability::DeviceGroup,
  133. spv::Capability::MultiView,
  134. spv::Capability::VariablePointersStorageBuffer,
  135. spv::Capability::VariablePointers,
  136. spv::Capability::AtomicStorageOps,
  137. spv::Capability::SampleMaskPostDepthCoverage,
  138. spv::Capability::StorageBuffer8BitAccess,
  139. spv::Capability::UniformAndStorageBuffer8BitAccess,
  140. spv::Capability::StoragePushConstant8,
  141. spv::Capability::DenormPreserve,
  142. spv::Capability::DenormFlushToZero,
  143. spv::Capability::SignedZeroInfNanPreserve,
  144. spv::Capability::RoundingModeRTE,
  145. spv::Capability::RoundingModeRTZ,
  146. spv::Capability::RayQueryProvisionalKHR,
  147. spv::Capability::RayQueryKHR,
  148. spv::Capability::RayTraversalPrimitiveCullingKHR,
  149. spv::Capability::RayTracingKHR,
  150. spv::Capability::Float16ImageAMD,
  151. spv::Capability::ImageGatherBiasLodAMD,
  152. spv::Capability::FragmentMaskAMD,
  153. spv::Capability::StencilExportEXT,
  154. spv::Capability::ImageReadWriteLodAMD,
  155. spv::Capability::Int64ImageEXT,
  156. spv::Capability::ShaderClockKHR,
  157. spv::Capability::SampleMaskOverrideCoverageNV,
  158. spv::Capability::GeometryShaderPassthroughNV,
  159. spv::Capability::ShaderViewportIndexLayerEXT,
  160. spv::Capability::ShaderViewportIndexLayerNV,
  161. spv::Capability::ShaderViewportMaskNV,
  162. spv::Capability::ShaderStereoViewNV,
  163. spv::Capability::PerViewAttributesNV,
  164. spv::Capability::FragmentFullyCoveredEXT,
  165. spv::Capability::MeshShadingNV,
  166. spv::Capability::ImageFootprintNV,
  167. spv::Capability::MeshShadingEXT,
  168. spv::Capability::FragmentBarycentricKHR,
  169. spv::Capability::FragmentBarycentricNV,
  170. spv::Capability::ComputeDerivativeGroupQuadsNV,
  171. spv::Capability::FragmentDensityEXT,
  172. spv::Capability::ShadingRateNV,
  173. spv::Capability::GroupNonUniformPartitionedNV,
  174. spv::Capability::ShaderNonUniform,
  175. spv::Capability::ShaderNonUniformEXT,
  176. spv::Capability::RuntimeDescriptorArray,
  177. spv::Capability::RuntimeDescriptorArrayEXT,
  178. spv::Capability::InputAttachmentArrayDynamicIndexing,
  179. spv::Capability::InputAttachmentArrayDynamicIndexingEXT,
  180. spv::Capability::UniformTexelBufferArrayDynamicIndexing,
  181. spv::Capability::UniformTexelBufferArrayDynamicIndexingEXT,
  182. spv::Capability::StorageTexelBufferArrayDynamicIndexing,
  183. spv::Capability::StorageTexelBufferArrayDynamicIndexingEXT,
  184. spv::Capability::UniformBufferArrayNonUniformIndexing,
  185. spv::Capability::UniformBufferArrayNonUniformIndexingEXT,
  186. spv::Capability::SampledImageArrayNonUniformIndexing,
  187. spv::Capability::SampledImageArrayNonUniformIndexingEXT,
  188. spv::Capability::StorageBufferArrayNonUniformIndexing,
  189. spv::Capability::StorageBufferArrayNonUniformIndexingEXT,
  190. spv::Capability::StorageImageArrayNonUniformIndexing,
  191. spv::Capability::StorageImageArrayNonUniformIndexingEXT,
  192. spv::Capability::InputAttachmentArrayNonUniformIndexing,
  193. spv::Capability::InputAttachmentArrayNonUniformIndexingEXT,
  194. spv::Capability::UniformTexelBufferArrayNonUniformIndexing,
  195. spv::Capability::UniformTexelBufferArrayNonUniformIndexingEXT,
  196. spv::Capability::StorageTexelBufferArrayNonUniformIndexing,
  197. spv::Capability::StorageTexelBufferArrayNonUniformIndexingEXT,
  198. spv::Capability::RayTracingNV,
  199. spv::Capability::RayTracingMotionBlurNV,
  200. spv::Capability::VulkanMemoryModel,
  201. spv::Capability::VulkanMemoryModelKHR,
  202. spv::Capability::VulkanMemoryModelDeviceScope,
  203. spv::Capability::VulkanMemoryModelDeviceScopeKHR,
  204. spv::Capability::PhysicalStorageBufferAddresses,
  205. spv::Capability::PhysicalStorageBufferAddressesEXT,
  206. spv::Capability::ComputeDerivativeGroupLinearNV,
  207. spv::Capability::RayTracingProvisionalKHR,
  208. spv::Capability::CooperativeMatrixNV,
  209. spv::Capability::FragmentShaderSampleInterlockEXT,
  210. spv::Capability::FragmentShaderShadingRateInterlockEXT,
  211. spv::Capability::ShaderSMBuiltinsNV,
  212. spv::Capability::FragmentShaderPixelInterlockEXT,
  213. spv::Capability::DemoteToHelperInvocation,
  214. spv::Capability::DemoteToHelperInvocationEXT,
  215. spv::Capability::RayTracingOpacityMicromapEXT,
  216. spv::Capability::ShaderInvocationReorderNV,
  217. spv::Capability::BindlessTextureNV,
  218. spv::Capability::SubgroupShuffleINTEL,
  219. spv::Capability::SubgroupBufferBlockIOINTEL,
  220. spv::Capability::SubgroupImageBlockIOINTEL,
  221. spv::Capability::SubgroupImageMediaBlockIOINTEL,
  222. spv::Capability::RoundToInfinityINTEL,
  223. spv::Capability::FloatingPointModeINTEL,
  224. spv::Capability::IntegerFunctions2INTEL,
  225. spv::Capability::FunctionPointersINTEL,
  226. spv::Capability::IndirectReferencesINTEL,
  227. spv::Capability::AsmINTEL,
  228. spv::Capability::AtomicFloat32MinMaxEXT,
  229. spv::Capability::AtomicFloat64MinMaxEXT,
  230. spv::Capability::AtomicFloat16MinMaxEXT,
  231. spv::Capability::VectorComputeINTEL,
  232. spv::Capability::VectorAnyINTEL,
  233. spv::Capability::ExpectAssumeKHR,
  234. spv::Capability::SubgroupAvcMotionEstimationINTEL,
  235. spv::Capability::SubgroupAvcMotionEstimationIntraINTEL,
  236. spv::Capability::SubgroupAvcMotionEstimationChromaINTEL,
  237. spv::Capability::VariableLengthArrayINTEL,
  238. spv::Capability::FunctionFloatControlINTEL,
  239. spv::Capability::FPGAMemoryAttributesINTEL,
  240. spv::Capability::FPFastMathModeINTEL,
  241. spv::Capability::ArbitraryPrecisionIntegersINTEL,
  242. spv::Capability::ArbitraryPrecisionFloatingPointINTEL,
  243. spv::Capability::UnstructuredLoopControlsINTEL,
  244. spv::Capability::FPGALoopControlsINTEL,
  245. spv::Capability::KernelAttributesINTEL,
  246. spv::Capability::FPGAKernelAttributesINTEL,
  247. spv::Capability::FPGAMemoryAccessesINTEL,
  248. spv::Capability::FPGAClusterAttributesINTEL,
  249. spv::Capability::LoopFuseINTEL,
  250. spv::Capability::FPGADSPControlINTEL,
  251. spv::Capability::MemoryAccessAliasingINTEL,
  252. spv::Capability::FPGAInvocationPipeliningAttributesINTEL,
  253. spv::Capability::FPGABufferLocationINTEL,
  254. spv::Capability::ArbitraryPrecisionFixedPointINTEL,
  255. spv::Capability::USMStorageClassesINTEL,
  256. spv::Capability::RuntimeAlignedAttributeINTEL,
  257. spv::Capability::IOPipesINTEL,
  258. spv::Capability::BlockingPipesINTEL,
  259. spv::Capability::FPGARegINTEL,
  260. spv::Capability::DotProductInputAll,
  261. spv::Capability::DotProductInputAllKHR,
  262. spv::Capability::DotProductInput4x8Bit,
  263. spv::Capability::DotProductInput4x8BitKHR,
  264. spv::Capability::DotProductInput4x8BitPacked,
  265. spv::Capability::DotProductInput4x8BitPackedKHR,
  266. spv::Capability::DotProduct,
  267. spv::Capability::DotProductKHR,
  268. spv::Capability::RayCullMaskKHR,
  269. spv::Capability::BitInstructions,
  270. spv::Capability::GroupNonUniformRotateKHR,
  271. spv::Capability::AtomicFloat32AddEXT,
  272. spv::Capability::AtomicFloat64AddEXT,
  273. spv::Capability::LongCompositesINTEL,
  274. spv::Capability::OptNoneINTEL,
  275. spv::Capability::AtomicFloat16AddEXT,
  276. spv::Capability::DebugInfoModuleINTEL,
  277. spv::Capability::SplitBarrierINTEL,
  278. spv::Capability::GroupUniformArithmeticKHR,
  279. spv::Capability::Max,
  280. };
  281. namespace {
  282. std::vector<TestEnum> enumerateValuesFromToWithStep(size_t start, size_t end,
  283. size_t step) {
  284. assert(end > start && "end > start");
  285. std::vector<TestEnum> orderedValues;
  286. for (size_t i = start; i < end; i += step) {
  287. orderedValues.push_back(static_cast<TestEnum>(i));
  288. }
  289. return orderedValues;
  290. }
  291. EnumSet<TestEnum> createSetUnorderedInsertion(
  292. const std::vector<TestEnum>& values) {
  293. std::vector shuffledValues(values.cbegin(), values.cend());
  294. std::mt19937 rng(0);
  295. std::shuffle(shuffledValues.begin(), shuffledValues.end(), rng);
  296. EnumSet<TestEnum> set;
  297. for (auto value : shuffledValues) {
  298. set.insert(value);
  299. }
  300. return set;
  301. }
  302. } // namespace
  303. TEST(EnumSet, IsEmpty1) {
  304. EnumSet<TestEnum> set;
  305. EXPECT_TRUE(set.empty());
  306. set.insert(TestEnum::ZERO);
  307. EXPECT_FALSE(set.empty());
  308. }
  309. TEST(EnumSet, IsEmpty2) {
  310. EnumSet<TestEnum> set;
  311. EXPECT_TRUE(set.empty());
  312. set.insert(TestEnum::ONE_HUNDRED_FIFTY);
  313. EXPECT_FALSE(set.empty());
  314. }
  315. TEST(EnumSet, IsEmpty3) {
  316. EnumSet<TestEnum> set(TestEnum::FOUR);
  317. EXPECT_FALSE(set.empty());
  318. }
  319. TEST(EnumSet, IsEmpty4) {
  320. EnumSet<TestEnum> set(TestEnum::THREE_HUNDRED);
  321. EXPECT_FALSE(set.empty());
  322. }
  323. TEST(EnumSetHasAnyOf, EmptySetEmptyQuery) {
  324. const EnumSet<TestEnum> set;
  325. const EnumSet<TestEnum> empty;
  326. EXPECT_TRUE(set.HasAnyOf(empty));
  327. EXPECT_TRUE(EnumSet<TestEnum>().HasAnyOf(EnumSet<TestEnum>()));
  328. }
  329. TEST(EnumSetHasAnyOf, MaskSetEmptyQuery) {
  330. EnumSet<TestEnum> set;
  331. const EnumSet<TestEnum> empty;
  332. set.insert(TestEnum::FIVE);
  333. set.insert(TestEnum::EIGHT);
  334. EXPECT_TRUE(set.HasAnyOf(empty));
  335. }
  336. TEST(EnumSetHasAnyOf, OverflowSetEmptyQuery) {
  337. EnumSet<TestEnum> set;
  338. const EnumSet<TestEnum> empty;
  339. set.insert(TestEnum::TWO_HUNDRED);
  340. set.insert(TestEnum::THREE_HUNDRED);
  341. EXPECT_TRUE(set.HasAnyOf(empty));
  342. }
  343. TEST(EnumSetHasAnyOf, EmptyQuery) {
  344. EnumSet<TestEnum> set;
  345. const EnumSet<TestEnum> empty;
  346. set.insert(TestEnum::FIVE);
  347. set.insert(TestEnum::EIGHT);
  348. set.insert(TestEnum::TWO_HUNDRED);
  349. set.insert(TestEnum::THREE_HUNDRED);
  350. EXPECT_TRUE(set.HasAnyOf(empty));
  351. }
  352. TEST(EnumSetHasAnyOf, EmptyQueryAlwaysTrue) {
  353. EnumSet<TestEnum> set;
  354. const EnumSet<TestEnum> empty;
  355. EXPECT_TRUE(set.HasAnyOf(empty));
  356. set.insert(TestEnum::FIVE);
  357. EXPECT_TRUE(set.HasAnyOf(empty));
  358. EXPECT_TRUE(
  359. EnumSet<TestEnum>(TestEnum::ONE_HUNDRED).HasAnyOf(EnumSet<TestEnum>()));
  360. }
  361. TEST(EnumSetHasAnyOf, ReflexiveMask) {
  362. EnumSet<TestEnum> set(TestEnum::THREE);
  363. set.insert(TestEnum::TWENTY_FOUR);
  364. set.insert(TestEnum::THIRTY);
  365. EXPECT_TRUE(set.HasAnyOf(set));
  366. }
  367. TEST(EnumSetHasAnyOf, ReflexiveOverflow) {
  368. EnumSet<TestEnum> set(TestEnum::TWO_HUNDRED);
  369. set.insert(TestEnum::TWO_HUNDRED);
  370. set.insert(TestEnum::FOUR_HUNDRED);
  371. EXPECT_TRUE(set.HasAnyOf(set));
  372. }
  373. TEST(EnumSetHasAnyOf, Reflexive) {
  374. EnumSet<TestEnum> set(TestEnum::THREE);
  375. set.insert(TestEnum::TWENTY_FOUR);
  376. set.insert(TestEnum::THREE_HUNDRED);
  377. set.insert(TestEnum::FOUR_HUNDRED);
  378. EXPECT_TRUE(set.HasAnyOf(set));
  379. }
  380. TEST(EnumSetHasAnyOf, EmptySetHasNone) {
  381. EnumSet<TestEnum> set;
  382. EnumSet<TestEnum> items;
  383. for (uint32_t i = 0; i < 200; ++i) {
  384. TestEnum enumValue = static_cast<TestEnum>(i);
  385. items.insert(enumValue);
  386. EXPECT_FALSE(set.HasAnyOf(items));
  387. EXPECT_FALSE(set.HasAnyOf(EnumSet<TestEnum>(enumValue)));
  388. }
  389. }
  390. TEST(EnumSetHasAnyOf, MaskSetMaskQuery) {
  391. EnumSet<TestEnum> set(TestEnum::ZERO);
  392. EnumSet<TestEnum> items(TestEnum::ONE);
  393. EXPECT_FALSE(set.HasAnyOf(items));
  394. set.insert(TestEnum::TWO);
  395. items.insert(TestEnum::THREE);
  396. EXPECT_FALSE(set.HasAnyOf(items));
  397. set.insert(TestEnum::THREE);
  398. EXPECT_TRUE(set.HasAnyOf(items));
  399. set.insert(TestEnum::FOUR);
  400. EXPECT_TRUE(set.HasAnyOf(items));
  401. }
  402. TEST(EnumSetHasAnyOf, OverflowSetOverflowQuery) {
  403. EnumSet<TestEnum> set(TestEnum::ONE_HUNDRED);
  404. EnumSet<TestEnum> items(TestEnum::TWO_HUNDRED);
  405. EXPECT_FALSE(set.HasAnyOf(items));
  406. set.insert(TestEnum::THREE_HUNDRED);
  407. items.insert(TestEnum::FOUR_HUNDRED);
  408. EXPECT_FALSE(set.HasAnyOf(items));
  409. set.insert(TestEnum::TWO_HUNDRED);
  410. EXPECT_TRUE(set.HasAnyOf(items));
  411. set.insert(TestEnum::FIVE_HUNDRED);
  412. EXPECT_TRUE(set.HasAnyOf(items));
  413. }
  414. TEST(EnumSetHasAnyOf, GeneralCase) {
  415. EnumSet<TestEnum> set(TestEnum::ZERO);
  416. EnumSet<TestEnum> items(TestEnum::ONE_HUNDRED);
  417. EXPECT_FALSE(set.HasAnyOf(items));
  418. set.insert(TestEnum::THREE_HUNDRED);
  419. items.insert(TestEnum::FOUR);
  420. EXPECT_FALSE(set.HasAnyOf(items));
  421. set.insert(TestEnum::FIVE);
  422. items.insert(TestEnum::FIVE_HUNDRED);
  423. EXPECT_FALSE(set.HasAnyOf(items));
  424. set.insert(TestEnum::FIVE_HUNDRED);
  425. EXPECT_TRUE(set.HasAnyOf(items));
  426. EXPECT_FALSE(set.HasAnyOf(EnumSet<TestEnum>(TestEnum::TWENTY)));
  427. EXPECT_FALSE(set.HasAnyOf(EnumSet<TestEnum>(TestEnum::SIX_HUNDRED)));
  428. EXPECT_TRUE(set.HasAnyOf(EnumSet<TestEnum>(TestEnum::FIVE)));
  429. EXPECT_TRUE(set.HasAnyOf(EnumSet<TestEnum>(TestEnum::THREE_HUNDRED)));
  430. EXPECT_TRUE(set.HasAnyOf(EnumSet<TestEnum>(TestEnum::ZERO)));
  431. }
  432. TEST(EnumSet, DefaultIsEmpty) {
  433. EnumSet<TestEnum> set;
  434. for (uint32_t i = 0; i < 1000; ++i) {
  435. EXPECT_FALSE(set.contains(static_cast<TestEnum>(i)));
  436. }
  437. }
  438. TEST(EnumSet, EqualityCompareEmpty) {
  439. EnumSet<TestEnum> set1;
  440. EnumSet<TestEnum> set2;
  441. EXPECT_TRUE(set1 == set2);
  442. EXPECT_FALSE(set1 != set2);
  443. }
  444. TEST(EnumSet, EqualityCompareSame) {
  445. EnumSet<TestEnum> set1;
  446. EnumSet<TestEnum> set2;
  447. set1.insert(TestEnum::ONE);
  448. set1.insert(TestEnum::TWENTY);
  449. set2.insert(TestEnum::TWENTY);
  450. set2.insert(TestEnum::ONE);
  451. EXPECT_TRUE(set1 == set2);
  452. EXPECT_FALSE(set1 != set2);
  453. }
  454. TEST(EnumSet, EqualityCompareDifferent) {
  455. EnumSet<TestEnum> set1;
  456. EnumSet<TestEnum> set2;
  457. set1.insert(TestEnum::ONE);
  458. set1.insert(TestEnum::TWENTY);
  459. set2.insert(TestEnum::FIVE);
  460. set2.insert(TestEnum::ONE);
  461. EXPECT_FALSE(set1 == set2);
  462. EXPECT_TRUE(set1 != set2);
  463. }
  464. TEST(EnumSet, ConstructFromIterators) {
  465. auto orderedValues = enumerateValuesFromToWithStep(0, 2, /* step= */ 1);
  466. EnumSet<TestEnum> set1 = createSetUnorderedInsertion(orderedValues);
  467. EnumSet<TestEnum> set2(orderedValues.cbegin(), orderedValues.cend());
  468. EXPECT_EQ(set1, set2);
  469. }
  470. TEST(EnumSet, InsertUsingIteratorRange) {
  471. auto orderedValues = enumerateValuesFromToWithStep(0, 2, /* step= */ 1);
  472. EnumSet<TestEnum> set1 = createSetUnorderedInsertion(orderedValues);
  473. EnumSet<TestEnum> set2;
  474. set2.insert(orderedValues.cbegin(), orderedValues.cend());
  475. EXPECT_EQ(set1, set2);
  476. }
  477. TEST(CapabilitySet, RangeBasedLoopOrderIsEnumOrder) {
  478. auto orderedValues = enumerateValuesFromToWithStep(0, 2, /* step= */ 1);
  479. auto set = createSetUnorderedInsertion(orderedValues);
  480. size_t index = 0;
  481. for (auto value : set) {
  482. ASSERT_THAT(value, Eq(orderedValues[index]));
  483. index++;
  484. }
  485. }
  486. TEST(CapabilitySet, ConstructSingleMemberMatrix) {
  487. CapabilitySet s(spv::Capability::Matrix);
  488. EXPECT_TRUE(s.contains(spv::Capability::Matrix));
  489. EXPECT_FALSE(s.contains(spv::Capability::Shader));
  490. EXPECT_FALSE(s.contains(static_cast<spv::Capability>(1000)));
  491. }
  492. TEST(CapabilitySet, ConstructSingleMemberMaxInMask) {
  493. CapabilitySet s(static_cast<spv::Capability>(63));
  494. EXPECT_FALSE(s.contains(spv::Capability::Matrix));
  495. EXPECT_FALSE(s.contains(spv::Capability::Shader));
  496. EXPECT_TRUE(s.contains(static_cast<spv::Capability>(63)));
  497. EXPECT_FALSE(s.contains(static_cast<spv::Capability>(64)));
  498. EXPECT_FALSE(s.contains(static_cast<spv::Capability>(1000)));
  499. }
  500. TEST(CapabilitySet, ConstructSingleMemberMinOverflow) {
  501. // Check the first one that forces overflow beyond the mask.
  502. CapabilitySet s(static_cast<spv::Capability>(64));
  503. EXPECT_FALSE(s.contains(spv::Capability::Matrix));
  504. EXPECT_FALSE(s.contains(spv::Capability::Shader));
  505. EXPECT_FALSE(s.contains(static_cast<spv::Capability>(63)));
  506. EXPECT_TRUE(s.contains(static_cast<spv::Capability>(64)));
  507. EXPECT_FALSE(s.contains(static_cast<spv::Capability>(1000)));
  508. }
  509. TEST(CapabilitySet, ConstructSingleMemberMaxOverflow) {
  510. // Check the max 32-bit signed int.
  511. CapabilitySet s(static_cast<spv::Capability>(0x7fffffffu));
  512. EXPECT_FALSE(s.contains(spv::Capability::Matrix));
  513. EXPECT_FALSE(s.contains(spv::Capability::Shader));
  514. EXPECT_FALSE(s.contains(static_cast<spv::Capability>(1000)));
  515. EXPECT_TRUE(s.contains(static_cast<spv::Capability>(0x7fffffffu)));
  516. }
  517. TEST(CapabilitySet, AddEnum) {
  518. CapabilitySet s(spv::Capability::Shader);
  519. s.insert(spv::Capability::Kernel);
  520. s.insert(static_cast<spv::Capability>(42));
  521. EXPECT_FALSE(s.contains(spv::Capability::Matrix));
  522. EXPECT_TRUE(s.contains(spv::Capability::Shader));
  523. EXPECT_TRUE(s.contains(spv::Capability::Kernel));
  524. EXPECT_TRUE(s.contains(static_cast<spv::Capability>(42)));
  525. }
  526. TEST(CapabilitySet, InsertReturnsIteratorToInserted) {
  527. CapabilitySet set;
  528. auto[it, inserted] = set.insert(spv::Capability::Kernel);
  529. EXPECT_TRUE(inserted);
  530. EXPECT_EQ(*it, spv::Capability::Kernel);
  531. }
  532. TEST(CapabilitySet, InsertReturnsIteratorToElementOnDoubleInsertion) {
  533. CapabilitySet set;
  534. EXPECT_FALSE(set.contains(spv::Capability::Shader));
  535. {
  536. auto[it, inserted] = set.insert(spv::Capability::Shader);
  537. EXPECT_TRUE(inserted);
  538. EXPECT_EQ(*it, spv::Capability::Shader);
  539. }
  540. EXPECT_TRUE(set.contains(spv::Capability::Shader));
  541. auto[it, inserted] = set.insert(spv::Capability::Shader);
  542. EXPECT_FALSE(inserted);
  543. EXPECT_EQ(*it, spv::Capability::Shader);
  544. EXPECT_TRUE(set.contains(spv::Capability::Shader));
  545. }
  546. TEST(CapabilitySet, InsertWithHintWorks) {
  547. CapabilitySet set;
  548. EXPECT_FALSE(set.contains(spv::Capability::Shader));
  549. auto it = set.insert(set.begin(), spv::Capability::Shader);
  550. EXPECT_EQ(*it, spv::Capability::Shader);
  551. EXPECT_TRUE(set.contains(spv::Capability::Shader));
  552. }
  553. TEST(CapabilitySet, InsertWithEndHintWorks) {
  554. CapabilitySet set;
  555. EXPECT_FALSE(set.contains(spv::Capability::Shader));
  556. auto it = set.insert(set.end(), spv::Capability::Shader);
  557. EXPECT_EQ(*it, spv::Capability::Shader);
  558. EXPECT_TRUE(set.contains(spv::Capability::Shader));
  559. }
  560. TEST(CapabilitySet, IteratorCanBeCopied) {
  561. CapabilitySet set;
  562. set.insert(spv::Capability::Matrix);
  563. set.insert(spv::Capability::Shader);
  564. set.insert(spv::Capability::Geometry);
  565. set.insert(spv::Capability::Float64);
  566. set.insert(spv::Capability::Float16);
  567. auto a = set.begin();
  568. ++a;
  569. auto b = a;
  570. EXPECT_EQ(*b, *a);
  571. ++b;
  572. EXPECT_NE(*b, *a);
  573. ++a;
  574. EXPECT_EQ(*b, *a);
  575. ++a;
  576. EXPECT_NE(*b, *a);
  577. }
  578. TEST(CapabilitySet, IteratorBeginToEndPostfix) {
  579. auto orderedValues = enumerateValuesFromToWithStep(0, 100, /* step= */ 1);
  580. auto set = createSetUnorderedInsertion(orderedValues);
  581. size_t index = 0;
  582. for (auto it = set.cbegin(); it != set.cend(); it++, index++) {
  583. EXPECT_EQ(*it, orderedValues[index]);
  584. }
  585. }
  586. TEST(CapabilitySet, IteratorBeginToEndPrefix) {
  587. auto orderedValues = enumerateValuesFromToWithStep(0, 100, /* step= */ 1);
  588. auto set = createSetUnorderedInsertion(orderedValues);
  589. size_t index = 0;
  590. for (auto it = set.cbegin(); it != set.cend(); ++it, index++) {
  591. EXPECT_EQ(*it, orderedValues[index]);
  592. }
  593. }
  594. TEST(CapabilitySet, IteratorBeginToEndPrefixStep) {
  595. auto orderedValues = enumerateValuesFromToWithStep(0, 100, /* step= */ 8);
  596. auto set = createSetUnorderedInsertion(orderedValues);
  597. size_t index = 0;
  598. for (auto it = set.cbegin(); it != set.cend(); ++it, index++) {
  599. ASSERT_EQ(*it, orderedValues[index]);
  600. }
  601. }
  602. TEST(CapabilitySet, IteratorBeginOnEmpty) {
  603. CapabilitySet set;
  604. auto begin = set.begin();
  605. auto end = set.end();
  606. ASSERT_EQ(begin, end);
  607. }
  608. TEST(CapabilitySet, IteratorBeginOnSingleNonZeroValue) {
  609. CapabilitySet set;
  610. set.insert(spv::Capability::Shader);
  611. auto begin = set.begin();
  612. auto end = set.end();
  613. ASSERT_NE(begin, end);
  614. ASSERT_EQ(*begin, spv::Capability::Shader);
  615. }
  616. TEST(CapabilitySet, IteratorForLoopNonZeroValue) {
  617. CapabilitySet set;
  618. set.insert(spv::Capability::Shader);
  619. set.insert(spv::Capability::Tessellation);
  620. auto begin = set.begin();
  621. auto end = set.end();
  622. ASSERT_NE(begin, end);
  623. ASSERT_EQ(*begin, spv::Capability::Shader);
  624. begin++;
  625. ASSERT_NE(begin, end);
  626. ASSERT_EQ(*begin, spv::Capability::Tessellation);
  627. begin++;
  628. ASSERT_EQ(begin, end);
  629. }
  630. TEST(CapabilitySet, IteratorPastEnd) {
  631. CapabilitySet set;
  632. set.insert(spv::Capability::Shader);
  633. auto begin = set.begin();
  634. auto end = set.end();
  635. ASSERT_NE(begin, end);
  636. ASSERT_EQ(*begin, spv::Capability::Shader);
  637. begin++;
  638. ASSERT_EQ(begin, end);
  639. begin++;
  640. ASSERT_EQ(begin, end);
  641. }
  642. TEST(CapabilitySet, CompatibleWithSTLFind) {
  643. CapabilitySet set;
  644. set.insert(spv::Capability::Matrix);
  645. set.insert(spv::Capability::Shader);
  646. set.insert(spv::Capability::Geometry);
  647. set.insert(spv::Capability::Tessellation);
  648. set.insert(spv::Capability::Addresses);
  649. set.insert(spv::Capability::Linkage);
  650. set.insert(spv::Capability::Kernel);
  651. set.insert(spv::Capability::Vector16);
  652. set.insert(spv::Capability::Float16Buffer);
  653. set.insert(spv::Capability::Float64);
  654. {
  655. auto it = std::find(set.cbegin(), set.cend(), spv::Capability::Vector16);
  656. ASSERT_NE(it, set.end());
  657. ASSERT_EQ(*it, spv::Capability::Vector16);
  658. }
  659. {
  660. auto it = std::find(set.cbegin(), set.cend(), spv::Capability::Float16);
  661. ASSERT_EQ(it, set.end());
  662. }
  663. }
  664. TEST(CapabilitySet, CompatibleWithSTLForEach) {
  665. auto orderedValues = enumerateValuesFromToWithStep(0, 100, /* step= */ 15);
  666. auto set = createSetUnorderedInsertion(orderedValues);
  667. size_t index = 0;
  668. std::for_each(set.cbegin(), set.cend(), [&](auto item) {
  669. ASSERT_EQ(item, orderedValues[index]);
  670. index++;
  671. });
  672. }
  673. TEST(CapabilitySet, InitializerListEmpty) {
  674. CapabilitySet s{};
  675. for (uint32_t i = 0; i < 1000; i++) {
  676. EXPECT_FALSE(s.contains(static_cast<spv::Capability>(i)));
  677. }
  678. }
  679. TEST(CapabilitySet, LargeSetHasInsertedElements) {
  680. CapabilitySet set;
  681. for (auto c : kCapabilities) {
  682. EXPECT_FALSE(set.contains(c));
  683. }
  684. for (auto c : kCapabilities) {
  685. set.insert(c);
  686. EXPECT_TRUE(set.contains(c));
  687. }
  688. for (auto c : kCapabilities) {
  689. EXPECT_TRUE(set.contains(c));
  690. }
  691. }
  692. TEST(CapabilitySet, LargeSetHasUnsortedInsertedElements) {
  693. std::vector shuffledCapabilities(kCapabilities.cbegin(),
  694. kCapabilities.cend());
  695. std::mt19937 rng(0);
  696. std::shuffle(shuffledCapabilities.begin(), shuffledCapabilities.end(), rng);
  697. CapabilitySet set;
  698. for (auto c : shuffledCapabilities) {
  699. EXPECT_FALSE(set.contains(c));
  700. }
  701. for (auto c : shuffledCapabilities) {
  702. set.insert(c);
  703. EXPECT_TRUE(set.contains(c));
  704. }
  705. for (auto c : shuffledCapabilities) {
  706. EXPECT_TRUE(set.contains(c));
  707. }
  708. }
  709. TEST(CapabilitySet, LargeSetHasUnsortedRemovedElement) {
  710. std::vector shuffledCapabilities(kCapabilities.cbegin(),
  711. kCapabilities.cend());
  712. std::mt19937 rng(0);
  713. std::shuffle(shuffledCapabilities.begin(), shuffledCapabilities.end(), rng);
  714. CapabilitySet set;
  715. for (auto c : shuffledCapabilities) {
  716. set.insert(c);
  717. EXPECT_TRUE(set.contains(c));
  718. }
  719. for (auto c : kCapabilities) {
  720. set.erase(c);
  721. }
  722. for (auto c : shuffledCapabilities) {
  723. EXPECT_FALSE(set.contains(c));
  724. }
  725. }
  726. struct ForEachCase {
  727. CapabilitySet capabilities;
  728. std::vector<spv::Capability> expected;
  729. };
  730. using CapabilitySetForEachTest = ::testing::TestWithParam<ForEachCase>;
  731. TEST_P(CapabilitySetForEachTest, CallsAsExpected) {
  732. EXPECT_THAT(ElementsIn(GetParam().capabilities), Eq(GetParam().expected));
  733. }
  734. TEST_P(CapabilitySetForEachTest, CopyConstructor) {
  735. CapabilitySet copy(GetParam().capabilities);
  736. EXPECT_THAT(ElementsIn(copy), Eq(GetParam().expected));
  737. }
  738. TEST_P(CapabilitySetForEachTest, MoveConstructor) {
  739. // We need a writable copy to move from.
  740. CapabilitySet copy(GetParam().capabilities);
  741. CapabilitySet moved(std::move(copy));
  742. EXPECT_THAT(ElementsIn(moved), Eq(GetParam().expected));
  743. }
  744. TEST_P(CapabilitySetForEachTest, OperatorEquals) {
  745. CapabilitySet assigned = GetParam().capabilities;
  746. EXPECT_THAT(ElementsIn(assigned), Eq(GetParam().expected));
  747. }
  748. TEST_P(CapabilitySetForEachTest, OperatorEqualsSelfAssign) {
  749. CapabilitySet assigned{GetParam().capabilities};
  750. assigned = assigned; // NOLINT
  751. EXPECT_THAT(ElementsIn(assigned), Eq(GetParam().expected));
  752. }
  753. INSTANTIATE_TEST_SUITE_P(
  754. Samples, CapabilitySetForEachTest,
  755. ValuesIn(std::vector<ForEachCase>{
  756. {{}, {}},
  757. {{spv::Capability::Matrix}, {spv::Capability::Matrix}},
  758. {{spv::Capability::Kernel, spv::Capability::Shader},
  759. {spv::Capability::Shader, spv::Capability::Kernel}},
  760. {{static_cast<spv::Capability>(999)},
  761. {static_cast<spv::Capability>(999)}},
  762. {{static_cast<spv::Capability>(0x7fffffff)},
  763. {static_cast<spv::Capability>(0x7fffffff)}},
  764. // Mixture and out of order
  765. {{static_cast<spv::Capability>(0x7fffffff),
  766. static_cast<spv::Capability>(100), spv::Capability::Shader,
  767. spv::Capability::Matrix},
  768. {spv::Capability::Matrix, spv::Capability::Shader,
  769. static_cast<spv::Capability>(100),
  770. static_cast<spv::Capability>(0x7fffffff)}},
  771. }));
  772. using BoundaryTestWithParam = ::testing::TestWithParam<spv::Capability>;
  773. TEST_P(BoundaryTestWithParam, InsertedContains) {
  774. CapabilitySet set;
  775. set.insert(GetParam());
  776. EXPECT_TRUE(set.contains(GetParam()));
  777. }
  778. INSTANTIATE_TEST_SUITE_P(
  779. Samples, BoundaryTestWithParam,
  780. Values(static_cast<spv::Capability>(0), static_cast<spv::Capability>(63),
  781. static_cast<spv::Capability>(64), static_cast<spv::Capability>(65),
  782. static_cast<spv::Capability>(127), static_cast<spv::Capability>(128),
  783. static_cast<spv::Capability>(129)));
  784. } // namespace
  785. } // namespace spvtools