]> OCCT Git - occt.git/commitdiff
Testing - Add unit tests for Standard_ArrayStreamBuffer (#708)
authorPasukhin Dmitry <dpasukhi@opencascade.com>
Mon, 8 Sep 2025 08:50:35 +0000 (09:50 +0100)
committerGitHub <noreply@github.com>
Mon, 8 Sep 2025 08:50:35 +0000 (09:50 +0100)
- 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

src/Draw/TKQADraw/QABugs/QABugs_20.cxx
src/FoundationClasses/TKernel/GTests/FILES.cmake
src/FoundationClasses/TKernel/GTests/Standard_ArrayStreamBuffer_Test.cxx [new file with mode: 0644]
src/Visualization/TKService/Image/Image_AlienPixMap.cxx
tests/bugs/xde/bug28887_1 [deleted file]
tests/bugs/xde/bug28887_2 [deleted file]

index 0a6c53522f85f5854d6f762aa5ac40e48740925d..8c7d199121c773fb098a498b7b33512f22798d0e 100644 (file)
@@ -2969,96 +2969,12 @@ static Standard_Integer OCC28829(Draw_Interpretor&, Standard_Integer, const char
 #include <NCollection_Buffer.hxx>
 #include <DDocStd_DrawDocument.hxx>
 #include <OSD_FileSystem.hxx>
-#include <Standard_ArrayStreamBuffer.hxx>
 #include <TDocStd_Application.hxx>
 
 #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<std::istream> 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<ptrdiff_t>::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__,
index 84d82d1f066c286302f5807b0165864219a60084..5a5ada68b8663bb097d19a2a18e871df7c42e736 100644 (file)
@@ -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 (file)
index 0000000..f5ae17c
--- /dev/null
@@ -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 <Standard_ArrayStreamBuffer.hxx>
+
+#include <gtest/gtest.h>
+#include <sstream>
+#include <string>
+
+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<unsigned char>(aByte1));
+  EXPECT_EQ(0x02, static_cast<unsigned char>(aByte2));
+  EXPECT_EQ(0x03, static_cast<unsigned char>(aByte3));
+  EXPECT_EQ(0x00, static_cast<unsigned char>(aByte4));
+  EXPECT_EQ(0x04, static_cast<unsigned char>(aByte5));
+  EXPECT_EQ(0x05, static_cast<unsigned char>(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<size_t>(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<std::streamsize>(aDataSize), anAvailable);
+
+  char aCh;
+  aStream >> aCh;
+
+  anAvailable = aBuffer.in_avail();
+  EXPECT_EQ(static_cast<std::streamsize>(aDataSize - 1), anAvailable);
+}
\ No newline at end of file
index 7e14e9e62d5bb9911e03ce2b905c0e03caa489b3..829149cd5f8b224f1f4161d9bd74863dbf2ae8f3 100644 (file)
@@ -44,7 +44,6 @@
 #include <Message.hxx>
 #include <Message_Messenger.hxx>
 #include <NCollection_Array1.hxx>
-#include <Standard_ArrayStreamBuffer.hxx>
 #include <TCollection_AsciiString.hxx>
 #include <TCollection_ExtendedString.hxx>
 #include <OSD_OpenFile.hxx>
diff --git a/tests/bugs/xde/bug28887_1 b/tests/bugs/xde/bug28887_1
deleted file mode 100644 (file)
index 77516f5..0000000
+++ /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 (file)
index d9a40ed..0000000
+++ /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