145 lines
5.7 KiB
C++
145 lines
5.7 KiB
C++
// Step 350: Phase 13b Integration — Visual Consistency (8 tests)
|
|
// Tests theme+icons+syntax bridge all work together consistently
|
|
|
|
#include <cassert>
|
|
#include <iostream>
|
|
#include <string>
|
|
#include <set>
|
|
#include "ThemeData.h"
|
|
#include "SyntaxThemeBridge.h"
|
|
#include "Icons.h"
|
|
#include "PanelManager.h"
|
|
|
|
int main() {
|
|
int passed = 0;
|
|
|
|
// Test 1: All panels use theme background colors (no default grey)
|
|
{
|
|
auto theme = getDefaultDarkTheme();
|
|
// Panel bg should not be default ImGui grey (0.27, 0.27, 0.28)
|
|
assert(theme.bgPanel.toHex() != "#454548");
|
|
assert(theme.bgPanel.toHex() != "#44444a");
|
|
// bg, bgAlt, bgPanel all defined and distinct
|
|
assert(theme.bg.toHex() != theme.bgPanel.toHex());
|
|
assert(theme.bgAlt.toHex() != theme.bgPanel.toHex());
|
|
std::cout << "Test 1 PASSED: Theme backgrounds defined (no default grey)\n";
|
|
passed++;
|
|
}
|
|
|
|
// Test 2: Diagnostic panel severity icons + colors consistent
|
|
{
|
|
auto theme = getDefaultDarkTheme();
|
|
// Error icon exists and error color is red-ish
|
|
assert(std::string(WhetstoneIcons::DiagError).size() > 0);
|
|
assert(theme.diagError.r > 0.5f);
|
|
// Warning icon + amber color
|
|
assert(std::string(WhetstoneIcons::DiagWarning).size() > 0);
|
|
assert(theme.diagWarning.r > 0.5f && theme.diagWarning.g > 0.3f);
|
|
// Info icon + blue color
|
|
assert(std::string(WhetstoneIcons::DiagInfo).size() > 0);
|
|
assert(theme.diagInfo.b > 0.5f);
|
|
std::cout << "Test 2 PASSED: Diagnostic icons + theme colors consistent\n";
|
|
passed++;
|
|
}
|
|
|
|
// Test 3: AST panel node type icons all defined
|
|
{
|
|
std::vector<std::string> nodeTypes = {
|
|
"Function", "ClassDeclaration", "Variable", "Module",
|
|
"EnumDeclaration", "NamespaceDeclaration"
|
|
};
|
|
for (const auto& nt : nodeTypes) {
|
|
auto icon = WhetstoneIcons::iconForNodeType(nt);
|
|
assert(std::string(icon).size() > 0);
|
|
}
|
|
std::cout << "Test 3 PASSED: AST node type icons all defined\n";
|
|
passed++;
|
|
}
|
|
|
|
// Test 4: File tree uses folder/file icons
|
|
{
|
|
assert(std::string(WhetstoneIcons::Folder).size() > 0);
|
|
assert(std::string(WhetstoneIcons::FolderOpen).size() > 0);
|
|
assert(std::string(WhetstoneIcons::FileSource).size() > 0);
|
|
assert(std::string(WhetstoneIcons::FileHeader).size() > 0);
|
|
// Folder and file icons are different
|
|
assert(std::string(WhetstoneIcons::Folder) != std::string(WhetstoneIcons::FileSource));
|
|
std::cout << "Test 4 PASSED: File tree folder/file icons distinct\n";
|
|
passed++;
|
|
}
|
|
|
|
// Test 5: Status text uses textDim for secondary info
|
|
{
|
|
auto theme = getDefaultDarkTheme();
|
|
// textDim should be dimmer than text (lower luminance)
|
|
float textLum = theme.text.r * 0.299f + theme.text.g * 0.587f + theme.text.b * 0.114f;
|
|
float dimLum = theme.textDim.r * 0.299f + theme.textDim.g * 0.587f + theme.textDim.b * 0.114f;
|
|
assert(dimLum < textLum);
|
|
// Line numbers should use textDim via bridge
|
|
auto lineNumColor = SyntaxThemeBridge::lineNumberColor(theme);
|
|
assert(lineNumColor.toHex() == theme.textDim.toHex());
|
|
std::cout << "Test 5 PASSED: textDim dimmer than text, used for secondary\n";
|
|
passed++;
|
|
}
|
|
|
|
// Test 6: Focused panel border uses accent color
|
|
{
|
|
auto theme = getDefaultDarkTheme();
|
|
assert(theme.borderFocused.toHex() == theme.accent.toHex());
|
|
// Regular border different from focused
|
|
assert(theme.border.toHex() != theme.borderFocused.toHex());
|
|
std::cout << "Test 6 PASSED: Focused border = accent, distinct from regular\n";
|
|
passed++;
|
|
}
|
|
|
|
// Test 7: Theme switch dark→light — all syntax bridge colors change
|
|
{
|
|
auto dark = getDefaultDarkTheme();
|
|
auto light = getDefaultLightTheme();
|
|
auto darkMappings = SyntaxThemeBridge::getAllMappings(dark);
|
|
auto lightMappings = SyntaxThemeBridge::getAllMappings(light);
|
|
int different = 0;
|
|
for (const auto& [key, darkColor] : darkMappings) {
|
|
auto it = lightMappings.find(key);
|
|
if (it != lightMappings.end() && it->second.toHex() != darkColor.toHex()) {
|
|
different++;
|
|
}
|
|
}
|
|
assert(different >= 8); // most colors should change
|
|
std::cout << "Test 7 PASSED: Theme switch changes " << different << "/12 syntax colors\n";
|
|
passed++;
|
|
}
|
|
|
|
// Test 8: Full visual stack — panels + theme + icons + syntax bridge coherent
|
|
{
|
|
PanelManager pm;
|
|
pm.registerDefaults();
|
|
auto theme = getDefaultDarkTheme();
|
|
auto mappings = SyntaxThemeBridge::getAllMappings(theme);
|
|
|
|
// 8 panels
|
|
assert(pm.panelCount() == 8);
|
|
// 12 syntax color mappings
|
|
assert(mappings.size() == 12);
|
|
// All syntax colors readable against bg
|
|
assert(SyntaxThemeBridge::allColorsReadable(theme));
|
|
// Theme roundtrip stable
|
|
auto j = theme.toJson();
|
|
auto restored = WhetstoneTheme::fromJson(j);
|
|
assert(restored.name == theme.name);
|
|
assert(restored.accent.toHex() == theme.accent.toHex());
|
|
// Icons available for all workflow states
|
|
std::vector<std::string> states = {"pending", "in-progress", "complete", "rejected", "review"};
|
|
for (const auto& s : states) {
|
|
assert(std::string(WhetstoneIcons::iconForWorkflowStatus(s)).size() > 0);
|
|
}
|
|
|
|
std::cout << "Test 8 PASSED: Full visual stack coherent (panels+theme+icons+syntax)\n";
|
|
passed++;
|
|
}
|
|
|
|
std::cout << "\nResults: " << passed << "/8\n";
|
|
assert(passed == 8);
|
|
return 0;
|
|
}
|