From 1473a587427bfa3d68408cf4db56248ccf4393f6 Mon Sep 17 00:00:00 2001 From: sysadmin Date: Sun, 15 Feb 2026 09:23:17 -0700 Subject: [PATCH] IChooseYou --- screenshot.png | Bin 61455 -> 64101 bytes src/compose.cpp | 95 ++++++++++++++--------- src/controller.cpp | 2 +- src/editor.cpp | 14 +--- src/format.cpp | 16 +--- src/generator.cpp | 5 +- src/mcp/mcp_bridge.cpp | 2 +- src/resources.qrc | 2 + src/typeselectorpopup.cpp | 11 +-- src/workspace_model.h | 104 ++++++++++++++----------- tests/test_compose.cpp | 17 ++-- tests/test_controller.cpp | 46 +---------- tests/test_editor.cpp | 77 ++---------------- tests/test_generator.cpp | 24 ------ tests/test_new_features.cpp | 151 +++++++++--------------------------- tests/test_validation.cpp | 41 ++-------- 16 files changed, 191 insertions(+), 416 deletions(-) diff --git a/screenshot.png b/screenshot.png index 790d0a5400dcc85cef376c2944cbcaf1ce155167..9ec25b3189d8d28e00f02ec9d592a8c83a5ad883 100644 GIT binary patch literal 64101 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 CyN_f5 literal 61455 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 meta; - QSet visiting; // cycle detection for struct recursion - QSet ptrVisiting; // cycle guard for pointer expansions + QSet visiting; // cycle detection for struct recursion + QSet ptrVisiting; // cycle guard for pointer expansions + QSet virtualPtrRefs; // refIds currently being virtually expanded via pointer deref int currentLine = 0; int typeW = kColType; // global type column width (fallback) int nameW = kColName; // global name column width (fallback) @@ -64,7 +65,6 @@ uint32_t computeMarkers(const Node& node, const Provider& /*prov*/, uint64_t /*addr*/, bool isCont, int /*depth*/) { uint32_t mask = 0; if (isCont) mask |= (1u << M_CONT); - if (node.kind == NodeKind::Padding) mask |= (1u << M_PAD); // No ambient validation markers — errors only shown during inline editing. return mask; } @@ -118,14 +118,7 @@ void composeLeaf(ComposeState& state, const NodeTree& tree, int typeW = state.effectiveTypeW(scopeId); int nameW = state.effectiveNameW(scopeId); - // Line count: padding wraps at 8 bytes per line - int numLines; - if (node.kind == NodeKind::Padding) { - int totalBytes = qMax(1, node.arrayLen); - numLines = (totalBytes + 7) / 8; - } else { - numLines = linesForKind(node.kind); - } + int numLines = linesForKind(node.kind); // Resolve pointer target name for display QString ptrTypeOverride; @@ -156,12 +149,7 @@ void composeLeaf(ComposeState& state, const NodeTree& tree, // Set byte count for hex preview lines (used for per-byte change highlighting) if (isHexPreview(node.kind)) { - if (node.kind == NodeKind::Padding) { - int totalSz = qMax(1, node.arrayLen); - lm.lineByteCount = qMin(8, totalSz - sub * 8); - } else { - lm.lineByteCount = sizeForKind(node.kind); - } + lm.lineByteCount = sizeForKind(node.kind); } QString lineText = fmt::fmtNodeLine(node, prov, absAddr, depth, sub, @@ -430,29 +418,42 @@ void composeNode(ComposeState& state, const NodeTree& tree, QString ptrTargetName = resolvePointerTarget(tree, node.refId); QString ptrTypeOverride = fmt::pointerTypeName(node.kind, ptrTargetName); + // Check if this pointer has materialized children (from materializeRefChildren) + QVector ptrChildren = state.childMap.value(node.id); + bool hasMaterialized = !ptrChildren.isEmpty(); + + // Force collapsed if this refId is already being virtually expanded + // (prevents infinite recursion in virtual expansion mode). + // Materialized children bypass this — they are real tree nodes with + // independent collapsed state, so recursion is bounded by the tree. + bool forceCollapsed = !hasMaterialized + && state.virtualPtrRefs.contains(node.refId); + bool effectiveCollapsed = node.collapsed || forceCollapsed; + // Emit merged fold header: "Type* Name {" (expanded) or "Type* Name -> val" (collapsed) { LineMeta lm; lm.nodeIdx = nodeIdx; lm.nodeId = node.id; lm.depth = depth; - lm.lineKind = node.collapsed ? LineKind::Field : LineKind::Header; + lm.lineKind = effectiveCollapsed ? LineKind::Field : LineKind::Header; lm.offsetText = fmt::fmtOffsetMargin(tree.baseAddress + absAddr, false, state.offsetHexDigits); lm.offsetAddr = tree.baseAddress + absAddr; lm.nodeKind = node.kind; lm.foldHead = true; - lm.foldCollapsed = node.collapsed; + lm.foldCollapsed = effectiveCollapsed; lm.foldLevel = computeFoldLevel(depth, true); lm.markerMask = computeMarkers(node, prov, absAddr, false, depth); + if (forceCollapsed) lm.markerMask |= (1u << M_CYCLE); lm.effectiveTypeW = typeW; lm.effectiveNameW = nameW; lm.pointerTargetName = ptrTargetName; - state.emitLine(fmt::fmtPointerHeader(node, depth, node.collapsed, + state.emitLine(fmt::fmtPointerHeader(node, depth, effectiveCollapsed, prov, absAddr, ptrTypeOverride, typeW, nameW), lm); } - if (!node.collapsed) { + if (!effectiveCollapsed) { int sz = node.byteSize(); uint64_t ptrVal = 0; if (prov.isValid() && sz > 0 && prov.isReadable(absAddr, sz)) { @@ -480,18 +481,42 @@ void composeNode(ComposeState& state, const NodeTree& tree, if (!ptrReadable) pBase = (uint64_t)0 - tree.baseAddress; - qulonglong key = pBase ^ (node.refId * kGoldenRatio); - if (!state.ptrVisiting.contains(key)) { - state.ptrVisiting.insert(key); - int refIdx = tree.indexOfId(node.refId); - if (refIdx >= 0) { - const Node& ref = tree.nodes[refIdx]; - if (ref.kind == NodeKind::Struct || ref.kind == NodeKind::Array) - composeParent(state, tree, childProv, refIdx, - depth, pBase, ref.id, - /*isArrayChild=*/true); + if (hasMaterialized) { + // Render materialized children at the pointer target address. + // These are real tree nodes with independent state — use rootId + // so resolveAddr computes offsets relative to the pointer target. + std::sort(ptrChildren.begin(), ptrChildren.end(), [&](int a, int b) { + return tree.nodes[a].offset < tree.nodes[b].offset; + }); + for (int childIdx : ptrChildren) { + composeNode(state, tree, childProv, childIdx, depth + 1, + pBase, node.id, false, node.id); + } + } else { + // Virtual expansion via ref struct definition. + // Temporarily remove the ref struct from visiting so composeParent + // doesn't hit the struct-level cycle guard. The ptrVisiting mechanism + // handles actual address-level pointer cycles, and virtualPtrRefs + // prevents infinite virtual recursion (inner self-referential pointers + // are force-collapsed with M_CYCLE for the user to materialize). + qulonglong key = pBase ^ (node.refId * kGoldenRatio); + if (!state.ptrVisiting.contains(key)) { + state.ptrVisiting.insert(key); + int refIdx = tree.indexOfId(node.refId); + if (refIdx >= 0) { + const Node& ref = tree.nodes[refIdx]; + if (ref.kind == NodeKind::Struct || ref.kind == NodeKind::Array) { + bool wasVisiting = state.visiting.remove(node.refId); + state.virtualPtrRefs.insert(node.refId); + composeParent(state, tree, childProv, refIdx, + depth, pBase, ref.id, + /*isArrayChild=*/true); + state.virtualPtrRefs.remove(node.refId); + if (wasVisiting) state.visiting.insert(node.refId); + } + } + state.ptrVisiting.remove(key); } - state.ptrVisiting.remove(key); } // Footer for pointer fold @@ -571,7 +596,7 @@ ComposeResult compose(const NodeTree& tree, const Provider& prov, uint64_t viewR // Include struct/array names - they now use columnar layout too int maxNameLen = kMinNameW; for (const Node& node : tree.nodes) { - // Skip hex/padding (they show ASCII preview, not name column) + // Skip hex (they show ASCII preview, not name column) if (isHexPreview(node.kind)) continue; maxNameLen = qMax(maxNameLen, (int)node.name.size()); } @@ -590,7 +615,7 @@ ComposeResult compose(const NodeTree& tree, const Provider& prov, uint64_t viewR const Node& child = tree.nodes[childIdx]; scopeMaxType = qMax(scopeMaxType, (int)nodeTypeName(child).size()); - // Name width (skip hex/padding, but include containers) + // Name width (skip hex, but include containers) if (!isHexPreview(child.kind)) { scopeMaxName = qMax(scopeMaxName, (int)child.name.size()); } @@ -622,7 +647,7 @@ ComposeResult compose(const NodeTree& tree, const Provider& prov, uint64_t viewR const Node& child = tree.nodes[childIdx]; rootMaxType = qMax(rootMaxType, (int)nodeTypeName(child).size()); - // Name width (skip hex/padding, include containers) + // Name width (skip hex, include containers) if (!isHexPreview(child.kind)) { rootMaxName = qMax(rootMaxName, (int)child.name.size()); } diff --git a/src/controller.cpp b/src/controller.cpp index 4a472b2..f1df75a 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -2078,7 +2078,7 @@ void RcxController::onRefreshTick() { uint64_t rootId = m_viewRootId; if (rootId == 0 && !m_doc->tree.nodes.isEmpty()) rootId = m_doc->tree.nodes[0].id; - collectPointerRanges(rootId, 0, 0, 4, visited, ranges); + collectPointerRanges(rootId, 0, 0, 99, visited, ranges); } m_readInFlight = true; diff --git a/src/editor.cpp b/src/editor.cpp index b3593e1..ddf4a45 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -141,7 +141,7 @@ void RcxEditor::setupScintilla() { m_sci->SendScintilla(QsciScintillaBase::SCI_INDICSETSTYLE, IND_EDITABLE, 5 /*INDIC_HIDDEN*/); - // Hex/Padding node dim indicator — overrides text color + // Hex node dim indicator — overrides text color m_sci->SendScintilla(QsciScintillaBase::SCI_INDICSETSTYLE, IND_HEX_DIM, 17 /*INDIC_TEXTFORE*/); @@ -241,9 +241,6 @@ void RcxEditor::setupMarkers() { // M_CONT (0): continuation line (metadata only, no visual) m_sci->markerDefine(QsciScintilla::Invisible, M_CONT); - // M_PAD (1): padding line (metadata only, no visual) - m_sci->markerDefine(QsciScintilla::Invisible, M_PAD); - // M_PTR0 (2): right triangle m_sci->markerDefine(QsciScintilla::RightTriangle, M_PTR0); @@ -1038,9 +1035,6 @@ bool RcxEditor::resolvedSpanFor(int line, EditTarget t, if (lm->nodeIdx < 0) return false; - // Padding: reject value editing (hex bytes are display-only) - if (t == EditTarget::Value && lm->nodeKind == NodeKind::Padding) - return false; // Hex nodes: only Type is editable (ASCII preview + hex bytes are display-only) if ((t == EditTarget::Name || t == EditTarget::Value) && isHexNode(lm->nodeKind)) return false; @@ -1221,9 +1215,6 @@ static bool hitTestTarget(QsciScintilla* sci, } return false; } - // Padding nodes: hex bytes are display-only, not editable - if (outTarget == EditTarget::Value && lm.nodeKind == NodeKind::Padding) - return false; // Hex nodes: only Type is editable (ASCII preview + hex bytes are display-only) if ((outTarget == EditTarget::Name || outTarget == EditTarget::Value) && isHexNode(lm.nodeKind)) return false; @@ -1681,9 +1672,6 @@ bool RcxEditor::beginInlineEdit(EditTarget target, int line, int col) { (target == EditTarget::BaseAddress || target == EditTarget::Source || target == EditTarget::RootClassType || target == EditTarget::RootClassName))) return false; - // Padding: reject value editing (display-only hex bytes) - if (target == EditTarget::Value && lm->nodeKind == NodeKind::Padding) - return false; // Hex nodes: only Type is editable (ASCII preview + hex bytes are display-only) if ((target == EditTarget::Name || target == EditTarget::Value) && isHexNode(lm->nodeKind)) return false; diff --git a/src/format.cpp b/src/format.cpp index 4003a18..a59ebd1 100644 --- a/src/format.cpp +++ b/src/format.cpp @@ -293,7 +293,6 @@ static QString readValueImpl(const Node& node, const Provider& prov, line += QStringLiteral("]"); return line; } - case NodeKind::Padding: return display ? hexVal(prov.readU8(addr)) : rawHex(prov.readU8(addr), 2); case NodeKind::UTF8: { QByteArray bytes = prov.readBytes(addr, node.strLen); int end = bytes.indexOf('\0'); @@ -344,21 +343,8 @@ QString fmtNodeLine(const Node& node, const Provider& prov, return ind + QString(prefixW, ' ') + val + cmtSuffix; } - // Hex nodes and Padding: hex byte preview (ASCII padded to colName to align with value column) + // Hex nodes: hex byte preview (ASCII padded to colName to align with value column) if (isHexPreview(node.kind)) { - if (node.kind == NodeKind::Padding) { - const int totalSz = qMax(1, node.arrayLen); - const int lineOff = subLine * 8; - const int lineBytes = qMin(8, totalSz - lineOff); - QByteArray b = prov.isReadable(addr + lineOff, lineBytes) - ? prov.readBytes(addr + lineOff, lineBytes) : QByteArray(lineBytes, '\0'); - QString ascii = bytesToAscii(b, lineBytes).leftJustified(colName, ' '); - QString hex = bytesToHex(b, lineBytes).leftJustified(23, ' '); // 8*3-1 - if (subLine == 0) - return ind + type + SEP + ascii + SEP + hex + cmtSuffix; - return ind + QString(colType + (int)SEP.size(), ' ') + ascii + SEP + hex + cmtSuffix; - } - // Hex8..Hex64: single line, ASCII padded to colName so hex column aligns with value column const int sz = sizeForKind(node.kind); QByteArray b = prov.isReadable(addr, sz) ? prov.readBytes(addr, sz) : QByteArray(sz, '\0'); diff --git a/src/generator.cpp b/src/generator.cpp index f65f9d5..ec2fa6a 100644 --- a/src/generator.cpp +++ b/src/generator.cpp @@ -50,7 +50,6 @@ static QString cTypeName(NodeKind kind) { case NodeKind::Mat4x4: return QStringLiteral("float"); case NodeKind::UTF8: return QStringLiteral("char"); case NodeKind::UTF16: return QStringLiteral("wchar_t"); - case NodeKind::Padding: return QStringLiteral("uint8_t"); default: return QStringLiteral("uint8_t"); } } @@ -123,8 +122,6 @@ static QString emitField(GenContext& ctx, const Node& node) { return QStringLiteral(" %1 %2[%3];").arg(ctx.cType(NodeKind::UTF8), name).arg(node.strLen) + oc; case NodeKind::UTF16: return QStringLiteral(" %1 %2[%3];").arg(ctx.cType(NodeKind::UTF16), name).arg(node.strLen) + oc; - case NodeKind::Padding: - return QStringLiteral(" %1 %2[%3];").arg(ctx.cType(NodeKind::Padding), name).arg(qMax(1, node.arrayLen)) + oc; case NodeKind::Pointer32: { if (node.refId != 0) { int refIdx = tree.indexOfId(node.refId); @@ -169,7 +166,7 @@ static void emitStructBody(GenContext& ctx, uint64_t structId) { auto emitPadRun = [&](int offset, int size) { if (size <= 0) return; ctx.output += QStringLiteral(" %1 %2[0x%3];%4\n") - .arg(ctx.cType(NodeKind::Padding)) + .arg(QStringLiteral("uint8_t")) .arg(ctx.uniquePadName()) .arg(QString::number(size, 16).toUpper()) .arg(offsetComment(offset)); diff --git a/src/mcp/mcp_bridge.cpp b/src/mcp/mcp_bridge.cpp index 97b6fb1..e819b9b 100644 --- a/src/mcp/mcp_bridge.cpp +++ b/src/mcp/mcp_bridge.cpp @@ -248,7 +248,7 @@ QJsonObject McpBridge::handleToolsList(const QJsonValue& id) { "collapse: {op:'collapse', nodeId:'ID', collapsed:true}. " "Insert ops get auto-assigned IDs; use $0, $1 etc. to reference them in later ops. " "Kinds: Hex8 Hex16 Hex32 Hex64 Int8 Int16 Int32 Int64 UInt8 UInt16 UInt32 UInt64 " - "Float Double Bool Pointer32 Pointer64 Vec2 Vec3 Vec4 Mat4x4 UTF8 UTF16 Padding Struct Array"}, + "Float Double Bool Pointer32 Pointer64 Vec2 Vec3 Vec4 Mat4x4 UTF8 UTF16 Struct Array"}, {"inputSchema", QJsonObject{ {"type", "object"}, {"properties", QJsonObject{ diff --git a/src/resources.qrc b/src/resources.qrc index 32d6fb1..6db63dc 100644 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -49,5 +49,7 @@ vsicons/symbol-ruler.svg vsicons/settings-gear.svg vsicons/chevron-down.svg + vsicons/folder.svg + vsicons/symbol-enum.svg diff --git a/src/typeselectorpopup.cpp b/src/typeselectorpopup.cpp index d1e25dd..fb3359c 100644 --- a/src/typeselectorpopup.cpp +++ b/src/typeselectorpopup.cpp @@ -122,7 +122,7 @@ public: return; } - // 18px gutter: side triangle if current + // Gutter: side triangle if current if (m_hasCurrent && m_filtered && row >= 0 && row < m_filtered->size()) { const TypeEntry& entry = (*m_filtered)[row]; bool isCurrent = false; @@ -131,13 +131,13 @@ public: else if (m_current->entryKind == TypeEntry::Composite && entry.entryKind == TypeEntry::Composite) isCurrent = (entry.structId == m_current->structId); if (isCurrent) { - painter->setPen(t.syntaxType); + painter->setPen(t.text); painter->setFont(m_font); - painter->drawText(QRect(x, y, 18, h), Qt::AlignCenter, + painter->drawText(QRect(x, y, 10, h), Qt::AlignCenter, QString(QChar(0x25B8))); } } - x += 18; + x += 10; // Icon 16x16 — only for composite entries bool hasIcon = (m_filtered && row >= 0 && row < m_filtered->size() @@ -369,6 +369,7 @@ TypeSelectorPopup::TypeSelectorPopup(QWidget* parent) m_listView->setFrameShape(QFrame::NoFrame); m_listView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_listView->setMouseTracking(true); + m_listView->setEditTriggers(QAbstractItemView::NoEditTriggers); m_listView->viewport()->setAttribute(Qt::WA_Hover, true); m_listView->installEventFilter(this); @@ -491,7 +492,7 @@ void TypeSelectorPopup::popup(const QPoint& globalPos) { QString text = t.classKeyword.isEmpty() ? t.displayName : (t.classKeyword + QStringLiteral(" ") + t.displayName); - int w = 18 + 20 + fm.horizontalAdvance(text) + 16; + int w = 10 + 20 + fm.horizontalAdvance(text) + 16; if (w > maxTextW) maxTextW = w; } int popupW = qBound(280, maxTextW + 24, 500); diff --git a/src/workspace_model.h b/src/workspace_model.h index d5b7c80..9838299 100644 --- a/src/workspace_model.h +++ b/src/workspace_model.h @@ -1,62 +1,76 @@ #pragma once #include "core.h" +#include #include #include #include namespace rcx { -// Recursively add children of parentId as tree items under parentItem. -inline void addWorkspaceChildren(QStandardItem* parentItem, - const NodeTree& tree, - uint64_t parentId, - void* subPtr) { - QVector children = tree.childrenOf(parentId); - std::sort(children.begin(), children.end(), [&](int a, int b) { - return tree.nodes[a].offset < tree.nodes[b].offset; - }); +struct TabInfo { + const NodeTree* tree; + QString name; + void* subPtr; // QMdiSubWindow* as void* +}; - for (int idx : children) { - const Node& node = tree.nodes[idx]; +// Sentinel value stored in UserRole+1 to mark the Project group node. +static constexpr uint64_t kGroupSentinel = ~uint64_t(0); - // Skip hex preview nodes — they are padding/filler, not meaningful fields - if (isHexNode(node.kind)) continue; - - QString display; - if (node.kind == NodeKind::Struct) { - QString typeName = node.structTypeName.isEmpty() - ? node.name : node.structTypeName; - display = QStringLiteral("%1 (%2)") - .arg(typeName, node.resolvedClassKeyword()); - } else { - display = QStringLiteral("%1 (%2)") - .arg(node.name, QString::fromLatin1(kindToString(node.kind))); - } - - auto* item = new QStandardItem(display); - item->setData(QVariant::fromValue(subPtr), Qt::UserRole); - if (node.kind == NodeKind::Struct) - item->setData(QVariant::fromValue(node.id), Qt::UserRole + 1); - item->setData(QVariant::fromValue(node.id), Qt::UserRole + 2); // nodeId for scroll - - if (node.kind == NodeKind::Struct) - addWorkspaceChildren(item, tree, node.id, subPtr); - - parentItem->appendRow(item); - } -} - -inline void buildWorkspaceModel(QStandardItemModel* model, - const NodeTree& tree, - const QString& projectName, - void* subPtr = nullptr) { +inline void buildProjectExplorer(QStandardItemModel* model, + const QVector& tabs) { model->clear(); model->setHorizontalHeaderLabels({QStringLiteral("Name")}); - auto* projectItem = new QStandardItem(projectName); - projectItem->setData(QVariant::fromValue(subPtr), Qt::UserRole); + // Single "Project" root with folder icon + void* firstSub = tabs.isEmpty() ? nullptr : tabs[0].subPtr; + auto* projectItem = new QStandardItem(QIcon(":/vsicons/folder.svg"), + QStringLiteral("Project")); + projectItem->setData(QVariant::fromValue(firstSub), Qt::UserRole); + projectItem->setData(QVariant::fromValue(kGroupSentinel), Qt::UserRole + 1); - addWorkspaceChildren(projectItem, tree, 0, subPtr); + // Collect all top-level structs/enums across all tabs + QVector> types, enums; + for (const auto& tab : tabs) { + QVector topLevel = tab.tree->childrenOf(0); + for (int idx : topLevel) { + const Node& n = tab.tree->nodes[idx]; + if (n.kind != NodeKind::Struct) continue; + if (n.resolvedClassKeyword() == QStringLiteral("enum")) + enums.append({&n, tab.subPtr}); + else + types.append({&n, tab.subPtr}); + } + } + + auto nameOf = [](const Node* n) { + return n->structTypeName.isEmpty() ? n->name : n->structTypeName; + }; + auto cmpName = [&](const std::pair& a, + const std::pair& b) { + return nameOf(a.first).compare(nameOf(b.first), Qt::CaseInsensitive) < 0; + }; + std::sort(types.begin(), types.end(), cmpName); + std::sort(enums.begin(), enums.end(), cmpName); + + for (const auto& [n, subPtr] : types) { + QString display = QStringLiteral("%1 (%2)") + .arg(nameOf(n), n->resolvedClassKeyword()); + auto* item = new QStandardItem( + QIcon(":/vsicons/symbol-structure.svg"), display); + item->setData(QVariant::fromValue(subPtr), Qt::UserRole); + item->setData(QVariant::fromValue(n->id), Qt::UserRole + 1); + projectItem->appendRow(item); + } + + for (const auto& [n, subPtr] : enums) { + QString display = QStringLiteral("%1 (%2)") + .arg(nameOf(n), n->resolvedClassKeyword()); + auto* item = new QStandardItem( + QIcon(":/vsicons/symbol-enum.svg"), display); + item->setData(QVariant::fromValue(subPtr), Qt::UserRole); + item->setData(QVariant::fromValue(n->id), Qt::UserRole + 1); + projectItem->appendRow(item); + } model->appendRow(projectItem); } diff --git a/tests/test_compose.cpp b/tests/test_compose.cpp index 3294b31..e28d4b6 100644 --- a/tests/test_compose.cpp +++ b/tests/test_compose.cpp @@ -89,7 +89,7 @@ private slots: QCOMPARE(result.meta[2].lineKind, LineKind::Footer); } - void testPaddingMarker() { + void testHexNodeCompose() { NodeTree tree; tree.baseAddress = 0; @@ -100,19 +100,18 @@ private slots: int ri = tree.addNode(root); uint64_t rootId = tree.nodes[ri].id; - Node pad; - pad.kind = NodeKind::Padding; - pad.name = "pad"; - pad.parentId = rootId; - pad.offset = 0; - tree.addNode(pad); + Node hex; + hex.kind = NodeKind::Hex8; + hex.name = "pad"; + hex.parentId = rootId; + hex.offset = 0; + tree.addNode(hex); NullProvider prov; ComposeResult result = compose(tree, prov); - // CommandRow + padding + root footer = 3 + // CommandRow + hex node + root footer = 3 QCOMPARE(result.meta.size(), 3); - QVERIFY(result.meta[1].markerMask & (1u << M_PAD)); QCOMPARE(result.meta[1].depth, 1); // Line 2 is root footer diff --git a/tests/test_controller.cpp b/tests/test_controller.cpp index 4ff6789..e1a1310 100644 --- a/tests/test_controller.cpp +++ b/tests/test_controller.cpp @@ -34,9 +34,8 @@ static void buildSmallTree(NodeTree& tree) { field(0, NodeKind::UInt32, "field_u32"); // 4 bytes field(4, NodeKind::Float, "field_float"); // 4 bytes field(8, NodeKind::UInt8, "field_u8"); // 1 byte - field(9, NodeKind::Padding, "pad0"); // 3 bytes padding - // Set padding arrayLen = 3 for 3-byte padding - tree.nodes.last().arrayLen = 3; + field(9, NodeKind::Hex16, "pad0"); // 2 bytes + field(11, NodeKind::Hex8, "pad1"); // 1 byte field(12, NodeKind::Hex32, "field_hex"); // 4 bytes } @@ -282,47 +281,6 @@ private slots: QVERIFY(newIdx >= 0); } - // ── Test: Padding value edit is effectively blocked at controller level ── - void testPaddingValueEditIsBlocked() { - // Find the padding node - int padIdx = -1; - for (int i = 0; i < m_doc->tree.nodes.size(); i++) { - if (m_doc->tree.nodes[i].kind == NodeKind::Padding) { padIdx = i; break; } - } - QVERIFY(padIdx >= 0); - uint64_t addr = m_doc->tree.computeOffset(padIdx); - - // Read original data at padding offset - int padSize = m_doc->tree.nodes[padIdx].byteSize(); - QByteArray origData = m_doc->provider->readBytes(addr, padSize); - - // The context menu blocks Padding editing, so the controller's setNodeValue - // would only be called if the editing UI somehow allows it. But let's verify - // the editor correctly blocks it. - // Find padding line in composed output - ComposeResult result = m_doc->compose(); - int paddingLine = -1; - for (int i = 0; i < result.meta.size(); i++) { - if (result.meta[i].nodeKind == NodeKind::Padding && - result.meta[i].lineKind == LineKind::Field) { - paddingLine = i; - break; - } - } - QVERIFY(paddingLine >= 0); - - m_editor->applyDocument(result); - QApplication::processEvents(); - - // beginInlineEdit(Value) on Padding line must be rejected - QVERIFY(!m_editor->beginInlineEdit(EditTarget::Value, paddingLine)); - QVERIFY(!m_editor->isEditing()); - - // Data must be unchanged - QByteArray afterData = m_doc->provider->readBytes(addr, padSize); - QCOMPARE(afterData, origData); - } - // ── Test: setNodeValue with Hex32 (space-separated hex bytes) ── void testSetNodeValueHex() { int idx = -1; diff --git a/tests/test_editor.cpp b/tests/test_editor.cpp index 5b276c2..a646c73 100644 --- a/tests/test_editor.cpp +++ b/tests/test_editor.cpp @@ -170,9 +170,10 @@ static NodeTree makeTestTree() { n.parentId = rootId; n.offset = off; tree.addNode(n); }; - auto pad = [&](int off, int len, const char* name) { - Node n; n.kind = NodeKind::Padding; n.name = name; - n.parentId = rootId; n.offset = off; n.arrayLen = len; + auto pad = [&](int off, int /*len*/, const char* name) { + // 4-byte padding → Hex32 (all usages in this test pass len=4) + Node n; n.kind = NodeKind::Hex32; n.name = name; + n.parentId = rootId; n.offset = off; tree.addNode(n); }; auto arr = [&](int off, NodeKind ek, int len, const char* name) { @@ -278,8 +279,8 @@ static NodeTree makeTestTree() { n.kind = NodeKind::UInt16; n.name = "Length"; n.offset = 0; tree.addNode(n); n.kind = NodeKind::UInt16; n.name = "MaximumLength"; n.offset = 2; tree.addNode(n); - n.kind = NodeKind::Padding; n.name = "Pad"; - n.offset = 4; n.arrayLen = 4; tree.addNode(n); + n.kind = NodeKind::Hex32; n.name = "Pad"; + n.offset = 4; n.arrayLen = 1; tree.addNode(n); n.kind = NodeKind::Pointer64; n.name = "Buffer"; n.offset = 8; n.arrayLen = 1; tree.addNode(n); } @@ -751,70 +752,6 @@ private slots: m_editor->applyDocument(m_result); } - // ── Test: Padding line rejects value editing ── - void testPaddingLineRejectsValueEdit() { - m_editor->applyDocument(m_result); - - // Find a Padding line in the composed output - int paddingLine = -1; - for (int i = 0; i < m_result.meta.size(); i++) { - if (m_result.meta[i].nodeKind == NodeKind::Padding && - m_result.meta[i].lineKind == LineKind::Field) { - paddingLine = i; - break; - } - } - QVERIFY2(paddingLine >= 0, "Should have at least one Padding line in test tree"); - - const LineMeta* lm = m_editor->metaForLine(paddingLine); - QVERIFY(lm); - QCOMPARE(lm->nodeKind, NodeKind::Padding); - - // Value edit on Padding MUST be rejected (the bug fix) - QVERIFY2(!m_editor->beginInlineEdit(EditTarget::Value, paddingLine), - "Value edit should be rejected on Padding lines"); - QVERIFY(!m_editor->isEditing()); - - // Name edit on Padding SHOULD succeed (ASCII preview column is editable) - bool ok = m_editor->beginInlineEdit(EditTarget::Name, paddingLine); - QVERIFY2(ok, "Name edit should be allowed on Padding lines (ASCII preview)"); - QVERIFY(m_editor->isEditing()); - m_editor->cancelInlineEdit(); - - // Type edit on Padding SHOULD succeed (emits popup signal) - QSignalSpy typeSpy(m_editor, &RcxEditor::typePickerRequested); - ok = m_editor->beginInlineEdit(EditTarget::Type, paddingLine); - QVERIFY2(ok, "Type edit should be allowed on Padding lines"); - QCOMPARE(typeSpy.count(), 1); - } - - // ── Test: resolvedSpanFor rejects Value on Padding (defense-in-depth) ── - void testPaddingLineRejectsValueSpan() { - m_editor->applyDocument(m_result); - - // Find a Padding line - int paddingLine = -1; - for (int i = 0; i < m_result.meta.size(); i++) { - if (m_result.meta[i].nodeKind == NodeKind::Padding && - m_result.meta[i].lineKind == LineKind::Field) { - paddingLine = i; - break; - } - } - QVERIFY(paddingLine >= 0); - - const LineMeta* lm = m_editor->metaForLine(paddingLine); - QVERIFY(lm); - - // valueSpanFor returns valid (shared with Hex via KF_HexPreview) - ColumnSpan vs = RcxEditor::valueSpan(*lm, 200); - QVERIFY2(vs.valid, "valueSpanFor should return valid for Padding (shared HexPreview flag)"); - - // But beginInlineEdit should still reject it - QVERIFY(!m_editor->beginInlineEdit(EditTarget::Value, paddingLine)); - QVERIFY(!m_editor->isEditing()); - } - // ── Test: value edit commit fires signal with typed text ── void testValueEditCommitUpdatesSignal() { m_editor->applyDocument(m_result); @@ -823,8 +760,6 @@ private slots: const LineMeta* lm = m_editor->metaForLine(kFirstDataLine); QVERIFY(lm); QCOMPARE(lm->lineKind, LineKind::Field); - QVERIFY(lm->nodeKind != NodeKind::Padding); - // Begin value edit bool ok = m_editor->beginInlineEdit(EditTarget::Value, kFirstDataLine); QVERIFY(ok); diff --git a/tests/test_generator.cpp b/tests/test_generator.cpp index b933982..6e2e84e 100644 --- a/tests/test_generator.cpp +++ b/tests/test_generator.cpp @@ -418,30 +418,6 @@ private slots: QVERIFY(result.contains("wchar_t wname[32];")); } - // ── Padding node ── - - void testPaddingNode() { - rcx::NodeTree tree; - rcx::Node root; - root.kind = rcx::NodeKind::Struct; - root.name = "PadTest"; - root.structTypeName = "PadTest"; - root.parentId = 0; - int ri = tree.addNode(root); - uint64_t rootId = tree.nodes[ri].id; - - rcx::Node pad; - pad.kind = rcx::NodeKind::Padding; - pad.name = "reserved"; - pad.parentId = rootId; - pad.offset = 0; - pad.arrayLen = 16; - tree.addNode(pad); - - QString result = rcx::renderCpp(tree, rootId); - QVERIFY(result.contains("uint8_t reserved[16];")); - } - // ── Full SDK export (multiple root structs) ── void testFullSdkExport() { diff --git a/tests/test_new_features.cpp b/tests/test_new_features.cpp index df89b16..ecb81a7 100644 --- a/tests/test_new_features.cpp +++ b/tests/test_new_features.cpp @@ -304,39 +304,6 @@ private slots: QVERIFY(result.contains("float speed;")); } - void testGenerator_typeAliases_padding() { - // Padding gap and tail padding should use aliased uint8_t - NodeTree tree; - Node root; - root.kind = NodeKind::Struct; - root.name = "PadTest"; - root.structTypeName = "PadTest"; - root.parentId = 0; - int ri = tree.addNode(root); - uint64_t rootId = tree.nodes[ri].id; - - Node f1; - f1.kind = NodeKind::UInt32; - f1.name = "a"; - f1.parentId = rootId; - f1.offset = 0; - tree.addNode(f1); - - Node f2; - f2.kind = NodeKind::UInt32; - f2.name = "b"; - f2.parentId = rootId; - f2.offset = 8; // gap of 4 bytes at offset 4 - tree.addNode(f2); - - QHash aliases; - aliases[NodeKind::Padding] = "BYTE"; - - QString result = renderCpp(tree, rootId, &aliases); - // Padding gap should use the alias - QVERIFY(result.contains("BYTE _pad")); - } - void testGenerator_typeAliases_array() { // Array element type should use alias NodeTree tree; @@ -547,134 +514,92 @@ private slots: void testWorkspace_simpleTree() { auto tree = makeSimpleTree(); QStandardItemModel model; - buildWorkspaceModel(&model, tree, "TestProject.rcx"); + QVector tabs = {{ &tree, "TestProject.rcx", nullptr }}; + buildProjectExplorer(&model, tabs); - // 1 top-level item (the project) + // Single "Project" root QCOMPARE(model.rowCount(), 1); QStandardItem* project = model.item(0); - QCOMPARE(project->text(), QString("TestProject.rcx")); + QCOMPARE(project->text(), QString("Project")); - // Project has 1 child: the Player struct + // 1 type directly under Project: Player (no member fields) QCOMPARE(project->rowCount(), 1); - QStandardItem* player = project->child(0); - QVERIFY(player->text().contains("Player")); - QVERIFY(player->text().contains("struct")); - - // Player struct has 2 children: health, speed - QCOMPARE(player->rowCount(), 2); - QVERIFY(player->child(0)->text().contains("health")); - QVERIFY(player->child(1)->text().contains("speed")); + QVERIFY(project->child(0)->text().contains("Player")); + QVERIFY(project->child(0)->text().contains("struct")); + QCOMPARE(project->child(0)->rowCount(), 0); } void testWorkspace_twoRootTree() { auto tree = makeTwoRootTree(); QStandardItemModel model; - buildWorkspaceModel(&model, tree, "TwoRoot.rcx"); + QVector tabs = {{ &tree, "TwoRoot.rcx", nullptr }}; + buildProjectExplorer(&model, tabs); QCOMPARE(model.rowCount(), 1); QStandardItem* project = model.item(0); - // 2 root struct children: Alpha and Bravo + // 2 types sorted alphabetically: Alpha, Bravo (no field children) QCOMPARE(project->rowCount(), 2); QVERIFY(project->child(0)->text().contains("Alpha")); QVERIFY(project->child(1)->text().contains("Bravo")); - - // Each has 1 field child - QCOMPARE(project->child(0)->rowCount(), 1); - QVERIFY(project->child(0)->child(0)->text().contains("flagsA")); - QCOMPARE(project->child(1)->rowCount(), 1); - QVERIFY(project->child(1)->child(0)->text().contains("flagsB")); + QCOMPARE(project->child(0)->rowCount(), 0); + QCOMPARE(project->child(1)->rowCount(), 0); } void testWorkspace_richTree_rootCount() { auto tree = makeRichTree(); QStandardItemModel model; - buildWorkspaceModel(&model, tree, "Rich.rcx"); + QVector tabs = {{ &tree, "Rich.rcx", nullptr }}; + buildProjectExplorer(&model, tabs); QStandardItem* project = model.item(0); - QCOMPARE(project->rowCount(), 3); // Pet, Cat, Ball + QCOMPARE(project->rowCount(), 3); // Ball, Cat, Pet (sorted) } - void testWorkspace_richTree_petChildren() { + void testWorkspace_richTree_sorted() { auto tree = makeRichTree(); QStandardItemModel model; - buildWorkspaceModel(&model, tree, "Rich.rcx"); + QVector tabs = {{ &tree, "Rich.rcx", nullptr }}; + buildProjectExplorer(&model, tabs); - QStandardItem* pet = model.item(0)->child(0); - QVERIFY(pet->text().contains("Pet")); - // Pet has 2 non-hex children: name (UTF8), owner (Pointer64) - QCOMPARE(pet->rowCount(), 2); - QVERIFY(pet->child(0)->text().contains("name")); - QVERIFY(pet->child(1)->text().contains("owner")); - } - - void testWorkspace_richTree_catNesting() { - auto tree = makeRichTree(); - QStandardItemModel model; - buildWorkspaceModel(&model, tree, "Rich.rcx"); - - QStandardItem* cat = model.item(0)->child(1); - QVERIFY(cat->text().contains("Cat")); - - // Find the nested "Pet" struct child (base) - QStandardItem* base = nullptr; - for (int i = 0; i < cat->rowCount(); i++) { - if (cat->child(i)->text().contains("Pet") && - cat->child(i)->text().contains("struct")) { - base = cat->child(i); - break; - } - } - QVERIFY2(base != nullptr, "Cat should have a nested Pet struct child"); - - // base has structId set - QVERIFY(base->data(Qt::UserRole + 1).isValid()); - - // base should have its own children (name + owner) - QCOMPARE(base->rowCount(), 2); - } - - void testWorkspace_richTree_ballChildren() { - auto tree = makeRichTree(); - QStandardItemModel model; - buildWorkspaceModel(&model, tree, "Rich.rcx"); - - QStandardItem* ball = model.item(0)->child(2); - QVERIFY(ball->text().contains("Ball")); - - // Ball has 3 non-hex children: speed, position, color - QCOMPARE(ball->rowCount(), 3); - QVERIFY(ball->child(0)->text().contains("speed")); - QVERIFY(ball->child(1)->text().contains("position")); - QVERIFY(ball->child(2)->text().contains("color")); + QStandardItem* project = model.item(0); + // Sorted alphabetically: Ball, Cat, Pet + QVERIFY(project->child(0)->text().contains("Ball")); + QVERIFY(project->child(1)->text().contains("Cat")); + QVERIFY(project->child(2)->text().contains("Pet")); + // No member fields under type nodes + QCOMPARE(project->child(0)->rowCount(), 0); + QCOMPARE(project->child(1)->rowCount(), 0); + QCOMPARE(project->child(2)->rowCount(), 0); } void testWorkspace_emptyTree() { NodeTree tree; QStandardItemModel model; - buildWorkspaceModel(&model, tree, "Empty.rcx"); + QVector tabs = {{ &tree, "Empty.rcx", nullptr }}; + buildProjectExplorer(&model, tabs); + // Still has the "Project" root, just no children QCOMPARE(model.rowCount(), 1); + QCOMPARE(model.item(0)->text(), QString("Project")); QCOMPARE(model.item(0)->rowCount(), 0); } void testWorkspace_structIdRole() { auto tree = makeSimpleTree(); QStandardItemModel model; - buildWorkspaceModel(&model, tree, "Test.rcx"); + QVector tabs = {{ &tree, "Test.rcx", nullptr }}; + buildProjectExplorer(&model, tabs); QStandardItem* project = model.item(0); - // Project item should NOT have structId - QVERIFY(!project->data(Qt::UserRole + 1).isValid()); + // Project root has kGroupSentinel + QCOMPARE(project->data(Qt::UserRole + 1).toULongLong(), kGroupSentinel); - // Player struct should have structId + // Player type item should have structId QStandardItem* player = project->child(0); QVERIFY(player->data(Qt::UserRole + 1).isValid()); QVERIFY(player->data(Qt::UserRole + 1).toULongLong() > 0); - - // health field should NOT have structId - QStandardItem* health = player->child(0); - QVERIFY(!health->data(Qt::UserRole + 1).isValid()); + QVERIFY(player->data(Qt::UserRole + 1).toULongLong() != kGroupSentinel); } // ═══════════════════════════════════════════════════ diff --git a/tests/test_validation.cpp b/tests/test_validation.cpp index 9236741..588e8f4 100644 --- a/tests/test_validation.cpp +++ b/tests/test_validation.cpp @@ -57,8 +57,8 @@ static void buildValidationTree(NodeTree& tree) { field(46, NodeKind::Hex32, "field_h32"); field(50, NodeKind::Hex64, "field_h64"); field(58, NodeKind::Pointer64, "field_ptr"); - field(66, NodeKind::Padding, "pad0"); - tree.nodes.last().arrayLen = 6; + field(66, NodeKind::Hex32, "pad0"); + field(70, NodeKind::Hex16, "pad1"); fieldArr(72, NodeKind::UInt32, 4, "field_arr"); } @@ -725,9 +725,9 @@ private slots: QCOMPARE(m_doc->undoStack.count(), 0); } - // ── changeNodeKind size transitions: shrink inserts padding ── + // ── changeNodeKind size transitions: shrink inserts hex nodes ── - void testChangeKindShrinkInsertsPadding() { + void testChangeKindShrinkInsertsHexNodes() { int idx = findNode(m_doc->tree, "field_u32"); QVERIFY(idx >= 0); QCOMPARE(m_doc->tree.nodes[idx].kind, NodeKind::UInt32); // 4 bytes @@ -737,7 +737,7 @@ private slots: QApplication::processEvents(); QCOMPARE(m_doc->tree.nodes[idx].kind, NodeKind::UInt8); - // Should have inserted padding nodes (Hex16 + Hex8 = 3 bytes, or similar) + // Should have inserted hex nodes (Hex16 + Hex8 = 3 bytes, or similar) QVERIFY(m_doc->tree.nodes.size() > origCount); // Undo restores everything @@ -985,37 +985,6 @@ private slots: QVERIFY(!m_editor->isEditing()); } - // ── Editor: padding value edit blocked, name/type still work ── - - void testPaddingEditRestrictions() { - m_ctrl->refresh(); - QApplication::processEvents(); - - ComposeResult result = m_doc->compose(); - m_editor->applyDocument(result); - QApplication::processEvents(); - - // Find padding line - int padLine = -1; - for (int i = 0; i < result.meta.size(); i++) { - if (result.meta[i].nodeKind == NodeKind::Padding && - result.meta[i].lineKind == LineKind::Field) { - padLine = i; - break; - } - } - QVERIFY(padLine >= 0); - - // Value edit rejected - QVERIFY(!m_editor->beginInlineEdit(EditTarget::Value, padLine)); - - // Type edit accepted - bool ok = m_editor->beginInlineEdit(EditTarget::Type, padLine); - QVERIFY(ok); - m_editor->cancelInlineEdit(); - QApplication::processEvents(); - } - // ── Editor: struct header rejects value edit ── void testStructHeaderRejectsValueEdit() {