diff --git a/DEPENDENCIES b/DEPENDENCIES index 3c3755a7d..c876d94ec 100644 --- a/DEPENDENCIES +++ b/DEPENDENCIES @@ -1,4 +1,4 @@ vendorpull https://github.com/sourcemeta/vendorpull 1dcbac42809cf87cb5b045106b863e17ad84ba02 -core https://github.com/sourcemeta/core d07b863772ce5ee38e696ebbc8408d4831545a60 -blaze https://github.com/sourcemeta/blaze 015713ad9c98fbc4bd9669cffb2ab1fcb37942ea +core https://github.com/sourcemeta/core fe9ef27a95281775fe3a98b9fb8eb4c51837af0a +blaze https://github.com/sourcemeta/blaze fa1310cb51cd7d1afbd08dc47dab5307b0122526 bootstrap https://github.com/twbs/bootstrap 1a6fdfae6be09b09eaced8f0e442ca6f7680a61e diff --git a/cmake/FindCore.cmake b/cmake/FindCore.cmake index 6985accb1..7885d48a7 100644 --- a/cmake/FindCore.cmake +++ b/cmake/FindCore.cmake @@ -8,7 +8,6 @@ if(NOT Core_FOUND) set(SOURCEMETA_CORE_LANG_PROCESS OFF CACHE BOOL "disable") set(SOURCEMETA_CORE_LANG_PARALLEL OFF CACHE BOOL "disable") set(SOURCEMETA_CORE_LANG_ERROR OFF CACHE BOOL "disable") - set(SOURCEMETA_CORE_LANG_STACKTRACE OFF CACHE BOOL "disable") set(SOURCEMETA_CORE_GZIP OFF CACHE BOOL "disable") set(SOURCEMETA_CORE_JSONL OFF CACHE BOOL "disable JSONL support") set(SOURCEMETA_CORE_JSONRPC OFF CACHE BOOL "disable") @@ -16,8 +15,6 @@ if(NOT Core_FOUND) set(SOURCEMETA_CORE_HTTP OFF CACHE BOOL "disable") set(SOURCEMETA_CORE_SEMVER OFF CACHE BOOL "disable") set(SOURCEMETA_CORE_MARKDOWN OFF CACHE BOOL "disable") - set(SOURCEMETA_CORE_YAML ON CACHE BOOL "needed by Blaze") - set(SOURCEMETA_CORE_CONTRIB_GOOGLETEST ${JSONBINPACK_TESTS} CACHE BOOL "GoogleTest") set(SOURCEMETA_CORE_CONTRIB_GOOGLEBENCHMARK OFF CACHE BOOL "GoogleBenchmark") add_subdirectory("${PROJECT_SOURCE_DIR}/vendor/core") include(Sourcemeta) diff --git a/test/compiler/2020_12_compiler_any_test.cc b/test/compiler/2020_12_compiler_any_test.cc index 8f2fd36a3..a8b90817e 100644 --- a/test/compiler/2020_12_compiler_any_test.cc +++ b/test/compiler/2020_12_compiler_any_test.cc @@ -1,9 +1,8 @@ -#include - #include +#include #include -TEST(JSONBinPack_Compiler_Any_2020_12, enum_singleton) { +TEST(enum_singleton) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "https://json-schema.org/draft/2020-12/schema", "enum": [ 2 ] @@ -23,7 +22,7 @@ TEST(JSONBinPack_Compiler_Any_2020_12, enum_singleton) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler_Any_2020_12, const_scalar) { +TEST(const_scalar) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "https://json-schema.org/draft/2020-12/schema", "const": 2 @@ -43,7 +42,7 @@ TEST(JSONBinPack_Compiler_Any_2020_12, const_scalar) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler_Any_2020_12, enum_small_top_level) { +TEST(enum_small_top_level) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "https://json-schema.org/draft/2020-12/schema", "enum": [ 1, 2, 3 ] @@ -63,7 +62,7 @@ TEST(JSONBinPack_Compiler_Any_2020_12, enum_small_top_level) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler_Any_2020_12, only_metaschema) { +TEST(only_metaschema) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "https://json-schema.org/draft/2020-12/schema" })JSON"); @@ -80,7 +79,7 @@ TEST(JSONBinPack_Compiler_Any_2020_12, only_metaschema) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler_Any_2020_12, empty) { +TEST(empty) { auto schema = sourcemeta::core::parse_json("{}"); sourcemeta::jsonbinpack::compile( diff --git a/test/compiler/2020_12_compiler_integer_test.cc b/test/compiler/2020_12_compiler_integer_test.cc index 436274599..afff7201e 100644 --- a/test/compiler/2020_12_compiler_integer_test.cc +++ b/test/compiler/2020_12_compiler_integer_test.cc @@ -1,9 +1,8 @@ -#include - #include +#include #include -TEST(JSONBinPack_Compiler_Integer_2020_12, maximum_minimum_8_bit) { +TEST(maximum_minimum_8_bit) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "integer", @@ -27,7 +26,7 @@ TEST(JSONBinPack_Compiler_Integer_2020_12, maximum_minimum_8_bit) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler_Integer_2020_12, maximum_minimum_multiplier_8_bit) { +TEST(maximum_minimum_multiplier_8_bit) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "integer", @@ -52,7 +51,7 @@ TEST(JSONBinPack_Compiler_Integer_2020_12, maximum_minimum_multiplier_8_bit) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler_Integer_2020_12, maximum_minimum_greater_than_8_bit) { +TEST(maximum_minimum_greater_than_8_bit) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "integer", @@ -75,8 +74,7 @@ TEST(JSONBinPack_Compiler_Integer_2020_12, maximum_minimum_greater_than_8_bit) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler_Integer_2020_12, - maximum_minimum_multiplier_greater_than_8_bit) { +TEST(maximum_minimum_multiplier_greater_than_8_bit) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "integer", @@ -100,7 +98,7 @@ TEST(JSONBinPack_Compiler_Integer_2020_12, EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler_Integer_2020_12, minimum) { +TEST(minimum) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "integer", @@ -122,7 +120,7 @@ TEST(JSONBinPack_Compiler_Integer_2020_12, minimum) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler_Integer_2020_12, minimum_multiplier) { +TEST(minimum_multiplier) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "integer", @@ -145,7 +143,7 @@ TEST(JSONBinPack_Compiler_Integer_2020_12, minimum_multiplier) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler_Integer_2020_12, maximum) { +TEST(maximum) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "integer", @@ -167,7 +165,7 @@ TEST(JSONBinPack_Compiler_Integer_2020_12, maximum) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler_Integer_2020_12, maximum_multiplier) { +TEST(maximum_multiplier) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "integer", @@ -190,7 +188,7 @@ TEST(JSONBinPack_Compiler_Integer_2020_12, maximum_multiplier) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler_Integer_2020_12, unbounded) { +TEST(unbounded) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "integer" @@ -210,7 +208,7 @@ TEST(JSONBinPack_Compiler_Integer_2020_12, unbounded) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler_Integer_2020_12, unbounded_multiplier) { +TEST(unbounded_multiplier) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "integer", diff --git a/test/compiler/2020_12_compiler_number_test.cc b/test/compiler/2020_12_compiler_number_test.cc index a134273b9..b7e645f7b 100644 --- a/test/compiler/2020_12_compiler_number_test.cc +++ b/test/compiler/2020_12_compiler_number_test.cc @@ -1,9 +1,8 @@ -#include - #include +#include #include -TEST(JSONBinPack_Compiler_Number_2020_12, arbitrary) { +TEST(arbitrary) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "number" diff --git a/test/compiler/CMakeLists.txt b/test/compiler/CMakeLists.txt index 6c7c3df3a..6e0fb5202 100644 --- a/test/compiler/CMakeLists.txt +++ b/test/compiler/CMakeLists.txt @@ -1,5 +1,4 @@ -sourcemeta_googletest(NAMESPACE sourcemeta PROJECT jsonbinpack NAME compiler - FOLDER "JSON BinPack/Compiler" +sourcemeta_test(NAMESPACE sourcemeta PROJECT jsonbinpack NAME compiler SOURCES canonicalizer_test.cc compiler_test.cc diff --git a/test/compiler/canonicalizer_test.cc b/test/compiler/canonicalizer_test.cc index 89b92eb96..30d85841d 100644 --- a/test/compiler/canonicalizer_test.cc +++ b/test/compiler/canonicalizer_test.cc @@ -1,7 +1,6 @@ -#include - #include #include +#include #include #include // std::optional @@ -19,24 +18,33 @@ static auto test_resolver(std::string_view identifier) } } -TEST(JSONBinPack_Canonicalizer, unsupported_draft) { +TEST(unsupported_draft) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "https://jsonbinpack.sourcemeta.com/draft/unknown", "type": "boolean" })JSON"); - EXPECT_THROW(sourcemeta::jsonbinpack::canonicalize( - schema, sourcemeta::blaze::schema_walker, test_resolver), - sourcemeta::blaze::SchemaUnknownBaseDialectError); + try { + sourcemeta::jsonbinpack::canonicalize( + schema, sourcemeta::blaze::schema_walker, test_resolver); + FAIL(); + } catch (const sourcemeta::blaze::SchemaUnknownBaseDialectError &error) { + EXPECT_STREQ(error.what(), + "Could not determine the base dialect of the schema"); + } } -TEST(JSONBinPack_Canonicalizer, unknown_draft) { +TEST(unknown_draft) { auto schema = sourcemeta::core::parse_json(R"JSON({ "type": "boolean" })JSON"); - EXPECT_THROW(sourcemeta::jsonbinpack::canonicalize( - schema, sourcemeta::blaze::schema_walker, test_resolver, - "https://example.com/invalid"), - sourcemeta::blaze::SchemaResolutionError); + try { + sourcemeta::jsonbinpack::canonicalize( + schema, sourcemeta::blaze::schema_walker, test_resolver, + "https://example.com/invalid"); + FAIL(); + } catch (const sourcemeta::blaze::SchemaResolutionError &error) { + EXPECT_EQ(error.identifier(), "https://example.com/invalid"); + } } diff --git a/test/compiler/compiler_test.cc b/test/compiler/compiler_test.cc index 0ae463d51..53f00a233 100644 --- a/test/compiler/compiler_test.cc +++ b/test/compiler/compiler_test.cc @@ -1,11 +1,10 @@ -#include - #include +#include #include #include -TEST(JSONBinPack_Compiler, dialect_2020_12) { +TEST(dialect_2020_12) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "https://json-schema.org/draft/2020-12/schema" })JSON"); @@ -22,7 +21,7 @@ TEST(JSONBinPack_Compiler, dialect_2020_12) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler, dialect_2019_09) { +TEST(dialect_2019_09) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "https://json-schema.org/draft/2019-09/schema" })JSON"); @@ -39,7 +38,7 @@ TEST(JSONBinPack_Compiler, dialect_2019_09) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler, dialect_draft7) { +TEST(dialect_draft7) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "http://json-schema.org/draft-07/schema#" })JSON"); @@ -56,7 +55,7 @@ TEST(JSONBinPack_Compiler, dialect_draft7) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler, dialect_draft6) { +TEST(dialect_draft6) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "http://json-schema.org/draft-06/schema#" })JSON"); @@ -73,7 +72,7 @@ TEST(JSONBinPack_Compiler, dialect_draft6) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler, dialect_draft4) { +TEST(dialect_draft4) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "http://json-schema.org/draft-04/schema#" })JSON"); @@ -90,7 +89,7 @@ TEST(JSONBinPack_Compiler, dialect_draft4) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler, dialect_draft3) { +TEST(dialect_draft3) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "http://json-schema.org/draft-03/schema#" })JSON"); @@ -107,7 +106,7 @@ TEST(JSONBinPack_Compiler, dialect_draft3) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler, dialect_draft2) { +TEST(dialect_draft2) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "http://json-schema.org/draft-02/schema#" })JSON"); @@ -124,7 +123,7 @@ TEST(JSONBinPack_Compiler, dialect_draft2) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler, dialect_draft1) { +TEST(dialect_draft1) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "http://json-schema.org/draft-01/schema#" })JSON"); @@ -141,7 +140,7 @@ TEST(JSONBinPack_Compiler, dialect_draft1) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler, dialect_draft0) { +TEST(dialect_draft0) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "http://json-schema.org/draft-00/schema#" })JSON"); @@ -158,7 +157,7 @@ TEST(JSONBinPack_Compiler, dialect_draft0) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler, unknown_dialect_default) { +TEST(unknown_dialect_default) { auto schema = sourcemeta::core::parse_json(R"JSON({ "type": "integer" })JSON"); @@ -179,25 +178,32 @@ TEST(JSONBinPack_Compiler, unknown_dialect_default) { EXPECT_EQ(schema, expected); } -TEST(JSONBinPack_Compiler, unknown_dialect_without_default) { +TEST(unknown_dialect_without_default) { auto schema = sourcemeta::core::parse_json(R"JSON({ "type": "integer" })JSON"); - EXPECT_THROW( - sourcemeta::jsonbinpack::compile(schema, sourcemeta::blaze::schema_walker, - sourcemeta::blaze::schema_resolver), - sourcemeta::blaze::SchemaUnknownBaseDialectError); + try { + sourcemeta::jsonbinpack::compile(schema, sourcemeta::blaze::schema_walker, + sourcemeta::blaze::schema_resolver); + FAIL(); + } catch (const sourcemeta::blaze::SchemaUnknownBaseDialectError &error) { + EXPECT_STREQ(error.what(), + "Could not determine the base dialect of the schema"); + } } -TEST(JSONBinPack_Compiler, invalid_dialect) { +TEST(invalid_dialect) { auto schema = sourcemeta::core::parse_json(R"JSON({ "$schema": "https://foo.com", "type": "integer" })JSON"); - EXPECT_THROW( - sourcemeta::jsonbinpack::compile(schema, sourcemeta::blaze::schema_walker, - sourcemeta::blaze::schema_resolver), - sourcemeta::blaze::SchemaResolutionError); + try { + sourcemeta::jsonbinpack::compile(schema, sourcemeta::blaze::schema_walker, + sourcemeta::blaze::schema_resolver); + FAIL(); + } catch (const sourcemeta::blaze::SchemaResolutionError &error) { + EXPECT_EQ(error.identifier(), "https://foo.com"); + } } diff --git a/test/runtime/CMakeLists.txt b/test/runtime/CMakeLists.txt index 5461044d4..a69ee42e7 100644 --- a/test/runtime/CMakeLists.txt +++ b/test/runtime/CMakeLists.txt @@ -1,5 +1,4 @@ -sourcemeta_googletest(NAMESPACE sourcemeta PROJECT jsonbinpack NAME runtime - FOLDER "JSON BinPack/Runtime" +sourcemeta_test(NAMESPACE sourcemeta PROJECT jsonbinpack NAME runtime SOURCES decode_any_test.cc decode_array_test.cc diff --git a/test/runtime/decode_any_test.cc b/test/runtime/decode_any_test.cc index a0db7c0cc..af1f932e9 100644 --- a/test/runtime/decode_any_test.cc +++ b/test/runtime/decode_any_test.cc @@ -1,13 +1,13 @@ -#include #include #include +#include #include #include #include #include -TEST(JSONBinPack_Decoder, BYTE_CHOICE_INDEX_1__1_0_0) { +TEST(BYTE_CHOICE_INDEX_1__1_0_0) { sourcemeta::core::InputByteStream stream{0x00}; sourcemeta::jsonbinpack::Decoder decoder{stream}; std::vector choices; @@ -19,7 +19,7 @@ TEST(JSONBinPack_Decoder, BYTE_CHOICE_INDEX_1__1_0_0) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, BYTE_CHOICE_INDEX_1__0_1_0) { +TEST(BYTE_CHOICE_INDEX_1__0_1_0) { sourcemeta::core::InputByteStream stream{0x01}; sourcemeta::jsonbinpack::Decoder decoder{stream}; std::vector choices; @@ -31,7 +31,7 @@ TEST(JSONBinPack_Decoder, BYTE_CHOICE_INDEX_1__0_1_0) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, BYTE_CHOICE_INDEX_1__0_0_1) { +TEST(BYTE_CHOICE_INDEX_1__0_0_1) { sourcemeta::core::InputByteStream stream{0x02}; sourcemeta::jsonbinpack::Decoder decoder{stream}; std::vector choices; @@ -43,7 +43,7 @@ TEST(JSONBinPack_Decoder, BYTE_CHOICE_INDEX_1__0_0_1) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, BYTE_CHOICE_INDEX_bar__foo_bar_bar) { +TEST(BYTE_CHOICE_INDEX_bar__foo_bar_bar) { sourcemeta::core::InputByteStream stream{0x01}; sourcemeta::jsonbinpack::Decoder decoder{stream}; std::vector choices; @@ -55,7 +55,7 @@ TEST(JSONBinPack_Decoder, BYTE_CHOICE_INDEX_bar__foo_bar_bar) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, BYTE_CHOICE_INDEX_non_scalar_1) { +TEST(BYTE_CHOICE_INDEX_non_scalar_1) { sourcemeta::core::InputByteStream stream{0x03}; sourcemeta::jsonbinpack::Decoder decoder{stream}; std::vector choices; @@ -69,7 +69,7 @@ TEST(JSONBinPack_Decoder, BYTE_CHOICE_INDEX_non_scalar_1) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, LARGE_CHOICE_INDEX_1__1_0_0) { +TEST(LARGE_CHOICE_INDEX_1__1_0_0) { sourcemeta::core::InputByteStream stream{0x00}; sourcemeta::jsonbinpack::Decoder decoder{stream}; std::vector choices; @@ -81,7 +81,7 @@ TEST(JSONBinPack_Decoder, LARGE_CHOICE_INDEX_1__1_0_0) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, LARGE_CHOICE_INDEX_1__0_1_0) { +TEST(LARGE_CHOICE_INDEX_1__0_1_0) { sourcemeta::core::InputByteStream stream{0x01}; sourcemeta::jsonbinpack::Decoder decoder{stream}; std::vector choices; @@ -93,7 +93,7 @@ TEST(JSONBinPack_Decoder, LARGE_CHOICE_INDEX_1__0_1_0) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, LARGE_CHOICE_INDEX_1__0_0_1) { +TEST(LARGE_CHOICE_INDEX_1__0_0_1) { sourcemeta::core::InputByteStream stream{0x02}; sourcemeta::jsonbinpack::Decoder decoder{stream}; std::vector choices; @@ -105,7 +105,7 @@ TEST(JSONBinPack_Decoder, LARGE_CHOICE_INDEX_1__0_0_1) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, LARGE_CHOICE_INDEX_bar__foo_bar_bar) { +TEST(LARGE_CHOICE_INDEX_bar__foo_bar_bar) { sourcemeta::core::InputByteStream stream{0x01}; sourcemeta::jsonbinpack::Decoder decoder{stream}; std::vector choices; @@ -117,7 +117,7 @@ TEST(JSONBinPack_Decoder, LARGE_CHOICE_INDEX_bar__foo_bar_bar) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, LARGE_CHOICE_INDEX_non_scalar_1) { +TEST(LARGE_CHOICE_INDEX_non_scalar_1) { sourcemeta::core::InputByteStream stream{0x03}; sourcemeta::jsonbinpack::Decoder decoder{stream}; std::vector choices; @@ -131,7 +131,7 @@ TEST(JSONBinPack_Decoder, LARGE_CHOICE_INDEX_non_scalar_1) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, LARGE_CHOICE_INDEX_enum_250) { +TEST(LARGE_CHOICE_INDEX_enum_250) { sourcemeta::core::InputByteStream stream{0xfa, 0x01}; sourcemeta::jsonbinpack::Decoder decoder{stream}; @@ -145,7 +145,7 @@ TEST(JSONBinPack_Decoder, LARGE_CHOICE_INDEX_enum_250) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, TOP_LEVEL_BYTE_CHOICE_INDEX_1__1_0_0) { +TEST(TOP_LEVEL_BYTE_CHOICE_INDEX_1__1_0_0) { sourcemeta::core::InputByteStream stream{}; sourcemeta::jsonbinpack::Decoder decoder{stream}; std::vector choices; @@ -157,7 +157,7 @@ TEST(JSONBinPack_Decoder, TOP_LEVEL_BYTE_CHOICE_INDEX_1__1_0_0) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, TOP_LEVEL_BYTE_CHOICE_INDEX_1__0_1_0) { +TEST(TOP_LEVEL_BYTE_CHOICE_INDEX_1__0_1_0) { sourcemeta::core::InputByteStream stream{0x00}; sourcemeta::jsonbinpack::Decoder decoder{stream}; std::vector choices; @@ -169,7 +169,7 @@ TEST(JSONBinPack_Decoder, TOP_LEVEL_BYTE_CHOICE_INDEX_1__0_1_0) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, TOP_LEVEL_BYTE_CHOICE_INDEX_1__0_0_1) { +TEST(TOP_LEVEL_BYTE_CHOICE_INDEX_1__0_0_1) { sourcemeta::core::InputByteStream stream{0x01}; sourcemeta::jsonbinpack::Decoder decoder{stream}; std::vector choices; @@ -181,7 +181,7 @@ TEST(JSONBinPack_Decoder, TOP_LEVEL_BYTE_CHOICE_INDEX_1__0_0_1) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, TOP_LEVEL_BYTE_CHOICE_INDEX_bar__foo_bar_bar) { +TEST(TOP_LEVEL_BYTE_CHOICE_INDEX_bar__foo_bar_bar) { sourcemeta::core::InputByteStream stream{0x00}; sourcemeta::jsonbinpack::Decoder decoder{stream}; std::vector choices; @@ -193,7 +193,7 @@ TEST(JSONBinPack_Decoder, TOP_LEVEL_BYTE_CHOICE_INDEX_bar__foo_bar_bar) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, TOP_LEVEL_BYTE_CHOICE_INDEX_non_scalar_1) { +TEST(TOP_LEVEL_BYTE_CHOICE_INDEX_non_scalar_1) { sourcemeta::core::InputByteStream stream{0x02}; sourcemeta::jsonbinpack::Decoder decoder{stream}; std::vector choices; @@ -207,7 +207,7 @@ TEST(JSONBinPack_Decoder, TOP_LEVEL_BYTE_CHOICE_INDEX_non_scalar_1) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, CONST_NONE_scalar) { +TEST(CONST_NONE_scalar) { sourcemeta::core::InputByteStream stream{}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.CONST_NONE({sourcemeta::core::JSON{1}}); @@ -215,7 +215,7 @@ TEST(JSONBinPack_Decoder, CONST_NONE_scalar) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, CONST_NONE_complex) { +TEST(CONST_NONE_complex) { sourcemeta::core::InputByteStream stream{}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = @@ -224,7 +224,7 @@ TEST(JSONBinPack_Decoder, CONST_NONE_complex) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__null) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__null) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x17}; Decoder decoder{stream}; @@ -233,7 +233,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__null) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__false) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__false) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x07}; Decoder decoder{stream}; @@ -242,7 +242,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__false) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__true) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__true) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x0f}; Decoder decoder{stream}; @@ -251,7 +251,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__true) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__real_3_14) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__real_3_14) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x2f, 0xf4, 0x04, 0x02}; Decoder decoder{stream}; @@ -260,7 +260,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__real_3_14) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__real_3_0) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__real_3_0) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x37, 0x03}; Decoder decoder{stream}; @@ -273,7 +273,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__real_3_0) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__real_103_0) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__real_103_0) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x37, 0x67}; Decoder decoder{stream}; @@ -286,7 +286,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__real_103_0) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__256) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__256) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x1f, 0x80, 0x02}; Decoder decoder{stream}; @@ -295,7 +295,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__256) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__minus_257) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__minus_257) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x27, 0x80, 0x02}; Decoder decoder{stream}; @@ -304,7 +304,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__minus_257) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__255) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__255) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x05, 0xff}; Decoder decoder{stream}; @@ -313,7 +313,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__255) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__minus_256) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__minus_256) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x06, 0xff}; Decoder decoder{stream}; @@ -322,7 +322,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__minus_256) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__0) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__0) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x0d}; Decoder decoder{stream}; @@ -331,7 +331,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__0) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__minus_1) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__minus_1) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x0e}; Decoder decoder{stream}; @@ -340,7 +340,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__minus_1) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_space) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_space) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x11, 0x20}; Decoder decoder{stream}; @@ -349,7 +349,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_space) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_foo) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_foo) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x21, 0x66, 0x6f, 0x6f}; Decoder decoder{stream}; @@ -358,7 +358,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_foo) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_30_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_30_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0xf9, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, @@ -370,7 +370,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_30_xs) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__shared_string_foo) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__shared_string_foo) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x21, 0x66, 0x6f, 0x6f, 0x20, 0x04, 0x20, 0x06}; @@ -389,7 +389,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__shared_string_foo) { EXPECT_EQ(result3, expected3); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_31_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_31_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0x02, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, @@ -401,7 +401,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_31_xs) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_61_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_61_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0xf2, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, @@ -416,7 +416,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_61_xs) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_url) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_url) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x73, 0x6f, 0x75, @@ -428,7 +428,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_url) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_128_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_128_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0x3f, 0x00, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, @@ -448,7 +448,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_128_xs) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_130_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_130_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0x3f, 0x02, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, @@ -468,7 +468,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_130_xs) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_256_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_256_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0x47, 0x00, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, @@ -502,7 +502,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_256_xs) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_258_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_258_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0x47, 0x02, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, @@ -536,7 +536,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_258_xs) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_512_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_512_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0x4f, 0x00, @@ -598,7 +598,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_512_xs) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_513_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_513_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0x4f, 0x01, @@ -661,7 +661,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_513_xs) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_1024_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_1024_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0x57, 0x00, @@ -774,8 +774,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_1024_xs) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, - ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_62_xs_non_shared) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_62_xs_non_shared) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0x01, 0x01, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, @@ -790,8 +789,7 @@ TEST(JSONBinPack_Decoder, EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, - ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_63_xs_non_shared) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_63_xs_non_shared) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0x01, 0x02, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, @@ -806,7 +804,7 @@ TEST(JSONBinPack_Decoder, EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__foo_true_2000) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__foo_true_2000) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x24, 0x21, 0x66, 0x6f, 0x6f, 0x0f, 0x1f, 0xd0, 0x0f}; @@ -821,7 +819,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__foo_true_2000) { EXPECT_EQ(result.at(2), JSON{2000}); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__array_30) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__array_30) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0xfc, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, @@ -868,7 +866,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__array_30) { EXPECT_EQ(result.at(29), JSON{true}); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__array_31) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__array_31) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0x04, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, @@ -917,7 +915,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__array_31) { EXPECT_EQ(result.at(30), JSON{true}); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__array_32) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__array_32) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0x04, 0x01, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, @@ -967,8 +965,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__array_32) { EXPECT_EQ(result.at(31), JSON{true}); } -TEST(JSONBinPack_Decoder, - ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_foo_bar_baz_1) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_foo_bar_baz_1) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x1b, 0x04, 0x66, 0x6f, 0x6f, 0x21, 0x62, 0x61, 0x72, 0x04, @@ -995,7 +992,7 @@ static auto is_member_true(const sourcemeta::core::JSON &object, object.at(key).to_boolean(); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_30_entries) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_30_entries) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0xfb, 0x03, 0x30, 0x30, 0x0f, 0x03, 0x30, 0x31, 0x0f, 0x03, 0x30, @@ -1048,7 +1045,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_30_entries) { EXPECT_TRUE(is_member_true(result, "29")); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_31_entries) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_31_entries) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0x03, 0x00, 0x03, 0x30, 0x30, 0x0f, 0x03, 0x30, 0x31, 0x0f, 0x03, 0x30, @@ -1103,7 +1100,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_31_entries) { EXPECT_TRUE(is_member_true(result, "30")); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_32_entries) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_32_entries) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0x03, 0x01, 0x03, 0x30, 0x30, 0x0f, 0x03, 0x30, 0x31, 0x0f, 0x03, 0x30, @@ -1159,8 +1156,7 @@ TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_32_entries) { EXPECT_TRUE(is_member_true(result, "31")); } -TEST(JSONBinPack_Decoder, - ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_62_xs_shared) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_62_xs_shared) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0x1b, 0x04, 0x66, 0x6f, 0x6f, 0x01, 0x01, 0x78, 0x78, 0x78, 0x78, diff --git a/test/runtime/decode_array_test.cc b/test/runtime/decode_array_test.cc index 3c2d92901..1456d0a17 100644 --- a/test/runtime/decode_array_test.cc +++ b/test/runtime/decode_array_test.cc @@ -1,11 +1,11 @@ -#include #include #include +#include #include #include -TEST(JSONBinPack_Decoder, FIXED_TYPED_ARRAY_0_1_2__no_prefix_encodings) { +TEST(FIXED_TYPED_ARRAY_0_1_2__no_prefix_encodings) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x00, 0x01, 0x02}; Decoder decoder{stream}; @@ -17,7 +17,7 @@ TEST(JSONBinPack_Decoder, FIXED_TYPED_ARRAY_0_1_2__no_prefix_encodings) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, FIXED_TYPED_ARRAY_0_1_true__semityped) { +TEST(FIXED_TYPED_ARRAY_0_1_true__semityped) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x00, 0x01, 0x01}; Decoder decoder{stream}; @@ -38,7 +38,7 @@ TEST(JSONBinPack_Decoder, FIXED_TYPED_ARRAY_0_1_true__semityped) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, FIXED_TYPED_ARRAY_empty__no_prefix_encodings) { +TEST(FIXED_TYPED_ARRAY_empty__no_prefix_encodings) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{}; Decoder decoder{stream}; @@ -50,8 +50,7 @@ TEST(JSONBinPack_Decoder, FIXED_TYPED_ARRAY_empty__no_prefix_encodings) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, - BOUNDED_8BITS_TYPED_ARRAY_true_false_true__no_prefix_encodings) { +TEST(BOUNDED_8BITS_TYPED_ARRAY_true_false_true__no_prefix_encodings) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x03, 0x01, 0x00, 0x01}; Decoder decoder{stream}; @@ -70,8 +69,7 @@ TEST(JSONBinPack_Decoder, EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, - BOUNDED_8BITS_TYPED_ARRAY_true_false_true__same_max_min) { +TEST(BOUNDED_8BITS_TYPED_ARRAY_true_false_true__same_max_min) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x00, 0x01, 0x00, 0x01}; Decoder decoder{stream}; @@ -90,7 +88,7 @@ TEST(JSONBinPack_Decoder, EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, BOUNDED_8BITS_TYPED_ARRAY_true_false_5__1_3) { +TEST(BOUNDED_8BITS_TYPED_ARRAY_true_false_5__1_3) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x02, 0x01, 0x00, 0x05}; Decoder decoder{stream}; @@ -109,7 +107,7 @@ TEST(JSONBinPack_Decoder, BOUNDED_8BITS_TYPED_ARRAY_true_false_5__1_3) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, BOUNDED_8BITS_TYPED_ARRAY_complex) { +TEST(BOUNDED_8BITS_TYPED_ARRAY_complex) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x03, 0x01, 0x01, 0x66, 0x6f, 0x6f, 0xfa, 0x01}; @@ -130,8 +128,7 @@ TEST(JSONBinPack_Decoder, BOUNDED_8BITS_TYPED_ARRAY_complex) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, - FLOOR_TYPED_ARRAY_true_false_true__no_prefix_encodings) { +TEST(FLOOR_TYPED_ARRAY_true_false_true__no_prefix_encodings) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x03, 0x01, 0x00, 0x01}; Decoder decoder{stream}; @@ -149,7 +146,7 @@ TEST(JSONBinPack_Decoder, EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, FLOOR_TYPED_ARRAY_true_false_5__1_3) { +TEST(FLOOR_TYPED_ARRAY_true_false_5__1_3) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x02, 0x01, 0x00, 0x05}; Decoder decoder{stream}; @@ -167,7 +164,7 @@ TEST(JSONBinPack_Decoder, FLOOR_TYPED_ARRAY_true_false_5__1_3) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, FLOOR_TYPED_ARRAY_complex) { +TEST(FLOOR_TYPED_ARRAY_complex) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x03, 0x01, 0x01, 0x66, 0x6f, 0x6f, 0xfa, 0x01}; @@ -187,8 +184,7 @@ TEST(JSONBinPack_Decoder, FLOOR_TYPED_ARRAY_complex) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, - ROOF_TYPED_ARRAY_true_false_true__no_prefix_encodings) { +TEST(ROOF_TYPED_ARRAY_true_false_true__no_prefix_encodings) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x03, 0x01, 0x00, 0x01}; Decoder decoder{stream}; @@ -206,7 +202,7 @@ TEST(JSONBinPack_Decoder, EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ROOF_TYPED_ARRAY_true_false_5__1_3) { +TEST(ROOF_TYPED_ARRAY_true_false_5__1_3) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x02, 0x01, 0x00, 0x05}; Decoder decoder{stream}; @@ -224,7 +220,7 @@ TEST(JSONBinPack_Decoder, ROOF_TYPED_ARRAY_true_false_5__1_3) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ROOF_TYPED_ARRAY_complex) { +TEST(ROOF_TYPED_ARRAY_complex) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x03, 0x01, 0x01, 0x66, 0x6f, 0x6f, 0xfa, 0x01}; diff --git a/test/runtime/decode_integer_test.cc b/test/runtime/decode_integer_test.cc index 77ad0c901..4dea3a6a7 100644 --- a/test/runtime/decode_integer_test.cc +++ b/test/runtime/decode_integer_test.cc @@ -1,12 +1,11 @@ -#include #include #include +#include #include #include // std::numeric_limits -TEST(JSONBinPack_Decoder, - BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__minus_5_minus_5_minus_1_1) { +TEST(BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__minus_5_minus_5_minus_1_1) { sourcemeta::core::InputByteStream stream{0x00}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.BOUNDED_MULTIPLE_8BITS_ENUM_FIXED({-5, -1, 1}); @@ -14,7 +13,7 @@ TEST(JSONBinPack_Decoder, EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__2_minus_5_5_1) { +TEST(BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__2_minus_5_5_1) { sourcemeta::core::InputByteStream stream{0x07}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.BOUNDED_MULTIPLE_8BITS_ENUM_FIXED({-5, 5, 1}); @@ -22,7 +21,7 @@ TEST(JSONBinPack_Decoder, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__2_minus_5_5_1) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__5_2_8_1) { +TEST(BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__5_2_8_1) { sourcemeta::core::InputByteStream stream{0x03}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.BOUNDED_MULTIPLE_8BITS_ENUM_FIXED({2, 8, 1}); @@ -30,7 +29,7 @@ TEST(JSONBinPack_Decoder, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__5_2_8_1) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__5_1_19_5) { +TEST(BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__5_1_19_5) { sourcemeta::core::InputByteStream stream{0x00}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.BOUNDED_MULTIPLE_8BITS_ENUM_FIXED({1, 19, 5}); @@ -38,7 +37,7 @@ TEST(JSONBinPack_Decoder, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__5_1_19_5) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__255_0_255_1) { +TEST(BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__255_0_255_1) { sourcemeta::core::InputByteStream stream{0xff}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.BOUNDED_MULTIPLE_8BITS_ENUM_FIXED({0, 255, 1}); @@ -46,7 +45,7 @@ TEST(JSONBinPack_Decoder, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__255_0_255_1) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, FLOOR_MULTIPLE_ENUM_VARINT__minus_3_minus_10_1) { +TEST(FLOOR_MULTIPLE_ENUM_VARINT__minus_3_minus_10_1) { sourcemeta::core::InputByteStream stream{0x07}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.FLOOR_MULTIPLE_ENUM_VARINT({-10, 1}); @@ -54,7 +53,7 @@ TEST(JSONBinPack_Decoder, FLOOR_MULTIPLE_ENUM_VARINT__minus_3_minus_10_1) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, FLOOR_MULTIPLE_ENUM_VARINT__5_2_1) { +TEST(FLOOR_MULTIPLE_ENUM_VARINT__5_2_1) { sourcemeta::core::InputByteStream stream{0x03}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.FLOOR_MULTIPLE_ENUM_VARINT({2, 1}); @@ -62,7 +61,7 @@ TEST(JSONBinPack_Decoder, FLOOR_MULTIPLE_ENUM_VARINT__5_2_1) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, FLOOR_MULTIPLE_ENUM_VARINT__10_5_5) { +TEST(FLOOR_MULTIPLE_ENUM_VARINT__10_5_5) { sourcemeta::core::InputByteStream stream{0x01}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.FLOOR_MULTIPLE_ENUM_VARINT({5, 5}); @@ -70,7 +69,7 @@ TEST(JSONBinPack_Decoder, FLOOR_MULTIPLE_ENUM_VARINT__10_5_5) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, FLOOR_MULTIPLE_ENUM_VARINT__10_2_5) { +TEST(FLOOR_MULTIPLE_ENUM_VARINT__10_2_5) { sourcemeta::core::InputByteStream stream{0x01}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.FLOOR_MULTIPLE_ENUM_VARINT({2, 5}); @@ -78,7 +77,7 @@ TEST(JSONBinPack_Decoder, FLOOR_MULTIPLE_ENUM_VARINT__10_2_5) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, FLOOR_MULTIPLE_ENUM_VARINT__1000_minus_2_4) { +TEST(FLOOR_MULTIPLE_ENUM_VARINT__1000_minus_2_4) { sourcemeta::core::InputByteStream stream{0xfa, 0x01}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.FLOOR_MULTIPLE_ENUM_VARINT({-2, 4}); @@ -86,7 +85,7 @@ TEST(JSONBinPack_Decoder, FLOOR_MULTIPLE_ENUM_VARINT__1000_minus_2_4) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ROOF_MULTIPLE_MIRROR_ENUM_VARINT__minus_3_minus_2_1) { +TEST(ROOF_MULTIPLE_MIRROR_ENUM_VARINT__minus_3_minus_2_1) { sourcemeta::core::InputByteStream stream{0x01}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.ROOF_MULTIPLE_MIRROR_ENUM_VARINT({-2, 1}); @@ -94,7 +93,7 @@ TEST(JSONBinPack_Decoder, ROOF_MULTIPLE_MIRROR_ENUM_VARINT__minus_3_minus_2_1) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ROOF_MULTIPLE_MIRROR_ENUM_VARINT__8_10_1) { +TEST(ROOF_MULTIPLE_MIRROR_ENUM_VARINT__8_10_1) { sourcemeta::core::InputByteStream stream{0x02}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.ROOF_MULTIPLE_MIRROR_ENUM_VARINT({10, 1}); @@ -102,7 +101,7 @@ TEST(JSONBinPack_Decoder, ROOF_MULTIPLE_MIRROR_ENUM_VARINT__8_10_1) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ROOF_MULTIPLE_MIRROR_ENUM_VARINT__5_16_5) { +TEST(ROOF_MULTIPLE_MIRROR_ENUM_VARINT__5_16_5) { sourcemeta::core::InputByteStream stream{0x02}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.ROOF_MULTIPLE_MIRROR_ENUM_VARINT({16, 5}); @@ -110,7 +109,7 @@ TEST(JSONBinPack_Decoder, ROOF_MULTIPLE_MIRROR_ENUM_VARINT__5_16_5) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ROOF_MULTIPLE_MIRROR_ENUM_VARINT__10_15_5) { +TEST(ROOF_MULTIPLE_MIRROR_ENUM_VARINT__10_15_5) { sourcemeta::core::InputByteStream stream{0x01}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.ROOF_MULTIPLE_MIRROR_ENUM_VARINT({15, 5}); @@ -118,7 +117,7 @@ TEST(JSONBinPack_Decoder, ROOF_MULTIPLE_MIRROR_ENUM_VARINT__10_15_5) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ARBITRARY_MULTIPLE_ZIGZAG_VARINT__minus_25200_1) { +TEST(ARBITRARY_MULTIPLE_ZIGZAG_VARINT__minus_25200_1) { sourcemeta::core::InputByteStream stream{0xdf, 0x89, 0x03}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.ARBITRARY_MULTIPLE_ZIGZAG_VARINT({1}); @@ -126,7 +125,7 @@ TEST(JSONBinPack_Decoder, ARBITRARY_MULTIPLE_ZIGZAG_VARINT__minus_25200_1) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ARBITRARY_MULTIPLE_ZIGZAG_VARINT__10_5) { +TEST(ARBITRARY_MULTIPLE_ZIGZAG_VARINT__10_5) { sourcemeta::core::InputByteStream stream{0x04}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.ARBITRARY_MULTIPLE_ZIGZAG_VARINT({5}); @@ -134,7 +133,7 @@ TEST(JSONBinPack_Decoder, ARBITRARY_MULTIPLE_ZIGZAG_VARINT__10_5) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ARBITRARY_MULTIPLE_ZIGZAG_VARINT__int64_max_1) { +TEST(ARBITRARY_MULTIPLE_ZIGZAG_VARINT__int64_max_1) { sourcemeta::core::InputByteStream stream{0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01}; sourcemeta::jsonbinpack::Decoder decoder{stream}; @@ -144,7 +143,7 @@ TEST(JSONBinPack_Decoder, ARBITRARY_MULTIPLE_ZIGZAG_VARINT__int64_max_1) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ARBITRARY_MULTIPLE_ZIGZAG_VARINT__int64_min_1) { +TEST(ARBITRARY_MULTIPLE_ZIGZAG_VARINT__int64_min_1) { sourcemeta::core::InputByteStream stream{0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01}; sourcemeta::jsonbinpack::Decoder decoder{stream}; diff --git a/test/runtime/decode_number_test.cc b/test/runtime/decode_number_test.cc index 358ec9d9c..69dd20320 100644 --- a/test/runtime/decode_number_test.cc +++ b/test/runtime/decode_number_test.cc @@ -1,9 +1,9 @@ -#include #include #include +#include #include -TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_5) { +TEST(DOUBLE_VARINT_TUPLE_5) { sourcemeta::core::InputByteStream stream{0x0a, 0x00}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.DOUBLE_VARINT_TUPLE({}); @@ -11,7 +11,7 @@ TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_5) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_minus_3_point_14) { +TEST(DOUBLE_VARINT_TUPLE_minus_3_point_14) { sourcemeta::core::InputByteStream stream{0xf3, 0x04, 0x02}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.DOUBLE_VARINT_TUPLE({}); @@ -19,7 +19,7 @@ TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_minus_3_point_14) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_minus_5) { +TEST(DOUBLE_VARINT_TUPLE_minus_5) { sourcemeta::core::InputByteStream stream{0x09, 0x00}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.DOUBLE_VARINT_TUPLE({}); @@ -27,7 +27,7 @@ TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_minus_5) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_zero) { +TEST(DOUBLE_VARINT_TUPLE_zero) { sourcemeta::core::InputByteStream stream{0x00, 0x00}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.DOUBLE_VARINT_TUPLE({}); @@ -35,7 +35,7 @@ TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_zero) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_1235) { +TEST(DOUBLE_VARINT_TUPLE_1235) { sourcemeta::core::InputByteStream stream{0xa6, 0x13, 0x00}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.DOUBLE_VARINT_TUPLE({}); @@ -43,7 +43,7 @@ TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_1235) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_0_point_1235) { +TEST(DOUBLE_VARINT_TUPLE_0_point_1235) { sourcemeta::core::InputByteStream stream{0xa6, 0x13, 0x04}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.DOUBLE_VARINT_TUPLE({}); @@ -51,7 +51,7 @@ TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_0_point_1235) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_1_point_235) { +TEST(DOUBLE_VARINT_TUPLE_1_point_235) { sourcemeta::core::InputByteStream stream{0xa6, 0x13, 0x03}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.DOUBLE_VARINT_TUPLE({}); @@ -59,7 +59,7 @@ TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_1_point_235) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_0_point_01235) { +TEST(DOUBLE_VARINT_TUPLE_0_point_01235) { sourcemeta::core::InputByteStream stream{0xa6, 0x13, 0x05}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.DOUBLE_VARINT_TUPLE({}); @@ -67,7 +67,7 @@ TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_0_point_01235) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_12_point_35) { +TEST(DOUBLE_VARINT_TUPLE_12_point_35) { sourcemeta::core::InputByteStream stream{0xa6, 0x13, 0x02}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.DOUBLE_VARINT_TUPLE({}); @@ -75,7 +75,7 @@ TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_12_point_35) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_0_point_001235) { +TEST(DOUBLE_VARINT_TUPLE_0_point_001235) { sourcemeta::core::InputByteStream stream{0xa6, 0x13, 0x06}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.DOUBLE_VARINT_TUPLE({}); @@ -83,7 +83,7 @@ TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_0_point_001235) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_123_point_5) { +TEST(DOUBLE_VARINT_TUPLE_123_point_5) { sourcemeta::core::InputByteStream stream{0xa6, 0x13, 0x01}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.DOUBLE_VARINT_TUPLE({}); @@ -91,7 +91,7 @@ TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_123_point_5) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_314) { +TEST(DOUBLE_VARINT_TUPLE_314) { sourcemeta::core::InputByteStream stream{0xf4, 0x04, 0x00}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.DOUBLE_VARINT_TUPLE({}); @@ -99,7 +99,7 @@ TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_314) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_0_point_314) { +TEST(DOUBLE_VARINT_TUPLE_0_point_314) { sourcemeta::core::InputByteStream stream{0xf4, 0x04, 0x03}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.DOUBLE_VARINT_TUPLE({}); @@ -107,7 +107,7 @@ TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_0_point_314) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_3_point_14) { +TEST(DOUBLE_VARINT_TUPLE_3_point_14) { sourcemeta::core::InputByteStream stream{0xf4, 0x04, 0x02}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.DOUBLE_VARINT_TUPLE({}); @@ -115,7 +115,7 @@ TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_3_point_14) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_0_point_0314) { +TEST(DOUBLE_VARINT_TUPLE_0_point_0314) { sourcemeta::core::InputByteStream stream{0xf4, 0x04, 0x04}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.DOUBLE_VARINT_TUPLE({}); @@ -123,7 +123,7 @@ TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_0_point_0314) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, DOUBLE_VARINT_TUPLE_31_point_4) { +TEST(DOUBLE_VARINT_TUPLE_31_point_4) { sourcemeta::core::InputByteStream stream{0xf4, 0x04, 0x01}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.DOUBLE_VARINT_TUPLE({}); diff --git a/test/runtime/decode_object_test.cc b/test/runtime/decode_object_test.cc index b62a068ec..d6e595284 100644 --- a/test/runtime/decode_object_test.cc +++ b/test/runtime/decode_object_test.cc @@ -1,11 +1,10 @@ -#include #include #include #include +#include -TEST(JSONBinPack_Decoder, - FIXED_TYPED_ARBITRARY_OBJECT__no_length_string__integer) { +TEST(FIXED_TYPED_ARBITRARY_OBJECT__no_length_string__integer) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0x66, 0x6f, 0x6f, // "foo" @@ -30,8 +29,7 @@ TEST(JSONBinPack_Decoder, EXPECT_EQ(bar.to_integer(), 2); } -TEST(JSONBinPack_Decoder, - VARINT_TYPED_ARBITRARY_OBJECT__no_length_string__integer) { +TEST(VARINT_TYPED_ARBITRARY_OBJECT__no_length_string__integer) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{ 0x02, // length 2 diff --git a/test/runtime/decode_string_test.cc b/test/runtime/decode_string_test.cc index d25e3355d..ab2c80c33 100644 --- a/test/runtime/decode_string_test.cc +++ b/test/runtime/decode_string_test.cc @@ -1,9 +1,9 @@ -#include #include #include +#include #include -TEST(JSONBinPack_Decoder, UTF8_STRING_NO_LENGTH_foo_bar) { +TEST(UTF8_STRING_NO_LENGTH_foo_bar) { sourcemeta::core::InputByteStream stream{0x66, 0x6f, 0x6f, 0x20, 0x62, 0x61, 0x72}; sourcemeta::jsonbinpack::Decoder decoder{stream}; @@ -12,7 +12,7 @@ TEST(JSONBinPack_Decoder, UTF8_STRING_NO_LENGTH_foo_bar) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_foo_3) { +TEST(FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_foo_3) { sourcemeta::core::InputByteStream stream{0x01, 0x66, 0x6f, 0x6f}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED({3}); @@ -20,7 +20,7 @@ TEST(JSONBinPack_Decoder, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_foo_3) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_foo_0_foo_3) { +TEST(FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_foo_0_foo_3) { sourcemeta::core::InputByteStream stream{0x04, 0x66, 0x6f, 0x6f, 0x00, 0x01, 0x05}; sourcemeta::jsonbinpack::Decoder decoder{stream}; @@ -37,7 +37,7 @@ TEST(JSONBinPack_Decoder, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_foo_0_foo_3) { EXPECT_EQ(result2, expected); } -TEST(JSONBinPack_Decoder, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_unicode_1) { +TEST(FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_unicode_1) { sourcemeta::core::InputByteStream stream{0x04, 0x66, 0x6f, 0xc3, 0xb8}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED({1}); @@ -45,7 +45,7 @@ TEST(JSONBinPack_Decoder, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_unicode_1) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_foo_4) { +TEST(ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_foo_4) { sourcemeta::core::InputByteStream stream{0x02, 0x66, 0x6f, 0x6f}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.ROOF_VARINT_PREFIX_UTF8_STRING_SHARED({4}); @@ -53,7 +53,7 @@ TEST(JSONBinPack_Decoder, ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_foo_4) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_foo_3_foo_5) { +TEST(ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_foo_3_foo_5) { sourcemeta::core::InputByteStream stream{0x01, 0x66, 0x6f, 0x6f, 0x00, 0x03, 0x05}; sourcemeta::jsonbinpack::Decoder decoder{stream}; @@ -70,7 +70,7 @@ TEST(JSONBinPack_Decoder, ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_foo_3_foo_5) { EXPECT_EQ(result2, expected); } -TEST(JSONBinPack_Decoder, ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_unicode_4) { +TEST(ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_unicode_4) { sourcemeta::core::InputByteStream stream{0x01, 0x66, 0x6f, 0xc3, 0xb8}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED({4}); @@ -78,7 +78,7 @@ TEST(JSONBinPack_Decoder, ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_unicode_4) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_foo_3_5) { +TEST(BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_foo_3_5) { sourcemeta::core::InputByteStream stream{0x01, 0x66, 0x6f, 0x6f}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED({3, 5}); @@ -86,7 +86,7 @@ TEST(JSONBinPack_Decoder, BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_foo_3_5) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_foo_3_3) { +TEST(BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_foo_3_3) { sourcemeta::core::InputByteStream stream{0x01, 0x66, 0x6f, 0x6f}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED({3, 3}); @@ -94,8 +94,7 @@ TEST(JSONBinPack_Decoder, BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_foo_3_3) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, - BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_foo_0_6_foo_3_100) { +TEST(BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_foo_0_6_foo_3_100) { sourcemeta::core::InputByteStream stream{0x04, 0x66, 0x6f, 0x6f, 0x00, 0x01, 0x05}; sourcemeta::jsonbinpack::Decoder decoder{stream}; @@ -112,7 +111,7 @@ TEST(JSONBinPack_Decoder, EXPECT_EQ(result2, expected); } -TEST(JSONBinPack_Decoder, BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_unicode_0_6) { +TEST(BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_unicode_0_6) { sourcemeta::core::InputByteStream stream{0x05, 0x66, 0x6f, 0xc3, 0xb8}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED({0, 6}); @@ -120,7 +119,7 @@ TEST(JSONBinPack_Decoder, BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_unicode_0_6) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, RFC3339_DATE_INTEGER_TRIPLET_2014_10_01) { +TEST(RFC3339_DATE_INTEGER_TRIPLET_2014_10_01) { sourcemeta::core::InputByteStream stream{0xde, 0x07, 0x0a, 0x01}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.RFC3339_DATE_INTEGER_TRIPLET({}); @@ -128,7 +127,7 @@ TEST(JSONBinPack_Decoder, RFC3339_DATE_INTEGER_TRIPLET_2014_10_01) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, PREFIX_VARINT_LENGTH_STRING_SHARED_foo) { +TEST(PREFIX_VARINT_LENGTH_STRING_SHARED_foo) { sourcemeta::core::InputByteStream stream{0x04, 0x66, 0x6f, 0x6f}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.PREFIX_VARINT_LENGTH_STRING_SHARED({}); @@ -136,7 +135,7 @@ TEST(JSONBinPack_Decoder, PREFIX_VARINT_LENGTH_STRING_SHARED_foo) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, PREFIX_VARINT_LENGTH_STRING_SHARED_foo_foo_foo_foo) { +TEST(PREFIX_VARINT_LENGTH_STRING_SHARED_foo_foo_foo_foo) { sourcemeta::core::InputByteStream stream{0x04, 0x66, 0x6f, 0x6f, 0x00, 0x05, 0x00, 0x03, 0x00, 0x03}; sourcemeta::jsonbinpack::Decoder decoder{stream}; @@ -156,8 +155,7 @@ TEST(JSONBinPack_Decoder, PREFIX_VARINT_LENGTH_STRING_SHARED_foo_foo_foo_foo) { EXPECT_EQ(result4, expected); } -TEST(JSONBinPack_Decoder, - PREFIX_VARINT_LENGTH_STRING_SHARED_non_key_foo_key_foo) { +TEST(PREFIX_VARINT_LENGTH_STRING_SHARED_non_key_foo_key_foo) { sourcemeta::core::InputByteStream stream{0x01, 0x66, 0x6f, 0x6f, 0x04, 0x66, 0x6f, 0x6f}; sourcemeta::jsonbinpack::Decoder decoder{stream}; @@ -170,8 +168,7 @@ TEST(JSONBinPack_Decoder, EXPECT_EQ(result2, expected); } -TEST(JSONBinPack_Decoder, - PREFIX_VARINT_LENGTH_STRING_SHARED_key_foo_non_key_foo) { +TEST(PREFIX_VARINT_LENGTH_STRING_SHARED_key_foo_non_key_foo) { sourcemeta::core::InputByteStream stream{0x04, 0x66, 0x6f, 0x6f, 0x00, 0x01, 0x05}; sourcemeta::jsonbinpack::Decoder decoder{stream}; @@ -184,7 +181,7 @@ TEST(JSONBinPack_Decoder, EXPECT_EQ(result2, expected); } -TEST(JSONBinPack_Decoder, PREFIX_VARINT_LENGTH_STRING_SHARED_unicode) { +TEST(PREFIX_VARINT_LENGTH_STRING_SHARED_unicode) { sourcemeta::core::InputByteStream stream{0x05, 0x66, 0x6f, 0xc3, 0xb8}; sourcemeta::jsonbinpack::Decoder decoder{stream}; const auto result = decoder.PREFIX_VARINT_LENGTH_STRING_SHARED({}); diff --git a/test/runtime/decode_test.cc b/test/runtime/decode_test.cc index c1c6c667d..18edb3f02 100644 --- a/test/runtime/decode_test.cc +++ b/test/runtime/decode_test.cc @@ -1,9 +1,9 @@ -#include #include #include +#include #include -TEST(JSONBinPack_Decoder, generic_decode_BOUNDED_MULTIPLE_8BITS_ENUM_FIXED) { +TEST(generic_decode_BOUNDED_MULTIPLE_8BITS_ENUM_FIXED) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x00}; Decoder decoder{stream}; @@ -13,7 +13,7 @@ TEST(JSONBinPack_Decoder, generic_decode_BOUNDED_MULTIPLE_8BITS_ENUM_FIXED) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_Decoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX_many) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX_many) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::InputByteStream stream{0x15, 0x1d, 0x25}; Decoder decoder{stream}; diff --git a/test/runtime/decode_traits_test.cc b/test/runtime/decode_traits_test.cc index 9dfc42d0f..564ea38f8 100644 --- a/test/runtime/decode_traits_test.cc +++ b/test/runtime/decode_traits_test.cc @@ -1,40 +1,39 @@ -#include - +#include #include #include -TEST(JSONBinPack_Decoder, not_copy_constructible) { +TEST(not_copy_constructible) { const bool result{ std::is_copy_constructible_v}; EXPECT_FALSE(result); } -TEST(JSONBinPack_Decoder, not_trivially_copy_constructible) { +TEST(not_trivially_copy_constructible) { const bool result{ std::is_trivially_copy_constructible_v}; EXPECT_FALSE(result); } -TEST(JSONBinPack_Decoder, not_nothrow_copy_constructible) { +TEST(not_nothrow_copy_constructible) { const bool result{ std::is_nothrow_copy_constructible_v}; EXPECT_FALSE(result); } -TEST(JSONBinPack_Decoder, not_copy_assignable) { +TEST(not_copy_assignable) { const bool result{ std::is_copy_assignable_v}; EXPECT_FALSE(result); } -TEST(JSONBinPack_Decoder, not_trivially_copy_assignable) { +TEST(not_trivially_copy_assignable) { const bool result{ std::is_trivially_copy_assignable_v}; EXPECT_FALSE(result); } -TEST(JSONBinPack_Decoder, not_nothrow_copy_assignable) { +TEST(not_nothrow_copy_assignable) { const bool result{ std::is_nothrow_copy_assignable_v}; EXPECT_FALSE(result); diff --git a/test/runtime/encode_any_test.cc b/test/runtime/encode_any_test.cc index 3316bd2e6..cc74dea92 100644 --- a/test/runtime/encode_any_test.cc +++ b/test/runtime/encode_any_test.cc @@ -1,15 +1,14 @@ -#include - #include // std::equal #include // std::byte #include #include +#include #include #include #include #include -TEST(JSONBinPack_Encoder, BYTE_CHOICE_INDEX_1__1_0_0) { +TEST(BYTE_CHOICE_INDEX_1__1_0_0) { const sourcemeta::core::JSON document{1}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -21,7 +20,7 @@ TEST(JSONBinPack_Encoder, BYTE_CHOICE_INDEX_1__1_0_0) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x00}})); } -TEST(JSONBinPack_Encoder, BYTE_CHOICE_INDEX_1__0_1_0) { +TEST(BYTE_CHOICE_INDEX_1__0_1_0) { const sourcemeta::core::JSON document{1}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -33,7 +32,7 @@ TEST(JSONBinPack_Encoder, BYTE_CHOICE_INDEX_1__0_1_0) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, BYTE_CHOICE_INDEX_1__0_0_1) { +TEST(BYTE_CHOICE_INDEX_1__0_0_1) { const sourcemeta::core::JSON document{1}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -45,7 +44,7 @@ TEST(JSONBinPack_Encoder, BYTE_CHOICE_INDEX_1__0_0_1) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x02}})); } -TEST(JSONBinPack_Encoder, BYTE_CHOICE_INDEX_bar__foo_bar_bar) { +TEST(BYTE_CHOICE_INDEX_bar__foo_bar_bar) { const sourcemeta::core::JSON document{"bar"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -57,7 +56,7 @@ TEST(JSONBinPack_Encoder, BYTE_CHOICE_INDEX_bar__foo_bar_bar) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, BYTE_CHOICE_INDEX_non_scalar_1) { +TEST(BYTE_CHOICE_INDEX_non_scalar_1) { const sourcemeta::core::JSON document = sourcemeta::core::parse_json("{ \"foo\": 1 }"); sourcemeta::core::OutputByteStream stream{}; @@ -74,7 +73,7 @@ TEST(JSONBinPack_Encoder, BYTE_CHOICE_INDEX_non_scalar_1) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x03}})); } -TEST(JSONBinPack_Encoder, LARGE_CHOICE_INDEX_1__1_0_0) { +TEST(LARGE_CHOICE_INDEX_1__1_0_0) { const sourcemeta::core::JSON document{1}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -86,7 +85,7 @@ TEST(JSONBinPack_Encoder, LARGE_CHOICE_INDEX_1__1_0_0) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x00}})); } -TEST(JSONBinPack_Encoder, LARGE_CHOICE_INDEX_1__0_1_0) { +TEST(LARGE_CHOICE_INDEX_1__0_1_0) { const sourcemeta::core::JSON document{1}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -98,7 +97,7 @@ TEST(JSONBinPack_Encoder, LARGE_CHOICE_INDEX_1__0_1_0) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, LARGE_CHOICE_INDEX_1__0_0_1) { +TEST(LARGE_CHOICE_INDEX_1__0_0_1) { const sourcemeta::core::JSON document{1}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -110,7 +109,7 @@ TEST(JSONBinPack_Encoder, LARGE_CHOICE_INDEX_1__0_0_1) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x02}})); } -TEST(JSONBinPack_Encoder, LARGE_CHOICE_INDEX_bar__foo_bar_bar) { +TEST(LARGE_CHOICE_INDEX_bar__foo_bar_bar) { const sourcemeta::core::JSON document{"bar"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -122,7 +121,7 @@ TEST(JSONBinPack_Encoder, LARGE_CHOICE_INDEX_bar__foo_bar_bar) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, LARGE_CHOICE_INDEX_non_scalar_1) { +TEST(LARGE_CHOICE_INDEX_non_scalar_1) { const sourcemeta::core::JSON document = sourcemeta::core::parse_json("{ \"foo\": 1 }"); sourcemeta::core::OutputByteStream stream{}; @@ -139,7 +138,7 @@ TEST(JSONBinPack_Encoder, LARGE_CHOICE_INDEX_non_scalar_1) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x03}})); } -TEST(JSONBinPack_Encoder, LARGE_CHOICE_INDEX_enum_250) { +TEST(LARGE_CHOICE_INDEX_enum_250) { const sourcemeta::core::JSON document{250}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -153,7 +152,7 @@ TEST(JSONBinPack_Encoder, LARGE_CHOICE_INDEX_enum_250) { (std::vector{std::byte{0xfa}, std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, TOP_LEVEL_BYTE_CHOICE_INDEX_1__1_0_0) { +TEST(TOP_LEVEL_BYTE_CHOICE_INDEX_1__1_0_0) { const sourcemeta::core::JSON document{1}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -165,7 +164,7 @@ TEST(JSONBinPack_Encoder, TOP_LEVEL_BYTE_CHOICE_INDEX_1__1_0_0) { EXPECT_EQ(stream.bytes(), (std::vector{})); } -TEST(JSONBinPack_Encoder, TOP_LEVEL_BYTE_CHOICE_INDEX_1__0_1_0) { +TEST(TOP_LEVEL_BYTE_CHOICE_INDEX_1__0_1_0) { const sourcemeta::core::JSON document{1}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -177,7 +176,7 @@ TEST(JSONBinPack_Encoder, TOP_LEVEL_BYTE_CHOICE_INDEX_1__0_1_0) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x00}})); } -TEST(JSONBinPack_Encoder, TOP_LEVEL_BYTE_CHOICE_INDEX_1__0_0_1) { +TEST(TOP_LEVEL_BYTE_CHOICE_INDEX_1__0_0_1) { const sourcemeta::core::JSON document{1}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -189,7 +188,7 @@ TEST(JSONBinPack_Encoder, TOP_LEVEL_BYTE_CHOICE_INDEX_1__0_0_1) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, TOP_LEVEL_BYTE_CHOICE_INDEX_bar__foo_bar_bar) { +TEST(TOP_LEVEL_BYTE_CHOICE_INDEX_bar__foo_bar_bar) { const sourcemeta::core::JSON document{"bar"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -201,7 +200,7 @@ TEST(JSONBinPack_Encoder, TOP_LEVEL_BYTE_CHOICE_INDEX_bar__foo_bar_bar) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x00}})); } -TEST(JSONBinPack_Encoder, TOP_LEVEL_BYTE_CHOICE_INDEX_non_scalar_1) { +TEST(TOP_LEVEL_BYTE_CHOICE_INDEX_non_scalar_1) { const sourcemeta::core::JSON document = sourcemeta::core::parse_json("{ \"foo\": 1 }"); sourcemeta::core::OutputByteStream stream{}; @@ -218,7 +217,7 @@ TEST(JSONBinPack_Encoder, TOP_LEVEL_BYTE_CHOICE_INDEX_non_scalar_1) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x02}})); } -TEST(JSONBinPack_Encoder, CONST_NONE_scalar) { +TEST(CONST_NONE_scalar) { const sourcemeta::core::JSON document{1}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -226,7 +225,7 @@ TEST(JSONBinPack_Encoder, CONST_NONE_scalar) { EXPECT_EQ(stream.bytes(), (std::vector{})); } -TEST(JSONBinPack_Encoder, CONST_NONE_complex) { +TEST(CONST_NONE_complex) { const sourcemeta::core::JSON document = sourcemeta::core::parse_json("{ \"foo\": 1 }"); sourcemeta::core::OutputByteStream stream{}; @@ -235,7 +234,7 @@ TEST(JSONBinPack_Encoder, CONST_NONE_complex) { EXPECT_EQ(stream.bytes(), (std::vector{})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__null) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__null) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{nullptr}; sourcemeta::core::OutputByteStream stream{}; @@ -245,7 +244,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__null) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x17}})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__false) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__false) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{false}; sourcemeta::core::OutputByteStream stream{}; @@ -255,7 +254,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__false) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x07}})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__true) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__true) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{true}; sourcemeta::core::OutputByteStream stream{}; @@ -265,7 +264,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__true) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x0f}})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__real_3_14) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__real_3_14) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{3.14}; sourcemeta::core::OutputByteStream stream{}; @@ -277,7 +276,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__real_3_14) { std::byte{0x04}, std::byte{0x02}})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__real_3_0) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__real_3_0) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{3.0}; sourcemeta::core::OutputByteStream stream{}; @@ -288,7 +287,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__real_3_0) { (std::vector{std::byte{0x37}, std::byte{0x03}})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__real_103_0) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__real_103_0) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{103.0}; sourcemeta::core::OutputByteStream stream{}; @@ -299,7 +298,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__real_103_0) { (std::vector{std::byte{0x37}, std::byte{0x67}})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__256) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__256) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{256}; sourcemeta::core::OutputByteStream stream{}; @@ -311,7 +310,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__256) { std::byte{0x02}})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__minus_257) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__minus_257) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{-257}; sourcemeta::core::OutputByteStream stream{}; @@ -323,7 +322,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__minus_257) { std::byte{0x02}})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__255) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__255) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{255}; sourcemeta::core::OutputByteStream stream{}; @@ -334,7 +333,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__255) { (std::vector{std::byte{0x05}, std::byte{0xff}})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__minus_256) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__minus_256) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{-256}; sourcemeta::core::OutputByteStream stream{}; @@ -345,7 +344,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__minus_256) { (std::vector{std::byte{0x06}, std::byte{0xff}})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__0) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__0) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{0}; sourcemeta::core::OutputByteStream stream{}; @@ -355,7 +354,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__0) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x0d}})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__minus_1) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__minus_1) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{-1}; sourcemeta::core::OutputByteStream stream{}; @@ -365,7 +364,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__minus_1) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x0e}})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_space) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_space) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{" "}; sourcemeta::core::OutputByteStream stream{}; @@ -376,7 +375,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_space) { (std::vector{std::byte{0x11}, std::byte{0x20}})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_foo) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_foo) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{"foo"}; sourcemeta::core::OutputByteStream stream{}; @@ -388,7 +387,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_foo) { std::byte{0x6f}, std::byte{0x6f}})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_30_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_30_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{std::string(30, 'x')}; EXPECT_EQ(document.size(), 30); @@ -409,7 +408,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_30_xs) { std::byte{0x78}, std::byte{0x78}, std::byte{0x78}})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__shared_string_foo) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__shared_string_foo) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{"foo"}; sourcemeta::core::OutputByteStream stream{}; @@ -425,7 +424,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__shared_string_foo) { std::byte{0x20}, std::byte{0x06}})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_31_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_31_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{std::string(31, 'x')}; EXPECT_EQ(document.size(), 31); @@ -438,7 +437,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_31_xs) { EXPECT_EQ(stream.bytes(), expected); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_61_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_61_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{std::string(61, 'x')}; EXPECT_EQ(document.size(), 61); @@ -451,7 +450,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_61_xs) { EXPECT_EQ(stream.bytes(), expected); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_url) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_url) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{"https://soundcloud.com/dandymusicnl"}; sourcemeta::core::OutputByteStream stream{}; @@ -471,7 +470,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_url) { EXPECT_EQ(stream.bytes(), expected); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_128_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_128_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{std::string(128, 'x')}; EXPECT_EQ(document.size(), 128); @@ -484,7 +483,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_128_xs) { EXPECT_EQ(stream.bytes(), expected); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_130_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_130_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{std::string(130, 'x')}; EXPECT_EQ(document.size(), 130); @@ -497,7 +496,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_130_xs) { EXPECT_EQ(stream.bytes(), expected); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_256_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_256_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{std::string(256, 'x')}; EXPECT_EQ(document.size(), 256); @@ -510,7 +509,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_256_xs) { EXPECT_EQ(stream.bytes(), expected); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_258_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_258_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{std::string(258, 'x')}; EXPECT_EQ(document.size(), 258); @@ -523,7 +522,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_258_xs) { EXPECT_EQ(stream.bytes(), expected); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_512_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_512_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{std::string(512, 'x')}; EXPECT_EQ(document.size(), 512); @@ -536,7 +535,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_512_xs) { EXPECT_EQ(stream.bytes(), expected); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_513_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_513_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{std::string(513, 'x')}; EXPECT_EQ(document.size(), 513); @@ -549,7 +548,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_513_xs) { EXPECT_EQ(stream.bytes(), expected); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_1024_xs) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_1024_xs) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{std::string(1024, 'x')}; EXPECT_EQ(document.size(), 1024); @@ -562,8 +561,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_1024_xs) { EXPECT_EQ(stream.bytes(), expected); } -TEST(JSONBinPack_Encoder, - ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_62_xs_non_shared) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_62_xs_non_shared) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{std::string(62, 'x')}; EXPECT_EQ(document.size(), 62); @@ -576,8 +574,7 @@ TEST(JSONBinPack_Encoder, EXPECT_EQ(stream.bytes(), expected); } -TEST(JSONBinPack_Encoder, - ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_63_xs_non_shared) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__string_63_xs_non_shared) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{std::string(63, 'x')}; EXPECT_EQ(document.size(), 63); @@ -590,7 +587,7 @@ TEST(JSONBinPack_Encoder, EXPECT_EQ(stream.bytes(), expected); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__foo_true_2000) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__foo_true_2000) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document = sourcemeta::core::parse_json("[ \"foo\", true, 2000 ]"); @@ -605,7 +602,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__foo_true_2000) { std::byte{0x1f}, std::byte{0xd0}, std::byte{0x0f}})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__array_30) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__array_30) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{sourcemeta::core::JSON::Array{}}; for (auto count = 0; count < 30; count++) { @@ -630,7 +627,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__array_30) { std::byte{0x0f}, std::byte{0x0f}, std::byte{0x0f}})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__array_31) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__array_31) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{sourcemeta::core::JSON::Array{}}; for (auto count = 0; count < 31; count++) { @@ -647,7 +644,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__array_31) { EXPECT_EQ(stream.bytes(), expected); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__array_32) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__array_32) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{sourcemeta::core::JSON::Array{}}; for (auto count = 0; count < 32; count++) { @@ -664,8 +661,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__array_32) { EXPECT_EQ(stream.bytes(), expected); } -TEST(JSONBinPack_Encoder, - ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_foo_bar_baz_1) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_foo_bar_baz_1) { using namespace sourcemeta::jsonbinpack; const sourcemeta::core::JSON document = sourcemeta::core::parse_json("{ \"foo\": \"bar\", \"baz\": 1 }"); @@ -694,7 +690,7 @@ TEST(JSONBinPack_Encoder, } } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_30_entries) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_30_entries) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{sourcemeta::core::JSON::Object{}}; const sourcemeta::core::JSON value{true}; @@ -747,7 +743,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_30_entries) { } } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_31_entries) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_31_entries) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{sourcemeta::core::JSON::Object{}}; const sourcemeta::core::JSON value{true}; @@ -804,7 +800,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_31_entries) { } } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_32_entries) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_32_entries) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{sourcemeta::core::JSON::Object{}}; const sourcemeta::core::JSON value{true}; @@ -862,8 +858,7 @@ TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_32_entries) { } } -TEST(JSONBinPack_Encoder, - ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_62_xs_shared) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX__object_62_xs_shared) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{sourcemeta::core::JSON::Object{}}; diff --git a/test/runtime/encode_array_test.cc b/test/runtime/encode_array_test.cc index 4f167cdbe..7876c02b3 100644 --- a/test/runtime/encode_array_test.cc +++ b/test/runtime/encode_array_test.cc @@ -1,5 +1,3 @@ -#include - #include // std::byte #include @@ -7,7 +5,8 @@ #include #include -TEST(JSONBinPack_Encoder, FIXED_TYPED_ARRAY_0_1_2__no_prefix_encodings) { +#include +TEST(FIXED_TYPED_ARRAY_0_1_2__no_prefix_encodings) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document = sourcemeta::core::parse_json("[ 0, 1, 2 ]"); sourcemeta::core::OutputByteStream stream{}; @@ -23,7 +22,7 @@ TEST(JSONBinPack_Encoder, FIXED_TYPED_ARRAY_0_1_2__no_prefix_encodings) { std::byte{0x02}})); } -TEST(JSONBinPack_Encoder, FIXED_TYPED_ARRAY_0_1_true__semityped) { +TEST(FIXED_TYPED_ARRAY_0_1_true__semityped) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document = sourcemeta::core::parse_json("[ 0, 1, true ]"); @@ -47,7 +46,7 @@ TEST(JSONBinPack_Encoder, FIXED_TYPED_ARRAY_0_1_true__semityped) { std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, FIXED_TYPED_ARRAY_empty__no_prefix_encodings) { +TEST(FIXED_TYPED_ARRAY_empty__no_prefix_encodings) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document{sourcemeta::core::JSON::Array{}}; sourcemeta::core::OutputByteStream stream{}; @@ -61,8 +60,7 @@ TEST(JSONBinPack_Encoder, FIXED_TYPED_ARRAY_empty__no_prefix_encodings) { EXPECT_EQ(stream.bytes(), (std::vector{})); } -TEST(JSONBinPack_Encoder, - BOUNDED_8BITS_TYPED_ARRAY_true_false_true__no_prefix_encodings) { +TEST(BOUNDED_8BITS_TYPED_ARRAY_true_false_true__no_prefix_encodings) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document = sourcemeta::core::parse_json("[ true, false, true ]"); @@ -84,8 +82,7 @@ TEST(JSONBinPack_Encoder, std::byte{0x00}, std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, - BOUNDED_8BITS_TYPED_ARRAY_true_false_true__same_max_min) { +TEST(BOUNDED_8BITS_TYPED_ARRAY_true_false_true__same_max_min) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document = sourcemeta::core::parse_json("[ true, false, true ]"); @@ -107,7 +104,7 @@ TEST(JSONBinPack_Encoder, std::byte{0x00}, std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, BOUNDED_8BITS_TYPED_ARRAY_true_false_5__1_3) { +TEST(BOUNDED_8BITS_TYPED_ARRAY_true_false_5__1_3) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document = sourcemeta::core::parse_json("[ true, false, 5 ]"); @@ -129,7 +126,7 @@ TEST(JSONBinPack_Encoder, BOUNDED_8BITS_TYPED_ARRAY_true_false_5__1_3) { std::byte{0x00}, std::byte{0x05}})); } -TEST(JSONBinPack_Encoder, BOUNDED_8BITS_TYPED_ARRAY_complex) { +TEST(BOUNDED_8BITS_TYPED_ARRAY_complex) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document = sourcemeta::core::parse_json("[ true, \"foo\", 1000 ]"); @@ -153,8 +150,7 @@ TEST(JSONBinPack_Encoder, BOUNDED_8BITS_TYPED_ARRAY_complex) { std::byte{0xfa}, std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, - FLOOR_TYPED_ARRAY_true_false_true__no_prefix_encodings) { +TEST(FLOOR_TYPED_ARRAY_true_false_true__no_prefix_encodings) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document = sourcemeta::core::parse_json("[ true, false, true ]"); @@ -175,7 +171,7 @@ TEST(JSONBinPack_Encoder, std::byte{0x00}, std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, FLOOR_TYPED_ARRAY_true_false_5__1_3) { +TEST(FLOOR_TYPED_ARRAY_true_false_5__1_3) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document = sourcemeta::core::parse_json("[ true, false, 5 ]"); @@ -196,7 +192,7 @@ TEST(JSONBinPack_Encoder, FLOOR_TYPED_ARRAY_true_false_5__1_3) { std::byte{0x00}, std::byte{0x05}})); } -TEST(JSONBinPack_Encoder, FLOOR_TYPED_ARRAY_complex) { +TEST(FLOOR_TYPED_ARRAY_complex) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document = sourcemeta::core::parse_json("[ true, \"foo\", 1000 ]"); @@ -219,8 +215,7 @@ TEST(JSONBinPack_Encoder, FLOOR_TYPED_ARRAY_complex) { std::byte{0xfa}, std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, - ROOF_TYPED_ARRAY_true_false_true__no_prefix_encodings) { +TEST(ROOF_TYPED_ARRAY_true_false_true__no_prefix_encodings) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document = sourcemeta::core::parse_json("[ true, false, true ]"); @@ -241,7 +236,7 @@ TEST(JSONBinPack_Encoder, std::byte{0x00}, std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, ROOF_TYPED_ARRAY_true_false_5__1_3) { +TEST(ROOF_TYPED_ARRAY_true_false_5__1_3) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document = sourcemeta::core::parse_json("[ true, false, 5 ]"); @@ -262,7 +257,7 @@ TEST(JSONBinPack_Encoder, ROOF_TYPED_ARRAY_true_false_5__1_3) { std::byte{0x00}, std::byte{0x05}})); } -TEST(JSONBinPack_Encoder, ROOF_TYPED_ARRAY_complex) { +TEST(ROOF_TYPED_ARRAY_complex) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::JSON document = sourcemeta::core::parse_json("[ true, \"foo\", 1000 ]"); diff --git a/test/runtime/encode_cache_test.cc b/test/runtime/encode_cache_test.cc index ce1e1bb8c..841eb8c2a 100644 --- a/test/runtime/encode_cache_test.cc +++ b/test/runtime/encode_cache_test.cc @@ -1,12 +1,11 @@ -#include - #include #include #include +#include #include -TEST(JSONBinPack_Encoder, cache_record_string) { +TEST(cache_record_string) { sourcemeta::jsonbinpack::Cache cache; using CacheType = sourcemeta::jsonbinpack::Cache::Type; const auto result_1{cache.find("foo", CacheType::Standalone)}; @@ -17,7 +16,7 @@ TEST(JSONBinPack_Encoder, cache_record_string) { EXPECT_EQ(result_2.value(), 2); } -TEST(JSONBinPack_Encoder, cache_record_string_too_short) { +TEST(cache_record_string_too_short) { sourcemeta::jsonbinpack::Cache cache; using CacheType = sourcemeta::jsonbinpack::Cache::Type; const auto result_1{cache.find("fo", CacheType::Standalone)}; @@ -27,7 +26,7 @@ TEST(JSONBinPack_Encoder, cache_record_string_too_short) { EXPECT_FALSE(result_2.has_value()); } -TEST(JSONBinPack_Encoder, cache_record_string_empty) { +TEST(cache_record_string_empty) { sourcemeta::jsonbinpack::Cache cache; using CacheType = sourcemeta::jsonbinpack::Cache::Type; const auto result_1{cache.find("fo", CacheType::Standalone)}; @@ -37,14 +36,14 @@ TEST(JSONBinPack_Encoder, cache_record_string_empty) { EXPECT_FALSE(result_2.has_value()); } -TEST(JSONBinPack_Encoder, cache_has_on_unknown_string) { +TEST(cache_has_on_unknown_string) { sourcemeta::jsonbinpack::Cache cache; using CacheType = sourcemeta::jsonbinpack::Cache::Type; const auto result{cache.find("foobarbaz", CacheType::Standalone)}; EXPECT_FALSE(result.has_value()); } -TEST(JSONBinPack_Encoder, cache_increase_offset) { +TEST(cache_increase_offset) { sourcemeta::jsonbinpack::Cache cache; using CacheType = sourcemeta::jsonbinpack::Cache::Type; cache.record("foo", 2, CacheType::Standalone); @@ -54,7 +53,7 @@ TEST(JSONBinPack_Encoder, cache_increase_offset) { EXPECT_EQ(result.value(), 4); } -TEST(JSONBinPack_Encoder, cache_do_not_decrease_offset) { +TEST(cache_do_not_decrease_offset) { sourcemeta::jsonbinpack::Cache cache; using CacheType = sourcemeta::jsonbinpack::Cache::Type; cache.record("foo", 4, CacheType::Standalone); @@ -64,7 +63,7 @@ TEST(JSONBinPack_Encoder, cache_do_not_decrease_offset) { EXPECT_EQ(result.value(), 4); } -TEST(JSONBinPack_Encoder, cache_not_record_too_big) { +TEST(cache_not_record_too_big) { const auto length{25000000}; const std::string too_big(length, 'x'); EXPECT_EQ(too_big.size(), length); @@ -75,7 +74,7 @@ TEST(JSONBinPack_Encoder, cache_not_record_too_big) { EXPECT_FALSE(result.has_value()); } -TEST(JSONBinPack_Encoder, cache_remove_oldest) { +TEST(cache_remove_oldest) { sourcemeta::jsonbinpack::Cache cache; using CacheType = sourcemeta::jsonbinpack::Cache::Type; cache.record("foo", 10, CacheType::Standalone); @@ -109,7 +108,7 @@ TEST(JSONBinPack_Encoder, cache_remove_oldest) { cache.find("baz", CacheType::PrefixLengthVarintPlusOne).has_value()); } -TEST(JSONBinPack_Encoder, cache_is_a_circular_buffer) { +TEST(cache_is_a_circular_buffer) { const auto length{5000000}; const std::string string_1(length, 'u'); const std::string string_2(length, 'v'); @@ -156,7 +155,7 @@ TEST(JSONBinPack_Encoder, cache_is_a_circular_buffer) { EXPECT_TRUE(cache.find(string_6, CacheType::Standalone).has_value()); } -TEST(JSONBinPack_Encoder, cache_same_string_different_type) { +TEST(cache_same_string_different_type) { sourcemeta::jsonbinpack::Cache cache; using CacheType = sourcemeta::jsonbinpack::Cache::Type; cache.record("foo", 10, CacheType::Standalone); @@ -172,7 +171,7 @@ TEST(JSONBinPack_Encoder, cache_same_string_different_type) { EXPECT_EQ(result_2.value(), 20); } -TEST(JSONBinPack_Encoder, cache_no_fallback_type) { +TEST(cache_no_fallback_type) { sourcemeta::jsonbinpack::Cache cache; using CacheType = sourcemeta::jsonbinpack::Cache::Type; cache.record("foo", 10, CacheType::Standalone); diff --git a/test/runtime/encode_integer_test.cc b/test/runtime/encode_integer_test.cc index abd801cfe..7c23835af 100644 --- a/test/runtime/encode_integer_test.cc +++ b/test/runtime/encode_integer_test.cc @@ -1,14 +1,12 @@ -#include - #include // std::byte #include // std::numeric_limits #include #include +#include #include #include // std::vector -TEST(JSONBinPack_Encoder, - BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__minus_5_minus_5_minus_1_1) { +TEST(BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__minus_5_minus_5_minus_1_1) { const sourcemeta::core::JSON document{-5}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -16,7 +14,7 @@ TEST(JSONBinPack_Encoder, EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x00}})); } -TEST(JSONBinPack_Encoder, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__2_minus_5_5_1) { +TEST(BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__2_minus_5_5_1) { const sourcemeta::core::JSON document{2}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -24,7 +22,7 @@ TEST(JSONBinPack_Encoder, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__2_minus_5_5_1) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x07}})); } -TEST(JSONBinPack_Encoder, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__5_2_8_1) { +TEST(BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__5_2_8_1) { const sourcemeta::core::JSON document{5}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -32,7 +30,7 @@ TEST(JSONBinPack_Encoder, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__5_2_8_1) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x03}})); } -TEST(JSONBinPack_Encoder, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__5_1_19_5) { +TEST(BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__5_1_19_5) { const sourcemeta::core::JSON document{5}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -40,7 +38,7 @@ TEST(JSONBinPack_Encoder, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__5_1_19_5) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x00}})); } -TEST(JSONBinPack_Encoder, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__15_1_19_5) { +TEST(BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__15_1_19_5) { const sourcemeta::core::JSON document{15}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -48,7 +46,7 @@ TEST(JSONBinPack_Encoder, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__15_1_19_5) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x02}})); } -TEST(JSONBinPack_Encoder, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__255_0_255_1) { +TEST(BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__255_0_255_1) { const sourcemeta::core::JSON document{255}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -56,7 +54,7 @@ TEST(JSONBinPack_Encoder, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED__255_0_255_1) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0xff}})); } -TEST(JSONBinPack_Encoder, FLOOR_MULTIPLE_ENUM_VARINT__minus_3_minus_10_1) { +TEST(FLOOR_MULTIPLE_ENUM_VARINT__minus_3_minus_10_1) { const sourcemeta::core::JSON document{-3}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -64,7 +62,7 @@ TEST(JSONBinPack_Encoder, FLOOR_MULTIPLE_ENUM_VARINT__minus_3_minus_10_1) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x07}})); } -TEST(JSONBinPack_Encoder, FLOOR_MULTIPLE_ENUM_VARINT__5_2_1) { +TEST(FLOOR_MULTIPLE_ENUM_VARINT__5_2_1) { const sourcemeta::core::JSON document{5}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -72,7 +70,7 @@ TEST(JSONBinPack_Encoder, FLOOR_MULTIPLE_ENUM_VARINT__5_2_1) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x03}})); } -TEST(JSONBinPack_Encoder, FLOOR_MULTIPLE_ENUM_VARINT__10_5_5) { +TEST(FLOOR_MULTIPLE_ENUM_VARINT__10_5_5) { const sourcemeta::core::JSON document{10}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -80,7 +78,7 @@ TEST(JSONBinPack_Encoder, FLOOR_MULTIPLE_ENUM_VARINT__10_5_5) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, FLOOR_MULTIPLE_ENUM_VARINT__10_2_5) { +TEST(FLOOR_MULTIPLE_ENUM_VARINT__10_2_5) { const sourcemeta::core::JSON document{10}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -88,7 +86,7 @@ TEST(JSONBinPack_Encoder, FLOOR_MULTIPLE_ENUM_VARINT__10_2_5) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, FLOOR_MULTIPLE_ENUM_VARINT__1000_minus_2_4) { +TEST(FLOOR_MULTIPLE_ENUM_VARINT__1000_minus_2_4) { const sourcemeta::core::JSON document{1000}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -97,7 +95,7 @@ TEST(JSONBinPack_Encoder, FLOOR_MULTIPLE_ENUM_VARINT__1000_minus_2_4) { (std::vector{std::byte{0xfa}, std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, ROOF_MULTIPLE_MIRROR_ENUM_VARINT__minus_3_minus_2_1) { +TEST(ROOF_MULTIPLE_MIRROR_ENUM_VARINT__minus_3_minus_2_1) { const sourcemeta::core::JSON document{-3}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -105,7 +103,7 @@ TEST(JSONBinPack_Encoder, ROOF_MULTIPLE_MIRROR_ENUM_VARINT__minus_3_minus_2_1) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, ROOF_MULTIPLE_MIRROR_ENUM_VARINT__8_10_1) { +TEST(ROOF_MULTIPLE_MIRROR_ENUM_VARINT__8_10_1) { const sourcemeta::core::JSON document{8}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -113,7 +111,7 @@ TEST(JSONBinPack_Encoder, ROOF_MULTIPLE_MIRROR_ENUM_VARINT__8_10_1) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x02}})); } -TEST(JSONBinPack_Encoder, ROOF_MULTIPLE_MIRROR_ENUM_VARINT__5_16_5) { +TEST(ROOF_MULTIPLE_MIRROR_ENUM_VARINT__5_16_5) { const sourcemeta::core::JSON document{5}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -121,7 +119,7 @@ TEST(JSONBinPack_Encoder, ROOF_MULTIPLE_MIRROR_ENUM_VARINT__5_16_5) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x02}})); } -TEST(JSONBinPack_Encoder, ROOF_MULTIPLE_MIRROR_ENUM_VARINT__10_15_5) { +TEST(ROOF_MULTIPLE_MIRROR_ENUM_VARINT__10_15_5) { const sourcemeta::core::JSON document{10}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -129,7 +127,7 @@ TEST(JSONBinPack_Encoder, ROOF_MULTIPLE_MIRROR_ENUM_VARINT__10_15_5) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, ARBITRARY_MULTIPLE_ZIGZAG_VARINT__minus_25200_1) { +TEST(ARBITRARY_MULTIPLE_ZIGZAG_VARINT__minus_25200_1) { const sourcemeta::core::JSON document{-25200}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -139,7 +137,7 @@ TEST(JSONBinPack_Encoder, ARBITRARY_MULTIPLE_ZIGZAG_VARINT__minus_25200_1) { std::byte{0x03}})); } -TEST(JSONBinPack_Encoder, ARBITRARY_MULTIPLE_ZIGZAG_VARINT__10_5) { +TEST(ARBITRARY_MULTIPLE_ZIGZAG_VARINT__10_5) { const sourcemeta::core::JSON document{10}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -147,7 +145,7 @@ TEST(JSONBinPack_Encoder, ARBITRARY_MULTIPLE_ZIGZAG_VARINT__10_5) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x04}})); } -TEST(JSONBinPack_Encoder, ARBITRARY_MULTIPLE_ZIGZAG_VARINT__int64_max_1) { +TEST(ARBITRARY_MULTIPLE_ZIGZAG_VARINT__int64_max_1) { const std::int64_t value = std::numeric_limits::max(); const sourcemeta::core::JSON document{value}; sourcemeta::core::OutputByteStream stream{}; @@ -161,7 +159,7 @@ TEST(JSONBinPack_Encoder, ARBITRARY_MULTIPLE_ZIGZAG_VARINT__int64_max_1) { std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, ARBITRARY_MULTIPLE_ZIGZAG_VARINT__int64_min_1) { +TEST(ARBITRARY_MULTIPLE_ZIGZAG_VARINT__int64_min_1) { const std::int64_t value = std::numeric_limits::min() + 1; const sourcemeta::core::JSON document{value}; sourcemeta::core::OutputByteStream stream{}; diff --git a/test/runtime/encode_number_test.cc b/test/runtime/encode_number_test.cc index 90b57702f..0ad4543ad 100644 --- a/test/runtime/encode_number_test.cc +++ b/test/runtime/encode_number_test.cc @@ -1,11 +1,11 @@ #include // std::byte -#include #include #include +#include #include #include // std::vector -TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_5) { +TEST(DOUBLE_VARINT_TUPLE_5) { const sourcemeta::core::JSON document{5.0}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -14,7 +14,7 @@ TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_5) { (std::vector{std::byte{0x0a}, std::byte{0x00}})); } -TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_minus_3_point_14) { +TEST(DOUBLE_VARINT_TUPLE_minus_3_point_14) { const sourcemeta::core::JSON document{-3.14}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -24,7 +24,7 @@ TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_minus_3_point_14) { std::byte{0x02}})); } -TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_minus_5) { +TEST(DOUBLE_VARINT_TUPLE_minus_5) { const sourcemeta::core::JSON document{-5.0}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -33,7 +33,7 @@ TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_minus_5) { (std::vector{std::byte{0x09}, std::byte{0x00}})); } -TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_zero) { +TEST(DOUBLE_VARINT_TUPLE_zero) { const sourcemeta::core::JSON document{0.0}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -42,7 +42,7 @@ TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_zero) { (std::vector{std::byte{0x00}, std::byte{0x00}})); } -TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_1235) { +TEST(DOUBLE_VARINT_TUPLE_1235) { const sourcemeta::core::JSON document{1235.0}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -52,7 +52,7 @@ TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_1235) { std::byte{0x00}})); } -TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_0_point_1235) { +TEST(DOUBLE_VARINT_TUPLE_0_point_1235) { const sourcemeta::core::JSON document{0.1235}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -62,7 +62,7 @@ TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_0_point_1235) { std::byte{0x04}})); } -TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_1_point_235) { +TEST(DOUBLE_VARINT_TUPLE_1_point_235) { const sourcemeta::core::JSON document{1.235}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -72,7 +72,7 @@ TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_1_point_235) { std::byte{0x03}})); } -TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_0_point_01235) { +TEST(DOUBLE_VARINT_TUPLE_0_point_01235) { const sourcemeta::core::JSON document{0.01235}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -82,7 +82,7 @@ TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_0_point_01235) { std::byte{0x05}})); } -TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_12_35) { +TEST(DOUBLE_VARINT_TUPLE_12_35) { const sourcemeta::core::JSON document{12.35}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -92,7 +92,7 @@ TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_12_35) { std::byte{0x02}})); } -TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_0_point_001235) { +TEST(DOUBLE_VARINT_TUPLE_0_point_001235) { const sourcemeta::core::JSON document{0.001235}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -102,7 +102,7 @@ TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_0_point_001235) { std::byte{0x06}})); } -TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_123_point_5) { +TEST(DOUBLE_VARINT_TUPLE_123_point_5) { const sourcemeta::core::JSON document{123.5}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -112,7 +112,7 @@ TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_123_point_5) { std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_314) { +TEST(DOUBLE_VARINT_TUPLE_314) { const sourcemeta::core::JSON document{314.0}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -122,7 +122,7 @@ TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_314) { std::byte{0x00}})); } -TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_0_point_314) { +TEST(DOUBLE_VARINT_TUPLE_0_point_314) { const sourcemeta::core::JSON document{0.314}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -132,7 +132,7 @@ TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_0_point_314) { std::byte{0x03}})); } -TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_3_point_14) { +TEST(DOUBLE_VARINT_TUPLE_3_point_14) { const sourcemeta::core::JSON document{3.14}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -142,7 +142,7 @@ TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_3_point_14) { std::byte{0x02}})); } -TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_0_point_0314) { +TEST(DOUBLE_VARINT_TUPLE_0_point_0314) { const sourcemeta::core::JSON document{0.0314}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -152,7 +152,7 @@ TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_0_point_0314) { std::byte{0x04}})); } -TEST(JSONBinPack_Encoder, DOUBLE_VARINT_TUPLE_31_point_4) { +TEST(DOUBLE_VARINT_TUPLE_31_point_4) { const sourcemeta::core::JSON document{31.4}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; diff --git a/test/runtime/encode_object_test.cc b/test/runtime/encode_object_test.cc index 89b537d3a..9d9a56cf4 100644 --- a/test/runtime/encode_object_test.cc +++ b/test/runtime/encode_object_test.cc @@ -1,13 +1,12 @@ #include // std::byte -#include -#include // std::vector +#include // std::vector #include #include #include -TEST(JSONBinPack_Encoder, - FIXED_TYPED_ARBITRARY_OBJECT__no_length_string__integer) { +#include +TEST(FIXED_TYPED_ARBITRARY_OBJECT__no_length_string__integer) { using namespace sourcemeta::jsonbinpack; const sourcemeta::core::JSON document = sourcemeta::core::parse_json("{\"foo\":1,\"bar\":2}"); @@ -35,8 +34,7 @@ TEST(JSONBinPack_Encoder, } } -TEST(JSONBinPack_Encoder, - VARINT_TYPED_ARBITRARY_OBJECT__no_length_string__integer) { +TEST(VARINT_TYPED_ARBITRARY_OBJECT__no_length_string__integer) { using namespace sourcemeta::jsonbinpack; const sourcemeta::core::JSON document = sourcemeta::core::parse_json("{\"foo\":1,\"bar\":2}"); diff --git a/test/runtime/encode_real_test.cc b/test/runtime/encode_real_test.cc index 0f7d0b243..1bc7f7efe 100644 --- a/test/runtime/encode_real_test.cc +++ b/test/runtime/encode_real_test.cc @@ -1,8 +1,7 @@ -#include - #include +#include -TEST(JSONBinPack_Encoder, real_digits_1) { +TEST(real_digits_1) { const double input{3.14}; std::uint64_t point_position; const std::int64_t result{ @@ -11,7 +10,7 @@ TEST(JSONBinPack_Encoder, real_digits_1) { EXPECT_EQ(point_position, 2); } -TEST(JSONBinPack_Encoder, real_digits_2) { +TEST(real_digits_2) { const double input{123.456}; std::uint64_t point_position; const std::int64_t result{ @@ -20,7 +19,7 @@ TEST(JSONBinPack_Encoder, real_digits_2) { EXPECT_EQ(point_position, 3); } -TEST(JSONBinPack_Encoder, real_digits_3) { +TEST(real_digits_3) { const double input{-3.14}; std::uint64_t point_position; const std::int64_t result{ @@ -29,7 +28,7 @@ TEST(JSONBinPack_Encoder, real_digits_3) { EXPECT_EQ(point_position, 2); } -TEST(JSONBinPack_Encoder, real_digits_4) { +TEST(real_digits_4) { const double input{0}; std::uint64_t point_position; const std::int64_t result{ @@ -38,7 +37,7 @@ TEST(JSONBinPack_Encoder, real_digits_4) { EXPECT_EQ(point_position, 0); } -TEST(JSONBinPack_Encoder, real_digits_5) { +TEST(real_digits_5) { const double input{-0}; std::uint64_t point_position; const std::int64_t result{ @@ -47,7 +46,7 @@ TEST(JSONBinPack_Encoder, real_digits_5) { EXPECT_EQ(point_position, 0); } -TEST(JSONBinPack_Encoder, real_digits_6) { +TEST(real_digits_6) { const double input{1}; std::uint64_t point_position; const std::int64_t result{ @@ -56,7 +55,7 @@ TEST(JSONBinPack_Encoder, real_digits_6) { EXPECT_EQ(point_position, 0); } -TEST(JSONBinPack_Encoder, real_digits_7) { +TEST(real_digits_7) { const double input{-1}; std::uint64_t point_position; const std::int64_t result{ @@ -65,7 +64,7 @@ TEST(JSONBinPack_Encoder, real_digits_7) { EXPECT_EQ(point_position, 0); } -TEST(JSONBinPack_Encoder, real_digits_8) { +TEST(real_digits_8) { const double input{0.0001}; std::uint64_t point_position; const std::int64_t result{ @@ -74,7 +73,7 @@ TEST(JSONBinPack_Encoder, real_digits_8) { EXPECT_EQ(point_position, 4); } -TEST(JSONBinPack_Encoder, real_digits_9) { +TEST(real_digits_9) { const double input{0.000123}; std::uint64_t point_position; const std::int64_t result{ @@ -83,7 +82,7 @@ TEST(JSONBinPack_Encoder, real_digits_9) { EXPECT_EQ(point_position, 6); } -TEST(JSONBinPack_Encoder, real_digits_10) { +TEST(real_digits_10) { const double input{-0.000123}; std::uint64_t point_position; const std::int64_t result{ @@ -92,7 +91,7 @@ TEST(JSONBinPack_Encoder, real_digits_10) { EXPECT_EQ(point_position, 6); } -TEST(JSONBinPack_Encoder, integer_5) { +TEST(integer_5) { const double input{5}; std::uint64_t point_position; const std::int64_t result{ diff --git a/test/runtime/encode_string_test.cc b/test/runtime/encode_string_test.cc index 42d810a6b..1b65776d5 100644 --- a/test/runtime/encode_string_test.cc +++ b/test/runtime/encode_string_test.cc @@ -1,11 +1,11 @@ #include // std::byte -#include #include #include +#include #include #include // std::vector -TEST(JSONBinPack_Encoder, UTF8_STRING_NO_LENGTH_foo_bar) { +TEST(UTF8_STRING_NO_LENGTH_foo_bar) { const sourcemeta::core::JSON document{"foo bar"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -17,7 +17,7 @@ TEST(JSONBinPack_Encoder, UTF8_STRING_NO_LENGTH_foo_bar) { std::byte{0x72}})); } -TEST(JSONBinPack_Encoder, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_foo_3) { +TEST(FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_foo_3) { const sourcemeta::core::JSON document{"foo"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -27,7 +27,7 @@ TEST(JSONBinPack_Encoder, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_foo_3) { std::byte{0x6f}, std::byte{0x6f}})); } -TEST(JSONBinPack_Encoder, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_foo_0_foo_3) { +TEST(FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_foo_0_foo_3) { const sourcemeta::core::JSON document{"foo"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -40,7 +40,7 @@ TEST(JSONBinPack_Encoder, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_foo_0_foo_3) { std::byte{0x05}})); } -TEST(JSONBinPack_Encoder, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_unicode_1) { +TEST(FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_unicode_1) { const sourcemeta::core::JSON document{"foø"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -51,7 +51,7 @@ TEST(JSONBinPack_Encoder, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_unicode_1) { std::byte{0xc3}, std::byte{0xb8}})); } -TEST(JSONBinPack_Encoder, ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_foo_4) { +TEST(ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_foo_4) { const sourcemeta::core::JSON document{"foo"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -61,7 +61,7 @@ TEST(JSONBinPack_Encoder, ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_foo_4) { std::byte{0x6f}, std::byte{0x6f}})); } -TEST(JSONBinPack_Encoder, ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_foo_3_foo_5) { +TEST(ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_foo_3_foo_5) { const sourcemeta::core::JSON document{"foo"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -74,7 +74,7 @@ TEST(JSONBinPack_Encoder, ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_foo_3_foo_5) { std::byte{0x05}})); } -TEST(JSONBinPack_Encoder, ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_unicode_4) { +TEST(ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_unicode_4) { const sourcemeta::core::JSON document{"foø"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -85,7 +85,7 @@ TEST(JSONBinPack_Encoder, ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_unicode_4) { std::byte{0xc3}, std::byte{0xb8}})); } -TEST(JSONBinPack_Encoder, BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_foo_3_5) { +TEST(BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_foo_3_5) { const sourcemeta::core::JSON document{"foo"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -95,7 +95,7 @@ TEST(JSONBinPack_Encoder, BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_foo_3_5) { std::byte{0x6f}, std::byte{0x6f}})); } -TEST(JSONBinPack_Encoder, BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_foo_3_3) { +TEST(BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_foo_3_3) { const sourcemeta::core::JSON document{"foo"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -105,8 +105,7 @@ TEST(JSONBinPack_Encoder, BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_foo_3_3) { std::byte{0x6f}, std::byte{0x6f}})); } -TEST(JSONBinPack_Encoder, - BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_foo_0_6_foo_3_100) { +TEST(BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_foo_0_6_foo_3_100) { const sourcemeta::core::JSON document{"foo"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -119,7 +118,7 @@ TEST(JSONBinPack_Encoder, std::byte{0x05}})); } -TEST(JSONBinPack_Encoder, BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_unicode_0_6) { +TEST(BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_unicode_0_6) { const sourcemeta::core::JSON document{"foø"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -130,7 +129,7 @@ TEST(JSONBinPack_Encoder, BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_unicode_0_6) { std::byte{0xc3}, std::byte{0xb8}})); } -TEST(JSONBinPack_Encoder, RFC3339_DATE_INTEGER_TRIPLET_2014_10_01) { +TEST(RFC3339_DATE_INTEGER_TRIPLET_2014_10_01) { const sourcemeta::core::JSON document{"2014-10-01"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -140,7 +139,7 @@ TEST(JSONBinPack_Encoder, RFC3339_DATE_INTEGER_TRIPLET_2014_10_01) { std::byte{0x0a}, std::byte{0x01}})); } -TEST(JSONBinPack_Encoder, PREFIX_VARINT_LENGTH_STRING_SHARED_foo) { +TEST(PREFIX_VARINT_LENGTH_STRING_SHARED_foo) { const sourcemeta::core::JSON document{"foo"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -150,7 +149,7 @@ TEST(JSONBinPack_Encoder, PREFIX_VARINT_LENGTH_STRING_SHARED_foo) { std::byte{0x6f}, std::byte{0x6f}})); } -TEST(JSONBinPack_Encoder, PREFIX_VARINT_LENGTH_STRING_SHARED_foo_foo_foo_foo) { +TEST(PREFIX_VARINT_LENGTH_STRING_SHARED_foo_foo_foo_foo) { const sourcemeta::core::JSON document{"foo"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -167,8 +166,7 @@ TEST(JSONBinPack_Encoder, PREFIX_VARINT_LENGTH_STRING_SHARED_foo_foo_foo_foo) { std::byte{0x03}})); } -TEST(JSONBinPack_Encoder, - PREFIX_VARINT_LENGTH_STRING_SHARED_non_key_foo_key_foo) { +TEST(PREFIX_VARINT_LENGTH_STRING_SHARED_non_key_foo_key_foo) { const sourcemeta::core::JSON document{"foo"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -182,8 +180,7 @@ TEST(JSONBinPack_Encoder, std::byte{0x6f}, std::byte{0x6f}})); } -TEST(JSONBinPack_Encoder, - PREFIX_VARINT_LENGTH_STRING_SHARED_key_foo_non_key_foo) { +TEST(PREFIX_VARINT_LENGTH_STRING_SHARED_key_foo_non_key_foo) { const sourcemeta::core::JSON document{"foo"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; @@ -197,7 +194,7 @@ TEST(JSONBinPack_Encoder, std::byte{0x05}})); } -TEST(JSONBinPack_Encoder, PREFIX_VARINT_LENGTH_STRING_SHARED_unicode) { +TEST(PREFIX_VARINT_LENGTH_STRING_SHARED_unicode) { const sourcemeta::core::JSON document{"foø"}; sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::Encoder encoder{stream}; diff --git a/test/runtime/encode_test.cc b/test/runtime/encode_test.cc index 5728108a6..bcf71b6d6 100644 --- a/test/runtime/encode_test.cc +++ b/test/runtime/encode_test.cc @@ -1,11 +1,11 @@ #include // std::byte -#include #include #include +#include #include #include // std::vector -TEST(JSONBinPack_Encoder, generic_encode_BOUNDED_MULTIPLE_8BITS_ENUM_FIXED) { +TEST(generic_encode_BOUNDED_MULTIPLE_8BITS_ENUM_FIXED) { using namespace sourcemeta::jsonbinpack; const sourcemeta::core::JSON document{-5}; sourcemeta::core::OutputByteStream stream{}; @@ -15,7 +15,7 @@ TEST(JSONBinPack_Encoder, generic_encode_BOUNDED_MULTIPLE_8BITS_ENUM_FIXED) { EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x00}})); } -TEST(JSONBinPack_Encoder, ANY_PACKED_TYPE_TAG_BYTE_PREFIX_many) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX_many) { using namespace sourcemeta::jsonbinpack; sourcemeta::core::OutputByteStream stream{}; Encoder encoder{stream}; diff --git a/test/runtime/encode_traits_test.cc b/test/runtime/encode_traits_test.cc index e398f3a71..7aa099b6b 100644 --- a/test/runtime/encode_traits_test.cc +++ b/test/runtime/encode_traits_test.cc @@ -1,40 +1,39 @@ -#include - #include +#include #include -TEST(JSONBinPack_Encoder, not_copy_constructible) { +TEST(not_copy_constructible) { const bool result{ std::is_copy_constructible_v}; EXPECT_FALSE(result); } -TEST(JSONBinPack_Encoder, not_trivially_copy_constructible) { +TEST(not_trivially_copy_constructible) { const bool result{ std::is_trivially_copy_constructible_v}; EXPECT_FALSE(result); } -TEST(JSONBinPack_Encoder, not_nothrow_copy_constructible) { +TEST(not_nothrow_copy_constructible) { const bool result{ std::is_nothrow_copy_constructible_v}; EXPECT_FALSE(result); } -TEST(JSONBinPack_Encoder, not_copy_assignable) { +TEST(not_copy_assignable) { const bool result{ std::is_copy_assignable_v}; EXPECT_FALSE(result); } -TEST(JSONBinPack_Encoder, not_trivially_copy_assignable) { +TEST(not_trivially_copy_assignable) { const bool result{ std::is_trivially_copy_assignable_v}; EXPECT_FALSE(result); } -TEST(JSONBinPack_Encoder, not_nothrow_copy_assignable) { +TEST(not_nothrow_copy_assignable) { const bool result{ std::is_nothrow_copy_assignable_v}; EXPECT_FALSE(result); diff --git a/test/runtime/encoding_traits_test.cc b/test/runtime/encoding_traits_test.cc index 7c27f4ae6..f6c34bd71 100644 --- a/test/runtime/encoding_traits_test.cc +++ b/test/runtime/encoding_traits_test.cc @@ -1,20 +1,20 @@ #include +#include #include -#include #include -TEST(JSONBinPack_Encoding, encoding_movable) { +TEST(encoding_movable) { using namespace sourcemeta::jsonbinpack; EXPECT_TRUE(std::is_move_constructible_v); } -TEST(JSONBinPack_Encoding, encoding_nothrow_movable) { +TEST(encoding_nothrow_movable) { using namespace sourcemeta::jsonbinpack; EXPECT_TRUE(std::is_nothrow_move_constructible_v); } -TEST(JSONBinPack_Encoding, encoding_copyable) { +TEST(encoding_copyable) { using namespace sourcemeta::jsonbinpack; EXPECT_TRUE(std::is_copy_constructible_v); } diff --git a/test/runtime/input_stream_varint_test.cc b/test/runtime/input_stream_varint_test.cc index b64878f1d..615f87ead 100644 --- a/test/runtime/input_stream_varint_test.cc +++ b/test/runtime/input_stream_varint_test.cc @@ -1,34 +1,33 @@ -#include - #include // std::numeric_limits #include +#include #include -TEST(JSONBinPack_InputStream, varint_0x01) { +TEST(varint_0x01) { sourcemeta::core::InputByteStream stream{0x01}; sourcemeta::jsonbinpack::InputStream decoder{stream}; EXPECT_EQ(decoder.get_varint(), 1); } -TEST(JSONBinPack_InputStream, varint_0x17) { +TEST(varint_0x17) { sourcemeta::core::InputByteStream stream{0x17}; sourcemeta::jsonbinpack::InputStream decoder{stream}; EXPECT_EQ(decoder.get_varint(), 23); } -TEST(JSONBinPack_InputStream, varint_0xac_0x02) { +TEST(varint_0xac_0x02) { sourcemeta::core::InputByteStream stream{{0xac, 0x02}}; sourcemeta::jsonbinpack::InputStream decoder{stream}; EXPECT_EQ(decoder.get_varint(), 300); } -TEST(JSONBinPack_InputStream, varint_0xdf_0x89_0x03) { +TEST(varint_0xdf_0x89_0x03) { sourcemeta::core::InputByteStream stream{{0xdf, 0x89, 0x03}}; sourcemeta::jsonbinpack::InputStream decoder{stream}; EXPECT_EQ(decoder.get_varint(), 50399); } -TEST(JSONBinPack_InputStream, varint_0xfe_0xff_0xff_0xff_0x0f) { +TEST(varint_0xfe_0xff_0xff_0xff_0x0f) { sourcemeta::core::InputByteStream stream{{0xfe, 0xff, 0xff, 0xff, 0x0f}}; sourcemeta::jsonbinpack::InputStream decoder{stream}; const std::uint64_t result{decoder.get_varint()}; @@ -36,7 +35,7 @@ TEST(JSONBinPack_InputStream, varint_0xfe_0xff_0xff_0xff_0x0f) { EXPECT_EQ(result, expected); } -TEST(JSONBinPack_InputStream, varint_uint64_max) { +TEST(varint_uint64_max) { // In Base-128: (1)1111111 (1)1111111 (1)1111111 (1)1111111 // (1)1111111 (1)1111111 (1)1111111 (1)1111111 (1)1111111 (0)0000001 sourcemeta::core::InputByteStream stream{ diff --git a/test/runtime/output_stream_varint_test.cc b/test/runtime/output_stream_varint_test.cc index d4d8052a9..59a2dd66c 100644 --- a/test/runtime/output_stream_varint_test.cc +++ b/test/runtime/output_stream_varint_test.cc @@ -1,26 +1,25 @@ -#include - #include // std::byte #include // std::numeric_limits #include +#include #include #include // std::vector -TEST(JSONBinPack_OutputStream, varint_1) { +TEST(varint_1) { sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::OutputStream encoder{stream}; encoder.put_varint(1); EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x01}})); } -TEST(JSONBinPack_OutputStream, varint_23) { +TEST(varint_23) { sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::OutputStream encoder{stream}; encoder.put_varint(23); EXPECT_EQ(stream.bytes(), (std::vector{std::byte{0x17}})); } -TEST(JSONBinPack_OutputStream, varint_300) { +TEST(varint_300) { sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::OutputStream encoder{stream}; encoder.put_varint(300); @@ -28,7 +27,7 @@ TEST(JSONBinPack_OutputStream, varint_300) { (std::vector{std::byte{0xac}, std::byte{0x02}})); } -TEST(JSONBinPack_OutputStream, varint_50399) { +TEST(varint_50399) { sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::OutputStream encoder{stream}; encoder.put_varint(50399); @@ -37,7 +36,7 @@ TEST(JSONBinPack_OutputStream, varint_50399) { std::byte{0x03}})); } -TEST(JSONBinPack_OutputStream, varint_4294967294) { +TEST(varint_4294967294) { sourcemeta::core::OutputByteStream stream{}; sourcemeta::jsonbinpack::OutputStream encoder{stream}; encoder.put_varint(4294967294); @@ -47,7 +46,7 @@ TEST(JSONBinPack_OutputStream, varint_4294967294) { std::byte{0xff}, std::byte{0x0f}})); } -TEST(JSONBinPack_OutputStream, varint_uint64_max) { +TEST(varint_uint64_max) { sourcemeta::core::OutputByteStream stream{}; const std::uint64_t value = std::numeric_limits::max(); sourcemeta::jsonbinpack::OutputStream encoder{stream}; diff --git a/test/runtime/v1_any_loader_test.cc b/test/runtime/v1_any_loader_test.cc index 6aa13e282..2756b4e77 100644 --- a/test/runtime/v1_any_loader_test.cc +++ b/test/runtime/v1_any_loader_test.cc @@ -1,11 +1,10 @@ -#include - #include +#include #include #include -TEST(JSONBinPack_Loader_v1, BYTE_CHOICE_INDEX_scalars) { +TEST(BYTE_CHOICE_INDEX_scalars) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "BYTE_CHOICE_INDEX", @@ -26,7 +25,7 @@ TEST(JSONBinPack_Loader_v1, BYTE_CHOICE_INDEX_scalars) { sourcemeta::core::JSON{3}); } -TEST(JSONBinPack_Loader_v1, LARGE_CHOICE_INDEX_scalars) { +TEST(LARGE_CHOICE_INDEX_scalars) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "LARGE_CHOICE_INDEX", @@ -47,7 +46,7 @@ TEST(JSONBinPack_Loader_v1, LARGE_CHOICE_INDEX_scalars) { sourcemeta::core::JSON{3}); } -TEST(JSONBinPack_Loader_v1, TOP_LEVEL_BYTE_CHOICE_INDEX_scalars) { +TEST(TOP_LEVEL_BYTE_CHOICE_INDEX_scalars) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "TOP_LEVEL_BYTE_CHOICE_INDEX", @@ -68,7 +67,7 @@ TEST(JSONBinPack_Loader_v1, TOP_LEVEL_BYTE_CHOICE_INDEX_scalars) { sourcemeta::core::JSON{3}); } -TEST(JSONBinPack_Loader_v1, CONST_NONE_scalar) { +TEST(CONST_NONE_scalar) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "CONST_NONE", @@ -83,7 +82,7 @@ TEST(JSONBinPack_Loader_v1, CONST_NONE_scalar) { EXPECT_EQ(std::get(result).value, sourcemeta::core::JSON{1}); } -TEST(JSONBinPack_Loader_v1, ANY_PACKED_TYPE_TAG_BYTE_PREFIX) { +TEST(ANY_PACKED_TYPE_TAG_BYTE_PREFIX) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "ANY_PACKED_TYPE_TAG_BYTE_PREFIX", diff --git a/test/runtime/v1_array_loader_test.cc b/test/runtime/v1_array_loader_test.cc index 9d08bd9ef..cda35b7a2 100644 --- a/test/runtime/v1_array_loader_test.cc +++ b/test/runtime/v1_array_loader_test.cc @@ -1,11 +1,10 @@ -#include - #include +#include #include #include -TEST(JSONBinPack_Loader_v1, FIXED_TYPED_ARRAY_enum_integer_number) { +TEST(FIXED_TYPED_ARRAY_enum_integer_number) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "FIXED_TYPED_ARRAY", @@ -63,7 +62,7 @@ TEST(JSONBinPack_Loader_v1, FIXED_TYPED_ARRAY_enum_integer_number) { 1); } -TEST(JSONBinPack_Loader_v1, BOUNDED_8BITS_TYPED_ARRAY_enum_integer_number) { +TEST(BOUNDED_8BITS_TYPED_ARRAY_enum_integer_number) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "BOUNDED_8BITS_TYPED_ARRAY", @@ -128,7 +127,7 @@ TEST(JSONBinPack_Loader_v1, BOUNDED_8BITS_TYPED_ARRAY_enum_integer_number) { 1); } -TEST(JSONBinPack_Loader_v1, FLOOR_TYPED_ARRAY_enum_integer_number) { +TEST(FLOOR_TYPED_ARRAY_enum_integer_number) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "FLOOR_TYPED_ARRAY", @@ -186,7 +185,7 @@ TEST(JSONBinPack_Loader_v1, FLOOR_TYPED_ARRAY_enum_integer_number) { 1); } -TEST(JSONBinPack_Loader_v1, ROOF_TYPED_ARRAY_enum_integer_number) { +TEST(ROOF_TYPED_ARRAY_enum_integer_number) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "ROOF_TYPED_ARRAY", diff --git a/test/runtime/v1_integer_loader_test.cc b/test/runtime/v1_integer_loader_test.cc index 3c8143d90..c90730607 100644 --- a/test/runtime/v1_integer_loader_test.cc +++ b/test/runtime/v1_integer_loader_test.cc @@ -1,11 +1,10 @@ -#include - #include +#include #include #include -TEST(JSONBinPack_Loader_v1, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED_positive) { +TEST(BOUNDED_MULTIPLE_8BITS_ENUM_FIXED_positive) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "BOUNDED_MULTIPLE_8BITS_ENUM_FIXED", @@ -25,7 +24,7 @@ TEST(JSONBinPack_Loader_v1, BOUNDED_MULTIPLE_8BITS_ENUM_FIXED_positive) { EXPECT_EQ(std::get(result).multiplier, 2); } -TEST(JSONBinPack_Loader_v1, FLOOR_MULTIPLE_ENUM_VARINT_positive) { +TEST(FLOOR_MULTIPLE_ENUM_VARINT_positive) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "FLOOR_MULTIPLE_ENUM_VARINT", @@ -42,7 +41,7 @@ TEST(JSONBinPack_Loader_v1, FLOOR_MULTIPLE_ENUM_VARINT_positive) { EXPECT_EQ(std::get(result).multiplier, 2); } -TEST(JSONBinPack_Loader_v1, ROOF_MULTIPLE_MIRROR_ENUM_VARINT_positive) { +TEST(ROOF_MULTIPLE_MIRROR_ENUM_VARINT_positive) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "ROOF_MULTIPLE_MIRROR_ENUM_VARINT", @@ -59,7 +58,7 @@ TEST(JSONBinPack_Loader_v1, ROOF_MULTIPLE_MIRROR_ENUM_VARINT_positive) { EXPECT_EQ(std::get(result).multiplier, 2); } -TEST(JSONBinPack_Loader_v1, ARBITRARY_MULTIPLE_ZIGZAG_VARINT_unit_multiplier) { +TEST(ARBITRARY_MULTIPLE_ZIGZAG_VARINT_unit_multiplier) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "ARBITRARY_MULTIPLE_ZIGZAG_VARINT", diff --git a/test/runtime/v1_loader_test.cc b/test/runtime/v1_loader_test.cc index 51b4e78e9..73f36c955 100644 --- a/test/runtime/v1_loader_test.cc +++ b/test/runtime/v1_loader_test.cc @@ -1,15 +1,18 @@ -#include - #include +#include #include -TEST(JSONBinPack_Loader_v1, invalid_encoding_name) { +TEST(invalid_encoding_name) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "FOO_BAR", "binpackOptions": {} })JSON"); - EXPECT_THROW(sourcemeta::jsonbinpack::load(input), - sourcemeta::jsonbinpack::EncodingError); + try { + sourcemeta::jsonbinpack::load(input); + FAIL(); + } catch (const sourcemeta::jsonbinpack::EncodingError &error) { + EXPECT_STREQ(error.what(), "Unrecognized encoding: FOO_BAR"); + } } diff --git a/test/runtime/v1_number_loader_test.cc b/test/runtime/v1_number_loader_test.cc index ef34cc107..773956059 100644 --- a/test/runtime/v1_number_loader_test.cc +++ b/test/runtime/v1_number_loader_test.cc @@ -1,11 +1,10 @@ -#include - #include +#include #include #include -TEST(JSONBinPack_Loader_v1, DOUBLE_VARINT_TUPLE) { +TEST(DOUBLE_VARINT_TUPLE) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "DOUBLE_VARINT_TUPLE", diff --git a/test/runtime/v1_string_loader_test.cc b/test/runtime/v1_string_loader_test.cc index 5c929f5eb..5b16a40e7 100644 --- a/test/runtime/v1_string_loader_test.cc +++ b/test/runtime/v1_string_loader_test.cc @@ -1,11 +1,10 @@ -#include - #include +#include #include #include -TEST(JSONBinPack_Loader_v1, UTF8_STRING_NO_LENGTH_3) { +TEST(UTF8_STRING_NO_LENGTH_3) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "UTF8_STRING_NO_LENGTH", @@ -20,7 +19,7 @@ TEST(JSONBinPack_Loader_v1, UTF8_STRING_NO_LENGTH_3) { EXPECT_EQ(std::get(result).size, 3); } -TEST(JSONBinPack_Loader_v1, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_3) { +TEST(FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_3) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED", @@ -37,7 +36,7 @@ TEST(JSONBinPack_Loader_v1, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED_3) { 3); } -TEST(JSONBinPack_Loader_v1, ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_3) { +TEST(ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_3) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "ROOF_VARINT_PREFIX_UTF8_STRING_SHARED", @@ -53,7 +52,7 @@ TEST(JSONBinPack_Loader_v1, ROOF_VARINT_PREFIX_UTF8_STRING_SHARED_3) { EXPECT_EQ(std::get(result).maximum, 3); } -TEST(JSONBinPack_Loader_v1, BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_open) { +TEST(BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_open) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED", @@ -73,7 +72,7 @@ TEST(JSONBinPack_Loader_v1, BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED_open) { 3); } -TEST(JSONBinPack_Loader_v1, RFC3339_DATE_INTEGER_TRIPLET) { +TEST(RFC3339_DATE_INTEGER_TRIPLET) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "RFC3339_DATE_INTEGER_TRIPLET", @@ -85,7 +84,7 @@ TEST(JSONBinPack_Loader_v1, RFC3339_DATE_INTEGER_TRIPLET) { EXPECT_TRUE(std::holds_alternative(result)); } -TEST(JSONBinPack_Loader_v1, PREFIX_VARINT_LENGTH_STRING_SHARED) { +TEST(PREFIX_VARINT_LENGTH_STRING_SHARED) { const sourcemeta::core::JSON input = sourcemeta::core::parse_json(R"JSON({ "$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1", "binpackEncoding": "PREFIX_VARINT_LENGTH_STRING_SHARED", diff --git a/vendor/blaze/DEPENDENCIES b/vendor/blaze/DEPENDENCIES index ed7767e4e..ff2a459b4 100644 --- a/vendor/blaze/DEPENDENCIES +++ b/vendor/blaze/DEPENDENCIES @@ -1,5 +1,5 @@ vendorpull https://github.com/sourcemeta/vendorpull 1dcbac42809cf87cb5b045106b863e17ad84ba02 -core https://github.com/sourcemeta/core d07b863772ce5ee38e696ebbc8408d4831545a60 +core https://github.com/sourcemeta/core fe9ef27a95281775fe3a98b9fb8eb4c51837af0a jsonschema-test-suite https://github.com/json-schema-org/JSON-Schema-Test-Suite 1acd90e53554fa24d2529b49fd7d50bab18f8b7e jsonschema-2020-12 https://github.com/json-schema-org/json-schema-spec 769daad75a9553562333a8937a187741cb708c72 jsonschema-2019-09 https://github.com/json-schema-org/json-schema-spec 41014ea723120ce70b314d72f863c6929d9f3cfd diff --git a/vendor/blaze/src/compiler/compile_helpers.h b/vendor/blaze/src/compiler/compile_helpers.h index eb82f409c..e8859110c 100644 --- a/vendor/blaze/src/compiler/compile_helpers.h +++ b/vendor/blaze/src/compiler/compile_helpers.h @@ -340,9 +340,26 @@ inline auto requires_evaluation(const Context &context, inline auto annotations_enabled(const Context &context, const std::string_view keyword) -> bool { - return context.mode == Mode::Exhaustive && - (!context.tweaks.annotations.has_value() || - context.tweaks.annotations.value().contains(keyword)); + if (context.tweaks.annotations.has_value()) { + return context.tweaks.annotations.value().contains(keyword); + } + + return context.mode == Mode::Exhaustive; +} + +// Whether any annotation may be collected anywhere in this compilation. Drives +// the "do not short-circuit / keep iterating" behavior of applicators like +// `contains` so that nested annotations are reached on every instance location, +// independently of whether the applicator's own annotation was whitelisted. +// Exhaustive mode always keeps iterating for complete error reporting, +// regardless of whether annotations are disabled via an empty whitelist. +inline auto annotations_collected(const Context &context) -> bool { + if (context.mode == Mode::Exhaustive) { + return true; + } + + return context.tweaks.annotations.has_value() && + !context.tweaks.annotations.value().empty(); } // TODO: Elevate to Core and test diff --git a/vendor/blaze/src/compiler/default_compiler_2019_09.h b/vendor/blaze/src/compiler/default_compiler_2019_09.h index 87b6f066c..6a7c6be3b 100644 --- a/vendor/blaze/src/compiler/default_compiler_2019_09.h +++ b/vendor/blaze/src/compiler/default_compiler_2019_09.h @@ -194,7 +194,8 @@ auto compiler_2019_09_applicator_contains(const Context &context, const Instructions ¤t) -> Instructions { return compiler_2019_09_applicator_contains_with_options( - context, schema_context, dynamic_context, current, false, false); + context, schema_context, dynamic_context, current, + annotations_collected(context), false); } auto compiler_2019_09_applicator_additionalproperties( @@ -203,8 +204,7 @@ auto compiler_2019_09_applicator_additionalproperties( -> Instructions { return compiler_draft3_applicator_additionalproperties_with_options( - context, schema_context, dynamic_context, - context.mode == Mode::Exhaustive, + context, schema_context, dynamic_context, annotations_collected(context), requires_evaluation(context, schema_context)); } @@ -222,12 +222,11 @@ auto compiler_2019_09_applicator_items(const Context &context, if (schema_context.schema.at(dynamic_context.keyword).is_array()) { return compiler_draft3_applicator_items_with_options( context, schema_context, dynamic_context, - context.mode == Mode::Exhaustive, track); + annotations_collected(context), track); } return compiler_draft3_applicator_items_with_options( - context, schema_context, dynamic_context, - context.mode == Mode::Exhaustive, + context, schema_context, dynamic_context, annotations_collected(context), track && !schema_context.schema.defines("unevaluatedItems")); } @@ -243,8 +242,7 @@ auto compiler_2019_09_applicator_additionalitems( })}; return compiler_draft3_applicator_additionalitems_with_options( - context, schema_context, dynamic_context, - context.mode == Mode::Exhaustive, + context, schema_context, dynamic_context, annotations_collected(context), track && !schema_context.schema.defines("unevaluatedItems")); } @@ -434,7 +432,7 @@ auto compiler_2019_09_applicator_properties( -> Instructions { return compiler_draft3_applicator_properties_with_options( context, schema_context, dynamic_context, current, - context.mode == Mode::Exhaustive, + annotations_collected(context), requires_evaluation(context, schema_context)); } @@ -443,8 +441,7 @@ auto compiler_2019_09_applicator_patternproperties( const DynamicContext &dynamic_context, const Instructions &) -> Instructions { return compiler_draft3_applicator_patternproperties_with_options( - context, schema_context, dynamic_context, - context.mode == Mode::Exhaustive, + context, schema_context, dynamic_context, annotations_collected(context), requires_evaluation(context, schema_context)); } diff --git a/vendor/blaze/src/compiler/default_compiler_2020_12.h b/vendor/blaze/src/compiler/default_compiler_2020_12.h index f7abcbd41..9b02ab843 100644 --- a/vendor/blaze/src/compiler/default_compiler_2020_12.h +++ b/vendor/blaze/src/compiler/default_compiler_2020_12.h @@ -22,8 +22,8 @@ auto compiler_2020_12_applicator_prefixitems( })}; return compiler_draft3_applicator_items_array( - context, schema_context, dynamic_context, - context.mode == Mode::Exhaustive, track); + context, schema_context, dynamic_context, annotations_collected(context), + track); } auto compiler_2020_12_applicator_items(const Context &context, @@ -44,7 +44,7 @@ auto compiler_2020_12_applicator_items(const Context &context, return compiler_draft3_applicator_additionalitems_from_cursor( context, schema_context, dynamic_context, cursor, - context.mode == Mode::Exhaustive, + annotations_collected(context), track && !schema_context.schema.defines("unevaluatedItems")); } @@ -62,7 +62,7 @@ auto compiler_2020_12_applicator_contains(const Context &context, return compiler_2019_09_applicator_contains_with_options( context, schema_context, dynamic_context, current, - context.mode == Mode::Exhaustive, track); + annotations_collected(context), track); } auto compiler_2020_12_core_dynamicref(const Context &context, diff --git a/vendor/blaze/src/compiler/default_compiler_draft3.h b/vendor/blaze/src/compiler/default_compiler_draft3.h index fdbd980a5..ffc9f8080 100644 --- a/vendor/blaze/src/compiler/default_compiler_draft3.h +++ b/vendor/blaze/src/compiler/default_compiler_draft3.h @@ -614,7 +614,8 @@ auto compiler_draft3_applicator_properties_with_options( auto properties{compile_properties(context, schema_context, effective_dynamic_context, current)}; - if (context.mode == Mode::FastValidation && !required.empty() && + if (!emit_annotation && context.mode == Mode::FastValidation && + !required.empty() && schema_context.schema.defines("additionalProperties") && schema_context.schema.at("additionalProperties").is_boolean() && !schema_context.schema.at("additionalProperties").to_boolean() && @@ -689,7 +690,8 @@ auto compiler_draft3_applicator_properties_with_options( } auto attempt_object_fusion{context.mode == Mode::FastValidation && - !annotate && !track_evaluation && assume_object}; + !emit_annotation && !track_evaluation && + assume_object}; if (attempt_object_fusion) { for (const auto &entry : schema_context.schema.as_object()) { const auto &keyword{entry.first}; @@ -1220,7 +1222,8 @@ auto compiler_draft3_applicator_additionalproperties_with_options( const auto required{required_properties(schema_context)}; if (is_closed_properties_required(schema_context.schema, required) && (required.size() > 1 || - properties_enforce_closed_object(context, schema_context))) { + (properties_enforce_closed_object(context, schema_context) && + !annotations_enabled(context, "properties")))) { return {}; } } @@ -1586,8 +1589,9 @@ auto compiler_draft3_applicator_additionalitems_from_cursor( Instructions children; if (!subchildren.empty()) { - if (context.mode == Mode::FastValidation && cursor == 0 && !annotate && - !track_evaluation && is_integer_bounded_pattern(subchildren)) { + if (context.mode == Mode::FastValidation && cursor == 0 && + !emit_annotation && !track_evaluation && + is_integer_bounded_pattern(subchildren)) { children.push_back( make(sourcemeta::blaze::InstructionIndex::LoopItemsIntegerBounded, context, schema_context, dynamic_context, diff --git a/vendor/blaze/src/compiler/default_compiler_draft4.h b/vendor/blaze/src/compiler/default_compiler_draft4.h index 4bca15e89..b974a7d59 100644 --- a/vendor/blaze/src/compiler/default_compiler_draft4.h +++ b/vendor/blaze/src/compiler/default_compiler_draft4.h @@ -141,6 +141,7 @@ auto compiler_draft4_applicator_anyof(const Context &context, } const auto requires_exhaustive{context.mode == Mode::Exhaustive || + annotations_collected(context) || requires_evaluation(context, schema_context)}; return {make(sourcemeta::blaze::InstructionIndex::LogicalOr, context, @@ -171,6 +172,7 @@ auto compiler_draft4_applicator_oneof(const Context &context, } const auto requires_exhaustive{context.mode == Mode::Exhaustive || + annotations_collected(context) || requires_evaluation(context, schema_context)}; return {make(sourcemeta::blaze::InstructionIndex::LogicalXor, context, diff --git a/vendor/core/CMakeLists.txt b/vendor/core/CMakeLists.txt index e45099d99..f57bbdd3a 100644 --- a/vendor/core/CMakeLists.txt +++ b/vendor/core/CMakeLists.txt @@ -12,6 +12,7 @@ option(SOURCEMETA_CORE_LANG_ERROR "Build the Sourcemeta Core language error libr option(SOURCEMETA_CORE_LANG_OPTIONS "Build the Sourcemeta Core Options library" ON) option(SOURCEMETA_CORE_LANG_TEXT "Build the Sourcemeta Core language text library" ON) option(SOURCEMETA_CORE_LANG_STACKTRACE "Build the Sourcemeta Core language stacktrace library" ON) +option(SOURCEMETA_CORE_LANG_TEST "Build the Sourcemeta Core language test library" ON) option(SOURCEMETA_CORE_UNICODE "Build the Sourcemeta Core Unicode library" ON) option(SOURCEMETA_CORE_PUNYCODE "Build the Sourcemeta Core Punycode library" ON) option(SOURCEMETA_CORE_TIME "Build the Sourcemeta Core time library" ON) @@ -47,7 +48,6 @@ option(SOURCEMETA_CORE_DOCS "Build the Sourcemeta Core docs" OFF) option(SOURCEMETA_CORE_INSTALL "Install the Sourcemeta Core library" ON) option(SOURCEMETA_CORE_ADDRESS_SANITIZER "Build Sourcemeta Core with an address sanitizer" OFF) option(SOURCEMETA_CORE_UNDEFINED_SANITIZER "Build Sourcemeta Core with an undefined behavior sanitizer" OFF) -option(SOURCEMETA_CORE_CONTRIB_GOOGLETEST "Build the GoogleTest library for downstream consumers" OFF) option(SOURCEMETA_CORE_CONTRIB_GOOGLEBENCHMARK "Build the GoogleBenchmark library for downstream consumers" OFF) include(Sourcemeta) @@ -112,6 +112,10 @@ if(SOURCEMETA_CORE_LANG_STACKTRACE) add_subdirectory(src/lang/stacktrace) endif() +if(SOURCEMETA_CORE_LANG_TEST) + add_subdirectory(src/lang/test) +endif() + if(SOURCEMETA_CORE_UNICODE) add_subdirectory(src/core/unicode) endif() @@ -242,10 +246,6 @@ endif() # Testing -if(SOURCEMETA_CORE_CONTRIB_GOOGLETEST OR SOURCEMETA_CORE_TESTS OR SOURCEMETA_CORE_TESTS_CI) - find_package(GoogleTest REQUIRED) -endif() - if(SOURCEMETA_CORE_CONTRIB_GOOGLEBENCHMARK OR SOURCEMETA_CORE_BENCHMARK) find_package(GoogleBenchmark REQUIRED) endif() @@ -287,6 +287,10 @@ if(SOURCEMETA_CORE_TESTS) add_subdirectory(test/stacktrace) endif() + if(SOURCEMETA_CORE_LANG_TEST) + add_subdirectory(test/test) + endif() + if(SOURCEMETA_CORE_UNICODE) add_subdirectory(test/unicode) endif() diff --git a/vendor/core/DEPENDENCIES b/vendor/core/DEPENDENCIES index c50b56236..b0bedf0ac 100644 --- a/vendor/core/DEPENDENCIES +++ b/vendor/core/DEPENDENCIES @@ -6,7 +6,6 @@ uritemplate-test https://github.com/uri-templates/uritemplate-test 1eb27ab4462b9 pyca-cryptography https://github.com/pyca/cryptography 9747d06e83764e7f1ea4c04daf134cb8f861700b wycheproof https://github.com/C2SP/wycheproof 6d7cccd0fcb1917368579adeeac10fe802f1b521 pcre2 https://github.com/PCRE2Project/pcre2 pcre2-10.47 -googletest https://github.com/google/googletest a7f443b80b105f940225332ed3c31f2790092f47 googlebenchmark https://github.com/google/benchmark 378fe693a1ef51500db21b11ff05a8018c5f0e55 libdeflate https://github.com/ebiggers/libdeflate v1.25 unicodetools https://github.com/unicode-org/unicodetools final-17.0-20250910 diff --git a/vendor/core/cmake/FindGoogleTest.cmake b/vendor/core/cmake/FindGoogleTest.cmake deleted file mode 100644 index 8559f2299..000000000 --- a/vendor/core/cmake/FindGoogleTest.cmake +++ /dev/null @@ -1,15 +0,0 @@ -if(NOT GoogleTest_FOUND) - set(BUILD_GMOCK ON CACHE BOOL "enable googlemock") - set(INSTALL_GTEST OFF CACHE BOOL "disable installation") - add_subdirectory("${PROJECT_SOURCE_DIR}/vendor/googletest") - set(GoogleTest_FOUND ON) - - # GoogleTest is vendored as-is and is not held to this project's strict - # warning policy, so do not let its own diagnostics fail the build - foreach(googletest_target gtest gtest_main gmock gmock_main) - if(TARGET ${googletest_target}) - set_target_properties("${googletest_target}" - PROPERTIES COMPILE_WARNING_AS_ERROR OFF) - endif() - endforeach() -endif() diff --git a/vendor/core/cmake/Sourcemeta.cmake b/vendor/core/cmake/Sourcemeta.cmake index 50fb7b33e..70eaef5ab 100644 --- a/vendor/core/cmake/Sourcemeta.cmake +++ b/vendor/core/cmake/Sourcemeta.cmake @@ -12,7 +12,7 @@ include("${SOURCEMETA_UTILITIES_DIRECTORY}/targets/executable.cmake") include("${SOURCEMETA_UTILITIES_DIRECTORY}/targets/clang-format.cmake") include("${SOURCEMETA_UTILITIES_DIRECTORY}/targets/shellcheck.cmake") include("${SOURCEMETA_UTILITIES_DIRECTORY}/targets/doxygen.cmake") -include("${SOURCEMETA_UTILITIES_DIRECTORY}/targets/googletest.cmake") +include("${SOURCEMETA_UTILITIES_DIRECTORY}/targets/test.cmake") include("${SOURCEMETA_UTILITIES_DIRECTORY}/targets/googlebenchmark.cmake") include("${SOURCEMETA_UTILITIES_DIRECTORY}/clang-tidy.cmake") diff --git a/vendor/core/cmake/common/defaults.cmake b/vendor/core/cmake/common/defaults.cmake index bb2ce6f7b..b6c688f8b 100644 --- a/vendor/core/cmake/common/defaults.cmake +++ b/vendor/core/cmake/common/defaults.cmake @@ -63,10 +63,6 @@ if(NOT APPLE) set(CMAKE_INSTALL_RPATH $ORIGIN) endif() -# Delay GoogleTest discovery until before running the tests -# See https://discourse.cmake.org/t/default-value-for-new-discovery-mode-option-for-gtest-discover-tests/1422 -set(CMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE PRE_TEST) - # Always use folders in IDE # See https://cmake.org/cmake/help/latest/prop_gbl/USE_FOLDERS.html set_property(GLOBAL PROPERTY USE_FOLDERS ON) @@ -116,7 +112,7 @@ if(CMAKE_BUILD_TYPE STREQUAL "Release") endif() # Turn on POSIX.1-2008 compatibility on MSYS2 -# At least GoogleTest does not seem to compile without this +# Some projects do not seem to compile without this if(CMAKE_SYSTEM_NAME STREQUAL "MSYS") add_compile_definitions(_POSIX_C_SOURCE=200809L) endif() diff --git a/vendor/core/cmake/common/targets/googletest.cmake b/vendor/core/cmake/common/targets/googletest.cmake deleted file mode 100644 index 39cb9f22f..000000000 --- a/vendor/core/cmake/common/targets/googletest.cmake +++ /dev/null @@ -1,31 +0,0 @@ -function(sourcemeta_googletest) - cmake_parse_arguments(SOURCEMETA_GOOGLETEST "" - "NAMESPACE;PROJECT;NAME;VARIANT" "SOURCES" ${ARGN}) - - if(SOURCEMETA_GOOGLETEST_VARIANT) - set(TARGET_VARIANT "${SOURCEMETA_GOOGLETEST_VARIANT}_unit") - else() - set(TARGET_VARIANT "unit") - endif() - - sourcemeta_executable( - NAMESPACE "${SOURCEMETA_GOOGLETEST_NAMESPACE}" - PROJECT "${SOURCEMETA_GOOGLETEST_PROJECT}" - NAME "${SOURCEMETA_GOOGLETEST_NAME}" - VARIANT "${TARGET_VARIANT}" - SOURCES "${SOURCEMETA_GOOGLETEST_SOURCES}" - OUTPUT TARGET_NAME) - - target_link_libraries("${TARGET_NAME}" - PRIVATE GTest::gtest GTest::gmock GTest::gtest_main) - - # Test executables are not shipped, so LTO buys nothing and significantly - # slows the link step (GCC's LTRANS phase serializes per executable) - if(SOURCEMETA_COMPILER_LLVM OR SOURCEMETA_COMPILER_GCC) - target_compile_options("${TARGET_NAME}" PRIVATE -fno-lto) - target_link_options("${TARGET_NAME}" PRIVATE -fno-lto) - endif() - - add_test(NAME "${SOURCEMETA_GOOGLETEST_PROJECT}.${SOURCEMETA_GOOGLETEST_NAME}" - COMMAND "${TARGET_NAME}" --gtest_brief=1) -endfunction() diff --git a/vendor/core/cmake/common/targets/test.cmake b/vendor/core/cmake/common/targets/test.cmake new file mode 100644 index 000000000..542ae97e4 --- /dev/null +++ b/vendor/core/cmake/common/targets/test.cmake @@ -0,0 +1,35 @@ +function(sourcemeta_test) + cmake_parse_arguments(SOURCEMETA_TEST "" + "NAMESPACE;PROJECT;NAME;VARIANT" "SOURCES" ${ARGN}) + + if(SOURCEMETA_TEST_VARIANT) + set(TARGET_VARIANT "${SOURCEMETA_TEST_VARIANT}_unit") + else() + set(TARGET_VARIANT "unit") + endif() + + sourcemeta_executable( + NAMESPACE "${SOURCEMETA_TEST_NAMESPACE}" + PROJECT "${SOURCEMETA_TEST_PROJECT}" + NAME "${SOURCEMETA_TEST_NAME}" + VARIANT "${TARGET_VARIANT}" + SOURCES "${SOURCEMETA_TEST_SOURCES}" + OUTPUT TARGET_NAME) + + target_link_libraries("${TARGET_NAME}" + PRIVATE sourcemeta::core::test) + # Provides a default entry point through static archive resolution unless the + # suite defines its own `main` + target_link_libraries("${TARGET_NAME}" + PRIVATE sourcemeta::core::test_main) + + # Test executables are not shipped, so LTO buys nothing and significantly + # slows the link step (GCC's LTRANS phase serializes per executable) + if(SOURCEMETA_COMPILER_LLVM OR SOURCEMETA_COMPILER_GCC) + target_compile_options("${TARGET_NAME}" PRIVATE -fno-lto) + target_link_options("${TARGET_NAME}" PRIVATE -fno-lto) + endif() + + add_test(NAME "${SOURCEMETA_TEST_PROJECT}.${SOURCEMETA_TEST_NAME}" + COMMAND "${TARGET_NAME}") +endfunction() diff --git a/vendor/core/config.cmake.in b/vendor/core/config.cmake.in index 889e1c798..50a91e0bb 100644 --- a/vendor/core/config.cmake.in +++ b/vendor/core/config.cmake.in @@ -39,6 +39,7 @@ if(NOT SOURCEMETA_CORE_COMPONENTS) list(APPEND SOURCEMETA_CORE_COMPONENTS options) list(APPEND SOURCEMETA_CORE_COMPONENTS text) list(APPEND SOURCEMETA_CORE_COMPONENTS stacktrace) + list(APPEND SOURCEMETA_CORE_COMPONENTS test) endif() include(CMakeFindDependencyMacro) @@ -233,6 +234,13 @@ foreach(component ${SOURCEMETA_CORE_COMPONENTS}) include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_text.cmake") elseif(component STREQUAL "stacktrace") include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_stacktrace.cmake") + elseif(component STREQUAL "test") + include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_preprocessor.cmake") + include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_numeric.cmake") + include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_options.cmake") + include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_stacktrace.cmake") + include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_test.cmake") + include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_test_main.cmake") else() message(FATAL_ERROR "Unknown Sourcemeta Core component: ${component}") endif() diff --git a/vendor/core/src/core/http/CMakeLists.txt b/vendor/core/src/core/http/CMakeLists.txt index e81a3b9c8..588c6c9e9 100644 --- a/vendor/core/src/core/http/CMakeLists.txt +++ b/vendor/core/src/core/http/CMakeLists.txt @@ -13,6 +13,7 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME http SOURCES helpers.h problem.cc match_accept.cc match_accept_language.cc negotiate_encoding.cc from_date.cc format_link.cc field_list.cc accept_includes_all.cc content_type_matches.cc parse_bearer.cc + cache_control_max_age.cc ${SOURCEMETA_CORE_HTTP_CLIENT_SOURCE}) if(SOURCEMETA_CORE_INSTALL) diff --git a/vendor/core/src/core/http/cache_control_max_age.cc b/vendor/core/src/core/http/cache_control_max_age.cc new file mode 100644 index 000000000..7d3e5c077 --- /dev/null +++ b/vendor/core/src/core/http/cache_control_max_age.cc @@ -0,0 +1,86 @@ +#include + +#include "helpers.h" + +#include // std::chrono::seconds +#include // std::size_t +#include // std::optional, std::nullopt +#include // std::string_view + +namespace sourcemeta::core { + +auto http_cache_control_max_age(const std::string_view cache_control) noexcept + -> std::optional { + // RFC 9111 §1.2.2: a delta-seconds value larger than the cache can represent + // is treated as 2^31 + constexpr std::chrono::seconds::rep overflow_seconds{2147483648}; + std::optional result; + bool found{false}; + http_for_each_list_entry( + cache_control, [&](const std::string_view directive) -> void { + if (found) { + return; + } + + const auto separator{directive.find('=')}; + if (separator == std::string_view::npos || + !http_iequals_ascii(http_subview(directive, 0, separator), + "max-age")) { + return; + } + + found = true; + auto value{http_subview(directive, separator + 1, + directive.size() - separator - 1)}; + // RFC 9111 §5.2.2.1 forbids a sender from generating the quoted-string + // form for delta-seconds, but RFC 9111 §5.2.4 asks recipients to accept + // it regardless + const bool quoted{value.size() >= 2 && value.front() == '"' && + value.back() == '"'}; + if (quoted) { + value = http_subview(value, 1, value.size() - 2); + } + + if (value.empty()) { + return; + } + + std::chrono::seconds::rep seconds{0}; + for (std::size_t index{0}; index < value.size(); ++index) { + char character{value[index]}; + // RFC 9110 §5.6.4: within a quoted-string a backslash escapes the + // octet that follows it + if (quoted && character == '\\') { + index += 1; + if (index >= value.size()) { + return; + } + + character = value[index]; + } + + if (character < '0' || character > '9') { + return; + } + + // Clamp before multiplying so the running total cannot itself + // overflow on a hostile number of digits + if (seconds > overflow_seconds / 10) { + seconds = overflow_seconds; + continue; + } + + seconds = (seconds * 10) + (character - '0'); + } + + if (seconds > overflow_seconds) { + seconds = overflow_seconds; + } + + result = std::chrono::seconds{seconds}; + }); + + return result; +} + +} // namespace sourcemeta::core diff --git a/vendor/core/src/core/http/include/sourcemeta/core/http.h b/vendor/core/src/core/http/include/sourcemeta/core/http.h index f572a6e32..caa6ba739 100644 --- a/vendor/core/src/core/http/include/sourcemeta/core/http.h +++ b/vendor/core/src/core/http/include/sourcemeta/core/http.h @@ -154,6 +154,26 @@ SOURCEMETA_CORE_HTTP_EXPORT auto http_from_date(const std::string_view value) noexcept -> std::optional; +/// @ingroup http +/// Read the `max-age` response directive from a `Cache-Control` header value +/// per RFC 9111 §5.2.2.1. Returns an empty value when the directive is absent +/// or malformed. A value larger than the cache can represent saturates to +/// `2147483648` seconds as mandated by RFC 9111 §1.2.2. For example: +/// +/// ```cpp +/// #include +/// #include +/// #include +/// +/// const auto max_age{sourcemeta::core::http_cache_control_max_age( +/// "public, max-age=600")}; +/// assert(max_age.has_value()); +/// assert(max_age.value() == std::chrono::seconds{600}); +/// ``` +SOURCEMETA_CORE_HTTP_EXPORT +auto http_cache_control_max_age(const std::string_view cache_control) noexcept + -> std::optional; + /// @ingroup http /// A typed RFC 8288 §3 link-value. The caller owns the backing storage for /// every field, must URI-escape `target`, and must ensure parameter values are diff --git a/vendor/core/src/core/jsonld/CMakeLists.txt b/vendor/core/src/core/jsonld/CMakeLists.txt index 65cdef868..fbcc41e46 100644 --- a/vendor/core/src/core/jsonld/CMakeLists.txt +++ b/vendor/core/src/core/jsonld/CMakeLists.txt @@ -1,5 +1,5 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME jsonld - PRIVATE_HEADERS error.h + PRIVATE_HEADERS error.h materialize.h SOURCES jsonld.cc jsonld_iri_expansion.cc jsonld_create_term_definition.cc jsonld_context_processing.cc jsonld_value_expansion.cc jsonld_expansion.cc @@ -7,6 +7,7 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME jsonld jsonld_inverse_context.cc jsonld_iri_compaction.cc jsonld_value_compaction.cc jsonld_compaction.cc jsonld_node_map.cc jsonld_flatten.cc + jsonld_materialize.cc jsonld_algorithms.h jsonld_keywords.h) if(SOURCEMETA_CORE_INSTALL) diff --git a/vendor/core/src/core/jsonld/include/sourcemeta/core/jsonld.h b/vendor/core/src/core/jsonld/include/sourcemeta/core/jsonld.h index c799dbad0..2a4ccfa33 100644 --- a/vendor/core/src/core/jsonld/include/sourcemeta/core/jsonld.h +++ b/vendor/core/src/core/jsonld/include/sourcemeta/core/jsonld.h @@ -7,6 +7,7 @@ #include #include +#include #include // std::uint8_t #include // std::function diff --git a/vendor/core/src/core/jsonld/include/sourcemeta/core/jsonld_materialize.h b/vendor/core/src/core/jsonld/include/sourcemeta/core/jsonld_materialize.h new file mode 100644 index 000000000..9a4fbf5ad --- /dev/null +++ b/vendor/core/src/core/jsonld/include/sourcemeta/core/jsonld_materialize.h @@ -0,0 +1,162 @@ +#ifndef SOURCEMETA_CORE_JSONLD_MATERIALIZE_H_ +#define SOURCEMETA_CORE_JSONLD_MATERIALIZE_H_ + +#ifndef SOURCEMETA_CORE_JSONLD_EXPORT +#include +#endif + +#include +#include + +#include // std::uint8_t +#include // std::optional +#include // std::unordered_map +#include // std::variant +#include // std::vector + +namespace sourcemeta::core { + +/// @ingroup jsonld +/// How a position connects to its parent. The position is the object of the +/// edge, asserted in reverse when the flag is set. +struct JSONLDEdge { + JSON::String predicate{}; + bool reverse{false}; +}; + +/// @ingroup jsonld +/// The base direction of a language-tagged string +enum class JSONLDDirection : std::uint8_t { LTR, RTL }; + +/// @ingroup jsonld +/// A position that is an object. An absent identifier means a fresh blank node, +/// and the graph flag asserts the node's descendants in the named graph the +/// identifier denotes. +struct JSONLDNode { + std::optional id{}; + std::vector types{}; + bool graph{false}; +}; + +/// @ingroup jsonld +/// A position that is a value. The datatype defaults to the native type of the +/// JSON value, a language may carry a direction, and the JSON flag preserves an +/// opaque JSON literal verbatim. +struct JSONLDLiteral { + std::optional datatype{}; + std::optional language{}; + std::optional direction{}; + bool json{false}; +}; + +/// @ingroup jsonld +/// A scalar promoted to an identified node +struct JSONLDReference { + JSON::String id{}; + std::vector types{}; +}; + +/// @ingroup jsonld +/// A position that is an array, asserted as an RDF list when ordered and as a +/// set otherwise +struct JSONLDCollection { + bool ordered{false}; +}; + +/// @ingroup jsonld +/// The semantics of a single instance position: how it connects to its parent +/// and what it is +struct JSONLDDescriptor { + std::vector edges{}; + std::variant + value{}; +}; + +/// @ingroup jsonld +/// A resolved mapping of instance positions to their JSON-LD semantics, keyed +/// by a JSON Pointer of the given kind +template +using JSONLDBasicAnnotationMap = + std::unordered_map; + +/// @ingroup jsonld +/// A resolved annotation map keyed by an owning JSON Pointer +using JSONLDAnnotationMap = JSONLDBasicAnnotationMap; + +/// @ingroup jsonld +/// A resolved annotation map keyed by a non-owning weak JSON Pointer. The keys +/// reference strings owned elsewhere that must outlive any materialization +/// call. +using JSONLDWeakAnnotationMap = JSONLDBasicAnnotationMap; + +/// @ingroup jsonld +/// +/// Materialize an instance into expanded JSON-LD using an annotation map that +/// assigns JSON-LD semantics to instance positions. The result is always a JSON +/// array. For example: +/// +/// ```cpp +/// #include +/// #include +/// #include +/// +/// const auto instance{sourcemeta::core::parse_json( +/// R"({ "name": "Sourcemeta" })")}; +/// +/// sourcemeta::core::JSONLDAnnotationMap map; +/// map.emplace(sourcemeta::core::Pointer{}, +/// sourcemeta::core::JSONLDDescriptor{ +/// {}, sourcemeta::core::JSONLDNode{ +/// "https://example.com/org", {}, false }}); +/// map.emplace(sourcemeta::core::Pointer{"name"}, +/// sourcemeta::core::JSONLDDescriptor{ +/// { { "https://schema.org/name", false } }, +/// sourcemeta::core::JSONLDLiteral{}}); +/// +/// const auto expanded{sourcemeta::core::jsonld_materialize(instance, map)}; +/// sourcemeta::core::prettify(expanded, std::cout); +/// std::cout << std::endl; +/// ``` +SOURCEMETA_CORE_JSONLD_EXPORT +auto jsonld_materialize(const JSON &instance, const JSONLDAnnotationMap &map) + -> JSON; + +/// @ingroup jsonld +/// +/// Materialize an instance into expanded JSON-LD using a weak annotation map +/// whose keys are non-owning views into strings owned elsewhere. The backing +/// strings must outlive the call. The result is always a JSON array. For +/// example: +/// +/// ```cpp +/// #include +/// #include +/// #include +/// #include +/// +/// const auto instance{sourcemeta::core::parse_json( +/// R"({ "name": "Sourcemeta" })")}; +/// +/// const sourcemeta::core::JSON::String name_key{"name"}; +/// +/// sourcemeta::core::JSONLDWeakAnnotationMap map; +/// map.emplace(sourcemeta::core::WeakPointer{}, +/// sourcemeta::core::JSONLDDescriptor{ +/// {}, sourcemeta::core::JSONLDNode{ +/// "https://example.com/org", {}, false }}); +/// map.emplace(sourcemeta::core::WeakPointer{std::cref(name_key)}, +/// sourcemeta::core::JSONLDDescriptor{ +/// { { "https://schema.org/name", false } }, +/// sourcemeta::core::JSONLDLiteral{}}); +/// +/// const auto expanded{sourcemeta::core::jsonld_materialize(instance, map)}; +/// sourcemeta::core::prettify(expanded, std::cout); +/// std::cout << std::endl; +/// ``` +SOURCEMETA_CORE_JSONLD_EXPORT +auto jsonld_materialize(const JSON &instance, + const JSONLDWeakAnnotationMap &map) -> JSON; + +} // namespace sourcemeta::core + +#endif diff --git a/vendor/core/src/core/jsonld/jsonld_materialize.cc b/vendor/core/src/core/jsonld/jsonld_materialize.cc new file mode 100644 index 000000000..8c3643c52 --- /dev/null +++ b/vendor/core/src/core/jsonld/jsonld_materialize.cc @@ -0,0 +1,362 @@ +#include +#include +#include + +#include "jsonld_keywords.h" + +#include // std::ranges::sort +#include // std::size_t +#include // std::reference_wrapper, std::cref +#include // std::optional, std::nullopt +#include // std::is_same_v +#include // std::move, std::unreachable +#include // std::holds_alternative, std::get +#include // std::vector + +namespace sourcemeta::core { + +namespace { + +template +auto materialize_value(const JSON &value, PointerT &pointer, + const JSONLDBasicAnnotationMap &map, + std::vector &standalone) -> std::optional; + +template +auto fill_node(JSON &node, const JSON &instance_object, PointerT &pointer, + const JSONLDBasicAnnotationMap &map, + std::vector &standalone) -> void; + +// Append an object key to the pointer, copying it for an owning pointer and +// taking a non-owning view for a weak pointer. +template +auto push_property(PointerT &pointer, const JSON::String &key) -> void { + if constexpr (std::is_same_v) { + pointer.push_back(key); + } else { + pointer.push_back(std::cref(key)); + } +} + +// A node object is any map that is neither a value object nor a list object. +auto is_node_object(const JSON &value) -> bool { + return value.is_object() && + !value.defines(KEYWORD_VALUE, KEYWORD_VALUE_HASH) && + !value.defines(KEYWORD_LIST, KEYWORD_LIST_HASH); +} + +auto direction_to_string(const JSONLDDirection direction) -> JSON::StringView { + switch (direction) { + case JSONLDDirection::LTR: + return "ltr"; + case JSONLDDirection::RTL: + return "rtl"; + } + + std::unreachable(); +} + +auto types_to_array(const std::vector &types) -> JSON { + auto result{JSON::make_array()}; + for (const auto &type : types) { + result.push_back(JSON{type}); + } + return result; +} + +// The property array of node under the given predicate, creating it as needed. +auto property_target(JSON &node, const JSON::StringView predicate) -> JSON & { + if (!node.defines(predicate)) { + node.assign_assume_new(JSON::String{predicate}, JSON::make_array()); + } + return node.at(predicate); +} + +// The property array nested under @reverse and the given predicate. +auto reverse_target(JSON &node, const JSON::StringView predicate) -> JSON & { + if (!node.defines(KEYWORD_REVERSE, KEYWORD_REVERSE_HASH)) { + node.assign_assume_new(JSON::String{KEYWORD_REVERSE}, JSON::make_object(), + KEYWORD_REVERSE_HASH); + } + auto &reverse{node.at(KEYWORD_REVERSE, KEYWORD_REVERSE_HASH)}; + if (!reverse.defines(predicate)) { + reverse.assign_assume_new(JSON::String{predicate}, JSON::make_array()); + } + return reverse.at(predicate); +} + +// Attach a value under a single edge. A set, represented as a bare array, +// spreads its members into the property array. +auto attach_one(JSON &node, const JSONLDEdge &edge, JSON value) -> void { + // An empty set carries no values, so it asserts no property. + if (value.is_array() && value.empty()) { + return; + } + + auto &target{edge.reverse ? reverse_target(node, edge.predicate) + : property_target(node, edge.predicate)}; + if (value.is_array()) { + for (auto &element : value.as_array()) { + target.push_back(std::move(element)); + } + } else { + target.push_back(std::move(value)); + } +} + +auto attach(JSON &node, const std::vector &edges, JSON value) + -> void { + for (std::size_t index = 0; index + 1 < edges.size(); index += 1) { + attach_one(node, edges[index], value); + } + attach_one(node, edges.back(), std::move(value)); +} + +auto materialize_literal(const JSONLDLiteral &descriptor, const JSON &value) + -> JSON { + auto result{JSON::make_object()}; + result.assign_assume_new(JSON::String{KEYWORD_VALUE}, JSON{value}, + KEYWORD_VALUE_HASH); + if (descriptor.json) { + result.assign_assume_new(JSON::String{KEYWORD_TYPE}, JSON{KEYWORD_JSON}, + KEYWORD_TYPE_HASH); + return result; + } + + if (descriptor.datatype.has_value()) { + result.assign_assume_new(JSON::String{KEYWORD_TYPE}, + JSON{descriptor.datatype.value()}, + KEYWORD_TYPE_HASH); + } + if (descriptor.language.has_value()) { + result.assign_assume_new(JSON::String{KEYWORD_LANGUAGE}, + JSON{descriptor.language.value()}, + KEYWORD_LANGUAGE_HASH); + } + if (descriptor.direction.has_value()) { + result.assign_assume_new( + JSON::String{KEYWORD_DIRECTION}, + JSON{direction_to_string(descriptor.direction.value())}, + KEYWORD_DIRECTION_HASH); + } + return result; +} + +auto materialize_reference(const JSONLDReference &descriptor) -> JSON { + auto result{JSON::make_object()}; + result.assign_assume_new(JSON::String{KEYWORD_ID}, JSON{descriptor.id}, + KEYWORD_ID_HASH); + if (!descriptor.types.empty()) { + result.assign_assume_new(JSON::String{KEYWORD_TYPE}, + types_to_array(descriptor.types), + KEYWORD_TYPE_HASH); + } + return result; +} + +template +auto build_collection(const JSON &value, PointerT &pointer, + const JSONLDBasicAnnotationMap &map, + std::vector &standalone, const bool ordered) + -> JSON { + auto elements{JSON::make_array()}; + for (std::size_t index = 0; index < value.size(); index += 1) { + pointer.push_back(index); + auto element{materialize_value(value.at(index), pointer, map, standalone)}; + pointer.pop_back(); + if (!element.has_value()) { + continue; + } + + // A nested set flattens into the enclosing collection. + if (element->is_array()) { + for (auto &nested : element->as_array()) { + elements.push_back(std::move(nested)); + } + } else { + elements.push_back(std::move(element.value())); + } + } + + if (!ordered) { + return elements; + } + + auto result{JSON::make_object()}; + result.assign_assume_new(JSON::String{KEYWORD_LIST}, std::move(elements), + KEYWORD_LIST_HASH); + return result; +} + +template +auto materialize_node(const JSONLDNode &descriptor, const JSON &value, + PointerT &pointer, + const JSONLDBasicAnnotationMap &map, + std::vector &standalone) -> JSON { + auto node{JSON::make_object()}; + if (descriptor.id.has_value()) { + node.assign_assume_new(JSON::String{KEYWORD_ID}, + JSON{descriptor.id.value()}, KEYWORD_ID_HASH); + } + if (!descriptor.types.empty()) { + node.assign_assume_new(JSON::String{KEYWORD_TYPE}, + types_to_array(descriptor.types), KEYWORD_TYPE_HASH); + } + + if (!value.is_object()) { + return node; + } + + // A graph node asserts its members in the named graph it identifies, with the + // members carried by a subject node that shares its identifier. + if (descriptor.graph) { + auto inner{JSON::make_object()}; + if (descriptor.id.has_value()) { + inner.assign_assume_new(JSON::String{KEYWORD_ID}, + JSON{descriptor.id.value()}, KEYWORD_ID_HASH); + } + std::vector graph_nodes; + fill_node(inner, value, pointer, map, graph_nodes); + auto graph{JSON::make_array()}; + if (inner.object_size() > (descriptor.id.has_value() ? 1 : 0)) { + graph.push_back(std::move(inner)); + } + for (auto &extra : graph_nodes) { + graph.push_back(std::move(extra)); + } + node.assign_assume_new(JSON::String{KEYWORD_GRAPH}, std::move(graph), + KEYWORD_GRAPH_HASH); + return node; + } + + fill_node(node, value, pointer, map, standalone); + return node; +} + +template +auto materialize_value(const JSON &value, PointerT &pointer, + const JSONLDBasicAnnotationMap &map, + std::vector &standalone) -> std::optional { + if (value.is_null()) { + return std::nullopt; + } + + const auto iterator{map.find(pointer)}; + if (iterator == map.cend()) { + // An undescribed object with described descendants becomes an anonymous + // blank node so its children have a subject. Anything else is not + // annotated. + if (value.is_object()) { + auto node{JSON::make_object()}; + fill_node(node, value, pointer, map, standalone); + if (node.empty()) { + return std::nullopt; + } + return node; + } + return std::nullopt; + } + + const auto &descriptor{iterator->second}; + if (std::holds_alternative(descriptor.value)) { + return materialize_node(std::get(descriptor.value), value, + pointer, map, standalone); + } + if (std::holds_alternative(descriptor.value)) { + return materialize_literal(std::get(descriptor.value), + value); + } + if (std::holds_alternative(descriptor.value)) { + return materialize_reference(std::get(descriptor.value)); + } + + const auto &collection{std::get(descriptor.value)}; + if (!value.is_array()) { + return std::nullopt; + } + return build_collection(value, pointer, map, standalone, collection.ordered); +} + +template +auto fill_node(JSON &node, const JSON &instance_object, PointerT &pointer, + const JSONLDBasicAnnotationMap &map, + std::vector &standalone) -> void { + std::vector> keys; + keys.reserve(instance_object.object_size()); + for (const auto &entry : instance_object.as_object()) { + keys.push_back(std::cref(entry.first)); + } + std::ranges::sort(keys, [](const auto &left, const auto &right) -> bool { + return left.get() < right.get(); + }); + + for (const auto key : keys) { + push_property(pointer, key.get()); + const auto child_iterator{map.find(pointer)}; + auto child_value{materialize_value(instance_object.at(key.get()), pointer, + map, standalone)}; + pointer.pop_back(); + if (!child_value.has_value()) { + continue; + } + + const std::vector *edges{ + child_iterator == map.cend() ? nullptr : &child_iterator->second.edges}; + if (edges == nullptr || edges->empty()) { + // Without an edge a node cannot attach to its parent, so it is asserted + // as a standalone node in the current graph. A non-node cannot be + // asserted. + if (is_node_object(child_value.value())) { + standalone.push_back(std::move(child_value.value())); + } + continue; + } + + attach(node, *edges, std::move(child_value.value())); + } +} + +template +auto materialize_root(const JSON &instance, + const JSONLDBasicAnnotationMap &map) -> JSON { + std::vector standalone; + PointerT pointer; + auto root{materialize_value(instance, pointer, map, standalone)}; + + auto result{JSON::make_array()}; + if (root.has_value()) { + // The default graph may only hold node objects. A top-level value or list + // object, whether the root itself or an element of a root set, carries no + // triples and is dropped. + if (root->is_array()) { + for (auto &element : root->as_array()) { + if (is_node_object(element)) { + result.push_back(std::move(element)); + } + } + } else if (is_node_object(root.value())) { + result.push_back(std::move(root.value())); + } + } + + for (auto &node : standalone) { + result.push_back(std::move(node)); + } + + return result; +} + +} // namespace + +auto jsonld_materialize(const JSON &instance, const JSONLDAnnotationMap &map) + -> JSON { + return materialize_root(instance, map); +} + +auto jsonld_materialize(const JSON &instance, + const JSONLDWeakAnnotationMap &map) -> JSON { + return materialize_root(instance, map); +} + +} // namespace sourcemeta::core diff --git a/vendor/core/src/lang/numeric/decimal.cc b/vendor/core/src/lang/numeric/decimal.cc index 4e0bfbefe..e5d725b92 100644 --- a/vendor/core/src/lang/numeric/decimal.cc +++ b/vendor/core/src/lang/numeric/decimal.cc @@ -721,11 +721,19 @@ auto Decimal::to_uint32() const -> std::uint32_t { } auto Decimal::to_float() const -> float { - return std::stof(this->to_scientific_string()); + try { + return std::stof(this->to_scientific_string()); + } catch (const std::out_of_range &) { + throw NumericOutOfRangeError{}; + } } auto Decimal::to_double() const -> double { - return std::stod(this->to_scientific_string()); + try { + return std::stod(this->to_scientific_string()); + } catch (const std::out_of_range &) { + throw NumericOutOfRangeError{}; + } } auto Decimal::is_zero() const -> bool { diff --git a/vendor/core/src/lang/numeric/include/sourcemeta/core/numeric_error.h b/vendor/core/src/lang/numeric/include/sourcemeta/core/numeric_error.h index 66562bb06..9e1691ef5 100644 --- a/vendor/core/src/lang/numeric/include/sourcemeta/core/numeric_error.h +++ b/vendor/core/src/lang/numeric/include/sourcemeta/core/numeric_error.h @@ -6,6 +6,7 @@ #endif #include // std::exception +#include // std::out_of_range namespace sourcemeta::core { @@ -55,6 +56,16 @@ class SOURCEMETA_CORE_NUMERIC_EXPORT NumericOverflowError } }; +/// @ingroup numeric +/// This class represents a numeric value that falls outside the range of the +/// target type +class SOURCEMETA_CORE_NUMERIC_EXPORT NumericOutOfRangeError + : public std::out_of_range { +public: + NumericOutOfRangeError() + : std::out_of_range{"Numeric value is out of range"} {} +}; + /// @ingroup numeric /// This class represents a numeric out of memory error class SOURCEMETA_CORE_NUMERIC_EXPORT NumericOutOfMemoryError diff --git a/vendor/core/src/lang/numeric/include/sourcemeta/core/numeric_util.h b/vendor/core/src/lang/numeric/include/sourcemeta/core/numeric_util.h index f45f393f1..ec622f3f8 100644 --- a/vendor/core/src/lang/numeric/include/sourcemeta/core/numeric_util.h +++ b/vendor/core/src/lang/numeric/include/sourcemeta/core/numeric_util.h @@ -3,12 +3,14 @@ #include +#include // std::bit_cast #include // assert #include // std::modf, std::floor, std::isfinite #include // std::floating_point, std::integral, std::same_as -#include // std::uint8_t, std::int64_t, std::uint64_t +#include // std::uint8_t, std::int64_t, std::uint64_t, std::uint32_t #include // std::numeric_limits -#include // std::cmp_greater_equal, std::cmp_less_equal +#include // std::conditional_t +#include // std::cmp_greater_equal, std::cmp_less_equal namespace sourcemeta::core { @@ -372,6 +374,53 @@ constexpr auto real_digits(Real value, std::uint64_t &point_position) return static_cast(std::floor(integral_part)); } +/// @ingroup numeric +/// Compare two floating-point values for equality within a small tolerance of +/// four units in the last place, which absorbs the rounding error a typical +/// computation accumulates. A NaN is never equal to anything, and an infinity +/// is equal only to the same infinity. For example: +/// +/// ```cpp +/// #include +/// +/// #include +/// +/// assert(sourcemeta::core::real_equal(0.1 + 0.2, 0.3)); +/// assert(!sourcemeta::core::real_equal(1.0, 2.0)); +/// ``` +template + requires(sizeof(Real) == sizeof(std::uint32_t) || + sizeof(Real) == sizeof(std::uint64_t)) +auto real_equal(const Real left, const Real right) -> bool { + using Bits = std::conditional_t; + + // A NaN equals nothing and an infinity equals only the same infinity, both + // handled exactly here. Only finite values fall through to the tolerance + // below, which would otherwise treat the largest finite value and infinity as + // equal because their encodings are adjacent + if (!std::isfinite(left) || !std::isfinite(right)) { + return left == right; + } + + // Map the sign-and-magnitude bit pattern to a biased ordering in which + // adjacent representable values differ by one, so their distance counts the + // units in the last place between them + constexpr Bits sign_bit{Bits{1} << (8 * sizeof(Bits) - 1)}; + const Bits left_bits{std::bit_cast(left)}; + const Bits right_bits{std::bit_cast(right)}; + const Bits left_biased{(sign_bit & left_bits) != 0 + ? static_cast(~left_bits + Bits{1}) + : static_cast(sign_bit | left_bits)}; + const Bits right_biased{(sign_bit & right_bits) != 0 + ? static_cast(~right_bits + Bits{1}) + : static_cast(sign_bit | right_bits)}; + constexpr Bits maximum_units_in_last_place{4}; + return (left_biased >= right_biased + ? left_biased - right_biased + : right_biased - left_biased) <= maximum_units_in_last_place; +} + } // namespace sourcemeta::core #endif diff --git a/vendor/core/src/lang/test/CMakeLists.txt b/vendor/core/src/lang/test/CMakeLists.txt new file mode 100644 index 000000000..7ddfc6a5a --- /dev/null +++ b/vendor/core/src/lang/test/CMakeLists.txt @@ -0,0 +1,40 @@ +sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME test + SOURCES test.cc) + +if(SOURCEMETA_CORE_INSTALL) + sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME test) +endif() + +target_link_libraries(sourcemeta_core_test + PUBLIC sourcemeta::core::numeric) +target_link_libraries(sourcemeta_core_test + PRIVATE sourcemeta::core::options) +target_link_libraries(sourcemeta_core_test + PRIVATE sourcemeta::core::stacktrace) + +# A dedicated, always-static entry point library. Linking it into every test +# executable provides a default `main()` through static archive resolution, +# while a suite that defines its own `main()` transparently overrides it. This +# mirrors how GoogleTest ships `gtest_main`. +add_library(sourcemeta_core_test_main STATIC test_main.cc) +add_library(sourcemeta::core::test_main ALIAS sourcemeta_core_test_main) +sourcemeta_add_default_options(PRIVATE sourcemeta_core_test_main) +# Public so the dependency propagates to consumers and CMake orders this archive +# ahead of the framework, keeping the entry point's reference to the runner +# resolvable at link time +target_link_libraries(sourcemeta_core_test_main + PUBLIC sourcemeta::core::test) +set_target_properties(sourcemeta_core_test_main + PROPERTIES EXPORT_NAME core::test_main) + +if(SOURCEMETA_CORE_INSTALL) + include(GNUInstallDirs) + install(TARGETS sourcemeta_core_test_main + EXPORT sourcemeta_core_test_main + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + COMPONENT sourcemeta_core_dev) + install(EXPORT sourcemeta_core_test_main + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/core" + NAMESPACE sourcemeta:: + COMPONENT sourcemeta_core_dev) +endif() diff --git a/vendor/core/src/lang/test/include/sourcemeta/core/test.h b/vendor/core/src/lang/test/include/sourcemeta/core/test.h new file mode 100644 index 000000000..83081017a --- /dev/null +++ b/vendor/core/src/lang/test/include/sourcemeta/core/test.h @@ -0,0 +1,329 @@ +#ifndef SOURCEMETA_CORE_TEST_H_ +#define SOURCEMETA_CORE_TEST_H_ + +#ifndef SOURCEMETA_CORE_TEST_EXPORT +#include +#endif + +#include + +#include // std::function +#include // std::ostream +#include // std::source_location +#include // std::ostringstream +#include // std::string +#include // std::string_view +#include // std::is_integral_v, std::is_same_v, std::remove_cv_t +#include // std::cmp_equal, std::cmp_not_equal, std::cmp_less, std::cmp_greater, std::cmp_less_equal, std::cmp_greater_equal + +/// @defgroup test Test +/// @brief A minimal unit testing framework +/// +/// This functionality is included as follows: +/// +/// ```cpp +/// #include +/// ``` + +namespace sourcemeta::core { + +// Exporting symbols that depends on the standard C++ library is considered +// safe. +// https://learn.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-2-c4275?view=msvc-170&redirectedfrom=MSDN +#if defined(_MSC_VER) +#pragma warning(disable : 4251 4275) +#endif + +/// @ingroup test +/// +/// Thrown to abort the current test on the first failed expectation. It does +/// not derive from the standard exception hierarchy so that a broad catch block +/// in a test does not accidentally swallow it. +struct SOURCEMETA_CORE_TEST_EXPORT TestAbortError { + std::string message; +}; + +/// @ingroup test +/// +/// Register a test by name with a callable body. Returns a dummy value so it +/// can be used to initialise a namespace-scope variable. +SOURCEMETA_CORE_TEST_EXPORT +auto test_register(std::string_view suite, std::string_view name, + std::string_view file, int line, std::function body) + -> int; + +/// @ingroup test +/// +/// Register a test case whose suite and source location are taken from the call +/// site. Intended for suites that discover their cases at runtime. +SOURCEMETA_CORE_TEST_EXPORT +auto test_register( + std::string_view name, std::function body, + std::source_location location = std::source_location::current()) -> int; + +/// @ingroup test +/// +/// Print a failure at the given location and abort the current test. +[[noreturn]] SOURCEMETA_CORE_TEST_EXPORT auto +test_report_failure(std::string_view file, int line, std::string_view message) + -> void; + +/// @ingroup test +/// +/// Derive a suite name from a source file path by taking its stem and stripping +/// a trailing `_test` suffix. +SOURCEMETA_CORE_TEST_EXPORT +auto test_suite_from_path(std::string_view path) -> std::string; + +/// @ingroup test +/// +/// Run every registered test, optionally filtered, and return a process exit +/// code. +SOURCEMETA_CORE_TEST_EXPORT +auto test_run(int argc, char **argv) -> int; + +template +concept test_comparable_integer = + std::is_integral_v && !std::is_same_v, bool> && + !std::is_same_v, char> && + !std::is_same_v, wchar_t> && + !std::is_same_v, char8_t> && + !std::is_same_v, char16_t> && + !std::is_same_v, char32_t>; + +template +auto test_compare_equal(const Left &left, const Right &right) -> bool { + if constexpr (test_comparable_integer && + test_comparable_integer) { + return std::cmp_equal(left, right); + } else { + return left == right; + } +} + +template +auto test_compare_not_equal(const Left &left, const Right &right) -> bool { + if constexpr (test_comparable_integer && + test_comparable_integer) { + return std::cmp_not_equal(left, right); + } else { + return left != right; + } +} + +template +auto test_compare_less(const Left &left, const Right &right) -> bool { + if constexpr (test_comparable_integer && + test_comparable_integer) { + return std::cmp_less(left, right); + } else { + return left < right; + } +} + +template +auto test_compare_greater(const Left &left, const Right &right) -> bool { + if constexpr (test_comparable_integer && + test_comparable_integer) { + return std::cmp_greater(left, right); + } else { + return left > right; + } +} + +template +auto test_compare_less_equal(const Left &left, const Right &right) -> bool { + if constexpr (test_comparable_integer && + test_comparable_integer) { + return std::cmp_less_equal(left, right); + } else { + return left <= right; + } +} + +template +auto test_compare_greater_equal(const Left &left, const Right &right) -> bool { + if constexpr (test_comparable_integer && + test_comparable_integer) { + return std::cmp_greater_equal(left, right); + } else { + return left >= right; + } +} + +template auto test_stringify(const Type &value) -> std::string { + if constexpr (requires(std::ostream &stream) { stream << value; }) { + std::ostringstream stream; + stream << value; + return stream.str(); + } else { + return ""; + } +} + +template +auto test_describe_mismatch(std::string_view expression, const Left &left, + const Right &right) -> std::string { + return std::string{"expected "} + std::string{expression} + + "\n actual: " + test_stringify(left) + + "\n expected: " + test_stringify(right); +} + +inline auto test_c_string_equal(const char *const left, const char *const right) + -> bool { + // A null pointer is not a valid string to view, so compare pointers directly + if (left == nullptr || right == nullptr) { + return left == right; + } + + return std::string_view{left} == std::string_view{right}; +} + +inline auto test_c_string_label(const char *const value) -> std::string_view { + return value == nullptr ? std::string_view{"(null)"} + : std::string_view{value}; +} + +// References, rather than values, so that the operands bind without copying and +// without rejecting comparisons of non-copyable types. This aggregate only ever +// lives for the duration of a single comparison call, so the usual hazards of +// reference members do not apply here. +template struct test_operands { + // NOLINTBEGIN(cppcoreguidelines-avoid-const-or-ref-data-members) + const Left &left; + const Right &right; + // NOLINTEND(cppcoreguidelines-avoid-const-or-ref-data-members) +}; + +// Collecting both operands through a single braced initializer keeps their +// temporaries alive for the whole comparison and pins their evaluation to +// left-to-right order. Binding each operand to its own reference inside the +// macro guarantees neither +template +auto test_expect_comparison(std::string_view file, int line, + std::string_view expression, + const test_operands &operands, + Comparator comparator) -> void { + if (!comparator(operands.left, operands.right)) { + test_report_failure( + file, line, + test_describe_mismatch(expression, operands.left, operands.right)); + } +} + +} // namespace sourcemeta::core + +#define SOURCEMETA_CORE_TEST_REGISTER(name) \ + static auto sourcemeta_test_body_##name()->void; \ + [[maybe_unused]] static const int sourcemeta_test_registration_##name = \ + ::sourcemeta::core::test_register( \ + ::sourcemeta::core::test_suite_from_path(__FILE__), #name, __FILE__, \ + __LINE__, &sourcemeta_test_body_##name); \ + static auto sourcemeta_test_body_##name()->void + +#define TEST(name) SOURCEMETA_CORE_TEST_REGISTER(name) + +// The fixture name is used as a base class and in token pasting, neither of +// which can be parenthesized. The registration symbol is keyed on the test name +// alone so that reusing a name within a file is a redefinition error, matching +// the behavior of a plain test. +// NOLINTBEGIN(bugprone-macro-parentheses) +#define SOURCEMETA_CORE_TEST_REGISTER_FIXTURE(fixture, name) \ + namespace { \ + struct sourcemeta_test_fixture_##fixture##_##name final : public fixture { \ + auto sourcemeta_test_body() -> void; \ + }; \ + } \ + [[maybe_unused]] static const int sourcemeta_test_registration_##name = \ + ::sourcemeta::core::test_register( \ + ::sourcemeta::core::test_suite_from_path(__FILE__), #name, __FILE__, \ + __LINE__, [] { \ + sourcemeta_test_fixture_##fixture##_##name instance; \ + instance.sourcemeta_test_body(); \ + }); \ + auto sourcemeta_test_fixture_##fixture##_##name::sourcemeta_test_body()->void +// NOLINTEND(bugprone-macro-parentheses) + +#define TEST_F(fixture, name) \ + SOURCEMETA_CORE_TEST_REGISTER_FIXTURE(fixture, name) + +#define SOURCEMETA_CORE_TEST_COMPARE(actual, expected, comparator, operation) \ + ::sourcemeta::core::test_expect_comparison( \ + __FILE__, __LINE__, #actual " " operation " " #expected, \ + ::sourcemeta::core::test_operands{(actual), (expected)}, \ + [](const auto &sourcemeta_test_left, \ + const auto &sourcemeta_test_right) { \ + return ::sourcemeta::core::comparator(sourcemeta_test_left, \ + sourcemeta_test_right); \ + }) + +#define EXPECT_EQ(actual, expected) \ + SOURCEMETA_CORE_TEST_COMPARE(actual, expected, test_compare_equal, "==") +#define EXPECT_NE(actual, expected) \ + SOURCEMETA_CORE_TEST_COMPARE(actual, expected, test_compare_not_equal, "!=") +#define EXPECT_LT(actual, expected) \ + SOURCEMETA_CORE_TEST_COMPARE(actual, expected, test_compare_less, "<") +#define EXPECT_GT(actual, expected) \ + SOURCEMETA_CORE_TEST_COMPARE(actual, expected, test_compare_greater, ">") +#define EXPECT_LE(actual, expected) \ + SOURCEMETA_CORE_TEST_COMPARE(actual, expected, test_compare_less_equal, "<=") +#define EXPECT_GE(actual, expected) \ + SOURCEMETA_CORE_TEST_COMPARE(actual, expected, test_compare_greater_equal, \ + ">=") + +#define SOURCEMETA_CORE_TEST_COMPARE_FLOATING(actual, expected, type) \ + do { \ + const type sourcemeta_test_actual{static_cast(actual)}; \ + const type sourcemeta_test_expected{static_cast(expected)}; \ + if (!::sourcemeta::core::real_equal(sourcemeta_test_actual, \ + sourcemeta_test_expected)) { \ + ::sourcemeta::core::test_report_failure( \ + __FILE__, __LINE__, \ + ::sourcemeta::core::test_describe_mismatch( \ + #actual " ~= " #expected, sourcemeta_test_actual, \ + sourcemeta_test_expected)); \ + } \ + } while (false) + +#define EXPECT_DOUBLE_EQ(actual, expected) \ + SOURCEMETA_CORE_TEST_COMPARE_FLOATING(actual, expected, double) +#define EXPECT_FLOAT_EQ(actual, expected) \ + SOURCEMETA_CORE_TEST_COMPARE_FLOATING(actual, expected, float) + +#define EXPECT_STREQ(actual, expected) \ + do { \ + const char *const sourcemeta_test_actual{(actual)}; \ + const char *const sourcemeta_test_expected{(expected)}; \ + if (!::sourcemeta::core::test_c_string_equal(sourcemeta_test_actual, \ + sourcemeta_test_expected)) { \ + ::sourcemeta::core::test_report_failure( \ + __FILE__, __LINE__, \ + ::sourcemeta::core::test_describe_mismatch( \ + #actual " == " #expected, \ + ::sourcemeta::core::test_c_string_label(sourcemeta_test_actual), \ + ::sourcemeta::core::test_c_string_label( \ + sourcemeta_test_expected))); \ + } \ + } while (false) + +#define EXPECT_TRUE(condition) \ + do { \ + if (!(condition)) { \ + ::sourcemeta::core::test_report_failure(__FILE__, __LINE__, \ + "expected true: " #condition); \ + } \ + } while (false) + +#define EXPECT_FALSE(condition) \ + do { \ + if ((condition)) { \ + ::sourcemeta::core::test_report_failure(__FILE__, __LINE__, \ + "expected false: " #condition); \ + } \ + } while (false) + +#define FAIL() \ + ::sourcemeta::core::test_report_failure(__FILE__, __LINE__, \ + "explicit failure") + +#endif diff --git a/vendor/core/src/lang/test/test.cc b/vendor/core/src/lang/test/test.cc new file mode 100644 index 000000000..3d76ccc0c --- /dev/null +++ b/vendor/core/src/lang/test/test.cc @@ -0,0 +1,172 @@ +#include +#include +#include + +#include // std::size_t +#include // EXIT_SUCCESS, EXIT_FAILURE +#include // std::exception +#include // std::filesystem::path +#include // std::function +#include // std::cout +#include // std::source_location +#include // std::string +#include // std::move +#include // std::vector + +namespace { + +struct RegisteredTest { + std::string suite; + std::string name; + std::string_view file; + int line; + std::function body; +}; + +auto registry() -> std::vector & { + static std::vector tests; + return tests; +} + +auto base_name(std::string_view path) -> std::string { + return std::filesystem::path{path}.filename().string(); +} + +auto print_usage(std::string_view program) -> void { + std::cout + << "Usage: " << std::filesystem::path{program}.stem().string() + << " [options]\n\n" + << "Run the registered tests.\n\n" + << "Options:\n" + << " -f, --filter Only run tests whose . starts " + "with \n" + << " -h, --help Show this message\n"; +} + +auto print_diagnostic(std::string_view message) -> void { + std::size_t start{0}; + while (start <= message.size()) { + const auto newline{message.find('\n', start)}; + const auto end{newline == std::string_view::npos ? message.size() + : newline}; + std::cout << "# " << message.substr(start, end - start) << "\n"; + if (newline == std::string_view::npos) { + break; + } + + start = newline + 1; + } +} + +} // namespace + +namespace sourcemeta::core { + +auto test_register(std::string_view suite, std::string_view name, + std::string_view file, int line, std::function body) + -> int { + registry().push_back({.suite = std::string{suite}, + .name = std::string{name}, + .file = file, + .line = line, + .body = std::move(body)}); + return 0; +} + +auto test_register(std::string_view name, std::function body, + std::source_location location) -> int { + return test_register(test_suite_from_path(location.file_name()), name, + location.file_name(), static_cast(location.line()), + std::move(body)); +} + +[[noreturn]] auto test_report_failure(std::string_view file, int line, + std::string_view message) -> void { + throw TestAbortError{base_name(file) + ":" + std::to_string(line) + ": " + + std::string{message}}; +} + +auto test_suite_from_path(std::string_view path) -> std::string { + std::string stem{std::filesystem::path{path}.stem().string()}; + static constexpr std::string_view suffix{"_test"}; + if (stem.size() > suffix.size() && stem.ends_with(suffix)) { + stem.erase(stem.size() - suffix.size()); + } + + return stem; +} + +auto test_run(int argc, char **argv) -> int { + sourcemeta::core::stacktrace_on_crash(); + + sourcemeta::core::Options options; + options.option("filter", {"f"}); + options.flag("help", {"h"}); + + try { + options.parse(argc, argv); + } catch (const sourcemeta::core::OptionsError &) { + print_usage(argv[0]); + return EXIT_FAILURE; + } + + if (options.contains("help")) { + print_usage(argv[0]); + // A test binary exists to run tests, so an explicit help request exits with + // failure on purpose. This keeps a stray help invocation from being + // mistaken for a passing test + return EXIT_FAILURE; + } + + std::string_view needle; + if (options.contains("filter") && !options.at("filter").empty()) { + needle = options.at("filter").front(); + } + + std::vector selected; + for (const auto &entry : registry()) { + const std::string identifier{entry.suite + "." + entry.name}; + if (needle.empty() || identifier.starts_with(needle)) { + selected.push_back(&entry); + } + } + + std::cout << "TAP version 14\n"; + std::cout << "1.." << selected.size() << "\n"; + + std::size_t number{0}; + std::size_t passed{0}; + std::size_t failed{0}; + + for (const auto *entry : selected) { + number += 1; + const std::string identifier{entry->suite + "." + entry->name}; + + try { + entry->body(); + std::cout << "ok " << number << " - " << identifier << "\n"; + passed += 1; + } catch (const TestAbortError &error) { + std::cout << "not ok " << number << " - " << identifier << "\n"; + print_diagnostic(error.message); + failed += 1; + } catch (const std::exception &error) { + std::cout << "not ok " << number << " - " << identifier << "\n"; + print_diagnostic(base_name(entry->file) + ":" + + std::to_string(entry->line) + + ": threw an unexpected exception: " + error.what()); + failed += 1; + } catch (...) { + std::cout << "not ok " << number << " - " << identifier << "\n"; + print_diagnostic(base_name(entry->file) + ":" + + std::to_string(entry->line) + + ": threw an unexpected unknown exception"); + failed += 1; + } + } + + std::cout << "# " << passed << " passed, " << failed << " failed\n"; + return failed == 0 ? EXIT_SUCCESS : EXIT_FAILURE; +} + +} // namespace sourcemeta::core diff --git a/vendor/core/src/lang/test/test_main.cc b/vendor/core/src/lang/test/test_main.cc new file mode 100644 index 000000000..71d08ea93 --- /dev/null +++ b/vendor/core/src/lang/test/test_main.cc @@ -0,0 +1,5 @@ +#include + +auto main(int argc, char **argv) -> int { + return sourcemeta::core::test_run(argc, argv); +} diff --git a/vendor/core/vendor/googletest/CMakeLists.txt b/vendor/core/vendor/googletest/CMakeLists.txt deleted file mode 100644 index 9e6d6440d..000000000 --- a/vendor/core/vendor/googletest/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -# Note: CMake support is community-based. The maintainers do not use CMake -# internally. - -cmake_minimum_required(VERSION 3.13) - -project(googletest-distribution) -set(GOOGLETEST_VERSION 1.14.0) - -if(NOT CYGWIN AND NOT MSYS AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL QNX) - set(CMAKE_CXX_EXTENSIONS OFF) -endif() - -enable_testing() - -include(CMakeDependentOption) -include(GNUInstallDirs) - -# Note that googlemock target already builds googletest. -option(BUILD_GMOCK "Builds the googlemock subproject" ON) -option(INSTALL_GTEST "Enable installation of googletest. (Projects embedding googletest may want to turn this OFF.)" ON) -option(GTEST_HAS_ABSL "Use Abseil and RE2. Requires Abseil and RE2 to be separately added to the build." OFF) - -if(GTEST_HAS_ABSL) - if(NOT TARGET absl::base) - find_package(absl REQUIRED) - endif() - if(NOT TARGET re2::re2) - find_package(re2 REQUIRED) - endif() -endif() - -if(BUILD_GMOCK) - add_subdirectory( googlemock ) -else() - add_subdirectory( googletest ) -endif() diff --git a/vendor/core/vendor/googletest/LICENSE b/vendor/core/vendor/googletest/LICENSE deleted file mode 100644 index 1941a11f8..000000000 --- a/vendor/core/vendor/googletest/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2008, Google Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/core/vendor/googletest/googlemock/CMakeLists.txt b/vendor/core/vendor/googletest/googlemock/CMakeLists.txt deleted file mode 100644 index 99b2411f3..000000000 --- a/vendor/core/vendor/googletest/googlemock/CMakeLists.txt +++ /dev/null @@ -1,210 +0,0 @@ -######################################################################## -# Note: CMake support is community-based. The maintainers do not use CMake -# internally. -# -# CMake build script for Google Mock. -# -# To run the tests for Google Mock itself on Linux, use 'make test' or -# ctest. You can select which tests to run using 'ctest -R regex'. -# For more options, run 'ctest --help'. - -option(gmock_build_tests "Build all of Google Mock's own tests." OFF) - -# A directory to find Google Test sources. -if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/gtest/CMakeLists.txt") - set(gtest_dir gtest) -else() - set(gtest_dir ../googletest) -endif() - -# Defines pre_project_set_up_hermetic_build() and set_up_hermetic_build(). -include("${gtest_dir}/cmake/hermetic_build.cmake" OPTIONAL) - -if (COMMAND pre_project_set_up_hermetic_build) - # Google Test also calls hermetic setup functions from add_subdirectory, - # although its changes will not affect things at the current scope. - pre_project_set_up_hermetic_build() -endif() - -######################################################################## -# -# Project-wide settings - -# Name of the project. -# -# CMake files in this project can refer to the root source directory -# as ${gmock_SOURCE_DIR} and to the root binary directory as -# ${gmock_BINARY_DIR}. -# Language "C" is required for find_package(Threads). -cmake_minimum_required(VERSION 3.13) -project(gmock VERSION ${GOOGLETEST_VERSION} LANGUAGES CXX C) - -if (COMMAND set_up_hermetic_build) - set_up_hermetic_build() -endif() - -# Instructs CMake to process Google Test's CMakeLists.txt and add its -# targets to the current scope. We are placing Google Test's binary -# directory in a subdirectory of our own as VC compilation may break -# if they are the same (the default). -add_subdirectory("${gtest_dir}" "${gmock_BINARY_DIR}/${gtest_dir}") - - -# These commands only run if this is the main project -if(CMAKE_PROJECT_NAME STREQUAL "gmock" OR CMAKE_PROJECT_NAME STREQUAL "googletest-distribution") - # BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to - # make it prominent in the GUI. - option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF) -else() - mark_as_advanced(gmock_build_tests) -endif() - -# Although Google Test's CMakeLists.txt calls this function, the -# changes there don't affect the current scope. Therefore we have to -# call it again here. -config_compiler_and_linker() # from ${gtest_dir}/cmake/internal_utils.cmake - -# Adds Google Mock's and Google Test's header directories to the search path. -# Get Google Test's include dirs from the target, gtest_SOURCE_DIR is broken -# when using fetch-content with the name "GTest". -get_target_property(gtest_include_dirs gtest INCLUDE_DIRECTORIES) -set(gmock_build_include_dirs - "${gmock_SOURCE_DIR}/include" - "${gmock_SOURCE_DIR}" - "${gtest_include_dirs}") -include_directories(${gmock_build_include_dirs}) - -######################################################################## -# -# Defines the gmock & gmock_main libraries. User tests should link -# with one of them. - -# Google Mock libraries. We build them using more strict warnings than what -# are used for other targets, to ensure that Google Mock can be compiled by -# a user aggressive about warnings. -if (MSVC) - cxx_library(gmock - "${cxx_strict}" - "${gtest_dir}/src/gtest-all.cc" - src/gmock-all.cc) - - cxx_library(gmock_main - "${cxx_strict}" - "${gtest_dir}/src/gtest-all.cc" - src/gmock-all.cc - src/gmock_main.cc) -else() - cxx_library(gmock "${cxx_strict}" src/gmock-all.cc) - target_link_libraries(gmock PUBLIC gtest) - set_target_properties(gmock PROPERTIES VERSION ${GOOGLETEST_VERSION}) - cxx_library(gmock_main "${cxx_strict}" src/gmock_main.cc) - target_link_libraries(gmock_main PUBLIC gmock) - set_target_properties(gmock_main PROPERTIES VERSION ${GOOGLETEST_VERSION}) -endif() - -string(REPLACE ";" "$" dirs "${gmock_build_include_dirs}") -target_include_directories(gmock SYSTEM INTERFACE - "$" - "$/${CMAKE_INSTALL_INCLUDEDIR}>") -target_include_directories(gmock_main SYSTEM INTERFACE - "$" - "$/${CMAKE_INSTALL_INCLUDEDIR}>") - -######################################################################## -# -# Install rules. -install_project(gmock gmock_main) - -######################################################################## -# -# Google Mock's own tests. -# -# You can skip this section if you aren't interested in testing -# Google Mock itself. -# -# The tests are not built by default. To build them, set the -# gmock_build_tests option to ON. You can do it by running ccmake -# or specifying the -Dgmock_build_tests=ON flag when running cmake. - -if (gmock_build_tests) - # This must be set in the root directory for the tests to be run by - # 'make test' or ctest. - enable_testing() - - if (MINGW OR CYGWIN) - add_compile_options("-Wa,-mbig-obj") - endif() - - ############################################################ - # C++ tests built with standard compiler flags. - - cxx_test(gmock-actions_test gmock_main) - cxx_test(gmock-cardinalities_test gmock_main) - cxx_test(gmock_ex_test gmock_main) - cxx_test(gmock-function-mocker_test gmock_main) - cxx_test(gmock-internal-utils_test gmock_main) - cxx_test(gmock-matchers-arithmetic_test gmock_main) - cxx_test(gmock-matchers-comparisons_test gmock_main) - cxx_test(gmock-matchers-containers_test gmock_main) - cxx_test(gmock-matchers-misc_test gmock_main) - cxx_test(gmock-more-actions_test gmock_main) - cxx_test(gmock-nice-strict_test gmock_main) - cxx_test(gmock-port_test gmock_main) - cxx_test(gmock-spec-builders_test gmock_main) - cxx_test(gmock_link_test gmock_main test/gmock_link2_test.cc) - cxx_test(gmock_test gmock_main) - - if (DEFINED GTEST_HAS_PTHREAD) - cxx_test(gmock_stress_test gmock) - endif() - - # gmock_all_test is commented to save time building and running tests. - # Uncomment if necessary. - # cxx_test(gmock_all_test gmock_main) - - ############################################################ - # C++ tests built with non-standard compiler flags. - - if (MSVC) - cxx_library(gmock_main_no_exception "${cxx_no_exception}" - "${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc) - - cxx_library(gmock_main_no_rtti "${cxx_no_rtti}" - "${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc) - - else() - cxx_library(gmock_main_no_exception "${cxx_no_exception}" src/gmock_main.cc) - target_link_libraries(gmock_main_no_exception PUBLIC gmock) - - cxx_library(gmock_main_no_rtti "${cxx_no_rtti}" src/gmock_main.cc) - target_link_libraries(gmock_main_no_rtti PUBLIC gmock) - endif() - cxx_test_with_flags(gmock-more-actions_no_exception_test "${cxx_no_exception}" - gmock_main_no_exception test/gmock-more-actions_test.cc) - - cxx_test_with_flags(gmock_no_rtti_test "${cxx_no_rtti}" - gmock_main_no_rtti test/gmock-spec-builders_test.cc) - - cxx_shared_library(shared_gmock_main "${cxx_default}" - "${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc) - - # Tests that a binary can be built with Google Mock as a shared library. On - # some system configurations, it may not possible to run the binary without - # knowing more details about the system configurations. We do not try to run - # this binary. To get a more robust shared library coverage, configure with - # -DBUILD_SHARED_LIBS=ON. - cxx_executable_with_flags(shared_gmock_test_ "${cxx_default}" - shared_gmock_main test/gmock-spec-builders_test.cc) - set_target_properties(shared_gmock_test_ - PROPERTIES - COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1") - - ############################################################ - # Python tests. - - cxx_executable(gmock_leak_test_ test gmock_main) - py_test(gmock_leak_test) - - cxx_executable(gmock_output_test_ test gmock) - py_test(gmock_output_test) -endif() diff --git a/vendor/core/vendor/googletest/googlemock/cmake/gmock.pc.in b/vendor/core/vendor/googletest/googlemock/cmake/gmock.pc.in deleted file mode 100644 index 23c67b5c8..000000000 --- a/vendor/core/vendor/googletest/googlemock/cmake/gmock.pc.in +++ /dev/null @@ -1,10 +0,0 @@ -libdir=@CMAKE_INSTALL_FULL_LIBDIR@ -includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ - -Name: gmock -Description: GoogleMock (without main() function) -Version: @PROJECT_VERSION@ -URL: https://github.com/google/googletest -Requires: gtest = @PROJECT_VERSION@ -Libs: -L${libdir} -lgmock @CMAKE_THREAD_LIBS_INIT@ -Cflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ diff --git a/vendor/core/vendor/googletest/googlemock/cmake/gmock_main.pc.in b/vendor/core/vendor/googletest/googlemock/cmake/gmock_main.pc.in deleted file mode 100644 index 66ffea7f4..000000000 --- a/vendor/core/vendor/googletest/googlemock/cmake/gmock_main.pc.in +++ /dev/null @@ -1,10 +0,0 @@ -libdir=@CMAKE_INSTALL_FULL_LIBDIR@ -includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ - -Name: gmock_main -Description: GoogleMock (with main() function) -Version: @PROJECT_VERSION@ -URL: https://github.com/google/googletest -Requires: gmock = @PROJECT_VERSION@ -Libs: -L${libdir} -lgmock_main @CMAKE_THREAD_LIBS_INIT@ -Cflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ diff --git a/vendor/core/vendor/googletest/googlemock/include/gmock/gmock-actions.h b/vendor/core/vendor/googletest/googlemock/include/gmock/gmock-actions.h deleted file mode 100644 index cd1299695..000000000 --- a/vendor/core/vendor/googletest/googlemock/include/gmock/gmock-actions.h +++ /dev/null @@ -1,2321 +0,0 @@ -// Copyright 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Google Mock - a framework for writing C++ mock classes. -// -// The ACTION* family of macros can be used in a namespace scope to -// define custom actions easily. The syntax: -// -// ACTION(name) { statements; } -// -// will define an action with the given name that executes the -// statements. The value returned by the statements will be used as -// the return value of the action. Inside the statements, you can -// refer to the K-th (0-based) argument of the mock function by -// 'argK', and refer to its type by 'argK_type'. For example: -// -// ACTION(IncrementArg1) { -// arg1_type temp = arg1; -// return ++(*temp); -// } -// -// allows you to write -// -// ...WillOnce(IncrementArg1()); -// -// You can also refer to the entire argument tuple and its type by -// 'args' and 'args_type', and refer to the mock function type and its -// return type by 'function_type' and 'return_type'. -// -// Note that you don't need to specify the types of the mock function -// arguments. However rest assured that your code is still type-safe: -// you'll get a compiler error if *arg1 doesn't support the ++ -// operator, or if the type of ++(*arg1) isn't compatible with the -// mock function's return type, for example. -// -// Sometimes you'll want to parameterize the action. For that you can use -// another macro: -// -// ACTION_P(name, param_name) { statements; } -// -// For example: -// -// ACTION_P(Add, n) { return arg0 + n; } -// -// will allow you to write: -// -// ...WillOnce(Add(5)); -// -// Note that you don't need to provide the type of the parameter -// either. If you need to reference the type of a parameter named -// 'foo', you can write 'foo_type'. For example, in the body of -// ACTION_P(Add, n) above, you can write 'n_type' to refer to the type -// of 'n'. -// -// We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P10 to support -// multi-parameter actions. -// -// For the purpose of typing, you can view -// -// ACTION_Pk(Foo, p1, ..., pk) { ... } -// -// as shorthand for -// -// template -// FooActionPk Foo(p1_type p1, ..., pk_type pk) { ... } -// -// In particular, you can provide the template type arguments -// explicitly when invoking Foo(), as in Foo(5, false); -// although usually you can rely on the compiler to infer the types -// for you automatically. You can assign the result of expression -// Foo(p1, ..., pk) to a variable of type FooActionPk. This can be useful when composing actions. -// -// You can also overload actions with different numbers of parameters: -// -// ACTION_P(Plus, a) { ... } -// ACTION_P2(Plus, a, b) { ... } -// -// While it's tempting to always use the ACTION* macros when defining -// a new action, you should also consider implementing ActionInterface -// or using MakePolymorphicAction() instead, especially if you need to -// use the action a lot. While these approaches require more work, -// they give you more control on the types of the mock function -// arguments and the action parameters, which in general leads to -// better compiler error messages that pay off in the long run. They -// also allow overloading actions based on parameter types (as opposed -// to just based on the number of parameters). -// -// CAVEAT: -// -// ACTION*() can only be used in a namespace scope as templates cannot be -// declared inside of a local class. -// Users can, however, define any local functors (e.g. a lambda) that -// can be used as actions. -// -// MORE INFORMATION: -// -// To learn more about using these macros, please search for 'ACTION' on -// https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md - -// IWYU pragma: private, include "gmock/gmock.h" -// IWYU pragma: friend gmock/.* - -#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ -#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ - -#ifndef _WIN32_WCE -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "gmock/internal/gmock-internal-utils.h" -#include "gmock/internal/gmock-port.h" -#include "gmock/internal/gmock-pp.h" - -GTEST_DISABLE_MSC_WARNINGS_PUSH_(4100) - -namespace testing { - -// To implement an action Foo, define: -// 1. a class FooAction that implements the ActionInterface interface, and -// 2. a factory function that creates an Action object from a -// const FooAction*. -// -// The two-level delegation design follows that of Matcher, providing -// consistency for extension developers. It also eases ownership -// management as Action objects can now be copied like plain values. - -namespace internal { - -// BuiltInDefaultValueGetter::Get() returns a -// default-constructed T value. BuiltInDefaultValueGetter::Get() crashes with an error. -// -// This primary template is used when kDefaultConstructible is true. -template -struct BuiltInDefaultValueGetter { - static T Get() { return T(); } -}; -template -struct BuiltInDefaultValueGetter { - static T Get() { - Assert(false, __FILE__, __LINE__, - "Default action undefined for the function return type."); -#if defined(__GNUC__) || defined(__clang__) - __builtin_unreachable(); -#elif defined(_MSC_VER) - __assume(0); -#else - return Invalid(); - // The above statement will never be reached, but is required in - // order for this function to compile. -#endif - } -}; - -// BuiltInDefaultValue::Get() returns the "built-in" default value -// for type T, which is NULL when T is a raw pointer type, 0 when T is -// a numeric type, false when T is bool, or "" when T is string or -// std::string. In addition, in C++11 and above, it turns a -// default-constructed T value if T is default constructible. For any -// other type T, the built-in default T value is undefined, and the -// function will abort the process. -template -class BuiltInDefaultValue { - public: - // This function returns true if and only if type T has a built-in default - // value. - static bool Exists() { return ::std::is_default_constructible::value; } - - static T Get() { - return BuiltInDefaultValueGetter< - T, ::std::is_default_constructible::value>::Get(); - } -}; - -// This partial specialization says that we use the same built-in -// default value for T and const T. -template -class BuiltInDefaultValue { - public: - static bool Exists() { return BuiltInDefaultValue::Exists(); } - static T Get() { return BuiltInDefaultValue::Get(); } -}; - -// This partial specialization defines the default values for pointer -// types. -template -class BuiltInDefaultValue { - public: - static bool Exists() { return true; } - static T* Get() { return nullptr; } -}; - -// The following specializations define the default values for -// specific types we care about. -#define GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(type, value) \ - template <> \ - class BuiltInDefaultValue { \ - public: \ - static bool Exists() { return true; } \ - static type Get() { return value; } \ - } - -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(void, ); // NOLINT -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::std::string, ""); -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(bool, false); -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned char, '\0'); -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed char, '\0'); -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(char, '\0'); - -// There's no need for a default action for signed wchar_t, as that -// type is the same as wchar_t for gcc, and invalid for MSVC. -// -// There's also no need for a default action for unsigned wchar_t, as -// that type is the same as unsigned int for gcc, and invalid for -// MSVC. -#if GMOCK_WCHAR_T_IS_NATIVE_ -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(wchar_t, 0U); // NOLINT -#endif - -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned short, 0U); // NOLINT -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed short, 0); // NOLINT -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned int, 0U); -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed int, 0); -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned long, 0UL); // NOLINT -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed long, 0L); // NOLINT -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned long long, 0); // NOLINT -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed long long, 0); // NOLINT -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(float, 0); -GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(double, 0); - -#undef GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_ - -// Partial implementations of metaprogramming types from the standard library -// not available in C++11. - -template -struct negation - // NOLINTNEXTLINE - : std::integral_constant {}; - -// Base case: with zero predicates the answer is always true. -template -struct conjunction : std::true_type {}; - -// With a single predicate, the answer is that predicate. -template -struct conjunction : P1 {}; - -// With multiple predicates the answer is the first predicate if that is false, -// and we recurse otherwise. -template -struct conjunction - : std::conditional, P1>::type {}; - -template -struct disjunction : std::false_type {}; - -template -struct disjunction : P1 {}; - -template -struct disjunction - // NOLINTNEXTLINE - : std::conditional, P1>::type {}; - -template -using void_t = void; - -// Detects whether an expression of type `From` can be implicitly converted to -// `To` according to [conv]. In C++17, [conv]/3 defines this as follows: -// -// An expression e can be implicitly converted to a type T if and only if -// the declaration T t=e; is well-formed, for some invented temporary -// variable t ([dcl.init]). -// -// [conv]/2 implies we can use function argument passing to detect whether this -// initialization is valid. -// -// Note that this is distinct from is_convertible, which requires this be valid: -// -// To test() { -// return declval(); -// } -// -// In particular, is_convertible doesn't give the correct answer when `To` and -// `From` are the same non-moveable type since `declval` will be an rvalue -// reference, defeating the guaranteed copy elision that would otherwise make -// this function work. -// -// REQUIRES: `From` is not cv void. -template -struct is_implicitly_convertible { - private: - // A function that accepts a parameter of type T. This can be called with type - // U successfully only if U is implicitly convertible to T. - template - static void Accept(T); - - // A function that creates a value of type T. - template - static T Make(); - - // An overload be selected when implicit conversion from T to To is possible. - template (Make()))> - static std::true_type TestImplicitConversion(int); - - // A fallback overload selected in all other cases. - template - static std::false_type TestImplicitConversion(...); - - public: - using type = decltype(TestImplicitConversion(0)); - static constexpr bool value = type::value; -}; - -// Like std::invoke_result_t from C++17, but works only for objects with call -// operators (not e.g. member function pointers, which we don't need specific -// support for in OnceAction because std::function deals with them). -template -using call_result_t = decltype(std::declval()(std::declval()...)); - -template -struct is_callable_r_impl : std::false_type {}; - -// Specialize the struct for those template arguments where call_result_t is -// well-formed. When it's not, the generic template above is chosen, resulting -// in std::false_type. -template -struct is_callable_r_impl>, R, F, Args...> - : std::conditional< - std::is_void::value, // - std::true_type, // - is_implicitly_convertible, R>>::type {}; - -// Like std::is_invocable_r from C++17, but works only for objects with call -// operators. See the note on call_result_t. -template -using is_callable_r = is_callable_r_impl; - -// Like std::as_const from C++17. -template -typename std::add_const::type& as_const(T& t) { - return t; -} - -} // namespace internal - -// Specialized for function types below. -template -class OnceAction; - -// An action that can only be used once. -// -// This is accepted by WillOnce, which doesn't require the underlying action to -// be copy-constructible (only move-constructible), and promises to invoke it as -// an rvalue reference. This allows the action to work with move-only types like -// std::move_only_function in a type-safe manner. -// -// For example: -// -// // Assume we have some API that needs to accept a unique pointer to some -// // non-copyable object Foo. -// void AcceptUniquePointer(std::unique_ptr foo); -// -// // We can define an action that provides a Foo to that API. Because It -// // has to give away its unique pointer, it must not be called more than -// // once, so its call operator is &&-qualified. -// struct ProvideFoo { -// std::unique_ptr foo; -// -// void operator()() && { -// AcceptUniquePointer(std::move(Foo)); -// } -// }; -// -// // This action can be used with WillOnce. -// EXPECT_CALL(mock, Call) -// .WillOnce(ProvideFoo{std::make_unique(...)}); -// -// // But a call to WillRepeatedly will fail to compile. This is correct, -// // since the action cannot correctly be used repeatedly. -// EXPECT_CALL(mock, Call) -// .WillRepeatedly(ProvideFoo{std::make_unique(...)}); -// -// A less-contrived example would be an action that returns an arbitrary type, -// whose &&-qualified call operator is capable of dealing with move-only types. -template -class OnceAction final { - private: - // True iff we can use the given callable type (or lvalue reference) directly - // via StdFunctionAdaptor. - template - using IsDirectlyCompatible = internal::conjunction< - // It must be possible to capture the callable in StdFunctionAdaptor. - std::is_constructible::type, Callable>, - // The callable must be compatible with our signature. - internal::is_callable_r::type, - Args...>>; - - // True iff we can use the given callable type via StdFunctionAdaptor once we - // ignore incoming arguments. - template - using IsCompatibleAfterIgnoringArguments = internal::conjunction< - // It must be possible to capture the callable in a lambda. - std::is_constructible::type, Callable>, - // The callable must be invocable with zero arguments, returning something - // convertible to Result. - internal::is_callable_r::type>>; - - public: - // Construct from a callable that is directly compatible with our mocked - // signature: it accepts our function type's arguments and returns something - // convertible to our result type. - template ::type>>, - IsDirectlyCompatible> // - ::value, - int>::type = 0> - OnceAction(Callable&& callable) // NOLINT - : function_(StdFunctionAdaptor::type>( - {}, std::forward(callable))) {} - - // As above, but for a callable that ignores the mocked function's arguments. - template ::type>>, - // Exclude callables for which the overload above works. - // We'd rather provide the arguments if possible. - internal::negation>, - IsCompatibleAfterIgnoringArguments>::value, - int>::type = 0> - OnceAction(Callable&& callable) // NOLINT - // Call the constructor above with a callable - // that ignores the input arguments. - : OnceAction(IgnoreIncomingArguments::type>{ - std::forward(callable)}) {} - - // We are naturally copyable because we store only an std::function, but - // semantically we should not be copyable. - OnceAction(const OnceAction&) = delete; - OnceAction& operator=(const OnceAction&) = delete; - OnceAction(OnceAction&&) = default; - - // Invoke the underlying action callable with which we were constructed, - // handing it the supplied arguments. - Result Call(Args... args) && { - return function_(std::forward(args)...); - } - - private: - // An adaptor that wraps a callable that is compatible with our signature and - // being invoked as an rvalue reference so that it can be used as an - // StdFunctionAdaptor. This throws away type safety, but that's fine because - // this is only used by WillOnce, which we know calls at most once. - // - // Once we have something like std::move_only_function from C++23, we can do - // away with this. - template - class StdFunctionAdaptor final { - public: - // A tag indicating that the (otherwise universal) constructor is accepting - // the callable itself, instead of e.g. stealing calls for the move - // constructor. - struct CallableTag final {}; - - template - explicit StdFunctionAdaptor(CallableTag, F&& callable) - : callable_(std::make_shared(std::forward(callable))) {} - - // Rather than explicitly returning Result, we return whatever the wrapped - // callable returns. This allows for compatibility with existing uses like - // the following, when the mocked function returns void: - // - // EXPECT_CALL(mock_fn_, Call) - // .WillOnce([&] { - // [...] - // return 0; - // }); - // - // Such a callable can be turned into std::function. If we use an - // explicit return type of Result here then it *doesn't* work with - // std::function, because we'll get a "void function should not return a - // value" error. - // - // We need not worry about incompatible result types because the SFINAE on - // OnceAction already checks this for us. std::is_invocable_r_v itself makes - // the same allowance for void result types. - template - internal::call_result_t operator()( - ArgRefs&&... args) const { - return std::move(*callable_)(std::forward(args)...); - } - - private: - // We must put the callable on the heap so that we are copyable, which - // std::function needs. - std::shared_ptr callable_; - }; - - // An adaptor that makes a callable that accepts zero arguments callable with - // our mocked arguments. - template - struct IgnoreIncomingArguments { - internal::call_result_t operator()(Args&&...) { - return std::move(callable)(); - } - - Callable callable; - }; - - std::function function_; -}; - -// When an unexpected function call is encountered, Google Mock will -// let it return a default value if the user has specified one for its -// return type, or if the return type has a built-in default value; -// otherwise Google Mock won't know what value to return and will have -// to abort the process. -// -// The DefaultValue class allows a user to specify the -// default value for a type T that is both copyable and publicly -// destructible (i.e. anything that can be used as a function return -// type). The usage is: -// -// // Sets the default value for type T to be foo. -// DefaultValue::Set(foo); -template -class DefaultValue { - public: - // Sets the default value for type T; requires T to be - // copy-constructable and have a public destructor. - static void Set(T x) { - delete producer_; - producer_ = new FixedValueProducer(x); - } - - // Provides a factory function to be called to generate the default value. - // This method can be used even if T is only move-constructible, but it is not - // limited to that case. - typedef T (*FactoryFunction)(); - static void SetFactory(FactoryFunction factory) { - delete producer_; - producer_ = new FactoryValueProducer(factory); - } - - // Unsets the default value for type T. - static void Clear() { - delete producer_; - producer_ = nullptr; - } - - // Returns true if and only if the user has set the default value for type T. - static bool IsSet() { return producer_ != nullptr; } - - // Returns true if T has a default return value set by the user or there - // exists a built-in default value. - static bool Exists() { - return IsSet() || internal::BuiltInDefaultValue::Exists(); - } - - // Returns the default value for type T if the user has set one; - // otherwise returns the built-in default value. Requires that Exists() - // is true, which ensures that the return value is well-defined. - static T Get() { - return producer_ == nullptr ? internal::BuiltInDefaultValue::Get() - : producer_->Produce(); - } - - private: - class ValueProducer { - public: - virtual ~ValueProducer() = default; - virtual T Produce() = 0; - }; - - class FixedValueProducer : public ValueProducer { - public: - explicit FixedValueProducer(T value) : value_(value) {} - T Produce() override { return value_; } - - private: - const T value_; - FixedValueProducer(const FixedValueProducer&) = delete; - FixedValueProducer& operator=(const FixedValueProducer&) = delete; - }; - - class FactoryValueProducer : public ValueProducer { - public: - explicit FactoryValueProducer(FactoryFunction factory) - : factory_(factory) {} - T Produce() override { return factory_(); } - - private: - const FactoryFunction factory_; - FactoryValueProducer(const FactoryValueProducer&) = delete; - FactoryValueProducer& operator=(const FactoryValueProducer&) = delete; - }; - - static ValueProducer* producer_; -}; - -// This partial specialization allows a user to set default values for -// reference types. -template -class DefaultValue { - public: - // Sets the default value for type T&. - static void Set(T& x) { // NOLINT - address_ = &x; - } - - // Unsets the default value for type T&. - static void Clear() { address_ = nullptr; } - - // Returns true if and only if the user has set the default value for type T&. - static bool IsSet() { return address_ != nullptr; } - - // Returns true if T has a default return value set by the user or there - // exists a built-in default value. - static bool Exists() { - return IsSet() || internal::BuiltInDefaultValue::Exists(); - } - - // Returns the default value for type T& if the user has set one; - // otherwise returns the built-in default value if there is one; - // otherwise aborts the process. - static T& Get() { - return address_ == nullptr ? internal::BuiltInDefaultValue::Get() - : *address_; - } - - private: - static T* address_; -}; - -// This specialization allows DefaultValue::Get() to -// compile. -template <> -class DefaultValue { - public: - static bool Exists() { return true; } - static void Get() {} -}; - -// Points to the user-set default value for type T. -template -typename DefaultValue::ValueProducer* DefaultValue::producer_ = nullptr; - -// Points to the user-set default value for type T&. -template -T* DefaultValue::address_ = nullptr; - -// Implement this interface to define an action for function type F. -template -class ActionInterface { - public: - typedef typename internal::Function::Result Result; - typedef typename internal::Function::ArgumentTuple ArgumentTuple; - - ActionInterface() = default; - virtual ~ActionInterface() = default; - - // Performs the action. This method is not const, as in general an - // action can have side effects and be stateful. For example, a - // get-the-next-element-from-the-collection action will need to - // remember the current element. - virtual Result Perform(const ArgumentTuple& args) = 0; - - private: - ActionInterface(const ActionInterface&) = delete; - ActionInterface& operator=(const ActionInterface&) = delete; -}; - -template -class Action; - -// An Action is a copyable and IMMUTABLE (except by assignment) -// object that represents an action to be taken when a mock function of type -// R(Args...) is called. The implementation of Action is just a -// std::shared_ptr to const ActionInterface. Don't inherit from Action! You -// can view an object implementing ActionInterface as a concrete action -// (including its current state), and an Action object as a handle to it. -template -class Action { - private: - using F = R(Args...); - - // Adapter class to allow constructing Action from a legacy ActionInterface. - // New code should create Actions from functors instead. - struct ActionAdapter { - // Adapter must be copyable to satisfy std::function requirements. - ::std::shared_ptr> impl_; - - template - typename internal::Function::Result operator()(InArgs&&... args) { - return impl_->Perform( - ::std::forward_as_tuple(::std::forward(args)...)); - } - }; - - template - using IsCompatibleFunctor = std::is_constructible, G>; - - public: - typedef typename internal::Function::Result Result; - typedef typename internal::Function::ArgumentTuple ArgumentTuple; - - // Constructs a null Action. Needed for storing Action objects in - // STL containers. - Action() = default; - - // Construct an Action from a specified callable. - // This cannot take std::function directly, because then Action would not be - // directly constructible from lambda (it would require two conversions). - template < - typename G, - typename = typename std::enable_if, std::is_constructible, - G>>::value>::type> - Action(G&& fun) { // NOLINT - Init(::std::forward(fun), IsCompatibleFunctor()); - } - - // Constructs an Action from its implementation. - explicit Action(ActionInterface* impl) - : fun_(ActionAdapter{::std::shared_ptr>(impl)}) {} - - // This constructor allows us to turn an Action object into an - // Action, as long as F's arguments can be implicitly converted - // to Func's and Func's return type can be implicitly converted to F's. - template - Action(const Action& action) // NOLINT - : fun_(action.fun_) {} - - // Returns true if and only if this is the DoDefault() action. - bool IsDoDefault() const { return fun_ == nullptr; } - - // Performs the action. Note that this method is const even though - // the corresponding method in ActionInterface is not. The reason - // is that a const Action means that it cannot be re-bound to - // another concrete action, not that the concrete action it binds to - // cannot change state. (Think of the difference between a const - // pointer and a pointer to const.) - Result Perform(ArgumentTuple args) const { - if (IsDoDefault()) { - internal::IllegalDoDefault(__FILE__, __LINE__); - } - return internal::Apply(fun_, ::std::move(args)); - } - - // An action can be used as a OnceAction, since it's obviously safe to call it - // once. - operator OnceAction() const { // NOLINT - // Return a OnceAction-compatible callable that calls Perform with the - // arguments it is provided. We could instead just return fun_, but then - // we'd need to handle the IsDoDefault() case separately. - struct OA { - Action action; - - R operator()(Args... args) && { - return action.Perform( - std::forward_as_tuple(std::forward(args)...)); - } - }; - - return OA{*this}; - } - - private: - template - friend class Action; - - template - void Init(G&& g, ::std::true_type) { - fun_ = ::std::forward(g); - } - - template - void Init(G&& g, ::std::false_type) { - fun_ = IgnoreArgs::type>{::std::forward(g)}; - } - - template - struct IgnoreArgs { - template - Result operator()(const InArgs&...) const { - return function_impl(); - } - - FunctionImpl function_impl; - }; - - // fun_ is an empty function if and only if this is the DoDefault() action. - ::std::function fun_; -}; - -// The PolymorphicAction class template makes it easy to implement a -// polymorphic action (i.e. an action that can be used in mock -// functions of than one type, e.g. Return()). -// -// To define a polymorphic action, a user first provides a COPYABLE -// implementation class that has a Perform() method template: -// -// class FooAction { -// public: -// template -// Result Perform(const ArgumentTuple& args) const { -// // Processes the arguments and returns a result, using -// // std::get(args) to get the N-th (0-based) argument in the tuple. -// } -// ... -// }; -// -// Then the user creates the polymorphic action using -// MakePolymorphicAction(object) where object has type FooAction. See -// the definition of Return(void) and SetArgumentPointee(value) for -// complete examples. -template -class PolymorphicAction { - public: - explicit PolymorphicAction(const Impl& impl) : impl_(impl) {} - - template - operator Action() const { - return Action(new MonomorphicImpl(impl_)); - } - - private: - template - class MonomorphicImpl : public ActionInterface { - public: - typedef typename internal::Function::Result Result; - typedef typename internal::Function::ArgumentTuple ArgumentTuple; - - explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} - - Result Perform(const ArgumentTuple& args) override { - return impl_.template Perform(args); - } - - private: - Impl impl_; - }; - - Impl impl_; -}; - -// Creates an Action from its implementation and returns it. The -// created Action object owns the implementation. -template -Action MakeAction(ActionInterface* impl) { - return Action(impl); -} - -// Creates a polymorphic action from its implementation. This is -// easier to use than the PolymorphicAction constructor as it -// doesn't require you to explicitly write the template argument, e.g. -// -// MakePolymorphicAction(foo); -// vs -// PolymorphicAction(foo); -template -inline PolymorphicAction MakePolymorphicAction(const Impl& impl) { - return PolymorphicAction(impl); -} - -namespace internal { - -// Helper struct to specialize ReturnAction to execute a move instead of a copy -// on return. Useful for move-only types, but could be used on any type. -template -struct ByMoveWrapper { - explicit ByMoveWrapper(T value) : payload(std::move(value)) {} - T payload; -}; - -// The general implementation of Return(R). Specializations follow below. -template -class ReturnAction final { - public: - explicit ReturnAction(R value) : value_(std::move(value)) {} - - template >, // - negation>, // - std::is_convertible, // - std::is_move_constructible>::value>::type> - operator OnceAction() && { // NOLINT - return Impl(std::move(value_)); - } - - template >, // - negation>, // - std::is_convertible, // - std::is_copy_constructible>::value>::type> - operator Action() const { // NOLINT - return Impl(value_); - } - - private: - // Implements the Return(x) action for a mock function that returns type U. - template - class Impl final { - public: - // The constructor used when the return value is allowed to move from the - // input value (i.e. we are converting to OnceAction). - explicit Impl(R&& input_value) - : state_(new State(std::move(input_value))) {} - - // The constructor used when the return value is not allowed to move from - // the input value (i.e. we are converting to Action). - explicit Impl(const R& input_value) : state_(new State(input_value)) {} - - U operator()() && { return std::move(state_->value); } - U operator()() const& { return state_->value; } - - private: - // We put our state on the heap so that the compiler-generated copy/move - // constructors work correctly even when U is a reference-like type. This is - // necessary only because we eagerly create State::value (see the note on - // that symbol for details). If we instead had only the input value as a - // member then the default constructors would work fine. - // - // For example, when R is std::string and U is std::string_view, value is a - // reference to the string backed by input_value. The copy constructor would - // copy both, so that we wind up with a new input_value object (with the - // same contents) and a reference to the *old* input_value object rather - // than the new one. - struct State { - explicit State(const R& input_value_in) - : input_value(input_value_in), - // Make an implicit conversion to Result before initializing the U - // object we store, avoiding calling any explicit constructor of U - // from R. - // - // This simulates the language rules: a function with return type U - // that does `return R()` requires R to be implicitly convertible to - // U, and uses that path for the conversion, even U Result has an - // explicit constructor from R. - value(ImplicitCast_(internal::as_const(input_value))) {} - - // As above, but for the case where we're moving from the ReturnAction - // object because it's being used as a OnceAction. - explicit State(R&& input_value_in) - : input_value(std::move(input_value_in)), - // For the same reason as above we make an implicit conversion to U - // before initializing the value. - // - // Unlike above we provide the input value as an rvalue to the - // implicit conversion because this is a OnceAction: it's fine if it - // wants to consume the input value. - value(ImplicitCast_(std::move(input_value))) {} - - // A copy of the value originally provided by the user. We retain this in - // addition to the value of the mock function's result type below in case - // the latter is a reference-like type. See the std::string_view example - // in the documentation on Return. - R input_value; - - // The value we actually return, as the type returned by the mock function - // itself. - // - // We eagerly initialize this here, rather than lazily doing the implicit - // conversion automatically each time Perform is called, for historical - // reasons: in 2009-11, commit a070cbd91c (Google changelist 13540126) - // made the Action conversion operator eagerly convert the R value to - // U, but without keeping the R alive. This broke the use case discussed - // in the documentation for Return, making reference-like types such as - // std::string_view not safe to use as U where the input type R is a - // value-like type such as std::string. - // - // The example the commit gave was not very clear, nor was the issue - // thread (https://github.com/google/googlemock/issues/86), but it seems - // the worry was about reference-like input types R that flatten to a - // value-like type U when being implicitly converted. An example of this - // is std::vector::reference, which is often a proxy type with an - // reference to the underlying vector: - // - // // Helper method: have the mock function return bools according - // // to the supplied script. - // void SetActions(MockFunction& mock, - // const std::vector& script) { - // for (size_t i = 0; i < script.size(); ++i) { - // EXPECT_CALL(mock, Call(i)).WillOnce(Return(script[i])); - // } - // } - // - // TEST(Foo, Bar) { - // // Set actions using a temporary vector, whose operator[] - // // returns proxy objects that references that will be - // // dangling once the call to SetActions finishes and the - // // vector is destroyed. - // MockFunction mock; - // SetActions(mock, {false, true}); - // - // EXPECT_FALSE(mock.AsStdFunction()(0)); - // EXPECT_TRUE(mock.AsStdFunction()(1)); - // } - // - // This eager conversion helps with a simple case like this, but doesn't - // fully make these types work in general. For example the following still - // uses a dangling reference: - // - // TEST(Foo, Baz) { - // MockFunction()> mock; - // - // // Return the same vector twice, and then the empty vector - // // thereafter. - // auto action = Return(std::initializer_list{ - // "taco", "burrito", - // }); - // - // EXPECT_CALL(mock, Call) - // .WillOnce(action) - // .WillOnce(action) - // .WillRepeatedly(Return(std::vector{})); - // - // EXPECT_THAT(mock.AsStdFunction()(), - // ElementsAre("taco", "burrito")); - // EXPECT_THAT(mock.AsStdFunction()(), - // ElementsAre("taco", "burrito")); - // EXPECT_THAT(mock.AsStdFunction()(), IsEmpty()); - // } - // - U value; - }; - - const std::shared_ptr state_; - }; - - R value_; -}; - -// A specialization of ReturnAction when R is ByMoveWrapper for some T. -// -// This version applies the type system-defeating hack of moving from T even in -// the const call operator, checking at runtime that it isn't called more than -// once, since the user has declared their intent to do so by using ByMove. -template -class ReturnAction> final { - public: - explicit ReturnAction(ByMoveWrapper wrapper) - : state_(new State(std::move(wrapper.payload))) {} - - T operator()() const { - GTEST_CHECK_(!state_->called) - << "A ByMove() action must be performed at most once."; - - state_->called = true; - return std::move(state_->value); - } - - private: - // We store our state on the heap so that we are copyable as required by - // Action, despite the fact that we are stateful and T may not be copyable. - struct State { - explicit State(T&& value_in) : value(std::move(value_in)) {} - - T value; - bool called = false; - }; - - const std::shared_ptr state_; -}; - -// Implements the ReturnNull() action. -class ReturnNullAction { - public: - // Allows ReturnNull() to be used in any pointer-returning function. In C++11 - // this is enforced by returning nullptr, and in non-C++11 by asserting a - // pointer type on compile time. - template - static Result Perform(const ArgumentTuple&) { - return nullptr; - } -}; - -// Implements the Return() action. -class ReturnVoidAction { - public: - // Allows Return() to be used in any void-returning function. - template - static void Perform(const ArgumentTuple&) { - static_assert(std::is_void::value, "Result should be void."); - } -}; - -// Implements the polymorphic ReturnRef(x) action, which can be used -// in any function that returns a reference to the type of x, -// regardless of the argument types. -template -class ReturnRefAction { - public: - // Constructs a ReturnRefAction object from the reference to be returned. - explicit ReturnRefAction(T& ref) : ref_(ref) {} // NOLINT - - // This template type conversion operator allows ReturnRef(x) to be - // used in ANY function that returns a reference to x's type. - template - operator Action() const { - typedef typename Function::Result Result; - // Asserts that the function return type is a reference. This - // catches the user error of using ReturnRef(x) when Return(x) - // should be used, and generates some helpful error message. - static_assert(std::is_reference::value, - "use Return instead of ReturnRef to return a value"); - return Action(new Impl(ref_)); - } - - private: - // Implements the ReturnRef(x) action for a particular function type F. - template - class Impl : public ActionInterface { - public: - typedef typename Function::Result Result; - typedef typename Function::ArgumentTuple ArgumentTuple; - - explicit Impl(T& ref) : ref_(ref) {} // NOLINT - - Result Perform(const ArgumentTuple&) override { return ref_; } - - private: - T& ref_; - }; - - T& ref_; -}; - -// Implements the polymorphic ReturnRefOfCopy(x) action, which can be -// used in any function that returns a reference to the type of x, -// regardless of the argument types. -template -class ReturnRefOfCopyAction { - public: - // Constructs a ReturnRefOfCopyAction object from the reference to - // be returned. - explicit ReturnRefOfCopyAction(const T& value) : value_(value) {} // NOLINT - - // This template type conversion operator allows ReturnRefOfCopy(x) to be - // used in ANY function that returns a reference to x's type. - template - operator Action() const { - typedef typename Function::Result Result; - // Asserts that the function return type is a reference. This - // catches the user error of using ReturnRefOfCopy(x) when Return(x) - // should be used, and generates some helpful error message. - static_assert(std::is_reference::value, - "use Return instead of ReturnRefOfCopy to return a value"); - return Action(new Impl(value_)); - } - - private: - // Implements the ReturnRefOfCopy(x) action for a particular function type F. - template - class Impl : public ActionInterface { - public: - typedef typename Function::Result Result; - typedef typename Function::ArgumentTuple ArgumentTuple; - - explicit Impl(const T& value) : value_(value) {} // NOLINT - - Result Perform(const ArgumentTuple&) override { return value_; } - - private: - T value_; - }; - - const T value_; -}; - -// Implements the polymorphic ReturnRoundRobin(v) action, which can be -// used in any function that returns the element_type of v. -template -class ReturnRoundRobinAction { - public: - explicit ReturnRoundRobinAction(std::vector values) { - GTEST_CHECK_(!values.empty()) - << "ReturnRoundRobin requires at least one element."; - state_->values = std::move(values); - } - - template - T operator()(Args&&...) const { - return state_->Next(); - } - - private: - struct State { - T Next() { - T ret_val = values[i++]; - if (i == values.size()) i = 0; - return ret_val; - } - - std::vector values; - size_t i = 0; - }; - std::shared_ptr state_ = std::make_shared(); -}; - -// Implements the polymorphic DoDefault() action. -class DoDefaultAction { - public: - // This template type conversion operator allows DoDefault() to be - // used in any function. - template - operator Action() const { - return Action(); - } // NOLINT -}; - -// Implements the Assign action to set a given pointer referent to a -// particular value. -template -class AssignAction { - public: - AssignAction(T1* ptr, T2 value) : ptr_(ptr), value_(value) {} - - template - void Perform(const ArgumentTuple& /* args */) const { - *ptr_ = value_; - } - - private: - T1* const ptr_; - const T2 value_; -}; - -#ifndef GTEST_OS_WINDOWS_MOBILE - -// Implements the SetErrnoAndReturn action to simulate return from -// various system calls and libc functions. -template -class SetErrnoAndReturnAction { - public: - SetErrnoAndReturnAction(int errno_value, T result) - : errno_(errno_value), result_(result) {} - template - Result Perform(const ArgumentTuple& /* args */) const { - errno = errno_; - return result_; - } - - private: - const int errno_; - const T result_; -}; - -#endif // !GTEST_OS_WINDOWS_MOBILE - -// Implements the SetArgumentPointee(x) action for any function -// whose N-th argument (0-based) is a pointer to x's type. -template -struct SetArgumentPointeeAction { - A value; - - template - void operator()(const Args&... args) const { - *::std::get(std::tie(args...)) = value; - } -}; - -// Implements the Invoke(object_ptr, &Class::Method) action. -template -struct InvokeMethodAction { - Class* const obj_ptr; - const MethodPtr method_ptr; - - template - auto operator()(Args&&... args) const - -> decltype((obj_ptr->*method_ptr)(std::forward(args)...)) { - return (obj_ptr->*method_ptr)(std::forward(args)...); - } -}; - -// Implements the InvokeWithoutArgs(f) action. The template argument -// FunctionImpl is the implementation type of f, which can be either a -// function pointer or a functor. InvokeWithoutArgs(f) can be used as an -// Action as long as f's type is compatible with F. -template -struct InvokeWithoutArgsAction { - FunctionImpl function_impl; - - // Allows InvokeWithoutArgs(f) to be used as any action whose type is - // compatible with f. - template - auto operator()(const Args&...) -> decltype(function_impl()) { - return function_impl(); - } -}; - -// Implements the InvokeWithoutArgs(object_ptr, &Class::Method) action. -template -struct InvokeMethodWithoutArgsAction { - Class* const obj_ptr; - const MethodPtr method_ptr; - - using ReturnType = - decltype((std::declval()->*std::declval())()); - - template - ReturnType operator()(const Args&...) const { - return (obj_ptr->*method_ptr)(); - } -}; - -// Implements the IgnoreResult(action) action. -template -class IgnoreResultAction { - public: - explicit IgnoreResultAction(const A& action) : action_(action) {} - - template - operator Action() const { - // Assert statement belongs here because this is the best place to verify - // conditions on F. It produces the clearest error messages - // in most compilers. - // Impl really belongs in this scope as a local class but can't - // because MSVC produces duplicate symbols in different translation units - // in this case. Until MS fixes that bug we put Impl into the class scope - // and put the typedef both here (for use in assert statement) and - // in the Impl class. But both definitions must be the same. - typedef typename internal::Function::Result Result; - - // Asserts at compile time that F returns void. - static_assert(std::is_void::value, "Result type should be void."); - - return Action(new Impl(action_)); - } - - private: - template - class Impl : public ActionInterface { - public: - typedef typename internal::Function::Result Result; - typedef typename internal::Function::ArgumentTuple ArgumentTuple; - - explicit Impl(const A& action) : action_(action) {} - - void Perform(const ArgumentTuple& args) override { - // Performs the action and ignores its result. - action_.Perform(args); - } - - private: - // Type OriginalFunction is the same as F except that its return - // type is IgnoredValue. - typedef - typename internal::Function::MakeResultIgnoredValue OriginalFunction; - - const Action action_; - }; - - const A action_; -}; - -template -struct WithArgsAction { - InnerAction inner_action; - - // The signature of the function as seen by the inner action, given an out - // action with the given result and argument types. - template - using InnerSignature = - R(typename std::tuple_element>::type...); - - // Rather than a call operator, we must define conversion operators to - // particular action types. This is necessary for embedded actions like - // DoDefault(), which rely on an action conversion operators rather than - // providing a call operator because even with a particular set of arguments - // they don't have a fixed return type. - - template < - typename R, typename... Args, - typename std::enable_if< - std::is_convertible>...)>>::value, - int>::type = 0> - operator OnceAction() && { // NOLINT - struct OA { - OnceAction> inner_action; - - R operator()(Args&&... args) && { - return std::move(inner_action) - .Call(std::get( - std::forward_as_tuple(std::forward(args)...))...); - } - }; - - return OA{std::move(inner_action)}; - } - - template < - typename R, typename... Args, - typename std::enable_if< - std::is_convertible>...)>>::value, - int>::type = 0> - operator Action() const { // NOLINT - Action> converted(inner_action); - - return [converted](Args&&... args) -> R { - return converted.Perform(std::forward_as_tuple( - std::get(std::forward_as_tuple(std::forward(args)...))...)); - }; - } -}; - -template -class DoAllAction; - -// Base case: only a single action. -template -class DoAllAction { - public: - struct UserConstructorTag {}; - - template - explicit DoAllAction(UserConstructorTag, T&& action) - : final_action_(std::forward(action)) {} - - // Rather than a call operator, we must define conversion operators to - // particular action types. This is necessary for embedded actions like - // DoDefault(), which rely on an action conversion operators rather than - // providing a call operator because even with a particular set of arguments - // they don't have a fixed return type. - - template >::value, - int>::type = 0> - operator OnceAction() && { // NOLINT - return std::move(final_action_); - } - - template < - typename R, typename... Args, - typename std::enable_if< - std::is_convertible>::value, - int>::type = 0> - operator Action() const { // NOLINT - return final_action_; - } - - private: - FinalAction final_action_; -}; - -// Recursive case: support N actions by calling the initial action and then -// calling through to the base class containing N-1 actions. -template -class DoAllAction - : private DoAllAction { - private: - using Base = DoAllAction; - - // The type of reference that should be provided to an initial action for a - // mocked function parameter of type T. - // - // There are two quirks here: - // - // * Unlike most forwarding functions, we pass scalars through by value. - // This isn't strictly necessary because an lvalue reference would work - // fine too and be consistent with other non-reference types, but it's - // perhaps less surprising. - // - // For example if the mocked function has signature void(int), then it - // might seem surprising for the user's initial action to need to be - // convertible to Action. This is perhaps less - // surprising for a non-scalar type where there may be a performance - // impact, or it might even be impossible, to pass by value. - // - // * More surprisingly, `const T&` is often not a const reference type. - // By the reference collapsing rules in C++17 [dcl.ref]/6, if T refers to - // U& or U&& for some non-scalar type U, then InitialActionArgType is - // U&. In other words, we may hand over a non-const reference. - // - // So for example, given some non-scalar type Obj we have the following - // mappings: - // - // T InitialActionArgType - // ------- ----------------------- - // Obj const Obj& - // Obj& Obj& - // Obj&& Obj& - // const Obj const Obj& - // const Obj& const Obj& - // const Obj&& const Obj& - // - // In other words, the initial actions get a mutable view of an non-scalar - // argument if and only if the mock function itself accepts a non-const - // reference type. They are never given an rvalue reference to an - // non-scalar type. - // - // This situation makes sense if you imagine use with a matcher that is - // designed to write through a reference. For example, if the caller wants - // to fill in a reference argument and then return a canned value: - // - // EXPECT_CALL(mock, Call) - // .WillOnce(DoAll(SetArgReferee<0>(17), Return(19))); - // - template - using InitialActionArgType = - typename std::conditional::value, T, const T&>::type; - - public: - struct UserConstructorTag {}; - - template - explicit DoAllAction(UserConstructorTag, T&& initial_action, - U&&... other_actions) - : Base({}, std::forward(other_actions)...), - initial_action_(std::forward(initial_action)) {} - - template ...)>>, - std::is_convertible>>::value, - int>::type = 0> - operator OnceAction() && { // NOLINT - // Return an action that first calls the initial action with arguments - // filtered through InitialActionArgType, then forwards arguments directly - // to the base class to deal with the remaining actions. - struct OA { - OnceAction...)> initial_action; - OnceAction remaining_actions; - - R operator()(Args... args) && { - std::move(initial_action) - .Call(static_cast>(args)...); - - return std::move(remaining_actions).Call(std::forward(args)...); - } - }; - - return OA{ - std::move(initial_action_), - std::move(static_cast(*this)), - }; - } - - template < - typename R, typename... Args, - typename std::enable_if< - conjunction< - // Both the initial action and the rest must support conversion to - // Action. - std::is_convertible...)>>, - std::is_convertible>>::value, - int>::type = 0> - operator Action() const { // NOLINT - // Return an action that first calls the initial action with arguments - // filtered through InitialActionArgType, then forwards arguments directly - // to the base class to deal with the remaining actions. - struct OA { - Action...)> initial_action; - Action remaining_actions; - - R operator()(Args... args) const { - initial_action.Perform(std::forward_as_tuple( - static_cast>(args)...)); - - return remaining_actions.Perform( - std::forward_as_tuple(std::forward(args)...)); - } - }; - - return OA{ - initial_action_, - static_cast(*this), - }; - } - - private: - InitialAction initial_action_; -}; - -template -struct ReturnNewAction { - T* operator()() const { - return internal::Apply( - [](const Params&... unpacked_params) { - return new T(unpacked_params...); - }, - params); - } - std::tuple params; -}; - -template -struct ReturnArgAction { - template ::type> - auto operator()(Args&&... args) const -> decltype(std::get( - std::forward_as_tuple(std::forward(args)...))) { - return std::get(std::forward_as_tuple(std::forward(args)...)); - } -}; - -template -struct SaveArgAction { - Ptr pointer; - - template - void operator()(const Args&... args) const { - *pointer = std::get(std::tie(args...)); - } -}; - -template -struct SaveArgPointeeAction { - Ptr pointer; - - template - void operator()(const Args&... args) const { - *pointer = *std::get(std::tie(args...)); - } -}; - -template -struct SetArgRefereeAction { - T value; - - template - void operator()(Args&&... args) const { - using argk_type = - typename ::std::tuple_element>::type; - static_assert(std::is_lvalue_reference::value, - "Argument must be a reference type."); - std::get(std::tie(args...)) = value; - } -}; - -template -struct SetArrayArgumentAction { - I1 first; - I2 last; - - template - void operator()(const Args&... args) const { - auto value = std::get(std::tie(args...)); - for (auto it = first; it != last; ++it, (void)++value) { - *value = *it; - } - } -}; - -template -struct DeleteArgAction { - template - void operator()(const Args&... args) const { - delete std::get(std::tie(args...)); - } -}; - -template -struct ReturnPointeeAction { - Ptr pointer; - template - auto operator()(const Args&...) const -> decltype(*pointer) { - return *pointer; - } -}; - -#if GTEST_HAS_EXCEPTIONS -template -struct ThrowAction { - T exception; - // We use a conversion operator to adapt to any return type. - template - operator Action() const { // NOLINT - T copy = exception; - return [copy](Args...) -> R { throw copy; }; - } -}; -struct RethrowAction { - std::exception_ptr exception; - template - operator Action() const { // NOLINT - return [ex = exception](Args...) -> R { std::rethrow_exception(ex); }; - } -}; -#endif // GTEST_HAS_EXCEPTIONS - -} // namespace internal - -// An Unused object can be implicitly constructed from ANY value. -// This is handy when defining actions that ignore some or all of the -// mock function arguments. For example, given -// -// MOCK_METHOD3(Foo, double(const string& label, double x, double y)); -// MOCK_METHOD3(Bar, double(int index, double x, double y)); -// -// instead of -// -// double DistanceToOriginWithLabel(const string& label, double x, double y) { -// return sqrt(x*x + y*y); -// } -// double DistanceToOriginWithIndex(int index, double x, double y) { -// return sqrt(x*x + y*y); -// } -// ... -// EXPECT_CALL(mock, Foo("abc", _, _)) -// .WillOnce(Invoke(DistanceToOriginWithLabel)); -// EXPECT_CALL(mock, Bar(5, _, _)) -// .WillOnce(Invoke(DistanceToOriginWithIndex)); -// -// you could write -// -// // We can declare any uninteresting argument as Unused. -// double DistanceToOrigin(Unused, double x, double y) { -// return sqrt(x*x + y*y); -// } -// ... -// EXPECT_CALL(mock, Foo("abc", _, _)).WillOnce(Invoke(DistanceToOrigin)); -// EXPECT_CALL(mock, Bar(5, _, _)).WillOnce(Invoke(DistanceToOrigin)); -typedef internal::IgnoredValue Unused; - -// Creates an action that does actions a1, a2, ..., sequentially in -// each invocation. All but the last action will have a readonly view of the -// arguments. -template -internal::DoAllAction::type...> DoAll( - Action&&... action) { - return internal::DoAllAction::type...>( - {}, std::forward(action)...); -} - -// WithArg(an_action) creates an action that passes the k-th -// (0-based) argument of the mock function to an_action and performs -// it. It adapts an action accepting one argument to one that accepts -// multiple arguments. For convenience, we also provide -// WithArgs(an_action) (defined below) as a synonym. -template -internal::WithArgsAction::type, k> WithArg( - InnerAction&& action) { - return {std::forward(action)}; -} - -// WithArgs(an_action) creates an action that passes -// the selected arguments of the mock function to an_action and -// performs it. It serves as an adaptor between actions with -// different argument lists. -template -internal::WithArgsAction::type, k, ks...> -WithArgs(InnerAction&& action) { - return {std::forward(action)}; -} - -// WithoutArgs(inner_action) can be used in a mock function with a -// non-empty argument list to perform inner_action, which takes no -// argument. In other words, it adapts an action accepting no -// argument to one that accepts (and ignores) arguments. -template -internal::WithArgsAction::type> WithoutArgs( - InnerAction&& action) { - return {std::forward(action)}; -} - -// Creates an action that returns a value. -// -// The returned type can be used with a mock function returning a non-void, -// non-reference type U as follows: -// -// * If R is convertible to U and U is move-constructible, then the action can -// be used with WillOnce. -// -// * If const R& is convertible to U and U is copy-constructible, then the -// action can be used with both WillOnce and WillRepeatedly. -// -// The mock expectation contains the R value from which the U return value is -// constructed (a move/copy of the argument to Return). This means that the R -// value will survive at least until the mock object's expectations are cleared -// or the mock object is destroyed, meaning that U can safely be a -// reference-like type such as std::string_view: -// -// // The mock function returns a view of a copy of the string fed to -// // Return. The view is valid even after the action is performed. -// MockFunction mock; -// EXPECT_CALL(mock, Call).WillOnce(Return(std::string("taco"))); -// const std::string_view result = mock.AsStdFunction()(); -// EXPECT_EQ("taco", result); -// -template -internal::ReturnAction Return(R value) { - return internal::ReturnAction(std::move(value)); -} - -// Creates an action that returns NULL. -inline PolymorphicAction ReturnNull() { - return MakePolymorphicAction(internal::ReturnNullAction()); -} - -// Creates an action that returns from a void function. -inline PolymorphicAction Return() { - return MakePolymorphicAction(internal::ReturnVoidAction()); -} - -// Creates an action that returns the reference to a variable. -template -inline internal::ReturnRefAction ReturnRef(R& x) { // NOLINT - return internal::ReturnRefAction(x); -} - -// Prevent using ReturnRef on reference to temporary. -template -internal::ReturnRefAction ReturnRef(R&&) = delete; - -// Creates an action that returns the reference to a copy of the -// argument. The copy is created when the action is constructed and -// lives as long as the action. -template -inline internal::ReturnRefOfCopyAction ReturnRefOfCopy(const R& x) { - return internal::ReturnRefOfCopyAction(x); -} - -// DEPRECATED: use Return(x) directly with WillOnce. -// -// Modifies the parent action (a Return() action) to perform a move of the -// argument instead of a copy. -// Return(ByMove()) actions can only be executed once and will assert this -// invariant. -template -internal::ByMoveWrapper ByMove(R x) { - return internal::ByMoveWrapper(std::move(x)); -} - -// Creates an action that returns an element of `vals`. Calling this action will -// repeatedly return the next value from `vals` until it reaches the end and -// will restart from the beginning. -template -internal::ReturnRoundRobinAction ReturnRoundRobin(std::vector vals) { - return internal::ReturnRoundRobinAction(std::move(vals)); -} - -// Creates an action that returns an element of `vals`. Calling this action will -// repeatedly return the next value from `vals` until it reaches the end and -// will restart from the beginning. -template -internal::ReturnRoundRobinAction ReturnRoundRobin( - std::initializer_list vals) { - return internal::ReturnRoundRobinAction(std::vector(vals)); -} - -// Creates an action that does the default action for the give mock function. -inline internal::DoDefaultAction DoDefault() { - return internal::DoDefaultAction(); -} - -// Creates an action that sets the variable pointed by the N-th -// (0-based) function argument to 'value'. -template -internal::SetArgumentPointeeAction SetArgPointee(T value) { - return {std::move(value)}; -} - -// The following version is DEPRECATED. -template -internal::SetArgumentPointeeAction SetArgumentPointee(T value) { - return {std::move(value)}; -} - -// Creates an action that sets a pointer referent to a given value. -template -PolymorphicAction> Assign(T1* ptr, T2 val) { - return MakePolymorphicAction(internal::AssignAction(ptr, val)); -} - -#ifndef GTEST_OS_WINDOWS_MOBILE - -// Creates an action that sets errno and returns the appropriate error. -template -PolymorphicAction> SetErrnoAndReturn( - int errval, T result) { - return MakePolymorphicAction( - internal::SetErrnoAndReturnAction(errval, result)); -} - -#endif // !GTEST_OS_WINDOWS_MOBILE - -// Various overloads for Invoke(). - -// Legacy function. -// Actions can now be implicitly constructed from callables. No need to create -// wrapper objects. -// This function exists for backwards compatibility. -template -typename std::decay::type Invoke(FunctionImpl&& function_impl) { - return std::forward(function_impl); -} - -// Creates an action that invokes the given method on the given object -// with the mock function's arguments. -template -internal::InvokeMethodAction Invoke(Class* obj_ptr, - MethodPtr method_ptr) { - return {obj_ptr, method_ptr}; -} - -// Creates an action that invokes 'function_impl' with no argument. -template -internal::InvokeWithoutArgsAction::type> -InvokeWithoutArgs(FunctionImpl function_impl) { - return {std::move(function_impl)}; -} - -// Creates an action that invokes the given method on the given object -// with no argument. -template -internal::InvokeMethodWithoutArgsAction InvokeWithoutArgs( - Class* obj_ptr, MethodPtr method_ptr) { - return {obj_ptr, method_ptr}; -} - -// Creates an action that performs an_action and throws away its -// result. In other words, it changes the return type of an_action to -// void. an_action MUST NOT return void, or the code won't compile. -template -inline internal::IgnoreResultAction IgnoreResult(const A& an_action) { - return internal::IgnoreResultAction(an_action); -} - -// Creates a reference wrapper for the given L-value. If necessary, -// you can explicitly specify the type of the reference. For example, -// suppose 'derived' is an object of type Derived, ByRef(derived) -// would wrap a Derived&. If you want to wrap a const Base& instead, -// where Base is a base class of Derived, just write: -// -// ByRef(derived) -// -// N.B. ByRef is redundant with std::ref, std::cref and std::reference_wrapper. -// However, it may still be used for consistency with ByMove(). -template -inline ::std::reference_wrapper ByRef(T& l_value) { // NOLINT - return ::std::reference_wrapper(l_value); -} - -// The ReturnNew(a1, a2, ..., a_k) action returns a pointer to a new -// instance of type T, constructed on the heap with constructor arguments -// a1, a2, ..., and a_k. The caller assumes ownership of the returned value. -template -internal::ReturnNewAction::type...> ReturnNew( - Params&&... params) { - return {std::forward_as_tuple(std::forward(params)...)}; -} - -// Action ReturnArg() returns the k-th argument of the mock function. -template -internal::ReturnArgAction ReturnArg() { - return {}; -} - -// Action SaveArg(pointer) saves the k-th (0-based) argument of the -// mock function to *pointer. -template -internal::SaveArgAction SaveArg(Ptr pointer) { - return {pointer}; -} - -// Action SaveArgPointee(pointer) saves the value pointed to -// by the k-th (0-based) argument of the mock function to *pointer. -template -internal::SaveArgPointeeAction SaveArgPointee(Ptr pointer) { - return {pointer}; -} - -// Action SetArgReferee(value) assigns 'value' to the variable -// referenced by the k-th (0-based) argument of the mock function. -template -internal::SetArgRefereeAction::type> SetArgReferee( - T&& value) { - return {std::forward(value)}; -} - -// Action SetArrayArgument(first, last) copies the elements in -// source range [first, last) to the array pointed to by the k-th -// (0-based) argument, which can be either a pointer or an -// iterator. The action does not take ownership of the elements in the -// source range. -template -internal::SetArrayArgumentAction SetArrayArgument(I1 first, - I2 last) { - return {first, last}; -} - -// Action DeleteArg() deletes the k-th (0-based) argument of the mock -// function. -template -internal::DeleteArgAction DeleteArg() { - return {}; -} - -// This action returns the value pointed to by 'pointer'. -template -internal::ReturnPointeeAction ReturnPointee(Ptr pointer) { - return {pointer}; -} - -#if GTEST_HAS_EXCEPTIONS -// Action Throw(exception) can be used in a mock function of any type -// to throw the given exception. Any copyable value can be thrown, -// except for std::exception_ptr, which is likely a mistake if -// thrown directly. -template -typename std::enable_if< - !std::is_base_of::type>::value, - internal::ThrowAction::type>>::type -Throw(T&& exception) { - return {std::forward(exception)}; -} -// Action Rethrow(exception_ptr) can be used in a mock function of any type -// to rethrow any exception_ptr. Note that the same object is thrown each time. -inline internal::RethrowAction Rethrow(std::exception_ptr exception) { - return {std::move(exception)}; -} -#endif // GTEST_HAS_EXCEPTIONS - -namespace internal { - -// A macro from the ACTION* family (defined later in gmock-generated-actions.h) -// defines an action that can be used in a mock function. Typically, -// these actions only care about a subset of the arguments of the mock -// function. For example, if such an action only uses the second -// argument, it can be used in any mock function that takes >= 2 -// arguments where the type of the second argument is compatible. -// -// Therefore, the action implementation must be prepared to take more -// arguments than it needs. The ExcessiveArg type is used to -// represent those excessive arguments. In order to keep the compiler -// error messages tractable, we define it in the testing namespace -// instead of testing::internal. However, this is an INTERNAL TYPE -// and subject to change without notice, so a user MUST NOT USE THIS -// TYPE DIRECTLY. -struct ExcessiveArg {}; - -// Builds an implementation of an Action<> for some particular signature, using -// a class defined by an ACTION* macro. -template -struct ActionImpl; - -template -struct ImplBase { - struct Holder { - // Allows each copy of the Action<> to get to the Impl. - explicit operator const Impl&() const { return *ptr; } - std::shared_ptr ptr; - }; - using type = typename std::conditional::value, - Impl, Holder>::type; -}; - -template -struct ActionImpl : ImplBase::type { - using Base = typename ImplBase::type; - using function_type = R(Args...); - using args_type = std::tuple; - - ActionImpl() = default; // Only defined if appropriate for Base. - explicit ActionImpl(std::shared_ptr impl) : Base{std::move(impl)} {} - - R operator()(Args&&... arg) const { - static constexpr size_t kMaxArgs = - sizeof...(Args) <= 10 ? sizeof...(Args) : 10; - return Apply(std::make_index_sequence{}, - std::make_index_sequence<10 - kMaxArgs>{}, - args_type{std::forward(arg)...}); - } - - template - R Apply(std::index_sequence, std::index_sequence, - const args_type& args) const { - // Impl need not be specific to the signature of action being implemented; - // only the implementing function body needs to have all of the specific - // types instantiated. Up to 10 of the args that are provided by the - // args_type get passed, followed by a dummy of unspecified type for the - // remainder up to 10 explicit args. - static constexpr ExcessiveArg kExcessArg{}; - return static_cast(*this) - .template gmock_PerformImpl< - /*function_type=*/function_type, /*return_type=*/R, - /*args_type=*/args_type, - /*argN_type=*/ - typename std::tuple_element::type...>( - /*args=*/args, std::get(args)..., - ((void)excess_id, kExcessArg)...); - } -}; - -// Stores a default-constructed Impl as part of the Action<>'s -// std::function<>. The Impl should be trivial to copy. -template -::testing::Action MakeAction() { - return ::testing::Action(ActionImpl()); -} - -// Stores just the one given instance of Impl. -template -::testing::Action MakeAction(std::shared_ptr impl) { - return ::testing::Action(ActionImpl(std::move(impl))); -} - -#define GMOCK_INTERNAL_ARG_UNUSED(i, data, el) \ - , GTEST_INTERNAL_ATTRIBUTE_MAYBE_UNUSED const arg##i##_type& arg##i -#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_ \ - GTEST_INTERNAL_ATTRIBUTE_MAYBE_UNUSED const args_type& args GMOCK_PP_REPEAT( \ - GMOCK_INTERNAL_ARG_UNUSED, , 10) - -#define GMOCK_INTERNAL_ARG(i, data, el) , const arg##i##_type& arg##i -#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_ \ - const args_type& args GMOCK_PP_REPEAT(GMOCK_INTERNAL_ARG, , 10) - -#define GMOCK_INTERNAL_TEMPLATE_ARG(i, data, el) , typename arg##i##_type -#define GMOCK_ACTION_TEMPLATE_ARGS_NAMES_ \ - GMOCK_PP_TAIL(GMOCK_PP_REPEAT(GMOCK_INTERNAL_TEMPLATE_ARG, , 10)) - -#define GMOCK_INTERNAL_TYPENAME_PARAM(i, data, param) , typename param##_type -#define GMOCK_ACTION_TYPENAME_PARAMS_(params) \ - GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_TYPENAME_PARAM, , params)) - -#define GMOCK_INTERNAL_TYPE_PARAM(i, data, param) , param##_type -#define GMOCK_ACTION_TYPE_PARAMS_(params) \ - GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_TYPE_PARAM, , params)) - -#define GMOCK_INTERNAL_TYPE_GVALUE_PARAM(i, data, param) \ - , param##_type gmock_p##i -#define GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params) \ - GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_TYPE_GVALUE_PARAM, , params)) - -#define GMOCK_INTERNAL_GVALUE_PARAM(i, data, param) \ - , std::forward(gmock_p##i) -#define GMOCK_ACTION_GVALUE_PARAMS_(params) \ - GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_GVALUE_PARAM, , params)) - -#define GMOCK_INTERNAL_INIT_PARAM(i, data, param) \ - , param(::std::forward(gmock_p##i)) -#define GMOCK_ACTION_INIT_PARAMS_(params) \ - GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_INIT_PARAM, , params)) - -#define GMOCK_INTERNAL_FIELD_PARAM(i, data, param) param##_type param; -#define GMOCK_ACTION_FIELD_PARAMS_(params) \ - GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_FIELD_PARAM, , params) - -#define GMOCK_INTERNAL_ACTION(name, full_name, params) \ - template \ - class full_name { \ - public: \ - explicit full_name(GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params)) \ - : impl_(std::make_shared( \ - GMOCK_ACTION_GVALUE_PARAMS_(params))) {} \ - full_name(const full_name&) = default; \ - full_name(full_name&&) noexcept = default; \ - template \ - operator ::testing::Action() const { \ - return ::testing::internal::MakeAction(impl_); \ - } \ - \ - private: \ - class gmock_Impl { \ - public: \ - explicit gmock_Impl(GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params)) \ - : GMOCK_ACTION_INIT_PARAMS_(params) {} \ - template \ - return_type gmock_PerformImpl(GMOCK_ACTION_ARG_TYPES_AND_NAMES_) const; \ - GMOCK_ACTION_FIELD_PARAMS_(params) \ - }; \ - std::shared_ptr impl_; \ - }; \ - template \ - inline full_name name( \ - GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params)) GTEST_MUST_USE_RESULT_; \ - template \ - inline full_name name( \ - GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params)) { \ - return full_name( \ - GMOCK_ACTION_GVALUE_PARAMS_(params)); \ - } \ - template \ - template \ - return_type \ - full_name::gmock_Impl::gmock_PerformImpl( \ - GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const - -} // namespace internal - -// Similar to GMOCK_INTERNAL_ACTION, but no bound parameters are stored. -#define ACTION(name) \ - class name##Action { \ - public: \ - explicit name##Action() noexcept {} \ - name##Action(const name##Action&) noexcept {} \ - template \ - operator ::testing::Action() const { \ - return ::testing::internal::MakeAction(); \ - } \ - \ - private: \ - class gmock_Impl { \ - public: \ - template \ - return_type gmock_PerformImpl(GMOCK_ACTION_ARG_TYPES_AND_NAMES_) const; \ - }; \ - }; \ - inline name##Action name() GTEST_MUST_USE_RESULT_; \ - inline name##Action name() { return name##Action(); } \ - template \ - return_type name##Action::gmock_Impl::gmock_PerformImpl( \ - GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const - -#define ACTION_P(name, ...) \ - GMOCK_INTERNAL_ACTION(name, name##ActionP, (__VA_ARGS__)) - -#define ACTION_P2(name, ...) \ - GMOCK_INTERNAL_ACTION(name, name##ActionP2, (__VA_ARGS__)) - -#define ACTION_P3(name, ...) \ - GMOCK_INTERNAL_ACTION(name, name##ActionP3, (__VA_ARGS__)) - -#define ACTION_P4(name, ...) \ - GMOCK_INTERNAL_ACTION(name, name##ActionP4, (__VA_ARGS__)) - -#define ACTION_P5(name, ...) \ - GMOCK_INTERNAL_ACTION(name, name##ActionP5, (__VA_ARGS__)) - -#define ACTION_P6(name, ...) \ - GMOCK_INTERNAL_ACTION(name, name##ActionP6, (__VA_ARGS__)) - -#define ACTION_P7(name, ...) \ - GMOCK_INTERNAL_ACTION(name, name##ActionP7, (__VA_ARGS__)) - -#define ACTION_P8(name, ...) \ - GMOCK_INTERNAL_ACTION(name, name##ActionP8, (__VA_ARGS__)) - -#define ACTION_P9(name, ...) \ - GMOCK_INTERNAL_ACTION(name, name##ActionP9, (__VA_ARGS__)) - -#define ACTION_P10(name, ...) \ - GMOCK_INTERNAL_ACTION(name, name##ActionP10, (__VA_ARGS__)) - -} // namespace testing - -GTEST_DISABLE_MSC_WARNINGS_POP_() // 4100 - -#endif // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ diff --git a/vendor/core/vendor/googletest/googlemock/include/gmock/gmock-cardinalities.h b/vendor/core/vendor/googletest/googlemock/include/gmock/gmock-cardinalities.h deleted file mode 100644 index 533e604f3..000000000 --- a/vendor/core/vendor/googletest/googlemock/include/gmock/gmock-cardinalities.h +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Google Mock - a framework for writing C++ mock classes. -// -// This file implements some commonly used cardinalities. More -// cardinalities can be defined by the user implementing the -// CardinalityInterface interface if necessary. - -// IWYU pragma: private, include "gmock/gmock.h" -// IWYU pragma: friend gmock/.* - -#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ -#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ - -#include - -#include -#include // NOLINT - -#include "gmock/internal/gmock-port.h" -#include "gtest/gtest.h" - -GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ -/* class A needs to have dll-interface to be used by clients of class B */) - -namespace testing { - -// To implement a cardinality Foo, define: -// 1. a class FooCardinality that implements the -// CardinalityInterface interface, and -// 2. a factory function that creates a Cardinality object from a -// const FooCardinality*. -// -// The two-level delegation design follows that of Matcher, providing -// consistency for extension developers. It also eases ownership -// management as Cardinality objects can now be copied like plain values. - -// The implementation of a cardinality. -class CardinalityInterface { - public: - virtual ~CardinalityInterface() = default; - - // Conservative estimate on the lower/upper bound of the number of - // calls allowed. - virtual int ConservativeLowerBound() const { return 0; } - virtual int ConservativeUpperBound() const { return INT_MAX; } - - // Returns true if and only if call_count calls will satisfy this - // cardinality. - virtual bool IsSatisfiedByCallCount(int call_count) const = 0; - - // Returns true if and only if call_count calls will saturate this - // cardinality. - virtual bool IsSaturatedByCallCount(int call_count) const = 0; - - // Describes self to an ostream. - virtual void DescribeTo(::std::ostream* os) const = 0; -}; - -// A Cardinality is a copyable and IMMUTABLE (except by assignment) -// object that specifies how many times a mock function is expected to -// be called. The implementation of Cardinality is just a std::shared_ptr -// to const CardinalityInterface. Don't inherit from Cardinality! -class GTEST_API_ Cardinality { - public: - // Constructs a null cardinality. Needed for storing Cardinality - // objects in STL containers. - Cardinality() = default; - - // Constructs a Cardinality from its implementation. - explicit Cardinality(const CardinalityInterface* impl) : impl_(impl) {} - - // Conservative estimate on the lower/upper bound of the number of - // calls allowed. - int ConservativeLowerBound() const { return impl_->ConservativeLowerBound(); } - int ConservativeUpperBound() const { return impl_->ConservativeUpperBound(); } - - // Returns true if and only if call_count calls will satisfy this - // cardinality. - bool IsSatisfiedByCallCount(int call_count) const { - return impl_->IsSatisfiedByCallCount(call_count); - } - - // Returns true if and only if call_count calls will saturate this - // cardinality. - bool IsSaturatedByCallCount(int call_count) const { - return impl_->IsSaturatedByCallCount(call_count); - } - - // Returns true if and only if call_count calls will over-saturate this - // cardinality, i.e. exceed the maximum number of allowed calls. - bool IsOverSaturatedByCallCount(int call_count) const { - return impl_->IsSaturatedByCallCount(call_count) && - !impl_->IsSatisfiedByCallCount(call_count); - } - - // Describes self to an ostream - void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } - - // Describes the given actual call count to an ostream. - static void DescribeActualCallCountTo(int actual_call_count, - ::std::ostream* os); - - private: - std::shared_ptr impl_; -}; - -// Creates a cardinality that allows at least n calls. -GTEST_API_ Cardinality AtLeast(int n); - -// Creates a cardinality that allows at most n calls. -GTEST_API_ Cardinality AtMost(int n); - -// Creates a cardinality that allows any number of calls. -GTEST_API_ Cardinality AnyNumber(); - -// Creates a cardinality that allows between min and max calls. -GTEST_API_ Cardinality Between(int min, int max); - -// Creates a cardinality that allows exactly n calls. -GTEST_API_ Cardinality Exactly(int n); - -// Creates a cardinality from its implementation. -inline Cardinality MakeCardinality(const CardinalityInterface* c) { - return Cardinality(c); -} - -} // namespace testing - -GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 - -#endif // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ diff --git a/vendor/core/vendor/googletest/googlemock/include/gmock/gmock-function-mocker.h b/vendor/core/vendor/googletest/googlemock/include/gmock/gmock-function-mocker.h deleted file mode 100644 index d2cb13cd8..000000000 --- a/vendor/core/vendor/googletest/googlemock/include/gmock/gmock-function-mocker.h +++ /dev/null @@ -1,519 +0,0 @@ -// Copyright 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Google Mock - a framework for writing C++ mock classes. -// -// This file implements MOCK_METHOD. - -// IWYU pragma: private, include "gmock/gmock.h" -// IWYU pragma: friend gmock/.* - -#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_FUNCTION_MOCKER_H_ -#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_FUNCTION_MOCKER_H_ - -#include -#include // IWYU pragma: keep -#include // IWYU pragma: keep - -#include "gmock/gmock-spec-builders.h" -#include "gmock/internal/gmock-internal-utils.h" -#include "gmock/internal/gmock-pp.h" - -namespace testing { -namespace internal { -template -using identity_t = T; - -template -struct ThisRefAdjuster { - template - using AdjustT = typename std::conditional< - std::is_const::type>::value, - typename std::conditional::value, - const T&, const T&&>::type, - typename std::conditional::value, T&, - T&&>::type>::type; - - template - static AdjustT Adjust(const MockType& mock) { - return static_cast>(const_cast(mock)); - } -}; - -constexpr bool PrefixOf(const char* a, const char* b) { - return *a == 0 || (*a == *b && internal::PrefixOf(a + 1, b + 1)); -} - -template -constexpr bool StartsWith(const char (&prefix)[N], const char (&str)[M]) { - return N <= M && internal::PrefixOf(prefix, str); -} - -template -constexpr bool EndsWith(const char (&suffix)[N], const char (&str)[M]) { - return N <= M && internal::PrefixOf(suffix, str + M - N); -} - -template -constexpr bool Equals(const char (&a)[N], const char (&b)[M]) { - return N == M && internal::PrefixOf(a, b); -} - -template -constexpr bool ValidateSpec(const char (&spec)[N]) { - return internal::Equals("const", spec) || - internal::Equals("override", spec) || - internal::Equals("final", spec) || - internal::Equals("noexcept", spec) || - (internal::StartsWith("noexcept(", spec) && - internal::EndsWith(")", spec)) || - internal::Equals("ref(&)", spec) || - internal::Equals("ref(&&)", spec) || - (internal::StartsWith("Calltype(", spec) && - internal::EndsWith(")", spec)); -} - -} // namespace internal - -// The style guide prohibits "using" statements in a namespace scope -// inside a header file. However, the FunctionMocker class template -// is meant to be defined in the ::testing namespace. The following -// line is just a trick for working around a bug in MSVC 8.0, which -// cannot handle it if we define FunctionMocker in ::testing. -using internal::FunctionMocker; -} // namespace testing - -#define MOCK_METHOD(...) \ - GMOCK_INTERNAL_WARNING_PUSH() \ - GMOCK_INTERNAL_WARNING_CLANG(ignored, "-Wunused-member-function") \ - GMOCK_PP_VARIADIC_CALL(GMOCK_INTERNAL_MOCK_METHOD_ARG_, __VA_ARGS__) \ - GMOCK_INTERNAL_WARNING_POP() - -#define GMOCK_INTERNAL_MOCK_METHOD_ARG_1(...) \ - GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) - -#define GMOCK_INTERNAL_MOCK_METHOD_ARG_2(...) \ - GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) - -#define GMOCK_INTERNAL_MOCK_METHOD_ARG_3(_Ret, _MethodName, _Args) \ - GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, ()) - -#define GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, _Spec) \ - GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Args); \ - GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Spec); \ - GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE( \ - GMOCK_PP_NARG0 _Args, GMOCK_INTERNAL_SIGNATURE(_Ret, _Args)); \ - GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec) \ - GMOCK_INTERNAL_MOCK_METHOD_IMPL( \ - GMOCK_PP_NARG0 _Args, _MethodName, GMOCK_INTERNAL_HAS_CONST(_Spec), \ - GMOCK_INTERNAL_HAS_OVERRIDE(_Spec), GMOCK_INTERNAL_HAS_FINAL(_Spec), \ - GMOCK_INTERNAL_GET_NOEXCEPT_SPEC(_Spec), \ - GMOCK_INTERNAL_GET_CALLTYPE_SPEC(_Spec), \ - GMOCK_INTERNAL_GET_REF_SPEC(_Spec), \ - (GMOCK_INTERNAL_SIGNATURE(_Ret, _Args))) - -#define GMOCK_INTERNAL_MOCK_METHOD_ARG_5(...) \ - GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) - -#define GMOCK_INTERNAL_MOCK_METHOD_ARG_6(...) \ - GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) - -#define GMOCK_INTERNAL_MOCK_METHOD_ARG_7(...) \ - GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) - -#define GMOCK_INTERNAL_WRONG_ARITY(...) \ - static_assert( \ - false, \ - "MOCK_METHOD must be called with 3 or 4 arguments. _Ret, " \ - "_MethodName, _Args and optionally _Spec. _Args and _Spec must be " \ - "enclosed in parentheses. If _Ret is a type with unprotected commas, " \ - "it must also be enclosed in parentheses.") - -#define GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Tuple) \ - static_assert( \ - GMOCK_PP_IS_ENCLOSED_PARENS(_Tuple), \ - GMOCK_PP_STRINGIZE(_Tuple) " should be enclosed in parentheses.") - -#define GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE(_N, ...) \ - static_assert( \ - std::is_function<__VA_ARGS__>::value, \ - "Signature must be a function type, maybe return type contains " \ - "unprotected comma."); \ - static_assert( \ - ::testing::tuple_size::ArgumentTuple>::value == _N, \ - "This method does not take " GMOCK_PP_STRINGIZE( \ - _N) " arguments. Parenthesize all types with unprotected commas.") - -#define GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec) \ - GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT, ~, _Spec) - -#define GMOCK_INTERNAL_MOCK_METHOD_IMPL(_N, _MethodName, _Constness, \ - _Override, _Final, _NoexceptSpec, \ - _CallType, _RefSpec, _Signature) \ - typename ::testing::internal::Function::Result \ - GMOCK_INTERNAL_EXPAND(_CallType) \ - _MethodName(GMOCK_PP_REPEAT(GMOCK_INTERNAL_PARAMETER, _Signature, _N)) \ - GMOCK_PP_IF(_Constness, const, ) \ - _RefSpec _NoexceptSpec GMOCK_PP_IF(_Override, override, ) \ - GMOCK_PP_IF(_Final, final, ) { \ - GMOCK_MOCKER_(_N, _Constness, _MethodName) \ - .SetOwnerAndName(this, #_MethodName); \ - return GMOCK_MOCKER_(_N, _Constness, _MethodName) \ - .Invoke(GMOCK_PP_REPEAT(GMOCK_INTERNAL_FORWARD_ARG, _Signature, _N)); \ - } \ - ::testing::MockSpec gmock_##_MethodName( \ - GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_PARAMETER, _Signature, _N)) \ - GMOCK_PP_IF(_Constness, const, ) _RefSpec { \ - GMOCK_MOCKER_(_N, _Constness, _MethodName).RegisterOwner(this); \ - return GMOCK_MOCKER_(_N, _Constness, _MethodName) \ - .With(GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_ARGUMENT, , _N)); \ - } \ - ::testing::MockSpec gmock_##_MethodName( \ - const ::testing::internal::WithoutMatchers&, \ - GMOCK_PP_IF(_Constness, const, )::testing::internal::Function< \ - GMOCK_PP_REMOVE_PARENS(_Signature)>*) const _RefSpec _NoexceptSpec { \ - return ::testing::internal::ThisRefAdjuster::Adjust(*this) \ - .gmock_##_MethodName(GMOCK_PP_REPEAT( \ - GMOCK_INTERNAL_A_MATCHER_ARGUMENT, _Signature, _N)); \ - } \ - mutable ::testing::FunctionMocker \ - GMOCK_MOCKER_(_N, _Constness, _MethodName) - -#define GMOCK_INTERNAL_EXPAND(...) __VA_ARGS__ - -// Valid modifiers. -#define GMOCK_INTERNAL_HAS_CONST(_Tuple) \ - GMOCK_PP_HAS_COMMA(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_CONST, ~, _Tuple)) - -#define GMOCK_INTERNAL_HAS_OVERRIDE(_Tuple) \ - GMOCK_PP_HAS_COMMA( \ - GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_OVERRIDE, ~, _Tuple)) - -#define GMOCK_INTERNAL_HAS_FINAL(_Tuple) \ - GMOCK_PP_HAS_COMMA(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_FINAL, ~, _Tuple)) - -#define GMOCK_INTERNAL_GET_NOEXCEPT_SPEC(_Tuple) \ - GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_NOEXCEPT_SPEC_IF_NOEXCEPT, ~, _Tuple) - -#define GMOCK_INTERNAL_NOEXCEPT_SPEC_IF_NOEXCEPT(_i, _, _elem) \ - GMOCK_PP_IF( \ - GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem)), \ - _elem, ) - -#define GMOCK_INTERNAL_GET_CALLTYPE_SPEC(_Tuple) \ - GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_CALLTYPE_SPEC_IF_CALLTYPE, ~, _Tuple) - -#define GMOCK_INTERNAL_CALLTYPE_SPEC_IF_CALLTYPE(_i, _, _elem) \ - GMOCK_PP_IF( \ - GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_CALLTYPE(_i, _, _elem)), \ - GMOCK_PP_CAT(GMOCK_INTERNAL_UNPACK_, _elem), ) - -#define GMOCK_INTERNAL_GET_REF_SPEC(_Tuple) \ - GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_REF_SPEC_IF_REF, ~, _Tuple) - -#define GMOCK_INTERNAL_REF_SPEC_IF_REF(_i, _, _elem) \ - GMOCK_PP_IF(GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_REF(_i, _, _elem)), \ - GMOCK_PP_CAT(GMOCK_INTERNAL_UNPACK_, _elem), ) - -#ifdef GMOCK_INTERNAL_STRICT_SPEC_ASSERT -#define GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT(_i, _, _elem) \ - static_assert( \ - ::testing::internal::ValidateSpec(GMOCK_PP_STRINGIZE(_elem)), \ - "Token \'" GMOCK_PP_STRINGIZE( \ - _elem) "\' cannot be recognized as a valid specification " \ - "modifier. Is a ',' missing?"); -#else -#define GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT(_i, _, _elem) \ - static_assert( \ - (GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_CONST(_i, _, _elem)) + \ - GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_OVERRIDE(_i, _, _elem)) + \ - GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_FINAL(_i, _, _elem)) + \ - GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem)) + \ - GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_REF(_i, _, _elem)) + \ - GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_CALLTYPE(_i, _, _elem))) == 1, \ - GMOCK_PP_STRINGIZE( \ - _elem) " cannot be recognized as a valid specification modifier."); -#endif // GMOCK_INTERNAL_STRICT_SPEC_ASSERT - -// Modifiers implementation. -#define GMOCK_INTERNAL_DETECT_CONST(_i, _, _elem) \ - GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_CONST_I_, _elem) - -#define GMOCK_INTERNAL_DETECT_CONST_I_const , - -#define GMOCK_INTERNAL_DETECT_OVERRIDE(_i, _, _elem) \ - GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_OVERRIDE_I_, _elem) - -#define GMOCK_INTERNAL_DETECT_OVERRIDE_I_override , - -#define GMOCK_INTERNAL_DETECT_FINAL(_i, _, _elem) \ - GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_FINAL_I_, _elem) - -#define GMOCK_INTERNAL_DETECT_FINAL_I_final , - -#define GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem) \ - GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_NOEXCEPT_I_, _elem) - -#define GMOCK_INTERNAL_DETECT_NOEXCEPT_I_noexcept , - -#define GMOCK_INTERNAL_DETECT_REF(_i, _, _elem) \ - GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_REF_I_, _elem) - -#define GMOCK_INTERNAL_DETECT_REF_I_ref , - -#define GMOCK_INTERNAL_UNPACK_ref(x) x - -#define GMOCK_INTERNAL_DETECT_CALLTYPE(_i, _, _elem) \ - GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_CALLTYPE_I_, _elem) - -#define GMOCK_INTERNAL_DETECT_CALLTYPE_I_Calltype , - -#define GMOCK_INTERNAL_UNPACK_Calltype(...) __VA_ARGS__ - -// Note: The use of `identity_t` here allows _Ret to represent return types that -// would normally need to be specified in a different way. For example, a method -// returning a function pointer must be written as -// -// fn_ptr_return_t (*method(method_args_t...))(fn_ptr_args_t...) -// -// But we only support placing the return type at the beginning. To handle this, -// we wrap all calls in identity_t, so that a declaration will be expanded to -// -// identity_t method(method_args_t...) -// -// This allows us to work around the syntactic oddities of function/method -// types. -#define GMOCK_INTERNAL_SIGNATURE(_Ret, _Args) \ - ::testing::internal::identity_t( \ - GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_GET_TYPE, _, _Args)) - -#define GMOCK_INTERNAL_GET_TYPE(_i, _, _elem) \ - GMOCK_PP_COMMA_IF(_i) \ - GMOCK_PP_IF(GMOCK_PP_IS_BEGIN_PARENS(_elem), GMOCK_PP_REMOVE_PARENS, \ - GMOCK_PP_IDENTITY) \ - (_elem) - -#define GMOCK_INTERNAL_PARAMETER(_i, _Signature, _) \ - GMOCK_PP_COMMA_IF(_i) \ - GMOCK_INTERNAL_ARG_O(_i, GMOCK_PP_REMOVE_PARENS(_Signature)) \ - gmock_a##_i - -#define GMOCK_INTERNAL_FORWARD_ARG(_i, _Signature, _) \ - GMOCK_PP_COMMA_IF(_i) \ - ::std::forward(gmock_a##_i) - -#define GMOCK_INTERNAL_MATCHER_PARAMETER(_i, _Signature, _) \ - GMOCK_PP_COMMA_IF(_i) \ - GMOCK_INTERNAL_MATCHER_O(_i, GMOCK_PP_REMOVE_PARENS(_Signature)) \ - gmock_a##_i - -#define GMOCK_INTERNAL_MATCHER_ARGUMENT(_i, _1, _2) \ - GMOCK_PP_COMMA_IF(_i) \ - gmock_a##_i - -#define GMOCK_INTERNAL_A_MATCHER_ARGUMENT(_i, _Signature, _) \ - GMOCK_PP_COMMA_IF(_i) \ - ::testing::A() - -#define GMOCK_INTERNAL_ARG_O(_i, ...) \ - typename ::testing::internal::Function<__VA_ARGS__>::template Arg<_i>::type - -#define GMOCK_INTERNAL_MATCHER_O(_i, ...) \ - const ::testing::Matcher::template Arg<_i>::type>& - -#define MOCK_METHOD0(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 0, __VA_ARGS__) -#define MOCK_METHOD1(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 1, __VA_ARGS__) -#define MOCK_METHOD2(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 2, __VA_ARGS__) -#define MOCK_METHOD3(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 3, __VA_ARGS__) -#define MOCK_METHOD4(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 4, __VA_ARGS__) -#define MOCK_METHOD5(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 5, __VA_ARGS__) -#define MOCK_METHOD6(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 6, __VA_ARGS__) -#define MOCK_METHOD7(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 7, __VA_ARGS__) -#define MOCK_METHOD8(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 8, __VA_ARGS__) -#define MOCK_METHOD9(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 9, __VA_ARGS__) -#define MOCK_METHOD10(m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(, , m, 10, __VA_ARGS__) - -#define MOCK_CONST_METHOD0(m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, , m, 0, __VA_ARGS__) -#define MOCK_CONST_METHOD1(m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, , m, 1, __VA_ARGS__) -#define MOCK_CONST_METHOD2(m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, , m, 2, __VA_ARGS__) -#define MOCK_CONST_METHOD3(m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, , m, 3, __VA_ARGS__) -#define MOCK_CONST_METHOD4(m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, , m, 4, __VA_ARGS__) -#define MOCK_CONST_METHOD5(m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, , m, 5, __VA_ARGS__) -#define MOCK_CONST_METHOD6(m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, , m, 6, __VA_ARGS__) -#define MOCK_CONST_METHOD7(m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, , m, 7, __VA_ARGS__) -#define MOCK_CONST_METHOD8(m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, , m, 8, __VA_ARGS__) -#define MOCK_CONST_METHOD9(m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, , m, 9, __VA_ARGS__) -#define MOCK_CONST_METHOD10(m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, , m, 10, __VA_ARGS__) - -#define MOCK_METHOD0_T(m, ...) MOCK_METHOD0(m, __VA_ARGS__) -#define MOCK_METHOD1_T(m, ...) MOCK_METHOD1(m, __VA_ARGS__) -#define MOCK_METHOD2_T(m, ...) MOCK_METHOD2(m, __VA_ARGS__) -#define MOCK_METHOD3_T(m, ...) MOCK_METHOD3(m, __VA_ARGS__) -#define MOCK_METHOD4_T(m, ...) MOCK_METHOD4(m, __VA_ARGS__) -#define MOCK_METHOD5_T(m, ...) MOCK_METHOD5(m, __VA_ARGS__) -#define MOCK_METHOD6_T(m, ...) MOCK_METHOD6(m, __VA_ARGS__) -#define MOCK_METHOD7_T(m, ...) MOCK_METHOD7(m, __VA_ARGS__) -#define MOCK_METHOD8_T(m, ...) MOCK_METHOD8(m, __VA_ARGS__) -#define MOCK_METHOD9_T(m, ...) MOCK_METHOD9(m, __VA_ARGS__) -#define MOCK_METHOD10_T(m, ...) MOCK_METHOD10(m, __VA_ARGS__) - -#define MOCK_CONST_METHOD0_T(m, ...) MOCK_CONST_METHOD0(m, __VA_ARGS__) -#define MOCK_CONST_METHOD1_T(m, ...) MOCK_CONST_METHOD1(m, __VA_ARGS__) -#define MOCK_CONST_METHOD2_T(m, ...) MOCK_CONST_METHOD2(m, __VA_ARGS__) -#define MOCK_CONST_METHOD3_T(m, ...) MOCK_CONST_METHOD3(m, __VA_ARGS__) -#define MOCK_CONST_METHOD4_T(m, ...) MOCK_CONST_METHOD4(m, __VA_ARGS__) -#define MOCK_CONST_METHOD5_T(m, ...) MOCK_CONST_METHOD5(m, __VA_ARGS__) -#define MOCK_CONST_METHOD6_T(m, ...) MOCK_CONST_METHOD6(m, __VA_ARGS__) -#define MOCK_CONST_METHOD7_T(m, ...) MOCK_CONST_METHOD7(m, __VA_ARGS__) -#define MOCK_CONST_METHOD8_T(m, ...) MOCK_CONST_METHOD8(m, __VA_ARGS__) -#define MOCK_CONST_METHOD9_T(m, ...) MOCK_CONST_METHOD9(m, __VA_ARGS__) -#define MOCK_CONST_METHOD10_T(m, ...) MOCK_CONST_METHOD10(m, __VA_ARGS__) - -#define MOCK_METHOD0_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 0, __VA_ARGS__) -#define MOCK_METHOD1_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 1, __VA_ARGS__) -#define MOCK_METHOD2_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 2, __VA_ARGS__) -#define MOCK_METHOD3_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 3, __VA_ARGS__) -#define MOCK_METHOD4_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 4, __VA_ARGS__) -#define MOCK_METHOD5_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 5, __VA_ARGS__) -#define MOCK_METHOD6_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 6, __VA_ARGS__) -#define MOCK_METHOD7_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 7, __VA_ARGS__) -#define MOCK_METHOD8_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 8, __VA_ARGS__) -#define MOCK_METHOD9_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 9, __VA_ARGS__) -#define MOCK_METHOD10_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 10, __VA_ARGS__) - -#define MOCK_CONST_METHOD0_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 0, __VA_ARGS__) -#define MOCK_CONST_METHOD1_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 1, __VA_ARGS__) -#define MOCK_CONST_METHOD2_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 2, __VA_ARGS__) -#define MOCK_CONST_METHOD3_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 3, __VA_ARGS__) -#define MOCK_CONST_METHOD4_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 4, __VA_ARGS__) -#define MOCK_CONST_METHOD5_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 5, __VA_ARGS__) -#define MOCK_CONST_METHOD6_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 6, __VA_ARGS__) -#define MOCK_CONST_METHOD7_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 7, __VA_ARGS__) -#define MOCK_CONST_METHOD8_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 8, __VA_ARGS__) -#define MOCK_CONST_METHOD9_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 9, __VA_ARGS__) -#define MOCK_CONST_METHOD10_WITH_CALLTYPE(ct, m, ...) \ - GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 10, __VA_ARGS__) - -#define MOCK_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_METHOD0_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_METHOD1_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_METHOD2_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_METHOD3_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_METHOD4_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_METHOD5_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_METHOD6_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_METHOD7_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_METHOD8_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_METHOD9_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_METHOD10_WITH_CALLTYPE(ct, m, __VA_ARGS__) - -#define MOCK_CONST_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_CONST_METHOD0_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_CONST_METHOD1_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_CONST_METHOD2_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_CONST_METHOD3_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_CONST_METHOD4_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_CONST_METHOD5_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_CONST_METHOD6_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_CONST_METHOD7_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_CONST_METHOD8_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_CONST_METHOD9_WITH_CALLTYPE(ct, m, __VA_ARGS__) -#define MOCK_CONST_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \ - MOCK_CONST_METHOD10_WITH_CALLTYPE(ct, m, __VA_ARGS__) - -#define GMOCK_INTERNAL_MOCK_METHODN(constness, ct, Method, args_num, ...) \ - GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE( \ - args_num, ::testing::internal::identity_t<__VA_ARGS__>); \ - GMOCK_INTERNAL_MOCK_METHOD_IMPL( \ - args_num, Method, GMOCK_PP_NARG0(constness), 0, 0, , ct, , \ - (::testing::internal::identity_t<__VA_ARGS__>)) - -#define GMOCK_MOCKER_(arity, constness, Method) \ - GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__) - -#endif // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_FUNCTION_MOCKER_H_ diff --git a/vendor/core/vendor/googletest/googlemock/include/gmock/gmock-matchers.h b/vendor/core/vendor/googletest/googlemock/include/gmock/gmock-matchers.h deleted file mode 100644 index 063ee6ca2..000000000 --- a/vendor/core/vendor/googletest/googlemock/include/gmock/gmock-matchers.h +++ /dev/null @@ -1,5624 +0,0 @@ -// Copyright 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Google Mock - a framework for writing C++ mock classes. -// -// The MATCHER* family of macros can be used in a namespace scope to -// define custom matchers easily. -// -// Basic Usage -// =========== -// -// The syntax -// -// MATCHER(name, description_string) { statements; } -// -// defines a matcher with the given name that executes the statements, -// which must return a bool to indicate if the match succeeds. Inside -// the statements, you can refer to the value being matched by 'arg', -// and refer to its type by 'arg_type'. -// -// The description string documents what the matcher does, and is used -// to generate the failure message when the match fails. Since a -// MATCHER() is usually defined in a header file shared by multiple -// C++ source files, we require the description to be a C-string -// literal to avoid possible side effects. It can be empty, in which -// case we'll use the sequence of words in the matcher name as the -// description. -// -// For example: -// -// MATCHER(IsEven, "") { return (arg % 2) == 0; } -// -// allows you to write -// -// // Expects mock_foo.Bar(n) to be called where n is even. -// EXPECT_CALL(mock_foo, Bar(IsEven())); -// -// or, -// -// // Verifies that the value of some_expression is even. -// EXPECT_THAT(some_expression, IsEven()); -// -// If the above assertion fails, it will print something like: -// -// Value of: some_expression -// Expected: is even -// Actual: 7 -// -// where the description "is even" is automatically calculated from the -// matcher name IsEven. -// -// Argument Type -// ============= -// -// Note that the type of the value being matched (arg_type) is -// determined by the context in which you use the matcher and is -// supplied to you by the compiler, so you don't need to worry about -// declaring it (nor can you). This allows the matcher to be -// polymorphic. For example, IsEven() can be used to match any type -// where the value of "(arg % 2) == 0" can be implicitly converted to -// a bool. In the "Bar(IsEven())" example above, if method Bar() -// takes an int, 'arg_type' will be int; if it takes an unsigned long, -// 'arg_type' will be unsigned long; and so on. -// -// Parameterizing Matchers -// ======================= -// -// Sometimes you'll want to parameterize the matcher. For that you -// can use another macro: -// -// MATCHER_P(name, param_name, description_string) { statements; } -// -// For example: -// -// MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; } -// -// will allow you to write: -// -// EXPECT_THAT(Blah("a"), HasAbsoluteValue(n)); -// -// which may lead to this message (assuming n is 10): -// -// Value of: Blah("a") -// Expected: has absolute value 10 -// Actual: -9 -// -// Note that both the matcher description and its parameter are -// printed, making the message human-friendly. -// -// In the matcher definition body, you can write 'foo_type' to -// reference the type of a parameter named 'foo'. For example, in the -// body of MATCHER_P(HasAbsoluteValue, value) above, you can write -// 'value_type' to refer to the type of 'value'. -// -// We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P$n to -// support multi-parameter matchers. -// -// Describing Parameterized Matchers -// ================================= -// -// The last argument to MATCHER*() is a string-typed expression. The -// expression can reference all of the matcher's parameters and a -// special bool-typed variable named 'negation'. When 'negation' is -// false, the expression should evaluate to the matcher's description; -// otherwise it should evaluate to the description of the negation of -// the matcher. For example, -// -// using testing::PrintToString; -// -// MATCHER_P2(InClosedRange, low, hi, -// std::string(negation ? "is not" : "is") + " in range [" + -// PrintToString(low) + ", " + PrintToString(hi) + "]") { -// return low <= arg && arg <= hi; -// } -// ... -// EXPECT_THAT(3, InClosedRange(4, 6)); -// EXPECT_THAT(3, Not(InClosedRange(2, 4))); -// -// would generate two failures that contain the text: -// -// Expected: is in range [4, 6] -// ... -// Expected: is not in range [2, 4] -// -// If you specify "" as the description, the failure message will -// contain the sequence of words in the matcher name followed by the -// parameter values printed as a tuple. For example, -// -// MATCHER_P2(InClosedRange, low, hi, "") { ... } -// ... -// EXPECT_THAT(3, InClosedRange(4, 6)); -// EXPECT_THAT(3, Not(InClosedRange(2, 4))); -// -// would generate two failures that contain the text: -// -// Expected: in closed range (4, 6) -// ... -// Expected: not (in closed range (2, 4)) -// -// Types of Matcher Parameters -// =========================== -// -// For the purpose of typing, you can view -// -// MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... } -// -// as shorthand for -// -// template -// FooMatcherPk -// Foo(p1_type p1, ..., pk_type pk) { ... } -// -// When you write Foo(v1, ..., vk), the compiler infers the types of -// the parameters v1, ..., and vk for you. If you are not happy with -// the result of the type inference, you can specify the types by -// explicitly instantiating the template, as in Foo(5, -// false). As said earlier, you don't get to (or need to) specify -// 'arg_type' as that's determined by the context in which the matcher -// is used. You can assign the result of expression Foo(p1, ..., pk) -// to a variable of type FooMatcherPk. This -// can be useful when composing matchers. -// -// While you can instantiate a matcher template with reference types, -// passing the parameters by pointer usually makes your code more -// readable. If, however, you still want to pass a parameter by -// reference, be aware that in the failure message generated by the -// matcher you will see the value of the referenced object but not its -// address. -// -// Explaining Match Results -// ======================== -// -// Sometimes the matcher description alone isn't enough to explain why -// the match has failed or succeeded. For example, when expecting a -// long string, it can be very helpful to also print the diff between -// the expected string and the actual one. To achieve that, you can -// optionally stream additional information to a special variable -// named result_listener, whose type is a pointer to class -// MatchResultListener: -// -// MATCHER_P(EqualsLongString, str, "") { -// if (arg == str) return true; -// -// *result_listener << "the difference: " -/// << DiffStrings(str, arg); -// return false; -// } -// -// Overloading Matchers -// ==================== -// -// You can overload matchers with different numbers of parameters: -// -// MATCHER_P(Blah, a, description_string1) { ... } -// MATCHER_P2(Blah, a, b, description_string2) { ... } -// -// Caveats -// ======= -// -// When defining a new matcher, you should also consider implementing -// MatcherInterface or using MakePolymorphicMatcher(). These -// approaches require more work than the MATCHER* macros, but also -// give you more control on the types of the value being matched and -// the matcher parameters, which may leads to better compiler error -// messages when the matcher is used wrong. They also allow -// overloading matchers based on parameter types (as opposed to just -// based on the number of parameters). -// -// MATCHER*() can only be used in a namespace scope as templates cannot be -// declared inside of a local class. -// -// More Information -// ================ -// -// To learn more about using these macros, please search for 'MATCHER' -// on -// https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md -// -// This file also implements some commonly used argument matchers. More -// matchers can be defined by the user implementing the -// MatcherInterface interface if necessary. -// -// See googletest/include/gtest/gtest-matchers.h for the definition of class -// Matcher, class MatcherInterface, and others. - -// IWYU pragma: private, include "gmock/gmock.h" -// IWYU pragma: friend gmock/.* - -#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ -#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include // NOLINT -#include -#include -#include -#include -#include - -#include "gmock/internal/gmock-internal-utils.h" -#include "gmock/internal/gmock-port.h" -#include "gmock/internal/gmock-pp.h" -#include "gtest/gtest.h" - -// MSVC warning C5046 is new as of VS2017 version 15.8. -#if defined(_MSC_VER) && _MSC_VER >= 1915 -#define GMOCK_MAYBE_5046_ 5046 -#else -#define GMOCK_MAYBE_5046_ -#endif - -GTEST_DISABLE_MSC_WARNINGS_PUSH_( - 4251 GMOCK_MAYBE_5046_ /* class A needs to have dll-interface to be used by - clients of class B */ - /* Symbol involving type with internal linkage not defined */) - -namespace testing { - -// To implement a matcher Foo for type T, define: -// 1. a class FooMatcherImpl that implements the -// MatcherInterface interface, and -// 2. a factory function that creates a Matcher object from a -// FooMatcherImpl*. -// -// The two-level delegation design makes it possible to allow a user -// to write "v" instead of "Eq(v)" where a Matcher is expected, which -// is impossible if we pass matchers by pointers. It also eases -// ownership management as Matcher objects can now be copied like -// plain values. - -// A match result listener that stores the explanation in a string. -class StringMatchResultListener : public MatchResultListener { - public: - StringMatchResultListener() : MatchResultListener(&ss_) {} - - // Returns the explanation accumulated so far. - std::string str() const { return ss_.str(); } - - // Clears the explanation accumulated so far. - void Clear() { ss_.str(""); } - - private: - ::std::stringstream ss_; - - StringMatchResultListener(const StringMatchResultListener&) = delete; - StringMatchResultListener& operator=(const StringMatchResultListener&) = - delete; -}; - -// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION -// and MUST NOT BE USED IN USER CODE!!! -namespace internal { - -// The MatcherCastImpl class template is a helper for implementing -// MatcherCast(). We need this helper in order to partially -// specialize the implementation of MatcherCast() (C++ allows -// class/struct templates to be partially specialized, but not -// function templates.). - -// This general version is used when MatcherCast()'s argument is a -// polymorphic matcher (i.e. something that can be converted to a -// Matcher but is not one yet; for example, Eq(value)) or a value (for -// example, "hello"). -template -class MatcherCastImpl { - public: - static Matcher Cast(const M& polymorphic_matcher_or_value) { - // M can be a polymorphic matcher, in which case we want to use - // its conversion operator to create Matcher. Or it can be a value - // that should be passed to the Matcher's constructor. - // - // We can't call Matcher(polymorphic_matcher_or_value) when M is a - // polymorphic matcher because it'll be ambiguous if T has an implicit - // constructor from M (this usually happens when T has an implicit - // constructor from any type). - // - // It won't work to unconditionally implicit_cast - // polymorphic_matcher_or_value to Matcher because it won't trigger - // a user-defined conversion from M to T if one exists (assuming M is - // a value). - return CastImpl(polymorphic_matcher_or_value, - std::is_convertible>{}, - std::is_convertible{}); - } - - private: - template - static Matcher CastImpl(const M& polymorphic_matcher_or_value, - std::true_type /* convertible_to_matcher */, - std::integral_constant) { - // M is implicitly convertible to Matcher, which means that either - // M is a polymorphic matcher or Matcher has an implicit constructor - // from M. In both cases using the implicit conversion will produce a - // matcher. - // - // Even if T has an implicit constructor from M, it won't be called because - // creating Matcher would require a chain of two user-defined conversions - // (first to create T from M and then to create Matcher from T). - return polymorphic_matcher_or_value; - } - - // M can't be implicitly converted to Matcher, so M isn't a polymorphic - // matcher. It's a value of a type implicitly convertible to T. Use direct - // initialization to create a matcher. - static Matcher CastImpl(const M& value, - std::false_type /* convertible_to_matcher */, - std::true_type /* convertible_to_T */) { - return Matcher(ImplicitCast_(value)); - } - - // M can't be implicitly converted to either Matcher or T. Attempt to use - // polymorphic matcher Eq(value) in this case. - // - // Note that we first attempt to perform an implicit cast on the value and - // only fall back to the polymorphic Eq() matcher afterwards because the - // latter calls bool operator==(const Lhs& lhs, const Rhs& rhs) in the end - // which might be undefined even when Rhs is implicitly convertible to Lhs - // (e.g. std::pair vs. std::pair). - // - // We don't define this method inline as we need the declaration of Eq(). - static Matcher CastImpl(const M& value, - std::false_type /* convertible_to_matcher */, - std::false_type /* convertible_to_T */); -}; - -// This more specialized version is used when MatcherCast()'s argument -// is already a Matcher. This only compiles when type T can be -// statically converted to type U. -template -class MatcherCastImpl> { - public: - static Matcher Cast(const Matcher& source_matcher) { - return Matcher(new Impl(source_matcher)); - } - - private: - class Impl : public MatcherInterface { - public: - explicit Impl(const Matcher& source_matcher) - : source_matcher_(source_matcher) {} - - // We delegate the matching logic to the source matcher. - bool MatchAndExplain(T x, MatchResultListener* listener) const override { - using FromType = typename std::remove_cv::type>::type>::type; - using ToType = typename std::remove_cv::type>::type>::type; - // Do not allow implicitly converting base*/& to derived*/&. - static_assert( - // Do not trigger if only one of them is a pointer. That implies a - // regular conversion and not a down_cast. - (std::is_pointer::type>::value != - std::is_pointer::type>::value) || - std::is_same::value || - !std::is_base_of::value, - "Can't implicitly convert from to "); - - // Do the cast to `U` explicitly if necessary. - // Otherwise, let implicit conversions do the trick. - using CastType = - typename std::conditional::value, - T&, U>::type; - - return source_matcher_.MatchAndExplain(static_cast(x), - listener); - } - - void DescribeTo(::std::ostream* os) const override { - source_matcher_.DescribeTo(os); - } - - void DescribeNegationTo(::std::ostream* os) const override { - source_matcher_.DescribeNegationTo(os); - } - - private: - const Matcher source_matcher_; - }; -}; - -// This even more specialized version is used for efficiently casting -// a matcher to its own type. -template -class MatcherCastImpl> { - public: - static Matcher Cast(const Matcher& matcher) { return matcher; } -}; - -// Template specialization for parameterless Matcher. -template -class MatcherBaseImpl { - public: - MatcherBaseImpl() = default; - - template - operator ::testing::Matcher() const { // NOLINT(runtime/explicit) - return ::testing::Matcher(new - typename Derived::template gmock_Impl()); - } -}; - -// Template specialization for Matcher with parameters. -template