14.29: the blank start tab stays put; Untitled numbers stay low

This commit is contained in:
ZacharyZhang-NY committed 2026-10-11 15:52:24 -04:00
1 parent 1e647a9b74
commit 10f51cdf72
9 files changed
+123 -26

No files matched your search

+33 -6
View File
@@ -25,6 +25,7 @@ class ProjectTabStripTests : public QObject {
private slots:
void eachTabIsAsWideAsItsTitle();
void aTitleMovesOnlyTheTabsAfterIt();
void theBlankStartTabHasNoCloseButton();
};
void ProjectTabStripTests::eachTabIsAsWideAsItsTitle()
@@ -41,18 +42,18 @@ void ProjectTabStripTests::eachTabIsAsWideAsItsTitle()
QCOMPARE(select(*buttons[0]).width(), 35 + 8);
QCOMPARE(select(*buttons[1]).width(), 155 + 8);
QVERIFY(select(*buttons[1]).text().endsWith(QChar(0x2026)));
QCOMPARE(select(*buttons[2]).width(), label(QStringLiteral("Untitled 3"), true) + 8);
QCOMPARE(select(*buttons[2]).text(), QString("Untitled 3"));
QCOMPARE(select(*buttons[2]).width(), label(QStringLiteral("Untitled"), true) + 8);
QCOMPARE(select(*buttons[2]).text(), QString("Untitled"));
// Swift's pill: label, 11 before, 8 after, 16, 5.
buttons[2]->adjustSize();
QCOMPARE(buttons[2]->width(), label(QStringLiteral("Untitled 3"), true) + 40);
QCOMPARE(buttons[2]->width(), label(QStringLiteral("Untitled"), true) + 40);
// The dot: 10 for the title, its character's own width.
workspace.current().session.createDocument(8, 8);
workspace.current().session.addBlankLayer();
QVERIFY(workspace.current().session.isModified());
const QFontMetrics metrics(select(*buttons[2]).font());
QCOMPARE(select(*buttons[2]).text(), QString("● Untitled 3"));
QCOMPARE(select(*buttons[2]).width(), label(QStringLiteral("Untitled 3"), true) + 10 + 8 + metrics.horizontalAdvance(QStringLiteral("● ")) - 10);
QCOMPARE(select(*buttons[2]).text(), QString("● Untitled"));
QCOMPARE(select(*buttons[2]).width(), label(QStringLiteral("Untitled"), true) + 10 + 8 + metrics.horizontalAdvance(QStringLiteral("● ")) - 10);
// An unsaved long title elides within Swift's width less 10.
workspace.select(workspace.tabs()[1]->id);
workspace.current().session.createDocument(8, 8);
@@ -62,7 +63,7 @@ void ProjectTabStripTests::eachTabIsAsWideAsItsTitle()
QCOMPARE(select(*buttons[1]).text(), QStringLiteral("● ") + bold.elidedText(long_, Qt::ElideRight, 145));
// Chosen, a tab's weight changes its width.
workspace.select(workspace.tabs()[0]->id);
QCOMPARE(select(*buttons[2]).width(), label(QStringLiteral("Untitled 3"), false) + 10 + 8 + QFontMetrics(select(*buttons[2]).font()).horizontalAdvance(QStringLiteral("● ")) - 10);
QCOMPARE(select(*buttons[2]).width(), label(QStringLiteral("Untitled"), false) + 10 + 8 + QFontMetrics(select(*buttons[2]).font()).horizontalAdvance(QStringLiteral("● ")) - 10);
}
void ProjectTabStripTests::aTitleMovesOnlyTheTabsAfterIt()
@@ -101,5 +102,31 @@ void ProjectTabStripTests::aTitleMovesOnlyTheTabsAfterIt()
QCOMPARE(buttons[1]->x() - (buttons[0]->x() + buttons[0]->width()), 6);
}
// Swift 1.4.9: the pill closes up round its name.
void ProjectTabStripTests::theBlankStartTabHasNoCloseButton()
{
ProjectWorkspace workspace;
ProjectTabStrip strip(workspace);
strip.resize(1000, 34);
strip.show();
QVERIFY(QTest::qWaitForWindowExposed(&strip));
ProjectTabButton &only = *strip.buttons()[0];
QToolButton &close = *only.findChild<QToolButton *>(QStringLiteral("closeTab"));
const int width = label(QStringLiteral("Untitled"), true);
QVERIFY(close.isHidden());
QTRY_COMPARE(only.width(), width + 22);
QCOMPARE(select(only).width(), width + 11);
// A document gives it something to close.
workspace.current().session.createDocument(8, 8);
QVERIFY(!close.isHidden());
// Round the title: 11 before; 16 and 5 after.
QTRY_COMPARE(only.width() - select(only).width(), 11 + 16 + 5);
// A second tab makes either closable.
workspace.current().session.clearProject();
QVERIFY(close.isHidden());
workspace.addTab(false);
QVERIFY(!close.isHidden() && !strip.buttons()[1]->findChild<QToolButton *>(QStringLiteral("closeTab"))->isHidden());
}
QTEST_MAIN(ProjectTabStripTests)
#include "ProjectTabStripTests.moc"
+13 -10
View File
@@ -101,11 +101,11 @@ void ProjectWorkspaceFlowTests::aProjectOpensInATabOfItsOwn()
workspace.newCanvas();
store(folder.filePath("Third.comp"), 1);
QCOMPARE(answered([&](auto done) { workspace.open(folder.filePath("Third.comp"), done); }), std::optional(true));
QCOMPARE(titles(workspace), (QStringList{"Trip", "Second", "Untitled 2", "Third*"}));
QCOMPARE(titles(workspace), (QStringList{"Trip", "Second", "Untitled", "Third*"}));
// While it manages, nothing else begins.
workspace.current().session.setIsProjectBusy(true);
QCOMPARE(answered([&](auto done) { workspace.open(folder.filePath("Trip.comp"), done); }), std::optional(false));
QCOMPARE(titles(workspace), (QStringList{"Trip", "Second", "Untitled 2", "Third*"}));
QCOMPARE(titles(workspace), (QStringList{"Trip", "Second", "Untitled", "Third*"}));
}
void ProjectWorkspaceFlowTests::aProjectThatIsOpenIsBroughtToTheFront()
@@ -116,10 +116,10 @@ void ProjectWorkspaceFlowTests::aProjectThatIsOpenIsBroughtToTheFront()
ProjectWorkspace workspace;
QCOMPARE(answered([&](auto done) { workspace.open(folder.filePath("Trip.comp"), done); }), std::optional(true));
workspace.newCanvas();
QCOMPARE(titles(workspace), (QStringList{"Trip", "Untitled 2*"}));
QCOMPARE(titles(workspace), (QStringList{"Trip", "Untitled*"}));
// By a link, with a slash: still the open project.
QCOMPARE(answered([&](auto done) { workspace.open(folder.filePath("Link.comp") + "/", done); }), std::optional(true));
QCOMPARE(titles(workspace), (QStringList{"Trip*", "Untitled 2"}));
QCOMPARE(titles(workspace), (QStringList{"Trip*", "Untitled"}));
QVERIFY(!workspace.isManaging());
}
@@ -173,8 +173,11 @@ void ProjectWorkspaceFlowTests::closingATabAsksAboutItsWork()
workspace.current().session.setIsProjectBusy(false);
workspace.close(extra);
QTRY_COMPARE(int(workspace.tabs().size()), 1);
workspace.close(blank);
QTRY_COMPARE(titles(workspace), (QStringList{"Untitled 4*"}));
// The only tab, still blank, stays put (Swift 1.4.9).
done = false;
workspace.close(blank, [&] { done = true; });
QTRY_VERIFY(done);
QCOMPARE(titles(workspace), (QStringList{"Untitled 2*"}));
QCOMPARE(desk.seen.size(), 2);
QVERIFY(!workspace.isManaging());
}
@@ -231,7 +234,7 @@ void ProjectWorkspaceFlowTests::closingTheWindowLeavesOneFreshTab()
QCOMPARE(int(workspace.tabs().size()), 2);
workspace.closeWindow(&window);
QTRY_VERIFY(!window.isVisible());
QCOMPARE(titles(workspace), (QStringList{"Untitled 3*"}));
QCOMPARE(titles(workspace), (QStringList{"Untitled*"}));
QVERIFY(!workspace.current().session.document().has_value());
}
@@ -406,15 +409,15 @@ void ProjectWorkspaceFlowTests::aProjectThatMovedAwayIsNoMatchForAnotherMissingO
QTest::ignoreMessage(QtWarningMsg, QRegularExpression("^Couldn’t open the project: .+"));
QCOMPARE(answered([&](auto done) { workspace.open(folder.filePath("Elsewhere.comp"), done); }), std::optional(false));
QCOMPARE(desk.seen.size(), 1);
QCOMPARE(titles(workspace), (QStringList{"Here", "Untitled 2*"}));
QCOMPARE(titles(workspace), (QStringList{"Here", "Untitled*"}));
// The same missing place is still the same place,
QCOMPARE(answered([&](auto done) { workspace.open(folder.filePath("sub/../Here.comp"), done); }), std::optional(true));
QCOMPARE(titles(workspace), (QStringList{"Here*", "Untitled 2"}));
QCOMPARE(titles(workspace), (QStringList{"Here*", "Untitled"}));
// also when named from the folder the process stands in.
workspace.select(workspace.tabs()[1]->id);
QDir::setCurrent(folder.path());
QCOMPARE(answered([&](auto done) { workspace.open(QString("Here.comp"), done); }), std::optional(true));
QCOMPARE(titles(workspace), (QStringList{"Here*", "Untitled 2"}));
QCOMPARE(titles(workspace), (QStringList{"Here*", "Untitled"}));
}
void ProjectWorkspaceFlowTests::everyCallIsWholeWithoutACompletion()
+35 -1
View File
@@ -43,6 +43,7 @@ private slots:
void aDropThatIsNoLayerIdIsIgnored();
void anOpenFilterHoldsTheSwitch();
void moveTabReordersWithoutTouchingSelectionOrDocuments();
void untitledNumbersStayLowAndTheBlankTabStays();
};
void ProjectWorkspaceTests::newCanvasOpensAnEmptyTabWithoutAModal()
@@ -275,7 +276,7 @@ void ProjectWorkspaceTests::removingATabSelectsItsNeighbour()
workspace.removeTab(c);
QCOMPARE(int(workspace.tabs().size()), 1);
QVERIFY(workspace.current().id != c);
QCOMPARE(workspace.current().title(), QString("Untitled 5"));
QCOMPARE(workspace.current().title(), QString("Untitled"));
}
void ProjectWorkspaceTests::everyChangeIsAnnouncedAndRefusalsAreSilent()
@@ -390,5 +391,38 @@ void ProjectWorkspaceTests::moveTabReordersWithoutTouchingSelectionOrDocuments()
QCOMPARE(workspace.selectedID(), c);
}
// The blank start tab stays; numbers stay low (#231).
void ProjectWorkspaceTests::untitledNumbersStayLowAndTheBlankTabStays()
{
ProjectWorkspace workspace;
ProjectTab &first = workspace.current();
QVERIFY(first.title() == "Untitled" && !workspace.canClose(first));
bool done = false;
workspace.close(first.id, [&] { done = true; });
QTRY_VERIFY(done);
QVERIFY(workspace.tabs().size() == 1 && &workspace.current() == &first && first.title() == "Untitled");
// A saved but empty session can close.
first.session.setProjectPath(QStringLiteral("/x/Trip.comp"));
QVERIFY(workspace.canClose(first));
first.session.setProjectPath(std::nullopt);
first.session.createDocument(10, 10);
QVERIFY(workspace.canClose(first));
const QUuid second = workspace.addTab().id;
const QString third = workspace.addTab().title();
QVERIFY(workspace.tab(second)->title() == "Untitled 2" && third == "Untitled 3");
// With another tab, a blank one closes.
QVERIFY(workspace.canClose(*workspace.tab(second)));
workspace.removeTab(second);
QCOMPARE(workspace.addTab().title(), QString("Untitled 2"));
// Untitled is free again; a project's Untitled 4 is taken.
first.session.setProjectPath(QStringLiteral("/x/Untitled 4.comp"));
QCOMPARE(workspace.addTab().title(), QString("Untitled"));
QCOMPARE(workspace.addTab().title(), QString("Untitled 5"));
const std::vector<std::shared_ptr<ProjectTab>> all = workspace.tabs();
for (const std::shared_ptr<ProjectTab> &tab : all)
workspace.removeTab(tab->id);
QVERIFY(workspace.tabs().size() == 1 && workspace.current().title() == "Untitled");
}
QTEST_MAIN(ProjectWorkspaceTests)
#include "ProjectWorkspaceTests.moc"
+1 -1
View File
@@ -296,7 +296,7 @@ void ProjectWorkspaceViewTests::theToolbarFollowsTheFrontSession()
workspace.newCanvas();
QVERIFY(!fit.isEnabled() && !window.isWindowModified());
QCOMPARE(window.windowFilePath(), QString());
QCOMPARE(window.windowTitle(), QString("Untitled 2[*]"));
QCOMPARE(window.windowTitle(), QString("Untitled[*]"));
// At its smallest the window still shows the whole editor.
window.resize(800, 520);
QTRY_COMPARE(window.size(), QSize(800, 520));
+9 -1
View File
@@ -72,5 +72,13 @@ void WebPImportTests::aDroppedPictureTakesWebPAfterTIFF()
QCOMPARE(ImageFileDrop::providers(data).front()->formats(), QStringList{"image/tiff"});
}
QTEST_MAIN(WebPImportTests)
int main(int argc, char **argv)
{
// Its drops copy into its own folder: others count theirs.
QTemporaryDir own;
qputenv("TMPDIR", own.path().toUtf8());
QApplication app(argc, argv);
WebPImportTests tests;
return QTest::qExec(&tests, argc, argv);
}
#include "WebPImportTests.moc"