Skip to content

Commit ed25de6

Browse files
committed
Fixes
Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>
1 parent e2bd910 commit ed25de6

2 files changed

Lines changed: 62 additions & 12 deletions

File tree

src/output/output_jsonld.cc

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -204,18 +204,20 @@ auto container_placement_error(
204204
"A JSON-LD language container requires BCP 47 language tag keys");
205205
}
206206

207+
// A null member, or a null item in an array member, is treated as absent
207208
const auto &member{entry.second};
208-
const bool usable{member.is_string() ||
209-
(member.is_array() &&
210-
std::ranges::all_of(
211-
member.as_array(),
212-
[](const sourcemeta::core::JSON &element) -> bool {
213-
return element.is_string();
214-
}))};
209+
const bool usable{
210+
member.is_null() || member.is_string() ||
211+
(member.is_array() &&
212+
std::ranges::all_of(
213+
member.as_array(),
214+
[](const sourcemeta::core::JSON &element) -> bool {
215+
return element.is_string() || element.is_null();
216+
}))};
215217
if (!usable) {
216218
return facet_error(
217219
pointer, sourcemeta::blaze::JSONLDFacet::Container,
218-
"A JSON-LD language container requires string members");
220+
"A JSON-LD language container requires string or null members");
219221
}
220222
}
221223
}

test/output/output_jsonld_test.cc

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4366,7 +4366,7 @@ TEST(JSONLD_container_language_non_string_member_is_a_resolution_error) {
43664366

43674367
EXPECT_JSON_LD_RESOLUTION_ERROR(
43684368
schema, instance, "/x", sourcemeta::blaze::JSONLDFacet::Container,
4369-
"A JSON-LD language container requires string members");
4369+
"A JSON-LD language container requires string or null members");
43704370
}
43714371

43724372
TEST(JSONLD_container_and_type_is_a_resolution_error) {
@@ -4847,6 +4847,54 @@ TEST(JSONLD_container_language_empty_array_member_is_dropped) {
48474847
EXPECT_JSON_LD_VALUE(schema, instance, expected);
48484848
}
48494849

4850+
TEST(JSONLD_container_language_null_member_is_dropped) {
4851+
const auto schema{sourcemeta::core::parse_json(R"JSON({
4852+
"$schema": "https://json-schema.org/draft/2020-12/schema",
4853+
"type": "object",
4854+
"properties": {
4855+
"x": {
4856+
"type": "object",
4857+
"x-jsonld-id": "https://schema.org/x",
4858+
"x-jsonld-container": "@language"
4859+
}
4860+
}
4861+
})JSON")};
4862+
4863+
const auto instance{
4864+
sourcemeta::core::parse_json(R"JSON({ "x": { "en": null } })JSON")};
4865+
4866+
const auto expected{sourcemeta::core::parse_json(R"JSON([])JSON")};
4867+
4868+
EXPECT_JSON_LD_VALUE(schema, instance, expected);
4869+
}
4870+
4871+
TEST(JSONLD_container_language_null_in_array_member_is_dropped) {
4872+
const auto schema{sourcemeta::core::parse_json(R"JSON({
4873+
"$schema": "https://json-schema.org/draft/2020-12/schema",
4874+
"type": "object",
4875+
"properties": {
4876+
"label": {
4877+
"type": "object",
4878+
"x-jsonld-id": "https://schema.org/name",
4879+
"x-jsonld-container": "@language"
4880+
}
4881+
}
4882+
})JSON")};
4883+
4884+
const auto instance{sourcemeta::core::parse_json(
4885+
R"JSON({ "label": { "en": [ "Hi", null ] } })JSON")};
4886+
4887+
const auto expected{sourcemeta::core::parse_json(R"JSON([
4888+
{
4889+
"https://schema.org/name": [
4890+
{ "@value": "Hi", "@language": "en" }
4891+
]
4892+
}
4893+
])JSON")};
4894+
4895+
EXPECT_JSON_LD_VALUE(schema, instance, expected);
4896+
}
4897+
48504898
TEST(JSONLD_container_at_root_is_dropped) {
48514899
const auto schema{sourcemeta::core::parse_json(R"JSON({
48524900
"$schema": "https://json-schema.org/draft/2020-12/schema",
@@ -5171,7 +5219,7 @@ TEST(JSONLD_container_language_array_with_nonstring_member_is_error) {
51715219

51725220
EXPECT_JSON_LD_RESOLUTION_ERROR(
51735221
schema, instance, "/x", sourcemeta::blaze::JSONLDFacet::Container,
5174-
"A JSON-LD language container requires string members");
5222+
"A JSON-LD language container requires string or null members");
51755223
}
51765224

51775225
TEST(JSONLD_container_language_nested_array_member_is_error) {
@@ -5192,7 +5240,7 @@ TEST(JSONLD_container_language_nested_array_member_is_error) {
51925240

51935241
EXPECT_JSON_LD_RESOLUTION_ERROR(
51945242
schema, instance, "/x", sourcemeta::blaze::JSONLDFacet::Container,
5195-
"A JSON-LD language container requires string members");
5243+
"A JSON-LD language container requires string or null members");
51965244
}
51975245

51985246
TEST(JSONLD_container_uppercase_value_is_a_resolution_error) {
@@ -5424,7 +5472,7 @@ TEST(JSONLD_container_language_object_member_is_error) {
54245472

54255473
EXPECT_JSON_LD_RESOLUTION_ERROR(
54265474
schema, instance, "/x", sourcemeta::blaze::JSONLDFacet::Container,
5427-
"A JSON-LD language container requires string members");
5475+
"A JSON-LD language container requires string or null members");
54285476
}
54295477

54305478
TEST(JSONLD_container_set_single_nested_array_flattens) {

0 commit comments

Comments
 (0)