223 lines
8.7 KiB
C++
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();
|
|
}
|