Skip to content

Commit 3c14e29

Browse files
authored
Foundation Classes - Documentation update for TCollection (#665)
- Introduces helper functions for consistent padded memory allocation across AsciiString and ExtendedString classes - Improves documentation for UTF-8 conversion methods with clearer buffer allocation guidance - Adds comprehensive test coverage for string constructors, memory allocation, and UTF-8 conversion functionality
1 parent 687a36c commit 3c14e29

5 files changed

Lines changed: 370 additions & 16 deletions

File tree

src/FoundationClasses/TKernel/GTests/TCollection_AsciiString_Test.cxx

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
// Alternatively, this file may be used under the terms of Open CASCADE
1212
// commercial license or contractual agreement.
1313

14+
#include <TCollection_ExtendedString.hxx>
1415
#include <TCollection_AsciiString.hxx>
1516

1617
#include <gtest/gtest.h>
@@ -231,3 +232,130 @@ TEST(TCollection_AsciiStringTest, Split)
231232
EXPECT_STREQ("abcde", aString.ToCString());
232233
EXPECT_STREQ("fghij", remainder.ToCString());
233234
}
235+
236+
TEST(TCollection_AsciiStringTest, MemoryAllocation)
237+
{
238+
// Test memory allocation with various string lengths
239+
TCollection_AsciiString aString1("test");
240+
EXPECT_EQ(4, aString1.Length());
241+
242+
// Test allocation with different lengths
243+
for (Standard_Integer anIdx = 0; anIdx <= 20; ++anIdx)
244+
{
245+
TCollection_AsciiString aStr(anIdx, 'A');
246+
EXPECT_EQ(anIdx, aStr.Length());
247+
}
248+
}
249+
250+
TEST(TCollection_AsciiStringTest, LengthConstructor)
251+
{
252+
// Test constructor with string and maximum length
253+
const Standard_CString aSourceString = "This is a very long string";
254+
255+
TCollection_AsciiString aString1(aSourceString, 4);
256+
EXPECT_EQ(4, aString1.Length());
257+
EXPECT_STREQ("This", aString1.ToCString());
258+
259+
TCollection_AsciiString aString2(aSourceString, 7);
260+
EXPECT_EQ(7, aString2.Length());
261+
EXPECT_STREQ("This is", aString2.ToCString());
262+
263+
// Test with length exceeding source string
264+
TCollection_AsciiString aString3(aSourceString, 100);
265+
EXPECT_EQ(26, aString3.Length());
266+
EXPECT_STREQ(aSourceString, aString3.ToCString());
267+
}
268+
269+
TEST(TCollection_AsciiStringTest, ExtendedStringConversion)
270+
{
271+
// Test conversion from ExtendedString
272+
TCollection_ExtendedString anExtString("Hello World");
273+
TCollection_AsciiString anAsciiString(anExtString);
274+
275+
EXPECT_EQ(anExtString.Length(), anAsciiString.Length());
276+
EXPECT_STREQ("Hello World", anAsciiString.ToCString());
277+
}
278+
279+
TEST(TCollection_AsciiStringTest, NumericalConstructors)
280+
{
281+
// Test integer constructor
282+
TCollection_AsciiString anIntString(42);
283+
EXPECT_STREQ("42", anIntString.ToCString());
284+
285+
// Test real constructor
286+
TCollection_AsciiString aRealString(3.14);
287+
const Standard_CString aRealCStr = aRealString.ToCString();
288+
EXPECT_TRUE(strstr(aRealCStr, "3.14") != NULL);
289+
}
290+
291+
TEST(TCollection_AsciiStringTest, FillerConstructor)
292+
{
293+
// Test constructor with length and filler character
294+
TCollection_AsciiString aFilledString(5, '*');
295+
EXPECT_EQ(5, aFilledString.Length());
296+
EXPECT_STREQ("*****", aFilledString.ToCString());
297+
}
298+
299+
TEST(TCollection_AsciiStringTest, ConcatenationConstructors)
300+
{
301+
// Test string + character constructor
302+
TCollection_AsciiString aBaseString("Hello");
303+
TCollection_AsciiString aStringWithChar(aBaseString, '!');
304+
EXPECT_STREQ("Hello!", aStringWithChar.ToCString());
305+
306+
// Test string + C string constructor
307+
TCollection_AsciiString aStringWithCStr(aBaseString, " World");
308+
EXPECT_STREQ("Hello World", aStringWithCStr.ToCString());
309+
310+
// Test string + string constructor
311+
TCollection_AsciiString aSecondString(" Universe");
312+
TCollection_AsciiString aCombinedString(aBaseString, aSecondString);
313+
EXPECT_STREQ("Hello Universe", aCombinedString.ToCString());
314+
}
315+
316+
TEST(TCollection_AsciiStringTest, EdgeCases)
317+
{
318+
// Test empty string operations
319+
TCollection_AsciiString anEmptyString1;
320+
TCollection_AsciiString anEmptyString2("");
321+
322+
EXPECT_TRUE(anEmptyString1.IsEqual(anEmptyString2));
323+
EXPECT_EQ(0, anEmptyString1.Length());
324+
EXPECT_TRUE(anEmptyString1.IsEmpty());
325+
326+
// Test null character handling
327+
TCollection_AsciiString aNullCharString('\0');
328+
EXPECT_EQ(0, aNullCharString.Length());
329+
EXPECT_TRUE(aNullCharString.IsEmpty());
330+
}
331+
332+
TEST(TCollection_AsciiStringTest, LargeStrings)
333+
{
334+
// Test with large strings to verify memory allocation
335+
const Standard_Integer aLargeSize = 1000;
336+
TCollection_AsciiString aLargeString(aLargeSize, 'X');
337+
338+
EXPECT_EQ(aLargeSize, aLargeString.Length());
339+
EXPECT_EQ('X', aLargeString.Value(1));
340+
EXPECT_EQ('X', aLargeString.Value(aLargeSize));
341+
}
342+
343+
TEST(TCollection_AsciiStringTest, PaddingSafety)
344+
{
345+
// Test that internal padding works correctly for various lengths
346+
for (Standard_Integer anIdx = 1; anIdx <= 16; ++anIdx)
347+
{
348+
TCollection_AsciiString aTestString(anIdx, 'A');
349+
EXPECT_EQ(anIdx, aTestString.Length());
350+
351+
// Verify null termination
352+
const Standard_CString aCString = aTestString.ToCString();
353+
EXPECT_EQ('\0', aCString[anIdx]);
354+
355+
// Verify content
356+
for (Standard_Integer aCharIdx = 0; aCharIdx < anIdx; ++aCharIdx)
357+
{
358+
EXPECT_EQ('A', aCString[aCharIdx]);
359+
}
360+
}
361+
}

src/FoundationClasses/TKernel/GTests/TCollection_ExtendedString_Test.cxx

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,3 +205,211 @@ TEST(TCollection_ExtendedStringTest, ChangeAll)
205205
TCollection_AsciiString asciiResult(aString);
206206
EXPECT_STREQ("HellXX WXXrld", asciiResult.ToCString());
207207
}
208+
209+
TEST(TCollection_ExtendedStringTest, UTF8Conversion)
210+
{
211+
// Test the LengthOfCString() and ToUTF8CString() combination
212+
TCollection_ExtendedString aString("Hello World");
213+
214+
Standard_Integer aBufferSize = aString.LengthOfCString();
215+
EXPECT_GT(aBufferSize, 0);
216+
217+
// Allocate buffer with +1 for null terminator (external usage pattern)
218+
Standard_PCharacter aBuffer = new Standard_Character[aBufferSize + 1];
219+
Standard_Integer anActualLength = aString.ToUTF8CString(aBuffer);
220+
221+
EXPECT_EQ(aBufferSize, anActualLength);
222+
EXPECT_EQ('\0', aBuffer[anActualLength]);
223+
EXPECT_STREQ("Hello World", aBuffer);
224+
225+
delete[] aBuffer;
226+
}
227+
228+
TEST(TCollection_ExtendedStringTest, UTF8ConversionUnicode)
229+
{
230+
// Test UTF-8 conversion with Unicode characters
231+
const Standard_ExtCharacter aUnicodeStr[] =
232+
{0x0048, 0x00E9, 0x006C, 0x006C, 0x006F, 0}; // "H(e-acute)llo"
233+
TCollection_ExtendedString aString(aUnicodeStr);
234+
235+
Standard_Integer aBufferSize = aString.LengthOfCString();
236+
EXPECT_GT(aBufferSize, 5); // Should be more than 5 due to UTF-8 encoding
237+
238+
Standard_PCharacter aBuffer = new Standard_Character[aBufferSize + 1];
239+
Standard_Integer anActualLength = aString.ToUTF8CString(aBuffer);
240+
241+
EXPECT_EQ(aBufferSize, anActualLength);
242+
EXPECT_EQ('\0', aBuffer[anActualLength]);
243+
244+
delete[] aBuffer;
245+
}
246+
247+
TEST(TCollection_ExtendedStringTest, WideCharConstructor)
248+
{
249+
// Test constructor with wide characters
250+
const Standard_WideChar* aWideStr = L"Wide string test";
251+
TCollection_ExtendedString aString(aWideStr);
252+
253+
EXPECT_GT(aString.Length(), 0);
254+
EXPECT_FALSE(aString.IsEmpty());
255+
}
256+
257+
TEST(TCollection_ExtendedStringTest, NumericalConstructors)
258+
{
259+
// Test integer constructor
260+
TCollection_ExtendedString anIntString(42);
261+
TCollection_AsciiString anAsciiFromInt(anIntString);
262+
EXPECT_STREQ("42", anAsciiFromInt.ToCString());
263+
264+
// Test real constructor
265+
TCollection_ExtendedString aRealString(3.14);
266+
TCollection_AsciiString anAsciiFromReal(aRealString);
267+
const Standard_CString aRealCStr = anAsciiFromReal.ToCString();
268+
EXPECT_TRUE(strstr(aRealCStr, "3.14") != NULL);
269+
}
270+
271+
TEST(TCollection_ExtendedStringTest, FillerConstructor)
272+
{
273+
// Test constructor with length and filler character
274+
TCollection_ExtendedString aFilledString(5, 'X');
275+
EXPECT_EQ(5, aFilledString.Length());
276+
277+
TCollection_AsciiString anAsciiFromFilled(aFilledString);
278+
EXPECT_STREQ("XXXXX", anAsciiFromFilled.ToCString());
279+
}
280+
281+
TEST(TCollection_ExtendedStringTest, ExtendedCharConstructor)
282+
{
283+
// Test constructor with ExtendedCharacter
284+
const Standard_ExtCharacter aEuroChar = 0x20AC; // Euro symbol
285+
TCollection_ExtendedString aString(aEuroChar);
286+
287+
EXPECT_EQ(1, aString.Length());
288+
EXPECT_FALSE(aString.IsAscii());
289+
EXPECT_EQ(aEuroChar, aString.Value(1));
290+
}
291+
292+
TEST(TCollection_ExtendedStringTest, UnicodeCharacters)
293+
{
294+
// Test various Unicode characters
295+
const Standard_ExtCharacter aLatinA = 0x0041; // 'A'
296+
const Standard_ExtCharacter aLatinE = 0x00E9; // 'e-acute'
297+
const Standard_ExtCharacter aEuro = 0x20AC; // Euro symbol
298+
const Standard_ExtCharacter aCJK = 0x4E2D; // Chinese character
299+
300+
const Standard_ExtCharacter aUnicodeStr[] = {aLatinA, aLatinE, aEuro, aCJK, 0};
301+
TCollection_ExtendedString aString(aUnicodeStr);
302+
303+
EXPECT_EQ(4, aString.Length());
304+
EXPECT_EQ(aLatinA, aString.Value(1));
305+
EXPECT_EQ(aLatinE, aString.Value(2));
306+
EXPECT_EQ(aEuro, aString.Value(3));
307+
EXPECT_EQ(aCJK, aString.Value(4));
308+
EXPECT_FALSE(aString.IsAscii());
309+
}
310+
311+
TEST(TCollection_ExtendedStringTest, AsciiDetection)
312+
{
313+
// Test ASCII detection
314+
TCollection_ExtendedString anAsciiString("Simple ASCII");
315+
EXPECT_TRUE(anAsciiString.IsAscii());
316+
317+
const Standard_ExtCharacter aNonAsciiStr[] = {0x0041, 0x20AC, 0}; // A + Euro
318+
TCollection_ExtendedString aNonAsciiString(aNonAsciiStr);
319+
EXPECT_FALSE(aNonAsciiString.IsAscii());
320+
}
321+
322+
TEST(TCollection_ExtendedStringTest, EmptyStringHandling)
323+
{
324+
// Test empty string operations
325+
TCollection_ExtendedString anEmptyString;
326+
EXPECT_EQ(0, anEmptyString.Length());
327+
EXPECT_TRUE(anEmptyString.IsEmpty());
328+
EXPECT_EQ(0, anEmptyString.LengthOfCString());
329+
330+
Standard_PCharacter aBuffer = new Standard_Character[1];
331+
Standard_Integer aLength = anEmptyString.ToUTF8CString(aBuffer);
332+
EXPECT_EQ(0, aLength);
333+
EXPECT_EQ('\0', aBuffer[0]);
334+
335+
delete[] aBuffer;
336+
}
337+
338+
TEST(TCollection_ExtendedStringTest, ConversionRoundTrip)
339+
{
340+
// Test AsciiString <-> ExtendedString conversion
341+
const Standard_CString anOriginalStr = "Test conversion with special chars: !@#$%";
342+
343+
TCollection_AsciiString anAsciiOriginal(anOriginalStr);
344+
TCollection_ExtendedString anExtendedConverted(anAsciiOriginal);
345+
TCollection_AsciiString anAsciiRoundTrip(anExtendedConverted);
346+
347+
EXPECT_STREQ(anOriginalStr, anAsciiRoundTrip.ToCString());
348+
EXPECT_EQ(anAsciiOriginal.Length(), anExtendedConverted.Length());
349+
EXPECT_EQ(anAsciiOriginal.Length(), anAsciiRoundTrip.Length());
350+
}
351+
352+
TEST(TCollection_ExtendedStringTest, LargeStrings)
353+
{
354+
// Test with large strings
355+
const Standard_Integer aLargeSize = 1000;
356+
TCollection_ExtendedString aLargeString(aLargeSize, 'A');
357+
358+
EXPECT_EQ(aLargeSize, aLargeString.Length());
359+
EXPECT_EQ('A', aLargeString.Value(1));
360+
EXPECT_EQ('A', aLargeString.Value(aLargeSize));
361+
EXPECT_TRUE(aLargeString.IsAscii());
362+
}
363+
364+
TEST(TCollection_ExtendedStringTest, MemoryAllocation)
365+
{
366+
// Test memory allocation with various string lengths
367+
for (Standard_Integer anIdx = 1; anIdx <= 16; ++anIdx)
368+
{
369+
TCollection_ExtendedString aTestString(anIdx, 'X');
370+
EXPECT_EQ(anIdx, aTestString.Length());
371+
EXPECT_EQ('X', aTestString.Value(1));
372+
373+
if (anIdx > 1)
374+
{
375+
EXPECT_EQ('X', aTestString.Value(anIdx));
376+
}
377+
}
378+
}
379+
380+
TEST(TCollection_ExtendedStringTest, MultiByteCString)
381+
{
382+
// Test constructor with multibyte flag
383+
const Standard_CString aMultiByteStr = "Multi-byte test";
384+
TCollection_ExtendedString aString(aMultiByteStr, Standard_True);
385+
386+
EXPECT_GT(aString.Length(), 0);
387+
EXPECT_FALSE(aString.IsEmpty());
388+
}
389+
390+
TEST(TCollection_ExtendedStringTest, BoundaryValues)
391+
{
392+
// Test boundary Unicode values
393+
// Note: OCCT's IsAnAscii considers 0x00-0xFF as ASCII (full 8-bit range)
394+
const Standard_ExtCharacter aLastStandardAscii = 0x007F;
395+
const Standard_ExtCharacter aLastOCCTAscii = 0x00FF;
396+
const Standard_ExtCharacter aFirstExtended = 0x0100;
397+
const Standard_ExtCharacter aMaxBMP = 0xFFFF;
398+
399+
// Test individual characters
400+
TCollection_ExtendedString aStringLastStandardAscii(aLastStandardAscii);
401+
EXPECT_EQ(1, aStringLastStandardAscii.Length());
402+
EXPECT_TRUE(aStringLastStandardAscii.IsAscii());
403+
404+
TCollection_ExtendedString aStringLastOCCTAscii(aLastOCCTAscii);
405+
EXPECT_EQ(1, aStringLastOCCTAscii.Length());
406+
EXPECT_TRUE(aStringLastOCCTAscii.IsAscii());
407+
408+
TCollection_ExtendedString aStringFirstExtended(aFirstExtended);
409+
EXPECT_EQ(1, aStringFirstExtended.Length());
410+
EXPECT_FALSE(aStringFirstExtended.IsAscii());
411+
412+
TCollection_ExtendedString aStringMaxBMP(aMaxBMP);
413+
EXPECT_EQ(1, aStringMaxBMP.Length());
414+
EXPECT_FALSE(aStringMaxBMP.IsAscii());
415+
}

0 commit comments

Comments
 (0)