#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)
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__,
--- /dev/null
+// 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