@@ -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