xref: /llvm-project/libcxx/test/std/re/re.alg/re.alg.search/basic.locale.pass.cpp (revision fb855eb941b6d740cc6560297d0b4d3201dcaf9f)
1537d90dbSAlex Richardson //===----------------------------------------------------------------------===//
2537d90dbSAlex Richardson //
3537d90dbSAlex Richardson // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4537d90dbSAlex Richardson // See https://llvm.org/LICENSE.txt for license information.
5537d90dbSAlex Richardson // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6537d90dbSAlex Richardson //
7537d90dbSAlex Richardson //===----------------------------------------------------------------------===//
8537d90dbSAlex Richardson //
9537d90dbSAlex Richardson // NetBSD does not support LC_COLLATE at the moment
10537d90dbSAlex Richardson // XFAIL: netbsd
11bf4ddf18Szhijian // XFAIL: LIBCXX-AIX-FIXME
12537d90dbSAlex Richardson 
13537d90dbSAlex Richardson // REQUIRES: locale.cs_CZ.ISO8859-2
14537d90dbSAlex Richardson 
15537d90dbSAlex Richardson // <regex>
16537d90dbSAlex Richardson 
17537d90dbSAlex Richardson // template <class BidirectionalIterator, class Allocator, class charT, class traits>
18537d90dbSAlex Richardson //     bool
19537d90dbSAlex Richardson //     regex_search(BidirectionalIterator first, BidirectionalIterator last,
20537d90dbSAlex Richardson //                  match_results<BidirectionalIterator, Allocator>& m,
21537d90dbSAlex Richardson //                  const basic_regex<charT, traits>& e,
22537d90dbSAlex Richardson //                  regex_constants::match_flag_type flags = regex_constants::match_default);
23537d90dbSAlex Richardson 
24537d90dbSAlex Richardson // TODO: investigation needed
25c360553cSLouis Dionne // XFAIL: target={{.*}}-linux-gnu{{.*}}, freebsd
26537d90dbSAlex Richardson 
27537d90dbSAlex Richardson #include <regex>
28537d90dbSAlex Richardson #include <cassert>
29537d90dbSAlex Richardson #include "test_macros.h"
30537d90dbSAlex Richardson #include "test_iterators.h"
31537d90dbSAlex Richardson 
32537d90dbSAlex Richardson #include "platform_support.h" // locale name macros
33537d90dbSAlex Richardson 
main(int,char **)34537d90dbSAlex Richardson int main(int, char**)
35537d90dbSAlex Richardson {
36537d90dbSAlex Richardson     std::locale::global(std::locale(LOCALE_cs_CZ_ISO8859_2));
37537d90dbSAlex Richardson     {
38537d90dbSAlex Richardson         std::cmatch m;
39537d90dbSAlex Richardson         const char s[] = "m";
40537d90dbSAlex Richardson         assert(std::regex_search(s, m, std::regex("[a[=M=]z]",
41537d90dbSAlex Richardson                                                  std::regex_constants::basic)));
42537d90dbSAlex Richardson         assert(m.size() == 1);
43537d90dbSAlex Richardson         assert(!m.prefix().matched);
44537d90dbSAlex Richardson         assert(m.prefix().first == s);
45537d90dbSAlex Richardson         assert(m.prefix().second == m[0].first);
46537d90dbSAlex Richardson         assert(!m.suffix().matched);
47537d90dbSAlex Richardson         assert(m.suffix().first == m[0].second);
48537d90dbSAlex Richardson         assert(m.suffix().second == m[0].second);
49*fb855eb9SMark de Wever         assert(m.length(0) >= 0 && static_cast<std::size_t>(m.length(0)) == std::char_traits<char>::length(s));
50537d90dbSAlex Richardson         assert(m.position(0) == 0);
51537d90dbSAlex Richardson         assert(m.str(0) == s);
52537d90dbSAlex Richardson     }
53537d90dbSAlex Richardson     {
54537d90dbSAlex Richardson         std::cmatch m;
55537d90dbSAlex Richardson         const char s[] = "Ch";
56537d90dbSAlex Richardson         assert(std::regex_search(s, m, std::regex("[a[.ch.]z]",
57537d90dbSAlex Richardson                    std::regex_constants::basic | std::regex_constants::icase)));
58537d90dbSAlex Richardson         assert(m.size() == 1);
59537d90dbSAlex Richardson         assert(!m.prefix().matched);
60537d90dbSAlex Richardson         assert(m.prefix().first == s);
61537d90dbSAlex Richardson         assert(m.prefix().second == m[0].first);
62537d90dbSAlex Richardson         assert(!m.suffix().matched);
63537d90dbSAlex Richardson         assert(m.suffix().first == m[0].second);
64537d90dbSAlex Richardson         assert(m.suffix().second == m[0].second);
65*fb855eb9SMark de Wever         assert(m.length(0) >= 0 && static_cast<std::size_t>(m.length(0)) == std::char_traits<char>::length(s));
66537d90dbSAlex Richardson         assert(m.position(0) == 0);
67537d90dbSAlex Richardson         assert(m.str(0) == s);
68537d90dbSAlex Richardson     }
69537d90dbSAlex Richardson     std::locale::global(std::locale("C"));
70537d90dbSAlex Richardson     {
71537d90dbSAlex Richardson         std::cmatch m;
72537d90dbSAlex Richardson         const char s[] = "m";
73537d90dbSAlex Richardson         assert(!std::regex_search(s, m, std::regex("[a[=M=]z]",
74537d90dbSAlex Richardson                                                  std::regex_constants::basic)));
75537d90dbSAlex Richardson         assert(m.size() == 0);
76537d90dbSAlex Richardson     }
77f4c1258dSLouis Dionne 
78f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
79537d90dbSAlex Richardson     std::locale::global(std::locale(LOCALE_cs_CZ_ISO8859_2));
80537d90dbSAlex Richardson     {
81537d90dbSAlex Richardson         std::wcmatch m;
82537d90dbSAlex Richardson         const wchar_t s[] = L"m";
83537d90dbSAlex Richardson         assert(std::regex_search(s, m, std::wregex(L"[a[=M=]z]",
84537d90dbSAlex Richardson                                                  std::regex_constants::basic)));
85537d90dbSAlex Richardson         assert(m.size() == 1);
86537d90dbSAlex Richardson         assert(!m.prefix().matched);
87537d90dbSAlex Richardson         assert(m.prefix().first == s);
88537d90dbSAlex Richardson         assert(m.prefix().second == m[0].first);
89537d90dbSAlex Richardson         assert(!m.suffix().matched);
90537d90dbSAlex Richardson         assert(m.suffix().first == m[0].second);
91537d90dbSAlex Richardson         assert(m.suffix().second == m[0].second);
92*fb855eb9SMark de Wever         assert(m.length(0) >= 0 && static_cast<std::size_t>(m.length(0)) == std::char_traits<wchar_t>::length(s));
93537d90dbSAlex Richardson         assert(m.position(0) == 0);
94537d90dbSAlex Richardson         assert(m.str(0) == s);
95537d90dbSAlex Richardson     }
96537d90dbSAlex Richardson     {
97537d90dbSAlex Richardson         std::wcmatch m;
98537d90dbSAlex Richardson         const wchar_t s[] = L"Ch";
99537d90dbSAlex Richardson         assert(std::regex_search(s, m, std::wregex(L"[a[.ch.]z]",
100537d90dbSAlex Richardson                    std::regex_constants::basic | std::regex_constants::icase)));
101537d90dbSAlex Richardson         assert(m.size() == 1);
102537d90dbSAlex Richardson         assert(!m.prefix().matched);
103537d90dbSAlex Richardson         assert(m.prefix().first == s);
104537d90dbSAlex Richardson         assert(m.prefix().second == m[0].first);
105537d90dbSAlex Richardson         assert(!m.suffix().matched);
106537d90dbSAlex Richardson         assert(m.suffix().first == m[0].second);
107537d90dbSAlex Richardson         assert(m.suffix().second == m[0].second);
108*fb855eb9SMark de Wever         assert(m.length(0) >= 0 && static_cast<std::size_t>(m.length(0)) == std::char_traits<wchar_t>::length(s));
109537d90dbSAlex Richardson         assert(m.position(0) == 0);
110537d90dbSAlex Richardson         assert(m.str(0) == s);
111537d90dbSAlex Richardson     }
112537d90dbSAlex Richardson     std::locale::global(std::locale("C"));
113537d90dbSAlex Richardson     {
114537d90dbSAlex Richardson         std::wcmatch m;
115537d90dbSAlex Richardson         const wchar_t s[] = L"m";
116537d90dbSAlex Richardson         assert(!std::regex_search(s, m, std::wregex(L"[a[=M=]z]",
117537d90dbSAlex Richardson                                                  std::regex_constants::basic)));
118537d90dbSAlex Richardson         assert(m.size() == 0);
119537d90dbSAlex Richardson     }
120f4c1258dSLouis Dionne #endif // TEST_HAS_NO_WIDE_CHARACTERS
121f4c1258dSLouis Dionne 
122537d90dbSAlex Richardson     return 0;
123537d90dbSAlex Richardson }
124