pgLab/tests/pglabtests/tst_RecordPanel.cpp

145 lines
4.4 KiB
C++
Raw Normal View History

2026-10-20 18:58:10 +02:00
#include <gtest/gtest.h>
#include <QLabel>
#include <QLineEdit>
#include <QPlainTextEdit>
#include <QStandardItemModel>
#include <QToolButton>
#include "CustomDataRole.h"
#include "Pgsql_oids.h"
#include "RecordPanel.h"
namespace {
/// Column 0 is the row number column, columns 1 to 3 are data columns
/// id (int4, editable), body (text, editable), ro (int4, read-only)
void fillModel(QStandardItemModel &model)
{
model.setColumnCount(4);
model.setRowCount(1);
model.setHeaderData(0, Qt::Horizontal, QStringLiteral("#"), Qt::DisplayRole);
model.setHeaderData(1, Qt::Horizontal, QStringLiteral("id\nint4"), Qt::DisplayRole);
model.setHeaderData(2, Qt::Horizontal, QStringLiteral("body\ntext"), Qt::DisplayRole);
model.setHeaderData(3, Qt::Horizontal, QStringLiteral("ro\nint4"), Qt::DisplayRole);
model.setData(model.index(0, 1), Pgsql::int4_oid, CustomDataTypeRole);
model.setData(model.index(0, 2), Pgsql::text_oid, CustomDataTypeRole);
model.setData(model.index(0, 3), Pgsql::int4_oid, CustomDataTypeRole);
model.setData(model.index(0, 1), QStringLiteral("1"));
model.setData(model.index(0, 2), QStringLiteral("hello"));
model.setData(model.index(0, 3), QStringLiteral("7"));
model.itemFromIndex(model.index(0, 3))->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
}
}
class RecordPanelTest : public ::testing::Test {
protected:
void SetUp() override
{
model.reset(new QStandardItemModel);
fillModel(*model);
panel.setModel(model.get());
panel.setFirstDataColumn(1);
panel.setCurrentRow(0);
}
std::unique_ptr<QStandardItemModel> model;
RecordPanel panel;
};
TEST_F(RecordPanelTest, OneFieldPerDataColumnSkippingRowNumber)
{
ASSERT_NE(panel.widget(), nullptr);
EXPECT_EQ(panel.widget()->findChildren<QLabel *>().size(), 6);
EXPECT_EQ(panel.widget()->findChildren<QPlainTextEdit *>().size(), 1);
EXPECT_EQ(panel.widget()->findChildren<QLineEdit *>().size(), 2);
}
TEST_F(RecordPanelTest, ShowsValuesOfCurrentRow)
{
auto lines = panel.widget()->findChildren<QLineEdit *>();
auto texts = panel.widget()->findChildren<QPlainTextEdit *>();
ASSERT_EQ(lines.size(), 2);
ASSERT_EQ(texts.size(), 1);
EXPECT_EQ(lines[0]->text(), QStringLiteral("1"));
EXPECT_EQ(texts[0]->toPlainText(), QStringLiteral("hello"));
EXPECT_EQ(lines[1]->text(), QStringLiteral("7"));
}
TEST_F(RecordPanelTest, ReadOnlyWhenCellNotEditable)
{
auto lines = panel.widget()->findChildren<QLineEdit *>();
ASSERT_EQ(lines.size(), 2);
EXPECT_FALSE(lines[0]->isReadOnly());
EXPECT_TRUE(lines[1]->isReadOnly());
}
TEST_F(RecordPanelTest, NullShowsEmptyTextWithNullPlaceholder)
{
model->setData(model->index(0, 1), QVariant(), Qt::EditRole);
panel.setCurrentRow(0);
auto lines = panel.widget()->findChildren<QLineEdit *>();
ASSERT_EQ(lines.size(), 2);
EXPECT_TRUE(lines[0]->text().isEmpty());
EXPECT_EQ(lines[0]->placeholderText(), QStringLiteral("null"));
}
TEST_F(RecordPanelTest, EmptyStringShownAsQuotedEmpty)
{
model->setData(model->index(0, 2), QString(""), Qt::EditRole);
panel.setCurrentRow(0);
auto texts = panel.widget()->findChildren<QPlainTextEdit *>();
ASSERT_EQ(texts.size(), 1);
EXPECT_EQ(texts[0]->toPlainText(), QStringLiteral("''"));
}
TEST_F(RecordPanelTest, EditingFinishedWritesThroughModel)
{
auto lines = panel.widget()->findChildren<QLineEdit *>();
ASSERT_EQ(lines.size(), 2);
lines[0]->setText(QStringLiteral("42"));
emit lines[0]->editingFinished();
EXPECT_EQ(model->index(0, 1).data(Qt::EditRole).toString(), QStringLiteral("42"));
}
TEST_F(RecordPanelTest, DataChangedRefreshesEditor)
{
model->setData(model->index(0, 1), QStringLiteral("5"), Qt::EditRole);
auto lines = panel.widget()->findChildren<QLineEdit *>();
ASSERT_EQ(lines.size(), 2);
EXPECT_EQ(lines[0]->text(), QStringLiteral("5"));
}
TEST_F(RecordPanelTest, NoCurrentRowShowsNothing)
{
panel.setCurrentRow(-1);
EXPECT_EQ(panel.widget(), nullptr);
}
TEST_F(RecordPanelTest, ModelResetClearsPanel)
{
model->clear();
EXPECT_EQ(panel.widget(), nullptr);
}
TEST_F(RecordPanelTest, ExpandButtonGrowsTextBox)
{
auto texts = panel.widget()->findChildren<QPlainTextEdit *>();
auto buttons = panel.widget()->findChildren<QToolButton *>();
ASSERT_EQ(texts.size(), 1);
ASSERT_EQ(buttons.size(), 1);
int collapsed = texts[0]->maximumHeight();
buttons[0]->setChecked(true);
int expanded = texts[0]->maximumHeight();
EXPECT_GT(expanded, collapsed);
buttons[0]->setChecked(false);
EXPECT_EQ(texts[0]->maximumHeight(), collapsed);
}