diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index f673b9d6..3f874432 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -43,6 +43,7 @@ run test_ios_info.cpp ; run test_ios_prop.cpp ; run test_codecvt.cpp ; run test_codepage_converter.cpp ; +run test_std_regex.cpp ; run test_stream_io.cpp ; run test_message.cpp : $(BOOST_ROOT)/libs/locale/test ; run test_generator.cpp ; diff --git a/test/test_std_regex.cpp b/test/test_std_regex.cpp new file mode 100644 index 00000000..adacced5 --- /dev/null +++ b/test/test_std_regex.cpp @@ -0,0 +1,85 @@ +// +// 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); + } + } +}