7#include <gtest/gtest.h>
9#include "arccore/base/String.h"
10#include "arccore/base/TraceInfo.h"
11#include "arccore/base/StringView.h"
13#include "arccore/base/CoreArray.h"
14#include "arccore/base/BasicTranscoder.h"
19#ifdef ARCCORE_OS_WIN32
24using namespace Arcane::Impl;
34 explicit IosFlagsWrapper(std::ostream* o)
38 ~IosFlagsWrapper() { m_stream->flags(m_flags); }
42 std::ostream* m_stream;
43 std::ios_base::fmtflags m_flags;
46#ifdef ARCCORE_OS_WIN32
47void _testWStringWin32(
const char* str0)
49 std::wstring wideWhat;
50 int str0len = (int)std::strlen(str0);
51 int convertResult = MultiByteToWideChar(CP_UTF8, 0, str0, str0len, NULL, 0);
52 if (convertResult <= 0) {
53 wideWhat = L
"Exception occurred: Failure to convert its message text using MultiByteToWideChar: convertResult=";
56 wideWhat.resize(convertResult + 10);
57 convertResult = MultiByteToWideChar(CP_UTF8, 0, str0, str0len, wideWhat.data(), (
int)wideWhat.size());
58 if (convertResult <= 0) {
59 wideWhat = L
"Exception occurred: Failure to convert its message text using MultiByteToWideChar: convertResult=";
62 wideWhat.resize(convertResult);
66 std::cout <<
"STR0=" << str0 <<
" len=" << str0len <<
"\n";
67 std::cout <<
"convertResult=" << convertResult <<
"\n";
68 std::wcout <<
"WSTR0 len=" << wideWhat.length() <<
" v='" << wideWhat <<
"'\n ";
69 for (
int i = 0; i < convertResult; ++i)
70 std::wcout <<
"PRINT1 I=" << i <<
" V=" << wideWhat[i] <<
"\n";
72 for (
int i = 0; i < convertResult; ++i)
73 std::cout <<
"PRINT2 I=" << i <<
" V=" << std::hex <<
static_cast<int>(wideWhat[i]) <<
"\n";
77void _doConvertTest(
const char* name,
const String& str)
79 std::cout <<
"Name=" << name <<
"\n";
80 std::cout <<
"OrigUtf8 size=" << str.
utf8() <<
"\n";
85 BasicTranscoder::transcodeFromUtf8ToUtf16(utf8_orig_bytes, utf16_bytes);
87 std::cout <<
"OrigBytes=" << utf8_orig_bytes.constView() <<
"\n";
88 std::cout <<
"FinalTranscoderUtf16=" << utf16_bytes.
constView() <<
"\n";
89 std::cout <<
"FinalTranscoderUtf8=" << utf8_final_bytes.
constView() <<
"\n";
90 ASSERT_EQ(utf8_orig_bytes.constView(), utf8_final_bytes.
constView());
97 std::cout <<
"Utf16 bytes = " << utf16_bytes <<
"\n";
98 String str3(utf16_bytes.smallView());
99 std::cout <<
"ToUtf8 size=" << str3.bytes() <<
"\n";
100 ASSERT_EQ(str, str3);
110 IosFlagsWrapper io_wrapper(&std::cout);
112 String str1_direct =
"▲▼●■◆éà😀a😈";
113 std::cout <<
"STR1_UTF8=" << str1_direct <<
"\n";
115 std::array<Byte, 28> str1_bytes = { 0xE2, 0x96, 0xB2, 0xE2, 0x96, 0xBC, 0xE2, 0x97, 0x8F, 0xE2, 0x96, 0xA0, 0xE2, 0x97,
116 0x86, 0xC3, 0xA9, 0xC3, 0xA0, 0xF0, 0x9F, 0x98, 0x80, 0x61, 0xF0, 0x9F, 0x98, 0x88 };
118 String str1_orig(
"▲▼●■◆");
120#ifdef ARCCORE_OS_WIN32
121 _testWStringWin32(str1.localstr());
125 std::vector<UChar> big_endian_ref_vector{ 0x25b2, 0x25bc, 0x25cf, 0x25a0, 0x25c6, 0x00E9, 0x00E0, 0xD83D, 0xDE00, 0x0061, 0xD83D, 0xDE08 };
127 for (
int x : utf16_vector)
128 std::cout <<
"Utf16: " << std::hex << x <<
"\n";
129 ASSERT_EQ(big_endian_ref_vector, utf16_vector_direct);
130 ASSERT_EQ(big_endian_ref_vector, utf16_vector);
132 std::cout <<
"Utf16_size=" << utf16_bytes.smallView() <<
"\n";
134 std::cout <<
"BEFORE_CREATE_STR2\n";
135 String str2(utf16_bytes.smallView());
136 std::cout <<
"str1.utf16=" << str1.utf16() <<
"\n";
137 std::cout <<
"str2.utf16=" << str2.utf16() <<
"\n";
139 bool is_same = (str1 == str2);
141 std::cout <<
"is_same=" << is_same <<
"\n";
142 ASSERT_EQ(str1, str2);
144 std::cout <<
"str1.utf16=" << str1.utf16() <<
"\n";
145 std::cout <<
"str2.utf16=" << str2.utf16() <<
"\n";
148 ASSERT_EQ(str1.utf16().size(), 13);
149 ASSERT_EQ(str2.utf16().size(), 13);
151 ASSERT_EQ(str1.utf8().size(), str2.utf8().size());
152 ASSERT_EQ(str1.utf16().size(), str2.utf16().size());
157 ASSERT_EQ(b.
size(), 0);
159 ASSERT_EQ(u.
size(), 0);
165 ASSERT_EQ(b.
size(), 2);
167 ASSERT_EQ(u.
size(), 3);
172 std::array<Byte, 3> ref_a{ 0xe2, 0x82, 0xac };
175 ASSERT_EQ(b.
size(), 3);
176 ASSERT_EQ(b, ref_a_view);
178 ASSERT_EQ(u.
size(), 4);
180 for (
Integer i = 0; i < 3; ++i) {
181 ASSERT_EQ(u[i], ref_a[i]);
182 ASSERT_EQ(b[i], ref_a[i]);
187 _doConvertTest(
"X2", x2);
188 String x3 =
"\xe2\x82\xa1";
189 _doConvertTest(
"X3", x3);
190 String x4 =
"\xf0\x90\x8c\xbc";
191 _doConvertTest(
"X4", x4);
211 std::cout <<
"S2_8=" << s2 <<
'\n';
215 std::cout <<
"S2_9=" << s2 <<
'\n';
219 std::cout <<
"S2_10=" << s2 <<
'\n';
223 std::cout <<
"S2_11=" << s2 <<
'\n';
227 std::cout <<
"S2_12=" << s2 <<
'\n';
231 std::cout <<
"S2_13=" << s2 <<
'\n';
234 String g =
" \tceci \tcela ";
235 std::cout <<
" G= '" << g <<
"'" <<
'\n';
237 std::cout <<
" G2= '" << g2 <<
"'" <<
'\n';
239 std::cout <<
" G3= '" << g3 <<
"'" <<
'\n';
240 String expected_g3 =
" ceci cela ";
241 ASSERT_EQ(g3,expected_g3);
242 String expected_g2 =
"ceci cela";
243 ASSERT_EQ(g2,expected_g2);
247 std::cout <<
"GNULL2='" << gnull2 <<
"'" <<
'\n';
248 ASSERT_EQ(gnull2,
String());
252 std::cout <<
"GEMPTY2='" << gempty2 <<
"'" <<
'\n';
253 String expected_gempty2 =
"";
254 ASSERT_EQ(gempty2,expected_gempty2);
264 ASSERT_TRUE(kempty.contains(gnull)) <<
"Bad empty contains null";
265 ASSERT_TRUE(kempty.contains(gempty)) <<
"Bad empty contains null";
266 ASSERT_TRUE(k1.contains(gnull)) <<
"Bad null contains null";
267 ASSERT_TRUE(k1.contains(gempty)) <<
"Bad contains empty";
268 ASSERT_TRUE(k1.contains(k2)) <<
"Bad k1 contains k2";
273 String k0 =
":Toto::Titi:::Tata::::Tutu:Tete:";
276 std::cout <<
"ORIGINAL STRING TO STRING = '" << k0 <<
"'" <<
'\n';
277 std::vector<String> k0_list;
278 k0.
split(k0_list,
':');
279 for(
size_t i=0, n=k0_list.size(); i<n; ++i ){
280 std::cout <<
"K i=" << i <<
" v='" << k0_list[i] <<
"' is_null?=" << k0_list[i].null() <<
'\n';
282 ASSERT_EQ(k0_list[0],
String(
":Toto"));
283 ASSERT_EQ(k0_list[1],
String(
":Titi"));
284 ASSERT_EQ(k0_list[2],
String(
":"));
285 ASSERT_EQ(k0_list[3],
String(
"Tata"));
286 ASSERT_EQ(k0_list[4],
String(
":"));
287 ASSERT_EQ(k0_list[5],
String(
":Tutu"));
288 ASSERT_EQ(k0_list[6],
String(
"Tete"));
292TEST(
String, StdStringView)
294 const char* ref1 =
"S1éà";
295 const char* ref2 =
"ù*aXZáé";
297 const char* ref3 =
"S1éàù*aXZáé";
298 std::string std_ref3 { ref3 };
305 std::cout <<
"S1 '" << s1 <<
"'_SIZE=" << s1.
length() <<
'\n';
306 std::cout <<
"S2 '" << s2 <<
"'_SIZE=" << s2.
length() <<
'\n';
307 std::cout <<
"S3 '" << s3 <<
"'_SIZE=" << s3.
length() <<
'\n';
308 std::string_view vempty = sempty.toStdStringView();
309 ASSERT_EQ((Int64)vempty.size(),0) <<
"vempty.size()==0";
311 ASSERT_EQ((Int64)vnull.size(),0) <<
"vnull.size()==0";
313 ASSERT_EQ(v1,ref1) <<
"v1==ref1";
315 ASSERT_EQ(v2,ref2) <<
"v2==ref2";
317 ASSERT_EQ(v3,std_ref3) <<
"v3==ref3";
321 ASSERT_EQ(v4,v3) <<
"v4==v3";
325 ASSERT_EQ(v5,v4) <<
"v5==v4";
328 const char* t1 =
"testà1";
329 const char* t2 =
"testé2";
330 std::string st1 = t1;
331 std::string_view st1v = st1;
332 std::string st1_2 = st1 + t2;
338 ASSERT_EQ(s7,st1_2) <<
"s7==st1_2";
340 ASSERT_EQ(s8,st1_2) <<
"s8==st1_2";
342 ASSERT_EQ(s9,st1_2) <<
"s9==st1_2";
344 ASSERT_EQ(s10,st1_2) <<
"s10==st1_2";
#define ASSERT_FALSE(condition)
Vérifie que condition est faux.
#define ASSERT_TRUE(condition)
Vérifie que condition est vrai.
Fonctions utilitaires sur les chaînes de caractères.
ARCCORE_BASE_EXPORT std::vector< UChar > asUtf16BE(const String &str)
Retourne la conversion de l'instance dans l'encodage UTF-16BE.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
static void transcodeFromUtf16ToUtf8(Span< const UChar > utf16, CoreArray< Byte > &utf8)
Traduit depuis UTF16 vers UTF8.
Tableau interne pour Arccore.
ConstArrayView< DataType > constView() const
Vue constante.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Vue d'un tableau d'éléments de type T.
Chaîne de caractères unicode.
bool startsWith(const String &s) const
Indique si la chaîne commence par les caractères de s.
Int64 length() const
Retourne la longueur de la chaîne.
ByteConstArrayView utf8() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
static String replaceWhiteSpace(const String &rhs)
Effectue une normalisation des caractères espaces.
Span< const Byte > bytes() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
bool endsWith(const String &s) const
Indique si la chaîne se termine par les caractères de s.
void split(StringContainer &str_array, char c) const
Découpe la chaîne suivant le caractère c.
static String collapseWhiteSpace(const String &rhs)
Effectue une normalisation des caractères espaces.
bool contains(const String &s) const
Indique si la chaîne contient s.
std::string_view toStdStringView() const
Retourne une vue de la STL sur la chaîne actuelle.
String substring(Int64 pos) const
Sous-chaîne commençant à la position pos.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.