Skip to content

Commit aa60e6a

Browse files
committed
#177-Test CppStringT::upper() with char and wchar_t
Completed. Validated. Expanded tests of `lower()`as well.
1 parent f95e30f commit aa60e6a

File tree

2 files changed

+80
-4
lines changed

2 files changed

+80
-4
lines changed

cpp-strings-tests/cpp-strings-tests.cpp

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1622,6 +1622,33 @@ namespace cppstringstests
16221622
Assert::AreEqual(pcs::to_lower(wch), ws[i]);
16231623
Assert::AreEqual(wchar_t(std::tolower(wch)), pcs::CppWString::lower(wch));
16241624
}
1625+
1626+
CppString s(255, '\0');
1627+
for (int i : std::views::iota(0, 256))
1628+
s[i] = CppString::value_type(i);
1629+
CppString res{ s.lower() };
1630+
for (auto const [cs, cr] : std::views::zip(s, res)) {
1631+
if (std::islower(cs))
1632+
Assert::IsTrue(std::islower(cr));
1633+
else if (std::isupper(cs))
1634+
Assert::IsTrue(std::islower(cr));
1635+
else
1636+
Assert::AreEqual(cs, cr);
1637+
}
1638+
1639+
CppWString ws(0xffff, '\0');
1640+
for (int i : std::views::iota(0, 0x1'0000))
1641+
ws[i] = CppWString::value_type(i);
1642+
CppWString wres{ ws.lower() };
1643+
for (auto const [wcs, wcr] : std::views::zip(ws, wres)) {
1644+
if (std::islower(wcs))
1645+
Assert::IsTrue(std::islower(wcr));
1646+
else if (std::isupper(wcs))
1647+
Assert::IsTrue(std::islower(wcr));
1648+
else
1649+
Assert::AreEqual(wcs, wcr);
1650+
}
1651+
16251652
}
16261653

16271654
TEST_METHOD(lstrip)
@@ -3900,5 +3927,55 @@ namespace cppstringstests
39003927
Assert::AreEqual(wexpected.c_str(), wtext.translate(wtrans_table).c_str());
39013928
}
39023929

3930+
TEST_METHOD(upper)
3931+
{
3932+
for (int c = 0; c <= 255; ++c) {
3933+
const char ch{ char(c) };
3934+
constexpr int N{ 5 };
3935+
pcs::CppString s(N, ch);
3936+
s.upper();
3937+
for (int i = 0; i < N; ++i)
3938+
Assert::AreEqual(pcs::to_upper(ch), s[i]);
3939+
Assert::AreEqual(char(std::toupper(ch)), pcs::CppString::upper(ch));
3940+
}
3941+
3942+
for (int c = 0; c <= 0xffff; ++c) {
3943+
const wchar_t wch{ wchar_t(c) };
3944+
constexpr int N{ 5 };
3945+
pcs::CppWString ws(N, wch);
3946+
ws.upper();
3947+
for (int i = 0; i < N; ++i)
3948+
Assert::AreEqual(pcs::to_upper(wch), ws[i]);
3949+
Assert::AreEqual(wchar_t(std::toupper(wch)), pcs::CppWString::upper(wch));
3950+
}
3951+
3952+
CppString s(255, '\0');
3953+
for (int i : std::views::iota(0, 256))
3954+
s[i] = CppString::value_type(i);
3955+
CppString res{ s.upper() };
3956+
for (auto const [cs, cr] : std::views::zip(s, res)) {
3957+
if (std::islower(cs))
3958+
Assert::IsTrue(std::isupper(cr));
3959+
else if (std::isupper(cs))
3960+
Assert::IsTrue(std::isupper(cr));
3961+
else
3962+
Assert::AreEqual(cs, cr);
3963+
}
3964+
3965+
CppWString ws(0xffff, '\0');
3966+
for (int i : std::views::iota(0, 0x1'0000))
3967+
ws[i] = CppWString::value_type(i);
3968+
CppWString wres{ ws.upper() };
3969+
for (auto const [wcs, wcr] : std::views::zip(ws, wres)) {
3970+
if (std::islower(wcs))
3971+
Assert::IsTrue(std::isupper(wcr));
3972+
else if (std::isupper(wcs))
3973+
Assert::IsTrue(std::isupper(wcr));
3974+
else
3975+
Assert::AreEqual(wcs, wcr);
3976+
}
3977+
3978+
}
3979+
39033980
};
39043981
}

cpp-strings/cppstrings.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1795,10 +1795,9 @@ namespace pcs // i.e. "pythonic c++ strings"
17951795
*/
17961796
inline CppStringT& upper() noexcept
17971797
{
1798-
std::transform(this->begin(), this->end(),
1799-
this->begin(),
1800-
[](value_type ch) { return this->upper(ch); });
1801-
return *this;
1798+
CppStringT res{};
1799+
std::ranges::transform(*this, std::back_inserter(res), [&](const value_type ch) -> value_type { return this->upper(ch); });
1800+
return *this = res;
18021801
}
18031802

18041803
/** \brief Returns uppercase conversion of the character.

0 commit comments

Comments
 (0)