@@ -143,6 +143,7 @@ TEST_CASE( "Slicing" ) {
143
143
TEST_CASE ( " Iteration" ) {
144
144
sys_string str = S (" a水𐀀𝄞" );
145
145
sys_string empty = S (" " );
146
+ sys_string long_str = sys_string (std::string (4096 , ' a' ));
146
147
147
148
SUBCASE (" utf8" ) {
148
149
std::string converted;
@@ -182,6 +183,11 @@ TEST_CASE( "Iteration" ) {
182
183
converted.push_back (c);
183
184
}
184
185
CHECK (converted.empty ());
186
+
187
+ size_t acc = 0 ;
188
+ for (char c: sys_string::utf8_access (long_str))
189
+ acc += c;
190
+ CHECK (acc == size_t (4096 ) * ' a' );
185
191
}
186
192
187
193
SUBCASE (" utf16" ) {
@@ -222,6 +228,11 @@ TEST_CASE( "Iteration" ) {
222
228
converted.push_back (c);
223
229
}
224
230
CHECK (converted.empty ());
231
+
232
+ size_t acc = 0 ;
233
+ for (char16_t c: sys_string::utf16_access (long_str))
234
+ acc += c;
235
+ CHECK (acc == size_t (4096 ) * u' a' );
225
236
}
226
237
227
238
SUBCASE (" utf32" ) {
@@ -266,6 +277,11 @@ TEST_CASE( "Iteration" ) {
266
277
267
278
sys_string part (++(++view.begin ()), view.end ());
268
279
CHECK (part == S (" 𐀀𝄞" ));
280
+
281
+ size_t acc = 0 ;
282
+ for (char32_t c: sys_string::utf32_access (long_str))
283
+ acc += c;
284
+ CHECK (acc == size_t (4096 ) * U' a' );
269
285
}
270
286
271
287
SUBCASE (" storage" ) {
@@ -292,6 +308,14 @@ TEST_CASE( "Iteration" ) {
292
308
293
309
sys_string part (access .begin () + 1 , access .end ());
294
310
CHECK (part == S (" 水𐀀𝄞" ));
311
+
312
+ size_t acc = 0 ;
313
+ for (sys_string::storage_type c: sys_string::char_access (long_str))
314
+ acc += c;
315
+ CHECK (acc == size_t (4096 ) * ' a' );
316
+
317
+ sys_string::char_access long_acc (long_str);
318
+ CHECK (long_acc[1024 ] == sys_string::storage_type (' a' ));
295
319
}
296
320
}
297
321
@@ -300,6 +324,10 @@ TEST_CASE( "Comparsion" ) {
300
324
CHECK (sys_string () == sys_string ());
301
325
CHECK (sys_string () == S (" " ));
302
326
CHECK (S (" " ) == S (" " ));
327
+ CHECK (S (" abc" ) != sys_string ());
328
+ CHECK (compare (S (" " ), sys_string ()) == std::strong_ordering::equal);
329
+ CHECK (compare (sys_string (), S (" abc" )) == std::strong_ordering::less);
330
+
303
331
304
332
CHECK (is_eq (compare_no_case (sys_string (), sys_string ())));
305
333
CHECK (is_eq (compare_no_case (sys_string (), S (" " ))));
@@ -336,6 +364,17 @@ TEST_CASE( "Comparsion" ) {
336
364
337
365
}
338
366
367
+ TEST_CASE ( " Hash" ) {
368
+ std::hash<sys_string> hasher;
369
+
370
+ CHECK (hasher (sys_string ()) == hasher (sys_string ()));
371
+ CHECK (hasher (S (" " )) == hasher (S (" " )));
372
+ CHECK (hasher (S (" " )) == hasher (sys_string ()));
373
+ CHECK (hasher (S (" abc" )) == hasher (S (" abc" )));
374
+ // technically this could fail but this means the hash function is atrocious...
375
+ CHECK (hasher (S (" a" )) != hasher (S (" b" )));
376
+ }
377
+
339
378
TEST_CASE ( " Case conversion" ) {
340
379
341
380
CHECK (S (" maße" ).to_upper () == S (" MASSE" ));
@@ -694,6 +733,53 @@ TEST_CASE( "c_str" ) {
694
733
CHECK (access .c_str () == cstr);
695
734
}
696
735
736
+ TEST_CASE ( " data" ) {
737
+ const sys_string & str = S (" a🧡bc" );
738
+
739
+ auto * data = str.data ();
740
+ if (data)
741
+ {
742
+ if constexpr (std::is_same_v<sys_string::storage_type, char >)
743
+ {
744
+ REQUIRE (str.storage_size () == strlen (" a🧡bc" ));
745
+ CHECK (memcmp (data, " a🧡bc" , str.storage_size ()) == 0 );
746
+ }
747
+ else if constexpr (std::is_same_v<sys_string::storage_type, char16_t >)
748
+ {
749
+ REQUIRE (str.storage_size () == std::char_traits<char16_t >::length (u" a🧡bc" ));
750
+ CHECK (memcmp (data, u" a🧡bc" , str.storage_size () * sizeof (sys_string::storage_type)) == 0 );
751
+ }
752
+ else
753
+ {
754
+ REQUIRE (str.storage_size () == std::char_traits<char32_t >::length (U" a🧡bc" ));
755
+ CHECK (memcmp (data, U" a🧡bc" , str.storage_size () * sizeof (sys_string::storage_type)) == 0 );
756
+ }
757
+ }
758
+ std::vector<sys_string::storage_type> buf (str.storage_size () + 5 );
759
+ auto res = str.copy_data (0 , buf.data (), buf.size ());
760
+ REQUIRE (res == str.storage_size ());
761
+
762
+ if constexpr (std::is_same_v<sys_string::storage_type, char >)
763
+ CHECK (memcmp (buf.data (), " a🧡bc" , str.storage_size ()) == 0 );
764
+ else if constexpr (std::is_same_v<sys_string::storage_type, char16_t >)
765
+ CHECK (memcmp (buf.data (), u" a🧡bc" , str.storage_size () * sizeof (sys_string::storage_type)) == 0 );
766
+ else
767
+ CHECK (memcmp (buf.data (), U" a🧡bc" , str.storage_size () * sizeof (sys_string::storage_type)) == 0 );
768
+
769
+ res = str.copy_data (1 , buf.data (), buf.size ());
770
+ REQUIRE (res == str.storage_size () - 1 );
771
+
772
+ if constexpr (std::is_same_v<sys_string::storage_type, char >)
773
+ CHECK (memcmp (buf.data (), (" a🧡bc" ) + 1 , str.storage_size () - 1 ) == 0 );
774
+ else if constexpr (std::is_same_v<sys_string::storage_type, char16_t >)
775
+ CHECK (memcmp (buf.data (), (u" a🧡bc" ) + 1 , (str.storage_size () - 1 ) * sizeof (sys_string::storage_type)) == 0 );
776
+ else
777
+ CHECK (memcmp (buf.data (), (U" a🧡bc" ) + 1 , (str.storage_size () - 1 ) * sizeof (sys_string::storage_type)) == 0 );
778
+
779
+ res = sys_string ().copy_data (0 , buf.data (), buf.size ());
780
+ REQUIRE (res == 0 );
781
+ }
782
+
697
783
TEST_CASE ( " ostream" ) {
698
784
699
785
{
0 commit comments