162 lines
4.9 KiB
C++
162 lines
4.9 KiB
C++
// Step 355: Phase 13c Integration — Keyboard Shortcuts Help Panel (8 tests)
|
|
|
|
#include <cassert>
|
|
#include <iostream>
|
|
#include <string>
|
|
#include "KeybindingRegistry.h"
|
|
#include "CommandPalette.h"
|
|
#include "MenuBar.h"
|
|
#include "KeyboardShortcutsPanel.h"
|
|
|
|
int main() {
|
|
int passed = 0;
|
|
|
|
// Test 1: all default bindings displayed in shortcuts panel
|
|
{
|
|
KeybindingRegistry reg;
|
|
reg.loadDefaults();
|
|
KeyboardShortcutsPanel panel;
|
|
panel.loadFromRegistry(reg);
|
|
assert(!panel.rows().empty());
|
|
assert(panel.rows().size() >= static_cast<size_t>(reg.bindingCount()));
|
|
std::cout << "Test 1 PASSED: default bindings displayed\n";
|
|
passed++;
|
|
}
|
|
|
|
// Test 2: Ctrl+S triggers save action
|
|
{
|
|
KeybindingRegistry reg;
|
|
reg.loadDefaults();
|
|
KeyCombo::InputState in;
|
|
in.ctrl = true;
|
|
in.key = "s";
|
|
auto action = reg.processInput(in);
|
|
assert(action.has_value());
|
|
assert(action.value() == "save-buffer");
|
|
std::cout << "Test 2 PASSED: Ctrl+S triggers save\n";
|
|
passed++;
|
|
}
|
|
|
|
// Test 3: Ctrl+P opens command palette
|
|
{
|
|
KeybindingRegistry reg;
|
|
reg.loadDefaults();
|
|
CommandPalette palette;
|
|
assert(!palette.isOpen());
|
|
KeyCombo::InputState in;
|
|
in.ctrl = true;
|
|
in.key = "P";
|
|
auto action = reg.processInput(in);
|
|
if (action.has_value() && action.value() == "command-palette") {
|
|
palette.open();
|
|
}
|
|
assert(palette.isOpen());
|
|
std::cout << "Test 3 PASSED: Ctrl+P opens palette\n";
|
|
passed++;
|
|
}
|
|
|
|
// Test 4: command palette shows key symbols for registered actions
|
|
{
|
|
KeybindingRegistry reg;
|
|
reg.loadDefaults();
|
|
CommandPalette palette;
|
|
palette.registerFromKeybindings(reg);
|
|
auto all = palette.all();
|
|
assert(!all.empty());
|
|
int symbolCount = 0;
|
|
for (const auto& c : all) {
|
|
if (!c.shortcut.empty()) {
|
|
assert(!c.symbols.empty());
|
|
symbolCount++;
|
|
}
|
|
}
|
|
assert(symbolCount >= 10);
|
|
std::cout << "Test 4 PASSED: palette shows key symbols\n";
|
|
passed++;
|
|
}
|
|
|
|
// Test 5: menu items show correct key symbols
|
|
{
|
|
KeybindingRegistry reg;
|
|
reg.loadDefaults();
|
|
auto menu = MenuBar::buildDefaults(reg);
|
|
auto save = menu.findItem("save-buffer");
|
|
auto undo = menu.findItem("undo");
|
|
assert(!save.symbols.empty());
|
|
assert(!undo.symbols.empty());
|
|
std::cout << "Test 5 PASSED: menu symbols correct\n";
|
|
passed++;
|
|
}
|
|
|
|
// Test 6: rebind action updates shortcuts panel
|
|
{
|
|
KeybindingRegistry reg;
|
|
reg.loadDefaults();
|
|
KeyboardShortcutsPanel panel;
|
|
panel.loadFromRegistry(reg);
|
|
std::string before;
|
|
for (const auto& row : panel.rows()) {
|
|
if (row.actionId == "save-buffer") before = row.symbols;
|
|
}
|
|
reg.bind("save-buffer", KeyCombo::ctrl("W"));
|
|
panel.loadFromRegistry(reg);
|
|
std::string after;
|
|
for (const auto& row : panel.rows()) {
|
|
if (row.actionId == "save-buffer") after = row.symbols;
|
|
}
|
|
assert(before != after);
|
|
assert(after.find("W") != std::string::npos);
|
|
std::cout << "Test 6 PASSED: rebind updates panel\n";
|
|
passed++;
|
|
}
|
|
|
|
// Test 7: key symbols render on current platform mode
|
|
{
|
|
KeybindingRegistry reg;
|
|
reg.loadDefaults();
|
|
KeyboardShortcutsPanel panel;
|
|
panel.loadFromRegistry(reg);
|
|
bool hasAnySymbol = false;
|
|
for (const auto& row : panel.rows()) {
|
|
if (!row.symbols.empty()) {
|
|
hasAnySymbol = true;
|
|
break;
|
|
}
|
|
}
|
|
assert(hasAnySymbol);
|
|
std::cout << "Test 7 PASSED: platform symbols render\n";
|
|
passed++;
|
|
}
|
|
|
|
// Test 8: full keyboard workflow Ctrl+P -> "pipeline" -> Enter -> run-pipeline
|
|
{
|
|
KeybindingRegistry reg;
|
|
reg.loadDefaults();
|
|
CommandPalette palette;
|
|
palette.registerFromKeybindings(reg);
|
|
|
|
bool pipelineRan = false;
|
|
KeyCombo::InputState openIn;
|
|
openIn.ctrl = true;
|
|
openIn.key = "p";
|
|
auto openAction = reg.processInput(openIn);
|
|
assert(openAction.has_value());
|
|
assert(openAction.value() == "command-palette");
|
|
palette.open();
|
|
assert(palette.isOpen());
|
|
|
|
auto matches = palette.search("pipeline");
|
|
assert(!matches.empty());
|
|
auto selected = palette.executeSelected(matches);
|
|
assert(selected.has_value());
|
|
if (selected.value() == "run-pipeline") pipelineRan = true;
|
|
assert(pipelineRan);
|
|
std::cout << "Test 8 PASSED: keyboard workflow executes pipeline\n";
|
|
passed++;
|
|
}
|
|
|
|
std::cout << "\nResults: " << passed << "/8\n";
|
|
assert(passed == 8);
|
|
return 0;
|
|
}
|