From d71a494367a24ab7650ebac6cf40831a3a39f81b Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 29 Sep 2026 22:39:30 +0200 Subject: [PATCH] Fix CI: json_view tests without exceptions, on clang 3.6, and single header - ci_test_noexceptions: the helpers that compare the exceptions of json_document::parse() and json::parse() catch them outside a CHECK_THROWS, so with JSON_NOEXCEPTION the first parse error aborted the test. Compile those comparisons only with exceptions, as unit-class_parser.cpp does. - ci_test_gcc: -Werror=unused-result for CHECK_THROWS_AS(json_document:: parse(...)); assign the result to a dummy document. - ci_test_compilers_clang (3.6): `const json_view invalid;` needs a user-provided default constructor there (CWG 253); value-initialize it. - ci_test_single_header: json_view.hpp now exists as a single header and contains the internal view headers, so unit-json_view_builder.cpp includes it instead of the detail headers in that mode, and the test is built again with the single header. - Regenerate single_include/nlohmann/json_view.hpp for the builder change merged from json-view/08-view-builder. Signed-off-by: Niels Lohmann --- tests/CMakeLists.txt | 4 ---- tests/src/unit-json_view.cpp | 15 ++++++++++++--- tests/src/unit-json_view_builder.cpp | 8 ++++++-- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 71cfe2322..8c81b9123 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -279,10 +279,6 @@ if(json_32bit_test_only) elseif(NOT json_32bit_test) list(FILTER files EXCLUDE REGEX src/unit-32bit.cpp) endif() -if(NOT JSON_MultipleHeaders) - # the internal headers of json_view are not part of a single header yet - list(FILTER files EXCLUDE REGEX src/unit-json_view_builder.cpp) -endif() foreach(file ${files}) json_test_add_test_for(${file} MAIN test_main CXX_STANDARDS ${test_cxx_standards} ${test_force}) diff --git a/tests/src/unit-json_view.cpp b/tests/src/unit-json_view.cpp index ce8c66fe9..ddba72013 100644 --- a/tests/src/unit-json_view.cpp +++ b/tests/src/unit-json_view.cpp @@ -30,6 +30,7 @@ using nlohmann::ordered_json_document; namespace { +#if !defined(JSON_NOEXCEPTION) // the exception parse() throws for a text, or "" if it accepts it std::string parse_exception(const std::string& text, bool comments = false, bool trailing_commas = false) { @@ -58,6 +59,7 @@ std::string view_exception(const std::string& text, bool comments = false, bool } return ""; } +#endif // a small deterministic generator of documents struct generator @@ -147,7 +149,7 @@ TEST_CASE("json_view") CHECK(v.materialize() == j); } - const json_view invalid; + const json_view invalid{}; CHECK(invalid.is_discarded()); CHECK(!static_cast(invalid)); CHECK(invalid.type() == json::value_t::discarded); @@ -192,9 +194,11 @@ TEST_CASE("json_view") }) { CAPTURE(text); +#if !defined(JSON_NOEXCEPTION) const std::string expected = parse_exception(text); REQUIRE(!expected.empty()); CHECK(view_exception(text) == expected); +#endif CHECK(!json_document::accept(text)); const json_document d = json_document::parse(text, false); CHECK(d.is_discarded()); @@ -202,8 +206,9 @@ TEST_CASE("json_view") CHECK(d.node_count() == 0); } // the exception types - CHECK_THROWS_AS(json_document::parse("[1,"), json::parse_error&); - CHECK_THROWS_AS(json_document::parse("1e400"), json::out_of_range&); + json_document _; + CHECK_THROWS_AS(_ = json_document::parse("[1,"), json::parse_error&); + CHECK_THROWS_AS(_ = json_document::parse("1e400"), json::out_of_range&); } SECTION("parse options") @@ -218,7 +223,9 @@ TEST_CASE("json_view") const bool comments = (options & 1) != 0; const bool trailing_commas = (options & 2) != 0; CHECK(json_document::accept(text, comments, trailing_commas) == json::accept(text, comments, trailing_commas)); +#if !defined(JSON_NOEXCEPTION) CHECK(view_exception(text, comments, trailing_commas) == parse_exception(text, comments, trailing_commas)); +#endif } } } @@ -260,7 +267,9 @@ TEST_CASE("json_view") const std::string nul_in_comment("[1, // c\0\n2]", 12); CHECK(json_document::accept(nul_in_comment, true) == json::accept(nul_in_comment, true)); CHECK(json_document::parse("\xEF\xBB\xBF[1]").root().materialize() == json::parse("\xEF\xBB\xBF[1]")); +#if !defined(JSON_NOEXCEPTION) CHECK(view_exception("\xEF\xBB") == parse_exception("\xEF\xBB")); +#endif } SECTION("inputs") diff --git a/tests/src/unit-json_view_builder.cpp b/tests/src/unit-json_view_builder.cpp index 3f892754c..b0c9bfc44 100644 --- a/tests/src/unit-json_view_builder.cpp +++ b/tests/src/unit-json_view_builder.cpp @@ -9,8 +9,12 @@ #include "doctest_compatibility.h" #include -#include -#include +#if JSON_TEST_USING_MULTIPLE_HEADERS + #include + #include +#else + #include // the single header contains the internal headers +#endif using nlohmann::json; #include