diff --git a/test/core_name/Jamfile.v2 b/test/core_name/Jamfile.v2 index c95538e..238f94f 100644 --- a/test/core_name/Jamfile.v2 +++ b/test/core_name/Jamfile.v2 @@ -52,12 +52,14 @@ actions invoke_python_generator } make fields_names_nonascii.cpp : generate_fields_names_nonascii.cpp.py : @invoke_python_generator ; +make fields_names_big.cpp : generate_fields_names_big.cpp.py : @invoke_python_generator ; test-suite pfr_tests : [ run fields_names.cpp : : : : ] [ run fields_names_constexpr.cpp : : : : ] [ run fields_names_nonascii.cpp : : : msvc:"/utf-8" : ] + [ run fields_names_big.cpp : : : msvc:"/bigobj" : ] ; diff --git a/test/core_name/generate_fields_names_big.cpp.py b/test/core_name/generate_fields_names_big.cpp.py new file mode 100644 index 0000000..30f7fc8 --- /dev/null +++ b/test/core_name/generate_fields_names_big.cpp.py @@ -0,0 +1,163 @@ +# Copyright (c) 2023 Bela Schaum, X-Ryl669, Denis Mikhailov. +# +# Distributed under the Boost Software License, Version 1.0. (See accompanying +# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + + +# Initial implementation by Bela Schaum, https://github.com/schaumb +# The way to make it union and UB free by X-Ryl669, https://github.com/X-Ryl669 +# + +############################################################################################################################ + +import sys +import string +import random + +# a bigger value might lead to compiler out of heap space error on MSVC +STRUCT_COUNT = 50 +MAX_FIELD_COUNT = 50 + +MAIN_TEMPLATE = """#include +#include +#include + +#include + +namespace testing { + +template +auto make_stdarray(const Types&... t) { + return std::array, sizeof...(Types)>{t...}; +} + +%STRUCTS_LIST% + +%TEST_GET_NAME_DEFINITIONS_LIST% + +%TEST_GET_NAMES_AS_ARRAY_DEFINITIONS_LIST% + + +} // namespace testing + +int main() { + %TEST_GET_NAME_CALLS_LIST% + %TEST_GET_NAMES_AS_ARRAY_CALLS_LIST% + + return boost::report_errors(); +} +""" + +STRUCT_TEMPLATE = """struct Aggregate%STRUCT_ID% { + %FIELD_DEFINITIONS_LIST% +}; +""" + +STRUCT_FIELD_DEFINITION_TEMPLATE = """int %FIELD_NAME%; +""" + +TEST_GET_NAME_TEMPLATE = """void test_get_name_%TEST_ID%() { + %CHECKERS_LIST% +} +""" + +TEST_GET_NAME_CHECKER_TEMPLATE = """BOOST_TEST_EQ( ((boost::pfr::get_name<%FIELD_ID%, Aggregate%STRUCT_ID%>())), "%FIELD_NAME%"); +""" + +TEST_GET_NAMES_AS_ARRAY_TEMPLATE = """void test_names_as_array_%TEST_ID%() { + const auto expected = make_stdarray( + %FIELD_NAMES_LIST% + ); + const auto value = boost::pfr::names_as_array(); + BOOST_TEST_EQ(expected.size(), value.size()); + for (std::size_t i=0;i