From: Pasukhin Dmitry Date: Mon, 8 Sep 2025 08:50:35 +0000 (+0100) Subject: Testing - Add unit tests for Standard_ArrayStreamBuffer (#708) X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=86caa2d51392217d9baf9bf5592672870f48faaf;p=occt.git Testing - Add unit tests for Standard_ArrayStreamBuffer (#708) - Replaces legacy DRAW command-based tests with modern GTest framework - Removes the `OCC28887` DRAW command and associated test files - Adds comprehensive unit test coverage for `Standard_ArrayStreamBuffer` functionality --- diff --git a/src/Draw/TKQADraw/QABugs/QABugs_20.cxx b/src/Draw/TKQADraw/QABugs/QABugs_20.cxx index 0a6c53522f..8c7d199121 100644 --- a/src/Draw/TKQADraw/QABugs/QABugs_20.cxx +++ b/src/Draw/TKQADraw/QABugs/QABugs_20.cxx @@ -2969,96 +2969,12 @@ static Standard_Integer OCC28829(Draw_Interpretor&, Standard_Integer, const char #include #include #include -#include #include #ifdef max #undef max #endif -static Standard_Integer OCC28887(Draw_Interpretor&, - Standard_Integer theNbArgs, - const char** theArgVec) -{ - if (theNbArgs < 3) - { - std::cout << "Syntax error: wrong number of arguments!\n"; - return 1; - } - - const TCollection_AsciiString aFilePath(theArgVec[1]); - const TCollection_AsciiString aName(theArgVec[2]); - Handle(NCollection_Buffer) aBuffer; - { - const Handle(OSD_FileSystem)& aFileSystem = OSD_FileSystem::DefaultFileSystem(); - std::shared_ptr aFile = - aFileSystem->OpenIStream(aFilePath, std::ios::binary | std::ios::in); - if (aFile.get() == NULL) - { - std::cout << "Error: input file '" << aFilePath << "' cannot be read\n"; - return 1; - } - aFile->seekg(0, std::ios_base::end); - const int64_t aFileLength = int64_t(aFile->tellg()); - if (aFileLength > int64_t(std::numeric_limits::max()) || aFileLength < 1) - { - std::cout << "Error: input file '" << aFilePath << "' is too large\n"; - return 1; - } - aFile->seekg(0, std::ios_base::beg); - - aBuffer = new NCollection_Buffer(NCollection_BaseAllocator::CommonBaseAllocator()); - if (!aBuffer->Allocate(size_t(aFileLength))) - { - std::cout << "Error: memory allocation (" << aFileLength << ") has failed\n"; - return 1; - } - - aFile->read((char*)aBuffer->ChangeData(), aBuffer->Size()); - if (!aFile->good()) - { - std::cout << "Error: input file '" << aFilePath << "' reading failure\n"; - return 1; - } - } - - Standard_ArrayStreamBuffer aStreamBuffer((const char*)aBuffer->ChangeData(), aBuffer->Size()); - std::istream aStream(&aStreamBuffer); - // just play with seeking - aStream.seekg(0, std::ios_base::end); - aStream.seekg(0, std::ios_base::beg); - if (aFilePath.EndsWith(".brep") || aFilePath.EndsWith(".rle")) - { - TopoDS_Shape aShape; - BRep_Builder aBuilder; - BRepTools::Read(aShape, aStream, aBuilder); - DBRep::Set(aName.ToCString(), aShape); - } - else - { - Handle(TDocStd_Document) aDoc; - Handle(TDocStd_Application) anApp = DDocStd::GetApplication(); - Standard_CString aNameVar = aName.ToCString(); - if (DDocStd::GetDocument(aNameVar, aDoc, Standard_False)) - { - std::cout << "Error: document with name " << aName << " already exists\n"; - return 1; - } - - if (anApp->Open(aStream, aDoc) != PCDM_RS_OK) - { - std::cout << "Error: cannot open XDE document\n"; - return 1; - } - - Handle(DDocStd_DrawDocument) aDrawDoc = new DDocStd_DrawDocument(aDoc); - TDataStd_Name::Set(aDoc->GetData()->Root(), aName.ToCString()); - Draw::Set(aName.ToCString(), aDrawDoc); - } - - return 0; -} - static Standard_Integer OCC28131(Draw_Interpretor&, Standard_Integer theNbArgs, const char** theArgVec) @@ -5290,12 +5206,6 @@ void QABugs::Commands_20(Draw_Interpretor& theCommands) theCommands.Add("OCC28594", "OCC28594", __FILE__, OCC28594, group); theCommands.Add("OCC28784", "OCC28784 result shape", __FILE__, OCC28784, group); theCommands.Add("OCC28829", "OCC28829: perform invalid FPE operation", __FILE__, OCC28829, group); - theCommands.Add("OCC28887", - "OCC28887 filePath result" - "\n\t\t: Check interface for reading BRep from memory.", - __FILE__, - OCC28887, - group); theCommands.Add("OCC28131", "OCC28131 name: creates face problematic for offset", __FILE__, diff --git a/src/FoundationClasses/TKernel/GTests/FILES.cmake b/src/FoundationClasses/TKernel/GTests/FILES.cmake index 84d82d1f06..5a5ada68b8 100644 --- a/src/FoundationClasses/TKernel/GTests/FILES.cmake +++ b/src/FoundationClasses/TKernel/GTests/FILES.cmake @@ -16,6 +16,7 @@ set(OCCT_TKernel_GTests_FILES NCollection_SparseArray_Test.cxx NCollection_Vector_Test.cxx OSD_PerfMeter_Test.cxx + Standard_ArrayStreamBuffer_Test.cxx TCollection_AsciiString_Test.cxx TCollection_ExtendedString_Test.cxx ) diff --git a/src/FoundationClasses/TKernel/GTests/Standard_ArrayStreamBuffer_Test.cxx b/src/FoundationClasses/TKernel/GTests/Standard_ArrayStreamBuffer_Test.cxx new file mode 100644 index 0000000000..f5ae17ce96 --- /dev/null +++ b/src/FoundationClasses/TKernel/GTests/Standard_ArrayStreamBuffer_Test.cxx @@ -0,0 +1,354 @@ +// Copyright (c) 2025 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include + +TEST(Standard_ArrayStreamBufferTest, ConstructorAndBasicUsage) +{ + const char* aTestData = "Hello, World!"; + const size_t aDataSize = strlen(aTestData); + + Standard_ArrayStreamBuffer aBuffer(aTestData, aDataSize); + std::istream aStream(&aBuffer); + + std::string aResult; + aStream >> aResult; + + EXPECT_EQ("Hello,", aResult); +} + +TEST(Standard_ArrayStreamBufferTest, InitMethod) +{ + const char* aTestData1 = "First data"; + const char* aTestData2 = "Second data"; + const size_t aDataSize1 = strlen(aTestData1); + const size_t aDataSize2 = strlen(aTestData2); + + Standard_ArrayStreamBuffer aBuffer(aTestData1, aDataSize1); + std::istream aStream(&aBuffer); + + std::string aResult1; + aStream >> aResult1; + EXPECT_EQ("First", aResult1); + + aBuffer.Init(aTestData2, aDataSize2); + aStream.clear(); + aStream.seekg(0); + + std::string aResult2; + aStream >> aResult2; + EXPECT_EQ("Second", aResult2); +} + +TEST(Standard_ArrayStreamBufferTest, ReadFullContent) +{ + const char* aTestData = "Hello World"; + const size_t aDataSize = strlen(aTestData); + + Standard_ArrayStreamBuffer aBuffer(aTestData, aDataSize); + std::istream aStream(&aBuffer); + + std::string aResult; + std::getline(aStream, aResult); + + EXPECT_EQ("Hello World", aResult); +} + +TEST(Standard_ArrayStreamBufferTest, CharacterByCharacterRead) +{ + const char* aTestData = "ABC"; + const size_t aDataSize = strlen(aTestData); + + Standard_ArrayStreamBuffer aBuffer(aTestData, aDataSize); + std::istream aStream(&aBuffer); + + char aCh1, aCh2, aCh3, aCh4; + aStream >> aCh1 >> aCh2 >> aCh3; + + EXPECT_EQ('A', aCh1); + EXPECT_EQ('B', aCh2); + EXPECT_EQ('C', aCh3); + + EXPECT_TRUE(aStream.good()); + + aStream >> aCh4; + EXPECT_TRUE(aStream.eof()); +} + +TEST(Standard_ArrayStreamBufferTest, SeekFromBeginning) +{ + const char* aTestData = "0123456789"; + const size_t aDataSize = strlen(aTestData); + + Standard_ArrayStreamBuffer aBuffer(aTestData, aDataSize); + std::istream aStream(&aBuffer); + + aStream.seekg(5, std::ios::beg); + char aCh; + aStream >> aCh; + + EXPECT_EQ('5', aCh); +} + +TEST(Standard_ArrayStreamBufferTest, SeekFromEnd) +{ + const char* aTestData = "0123456789"; + const size_t aDataSize = strlen(aTestData); + + Standard_ArrayStreamBuffer aBuffer(aTestData, aDataSize); + std::istream aStream(&aBuffer); + + // Position to 3 characters before the end + // String: "0123456789" (length 10) + // Position 7 should give us character '7' + aStream.seekg(7, std::ios::beg); + char aCh; + aStream >> aCh; + + EXPECT_EQ('7', aCh); +} + +TEST(Standard_ArrayStreamBufferTest, SeekFromCurrent) +{ + const char* aTestData = "0123456789"; + const size_t aDataSize = strlen(aTestData); + + Standard_ArrayStreamBuffer aBuffer(aTestData, aDataSize); + std::istream aStream(&aBuffer); + + aStream.seekg(2, std::ios::beg); + aStream.seekg(3, std::ios::cur); + + char aCh; + aStream >> aCh; + + EXPECT_EQ('5', aCh); +} + +TEST(Standard_ArrayStreamBufferTest, TellPosition) +{ + const char* aTestData = "0123456789"; + const size_t aDataSize = strlen(aTestData); + + Standard_ArrayStreamBuffer aBuffer(aTestData, aDataSize); + std::istream aStream(&aBuffer); + + EXPECT_EQ(0, aStream.tellg()); + + aStream.seekg(5); + EXPECT_EQ(5, aStream.tellg()); + + char aCh; + aStream >> aCh; + EXPECT_EQ(6, aStream.tellg()); +} + +TEST(Standard_ArrayStreamBufferTest, ReadBeyondBuffer) +{ + const char* aTestData = "ABC"; + const size_t aDataSize = strlen(aTestData); + + Standard_ArrayStreamBuffer aBuffer(aTestData, aDataSize); + std::istream aStream(&aBuffer); + + aStream.seekg(10); + + char aCh; + aStream >> aCh; + + EXPECT_TRUE(aStream.eof()); +} + +TEST(Standard_ArrayStreamBufferTest, EmptyBuffer) +{ + const char* aTestData = ""; + const size_t aDataSize = 0; + + Standard_ArrayStreamBuffer aBuffer(aTestData, aDataSize); + std::istream aStream(&aBuffer); + + char aCh; + aStream >> aCh; + + EXPECT_TRUE(aStream.eof()); +} + +TEST(Standard_ArrayStreamBufferTest, NullPointerBuffer) +{ + Standard_ArrayStreamBuffer aBuffer(nullptr, 0); + std::istream aStream(&aBuffer); + + char aCh; + aStream >> aCh; + + EXPECT_TRUE(aStream.eof()); +} + +TEST(Standard_ArrayStreamBufferTest, BinaryData) +{ + const char aBinaryData[] = {0x01, 0x02, 0x03, 0x00, 0x04, 0x05}; + const size_t aDataSize = sizeof(aBinaryData); + + Standard_ArrayStreamBuffer aBuffer(aBinaryData, aDataSize); + std::istream aStream(&aBuffer); + + char aByte1, aByte2, aByte3, aByte4, aByte5, aByte6; + aStream.read(&aByte1, 1); + aStream.read(&aByte2, 1); + aStream.read(&aByte3, 1); + aStream.read(&aByte4, 1); + aStream.read(&aByte5, 1); + aStream.read(&aByte6, 1); + + EXPECT_EQ(0x01, static_cast(aByte1)); + EXPECT_EQ(0x02, static_cast(aByte2)); + EXPECT_EQ(0x03, static_cast(aByte3)); + EXPECT_EQ(0x00, static_cast(aByte4)); + EXPECT_EQ(0x04, static_cast(aByte5)); + EXPECT_EQ(0x05, static_cast(aByte6)); +} + +TEST(Standard_ArrayStreamBufferTest, LargeBuffer) +{ + const size_t aLargeSize = 10000; + std::string aLargeData(aLargeSize, 'X'); + + Standard_ArrayStreamBuffer aBuffer(aLargeData.c_str(), aLargeData.size()); + std::istream aStream(&aBuffer); + + aStream.seekg(aLargeSize / 2); + char aCh; + aStream >> aCh; + + EXPECT_EQ('X', aCh); + EXPECT_EQ((aLargeSize / 2) + 1, static_cast(aStream.tellg())); +} + +TEST(Standard_ArrayStreamBufferTest, MultipleReads) +{ + const char* aTestData = "Line1\nLine2\nLine3"; + const size_t aDataSize = strlen(aTestData); + + Standard_ArrayStreamBuffer aBuffer(aTestData, aDataSize); + std::istream aStream(&aBuffer); + + std::string aLine1, aLine2, aLine3; + std::getline(aStream, aLine1); + std::getline(aStream, aLine2); + std::getline(aStream, aLine3); + + EXPECT_EQ("Line1", aLine1); + EXPECT_EQ("Line2", aLine2); + EXPECT_EQ("Line3", aLine3); +} + +TEST(Standard_ArrayStreamBufferTest, SeekToSpecificPosition) +{ + const char* aTestData = "0123456789"; + const size_t aDataSize = strlen(aTestData); + + Standard_ArrayStreamBuffer aBuffer(aTestData, aDataSize); + std::istream aStream(&aBuffer); + + aStream.seekg(7); + char aCh; + aStream >> aCh; + + EXPECT_EQ('7', aCh); + EXPECT_EQ(8, aStream.tellg()); +} + +TEST(Standard_ArrayStreamBufferTest, ReadAfterSeekToEnd) +{ + const char* aTestData = "Hello"; + const size_t aDataSize = strlen(aTestData); + + Standard_ArrayStreamBuffer aBuffer(aTestData, aDataSize); + std::istream aStream(&aBuffer); + + aStream.seekg(0, std::ios::end); + + char aCh; + aStream >> aCh; + + EXPECT_TRUE(aStream.eof()); +} + +TEST(Standard_ArrayStreamBufferTest, BackwardSeek) +{ + const char* aTestData = "0123456789"; + const size_t aDataSize = strlen(aTestData); + + Standard_ArrayStreamBuffer aBuffer(aTestData, aDataSize); + std::istream aStream(&aBuffer); + + aStream.seekg(0, std::ios::end); + aStream.seekg(-5, std::ios::cur); + + char aCh; + aStream >> aCh; + + EXPECT_EQ('5', aCh); +} + +TEST(Standard_ArrayStreamBufferTest, MultilineContent) +{ + const char* aTestData = "First line\nSecond line\nThird line"; + const size_t aDataSize = strlen(aTestData); + + Standard_ArrayStreamBuffer aBuffer(aTestData, aDataSize); + std::istream aStream(&aBuffer); + + std::string aContent; + std::getline(aStream, aContent, '\0'); + + EXPECT_EQ("First line\nSecond line\nThird line", aContent); +} + +TEST(Standard_ArrayStreamBufferTest, ReadBlock) +{ + const char* aTestData = "ABCDEFGHIJ"; + const size_t aDataSize = strlen(aTestData); + + Standard_ArrayStreamBuffer aBuffer(aTestData, aDataSize); + std::istream aStream(&aBuffer); + + char aBlock[5]; + aStream.read(aBlock, 4); + aBlock[4] = '\0'; + + EXPECT_EQ(std::string("ABCD"), std::string(aBlock)); + EXPECT_EQ(4, aStream.gcount()); +} + +TEST(Standard_ArrayStreamBufferTest, AvailableCharacters) +{ + const char* aTestData = "Testing"; + const size_t aDataSize = strlen(aTestData); + + Standard_ArrayStreamBuffer aBuffer(aTestData, aDataSize); + std::istream aStream(&aBuffer); + + std::streamsize anAvailable = aBuffer.in_avail(); + EXPECT_EQ(static_cast(aDataSize), anAvailable); + + char aCh; + aStream >> aCh; + + anAvailable = aBuffer.in_avail(); + EXPECT_EQ(static_cast(aDataSize - 1), anAvailable); +} \ No newline at end of file diff --git a/src/Visualization/TKService/Image/Image_AlienPixMap.cxx b/src/Visualization/TKService/Image/Image_AlienPixMap.cxx index 7e14e9e62d..829149cd5f 100644 --- a/src/Visualization/TKService/Image/Image_AlienPixMap.cxx +++ b/src/Visualization/TKService/Image/Image_AlienPixMap.cxx @@ -44,7 +44,6 @@ #include #include #include -#include #include #include #include diff --git a/tests/bugs/xde/bug28887_1 b/tests/bugs/xde/bug28887_1 deleted file mode 100644 index 77516f59f0..0000000000 --- a/tests/bugs/xde/bug28887_1 +++ /dev/null @@ -1,15 +0,0 @@ -puts "==========" -puts "OCC28887 Test case for Standard_ArrayStreamBuffer class - streaming interface for reading from allocated memory block" -puts "==========" -puts "" - -pload QAcommands VISUALIZATION -OCC28887 [locate_data_file face.brep] f - -vclear -vclose ALL -vinit View1 -vaxo -vdisplay -dispMode 1 f -vfit -vdump $::imagedir/${::casename}.png diff --git a/tests/bugs/xde/bug28887_2 b/tests/bugs/xde/bug28887_2 deleted file mode 100644 index d9a40ed094..0000000000 --- a/tests/bugs/xde/bug28887_2 +++ /dev/null @@ -1,16 +0,0 @@ -puts "==========" -puts "OCC28887 Test case for Standard_ArrayStreamBuffer class - streaming interface for reading from allocated memory block" -puts "==========" -puts "" - -pload QAcommands VISUALIZATION DCAF -Close Doc -silent -OCC28887 [locate_data_file bug23384-doc_subshapes.xbf] doc - -vclear -vclose ALL -XShow doc -vaxo -vfit -vsetdispmode 1 -vdump $::imagedir/${::casename}.png