GH-43733: Test that the key encoder can handle boolean scalar values well.
| 29 | |
| 30 | // GH-43733: Test that the key encoder can handle boolean scalar values well. |
| 31 | TEST(TestKeyEncoder, BooleanScalar) { |
| 32 | for (auto scalar : {BooleanScalar{}, BooleanScalar{true}, BooleanScalar{false}}) { |
| 33 | BooleanKeyEncoder key_encoder; |
| 34 | SCOPED_TRACE("scalar " + scalar.ToString()); |
| 35 | constexpr int64_t kBatchLength = 10; |
| 36 | std::array<int32_t, kBatchLength> lengths{}; |
| 37 | key_encoder.AddLength(ExecValue{&scalar}, kBatchLength, lengths.data()); |
| 38 | // Check that the lengths are all 2. |
| 39 | constexpr int32_t kPayloadWidth = |
| 40 | BooleanKeyEncoder::kByteWidth + BooleanKeyEncoder::kExtraByteForNull; |
| 41 | for (int i = 0; i < kBatchLength; ++i) { |
| 42 | ASSERT_EQ(kPayloadWidth, lengths[i]); |
| 43 | } |
| 44 | std::array<std::array<uint8_t, kPayloadWidth>, kBatchLength> payloads{}; |
| 45 | std::array<uint8_t*, kBatchLength> payload_ptrs{}; |
| 46 | // Reset the payload pointers to point to the beginning of each payload. |
| 47 | // This is necessary because the key encoder may have modified the pointers. |
| 48 | auto reset_payload_ptrs = [&payload_ptrs, &payloads]() { |
| 49 | std::transform(payloads.begin(), payloads.end(), payload_ptrs.begin(), |
| 50 | [](auto& payload) -> uint8_t* { return payload.data(); }); |
| 51 | }; |
| 52 | reset_payload_ptrs(); |
| 53 | ASSERT_OK(key_encoder.Encode(ExecValue{&scalar}, kBatchLength, payload_ptrs.data())); |
| 54 | reset_payload_ptrs(); |
| 55 | ASSERT_OK_AND_ASSIGN(auto array_data, |
| 56 | key_encoder.Decode(payload_ptrs.data(), kBatchLength, |
| 57 | ::arrow::default_memory_pool())); |
| 58 | ASSERT_EQ(kBatchLength, array_data->length); |
| 59 | auto boolean_array = std::make_shared<BooleanArray>(array_data); |
| 60 | ASSERT_OK(arrow::internal::ValidateArrayFull(*array_data)); |
| 61 | ASSERT_OK_AND_ASSIGN( |
| 62 | auto expected_array, |
| 63 | MakeArrayFromScalar(scalar, kBatchLength, ::arrow::default_memory_pool())); |
| 64 | AssertArraysEqual(*expected_array, *boolean_array); |
| 65 | } |
| 66 | } |
| 67 | |
| 68 | } // namespace arrow::compute::internal |
nothing calls this directly
no test coverage detected