Foundation Classes - Enhance TCollection_ExtendedString with std::u16string_view support (#1009)

- Added constructor and assignment operator for std::u16string_view.
- Implemented conversion operator to std::u16string_view.
- Introduced methods to append std::u16string_view.
- Added Copy and assignment operator overloads for char16_t pointers.
- Fixed variable name inconsistencies (myLength vs mylength).
- Added new string manipulation methods: LeftAdjust, RightAdjust, LeftJustify, RightJustify, Center, Capitalize, Prepend, FirstLocationInSet, FirstLocationNotInSet, IntegerValue, IsIntegerValue, RealValue, IsRealValue, IsSameString.
This commit is contained in:
Pasukhin Dmitry
2026-01-18 21:07:30 +00:00
committed by GitHub
parent 13ab6349fd
commit 848bf7f697
4 changed files with 2262 additions and 565 deletions

View File

@@ -319,7 +319,7 @@ void XmlMDataStd_ExtStringArrayDriver::Paste(const occ::handle<TDF_Attribute>& t
}
if (xstr.SearchFromEnd(c) == isym - 1)
isym--; // replace the last separator by '\0'
xstr.SetValue(isym, '\0');
xstr.SetValue(isym, u'\0');
#ifdef _DEBUG
TCollection_AsciiString cstr(xstr, '?'); // deb
#endif

View File

@@ -13,6 +13,7 @@
#include <TCollection_ExtendedString.hxx>
#include <TCollection_AsciiString.hxx>
#include <Standard_OutOfRange.hxx>
#include <gtest/gtest.h>
@@ -444,3 +445,586 @@ TEST(TCollection_ExtendedStringTest, OCC3277_CatOperation)
// Verify the content matches
EXPECT_EQ(anInputString, aResult) << "Concatenated string should match input string";
}
// ========================================
// Tests for LeftAdjust method
// ========================================
TEST(TCollection_ExtendedStringTest, LeftAdjust_RemovesLeadingSpaces)
{
TCollection_ExtendedString aString(" Hello World");
aString.LeftAdjust();
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("Hello World", anAscii.ToCString());
}
TEST(TCollection_ExtendedStringTest, LeftAdjust_NoLeadingSpaces)
{
TCollection_ExtendedString aString("Hello World");
aString.LeftAdjust();
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("Hello World", anAscii.ToCString());
}
TEST(TCollection_ExtendedStringTest, LeftAdjust_AllSpaces)
{
TCollection_ExtendedString aString(" ");
aString.LeftAdjust();
EXPECT_TRUE(aString.IsEmpty());
}
TEST(TCollection_ExtendedStringTest, LeftAdjust_EmptyString)
{
TCollection_ExtendedString aString;
aString.LeftAdjust();
EXPECT_TRUE(aString.IsEmpty());
}
// ========================================
// Tests for RightAdjust method
// ========================================
TEST(TCollection_ExtendedStringTest, RightAdjust_RemovesTrailingSpaces)
{
TCollection_ExtendedString aString("Hello World ");
aString.RightAdjust();
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("Hello World", anAscii.ToCString());
}
TEST(TCollection_ExtendedStringTest, RightAdjust_NoTrailingSpaces)
{
TCollection_ExtendedString aString("Hello World");
aString.RightAdjust();
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("Hello World", anAscii.ToCString());
}
TEST(TCollection_ExtendedStringTest, RightAdjust_AllSpaces)
{
TCollection_ExtendedString aString(" ");
aString.RightAdjust();
EXPECT_TRUE(aString.IsEmpty());
}
// ========================================
// Tests for LeftJustify method
// ========================================
TEST(TCollection_ExtendedStringTest, LeftJustify_ExtendsWithFiller)
{
TCollection_ExtendedString aString("Hello");
aString.LeftJustify(10, '-');
EXPECT_EQ(10, aString.Length());
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("Hello-----", anAscii.ToCString());
}
TEST(TCollection_ExtendedStringTest, LeftJustify_NoChangeIfShorter)
{
TCollection_ExtendedString aString("Hello");
aString.LeftJustify(3, '-');
EXPECT_EQ(5, aString.Length());
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("Hello", anAscii.ToCString());
}
// ========================================
// Tests for RightJustify method
// ========================================
TEST(TCollection_ExtendedStringTest, RightJustify_ExtendsWithFiller)
{
TCollection_ExtendedString aString("Hello");
aString.RightJustify(10, '-');
EXPECT_EQ(10, aString.Length());
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("-----Hello", anAscii.ToCString());
}
TEST(TCollection_ExtendedStringTest, RightJustify_NoChangeIfShorter)
{
TCollection_ExtendedString aString("Hello");
aString.RightJustify(3, '-');
EXPECT_EQ(5, aString.Length());
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("Hello", anAscii.ToCString());
}
// ========================================
// Tests for Center method
// ========================================
TEST(TCollection_ExtendedStringTest, Center_CentersWithFiller)
{
TCollection_ExtendedString aString("Hi");
aString.Center(6, '-');
EXPECT_EQ(6, aString.Length());
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("--Hi--", anAscii.ToCString());
}
TEST(TCollection_ExtendedStringTest, Center_OddWidth)
{
TCollection_ExtendedString aString("Hi");
aString.Center(7, '-');
EXPECT_EQ(7, aString.Length());
TCollection_AsciiString anAscii(aString);
// 7 - 2 = 5, left = 2, right = 3
EXPECT_STREQ("--Hi---", anAscii.ToCString());
}
TEST(TCollection_ExtendedStringTest, Center_NoChangeIfShorter)
{
TCollection_ExtendedString aString("Hello");
aString.Center(3, '-');
EXPECT_EQ(5, aString.Length());
}
// ========================================
// Tests for Capitalize method
// ========================================
TEST(TCollection_ExtendedStringTest, Capitalize_UppercasesFirstLetter)
{
TCollection_ExtendedString aString("hello WORLD");
aString.Capitalize();
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("Hello world", anAscii.ToCString());
}
TEST(TCollection_ExtendedStringTest, Capitalize_AlreadyCapitalized)
{
TCollection_ExtendedString aString("Hello");
aString.Capitalize();
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("Hello", anAscii.ToCString());
}
TEST(TCollection_ExtendedStringTest, Capitalize_EmptyString)
{
TCollection_ExtendedString aString;
aString.Capitalize();
EXPECT_TRUE(aString.IsEmpty());
}
// ========================================
// Tests for Prepend method
// ========================================
TEST(TCollection_ExtendedStringTest, Prepend_InsertsAtBeginning)
{
TCollection_ExtendedString aString("World");
TCollection_ExtendedString aPrefix("Hello ");
aString.Prepend(aPrefix);
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("Hello World", anAscii.ToCString());
}
TEST(TCollection_ExtendedStringTest, Prepend_EmptyPrefix)
{
TCollection_ExtendedString aString("Hello");
TCollection_ExtendedString aPrefix;
aString.Prepend(aPrefix);
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("Hello", anAscii.ToCString());
}
TEST(TCollection_ExtendedStringTest, Prepend_ToEmptyString)
{
TCollection_ExtendedString aString;
TCollection_ExtendedString aPrefix("Hello");
aString.Prepend(aPrefix);
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("Hello", anAscii.ToCString());
}
// ========================================
// Tests for FirstLocationInSet method
// ========================================
TEST(TCollection_ExtendedStringTest, FirstLocationInSet_FindsCharacter)
{
TCollection_ExtendedString aString("Hello World");
TCollection_ExtendedString aSet("aeiou");
int aLoc = aString.FirstLocationInSet(aSet, 1, aString.Length());
EXPECT_EQ(2, aLoc); // 'e' at position 2
}
TEST(TCollection_ExtendedStringTest, FirstLocationInSet_NotFound)
{
TCollection_ExtendedString aString("BCDFG");
TCollection_ExtendedString aSet("aeiou");
int aLoc = aString.FirstLocationInSet(aSet, 1, aString.Length());
EXPECT_EQ(0, aLoc);
}
TEST(TCollection_ExtendedStringTest, FirstLocationInSet_EmptySet)
{
TCollection_ExtendedString aString("Hello");
TCollection_ExtendedString aSet;
int aLoc = aString.FirstLocationInSet(aSet, 1, aString.Length());
EXPECT_EQ(0, aLoc);
}
// ========================================
// Tests for FirstLocationNotInSet method
// ========================================
TEST(TCollection_ExtendedStringTest, FirstLocationNotInSet_FindsCharacter)
{
TCollection_ExtendedString aString("aaaHello");
TCollection_ExtendedString aSet("a");
int aLoc = aString.FirstLocationNotInSet(aSet, 1, aString.Length());
EXPECT_EQ(4, aLoc); // 'H' at position 4
}
TEST(TCollection_ExtendedStringTest, FirstLocationNotInSet_AllInSet)
{
TCollection_ExtendedString aString("aaa");
TCollection_ExtendedString aSet("a");
int aLoc = aString.FirstLocationNotInSet(aSet, 1, aString.Length());
EXPECT_EQ(0, aLoc);
}
TEST(TCollection_ExtendedStringTest, FirstLocationNotInSet_EmptySet)
{
TCollection_ExtendedString aString("Hello");
TCollection_ExtendedString aSet;
int aLoc = aString.FirstLocationNotInSet(aSet, 1, aString.Length());
EXPECT_EQ(1, aLoc); // First character is not in empty set
}
// ========================================
// Tests for IntegerValue and IsIntegerValue methods
// ========================================
TEST(TCollection_ExtendedStringTest, IntegerValue_ValidInteger)
{
TCollection_ExtendedString aString("12345");
EXPECT_TRUE(aString.IsIntegerValue());
EXPECT_EQ(12345, aString.IntegerValue());
}
TEST(TCollection_ExtendedStringTest, IntegerValue_NegativeInteger)
{
TCollection_ExtendedString aString("-42");
EXPECT_TRUE(aString.IsIntegerValue());
EXPECT_EQ(-42, aString.IntegerValue());
}
TEST(TCollection_ExtendedStringTest, IntegerValue_NotAnInteger)
{
TCollection_ExtendedString aString("Hello");
EXPECT_FALSE(aString.IsIntegerValue());
}
TEST(TCollection_ExtendedStringTest, IntegerValue_EmptyString)
{
TCollection_ExtendedString aString;
EXPECT_FALSE(aString.IsIntegerValue());
EXPECT_EQ(0, aString.IntegerValue());
}
// ========================================
// Tests for RealValue and IsRealValue methods
// ========================================
TEST(TCollection_ExtendedStringTest, RealValue_ValidReal)
{
TCollection_ExtendedString aString("3.14159");
EXPECT_TRUE(aString.IsRealValue(true));
EXPECT_NEAR(3.14159, aString.RealValue(), 0.00001);
}
TEST(TCollection_ExtendedStringTest, RealValue_Integer)
{
TCollection_ExtendedString aString("42");
EXPECT_TRUE(aString.IsRealValue(true));
EXPECT_NEAR(42.0, aString.RealValue(), 0.00001);
}
TEST(TCollection_ExtendedStringTest, RealValue_NotAReal)
{
TCollection_ExtendedString aString("Hello");
EXPECT_FALSE(aString.IsRealValue(true));
}
TEST(TCollection_ExtendedStringTest, RealValue_EmptyString)
{
TCollection_ExtendedString aString;
EXPECT_FALSE(aString.IsRealValue());
EXPECT_NEAR(0.0, aString.RealValue(), 0.00001);
}
// ========================================
// Tests for IsSameString method
// ========================================
TEST(TCollection_ExtendedStringTest, IsSameString_CaseSensitiveMatch)
{
TCollection_ExtendedString aString1("Hello");
TCollection_ExtendedString aString2("Hello");
EXPECT_TRUE(aString1.IsSameString(aString2, true));
}
TEST(TCollection_ExtendedStringTest, IsSameString_CaseSensitiveMismatch)
{
TCollection_ExtendedString aString1("Hello");
TCollection_ExtendedString aString2("hello");
EXPECT_FALSE(aString1.IsSameString(aString2, true));
}
TEST(TCollection_ExtendedStringTest, IsSameString_CaseInsensitiveMatch)
{
TCollection_ExtendedString aString1("Hello");
TCollection_ExtendedString aString2("HELLO");
EXPECT_TRUE(aString1.IsSameString(aString2, false));
}
TEST(TCollection_ExtendedStringTest, IsSameString_DifferentLengths)
{
TCollection_ExtendedString aString1("Hello");
TCollection_ExtendedString aString2("Hello World");
EXPECT_FALSE(aString1.IsSameString(aString2, false));
}
// ========================================
// Tests for C++17 std::u16string_view support
// ========================================
#if __cplusplus >= 201703L
TEST(TCollection_ExtendedStringTest, StringView_Constructor)
{
std::u16string_view aView(u"Hello World");
TCollection_ExtendedString aString(aView);
EXPECT_EQ(11, aString.Length());
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("Hello World", anAscii.ToCString());
}
TEST(TCollection_ExtendedStringTest, StringView_Assignment)
{
TCollection_ExtendedString aString("Original");
std::u16string_view aView(u"New Value");
aString = aView;
EXPECT_EQ(9, aString.Length());
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("New Value", anAscii.ToCString());
}
TEST(TCollection_ExtendedStringTest, StringView_AssignCat)
{
TCollection_ExtendedString aString("Hello");
std::u16string_view aView(u" World");
aString.AssignCat(aView);
EXPECT_EQ(11, aString.Length());
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("Hello World", anAscii.ToCString());
}
TEST(TCollection_ExtendedStringTest, StringView_Conversion)
{
TCollection_ExtendedString aString("Test");
std::u16string_view aView = aString;
EXPECT_EQ(4, aView.size());
EXPECT_EQ(u'T', aView[0]);
EXPECT_EQ(u'e', aView[1]);
}
TEST(TCollection_ExtendedStringTest, StringView_EmptyConstructor)
{
std::u16string_view aView;
TCollection_ExtendedString aString(aView);
EXPECT_TRUE(aString.IsEmpty());
}
#endif
// ========================================
// Tests for edge cases and error handling
// ========================================
TEST(TCollection_ExtendedStringTest, FillerConstructor_NegativeLength_Throws)
{
EXPECT_THROW(TCollection_ExtendedString(-5, u'X'), Standard_OutOfRange);
}
TEST(TCollection_ExtendedStringTest, FillerConstructor_ZeroLength)
{
const int aZeroLength = 0;
TCollection_ExtendedString aString(aZeroLength, u'X');
EXPECT_TRUE(aString.IsEmpty());
EXPECT_EQ(0, aString.Length());
}
// ========================================
// Tests for AssignCat self-append (aliasing)
// ========================================
TEST(TCollection_ExtendedStringTest, AssignCat_SelfAppend)
{
TCollection_ExtendedString aString("Hello");
aString.AssignCat(aString);
EXPECT_EQ(10, aString.Length());
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("HelloHello", anAscii.ToCString());
}
TEST(TCollection_ExtendedStringTest, AssignCat_SelfAppendMultiple)
{
TCollection_ExtendedString aString("AB");
aString.AssignCat(aString);
aString.AssignCat(aString);
EXPECT_EQ(8, aString.Length());
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("ABABABAB", anAscii.ToCString());
}
TEST(TCollection_ExtendedStringTest, AssignCat_PointerIntoSelf)
{
TCollection_ExtendedString aString("HelloWorld");
// Append substring of self starting at position 5 (0-based), length 5
aString.AssignCat(aString.ToExtString() + 5, 5);
EXPECT_EQ(15, aString.Length());
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("HelloWorldWorld", anAscii.ToCString());
}
TEST(TCollection_ExtendedStringTest, AssignCat_PointerIntoSelfBeginning)
{
TCollection_ExtendedString aString("Hello");
// Append first 3 characters of self
aString.AssignCat(aString.ToExtString(), 3);
EXPECT_EQ(8, aString.Length());
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("HelloHel", anAscii.ToCString());
}
// ========================================
// Tests for Prepend aliasing
// ========================================
TEST(TCollection_ExtendedStringTest, Prepend_PointerIntoSelf)
{
TCollection_ExtendedString aString("HelloWorld");
// Prepend substring of self starting at position 5 (0-based), length 5
aString.Prepend(aString.ToExtString() + 5, 5);
EXPECT_EQ(15, aString.Length());
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("WorldHelloWorld", anAscii.ToCString());
}
TEST(TCollection_ExtendedStringTest, Prepend_PointerIntoSelfBeginning)
{
TCollection_ExtendedString aString("Hello");
// Prepend first 3 characters of self
aString.Prepend(aString.ToExtString(), 3);
EXPECT_EQ(8, aString.Length());
TCollection_AsciiString anAscii(aString);
EXPECT_STREQ("HelHello", anAscii.ToCString());
}
// ========================================
// Tests for comparison methods with null/negative length
// ========================================
TEST(TCollection_ExtendedStringTest, IsEqual_NullPointer)
{
TCollection_ExtendedString aString("Hello");
EXPECT_FALSE(aString.IsEqual(nullptr, 5));
}
TEST(TCollection_ExtendedStringTest, IsEqual_NegativeLength)
{
TCollection_ExtendedString aString("Hello");
const char16_t* aOther = u"Hello";
EXPECT_FALSE(aString.IsEqual(aOther, -1));
}
TEST(TCollection_ExtendedStringTest, IsEqual_ZeroLengthNullPointer)
{
TCollection_ExtendedString aString;
// Empty string with null pointer and zero length should be equal
EXPECT_TRUE(aString.IsEqual(nullptr, 0));
}
TEST(TCollection_ExtendedStringTest, IsDifferent_NullPointer)
{
TCollection_ExtendedString aString("Hello");
EXPECT_TRUE(aString.IsDifferent(nullptr, 5));
}
TEST(TCollection_ExtendedStringTest, IsDifferent_NegativeLength)
{
TCollection_ExtendedString aString("Hello");
const char16_t* aOther = u"Hello";
EXPECT_TRUE(aString.IsDifferent(aOther, -1));
}
TEST(TCollection_ExtendedStringTest, IsLess_NullPointer)
{
TCollection_ExtendedString aString("Hello");
// Non-empty string is not less than null/invalid
EXPECT_FALSE(aString.IsLess(nullptr, 5));
}
TEST(TCollection_ExtendedStringTest, IsLess_NegativeLength)
{
TCollection_ExtendedString aString("Hello");
const char16_t* aOther = u"Hello";
EXPECT_FALSE(aString.IsLess(aOther, -1));
}
TEST(TCollection_ExtendedStringTest, IsGreater_NullPointer)
{
TCollection_ExtendedString aString("Hello");
// Non-empty string is greater than null/invalid
EXPECT_TRUE(aString.IsGreater(nullptr, 5));
}
TEST(TCollection_ExtendedStringTest, IsGreater_NegativeLength)
{
TCollection_ExtendedString aString("Hello");
const char16_t* aOther = u"Hello";
EXPECT_TRUE(aString.IsGreater(aOther, -1));
}
TEST(TCollection_ExtendedStringTest, StartsWith_NullPointer)
{
TCollection_ExtendedString aString("Hello");
EXPECT_FALSE(aString.StartsWith(nullptr, 3));
}
TEST(TCollection_ExtendedStringTest, StartsWith_NegativeLength)
{
TCollection_ExtendedString aString("Hello");
const char16_t* aPrefix = u"Hel";
EXPECT_FALSE(aString.StartsWith(aPrefix, -1));
}
TEST(TCollection_ExtendedStringTest, StartsWith_ZeroLength)
{
TCollection_ExtendedString aString("Hello");
// Any string starts with empty string
EXPECT_TRUE(aString.StartsWith(nullptr, 0));
}
TEST(TCollection_ExtendedStringTest, EndsWith_NullPointer)
{
TCollection_ExtendedString aString("Hello");
EXPECT_FALSE(aString.EndsWith(nullptr, 3));
}
TEST(TCollection_ExtendedStringTest, EndsWith_NegativeLength)
{
TCollection_ExtendedString aString("Hello");
const char16_t* aSuffix = u"llo";
EXPECT_FALSE(aString.EndsWith(aSuffix, -1));
}
TEST(TCollection_ExtendedStringTest, EndsWith_ZeroLength)
{
TCollection_ExtendedString aString("Hello");
// Any string ends with empty string
EXPECT_TRUE(aString.EndsWith(nullptr, 0));
}