Files
panopainter/tests/app_core/quick_ui_tests.cpp

223 lines
8.7 KiB
C++

#include "app_core/quick_ui.h"
#include "test_harness.h"
#include <string>
namespace {
class FakeQuickUiServices final : public pp::app::QuickUiServices {
public:
void select_slot(pp::app::QuickUiSlotKind slot_kind, int slot_index, bool fire_event) override
{
selects += 1;
last_slot_kind = slot_kind;
last_slot_index = slot_index;
last_fire_event = fire_event;
call_order += "select;";
}
void open_slot_popup(pp::app::QuickUiSlotKind slot_kind, int slot_index) override
{
popups += 1;
last_slot_kind = slot_kind;
last_slot_index = slot_index;
call_order += "popup;";
}
void restore_state(int brush_index, int color_index, bool fire_event) override
{
restores += 1;
last_brush_index = brush_index;
last_color_index = color_index;
last_fire_event = fire_event;
call_order += "restore;";
}
void reset_state(bool fire_event) override
{
resets += 1;
last_fire_event = fire_event;
call_order += "reset;";
}
int selects = 0;
int popups = 0;
int restores = 0;
int resets = 0;
pp::app::QuickUiSlotKind last_slot_kind = pp::app::QuickUiSlotKind::brush;
int last_slot_index = -1;
int last_brush_index = -1;
int last_color_index = -1;
bool last_fire_event = false;
std::string call_order;
};
void slot_click_selects_or_opens_popup(pp::tests::Harness& harness)
{
const auto select_brush = pp::app::plan_quick_slot_click(pp::app::QuickUiSlotKind::brush, 0, 2, 3);
PP_EXPECT(harness, select_brush);
if (select_brush) {
PP_EXPECT(harness, select_brush.value().operation == pp::app::QuickUiOperation::select_slot);
PP_EXPECT(harness, select_brush.value().slot_kind == pp::app::QuickUiSlotKind::brush);
PP_EXPECT(harness, select_brush.value().slot_index == 2);
PP_EXPECT(harness, select_brush.value().previous_index == 0);
PP_EXPECT(harness, select_brush.value().brush_index == 2);
PP_EXPECT(harness, select_brush.value().updates_selection);
PP_EXPECT(harness, select_brush.value().invokes_change_callback);
PP_EXPECT(harness, select_brush.value().mutates_quick_state);
PP_EXPECT(harness, !select_brush.value().opens_brush_popup);
}
const auto open_brush = pp::app::plan_quick_slot_click(pp::app::QuickUiSlotKind::brush, 1, 1, 3);
PP_EXPECT(harness, open_brush);
if (open_brush) {
PP_EXPECT(harness, open_brush.value().operation == pp::app::QuickUiOperation::open_slot_popup);
PP_EXPECT(harness, open_brush.value().opens_brush_popup);
PP_EXPECT(harness, !open_brush.value().opens_color_picker);
PP_EXPECT(harness, !open_brush.value().updates_selection);
PP_EXPECT(harness, !open_brush.value().mutates_quick_state);
}
const auto open_color = pp::app::plan_quick_slot_click(pp::app::QuickUiSlotKind::color, 0, 0, 3);
PP_EXPECT(harness, open_color);
if (open_color) {
PP_EXPECT(harness, open_color.value().opens_color_picker);
PP_EXPECT(harness, !open_color.value().opens_brush_popup);
}
}
void slot_click_rejects_invalid_indices(pp::tests::Harness& harness)
{
PP_EXPECT(harness, !pp::app::plan_quick_slot_click(pp::app::QuickUiSlotKind::brush, -1, 0, 3));
PP_EXPECT(harness, !pp::app::plan_quick_slot_click(pp::app::QuickUiSlotKind::brush, 0, 3, 3));
PP_EXPECT(harness, !pp::app::plan_quick_slot_click(pp::app::QuickUiSlotKind::color, 0, 0, 0));
}
void restore_and_reset_validate_state(pp::tests::Harness& harness)
{
const auto restore = pp::app::plan_quick_state_restore(2, 1, 3, true);
PP_EXPECT(harness, restore);
if (restore) {
PP_EXPECT(harness, restore.value().operation == pp::app::QuickUiOperation::restore_state);
PP_EXPECT(harness, restore.value().brush_index == 2);
PP_EXPECT(harness, restore.value().color_index == 1);
PP_EXPECT(harness, restore.value().slot_count == 3);
PP_EXPECT(harness, restore.value().fire_event);
PP_EXPECT(harness, restore.value().restores_slots);
PP_EXPECT(harness, restore.value().redraws_brush_previews);
PP_EXPECT(harness, restore.value().invokes_change_callback);
}
const auto reset = pp::app::plan_quick_state_reset(3, false);
PP_EXPECT(harness, reset);
if (reset) {
PP_EXPECT(harness, reset.value().operation == pp::app::QuickUiOperation::reset_state);
PP_EXPECT(harness, reset.value().brush_index == 0);
PP_EXPECT(harness, reset.value().color_index == 0);
PP_EXPECT(harness, reset.value().resets_slots);
PP_EXPECT(harness, reset.value().redraws_brush_previews);
PP_EXPECT(harness, !reset.value().invokes_change_callback);
PP_EXPECT(harness, reset.value().mutates_quick_state);
}
PP_EXPECT(harness, !pp::app::plan_quick_state_restore(3, 0, 3, false));
PP_EXPECT(harness, !pp::app::plan_quick_state_restore(0, -1, 3, false));
PP_EXPECT(harness, !pp::app::plan_quick_state_reset(0, false));
}
void executor_dispatches_selection_popup_restore_and_reset(pp::tests::Harness& harness)
{
FakeQuickUiServices services;
const auto select = pp::app::plan_quick_slot_click(pp::app::QuickUiSlotKind::brush, 0, 2, 3);
PP_EXPECT(harness, select);
if (select) {
PP_EXPECT(harness, pp::app::execute_quick_ui_plan(select.value(), services).ok());
}
const auto popup = pp::app::plan_quick_slot_click(pp::app::QuickUiSlotKind::color, 1, 1, 3);
PP_EXPECT(harness, popup);
if (popup) {
PP_EXPECT(harness, pp::app::execute_quick_ui_plan(popup.value(), services).ok());
}
const auto restore = pp::app::plan_quick_state_restore(2, 1, 3, true);
PP_EXPECT(harness, restore);
if (restore) {
PP_EXPECT(harness, pp::app::execute_quick_ui_plan(restore.value(), services).ok());
}
const auto reset = pp::app::plan_quick_state_reset(3, false);
PP_EXPECT(harness, reset);
if (reset) {
PP_EXPECT(harness, pp::app::execute_quick_ui_plan(reset.value(), services).ok());
}
PP_EXPECT(harness, services.selects == 1);
PP_EXPECT(harness, services.popups == 1);
PP_EXPECT(harness, services.restores == 1);
PP_EXPECT(harness, services.resets == 1);
PP_EXPECT(harness, services.last_brush_index == 2);
PP_EXPECT(harness, services.last_color_index == 1);
PP_EXPECT(harness, !services.last_fire_event);
PP_EXPECT(harness, services.call_order == "select;popup;restore;reset;");
}
void executor_rejects_malformed_quick_plans(pp::tests::Harness& harness)
{
FakeQuickUiServices services;
pp::app::QuickUiPlan select;
select.operation = pp::app::QuickUiOperation::select_slot;
select.slot_index = 0;
select.slot_count = 3;
select.updates_selection = false;
PP_EXPECT(harness, !pp::app::execute_quick_ui_plan(select, services).ok());
pp::app::QuickUiPlan popup;
popup.operation = pp::app::QuickUiOperation::open_slot_popup;
popup.slot_index = 0;
popup.slot_count = 3;
PP_EXPECT(harness, !pp::app::execute_quick_ui_plan(popup, services).ok());
pp::app::QuickUiPlan mismatched_popup;
mismatched_popup.operation = pp::app::QuickUiOperation::open_slot_popup;
mismatched_popup.slot_kind = pp::app::QuickUiSlotKind::color;
mismatched_popup.slot_index = 0;
mismatched_popup.slot_count = 3;
mismatched_popup.opens_brush_popup = true;
PP_EXPECT(harness, !pp::app::execute_quick_ui_plan(mismatched_popup, services).ok());
pp::app::QuickUiPlan restore;
restore.operation = pp::app::QuickUiOperation::restore_state;
restore.slot_count = 3;
restore.brush_index = 2;
restore.color_index = 3;
restore.restores_slots = true;
PP_EXPECT(harness, !pp::app::execute_quick_ui_plan(restore, services).ok());
pp::app::QuickUiPlan reset;
reset.operation = pp::app::QuickUiOperation::reset_state;
reset.slot_count = 0;
reset.resets_slots = true;
PP_EXPECT(harness, !pp::app::execute_quick_ui_plan(reset, services).ok());
PP_EXPECT(harness, services.selects == 0);
PP_EXPECT(harness, services.popups == 0);
PP_EXPECT(harness, services.restores == 0);
PP_EXPECT(harness, services.resets == 0);
}
} // namespace
int main()
{
pp::tests::Harness harness;
harness.run("slot click selects or opens popup", slot_click_selects_or_opens_popup);
harness.run("slot click rejects invalid indices", slot_click_rejects_invalid_indices);
harness.run("restore and reset validate state", restore_and_reset_validate_state);
harness.run("executor dispatches selection popup restore and reset", executor_dispatches_selection_popup_restore_and_reset);
harness.run("executor rejects malformed quick plans", executor_rejects_malformed_quick_plans);
return harness.finish();
}