blob: ba6e08034ff2450a9fad474eaa4f4a5e9e4f4fb0 [file] [log] [blame]
#include <QtTest/QTest>
#include <poppler-qt6.h>
#include <poppler-form.h>
#include <poppler-private.h>
#include <Form.h>
class TestForms : public QObject
{
Q_OBJECT
public:
explicit TestForms(QObject *parent = nullptr) : QObject(parent) { }
private slots:
void testCheckbox(); // Test for issue #655
void testCheckboxIssue159(); // Test for issue #159
void testSetIcon(); // Test that setIcon will always be valid.
void testSetPrintable();
void testSetAppearanceText();
void testStandAloneWidgets(); // check for 'de facto' tooltips. Issue #34
void testUnicodeFieldAttributes();
};
void TestForms::testCheckbox()
{
// Test for checkbox issue #655
std::unique_ptr<Poppler::Document> document = Poppler::Document::load(TESTDATADIR "/unittestcases/latex-hyperref-checkbox-issue-655.pdf");
QVERIFY(document);
std::unique_ptr<Poppler::Page> page(document->page(0));
QVERIFY(page);
std::vector<std::unique_ptr<Poppler::FormField>> forms = page->formFields();
QCOMPARE(forms.size(), 1);
Poppler::FormField *form = forms.at(0).get();
QCOMPARE(form->type(), Poppler::FormField::FormButton);
Poppler::FormFieldButton *chkFormFieldButton = static_cast<Poppler::FormFieldButton *>(form);
// Test this is actually a Checkbox
QCOMPARE(chkFormFieldButton->buttonType(), Poppler::FormFieldButton::CheckBox);
// checkbox comes initially 'unchecked'
QCOMPARE(chkFormFieldButton->state(), false);
// let's mark it as 'checked'
chkFormFieldButton->setState(true);
// now test if it was succesfully 'checked'
QCOMPARE(chkFormFieldButton->state(), true);
}
void TestForms::testStandAloneWidgets()
{
// Check for 'de facto' tooltips. Issue #34
std::unique_ptr<Poppler::Document> document = Poppler::Document::load(TESTDATADIR "/unittestcases/tooltip.pdf");
QVERIFY(document);
std::unique_ptr<Poppler::Page> page = document->page(0);
QVERIFY(page);
std::vector<std::unique_ptr<Poppler::FormField>> forms = page->formFields();
QCOMPARE(forms.size(), 3);
for (const std::unique_ptr<Poppler::FormField> &field : forms) {
QCOMPARE(field->type(), Poppler::FormField::FormButton);
Poppler::FormFieldButton *fieldButton = static_cast<Poppler::FormFieldButton *>(field.get());
QCOMPARE(fieldButton->buttonType(), Poppler::FormFieldButton::Push);
FormField *ff = Poppler::FormFieldData::getFormWidget(fieldButton)->getField();
QVERIFY(ff);
QCOMPARE(ff->isStandAlone(), true);
// tooltip.pdf has only these 3 standalone widgets
QVERIFY(field->uiName() == QStringLiteral("This is a tooltip!") || // clazy:exclude=qstring-allocations
field->uiName() == QStringLiteral("Sulfuric acid") || field->uiName() == QString::fromUtf8("little Gauß"));
}
}
void TestForms::testCheckboxIssue159()
{
// Test for checkbox issue #159
std::unique_ptr<Poppler::Document> document = Poppler::Document::load(TESTDATADIR "/unittestcases/checkbox_issue_159.pdf");
QVERIFY(document);
std::unique_ptr<Poppler::Page> page = document->page(0);
QVERIFY(page);
Poppler::FormFieldButton *beerFieldButton = nullptr;
Poppler::FormFieldButton *wineFieldButton = nullptr;
std::vector<std::unique_ptr<Poppler::FormField>> forms = page->formFields();
// Let's find and assign the "Wine" and "Beer" radio buttons
for (const std::unique_ptr<Poppler::FormField> &field : forms) {
if (field->type() != Poppler::FormField::FormButton) {
continue;
}
Poppler::FormFieldButton *fieldButton = static_cast<Poppler::FormFieldButton *>(field.get());
if (fieldButton->buttonType() != Poppler::FormFieldButton::Radio) {
continue;
}
// printf("%s \n", fieldButton->caption().toLatin1().data());
if (fieldButton->caption() == QStringLiteral("Wine")) {
wineFieldButton = fieldButton;
} else if (fieldButton->caption() == QStringLiteral("Beer")) {
beerFieldButton = fieldButton;
}
}
// "Beer" and "Wine" radiobuttons belong to the same RadioButton group.
// So selecting one should unselect the other.
QVERIFY(beerFieldButton);
QVERIFY(wineFieldButton);
// Test that the RadioButton group comes with "Beer" initially selected
QCOMPARE(beerFieldButton->state(), true);
// Now select "Wine". As a result "Beer" should no longer be selected.
wineFieldButton->setState(true);
// Test that "Beer" is indeed not reporting as being selected
QCOMPARE(beerFieldButton->state(), false);
}
void TestForms::testSetIcon()
{
std::unique_ptr<Poppler::Document> document = Poppler::Document::load(TESTDATADIR "/unittestcases/form_set_icon.pdf");
QVERIFY(document);
std::unique_ptr<Poppler::Page> page = document->page(0);
QVERIFY(page);
std::vector<std::unique_ptr<Poppler::FormField>> forms = page->formFields();
Poppler::FormFieldButton *anmButton = nullptr;
// First we are finding the field which will have its icon changed
for (const std::unique_ptr<Poppler::FormField> &field : forms) {
if (field->type() != Poppler::FormField::FormButton) {
continue;
}
Poppler::FormFieldButton *fieldButton = static_cast<Poppler::FormFieldButton *>(field.get());
if (field->name() == QStringLiteral("anm0")) {
anmButton = fieldButton;
}
}
QVERIFY(anmButton);
// Then we set the Icon on this field, for every other field
// And verify if it has a valid icon
for (const std::unique_ptr<Poppler::FormField> &field : forms) {
if (field->type() != Poppler::FormField::FormButton) {
continue;
}
Poppler::FormFieldButton *fieldButton = static_cast<Poppler::FormFieldButton *>(field.get());
if (field->name() == QStringLiteral("anm0")) {
continue;
}
Poppler::FormFieldIcon newIcon = fieldButton->icon();
anmButton->setIcon(newIcon);
Poppler::FormFieldIcon anmIcon = anmButton->icon();
QVERIFY(Poppler::FormFieldIconData::getData(anmIcon));
QVERIFY(Poppler::FormFieldIconData::getData(anmIcon)->icon);
QCOMPARE(Poppler::FormFieldIconData::getData(anmIcon)->icon->lookupNF("AP").dictLookupNF("N").getRef().num, Poppler::FormFieldIconData::getData(newIcon)->icon->lookupNF("AP").dictLookupNF("N").getRef().num);
}
// Just making sure that setting a invalid icon will still produce a valid icon.
anmButton->setIcon(Poppler::FormFieldIcon(nullptr));
Poppler::FormFieldIcon anmIcon = anmButton->icon();
QVERIFY(Poppler::FormFieldIconData::getData(anmIcon));
QVERIFY(Poppler::FormFieldIconData::getData(anmIcon)->icon);
}
void TestForms::testSetPrintable()
{
std::unique_ptr<Poppler::Document> document = Poppler::Document::load(TESTDATADIR "/unittestcases/form_set_icon.pdf");
QVERIFY(document);
std::unique_ptr<Poppler::Page> page = document->page(0);
QVERIFY(page);
std::vector<std::unique_ptr<Poppler::FormField>> forms = page->formFields();
for (std::unique_ptr<Poppler::FormField> &field : forms) {
field->setPrintable(true);
QCOMPARE(field->isPrintable(), true);
field->setPrintable(false);
QCOMPARE(field->isPrintable(), false);
}
}
void TestForms::testSetAppearanceText()
{
std::unique_ptr<Poppler::Document> document = Poppler::Document::load(TESTDATADIR "/unittestcases/checkbox_issue_159.pdf");
QVERIFY(document);
std::unique_ptr<Poppler::Page> page = document->page(0);
QVERIFY(page);
std::vector<std::unique_ptr<Poppler::FormField>> forms = page->formFields();
int nTextForms = 0;
for (std::unique_ptr<Poppler::FormField> &field : forms) {
if (field->type() != Poppler::FormField::FormText) {
continue;
}
nTextForms++;
Poppler::FormFieldText *fft = static_cast<Poppler::FormFieldText *>(field.get());
const QString textToSet = "HOLA" + fft->name();
fft->setAppearanceText(textToSet);
Dict *dict = Poppler::FormFieldData::getFormWidget(fft)->getObj()->getDict();
Object strObject = dict->lookup("AP").dictLookup("N");
QVERIFY(strObject.isStream());
GooString s;
strObject.getStream()->fillGooString(&s);
const QString textToFind = QStringLiteral("\n(%1) Tj\n").arg(textToSet);
QVERIFY(s.toStr().find(textToFind.toStdString()) != std::string::npos);
}
QCOMPARE(nTextForms, 5);
}
void TestForms::testUnicodeFieldAttributes()
{
std::unique_ptr<Poppler::Document> document = Poppler::Document::load(TESTDATADIR "/unittestcases/fieldWithUtf16Names.pdf");
QVERIFY(document);
std::unique_ptr<Poppler::Page> page = document->page(0);
QVERIFY(page);
std::vector<std::unique_ptr<Poppler::FormField>> forms = page->formFields();
Poppler::FormField *field = forms.front().get();
QCOMPARE(field->name(), QStringLiteral("Tex"));
QCOMPARE(field->uiName(), QStringLiteral("Texto de ayuda"));
}
QTEST_GUILESS_MAIN(TestForms)
#include "check_forms.moc"