#include #include #include #include #include #include #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 model; RecordPanel panel; }; TEST_F(RecordPanelTest, OneFieldPerDataColumnSkippingRowNumber) { ASSERT_NE(panel.widget(), nullptr); EXPECT_EQ(panel.widget()->findChildren().size(), 6); EXPECT_EQ(panel.widget()->findChildren().size(), 1); EXPECT_EQ(panel.widget()->findChildren().size(), 2); } TEST_F(RecordPanelTest, ShowsValuesOfCurrentRow) { auto lines = panel.widget()->findChildren(); auto texts = panel.widget()->findChildren(); 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(); 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(); 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(); ASSERT_EQ(texts.size(), 1); EXPECT_EQ(texts[0]->toPlainText(), QStringLiteral("''")); } TEST_F(RecordPanelTest, EditingFinishedWritesThroughModel) { auto lines = panel.widget()->findChildren(); 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(); 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(); auto buttons = panel.widget()->findChildren(); 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); }