Files
whetstone_DSL/editor/tests/step352_test.cpp

147 lines
5.1 KiB
C++

// Step 352: Key Symbol Rendering (12 tests)
#include <cassert>
#include <iostream>
#include <string>
#include <vector>
#include "KeySymbolRenderer.h"
int main() {
int passed = 0;
WhetstoneTheme theme = getDefaultDarkTheme();
// Test 1: single key renders
{
KeyCombo combo = KeyCombo::fkey("F5");
KeyBadge badge = KeySymbolRenderer::renderKeySymbol(combo, theme);
assert(badge.text == "F5");
std::cout << "Test 1 PASSED: single key renders\n";
passed++;
}
// Test 2: modifier+key renders
{
KeyCombo combo = KeyCombo::ctrl("S");
KeyBadge badge = KeySymbolRenderer::renderKeySymbol(combo, theme);
assert(badge.text == "Ctrl+S");
std::cout << "Test 2 PASSED: modifier+key renders\n";
passed++;
}
// Test 3: platform symbols correct
{
KeyCombo combo = KeyCombo::ctrlShift("P");
KeyBadge mac = KeySymbolRenderer::renderKeyBadgeSymbols(combo, theme, true);
assert(mac.text.find("\xE2\x8C\x83") != std::string::npos); // ⌃
assert(mac.text.find("\xE2\x87\xA7") != std::string::npos); // ⇧
std::cout << "Test 3 PASSED: platform symbols\n";
passed++;
}
// Test 4: menu item layout label left + key right data present
{
KeybindingRegistry reg;
reg.loadDefaults();
auto item = KeySymbolRenderer::renderActionWithKey("Save Buffer", "save-buffer", reg, theme, "File");
assert(item.label == "Save Buffer");
assert(item.shortcut == "Ctrl+S");
assert(item.hasBadge);
std::cout << "Test 4 PASSED: menu item layout data\n";
passed++;
}
// Test 5: chord rendering
{
std::vector<KeyCombo> chord = {KeyCombo::ctrl("K"), KeyCombo::ctrl("S")};
std::string text = KeySymbolRenderer::renderKeyChord(chord);
assert(text == "Ctrl+K Ctrl+S");
std::cout << "Test 5 PASSED: chord rendering\n";
passed++;
}
// Test 6: key badge has background
{
KeyCombo combo = KeyCombo::ctrl("F");
KeyBadge badge = KeySymbolRenderer::renderKeySymbol(combo, theme);
assert(badge.bgColor.toHex() == theme.bgAlt.toHex());
assert(badge.borderColor.toHex() == theme.border.toHex());
std::cout << "Test 6 PASSED: key badge background/border\n";
passed++;
}
// Test 7: theme colors used
{
KeyCombo combo = KeyCombo::ctrl("P");
KeyBadge badge = KeySymbolRenderer::renderKeySymbol(combo, theme);
assert(badge.textColor.toHex() == theme.text.toHex());
assert(badge.fontSize == theme.fontSizeSmall);
std::cout << "Test 7 PASSED: theme colors used\n";
passed++;
}
// Test 8: empty binding shows nothing
{
KeybindingRegistry reg;
reg.loadDefaults();
auto item = KeySymbolRenderer::renderActionWithKey("Unknown", "no-such-action", reg, theme);
assert(!item.hasBadge);
assert(item.shortcut.empty());
assert(item.symbols.empty());
std::cout << "Test 8 PASSED: empty binding hidden\n";
passed++;
}
// Test 9: special keys render symbols on mac
{
KeyCombo enter = KeyCombo::fkey("Enter");
KeyCombo esc = KeyCombo::fkey("Escape");
KeyCombo tab = KeyCombo::fkey("Tab");
auto b1 = KeySymbolRenderer::renderKeyBadgeSymbols(enter, theme, true);
auto b2 = KeySymbolRenderer::renderKeyBadgeSymbols(esc, theme, true);
auto b3 = KeySymbolRenderer::renderKeyBadgeSymbols(tab, theme, true);
assert(b1.text.find("\xE2\x86\xB5") != std::string::npos); // ↵
assert(b2.text.find("\xE2\x8E\x8B") != std::string::npos); // ⎋
assert(b3.text.find("\xE2\x87\xA5") != std::string::npos); // ⇥
std::cout << "Test 9 PASSED: special keys render symbols\n";
passed++;
}
// Test 10: long label does not trigger overlap risk with normal widths
{
KeybindingRegistry reg;
reg.loadDefaults();
WhetstoneTheme roomy = theme;
roomy.fontSizeUI = 18.0f;
auto item = KeySymbolRenderer::renderActionWithKey(
"Very Long Menu Action Label For Save Buffer", "save-buffer", reg, roomy, "File");
assert(!item.overlapRisk);
std::cout << "Test 10 PASSED: long label no overlap risk\n";
passed++;
}
// Test 11: chord symbols render
{
std::vector<KeyCombo> chord = {KeyCombo::ctrl("K"), KeyCombo::ctrlShift("S")};
std::string syms = KeySymbolRenderer::renderKeyChordSymbols(chord, true);
assert(syms.find("\xE2\x8C\x83") != std::string::npos); // ⌃
assert(syms.find("K") != std::string::npos);
assert(syms.find("S") != std::string::npos);
std::cout << "Test 11 PASSED: chord symbols render\n";
passed++;
}
// Test 12: shouldRender logic
{
KeyCombo none;
KeyCombo set = KeyCombo::ctrl("B");
assert(!KeySymbolRenderer::shouldRender(none));
assert(KeySymbolRenderer::shouldRender(set));
std::cout << "Test 12 PASSED: shouldRender\n";
passed++;
}
std::cout << "\nResults: " << passed << "/12\n";
assert(passed == 12);
return 0;
}