Files
OmaPhoto/tests/GuideGridTests.cpp
T

149 lines
7.5 KiB
C++

#include "Document/BrushStroke.h"
#include "Document/EditorSession.h"
#include "Document/ToolDefaults.h"
#include <QSettings>
#include <QStandardPaths>
#include <QtTest>
// Swift 1.3.5's GuideTests for Grid Settings, and their keeping.
class GuideGridTests : public QObject {
Q_OBJECT
private slots:
void initTestCase() { QStandardPaths::setTestModeEnabled(true); }
void layoutGridTakesItsSpacingAndSubdivisions();
void layoutGridKeepsToItsLimits();
void gridAppearanceColorsAndStyles();
void gridSnapFollowsTheGridSettings();
void theSettingsAreThePersonsAcrossLaunches();
};
void GuideGridTests::layoutGridTakesItsSpacingAndSubdivisions()
{
const LayoutGrid grid(100, 4);
QCOMPARE(grid.lines(200), (std::vector<double>{0, 25, 50, 75, 100, 125, 150, 175, 200}));
QVERIFY(grid.isMajor(100) && !grid.isMajor(50));
QCOMPARE(grid.step(), 25.0);
// An uneven step still lands on every major line.
const LayoutGrid thirds(100, 3);
std::vector<double> majors;
for (const double line : thirds.lines(300))
if (thirds.isMajor(line))
majors.push_back(line);
QCOMPARE(majors, (std::vector<double>{0, 100, 200, 300}));
QCOMPARE(thirds.lines(100), (std::vector<double>{0, 33, 67, 100}));
QCOMPARE(LayoutGrid(50, 1).lines(120), (std::vector<double>{0, 50, 100}));
// A hair short of a line counts it: Swift's 0.001.
QCOMPARE(LayoutGrid(50, 1).lines(99.96), (std::vector<double>{0, 50, 100}));
QCOMPARE(LayoutGrid(50, 1).lines(99.9), (std::vector<double>{0, 50}));
}
void GuideGridTests::layoutGridKeepsToItsLimits()
{
QCOMPARE(LayoutGrid(0, 0), LayoutGrid(2, 1));
QCOMPARE(LayoutGrid(10, 40).subdivisions, 10);
QCOMPARE(LayoutGrid(1'000'000, 1'000).spacing, LayoutGrid::spacingHigh);
QCOMPARE(LayoutGrid(1'000'000, 1'000).subdivisions, LayoutGrid::subdivisionHigh);
QVERIFY(LayoutGrid::spacingLow == 2 && LayoutGrid::spacingHigh == 4096 && LayoutGrid::subdivisionLow == 1 && LayoutGrid::subdivisionHigh == 64);
QVERIFY(LayoutGrid().spacing == 64 && LayoutGrid().subdivisions == 8);
}
void GuideGridTests::gridAppearanceColorsAndStyles()
{
const GridAppearance standard;
QVERIFY(standard.preset == GridAppearance::Preset::lightGray && standard.style == GridAppearance::Style::lines && standard.opacity == 45);
QCOMPARE(standard.color(), (PaletteColor{0.7, 0.7, 0.7}));
QVERIFY(dashes(GridAppearance::Style::lines).empty());
QCOMPARE(dashes(GridAppearance::Style::dashedLines), (std::vector<double>{4, 3}));
QCOMPARE(dashes(GridAppearance::Style::dots), (std::vector<double>{1, 2}));
GridAppearance appearance{GridAppearance::Preset::cyan, PaletteColor::black(), GridAppearance::Style::dots};
QCOMPARE(appearance.color(), (PaletteColor{0, 1, 1}));
appearance.preset = GridAppearance::Preset::custom;
QCOMPARE(appearance.color(), PaletteColor::black());
for (const GridAppearance::Preset preset : allGridPresets)
QCOMPARE(!presetColor(preset), preset == GridAppearance::Preset::custom);
QCOMPARE(PaletteColor::fromHex(appearance.customColor.hex()), std::optional(appearance.customColor));
QVERIFY(std::abs(standard.majorAlpha() - 0.45) < 0.001 && std::abs(standard.subdivisionAlpha() - 0.28) < 0.001);
appearance.opacity = 100;
QVERIFY(appearance.majorAlpha() == 1 && appearance.subdivisionAlpha() < 1);
appearance.opacity = 150;
QCOMPARE(appearance.majorAlpha(), 1.0);
appearance.opacity = 0;
QCOMPARE(appearance.majorAlpha(), 0.01);
// Photoshop's names and colours, in Swift's order.
QStringList names;
for (const GridAppearance::Preset preset : allGridPresets)
names << rawValue(preset);
QCOMPARE(names, QStringList({"Light Gray", "Light Blue", "Light Red", "Green", "Medium Blue", "Yellow", "Magenta", "Cyan", "Black", "Custom"}));
QVERIFY(presetColor(GridAppearance::Preset::lightBlue) == (PaletteColor{0.29, 0.78, 1}) && presetColor(GridAppearance::Preset::lightRed) == (PaletteColor{1, 0.4, 0.4}));
QVERIFY(presetColor(GridAppearance::Preset::green) == (PaletteColor{0.25, 0.8, 0.25}) && presetColor(GridAppearance::Preset::mediumBlue) == (PaletteColor{0.2, 0.4, 1}));
QVERIFY(presetColor(GridAppearance::Preset::yellow) == (PaletteColor{1, 1, 0}) && presetColor(GridAppearance::Preset::magenta) == (PaletteColor{1, 0, 1}));
QCOMPARE(presetColor(GridAppearance::Preset::black), std::optional(PaletteColor::black()));
QStringList styles;
for (const GridAppearance::Style style : allGridStyles)
styles << rawValue(style);
QCOMPARE(styles, QStringList({"Lines", "Dashed Lines", "Dots"}));
}
void GuideGridTests::gridSnapFollowsTheGridSettings()
{
EditorSession session;
session.createDocument(400, 300);
session.setSnapToLayers(false);
session.setSnapToDocumentBounds(false);
session.setShowsGrid(true);
session.setSnapToGrid(true);
QSignalSpy changed(&session, &EditorSession::changed);
session.setLayoutGrid(LayoutGrid(100, 2));
QCOMPARE(changed.count(), 1);
std::vector<double> xs = session.cropSnapTargets().xs;
std::sort(xs.begin(), xs.end());
QCOMPARE(xs, (std::vector<double>{0, 50, 100, 150, 200, 250, 300, 350, 400}));
QCOMPARE(session.snappedGuidePosition(52, CanvasGuide::Axis::vertical, std::nullopt), 50.0);
// The same grid or look again is no news.
session.setLayoutGrid(LayoutGrid(100, 2));
session.setGridAppearance(GridAppearance());
QCOMPARE(changed.count(), 1);
GridAppearance dashed;
dashed.style = GridAppearance::Style::dashedLines;
session.setGridAppearance(dashed);
QVERIFY(changed.count() == 2 && session.gridAppearance() == dashed);
}
void GuideGridTests::theSettingsAreThePersonsAcrossLaunches()
{
// Tests keep compiled defaults until the app turns them on.
QSettings().clear();
ToolDefaults::enable();
QCOMPARE(EditorSession().layoutGrid(), LayoutGrid());
QCOMPARE(EditorSession().gridAppearance(), GridAppearance());
GridAppearance look{GridAppearance::Preset::custom, PaletteColor{0.2, 0.4, 0.6}, GridAppearance::Style::dots, 70};
{
EditorSession session;
session.setLayoutGrid(LayoutGrid(100, 5));
session.setGridAppearance(look);
}
// Swift's keys, so a person's settings read as Swift's.
QSettings settings;
QVERIFY(settings.value("tool.gridSpacing").toInt() == 100 && settings.value("tool.gridSubdivisions").toInt() == 5);
QVERIFY(settings.value("tool.gridColor").toString() == "Custom" && settings.value("tool.gridStyle").toString() == "Dots");
QVERIFY(settings.value("tool.gridCustomColor").toString() == look.customColor.hex() && settings.value("tool.gridOpacity").toInt() == 70);
EditorSession next;
QVERIFY(next.layoutGrid() == LayoutGrid(100, 5) && next.gridAppearance() == look);
// What cannot be read is warned of, then defaulted.
settings.setValue("tool.gridSpacing", "wide");
settings.setValue("tool.gridColor", "Plaid");
settings.setValue("tool.gridStyle", "Wavy");
settings.setValue("tool.gridCustomColor", "#12");
for (int warning = 0; warning < 4; ++warning)
QTest::ignoreMessage(QtWarningMsg, QRegularExpression("ignoring the tool setting grid"));
EditorSession unread;
QCOMPARE(unread.layoutGrid(), LayoutGrid(64, 5));
QVERIFY(unread.gridAppearance().preset == GridAppearance::Preset::lightGray && unread.gridAppearance().style == GridAppearance::Style::lines);
QCOMPARE(unread.gridAppearance().customColor, GridAppearance().customColor);
QCOMPARE(unread.gridAppearance().opacity, 70);
QSettings().clear();
}
QTEST_GUILESS_MAIN(GuideGridTests)
#include "GuideGridTests.moc"