mkql_bit_utils_ut.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include "mkql_computation_node_ut.h"
  2. #include <yql/essentials/minikql/arrow/mkql_bit_utils.h>
  3. namespace NKikimr {
  4. namespace NMiniKQL {
  5. namespace {
  6. ui8 NaiveCompressByte(ui8 value, ui8 mask) {
  7. ui8 result = 0;
  8. ui8 outPos = 0;
  9. for (ui8 i = 0; i < 8; ++i) {
  10. if (mask & (1 << i)) {
  11. ui8 bit = (value & (1 << i)) != 0;
  12. result |= (bit << outPos);
  13. ++outPos;
  14. }
  15. }
  16. return result;
  17. }
  18. } // namespace
  19. Y_UNIT_TEST_SUITE(TMiniKQLBitUtilsTest) {
  20. Y_UNIT_TEST(TestCompressByte) {
  21. for (size_t value = 0; value < 256; ++value) {
  22. for (size_t mask = 0; mask < 256; ++mask) {
  23. UNIT_ASSERT_EQUAL(NaiveCompressByte(value, mask), CompressByte(value, mask));
  24. }
  25. }
  26. }
  27. Y_UNIT_TEST(TestLoad) {
  28. const ui8 src[] = {0b01110100, 0b11011101, 0b01101011};
  29. UNIT_ASSERT_EQUAL(LoadByteUnaligned(src, 10), 0b11110111);
  30. UNIT_ASSERT_EQUAL(LoadByteUnaligned(src, 16), 0b01101011);
  31. }
  32. Y_UNIT_TEST(CompressAligned) {
  33. const ui8 data[] = {0b01110100, 0b11011101, 0b01101011};
  34. const ui8 mask[] = {0b11101100, 0b10111010, 0b10001111};
  35. ui8 result[100];
  36. auto res = CompressBitmap(data, 0, mask, 0, result, 0, 24);
  37. UNIT_ASSERT_EQUAL(res, 15);
  38. UNIT_ASSERT_EQUAL(result[0], 0b11001101);
  39. UNIT_ASSERT_EQUAL(result[1] & 0x7fu, 0b00101110);
  40. }
  41. Y_UNIT_TEST(CompressUnalignedOutput) {
  42. const ui8 data[] = {0b01110100, 0b11011101, 0b01101011};
  43. const ui8 mask[] = {0b11101100, 0b10111010, 0b10001111};
  44. ui8 result[100];
  45. result[0] = 0b101;
  46. auto res = CompressBitmap(data, 0, mask, 0, result, 3, 24);
  47. UNIT_ASSERT_EQUAL(res, 18);
  48. UNIT_ASSERT_EQUAL(result[0], 0b01101101);
  49. UNIT_ASSERT_EQUAL(result[1], 0b01110110);
  50. UNIT_ASSERT_EQUAL(result[2] & 0x3, 0b01);
  51. }
  52. }
  53. } // namespace NMiniKQL
  54. } // namespace NKikimr