|
20 | 20 | #include "iceberg/schema_field.h" |
21 | 21 |
|
22 | 22 | #include <format> |
| 23 | +#include <limits> |
23 | 24 | #include <memory> |
24 | 25 |
|
25 | 26 | #include <gtest/gtest.h> |
26 | 27 |
|
| 28 | +#include "iceberg/expression/literal.h" |
| 29 | +#include "iceberg/test/matchers.h" |
27 | 30 | #include "iceberg/type.h" |
28 | 31 | #include "iceberg/util/formatter.h" // IWYU pragma: keep |
29 | 32 |
|
@@ -107,4 +110,34 @@ TEST(SchemaFieldTest, WithDoc) { |
107 | 110 | } |
108 | 111 | } |
109 | 112 |
|
| 113 | +TEST(SchemaFieldTest, ValidateRejectsNonFiniteFloatingDefault) { |
| 114 | + // NaN / infinity cannot be represented in JSON (the serializer emits `null`, which |
| 115 | + // reads back as an absent default), so a non-finite floating default must be rejected. |
| 116 | + SchemaField nan_field(/*field_id=*/1, /*name=*/"f", float32(), |
| 117 | + /*optional=*/true, /*doc=*/"", |
| 118 | + std::make_shared<const Literal>( |
| 119 | + Literal::Float(std::numeric_limits<float>::quiet_NaN()))); |
| 120 | + EXPECT_THAT(nan_field.Validate(), IsError(ErrorKind::kInvalidSchema)); |
| 121 | + EXPECT_THAT(nan_field.Validate(), HasErrorMessage("must be finite")); |
| 122 | + |
| 123 | + SchemaField inf_field(/*field_id=*/2, /*name=*/"d", float64(), |
| 124 | + /*optional=*/true, /*doc=*/"", |
| 125 | + std::make_shared<const Literal>( |
| 126 | + Literal::Double(std::numeric_limits<double>::infinity()))); |
| 127 | + EXPECT_THAT(inf_field.Validate(), IsError(ErrorKind::kInvalidSchema)); |
| 128 | + |
| 129 | + SchemaField neg_inf_field(/*field_id=*/3, /*name=*/"d2", float64(), |
| 130 | + /*optional=*/true, /*doc=*/"", |
| 131 | + std::make_shared<const Literal>(Literal::Double( |
| 132 | + -std::numeric_limits<double>::infinity()))); |
| 133 | + EXPECT_THAT(neg_inf_field.Validate(), IsError(ErrorKind::kInvalidSchema)); |
| 134 | +} |
| 135 | + |
| 136 | +TEST(SchemaFieldTest, ValidateAcceptsFiniteFloatingDefault) { |
| 137 | + SchemaField field(/*field_id=*/1, /*name=*/"f", float32(), |
| 138 | + /*optional=*/true, /*doc=*/"", |
| 139 | + std::make_shared<const Literal>(Literal::Float(1.5f))); |
| 140 | + EXPECT_THAT(field.Validate(), IsOk()); |
| 141 | +} |
| 142 | + |
110 | 143 | } // namespace iceberg |
0 commit comments