| 1459 | } |
| 1460 | |
| 1461 | void TestCaseWhenRandom(const std::shared_ptr<DataType>& type, int64_t len = 300) { |
| 1462 | random::RandomArrayGenerator rand(/*seed=*/0); |
| 1463 | |
| 1464 | // Adding 64 consecutive 1's and 0's in the cond array to test all-true/ all-false |
| 1465 | // word code paths |
| 1466 | ASSERT_OK_AND_ASSIGN(auto always_true, MakeArrayFromScalar(BooleanScalar(true), 64)); |
| 1467 | ASSERT_OK_AND_ASSIGN(auto always_false, MakeArrayFromScalar(BooleanScalar(false), 64)); |
| 1468 | auto maybe_true_with_nulls = |
| 1469 | rand.ArrayOf(boolean(), len - 64 * 2, /*null_probability=*/0.04); |
| 1470 | auto maybe_true_all_valid = |
| 1471 | rand.ArrayOf(boolean(), len - 64 * 2, /*null_probability=*/0.0); |
| 1472 | ASSERT_OK_AND_ASSIGN(auto concat1, |
| 1473 | Concatenate({always_true, always_false, maybe_true_with_nulls})); |
| 1474 | auto cond1 = checked_pointer_cast<BooleanArray>(concat1); |
| 1475 | ASSERT_OK_AND_ASSIGN(auto concat2, |
| 1476 | Concatenate({always_true, maybe_true_all_valid, always_false})); |
| 1477 | auto cond2 = checked_pointer_cast<BooleanArray>(concat2); |
| 1478 | |
| 1479 | auto value1 = rand.ArrayOf(type, len, /*null_probability=*/0.04); |
| 1480 | auto value2 = rand.ArrayOf(type, len, /*null_probability=*/0.04); |
| 1481 | auto value_else = rand.ArrayOf(type, len, /*null_probability=*/0.04); |
| 1482 | |
| 1483 | auto value1_span = ArraySpan(*value1->data()); |
| 1484 | auto value2_span = ArraySpan(*value2->data()); |
| 1485 | auto value_else_span = ArraySpan(*value_else->data()); |
| 1486 | |
| 1487 | for (const bool has_else : {true, false}) { |
| 1488 | ASSERT_OK_AND_ASSIGN(auto builder, MakeBuilder(type)); |
| 1489 | ASSERT_OK(builder->Reserve(len)); |
| 1490 | for (int64_t i = 0; i < len; ++i) { |
| 1491 | if (cond1->IsValid(i) && cond1->Value(i)) { |
| 1492 | ASSERT_OK(builder->AppendArraySlice(value1_span, i, /*length=*/1)); |
| 1493 | } else if (cond2->IsValid(i) && cond2->Value(i)) { |
| 1494 | ASSERT_OK(builder->AppendArraySlice(value2_span, i, /*length=*/1)); |
| 1495 | } else if (has_else) { |
| 1496 | ASSERT_OK(builder->AppendArraySlice(value_else_span, i, /*length=*/1)); |
| 1497 | } else { |
| 1498 | ASSERT_OK(builder->AppendNull()); |
| 1499 | } |
| 1500 | } |
| 1501 | ASSERT_OK_AND_ASSIGN(auto expected_data, builder->Finish()); |
| 1502 | |
| 1503 | if (has_else) { |
| 1504 | CheckScalar("case_when", {MakeStruct({cond1, cond2}), value1, value2, value_else}, |
| 1505 | expected_data); |
| 1506 | } else { |
| 1507 | CheckScalar("case_when", {MakeStruct({cond1, cond2}), value1, value2}, |
| 1508 | expected_data); |
| 1509 | } |
| 1510 | } |
| 1511 | } |
| 1512 | |
| 1513 | template <typename Type> |
| 1514 | class TestCaseWhenNumeric : public ::testing::Test {}; |
no test coverage detected