Files
pdf/engine/tests/qpdf_writer_test.cpp
T

81 lines
2.8 KiB
C++
Raw Normal View History

2026-06-16 19:06:48 +05:30
#include <gtest/gtest.h>
#include "../src/qpdf/qpdf_extractor.hpp"
#include "../src/qpdf/qpdf_writer.hpp"
#include "../src/parser/lexer.hpp"
#include "../src/parser/parser.hpp"
#include "../src/parser/content_builder.hpp"
#include "../src/serializer/content_serializer.hpp"
#include "../src/serializer/ast_serializer.hpp"
#include <filesystem>
#include <fstream>
#ifndef TEST_CORPUS_DIR
#define TEST_CORPUS_DIR "../../corpus"
#endif
using namespace pdfengine;
using namespace pdfengine::qpdf_layer;
TEST(QpdfWriterTest, IntegrationReadModifyWrite) {
std::filesystem::path sourcePath = std::filesystem::path(TEST_CORPUS_DIR) / "basic" / "hello_world.pdf";
std::filesystem::path destPath = std::filesystem::path(TEST_CORPUS_DIR) / "basic" / "hello_world_modified.pdf";
QpdfExtractor extractor;
auto stream = extractor.extractPageStream(sourcePath.string(), 0);
ASSERT_TRUE(stream.has_value());
Lexer lexer(stream->decodedContent);
auto tokens = lexer.tokenize();
ContentParser parser(tokens);
auto ops = parser.parse();
ContentBuilder builder;
auto objects = builder.build(ops);
bool foundAndModified = false;
for (auto& obj : objects) {
if (obj->getType() == ContentObjectType::Text) {
auto* textObj = static_cast<TextObject*>(obj.get());
if (textObj->text == "Hello, world!") {
textObj->text = "Hello, PDF Editor!";
foundAndModified = true;
break;
}
}
}
ASSERT_TRUE(foundAndModified) << "Could not find 'Hello, world!' to modify";
ContentSerializer contentSerializer;
auto newOps = contentSerializer.serialize(objects);
AstSerializer astSerializer;
std::string newRawStream = astSerializer.serialize(newOps);
QpdfWriter writer;
auto writeRes = writer.replacePageStreamAndSave(sourcePath.string(), destPath.string(), 0, newRawStream);
ASSERT_TRUE(writeRes.has_value()) << writeRes.error();
auto verifyStream = extractor.extractPageStream(destPath.string(), 0);
ASSERT_TRUE(verifyStream.has_value());
Lexer verifyLexer(verifyStream->decodedContent);
auto verifyTokens = verifyLexer.tokenize();
ContentParser verifyParser(verifyTokens);
ContentBuilder verifyBuilder;
auto verifyObjects = verifyBuilder.build(verifyParser.parse());
bool verifiedModification = false;
for (auto& obj : verifyObjects) {
if (obj->getType() == ContentObjectType::Text) {
auto* textObj = static_cast<TextObject*>(obj.get());
if (textObj->text == "Hello, PDF Editor!") {
verifiedModification = true;
break;
}
}
}
EXPECT_TRUE(verifiedModification) << "Modified string was not successfully saved and reloaded!";
std::filesystem::remove(destPath);
}