Skip to content

Commit cadc219

Browse files
committed
More tests
1 parent 37d9447 commit cadc219

File tree

2 files changed

+95
-0
lines changed

2 files changed

+95
-0
lines changed

test/test_general.cpp

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ TEST_CASE( "Slicing" ) {
143143
TEST_CASE( "Iteration" ) {
144144
sys_string str = S("a水𐀀𝄞");
145145
sys_string empty = S("");
146+
sys_string long_str = sys_string(std::string(4096, 'a'));
146147

147148
SUBCASE("utf8") {
148149
std::string converted;
@@ -182,6 +183,11 @@ TEST_CASE( "Iteration" ) {
182183
converted.push_back(c);
183184
}
184185
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');
185191
}
186192

187193
SUBCASE("utf16") {
@@ -222,6 +228,11 @@ TEST_CASE( "Iteration" ) {
222228
converted.push_back(c);
223229
}
224230
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');
225236
}
226237

227238
SUBCASE("utf32") {
@@ -266,6 +277,11 @@ TEST_CASE( "Iteration" ) {
266277

267278
sys_string part(++(++view.begin()), view.end());
268279
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');
269285
}
270286

271287
SUBCASE("storage") {
@@ -292,6 +308,14 @@ TEST_CASE( "Iteration" ) {
292308

293309
sys_string part(access.begin() + 1, access.end());
294310
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'));
295319
}
296320
}
297321

@@ -300,6 +324,10 @@ TEST_CASE( "Comparsion" ) {
300324
CHECK(sys_string() == sys_string());
301325
CHECK(sys_string() == S(""));
302326
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+
303331

304332
CHECK(is_eq(compare_no_case(sys_string(), sys_string())));
305333
CHECK(is_eq(compare_no_case(sys_string(), S(""))));
@@ -336,6 +364,17 @@ TEST_CASE( "Comparsion" ) {
336364

337365
}
338366

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+
339378
TEST_CASE( "Case conversion" ) {
340379

341380
CHECK(S("maße").to_upper() == S("MASSE"));
@@ -694,6 +733,53 @@ TEST_CASE( "c_str" ) {
694733
CHECK(access.c_str() == cstr);
695734
}
696735

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+
697783
TEST_CASE( "ostream" ) {
698784

699785
{

test/test_utf_iteration.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,27 +754,36 @@ TEST_CASE( "UTF32 Iteration on UTF32 sequence" ) {
754754

755755
TEST_CASE( "Ranges" ) {
756756
std::stringstream stream("abc");
757+
std::vector vec({'a', 'b', 'c'});
758+
std::forward_list flist({'a', 'b', 'c'});
757759

758760
CHECK(std::ranges::equal(as_utf32(std::vector({'a', 'b', 'c'})), std::array{U'a', U'b', U'c'}));
761+
CHECK(std::ranges::equal(as_utf32(vec), std::array{U'a', U'b', U'c'}));
759762
#if __cpp_lib_ranges >= 202202L
760763
CHECK(std::ranges::equal(std::vector({'a', 'b', 'c'}) | as_utf32, std::array{U'a', U'b', U'c'}));
764+
CHECK(std::ranges::equal(vec | as_utf32, std::array{U'a', U'b', U'c'}));
761765
#endif
762766
CHECK(std::ranges::equal(as_utf32(std::forward_list({'a', 'b', 'c'})), std::array{U'a', U'b', U'c'}));
767+
CHECK(std::ranges::equal(as_utf32(flist), std::array{U'a', U'b', U'c'}));
763768
CHECK(std::ranges::equal(as_utf32(std::ranges::istream_view<char>(stream)), std::array{U'a', U'b', U'c'}));
764769

765770
CHECK(std::ranges::equal(as_utf16(std::vector({'a', 'b', 'c'})), std::array{u'a', u'b', u'c'}));
766771
#if __cpp_lib_ranges >= 202202L
767772
CHECK(std::ranges::equal(std::vector({'a', 'b', 'c'}) | as_utf16, std::array{u'a', u'b', u'c'}));
773+
CHECK(std::ranges::equal(vec | as_utf16, std::array{u'a', u'b', u'c'}));
768774
#endif
769775
CHECK(std::ranges::equal(as_utf16(std::forward_list({'a', 'b', 'c'})), std::array{u'a', u'b', u'c'}));
776+
CHECK(std::ranges::equal(as_utf16(flist), std::array{u'a', u'b', u'c'}));
770777
stream.clear(); stream.seekg(0);
771778
CHECK(std::ranges::equal(as_utf16(std::ranges::istream_view<char>(stream)), std::array{u'a', u'b', u'c'}));
772779

773780
CHECK(std::ranges::equal(as_utf8(std::vector({u'a', u'b', u'c'})), std::array{'a', 'b', 'c'}));
774781
#if __cpp_lib_ranges >= 202202L
775782
CHECK(std::ranges::equal(std::vector({u'a', u'b', u'c'}) | as_utf8, std::array{'a', 'b', 'c'}));
783+
CHECK(std::ranges::equal(vec | as_utf8, std::array{'a', 'b', 'c'}));
776784
#endif
777785
CHECK(std::ranges::equal(as_utf8(std::forward_list({u'a', u'b', u'c'})), std::array{'a', 'b', 'c'}));
786+
CHECK(std::ranges::equal(as_utf8(flist), std::array{'a', 'b', 'c'}));
778787
stream.clear(); stream.seekg(0);
779788
CHECK(std::ranges::equal(as_utf8(std::ranges::istream_view<char>(stream)), std::array{'a', 'b', 'c'}));
780789
}

0 commit comments

Comments
 (0)