// // Copyright (c) 2025 Alexander Grund // // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #include #include #include "boostLocale/test/tools.hpp" #include #include /// Smoke test that std::regex works with generated locales template void test_by_char_impl(const std::locale& l) { using string_type = std::basic_string; // Needs at least a '\s' and '=' to reproduce issue #249 const string_type s_pattern = ascii_to(R"([[:alnum:]]+\s*= \d+)"); const string_type text = ascii_to("a2b2 = 42"); std::match_results pieces; // Sanity check using default locale std::basic_regex pattern{s_pattern}; if TEST(std::regex_match(text, pieces, pattern)) { TEST_EQ(pieces.size(), 1u); TEST_EQ(pieces[0].str(), text); pattern.imbue(l); pattern = s_pattern; if TEST(std::regex_match(text, pieces, pattern)) { TEST_EQ(pieces.size(), 1u); TEST_EQ(pieces[0].str(), text); } // Set via global locale const std::locale oldLoc = std::locale::global(l); std::basic_regex globalPattern{s_pattern}; if TEST(std::regex_match(text, pieces, globalPattern)) { TEST_EQ(pieces.size(), 1u); TEST_EQ(pieces[0].str(), text); } std::locale::global(oldLoc); } } template void test_by_char(const std::locale& loc, const std::locale& loc_collation, const std::locale& loc_no_collation) { test_by_char_impl(loc); { TEST_CONTEXT("without collation"); test_by_char_impl(loc_no_collation); } { TEST_CONTEXT("just collation"); test_by_char_impl(loc_collation); } } void test_main(int /*argc*/, char** /*argv*/) { for(const std::string& backend_name : boost::locale::localization_backend_manager::global().get_all_backends()) { TEST_CONTEXT("Backend: " << backend_name); boost::locale::localization_backend_manager tmp_backend = boost::locale::localization_backend_manager::global(); tmp_backend.select(backend_name); boost::locale::localization_backend_manager::global(tmp_backend); boost::locale::generator gen; const std::locale loc = gen("en_US.UTF-8"); gen.categories(gen.categories() ^ boost::locale::category_t::collation); const std::locale loc_no_collation = gen("en_US.UTF-8"); gen.categories(boost::locale::category_t::collation); const std::locale loc_collation = gen("en_US.UTF-8"); { TEST_CONTEXT("char"); test_by_char(loc, loc_collation, loc_no_collation); } { TEST_CONTEXT("wchar_t"); test_by_char(loc, loc_collation, loc_no_collation); } } }